def run(self): sorted_pkgs = dag_run(self.__dag) software_root = self.__config_version.config['software_root'] release_version = self.__config_version.config['version'] env = Env() env.clean() env.set_release(software_root, release_version) global_env = self.__config_release.get('setting', {}).get('global_env', {}) new_global_env = {} for k, v in global_env.items(): new_global_env[k] = v.format(**self.__config_version.config) env.set_global(new_global_env) path_def = self.__config_release.get('setting', {}).get('path_def', {}) for pkg in sorted_pkgs: pkg_info = self.__pkg_mgr.package_info(pkg) env.set_package(path_def, pkg_info) env_change = env.env_change() _logger.info('From software root: {0}'.format(software_root)) _logger.info('Using version: {0}'.format(release_version)) return env_change
class Executor(object): def __init__(self, config_user, config_version, config_release, step_info): self.__config_user = config_user self.__config_version = config_version self.__config_release = config_release self.__step_info = step_info # Create independent env for installation self.__env = Env() self.__env.clean() self.__pkg_mgr = PackageManager(config_version, config_release) def param(self, vertex): pkg, action, sub_action = vertex par = {} par['package'] = pkg par['action'] = action par['sub_action'] = sub_action step = self.__step_info.package_step(pkg, action, sub_action) par['action_name'] = step.get('action') par['action_param'] = step.get('param') par['log_file'] = os.path.join( self.__pkg_mgr.package_info(pkg)['dir']['log'], '{0}_{1}_{2}.log'.format(pkg, action, sub_action)) par['env'] = copy.deepcopy(self.__env.env_final()) par['config_user'] = copy.deepcopy(self.__config_user) par['def_dir'] = self.__config_version.def_dir par['pkg_info'] = copy.deepcopy(self.__pkg_mgr.package_info(pkg)) par['pkg_dir_list'] = copy.deepcopy(self.__pkg_mgr.package_dir_list()) return par # Do NOT access or modify any variables outside this function (global and member variables) def execute(self, param): pkg = param['package'] action = param['action'] sub_action = param['sub_action'] if sub_action == 0: action_full_name = '{0} - {1}'.format(pkg, action) else: action_full_name = '{0} - {1} - {2}'.format( pkg, action, sub_action) result = {} result['start'] = datetime.datetime.utcnow() safe_mkdir(param['pkg_info']['dir']['log']) try: result_action = run_handler('', 'install', param['action_name'], param) except Exception as e: _logger.critical('"{0}" install handler error: {1}'.format( action_full_name, e)) if param['config_user']['verbose']: _logger.critical('\n{0}'.format(traceback.format_exc())) raise result['success'] = False if isinstance(result_action, bool) and result_action: result['success'] = True if isinstance( result_action, dict ) and 'success' in result_action and result_action['success']: result['success'] = True if not result['success']: if isinstance(result_action, dict) and 'message' in result_action: _logger.error('"{0}" execution error: {1}'.format( action_full_name, result_action['message'])) _logger.critical('"{0}" execution error. Find log in "{1}"'.format( action_full_name, param['log_file'])) raise InstallExecutorError( '"{0}" execution error'.format(action_full_name)) result['action'] = result_action result['end'] = datetime.datetime.utcnow() return result def report_start(self, vertice): pass def report_finish(self, vertice_result): for vertex, result in vertice_result: pkg, action, sub_action = vertex if isinstance(result['action'], dict) and 'env_package' in result[ 'action'] and result['action']['env_package']: path_def = self.__config_release.config['setting'].get( 'path_def', {}) pkg_info = self.__pkg_mgr.package_info(pkg) self.__env.set_package(path_def, pkg_info) if isinstance( result['action'], dict) and 'save_release_status' in result[ 'action'] and result['action']['save_release_status']: self.__pkg_mgr.save_release_status(pkg, result['end']) if result['success']: _logger.info(' > {0} {1} {2} finished'.format( pkg, action, sub_action)) if self.__step_info.is_last_sub_action(pkg, action, sub_action): self.__pkg_mgr.save_action_status(pkg, action, result['start'], result['end']) def report_running(self, vertice): if not vertice: return running_vertice = [] for v in vertice: if v[2] == 0: action_full_name = '{0}({1})' else: action_full_name = '{0}({1}.{2})' running_vertice.append(action_full_name.format(*v)) _logger.info('Running: ' + ', '.join(running_vertice)) def deliver(self, vertex, result): pass def abort(self, vertice): pass