def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) _, ansible_dir = self.get_ansible_key_and_dir( no_workflow=True, stack=parsed_args.stack, orchestration=self.app.client_manager.orchestration ) deployment.config_download( log=self.log, clients=self.app.client_manager, stack=oooutils.get_stack( self.app.client_manager.orchestration, parsed_args.stack ), output_dir=ansible_dir, verbosity=oooutils.playbook_verbosity(self=self), ansible_playbook_name=constants.FFWD_UPGRADE_PLAYBOOK, inventory_path=oooutils.get_tripleo_ansible_inventory( parsed_args.static_inventory, parsed_args.ssh_user, parsed_args.stack, return_inventory_file_path=True ) ) self.log.info("Completed Overcloud FFWD Upgrade Run.")
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) _, ansible_dir = self.get_ansible_key_and_dir( no_workflow=True, stack=parsed_args.stack, orchestration=self.app.client_manager.orchestration) deployment.config_download( log=self.log, clients=self.app.client_manager, stack=oooutils.get_stack(self.app.client_manager.orchestration, parsed_args.stack), output_dir=ansible_dir, verbosity=oooutils.playbook_verbosity(self=self), ansible_playbook_name=constants.EXTERNAL_UPDATE_PLAYBOOKS, extra_vars=oooutils.parse_extra_vars( extra_var_strings=parsed_args.extra_vars), inventory_path=oooutils.get_tripleo_ansible_inventory( parsed_args.static_inventory, parsed_args.ssh_user, parsed_args.stack, return_inventory_file_path=True), tags=parsed_args.tags, skip_tags=parsed_args.skip_tags, limit_hosts=oooutils.playbook_limit_parse( limit_nodes=parsed_args.limit)) self.log.info("Completed Overcloud External Update Run.")
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) clients = self.app.client_manager orchestration = clients.orchestration verbosity = self.app_args.verbose_level stack = parsed_args.stack ansible_dir = None key = None # Disable mistral if parsed_args.no_workflow: ansible_dir = oooutils.download_ansible_playbooks(orchestration, stack) key = package_update.get_key(clients) # Run ansible: limit_hosts = parsed_args.limit playbook = parsed_args.playbook inventory = oooutils.get_tripleo_ansible_inventory( parsed_args.static_inventory, parsed_args.ssh_user, stack) oooutils.run_update_ansible_action(self.log, clients, limit_hosts, inventory, playbook, constants.MINOR_UPDATE_PLAYBOOKS, parsed_args.ssh_user, (None if parsed_args.no_workflow else package_update), verbosity=verbosity, workdir=ansible_dir, priv_key=key)
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) oooutils.ffwd_upgrade_operator_confirm(parsed_args.yes, self.log) verbosity = self.app_args.verbose_level clients = self.app.client_manager orchestration = clients.orchestration stack = parsed_args.stack ansible_dir = None key = None # Disable mistral if parsed_args.no_workflow: ansible_dir = oooutils.download_ansible_playbooks( orchestration, stack) key = package_update.get_key(clients) # Run ansible: inventory = oooutils.get_tripleo_ansible_inventory( inventory_file=parsed_args.static_inventory, ssh_user=parsed_args.ssh_user, stack=parsed_args.stack) # Don't expost limit_hosts. We need this on the whole overcloud. limit_hosts = '' oooutils.run_update_ansible_action( self.log, clients, limit_hosts, inventory, constants.FFWD_UPGRADE_PLAYBOOK, [], parsed_args.ssh_user, (None if parsed_args.no_workflow else package_update), verbosity=verbosity, workdir=ansible_dir, priv_key=key)
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) clients = self.app.client_manager orchestration = clients.orchestration verbosity = self.app_args.verbose_level stack = parsed_args.stack ansible_dir = None key = None # Disable mistral if parsed_args.no_workflow: ansible_dir = oooutils.download_ansible_playbooks(orchestration, stack) key = package_update.get_key(clients) # Run ansible: inventory = oooutils.get_tripleo_ansible_inventory( parsed_args.static_inventory, parsed_args.ssh_user, stack) limit_hosts = 'all' playbook = 'all' extra_vars = oooutils.parse_extra_vars(parsed_args.extra_vars) oooutils.run_update_ansible_action( self.log, clients, limit_hosts, inventory, playbook, constants.EXTERNAL_UPDATE_PLAYBOOKS, parsed_args.ssh_user, (None if parsed_args.no_workflow else package_update), tags=parsed_args.tags, skip_tags=parsed_args.skip_tags, verbosity=verbosity, extra_vars=extra_vars, workdir=ansible_dir, priv_key=key) self.log.info("Completed Overcloud External Update Run.")
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) # NOTE(cloudnull): The string option "all" was a special default # that is no longer relevant. To retain compatibility # this condition has been put in place. if not parsed_args.playbook or parsed_args.playbook == ['all']: playbook = constants.MAJOR_UPGRADE_PLAYBOOKS else: playbook = parsed_args.playbook _, ansible_dir = self.get_ansible_key_and_dir( no_workflow=parsed_args.no_workflow, stack=parsed_args.stack, orchestration=self.app.client_manager.orchestration) deployment.config_download( log=self.log, clients=self.app.client_manager, stack=oooutils.get_stack(self.app.client_manager.orchestration, parsed_args.stack), output_dir=ansible_dir, verbosity=oooutils.playbook_verbosity(self=self), ansible_playbook_name=playbook, inventory_path=oooutils.get_tripleo_ansible_inventory( parsed_args.static_inventory, parsed_args.ssh_user, parsed_args.stack, return_inventory_file_path=True), tags=parsed_args.tags, skip_tags=parsed_args.skip_tags, limit_list=[i.strip() for i in parsed_args.limit.split(',') if i]) self.log.info("Completed Overcloud Major Upgrade Run.")
def test_get_tripleo_ansible_inventory(self, mock_inventory): with mock.patch('os.path.exists') as mock_exists: mock_exists.return_value = True self.cmd = utils.get_tripleo_ansible_inventory( inventory_file=self.inventory_file, ssh_user=self.ssh_user, stack=self.stack) self.cmd.take_action() mock_inventory.assert_called_once_with(inventory_file='', ssh_user='******', stack='foo-overcloud')
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) clients = self.app.client_manager # Run ansible: nodes = parsed_args.nodes if nodes == 'all': # unset this, the ansible action deals with unset 'limithosts' nodes = None playbook = parsed_args.playbook inventory = oooutils.get_tripleo_ansible_inventory( parsed_args.static_inventory, parsed_args.ssh_user) oooutils.run_update_ansible_action(self.log, clients, nodes, inventory, playbook, constants.UPDATE_QUEUE, constants.MINOR_UPDATE_PLAYBOOKS, package_update, parsed_args.ssh_user)
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) clients = self.app.client_manager # Run ansible: roles = parsed_args.roles nodes = parsed_args.nodes limit_hosts = roles or nodes playbook = parsed_args.playbook inventory = oooutils.get_tripleo_ansible_inventory( parsed_args.static_inventory, parsed_args.ssh_user) skip_tags = self._validate_skip_tags(parsed_args.skip_tags) oooutils.run_update_ansible_action(self.log, clients, limit_hosts, inventory, playbook, constants.UPGRADE_QUEUE, constants.MAJOR_UPGRADE_PLAYBOOKS, package_update, parsed_args.ssh_user, skip_tags)
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) oooutils.ffwd_upgrade_operator_confirm(parsed_args.yes, self.log) clients = self.app.client_manager # Run ansible: inventory = oooutils.get_tripleo_ansible_inventory( inventory_file=parsed_args.static_inventory, ssh_user=parsed_args.ssh_user, stack=parsed_args.stack) # Don't expost limit_hosts. We need this on the whole overcloud. limit_hosts = '' oooutils.run_update_ansible_action(self.log, clients, limit_hosts, inventory, constants.FFWD_UPGRADE_PLAYBOOK, constants.FFWD_UPGRADE_QUEUE, [], package_update, parsed_args.ssh_user)
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) clients = self.app.client_manager verbosity = self.app_args.verbose_level orchestration = clients.orchestration stack = parsed_args.stack ansible_dir = None key = None # Disable mistral if parsed_args.no_workflow: ansible_dir = oooutils.download_ansible_playbooks( orchestration, stack) key = package_update.get_key(clients) # Run ansible: limit_hosts = parsed_args.limit playbook = parsed_args.playbook inventory = oooutils.get_tripleo_ansible_inventory( parsed_args.static_inventory, parsed_args.ssh_user, stack) skip_tags = self._validate_skip_tags(parsed_args.skip_tags) oooutils.run_update_ansible_action( self.log, clients, limit_hosts, inventory, playbook, constants.MAJOR_UPGRADE_PLAYBOOKS, parsed_args.ssh_user, (None if parsed_args.no_workflow else package_update), parsed_args.tags, skip_tags, verbosity, workdir=ansible_dir, priv_key=key) playbooks = (constants.MAJOR_UPGRADE_PLAYBOOKS if playbook == 'all' else playbook) self.log.info(("Completed Overcloud Upgrade Run for {0} with " "playbooks {1} ").format(limit_hosts, playbooks))
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) clients = self.app.client_manager stack = parsed_args.stack # Run ansible: roles = parsed_args.roles nodes = parsed_args.nodes limit_hosts = roles or nodes playbook = parsed_args.playbook inventory = oooutils.get_tripleo_ansible_inventory( parsed_args.static_inventory, parsed_args.ssh_user, stack) skip_tags = self._validate_skip_tags(parsed_args.skip_tags) oooutils.run_update_ansible_action(self.log, clients, limit_hosts, inventory, playbook, constants.UPGRADE_QUEUE, constants.MAJOR_UPGRADE_PLAYBOOKS, package_update, parsed_args.ssh_user, skip_tags) playbooks = (constants.MAJOR_UPGRADE_PLAYBOOKS if playbook == 'all' else playbook) self.log.info(("Completed Overcloud Upgrade Run for {0} with " "playbooks {1} ").format(limit_hosts, playbooks))
def _run_validator_run(self, parsed_args): clients = self.app.client_manager LOG = logging.getLogger(__name__ + ".ValidationsRunAnsible") playbooks = [] extra_vars_input = {} if parsed_args.extra_vars: extra_vars_input = parsed_args.extra_vars if parsed_args.extra_vars_file: extra_vars_input = parsed_args.extra_vars_file if parsed_args.group: workflow_input = {"group_names": parsed_args.group} LOG.debug(_('Getting the validations list by group')) try: output = validations.list_validations(clients, workflow_input) for val in output: playbooks.append(val.get('id') + '.yaml') except Exception as e: print(_("Validations listing by group finished with errors")) print('Output: {}'.format(e)) else: for pb in parsed_args.validation_name: playbooks.append(pb + '.yaml') python_interpreter = \ "/usr/bin/python{}".format(sys.version_info[0]) static_inventory = oooutils.get_tripleo_ansible_inventory( ssh_user='******', stack=parsed_args.plan, undercloud_connection='local', return_inventory_file_path=True) failed_val = False with ThreadPoolExecutor(max_workers=parsed_args.workers) as executor: LOG.debug(_('Running the validations with Ansible')) tasks_exec = { executor.submit(self._run_ansible, logger=LOG, plan=parsed_args.plan, workdir=constants.ANSIBLE_VALIDATION_DIR, log_path_dir=pwd.getpwuid(os.getuid()).pw_dir, playbook=playbook, inventory=static_inventory, retries=False, output_callback='validation_output', extra_vars=extra_vars_input, python_interpreter=python_interpreter, gathering_policy='explicit'): playbook for playbook in playbooks } for tk, pl in six.iteritems(tasks_exec): try: rc, output = tk.result() print('[SUCCESS] - {}\n{}'.format(pl, oooutils.indent(output))) except Exception as e: failed_val = True LOG.error('[FAILED] - {}\n{}'.format( pl, oooutils.indent(e.args[0]))) LOG.debug(_('Removing static tripleo ansible inventory file')) oooutils.cleanup_tripleo_ansible_inventory_file(static_inventory) if failed_val: LOG.error(_('One or more validations have failed!')) sys.exit(1) sys.exit(0)
def invoke_plan_env_workflows(clients, stack_name, plan_env_file, verbosity=0): """Invokes the workflows in plan environment file""" try: with open(plan_env_file) as pf: plan_env_data = yaml.safe_load(pf.read()) except IOError as exc: raise exceptions.PlanEnvWorkflowError('File (%s) is not found: ' '%s' % (plan_env_file, exc)) if plan_env_data and "playbook_parameters" in plan_env_data: static_inventory = utils.get_tripleo_ansible_inventory( ssh_user='******', stack=stack_name, undercloud_connection='local', return_inventory_file_path=True) with utils.TempDirs() as tmp: for pb, pb_vars in plan_env_data["playbook_parameters"].items(): print('Invoking playbook ({}) specified in plan-environment' ' file'.format(pb)) LOG.debug('Running playbook "{}" with the' ' following options {}.'.format(pb, pb_vars)) playbook_dir = os.path.dirname(pb) if not playbook_dir: playbook_dir = ANSIBLE_TRIPLEO_PLAYBOOKS utils.run_ansible_playbook(playbook=os.path.basename(pb), inventory=static_inventory, workdir=tmp, playbook_dir=playbook_dir, verbosity=verbosity, extra_vars=pb_vars) # NOTE(cloudnull): Remove this when mistral is gone. elif plan_env_data and "workflow_parameters" in plan_env_data: LOG.warning( 'The workflow_parameters interface is deprecated, begin using' ' playbook_parameters instead.') for wf_name, wf_inputs in plan_env_data["workflow_parameters"].items(): print('Invoking workflow (%s) specified in plan-environment ' 'file' % wf_name) inputs = {'plan': stack_name, 'user_inputs': wf_inputs} workflow_client = clients.workflow_engine tripleoclients = clients.tripleoclient with tripleoclients.messaging_websocket() as ws: execution = base.start_workflow(workflow_client, wf_name, workflow_input=inputs) # Getting the derive parameters timeout after 600 seconds. for payload in base.wait_for_messages(workflow_client, ws, execution, 600): if ('message' in payload and (payload.get('status', 'RUNNING') == "RUNNING")): print(payload['message']) if payload.get('status', 'FAILED') == 'SUCCESS': result = payload.get('result', '') # Prints the workflow result if result: print('Workflow execution is completed. result:') print(yaml.safe_dump(result, default_flow_style=False)) else: message = payload.get('message', '') msg = ('Workflow execution is failed: %s' % (message)) raise exceptions.PlanEnvWorkflowError(msg)
def _run_validator_run(self, parsed_args): LOG = logging.getLogger(__name__ + ".ValidationsRunAnsible") playbooks = [] extra_vars_input = {} if parsed_args.extra_vars: extra_vars_input = parsed_args.extra_vars if parsed_args.extra_vars_file: extra_vars_input = parsed_args.extra_vars_file if parsed_args.group: LOG.debug(_('Getting the validations list by group')) try: output = oooutils.parse_all_validations_on_disk( constants.ANSIBLE_VALIDATION_DIR, parsed_args.group) for val in output: playbooks.append(val.get('id') + '.yaml') except Exception as e: print( _("Getting Validations list by group name" "finished with errors")) print('Output: {}'.format(e)) else: for pb in parsed_args.validation_name: if pb not in oooutils.get_validation_group_name_list(): playbooks.append(pb + '.yaml') else: raise exceptions.CommandError( "Please, use '--group' argument instead of " "'--validation' to run validation(s) by their name(s)." ) static_inventory = oooutils.get_tripleo_ansible_inventory( ssh_user='******', stack=parsed_args.plan, undercloud_connection='local', return_inventory_file_path=True) failed_val = False with oooutils.TempDirs() as tmp: with ThreadPoolExecutor(max_workers=parsed_args.workers) as exe: LOG.debug(_('Running the validations with Ansible')) tasks_exec = { exe.submit(oooutils.run_ansible_playbook, plan=parsed_args.plan, workdir=tmp, playbook=playbook, playbook_dir=constants.ANSIBLE_VALIDATION_DIR, parallel_run=True, inventory=static_inventory, output_callback='validation_json', quiet=True, extra_vars=extra_vars_input, gathering_policy='explicit'): playbook for playbook in playbooks } results = [] for tk, pl in six.iteritems(tasks_exec): try: _rc, output = tk.result() results.append({ 'validation': { 'validation_id': pl, 'logfile': None, 'status': 'PASSED', 'output': output } }) except Exception as e: failed_val = True results.append({ 'validation': { 'validation_id': pl, 'logfile': None, 'status': 'FAILED', 'output': str(e) } }) if results: new_log_files = oooutils.get_new_validations_logs_on_disk() for i in new_log_files: val_id = "{}.yaml".format(i.split('_')[1]) for res in results: if res['validation'].get('validation_id') == val_id: res['validation']['logfile'] = \ os.path.join(constants.VALIDATIONS_LOG_BASEDIR, i) t = PrettyTable(border=True, header=True, padding_width=1) t.field_names = [ "UUID", "Validations", "Status", "Host Group(s)", "Status by Host", "Unreachable Host(s)", "Duration" ] for validation in results: r = [] logfile = validation['validation'].get('logfile', None) if logfile and os.path.exists(logfile): with open(logfile, 'r') as val: contents = json.load(val) for i in contents['plays']: host = [x for x in i['play'].get('host').split(', ')] val_id = i['play'].get('validation_id') time_elapsed = \ i['play']['duration'].get('time_elapsed', None) r.append(contents['plays'][0]['play'].get('id')) r.append(val_id) if validation['validation'].get('status') == "PASSED": r.append(PASSED_VALIDATION) else: r.append(FAILED_VALIDATION) unreachable_hosts = [] hosts_result = [] for ht in list(contents['stats'].keys()): if contents['stats'][ht]['unreachable'] != 0: unreachable_hosts.append(ht) elif contents['stats'][ht]['failures'] != 0: hosts_result.append("{}{}{}".format( RED, ht, RESET)) else: hosts_result.append("{}{}{}".format( GREEN, ht, RESET)) r.append(", ".join(host)) r.append(", ".join(hosts_result)) r.append("{}{}{}".format(RED, ", ".join(unreachable_hosts), RESET)) r.append(time_elapsed) t.add_row(r) t.sortby = "UUID" for field in t.field_names: if field == "Status": t.align['Status'] = "l" else: t.align[field] = "l" print(t) if len(new_log_files) > len(results): LOG.warn( _('Looks like we have more log files than ' 'executed validations')) for i in new_log_files: os.rename( "{}/{}".format(constants.VALIDATIONS_LOG_BASEDIR, i), "{}/processed_{}".format(constants.VALIDATIONS_LOG_BASEDIR, i)) LOG.debug(_('Removing static tripleo ansible inventory file')) oooutils.cleanup_tripleo_ansible_inventory_file(static_inventory) if failed_val: raise exceptions.CommandError( _('One or more validations have failed!'))