def get_pf_data_from_rundb(self, targets, run_id=None, tx_id=None): """ This function takes the action and provision_data, returns the pinfile data :param targets: A list of targets for which to get the data :param targets: Tuple of target(s) for which to gather data. :param run_id: run_id associated with target (Default: None) :param tx_id: tx_id for which to gather data (Default: None) """ rundb = self.setup_rundb() if run_id and tx_id: raise ActionError("'run_id' and 'tx_id' are mutually exclusive") pf_data = {} pinfile = OrderedDict() if run_id: for target in targets: pf_data[target] = rundb.get_record(target, action='up', run_id=run_id) if tx_id: record = rundb.get_tx_record(tx_id) if not record or not len(record): return None if len(targets): for tgts in record['targets']: for tgt, data in tgts.iteritems(): run_id = int(data.keys()[0]) if tgt in targets: tgt_data = (rundb.get_record( tgt, action=record['action'], run_id=run_id)) pf_data[tgt] = tgt_data else: for tgts in record['targets']: for tgt, data in tgts.iteritems(): run_id = int(data.keys()[0]) tgt_data = (rundb.get_record(tgt, action=record['action'], run_id=run_id)) pf_data[tgt] = tgt_data for t, data in pf_data.iteritems(): topo_data = data[0]['inputs'][0].get('topology_data') layout_data = data[0]['inputs'][0].get('layout_data') hooks_data = data[0]['inputs'][0].get('hooks_data') pinfile[t] = {} pinfile[t]['topology'] = topo_data pinfile[t]['run_id'] = data[1] if layout_data: pinfile[t]['layout'] = layout_data if hooks_data: pinfile[t]['hooks'] = hooks_data return pinfile
def _execute_action(self, action, targets=(), run_id=None, tx_id=None): """ This function takes a list of targets, and performs a destructive teardown, including undefining nodes, according to the target(s). .. seealso:: lp_down - currently unimplemented :param targets: A tuple of targets to perform action upon. :param run_id: An optional run_id to use :param tx_id: An optional tx_id to use """ use_pinfile = True pf = None return_data = OrderedDict() return_code = 0 urfa = self.get_cfg('lp', 'use_rundb_for_actions') use_rundb_for_actions = ast.literal_eval(urfa.title()) # The UI should catch this, but just in case. if run_id and tx_id: raise ActionError("'run_id' and 'tx_id' are mutually exclusive") if use_rundb_for_actions: if run_id and not tx_id: if not len(targets) == 1: raise ActionError("'use_rundb_for_actions' is enabled." " A single target required when" " passing --run_id.") run_id = int(run_id) use_pinfile = False elif not run_id and tx_id: use_pinfile = False if use_pinfile: pf_w_path = self._get_pinfile_path() pf_data_path = self._get_data_path() if not pf_data_path: pf = self.parser.process(pf_w_path, data=self.pf_data) else: pf = self.parser.process(pf_w_path, data='@{0}'.format(pf_data_path)) if pf: provision_data = self._build(pf, pf_data=self.pf_data) pf_outfile = self.get_cfg('tmp', 'outfile') if pf_outfile: self.parser.write_json(provision_data, pf_outfile) return_code, return_data = self._execute(provision_data, targets, action=action, run_id=run_id) else: # get the pinfile data from the run_id or the tx_id provision_data = self.get_pf_data_from_rundb(targets, run_id=run_id, tx_id=tx_id) if provision_data: return_code, return_data = self._execute(provision_data, targets, action=action, run_id=run_id, tx_id=tx_id) else: return (99, {}) return (return_code, return_data)