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
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
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
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)
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)
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()
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())