def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) clients = self.app.client_manager if not parsed_args.yes: confirm = oooutils.prompt_user_for_confirmation(message=_( "Are you sure you want to delete these overcloud " "nodes [y/N]? "), logger=self.log) if not confirm: raise oscexc.CommandError("Action not confirmed, exiting.") orchestration_client = clients.orchestration stack = oooutils.get_stack(orchestration_client, parsed_args.stack) if not stack: raise InvalidConfiguration("stack {} not found".format( parsed_args.stack)) nodes = '\n'.join('- %s' % node for node in parsed_args.nodes) print( "Deleting the following nodes from stack {stack}:\n{nodes}".format( stack=stack.stack_name, nodes=nodes)) scale.scale_down(clients, stack.stack_name, parsed_args.nodes, parsed_args.timeout)
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) if not parsed_args.yes: confirm = utils.prompt_user_for_confirmation( message=_("Are you sure you want to delete this image " "[y/N]? "), logger=self.log) if not confirm: raise oscexc.CommandError("Action not confirmed, exiting.") lock = processlock.ProcessLock() manager = image_uploader.ImageUploadManager(lock=lock) uploader = manager.uploader('python') registry_url_arg = parsed_args.registry_url if registry_url_arg is None: registry_url_arg = image_uploader.get_undercloud_registry() url = uploader._image_to_url(registry_url_arg) session = uploader.authenticate(url, parsed_args.username, parsed_args.password) try: uploader.delete(parsed_args.image_to_delete, session=session) except OSError as e: self.log.error("Unable to remove due to permissions. " "Please prefix command with sudo.") raise oscexc.CommandError(e)
def take_action(self, parsed_args): self.log.debug("take_action({args})".format(args=parsed_args)) self._validate_args(parsed_args) if not parsed_args.yes: confirm = utils.prompt_user_for_confirmation(message=_( "Are you sure you want to delete this overcloud " "[y/N]? "), logger=self.log) if not confirm: raise oscexc.CommandError("Action not confirmed, exiting.") if parsed_args.skip_ipa_cleanup: playbooks = ["cli-overcloud-delete.yaml"] else: # Order is important, let's make sure we cleanup FreeIPA before we # start removing infrastructure. playbooks = ["cli-cleanup-ipa.yml", "cli-overcloud-delete.yaml"] with utils.TempDirs() as tmp: utils.run_ansible_playbook( playbooks, constants.ANSIBLE_INVENTORY, workdir=tmp, playbook_dir=constants.ANSIBLE_TRIPLEO_PLAYBOOKS, verbosity=utils.playbook_verbosity(self=self), extra_vars={"stack_name": parsed_args.stack}) print("Success.")
def _create_variables_file(self, data, varsfile): msg = (_("The file %s already exists on the filesystem, " "do you still want to continue [y/N] ")) if varsfile[0] not in ['json', 'yaml']: raise RuntimeError(_('Wrong file type: %s') % varsfile[0]) else: LOG.debug(_('Launch variables file creation')) try: if os.path.exists(varsfile[-1]): confirm = oooutils.prompt_user_for_confirmation( message=msg % varsfile[-1], logger=LOG) if not confirm: raise RuntimeError(_("Action not confirmed, exiting")) with open(varsfile[-1], 'w') as f: params = {} for val_name in data.keys(): for k, v in data[val_name].get('parameters').items(): params[k] = v if varsfile[0] == 'json': f.write(oooutils.get_validations_json(params)) elif varsfile[0] == 'yaml': f.write(oooutils.get_validations_yaml(params)) print( _('The file %s has been created successfully') % varsfile[-1]) except Exception as e: print(_("Creating variables file finished with errors")) print('Output: {}'.format(e))
def take_action(self, parsed_args): # Fetch configuration used to add logging to a file utils.load_config(self.osloconfig, constants.UNDERCLOUD_CONF_PATH) utils.configure_logging(self.log, self.app_args.verbose_level, self.osloconfig['undercloud_log_file']) self.log.debug("take action(%s)" % parsed_args) if (not parsed_args.yes and not utils.prompt_user_for_confirmation( constants.UPGRADE_PROMPT, self.log)): raise exceptions.UndercloudUpgradeNotConfirmed( constants.UPGRADE_NO) utils.ensure_run_as_normal_user() if not parsed_args.skip_package_updates: if ('python3' in sys.executable): pyver = '3' else: pyver = '2' client_pkgs = [ "python{}-tripleoclient".format(pyver), ] pkgs = client_pkgs + constants.UNDERCLOUD_EXTRA_PACKAGES self._update_extra_packages(pkgs, parsed_args.dry_run) self._invoke_self(parsed_args) else: self._run_upgrade(parsed_args)
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) clients = self.app.client_manager if parsed_args.baremetal_deployment: with open(parsed_args.baremetal_deployment, 'r') as fp: roles = yaml.safe_load(fp) nodes_text, nodes = self._nodes_to_delete(parsed_args, roles) if nodes_text: print(nodes_text) else: return else: nodes = parsed_args.nodes nodes_text = '\n'.join('- %s' % node for node in nodes) if not parsed_args.yes: confirm = oooutils.prompt_user_for_confirmation(message=_( "Are you sure you want to delete these overcloud " "nodes [y/N]? "), logger=self.log) if not confirm: raise oscexc.CommandError("Action not confirmed, exiting.") orchestration_client = clients.orchestration stack = oooutils.get_stack(orchestration_client, parsed_args.stack) if not stack: raise InvalidConfiguration("stack {} not found".format( parsed_args.stack)) print( "Deleting the following nodes from stack {stack}:\n{nodes}".format( stack=stack.stack_name, nodes=nodes_text)) scale.scale_down( log=self.log, clients=clients, stack=stack, nodes=nodes, connection_timeout=parsed_args.overcloud_ssh_port_timeout, timeout=parsed_args.timeout, verbosity=oooutils.playbook_verbosity(self=self)) if parsed_args.baremetal_deployment: with oooutils.TempDirs() as tmp: oooutils.run_ansible_playbook( playbook='cli-overcloud-node-unprovision.yaml', inventory='localhost,', workdir=tmp, playbook_dir=constants.ANSIBLE_TRIPLEO_PLAYBOOKS, verbosity=oooutils.playbook_verbosity(self=self), extra_vars={ "stack_name": parsed_args.stack, "baremetal_deployment": roles, "prompt": False, })
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) if (not parsed_args.yes and not utils.prompt_user_for_confirmation( constants.UPGRADE_PROMPT, self.log)): raise UndercloudUpgradeNotConfirmed(constants.UPGRADE_NO) parsed_args.standalone = True parsed_args.upgrade = True super(Upgrade, self).take_action(parsed_args)
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) with open(parsed_args.input, 'r') as fp: roles = yaml.safe_load(fp) with oooutils.TempDirs() as tmp: unprovision_confirm = os.path.join(tmp, 'unprovision_confirm.json') if not parsed_args.yes: oooutils.run_ansible_playbook( playbook='cli-overcloud-node-unprovision.yaml', inventory='localhost,', workdir=tmp, playbook_dir=constants.ANSIBLE_TRIPLEO_PLAYBOOKS, verbosity=oooutils.playbook_verbosity(self=self), extra_vars={ "stack_name": parsed_args.stack, "baremetal_deployment": roles, "all": parsed_args.all, "prompt": True, "unprovision_confirm": unprovision_confirm } ) with open(unprovision_confirm) as f: to_unprovision = json.load(f) if not to_unprovision: print('Nothing to unprovision, exiting') return self._print_nodes(to_unprovision) confirm = oooutils.prompt_user_for_confirmation( message=_("Are you sure you want to unprovision these %s " "nodes [y/N]? ") % parsed_args.stack, logger=self.log) if not confirm: raise oscexc.CommandError("Action not confirmed, exiting.") oooutils.run_ansible_playbook( playbook='cli-overcloud-node-unprovision.yaml', inventory='localhost,', workdir=tmp, playbook_dir=constants.ANSIBLE_TRIPLEO_PLAYBOOKS, verbosity=oooutils.playbook_verbosity(self=self), extra_vars={ "stack_name": parsed_args.stack, "baremetal_deployment": roles, "all": parsed_args.all, "prompt": False, } ) print('Unprovision complete')
def take_action(self, parsed_args): self.log.debug("take_action({args})".format(args=parsed_args)) self._validate_args(parsed_args) if not parsed_args.yes: confirm = utils.prompt_user_for_confirmation(message=_( "Are you sure you want to delete this overcloud " "[y/N]? "), logger=self.log) if not confirm: raise oscexc.CommandError("Action not confirmed, exiting.") clients = self.app.client_manager self._plan_undeploy(clients, parsed_args.stack) self._plan_delete(clients, parsed_args.stack) print("Success.")
def take_action(self, parsed_args): self.log.debug("take_action({args})".format(args=parsed_args)) self._validate_args(parsed_args) if not parsed_args.yes: confirm = utils.prompt_user_for_confirmation( message=_("Are you sure you want to delete this overcloud " "[y/N]? "), logger=self.log) if not confirm: raise oscexc.CommandError("Action not confirmed, exiting.") clients = self.app.client_manager orchestration_client = clients.orchestration workflow_client = self.app.client_manager.workflow_engine self._stack_delete(orchestration_client, parsed_args.stack) self._plan_delete(workflow_client, parsed_args.stack) print("Success.")
def take_action(self, parsed_args): self.log.debug("take_action({args})".format(args=parsed_args)) self._validate_args(parsed_args) if not parsed_args.yes: confirm = utils.prompt_user_for_confirmation(message=_( "Are you sure you want to delete this overcloud " "[y/N]? "), logger=self.log) if not confirm: raise oscexc.CommandError("Action not confirmed, exiting.") with utils.TempDirs() as tmp: utils.run_ansible_playbook( "cli-overcloud-delete.yaml", 'undercloud,', workdir=tmp, playbook_dir=constants.ANSIBLE_TRIPLEO_PLAYBOOKS, verbosity=utils.playbook_verbosity(self=self), extra_vars={"stack_name": parsed_args.stack}) print("Success.")
def test_user_aborts_with_control_d(self, stdin_mock): stdin_mock.isatty.return_value = False stdin_mock.readline.side_effect = EOFError() result = utils.prompt_user_for_confirmation("[y/N]?", self.logger) self.assertFalse(result)
def test_user_aborts_control_c(self, stdin_mock): stdin_mock.isatty.return_value = False stdin_mock.readline.side_effect = KeyboardInterrupt() result = utils.prompt_user_for_confirmation("[y/N]?", self.logger) self.assertFalse(result)
def test_user_no_tty(self, stdin_mock): stdin_mock.isatty.return_value = False stdin_mock.readline.return_value = "yes" result = utils.prompt_user_for_confirmation("[y/N]?", self.logger) self.assertFalse(result)
def test_user_accepts(self, stdin_mock): stdin_mock.isatty.return_value = True stdin_mock.readline.return_value = "yes" result = utils.prompt_user_for_confirmation("[y/N]?", self.logger) self.assertTrue(result)