Пример #1
0
    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')))
Пример #2
0
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
    )
Пример #3
0
    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)
Пример #4
0
    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')))
Пример #5
0
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)
Пример #6
0
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)