예제 #1
0
def _group2dns(app_group):
    """Normalize app group to app_dns"""
    app_dns = copy.deepcopy(app_group)

    if app_dns['group-type'] != 'dns':
        return None

    del app_dns['group-type']

    data = app_dns.get('data')
    del app_dns['data']

    app_dns['alias'] = None
    app_dns['scope'] = None
    app_dns['identity-group'] = None

    if data:
        data_dict = data
        if isinstance(data, list):
            data_dict = utils.equals_list2dict(data)

        if data_dict.get('alias'):
            app_dns['alias'] = data_dict.get('alias')
        if data_dict.get('scope'):
            app_dns['scope'] = data_dict.get('scope')
        if data_dict.get('identity-group'):
            app_dns['identity-group'] = data_dict.get('identity-group')

    return app_dns
예제 #2
0
def _appgroup_group_by_proid(cell_app_groups):
    """Group list of app groups by proid pattern."""

    # create reverse lookup of appgroups by proid.
    def _key(item):
        return (item.get('pattern'), item.get('group-type'),
                item.get('endpoints'), item.get('data'))

    groups_by_proid = collections.defaultdict(list)
    checksum_by_proid = collections.defaultdict(hashlib.sha1)

    for group in sorted(cell_app_groups, key=_key):
        data = json.dumps(utils.equals_list2dict(group.get('data', [])))
        pattern = group.get('pattern')
        if not pattern:
            _LOGGER.warning('Invalid app-group, no pattern: %r', group)
            continue

        proid, _rest = pattern.split('.', 1)
        # Create a flat table, and endpoints is a list.
        endpoints = ','.join(group.get('endpoints', []))
        group_type = group.get('group-type')
        row = (pattern, group_type, endpoints, data)
        groups_by_proid[proid].append(row)
        for item in row:
            if item:
                checksum_by_proid[proid].update(item.encode('utf8'))

    return groups_by_proid, checksum_by_proid
예제 #3
0
    def _match_appgroup(self, appgroup):
        """For all endpoints that match the appgroup, add to target state."""
        _LOGGER.debug('appgroup: %r', appgroup)
        if appgroup['group-type'] != 'dns':
            return set()

        data = utils.equals_list2dict(appgroup.get('data'))
        _LOGGER.debug('data: %r', data)
        # Top level API must ensure that alias is always set, even it user
        # selects app pattern as alias (default).
        alias = data.get('alias')
        if not alias:
            _LOGGER.error('No alias supplied for %r', appgroup)
            return set()

        scope = data.get('scope', 'cell')

        result = set()
        for endpoint in appgroup['endpoints']:
            srvs = self._srv_records(
                alias, scope, appgroup['pattern'], endpoint
            )
            _LOGGER.debug('srvs: %r', srvs)
            result.update(srvs)

        return result
예제 #4
0
    def cleanup_instance(approot, runtime, instance, runtime_param):
        """Actually do the cleanup of the instance.
        """
        param = utils.equals_list2dict(runtime_param or [])

        cleaner = cleanup.Cleanup(approot)
        cleaner.invoke(runtime, instance, param)
예제 #5
0
    def cleanup_instance(approot, runtime, instance, runtime_param):
        """Actually do the cleanup of the instance.
        """
        param = utils.equals_list2dict(runtime_param or [])

        tm_env = appenv.AppEnvironment(root=approot)
        cleaner = cleanup.Cleanup(tm_env)
        cleaner.invoke(runtime, instance, param)
예제 #6
0
    def finish(approot, runtime, container_dir, runtime_param):
        """Finish treadmill application on the node."""
        # Run with finish context as finish runs in cleanup.
        with lc.LogContext(_LOGGER, os.path.basename(container_dir),
                           lc.ContainerAdapter) as log:
            log.info('finish (approot %s)', approot)
            tm_env = appenv.AppEnvironment(approot)

            param = utils.equals_list2dict(runtime_param or [])
            app_runtime.get_runtime(
                runtime, tm_env, container_dir, param
            ).finish()
예제 #7
0
    def run(approot, runtime, container_dir, runtime_param=None):
        """Runs container given a container dir."""
        # Make sure container_dir is a fully resolved path.
        container_dir = os.path.realpath(container_dir)
        service = supervisor.open_service(container_dir)

        _LOGGER.info('run %r %r', approot, container_dir)

        tm_env = appenv.AppEnvironment(approot)
        param = utils.equals_list2dict(runtime_param or [])
        try:
            app_runtime.get_runtime(
                runtime, tm_env, service, param
            ).run()
        except exc.ContainerSetupError as err:
            _LOGGER.exception('Failed to start, app will be aborted.')
            app_abort.flag_aborted(service.data_dir,
                                   why=err.reason,
                                   payload=traceback.format_exc())
        except Exception as err:  # pylint: disable=W0703
            _LOGGER.exception('Failed to start, app will be aborted.')
            app_abort.flag_aborted(service.data_dir,
                                   why=app_abort.AbortedReason.UNKNOWN,
                                   payload=traceback.format_exc())