Remove left over mistral layers of abstration

This change removes several layers of abstration from our overcloud commands.
By cleaning up these layers we'll improve the understandability of the client
code while also improving the speed of these interactions.

Story: 2007212

Change-Id: I71617d4f47caaee9ce3025191ff0c0ebfe2adf79
Signed-off-by: Kevin Carter <kecarter@redhat.com>
changes/94/707894/7
Kevin Carter 3 years ago
parent dc9ae1ac5b
commit 6fa0e3d1be
No known key found for this signature in database
GPG Key ID: CE94BD890A47B20A

@ -57,7 +57,7 @@ class Command(command.Command):
if no_workflow:
key = utils.get_key(stack=stack)
stack_config = config.Config(orchestration)
with utils.TempDirs(cleanup=False, chdir=False) as tmp:
with utils.TempDirs(chdir=False) as tmp:
stack_config.write_config(
stack_config.fetch_config(stack),
stack,

@ -174,7 +174,34 @@ class FakePlaybookExecution(utils.TestCommand):
workflow.executions.create.return_value = execution
self.app.client_manager.workflow_engine = workflow
config_mock = mock.patch(
'tripleo_common.actions.config.GetOvercloudConfig',
autospec=True
)
config_mock.start()
self.addCleanup(config_mock.stop)
self.ansible = mock.patch(
'tripleo_common.actions.ansible.AnsibleGenerateInventoryAction',
autospec=True
)
self.ansible.start()
self.addCleanup(self.ansible.stop)
self.config_action = mock.patch(
'tripleo_common.actions.config.DownloadConfigAction',
autospec=True
)
self.config_action.start()
self.addCleanup(self.config_action.stop)
if ansible_mock:
get_stack = mock.patch('tripleoclient.utils.get_stack')
get_stack.start()
stack = get_stack.return_value = mock.Mock()
stack.stack_name = 'testStack'
self.addCleanup(get_stack.stop)
self.gcn = mock.patch(
'tripleo_common.utils.config.Config',
autospec=True

@ -42,17 +42,12 @@ class TestDeleteOvercloud(fakes.TestDeployOvercloud):
self.cmd._plan_undeploy(clients, 'overcloud')
orchestration_client.stacks.get.assert_called_once_with('overcloud')
mock_plan_undeploy.assert_called_once_with(
clients, plan="foobar")
@mock.patch(
'tripleoclient.workflows.stack_management.base.start_workflow',
autospec=True)
def test_plan_undeploy_wf_params(self, mock_plan_undeploy_wf):
clients = self.app.client_manager
orchestration_client = clients.orchestration
workflow_engine = clients.workflow_engine
stack = mock.Mock()
stack.id = 12345
@ -60,31 +55,3 @@ class TestDeleteOvercloud(fakes.TestDeployOvercloud):
orchestration_client.stacks.get.return_value = stack
self.cmd._plan_undeploy(clients, 'overcloud')
orchestration_client.stacks.get.assert_called_once_with('overcloud')
mock_plan_undeploy_wf.assert_called_once_with(
workflow_engine,
"tripleo.deployment.v1.undeploy_plan",
workflow_input={"container": "foobar"})
def test_plan_undeploy_no_stack(self):
clients = self.app.client_manager
orchestration_client = clients.orchestration
type(orchestration_client.stacks.get).return_value = None
self.cmd.log.warning = mock.MagicMock()
self.cmd._plan_undeploy(clients, 'overcloud')
orchestration_client.stacks.get.assert_called_once_with('overcloud')
self.cmd.log.warning.assert_called_once_with(
"No stack found ('overcloud'), skipping delete")
@mock.patch(
'tripleoclient.workflows.plan_management.delete_deployment_plan',
autospec=True)
def test_plan_delete(self, delete_deployment_plan_mock):
self.cmd._plan_delete(self.workflow, 'overcloud')
delete_deployment_plan_mock.assert_called_once_with(
self.workflow,
container='overcloud')

@ -60,22 +60,7 @@ class TestOvercloudExternalUpdateRun(fakes.TestOvercloudExternalUpdateRun):
('tags', 'ceph'),
]
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
self.cmd.take_action(parsed_args)
update_ansible.assert_called_once_with(
playbook='external_update_steps_playbook.yaml',
inventory=mock.ANY,
workdir=mock.ANY,
ssh_user='tripleo-admin',
key='/var/lib/mistral/overcloud/ssh_private_key',
module_path='/usr/share/ansible-modules',
limit_hosts='all',
tags='ceph',
skip_tags='',
extra_vars={'ansible_become': True}
)
self.check_parser(self.cmd, argslist, verifylist)
@mock.patch(
'ansible_runner.runner_config.RunnerConfig',
@ -103,23 +88,4 @@ class TestOvercloudExternalUpdateRun(fakes.TestOvercloudExternalUpdateRun):
('extra_vars', ['key1=val1', 'key2=val2'])
]
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
self.cmd.take_action(parsed_args)
update_ansible.assert_called_once_with(
playbook='external_update_steps_playbook.yaml',
inventory=mock.ANY,
workdir=mock.ANY,
ssh_user='tripleo-admin',
key='/var/lib/mistral/overcloud/ssh_private_key',
module_path='/usr/share/ansible-modules',
limit_hosts='all',
tags='',
skip_tags='',
extra_vars={
'key1': 'val1',
'key2': 'val2',
'ansible_become': True
}
)
self.check_parser(self.cmd, argslist, verifylist)

@ -60,22 +60,7 @@ class TestOvercloudExternalUpgradeRun(fakes.TestOvercloudExternalUpgradeRun):
('tags', 'ceph'),
]
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
self.cmd.take_action(parsed_args)
update_ansible.assert_called_once_with(
playbook='external_upgrade_steps_playbook.yaml',
inventory=mock.ANY,
workdir=mock.ANY,
ssh_user='tripleo-admin',
key='/var/lib/mistral/overcloud/ssh_private_key',
module_path='/usr/share/ansible-modules',
limit_hosts='all',
tags='ceph',
skip_tags='',
extra_vars={'ansible_become': True}
)
self.check_parser(self.cmd, argslist, verifylist)
@mock.patch(
'ansible_runner.runner_config.RunnerConfig',
@ -103,23 +88,4 @@ class TestOvercloudExternalUpgradeRun(fakes.TestOvercloudExternalUpgradeRun):
('extra_vars', ['key1=val1', 'key2=val2'])
]
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
self.cmd.take_action(parsed_args)
update_ansible.assert_called_once_with(
playbook='external_upgrade_steps_playbook.yaml',
inventory=mock.ANY,
workdir=mock.ANY,
ssh_user='tripleo-admin',
key='/var/lib/mistral/overcloud/ssh_private_key',
module_path='/usr/share/ansible-modules',
limit_hosts='all',
tags='',
skip_tags='',
extra_vars={
'key1': 'val1',
'key2': 'val2',
'ansible_become': True
}
)
self.check_parser(self.cmd, argslist, verifylist)

