def test_create_service_optional(self): """Checks optional components of create service. """ pwd.getpwnam.return_value = self.mock_pwrow('test_shell', 'test_home') svc_dir = supervisor.create_scan_dir(self.root, 5000) supervisor.create_service(svc_dir, 'xx', 'ls -al', userid='proid1', monitor_policy={ 'limit': 5, 'interval': 60, 'tombstone': { 'uds': True, 'path': '/run/tm_ctl/tombstone', 'id': 'xx' } }, environ={'b': 'test2'}, trace={ 'instanceid': 'xx', 'uniqueid': 'ID1234', 'service': 'xx', 'path': '/run/tm_ctl/appevents' }) service_dir = os.path.join(self.root, 'xx') self.assertTrue(os.path.isdir(service_dir)) data_dir = os.path.join(service_dir, 'data') self.assertTrue(os.path.isfile(os.path.join(data_dir, 'app_start'))) self.assertTrue(os.path.isfile(os.path.join(service_dir, 'run'))) self.assertTrue(os.path.isfile(os.path.join(service_dir, 'finish'))) self.assertTrue(os.path.isfile(os.path.join(service_dir, 'env/b')))
def _install_scan_dir(package, src_dir, dst_dir, params, prefix_len, rec=None): """Interpolate source directory as a scan directory containing service definitions. """ package_name = package.__name__ src_control_dir = os.path.join(src_dir, _CONTROL_DIR_NAME) src_control_dir_file = os.path.join(src_dir, _CONTROL_DIR_FILE) dst_path = os.path.join(dst_dir, src_dir[prefix_len:]) dst_control_dir = os.path.join(dst_path, _CONTROL_DIR_NAME) scan_dir = None if not os.path.exists(dst_control_dir): fs.mkdir_safe(dst_control_dir) if rec: rec.write('%s\n' % os.path.join(dst_control_dir, '')) if pkg_resources.resource_isdir(package_name, src_control_dir): _install(package, src_control_dir, dst_dir, params, prefix_len=prefix_len, rec=rec) elif pkg_resources.resource_exists(package_name, src_control_dir_file): _LOGGER.info('Expand control dir: %s => %s', src_control_dir_file, dst_control_dir) svscan_conf_file = pkg_resources.resource_string( package_name, src_control_dir_file ) if svscan_conf_file: svscan_conf = yaml.load(svscan_conf_file.decode('utf8')) else: svscan_conf = {} scan_dir = supervisor.create_scan_dir( dst_path, svscan_conf.get('finish_timeout', 0), wait_cgroups=svscan_conf.get('wait_cgroups', None), kill_svc=svscan_conf.get('kill_svc', None) ) scan_dir.write() if not scan_dir: scan_dir = supervisor.ScanDir(dst_path) _install_services( scan_dir, package, src_dir, dst_dir, params, prefix_len=prefix_len, rec=rec )
def test_create_service_bad_userid(self): """Tests creating a service with a bad userid. """ svc_dir = supervisor.create_scan_dir(self.root, 5000) self.assertRaises(KeyError, supervisor.create_service, svc_dir, 'xx', 'ls -al', userid='should not exist', downed=True)
def test_create_service_optional(self): """Checks optional components of create service. """ pwd.getpwnam.return_value = self.mock_pwrow('test_shell', 'test_home') svc_dir = supervisor.create_scan_dir(self.root, 5000) supervisor.create_service(svc_dir, 'xx', 'proid1', 'ls -al', monitor_policy={'a': 'test1'}, environ={'b': 'test2'}, trace={'c': 'test3'}) service_dir = os.path.join(self.root, 'xx') self.assertTrue(os.path.isdir(service_dir)) data_dir = os.path.join(service_dir, 'data') self.assertTrue(os.path.isfile(os.path.join(data_dir, 'app_start'))) self.assertTrue(os.path.isfile(os.path.join(data_dir, 'trace'))) self.assertTrue(os.path.isfile(os.path.join(data_dir, 'policy.json'))) self.assertTrue(os.path.isfile(os.path.join(service_dir, 'run'))) self.assertTrue(os.path.isfile(os.path.join(service_dir, 'finish'))) self.assertTrue(os.path.isfile(os.path.join(service_dir, 'env/b')))
def create_supervision_tree(tm_env, container_dir, root_dir, app, cgroups_path): """Creates s6 supervision tree.""" uniq_name = appcfg.app_unique_name(app) ctl_uds = os.path.join(os.sep, 'run', 'tm_ctl') tombstone_ctl_uds = os.path.join(ctl_uds, 'tombstone') sys_dir = os.path.join(container_dir, 'sys') try: old_system_services = [ svc_name for svc_name in os.listdir(sys_dir) if (not svc_name.startswith('.') and os.path.isdir(os.path.join(sys_dir, svc_name))) ] except FileNotFoundError: old_system_services = [] new_system_services = [svc_def.name for svc_def in app.system_services] for svc_name in set(old_system_services) - set(new_system_services): _LOGGER.info('Removing old system service: %s', svc_name) fs.rmtree_safe(os.path.join(sys_dir, svc_name)) sys_scandir = supervisor.create_scan_dir( sys_dir, finish_timeout=6000, wait_cgroups=cgroups_path, ) for svc_def in app.system_services: if svc_def.restart is not None: monitor_policy = { 'limit': svc_def.restart.limit, 'interval': svc_def.restart.interval, 'tombstone': { 'uds': False, 'path': tm_env.services_tombstone_dir, 'id': '{},{}'.format(uniq_name, svc_def.name) } } else: monitor_policy = None supervisor.create_service( sys_scandir, name=svc_def.name, app_run_script=svc_def.command, userid='root', environ_dir=os.path.join(container_dir, _CONTAINER_ENV_DIR), environ={envvar.name: envvar.value for envvar in svc_def.environ}, environment=app.environment, downed=svc_def.downed, trace=None, monitor_policy=monitor_policy) sys_scandir.write() services_dir = os.path.join(container_dir, 'services') services_scandir = supervisor.create_scan_dir(services_dir, finish_timeout=5000) for svc_def in app.services: if svc_def.restart is not None: monitor_policy = { 'limit': svc_def.restart.limit, 'interval': svc_def.restart.interval, 'tombstone': { 'uds': True, 'path': tombstone_ctl_uds, 'id': '{},{}'.format(uniq_name, svc_def.name) } } else: monitor_policy = None if svc_def.trace is not None: trace = { 'instanceid': app.name, 'uniqueid': app.uniqueid, 'service': svc_def.name, 'path': os.path.join(ctl_uds, 'appevents') } else: trace = None logger_template = getattr(svc_def, 'logger', 's6.app-logger.run') _LOGGER.info('Using logger: %s', logger_template) supervisor.create_service( services_scandir, name=svc_def.name, app_run_script=svc_def.command, userid=svc_def.proid, environ_dir='/' + _CONTAINER_ENV_DIR, environ={envvar.name: envvar.value for envvar in svc_def.environ}, environment=app.environment, downed=svc_def.downed, trace=trace if svc_def.trace else None, log_run_script=logger_template, monitor_policy=monitor_policy) services_scandir.write() # Bind the service directory in the container volume fs.mkdir_safe(os.path.join(root_dir, 'services')) fs_linux.mount_bind(root_dir, os.path.join(os.sep, 'services'), source=os.path.join(container_dir, 'services'), recursive=False, read_only=False) # Bind the ctrl directory in the container volume which has all the # unix domain sockets to communicate outside the container to treadmill fs.mkdir_safe(os.path.join(root_dir, 'run', 'tm_ctl')) fs_linux.mount_bind(root_dir, os.path.join(os.sep, 'run', 'tm_ctl'), source=tm_env.ctl_dir, recursive=False, read_only=False)
def create_supervision_tree(container_dir, root_dir, app, cgroups_path): """Creates s6 supervision tree.""" sys_dir = os.path.join(container_dir, 'sys') sys_scandir = supervisor.create_scan_dir( sys_dir, finish_timeout=6000, monitor_service='monitor', wait_cgroups=cgroups_path, ) for svc_def in app.system_services: if svc_def.restart is not None: monitor_policy = { 'limit': svc_def.restart.limit, 'interval': svc_def.restart.interval, } else: monitor_policy = None supervisor.create_service( sys_scandir, name=svc_def.name, app_run_script=svc_def.command, userid='root', environ_dir=os.path.join(container_dir, _CONTAINER_ENV_DIR), environ={envvar.name: envvar.value for envvar in svc_def.environ}, environment=app.environment, downed=svc_def.downed, trace=None, monitor_policy=monitor_policy) sys_scandir.write() services_dir = os.path.join(container_dir, 'services') services_scandir = supervisor.create_scan_dir(services_dir, finish_timeout=5000) trace = {'instanceid': app.name, 'uniqueid': app.uniqueid} for svc_def in app.services: if svc_def.restart is not None: monitor_policy = { 'limit': svc_def.restart.limit, 'interval': svc_def.restart.interval, } else: monitor_policy = None supervisor.create_service( services_scandir, name=svc_def.name, app_run_script=svc_def.command, userid=svc_def.proid, environ_dir='/' + _CONTAINER_ENV_DIR, environ={envvar.name: envvar.value for envvar in svc_def.environ}, environment=app.environment, downed=False, trace=trace if svc_def.trace else None, log_run_script='s6.app-logger.run', monitor_policy=monitor_policy) services_scandir.write() # Bind the service directory in the container volume fs.mkdir_safe(os.path.join(root_dir, 'services')) fs_linux.mount_bind(root_dir, os.path.join(os.sep, 'services'), source=os.path.join(container_dir, 'services'), recursive=False, read_only=False)