@ -35,12 +35,6 @@ class TestFFWDUpgradePrepare(fakes.TestFFWDUpgradePrepare):
uuid4_patcher = mock.patch('uuid.uuid4', return_value="UUID4")
self.mock_uuid4 = uuid4_patcher.start()
self.addCleanup(self.mock_uuid4.stop)
config_mock = mock.patch(
'tripleo_common.actions.config.GetOvercloudConfig',
autospec=True
)
config_mock.start()
self.addCleanup(config_mock.stop)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'take_action')
@ -166,22 +160,7 @@ class TestFFWDUpgradeRun(fakes.TestFFWDUpgradeRun):
argslist = ['--ssh-user', 'heat-admin', '--yes']
verifylist = [('ssh_user', 'heat-admin'), ('yes', True), ]
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
self.cmd.take_action(parsed_args)
upgrade_ansible.assert_called_once_with(
playbook='fast_forward_upgrade_playbook.yaml',
inventory=mock.ANY,
workdir=mock.ANY,
ssh_user='heat-admin',
key='/var/lib/mistral/overcloud/ssh_private_key',
module_path='/usr/share/ansible-modules',
limit_hosts='',
tags='',
skip_tags='',
extra_vars={'ansible_become': True}
)
self.check_parser(self.cmd, argslist, verifylist)
@mock.patch('tripleoclient.utils.run_ansible_playbook',
autospec=True)
@ -194,22 +173,7 @@ class TestFFWDUpgradeRun(fakes.TestFFWDUpgradeRun):
argslist = ['--ssh-user', 'my-user', '--yes']
verifylist = [('ssh_user', 'my-user'), ('yes', True), ]
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
self.cmd.take_action(parsed_args)
upgrade_ansible.assert_called_once_with(
playbook='fast_forward_upgrade_playbook.yaml',
inventory=mock.ANY,
workdir=mock.ANY,
ssh_user='my-user',
key='/var/lib/mistral/overcloud/ssh_private_key',
module_path='/usr/share/ansible-modules',
limit_hosts='',
tags='',
skip_tags='',
extra_vars={'ansible_become': True}
)
self.check_parser(self.cmd, argslist, verifylist)
@mock.patch('tripleoclient.utils.run_ansible_playbook',
autospec=True)

@ -35,12 +35,6 @@ class TestOvercloudUpdatePrepare(fakes.TestOvercloudUpdatePrepare):
uuid4_patcher = mock.patch('uuid.uuid4', return_value="UUID4")
self.mock_uuid4 = uuid4_patcher.start()
self.addCleanup(self.mock_uuid4.stop)
config_mock = mock.patch(
'tripleo_common.actions.config.GetOvercloudConfig',
autospec=True
)
config_mock.start()
self.addCleanup(config_mock.stop)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_get_undercloud_host_entry', autospec=True,

@ -37,12 +37,6 @@ class TestOvercloudUpgradePrepare(fakes.TestOvercloudUpgradePrepare):
uuid4_patcher = mock.patch('uuid.uuid4', return_value="UUID4")
self.mock_uuid4 = uuid4_patcher.start()
self.addCleanup(self.mock_uuid4.stop)
config_mock = mock.patch(
'tripleo_common.actions.config.GetOvercloudConfig',
autospec=True
)
config_mock.start()
self.addCleanup(config_mock.stop)
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'take_action')
@ -193,30 +187,15 @@ class TestOvercloudUpgradeRun(fakes.TestOvercloudUpgradeRun):
mock_run, mock_run_prepare):
mock_expanduser.return_value = '/home/fake/'
argslist = ['--limit', 'Compute, Controller',
'--playbook', 'fake-playbook.yaml',
'--ssh-user', 'tripleo-admin']
'--playbook', 'fake-playbook1.yaml',
'fake-playbook2.yaml', '--ssh-user', 'tripleo-admin']
verifylist = [
('limit', 'Compute, Controller'),
('static_inventory', None),
('playbook', 'fake-playbook.yaml')
('playbook', ['fake-playbook1.yaml', 'fake-playbook2.yaml'])
]
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
self.cmd.take_action(parsed_args)
upgrade_ansible.assert_called_once_with(
playbook='fake-playbook.yaml',
inventory=mock.ANY,
workdir=mock.ANY,
ssh_user='tripleo-admin',
key='/var/lib/mistral/overcloud/ssh_private_key',
module_path='/usr/share/ansible-modules',
limit_hosts='Compute, Controller',
tags='',
skip_tags='',
extra_vars={'ansible_become': True}
)
self.check_parser(self.cmd, argslist, verifylist)
@mock.patch(
'ansible_runner.runner_config.RunnerConfig',
@ -241,25 +220,10 @@ class TestOvercloudUpgradeRun(fakes.TestOvercloudUpgradeRun):
verifylist = [
('limit', 'compute-0, compute-1'),
('static_inventory', None),
('playbook', 'fake-playbook.yaml'),
('playbook', ['fake-playbook.yaml']),
]
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
self.cmd.take_action(parsed_args)
upgrade_ansible.assert_called_once_with(
playbook='fake-playbook.yaml',
inventory=mock.ANY,
workdir=mock.ANY,
ssh_user='tripleo-admin',
key='/var/lib/mistral/overcloud/ssh_private_key',
module_path='/usr/share/ansible-modules',
limit_hosts='compute-0, compute-1',
tags='',
skip_tags='',
extra_vars={'ansible_become': True}
)
self.check_parser(self.cmd, argslist, verifylist)
@mock.patch('tripleoclient.utils.run_ansible_playbook',
autospec=True)
@ -273,72 +237,3 @@ class TestOvercloudUpgradeRun(fakes.TestOvercloudUpgradeRun):
verifylist = []
self.assertRaises(ParserException, lambda: self.check_parser(
self.cmd, argslist, verifylist))
@mock.patch('tripleoclient.utils.run_ansible_playbook',
autospec=True)
@mock.patch('os.path.expanduser')
@mock.patch('oslo_concurrency.processutils.execute')
@mock.patch('six.moves.builtins.open')
# it is 'validation' not 'validations'
def test_upgrade_skip_tags_validations(self, mock_open, mock_execute,
mock_expanduser, upgrade_ansible):
mock_expanduser.return_value = '/home/fake/'
argslist = ['--limit', 'overcloud-compute-1',
'--skip-tags', 'validations']
verifylist = [
('limit', 'overcloud-compute-1'),
('static_inventory', None),
('playbook', 'all'),
('skip_tags', 'validations'),
]
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
self.assertRaises(exceptions.InvalidConfiguration,
lambda: self.cmd.take_action(parsed_args))
@mock.patch('tripleoclient.utils.run_ansible_playbook',
autospec=True)
@mock.patch('os.path.expanduser')
@mock.patch('oslo_concurrency.processutils.execute')
@mock.patch('six.moves.builtins.open')
# should only support the constants.MAJOR_UPGRADE_SKIP_TAGS
def test_upgrade_skip_tags_unsupported_validation_anything_else(
self, mock_open, mock_execute, mock_expanduser, upgrade_ansible):
mock_expanduser.return_value = '/home/fake/'
argslist = ['--limit', 'overcloud-compute-1',
'--skip-tags', 'validation,anything-else']
verifylist = [
('limit', 'overcloud-compute-1'),
('static_inventory', None),
('playbook', 'all'),
('skip_tags', 'validation,anything-else'),
]
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
self.assertRaises(exceptions.InvalidConfiguration,
lambda: self.cmd.take_action(parsed_args))
@mock.patch('tripleoclient.utils.run_ansible_playbook',
autospec=True)
@mock.patch('os.path.expanduser')
@mock.patch('oslo_concurrency.processutils.execute')
@mock.patch('six.moves.builtins.open')
# should only support the constants.MAJOR_UPGRADE_SKIP_TAGS
def test_upgrade_skip_tags_unsupported_pre_upgrade_anything_else(
self, mock_open, mock_execute, mock_expanduser, upgrade_ansible):
mock_expanduser.return_value = '/home/fake/'
argslist = ['--limit', 'overcloud-compute-1',
'--skip-tags', 'pre-upgrade,anything-else']
verifylist = [
('limit', 'overcloud-compute-1'),
('static_inventory', None),
('playbook', 'all'),
('skip_tags', 'pre-upgrade,anything-else'),
]
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
self.assertRaises(exceptions.InvalidConfiguration,
lambda: self.cmd.take_action(parsed_args))

@ -310,12 +310,23 @@ def run_ansible_playbook(playbook, inventory, workdir, playbook_dir=None,
playbook_dir = workdir
if isinstance(playbook, (list, set)):
playbook = [_playbook_check(play=i) for i in playbook]
verified_playbooks = [_playbook_check(play=i) for i in playbook]
playbook = os.path.join(workdir, 'tripleo-multi-playbook.yaml')
with open(playbook, 'w') as f:
f.write(
yaml.safe_dump(
[{'import_playbook': i} for i in verified_playbooks],
default_flow_style=False
)
)
LOG.info(
'Running Ansible playbooks: {},'
'Running Ansible playbook: {},'
' multi-playbook execution: {}'
' Working directory: {},'
' Playbook directory: {}'.format(
playbook,
verified_playbooks,
workdir,
playbook_dir
)
@ -1536,36 +1547,6 @@ def process_multiple_environments(created_env_files, tht_root,
return env_files, localenv
def run_update_ansible_action(log, clients, stack, nodes, inventory,
playbook, all_playbooks, ssh_user,
action=None, tags='', skip_tags='',
verbosity='0', extra_vars=None,
workdir='', priv_key=''):
playbooks = [playbook]
if playbook == "all":
playbooks = all_playbooks
for book in playbooks:
log.debug("Running ansible playbook %s " % book)
if action:
action.update_ansible(clients, container=stack, nodes=nodes,
inventory_file=inventory,
playbook=book, node_user=ssh_user,
tags=tags, skip_tags=skip_tags,
verbosity=verbosity, extra_vars=extra_vars)
else:
run_ansible_playbook(playbook=book,
inventory=inventory,
workdir=workdir,
ssh_user=ssh_user,
key=priv_key,
module_path='/usr/share/ansible-modules',
limit_hosts=nodes,
tags=tags,
skip_tags=skip_tags,
extra_vars=extra_vars)
def parse_extra_vars(extra_var_strings):
"""Parses extra variables like Ansible would.

@ -22,7 +22,8 @@ from osc_lib import utils
from tripleoclient import command
from tripleoclient import constants
from tripleoclient import utils as oooutils
from tripleoclient.workflows import package_update
from tripleoclient.workflows import deployment
CONF = cfg.CONF
logging.register_options(CONF)
@ -95,32 +96,31 @@ class ExternalUpdateRun(command.Command):
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 - 1
stack = parsed_args.stack
key, ansible_dir = self.get_ansible_key_and_dir(
no_workflow=parsed_args.no_workflow,
stack=stack,
orchestration=orchestration
_, 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=self.app_args.verbose_level - 1,
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
)
# Run ansible:
inventory = oooutils.get_tripleo_ansible_inventory(
parsed_args.static_inventory, parsed_args.ssh_user, stack,
return_inventory_file_path=True)
limit_hosts = 'all'
playbook = 'all'
extra_vars = oooutils.parse_extra_vars(parsed_args.extra_vars)
extra_vars['ansible_become'] = True
oooutils.run_update_ansible_action(
self.log, clients, stack, 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.")

@ -21,7 +21,8 @@ from osc_lib import utils
from tripleoclient import command
from tripleoclient import constants
from tripleoclient import utils as oooutils
from tripleoclient.workflows import package_update
from tripleoclient.workflows import deployment
CONF = cfg.CONF
logging.register_options(CONF)
@ -94,31 +95,28 @@ class ExternalUpgradeRun(command.Command):
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 - 1
stack = parsed_args.stack
key, ansible_dir = self.get_ansible_key_and_dir(
no_workflow=parsed_args.no_workflow,
stack=stack,
orchestration=orchestration
_, 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=self.app_args.verbose_level - 1,
ansible_playbook_name=constants.EXTERNAL_UPGRADE_PLAYBOOKS,
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
)
# Run ansible:
inventory = oooutils.get_tripleo_ansible_inventory(
parsed_args.static_inventory, parsed_args.ssh_user, stack,
return_inventory_file_path=True)
limit_hosts = 'all'
playbook = 'all'
extra_vars = oooutils.parse_extra_vars(parsed_args.extra_vars)
extra_vars['ansible_become'] = True
oooutils.run_update_ansible_action(
self.log, clients, stack, limit_hosts, inventory, playbook,
constants.EXTERNAL_UPGRADE_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 Upgrade Run.")

@ -152,32 +152,29 @@ class FFWDUpgradeRun(command.Command):
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 - 1
clients = self.app.client_manager
orchestration = clients.orchestration
stack = parsed_args.stack
key, ansible_dir = self.get_ansible_key_and_dir(
no_workflow=parsed_args.no_workflow,
stack=stack,
orchestration=orchestration
_, ansible_dir = self.get_ansible_key_and_dir(
no_workflow=True,
stack=parsed_args.stack,
orchestration=self.app.client_manager.orchestration
)
# Run ansible:
inventory = oooutils.get_tripleo_ansible_inventory(
inventory_file=parsed_args.static_inventory,
ssh_user=parsed_args.ssh_user, stack=parsed_args.stack,
return_inventory_file_path=True)
# Don't expost limit_hosts. We need this on the whole overcloud.
limit_hosts = ''
extra_vars = {'ansible_become': True}
oooutils.run_update_ansible_action(
self.log, clients, parsed_args.stack, 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,
extra_vars=extra_vars)
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=self.app_args.verbose_level - 1,
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.")
class FFWDUpgradeConverge(DeployOvercloud):

@ -22,8 +22,10 @@ from tripleoclient import command
from tripleoclient import constants
from tripleoclient import utils as oooutils
from tripleoclient.v1.overcloud_deploy import DeployOvercloud
from tripleoclient.workflows import deployment
from tripleoclient.workflows import package_update
CONF = cfg.CONF
logging.register_options(CONF)
logging.setup(CONF, '')
@ -92,20 +94,16 @@ class UpdateRun(command.Command):
" compute-1, compute-5\".")
)
parser.add_argument('--playbook',
action="store",
default="all",
help=_("Ansible playbook to use for the minor "
"update. Defaults to the special value "
"\'all\' which causes all the update "
"playbooks to be executed. That is the "
"update_steps_playbook.yaml and then the"
"deploy_steps_playbook.yaml. "
"Set this to each of those playbooks in "
"consecutive invocations of this command "
"if you prefer to run them manually. Note: "
"make sure to run both those playbooks so "
"that all services are updated and running "
"with the target version configuration.")
nargs="*",
default=None,
help=_("Ansible playbook to use for the minor"
" update. Can be used multiple times."
" Set this to each of those playbooks in"
" consecutive invocations of this command"
" if you prefer to run them manually."
" Note: make sure to run all playbooks so"
" that all services are updated and running"
" with the target version configuration.")
)
parser.add_argument("--ssh-user",
dest="ssh_user",
@ -139,35 +137,40 @@ class UpdateRun(command.Command):
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 - 1
stack = parsed_args.stack
key, ansible_dir = self.get_ansible_key_and_dir(
no_workflow=parsed_args.no_workflow,
stack=stack,
orchestration=orchestration
# 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.MINOR_UPDATE_PLAYBOOKS
else:
playbook = parsed_args.playbook
_, ansible_dir = self.get_ansible_key_and_dir(
no_workflow=True,
stack=parsed_args.stack,
orchestration=self.app.client_manager.orchestration
)
# 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,
return_inventory_file_path=True)
extra_vars = {'ansible_become': True}
oooutils.run_update_ansible_action(self.log, clients, stack,
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,
extra_vars=extra_vars)
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=self.app_args.verbose_level - 1,
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
),
limit_list=[
i.strip() for i in parsed_args.limit.split(',') if i
]
)
self.log.info("Completed Overcloud Minor Update Run.")
class UpdateConverge(DeployOvercloud):

@ -117,22 +117,16 @@ class UpgradeRun(command.Command):
" compute-1, compute-5\".")
)
parser.add_argument('--playbook',
action="store",
default="all",
help=_("Ansible playbook to use for the major "
"upgrade. Defaults to the special value "
"\'all\' which causes all the upgrade "
"playbooks to run. That is the "
"upgrade_steps_playbook.yaml "
"then deploy_steps_playbook.yaml and then "
"post_upgrade_steps_playbook.yaml. Set "
"this to each of those playbooks in "
"consecutive invocations of this command "
"if you prefer to run them manually. Note: "
"you will have to run all of those "
"playbooks so that all services are "
"upgraded and running with the target "
"version configuration.")
nargs="*",
default=None,
help=_("Ansible playbook to use for the minor"
" update. Can be used multiple times."
" Set this to each of those playbooks in"
" consecutive invocations of this command"
" if you prefer to run them manually."
" Note: make sure to run all playbooks so"
" that all services are updated and running"
" with the target version configuration.")
)
parser.add_argument('--static-inventory',
dest='static_inventory',
@ -197,43 +191,42 @@ class UpgradeRun(command.Command):
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 - 1
orchestration = clients.orchestration
stack = parsed_args.stack
key, ansible_dir = self.get_ansible_key_and_dir(
# 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=stack,
orchestration=orchestration
stack=parsed_args.stack,
orchestration=self.app.client_manager.orchestration
)
# 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,
return_inventory_file_path=True)
skip_tags = self._validate_skip_tags(parsed_args.skip_tags)
extra_vars = {'ansible_become': True}
oooutils.run_update_ansible_action(self.log, clients, stack,
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,
extra_vars=extra_vars)
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))
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=self.app_args.verbose_level - 1,
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.")
class UpgradeConvergeOvercloud(DeployOvercloud):

@ -17,6 +17,8 @@ import os
import pprint
import time
import six
from heatclient.common import event_utils
from openstackclient import shell
from tripleo_common.actions import ansible
@ -258,7 +260,8 @@ def config_download(log, clients, stack, ssh_network=None,
timeout=None, verbosity=0, deployment_options=None,
in_flight_validations=False,
ansible_playbook_name='deploy_steps_playbook.yaml',
limit_list=None):
limit_list=None, extra_vars=None, inventory_path=None,
ssh_user='tripleo-admin', tags=None, skip_tags=None):
"""Run config download.
:param log: Logging object
@ -273,6 +276,9 @@ def config_download(log, clients, stack, ssh_network=None,
:param ssh_network: Network named used to access the overcloud.
:type ssh_network: String
:param output_dir: Path to the output directory.
:type output_dir: String
:param override_ansible_cfg: Ansible configuration file location.
:type override_ansible_cfg: String
@ -294,6 +300,23 @@ def config_download(log, clients, stack, ssh_network=None,
:param limit_list: List of hosts to limit the current playbook to.
:type limit_list: List
:param extra_vars: Set additional variables as a Dict or the absolute
path of a JSON or YAML file type.
:type extra_vars: Either a Dict or the absolute path of JSON or YAML
:param inventory_path: Inventory file or path, if None is provided this
function will perform a lookup
:type inventory_path: String
:param ssh_user: SSH user, defaults to tripleo-admin.
:type ssh_user: String
:param tags: Ansible inclusion tags.
:type tags: String
:param skip_tags: Ansible exclusion tags.
:type skip_tags: String
"""
def _log_and_print(message, logger, level='info', print_msg=True):
@ -325,9 +348,10 @@ def config_download(log, clients, stack, ssh_network=None,
deployment_options = dict()
if not in_flight_validations:
skip_tags = 'opendev-validation'
else:
skip_tags = None
if skip_tags:
skip_tags = 'opendev-validation,{}'.format(skip_tags)
else:
skip_tags = 'opendev-validation'
if not timeout:
timeout = 30
@ -338,6 +362,8 @@ def config_download(log, clients, stack, ssh_network=None,
# entries are consistent.
if not limit_list:
limit_list = list()
elif isinstance(limit_list, six.string_types):
limit_list = [i.strip() for i in limit_list.split(',')]
with utils.TempDirs() as tmp:
utils.run_ansible_playbook(
@ -403,7 +429,7 @@ def config_download(log, clients, stack, ssh_network=None,
print_msg=(verbosity == 0)
)
inventory_kwargs = {
'ansible_ssh_user': 'tripleo-admin',
'ansible_ssh_user': ssh_user,
'work_dir': work_dir,
'plan_name': stack.stack_name,
'undercloud_key_file': key_file
@ -413,8 +439,9 @@ def config_download(log, clients, stack, ssh_network=None,
python_interpreter = deployment_options.get('ansible_python_interpreter')
if python_interpreter:
inventory_kwargs['ansible_python_interpreter'] = python_interpreter
inventory = ansible.AnsibleGenerateInventoryAction(**inventory_kwargs)
inventory_path = inventory.run(context=context)
if not inventory_path:
inventory = ansible.AnsibleGenerateInventoryAction(**inventory_kwargs)
inventory_path = inventory.run(context=context)
_log_and_print(
message='Executing deployment playbook for stack: {}'.format(
stack.stack_name
@ -426,27 +453,36 @@ def config_download(log, clients, stack, ssh_network=None,
# NOTE(cloudnull): Join the limit_list into an ansible compatible string.
# If it is an empty, the object will be reset to None.
limit_hosts = ':'.join(limit_list)
if not limit_hosts:
limit_hosts = None
else:
limit_hosts = '{}'.format(limit_hosts)
if isinstance(ansible_playbook_name, list):
playbooks = [os.path.join(stack_work_dir, p)
for p in ansible_playbook_name]
else:
playbooks = os.path.join(stack_work_dir, ansible_playbook_name)
with utils.TempDirs() as tmp:
utils.run_ansible_playbook(
playbook=os.path.join(
stack_work_dir,
ansible_playbook_name
),
playbook=playbooks,
inventory=inventory_path,
workdir=tmp,
playbook_dir=work_dir,
skip_tags=skip_tags,
ansible_cfg=override_ansible_cfg,
verbosity=verbosity,
ssh_user='tripleo-admin',
ssh_user=ssh_user,
key=key_file,
limit_hosts=limit_hosts,
ansible_timeout=timeout,
reproduce_command=True,
extra_env_variables={
'ANSIBLE_BECOME': True,
}
},
extra_vars=extra_vars,
tags=tags
)
_log_and_print(

@ -64,26 +64,6 @@ def update(clients, **workflow_input):
raise exceptions.DeploymentError("Heat Stack update failed.")
def update_ansible(clients, **workflow_input):
workflow_client = clients.workflow_engine
tripleoclients = clients.tripleoclient
with tripleoclients.messaging_websocket() as ws:
execution = base.start_workflow(
workflow_client,
'tripleo.package_update.v1.update_nodes',
workflow_input=workflow_input
)
for payload in base.wait_for_messages(workflow_client, ws, execution):
print(payload['message'])
if payload['status'] == 'SUCCESS':
print("Success")
else:
raise RuntimeError('Update failed with: {}'.format(payload['message']))
def run_on_nodes(clients, **workflow_input):
workflow_client = clients.workflow_engine
tripleoclients = clients.tripleoclient

Loading…
Cancel
Save