Expose --limit, --skip-tags, and --tags on the CLI.
This change will provide the operator the ability to better control
a given deployment or operational task while leveraging the
tripleoclient.
A utility has been added to sanitize user input. This will ensure
the parsed string is in valid ansible limit format.
Change-Id: I190f6efe8d728f124c18ce80be715ae7c5c0da01
Depends-On: I2a8bcd6f8e365058d667fccb3d47625ab307b9e4
Depends-On: I0056fdbe3d9807e6baf4a1645a632ab9eb1b2668
Signed-off-by: Luke Short <ekultails@gmail.com>
Co-Authored-By: Kevin Carter <kecarter@redhat.com>
(cherry picked from commit 67c49244be
)
This commit is contained in:
parent
b95119250c
commit
7fc95cac7f
|
@ -1517,7 +1517,8 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
|
||||||
'heat-admin', None, 'ctlplane', None, None,
|
'heat-admin', None, 'ctlplane', None, None,
|
||||||
deployment_options={},
|
deployment_options={},
|
||||||
deployment_timeout=26880, # 451 - 3 = 448m time left
|
deployment_timeout=26880, # 451 - 3 = 448m time left
|
||||||
in_flight_validations=False, timeout=42, verbosity=1)],
|
in_flight_validations=False, limit_hosts=None,
|
||||||
|
skip_tags=None, tags=None, timeout=42, verbosity=1)],
|
||||||
fixture.mock_config_download.mock_calls)
|
fixture.mock_config_download.mock_calls)
|
||||||
fixture.mock_config_download.assert_called()
|
fixture.mock_config_download.assert_called()
|
||||||
mock_copy.assert_called_once()
|
mock_copy.assert_called_once()
|
||||||
|
@ -1571,7 +1572,8 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
|
||||||
'heat-admin', None, 'ctlplane', None, None,
|
'heat-admin', None, 'ctlplane', None, None,
|
||||||
deployment_options={},
|
deployment_options={},
|
||||||
deployment_timeout=14400, # 240 * 60
|
deployment_timeout=14400, # 240 * 60
|
||||||
in_flight_validations=False, timeout=42, verbosity=1)],
|
in_flight_validations=False, limit_hosts=None,
|
||||||
|
skip_tags=None, tags=None, timeout=42, verbosity=1)],
|
||||||
fixture.mock_config_download.mock_calls)
|
fixture.mock_config_download.mock_calls)
|
||||||
|
|
||||||
mock_copy.assert_called_once()
|
mock_copy.assert_called_once()
|
||||||
|
|
|
@ -56,7 +56,7 @@ class TestOvercloudExternalUpdateRun(fakes.TestOvercloudExternalUpdateRun):
|
||||||
update_ansible.assert_called_once_with(
|
update_ansible.assert_called_once_with(
|
||||||
self.app.client_manager,
|
self.app.client_manager,
|
||||||
container='overcloud',
|
container='overcloud',
|
||||||
nodes='all',
|
nodes=None,
|
||||||
inventory_file=mock_open().__enter__().read(),
|
inventory_file=mock_open().__enter__().read(),
|
||||||
playbook='external_update_steps_playbook.yaml',
|
playbook='external_update_steps_playbook.yaml',
|
||||||
node_user='tripleo-admin',
|
node_user='tripleo-admin',
|
||||||
|
@ -89,7 +89,7 @@ class TestOvercloudExternalUpdateRun(fakes.TestOvercloudExternalUpdateRun):
|
||||||
update_ansible.assert_called_once_with(
|
update_ansible.assert_called_once_with(
|
||||||
self.app.client_manager,
|
self.app.client_manager,
|
||||||
container='overcloud',
|
container='overcloud',
|
||||||
nodes='all',
|
nodes=None,
|
||||||
inventory_file=mock_open().__enter__().read(),
|
inventory_file=mock_open().__enter__().read(),
|
||||||
playbook='external_update_steps_playbook.yaml',
|
playbook='external_update_steps_playbook.yaml',
|
||||||
node_user='tripleo-admin',
|
node_user='tripleo-admin',
|
||||||
|
|
|
@ -56,7 +56,7 @@ class TestOvercloudExternalUpgradeRun(fakes.TestOvercloudExternalUpgradeRun):
|
||||||
update_ansible.assert_called_once_with(
|
update_ansible.assert_called_once_with(
|
||||||
self.app.client_manager,
|
self.app.client_manager,
|
||||||
container='overcloud',
|
container='overcloud',
|
||||||
nodes='all',
|
nodes=None,
|
||||||
inventory_file=mock_open().__enter__().read(),
|
inventory_file=mock_open().__enter__().read(),
|
||||||
playbook='external_upgrade_steps_playbook.yaml',
|
playbook='external_upgrade_steps_playbook.yaml',
|
||||||
node_user='tripleo-admin',
|
node_user='tripleo-admin',
|
||||||
|
@ -89,7 +89,7 @@ class TestOvercloudExternalUpgradeRun(fakes.TestOvercloudExternalUpgradeRun):
|
||||||
update_ansible.assert_called_once_with(
|
update_ansible.assert_called_once_with(
|
||||||
self.app.client_manager,
|
self.app.client_manager,
|
||||||
container='overcloud',
|
container='overcloud',
|
||||||
nodes='all',
|
nodes=None,
|
||||||
inventory_file=mock_open().__enter__().read(),
|
inventory_file=mock_open().__enter__().read(),
|
||||||
playbook='external_upgrade_steps_playbook.yaml',
|
playbook='external_upgrade_steps_playbook.yaml',
|
||||||
node_user='tripleo-admin',
|
node_user='tripleo-admin',
|
||||||
|
|
|
@ -166,11 +166,11 @@ class TestFFWDUpgradeRun(fakes.TestFFWDUpgradeRun):
|
||||||
self.app.client_manager,
|
self.app.client_manager,
|
||||||
container='overcloud',
|
container='overcloud',
|
||||||
inventory_file=mock_open().__enter__().read(),
|
inventory_file=mock_open().__enter__().read(),
|
||||||
nodes='',
|
nodes=None,
|
||||||
playbook=constants.FFWD_UPGRADE_PLAYBOOK,
|
playbook=constants.FFWD_UPGRADE_PLAYBOOK,
|
||||||
node_user='heat-admin',
|
node_user='heat-admin',
|
||||||
tags='',
|
tags=None,
|
||||||
skip_tags='',
|
skip_tags=None,
|
||||||
verbosity=1,
|
verbosity=1,
|
||||||
extra_vars=None
|
extra_vars=None
|
||||||
)
|
)
|
||||||
|
@ -194,11 +194,11 @@ class TestFFWDUpgradeRun(fakes.TestFFWDUpgradeRun):
|
||||||
self.app.client_manager,
|
self.app.client_manager,
|
||||||
container='overcloud',
|
container='overcloud',
|
||||||
inventory_file=mock_open().__enter__().read(),
|
inventory_file=mock_open().__enter__().read(),
|
||||||
nodes='',
|
nodes=None,
|
||||||
playbook=constants.FFWD_UPGRADE_PLAYBOOK,
|
playbook=constants.FFWD_UPGRADE_PLAYBOOK,
|
||||||
node_user='my-user',
|
node_user='my-user',
|
||||||
tags='',
|
tags=None,
|
||||||
skip_tags='',
|
skip_tags=None,
|
||||||
verbosity=1,
|
verbosity=1,
|
||||||
extra_vars=None
|
extra_vars=None
|
||||||
)
|
)
|
||||||
|
@ -211,11 +211,24 @@ class TestFFWDUpgradeRun(fakes.TestFFWDUpgradeRun):
|
||||||
def test_upgrade_no_nodes_or_roles(self, mock_open, mock_execute,
|
def test_upgrade_no_nodes_or_roles(self, mock_open, mock_execute,
|
||||||
mock_expanduser, upgrade_ansible):
|
mock_expanduser, upgrade_ansible):
|
||||||
mock_expanduser.return_value = '/home/fake/'
|
mock_expanduser.return_value = '/home/fake/'
|
||||||
argslist = ["--nodes", "controller-1", "--roles", "foo", "--yes"]
|
argslist = ["--limit", "controller-1", "--roles", "foo", "--yes"]
|
||||||
verifylist = []
|
verifylist = []
|
||||||
self.assertRaises(ParserException, lambda: self.check_parser(
|
self.assertRaises(ParserException, lambda: self.check_parser(
|
||||||
self.cmd, argslist, verifylist))
|
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')
|
||||||
|
def test_upgrade_limit(self, mock_open, mock_execute,
|
||||||
|
mock_expanduser, upgrade_ansible):
|
||||||
|
mock_expanduser.return_value = '/home/fake/'
|
||||||
|
argslist = ['--limit', 'controller1,controller2,controll3']
|
||||||
|
verifylist = [('limit', 'controller1,controller2,controll3')]
|
||||||
|
self.assertRaises(ParserException, lambda: self.check_parser(
|
||||||
|
self.cmd, argslist, verifylist))
|
||||||
|
|
||||||
|
|
||||||
class TestFFWDUpgradeConverge(fakes.TestFFWDUpgradeConverge):
|
class TestFFWDUpgradeConverge(fakes.TestFFWDUpgradeConverge):
|
||||||
|
|
||||||
|
|
|
@ -153,8 +153,8 @@ class TestOvercloudUpdateRun(fakes.TestOvercloudUpdateRun):
|
||||||
inventory_file=mock_open().__enter__().read(),
|
inventory_file=mock_open().__enter__().read(),
|
||||||
playbook='fake-playbook.yaml',
|
playbook='fake-playbook.yaml',
|
||||||
node_user='tripleo-admin',
|
node_user='tripleo-admin',
|
||||||
tags='',
|
tags=None,
|
||||||
skip_tags='',
|
skip_tags=None,
|
||||||
verbosity=1,
|
verbosity=1,
|
||||||
extra_vars=None
|
extra_vars=None
|
||||||
)
|
)
|
||||||
|
@ -186,8 +186,8 @@ class TestOvercloudUpdateRun(fakes.TestOvercloudUpdateRun):
|
||||||
inventory_file=mock_open().__enter__().read(),
|
inventory_file=mock_open().__enter__().read(),
|
||||||
playbook=book,
|
playbook=book,
|
||||||
node_user='tripleo-admin',
|
node_user='tripleo-admin',
|
||||||
tags='',
|
tags=None,
|
||||||
skip_tags='',
|
skip_tags=None,
|
||||||
verbosity=1,
|
verbosity=1,
|
||||||
extra_vars=None
|
extra_vars=None
|
||||||
)
|
)
|
||||||
|
|
|
@ -189,7 +189,7 @@ class TestOvercloudUpgradeRun(fakes.TestOvercloudUpgradeRun):
|
||||||
upgrade_ansible.assert_called_once_with(
|
upgrade_ansible.assert_called_once_with(
|
||||||
self.app.client_manager,
|
self.app.client_manager,
|
||||||
container='overcloud',
|
container='overcloud',
|
||||||
nodes='Compute, Controller',
|
nodes='Compute:Controller',
|
||||||
inventory_file=mock_open().__enter__().read(),
|
inventory_file=mock_open().__enter__().read(),
|
||||||
playbook='fake-playbook.yaml',
|
playbook='fake-playbook.yaml',
|
||||||
node_user='tripleo-admin',
|
node_user='tripleo-admin',
|
||||||
|
@ -277,10 +277,10 @@ class TestOvercloudUpgradeRun(fakes.TestOvercloudUpgradeRun):
|
||||||
def test_upgrade_nodes_with_playbook_no_skip_tags(
|
def test_upgrade_nodes_with_playbook_no_skip_tags(
|
||||||
self, mock_open, mock_execute, mock_expanduser, upgrade_ansible):
|
self, mock_open, mock_execute, mock_expanduser, upgrade_ansible):
|
||||||
mock_expanduser.return_value = '/home/fake/'
|
mock_expanduser.return_value = '/home/fake/'
|
||||||
argslist = ['--limit', 'compute-0, compute-1',
|
argslist = ['--limit', 'compute-0,compute-1',
|
||||||
'--playbook', 'fake-playbook.yaml', ]
|
'--playbook', 'fake-playbook.yaml', ]
|
||||||
verifylist = [
|
verifylist = [
|
||||||
('limit', 'compute-0, compute-1'),
|
('limit', 'compute-0,compute-1'),
|
||||||
('static_inventory', None),
|
('static_inventory', None),
|
||||||
('playbook', 'fake-playbook.yaml'),
|
('playbook', 'fake-playbook.yaml'),
|
||||||
]
|
]
|
||||||
|
@ -292,7 +292,7 @@ class TestOvercloudUpgradeRun(fakes.TestOvercloudUpgradeRun):
|
||||||
upgrade_ansible.assert_called_once_with(
|
upgrade_ansible.assert_called_once_with(
|
||||||
self.app.client_manager,
|
self.app.client_manager,
|
||||||
container='overcloud',
|
container='overcloud',
|
||||||
nodes='compute-0, compute-1',
|
nodes='compute-0:compute-1',
|
||||||
inventory_file=mock_open().__enter__().read(),
|
inventory_file=mock_open().__enter__().read(),
|
||||||
playbook='fake-playbook.yaml',
|
playbook='fake-playbook.yaml',
|
||||||
node_user='tripleo-admin',
|
node_user='tripleo-admin',
|
||||||
|
|
|
@ -35,6 +35,7 @@ import json
|
||||||
import netaddr
|
import netaddr
|
||||||
import os
|
import os
|
||||||
import os.path
|
import os.path
|
||||||
|
import re
|
||||||
import simplejson
|
import simplejson
|
||||||
import six
|
import six
|
||||||
import socket
|
import socket
|
||||||
|
@ -77,8 +78,8 @@ def run_ansible_playbook(logger,
|
||||||
key=None,
|
key=None,
|
||||||
module_path=None,
|
module_path=None,
|
||||||
limit_hosts=None,
|
limit_hosts=None,
|
||||||
tags=None,
|
|
||||||
skip_tags=None,
|
skip_tags=None,
|
||||||
|
tags=None,
|
||||||
verbosity=1,
|
verbosity=1,
|
||||||
extra_vars=None,
|
extra_vars=None,
|
||||||
plan='overcloud',
|
plan='overcloud',
|
||||||
|
@ -1212,7 +1213,7 @@ def process_multiple_environments(created_env_files, tht_root,
|
||||||
|
|
||||||
def run_update_ansible_action(log, clients, stack, nodes, inventory,
|
def run_update_ansible_action(log, clients, stack, nodes, inventory,
|
||||||
playbook, all_playbooks, ssh_user,
|
playbook, all_playbooks, ssh_user,
|
||||||
action=None, tags='', skip_tags='',
|
action=None, skip_tags=None, tags=None,
|
||||||
verbosity='1', extra_vars=None,
|
verbosity='1', extra_vars=None,
|
||||||
workdir='', priv_key=''):
|
workdir='', priv_key=''):
|
||||||
|
|
||||||
|
@ -1225,7 +1226,7 @@ def run_update_ansible_action(log, clients, stack, nodes, inventory,
|
||||||
action.update_ansible(clients, container=stack, nodes=nodes,
|
action.update_ansible(clients, container=stack, nodes=nodes,
|
||||||
inventory_file=inventory,
|
inventory_file=inventory,
|
||||||
playbook=book, node_user=ssh_user,
|
playbook=book, node_user=ssh_user,
|
||||||
tags=tags, skip_tags=skip_tags,
|
skip_tags=skip_tags, tags=tags,
|
||||||
verbosity=verbosity, extra_vars=extra_vars)
|
verbosity=verbosity, extra_vars=extra_vars)
|
||||||
else:
|
else:
|
||||||
run_ansible_playbook(logger=LOG,
|
run_ansible_playbook(logger=LOG,
|
||||||
|
@ -1235,8 +1236,9 @@ def run_update_ansible_action(log, clients, stack, nodes, inventory,
|
||||||
ssh_user=ssh_user,
|
ssh_user=ssh_user,
|
||||||
key=ssh_private_key(workdir, priv_key),
|
key=ssh_private_key(workdir, priv_key),
|
||||||
module_path='/usr/share/ansible-modules',
|
module_path='/usr/share/ansible-modules',
|
||||||
limit_hosts=nodes, tags=tags,
|
limit_hosts=nodes,
|
||||||
skip_tags=skip_tags)
|
skip_tags=skip_tags,
|
||||||
|
tags=tags)
|
||||||
|
|
||||||
|
|
||||||
def ssh_private_key(workdir, key):
|
def ssh_private_key(workdir, key):
|
||||||
|
@ -2102,3 +2104,20 @@ def copy_clouds_yaml(user):
|
||||||
' with sudo') % {'user': user, 'dir': clouds_config_dir}
|
' with sudo') % {'user': user, 'dir': clouds_config_dir}
|
||||||
LOG.error(msg)
|
LOG.error(msg)
|
||||||
raise exceptions.DeploymentError(msg)
|
raise exceptions.DeploymentError(msg)
|
||||||
|
|
||||||
|
|
||||||
|
def playbook_limit_parse(limit_nodes):
|
||||||
|
"""Return a parsed string for limits.
|
||||||
|
|
||||||
|
This will sanitize user inputs so that we guarantee what is provided is
|
||||||
|
expected to be functional. If limit_nodes is None, this function will
|
||||||
|
return None.
|
||||||
|
|
||||||
|
|
||||||
|
:returns: String
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not limit_nodes:
|
||||||
|
return limit_nodes
|
||||||
|
|
||||||
|
return ':'.join([i.strip() for i in re.split(',| |:', limit_nodes) if i])
|
||||||
|
|
|
@ -903,6 +903,29 @@ class DeployOvercloud(command.Command):
|
||||||
metavar='<baremetal_deployment.yaml>',
|
metavar='<baremetal_deployment.yaml>',
|
||||||
help=_('Configuration file describing the '
|
help=_('Configuration file describing the '
|
||||||
'baremetal deployment'))
|
'baremetal deployment'))
|
||||||
|
parser.add_argument(
|
||||||
|
'--limit',
|
||||||
|
action='store',
|
||||||
|
default=None,
|
||||||
|
help=_("A string that identifies a single node or comma-separated"
|
||||||
|
"list of nodes the config-download Ansible playbook "
|
||||||
|
"execution will be limited to. For example: --limit"
|
||||||
|
" \"compute-0,compute-1,compute-5\".")
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--tags',
|
||||||
|
action='store',
|
||||||
|
default=None,
|
||||||
|
help=_('A list of tags to use when running the config-download'
|
||||||
|
' ansible-playbook command.')
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--skip-tags',
|
||||||
|
action='store',
|
||||||
|
default=None,
|
||||||
|
help=_('A list of tags to skip when running the'
|
||||||
|
' config-download ansible-playbook command.')
|
||||||
|
)
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
|
@ -997,7 +1020,12 @@ class DeployOvercloud(command.Command):
|
||||||
verbosity=self.app_args.verbose_level,
|
verbosity=self.app_args.verbose_level,
|
||||||
deployment_options=deployment_options,
|
deployment_options=deployment_options,
|
||||||
in_flight_validations=parsed_args.inflight,
|
in_flight_validations=parsed_args.inflight,
|
||||||
deployment_timeout=timeout
|
deployment_timeout=timeout,
|
||||||
|
tags=parsed_args.tags,
|
||||||
|
skip_tags=parsed_args.skip_tags,
|
||||||
|
limit_hosts=utils.playbook_limit_parse(
|
||||||
|
limit_nodes=parsed_args.limit
|
||||||
|
)
|
||||||
)
|
)
|
||||||
except Exception:
|
except Exception:
|
||||||
deployment.set_deployment_status(
|
deployment.set_deployment_status(
|
||||||
|
|
|
@ -91,6 +91,15 @@ class ExternalUpdateRun(command.Command):
|
||||||
'system command instead of running Ansible'
|
'system command instead of running Ansible'
|
||||||
'via the TripleO mistral workflows.')
|
'via the TripleO mistral workflows.')
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--limit',
|
||||||
|
action='store',
|
||||||
|
default=None,
|
||||||
|
help=_("A string that identifies a single node or comma-separated"
|
||||||
|
"list of nodes the config-download Ansible playbook "
|
||||||
|
"execution will be limited to. For example: --limit"
|
||||||
|
" \"compute-0,compute-1,compute-5\".")
|
||||||
|
)
|
||||||
|
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
|
@ -112,7 +121,8 @@ class ExternalUpdateRun(command.Command):
|
||||||
# Run ansible:
|
# Run ansible:
|
||||||
inventory = oooutils.get_tripleo_ansible_inventory(
|
inventory = oooutils.get_tripleo_ansible_inventory(
|
||||||
parsed_args.static_inventory, parsed_args.ssh_user, stack)
|
parsed_args.static_inventory, parsed_args.ssh_user, stack)
|
||||||
limit_hosts = 'all'
|
limit_hosts = oooutils.playbook_limit_parse(
|
||||||
|
limit_nodes=parsed_args.limit)
|
||||||
playbook = 'all'
|
playbook = 'all'
|
||||||
extra_vars = oooutils.parse_extra_vars(parsed_args.extra_vars)
|
extra_vars = oooutils.parse_extra_vars(parsed_args.extra_vars)
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,15 @@ class ExternalUpgradeRun(command.Command):
|
||||||
'system command instead of running Ansible'
|
'system command instead of running Ansible'
|
||||||
'via the TripleO mistral workflows.')
|
'via the TripleO mistral workflows.')
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--limit',
|
||||||
|
action='store',
|
||||||
|
default=None,
|
||||||
|
help=_("A string that identifies a single node or comma-separated"
|
||||||
|
"list of nodes the config-download Ansible playbook "
|
||||||
|
"execution will be limited to. For example: --limit"
|
||||||
|
" \"compute-0,compute-1,compute-5\".")
|
||||||
|
)
|
||||||
|
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
|
@ -112,7 +121,8 @@ class ExternalUpgradeRun(command.Command):
|
||||||
# Run ansible:
|
# Run ansible:
|
||||||
inventory = oooutils.get_tripleo_ansible_inventory(
|
inventory = oooutils.get_tripleo_ansible_inventory(
|
||||||
parsed_args.static_inventory, parsed_args.ssh_user, stack)
|
parsed_args.static_inventory, parsed_args.ssh_user, stack)
|
||||||
limit_hosts = 'all'
|
limit_hosts = oooutils.playbook_limit_parse(
|
||||||
|
limit_nodes=parsed_args.limit)
|
||||||
playbook = 'all'
|
playbook = 'all'
|
||||||
extra_vars = oooutils.parse_extra_vars(parsed_args.extra_vars)
|
extra_vars = oooutils.parse_extra_vars(parsed_args.extra_vars)
|
||||||
|
|
||||||
|
|
|
@ -171,7 +171,7 @@ class FFWDUpgradeRun(command.Command):
|
||||||
inventory_file=parsed_args.static_inventory,
|
inventory_file=parsed_args.static_inventory,
|
||||||
ssh_user=parsed_args.ssh_user, stack=parsed_args.stack)
|
ssh_user=parsed_args.ssh_user, stack=parsed_args.stack)
|
||||||
# Don't expost limit_hosts. We need this on the whole overcloud.
|
# Don't expost limit_hosts. We need this on the whole overcloud.
|
||||||
limit_hosts = ''
|
limit_hosts = None
|
||||||
oooutils.run_update_ansible_action(
|
oooutils.run_update_ansible_action(
|
||||||
self.log, clients, parsed_args.stack, limit_hosts, inventory,
|
self.log, clients, parsed_args.stack, limit_hosts, inventory,
|
||||||
constants.FFWD_UPGRADE_PLAYBOOK, [], parsed_args.ssh_user,
|
constants.FFWD_UPGRADE_PLAYBOOK, [], parsed_args.ssh_user,
|
||||||
|
|
|
@ -85,11 +85,13 @@ class UpdateRun(command.Command):
|
||||||
def get_parser(self, prog_name):
|
def get_parser(self, prog_name):
|
||||||
parser = super(UpdateRun, self).get_parser(prog_name)
|
parser = super(UpdateRun, self).get_parser(prog_name)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--limit', action='store', required=True, help=_(
|
'--limit',
|
||||||
"A string that identifies a single node or comma-separated"
|
action='store',
|
||||||
" list of nodes to be upgraded in parallel in this upgrade"
|
required=True,
|
||||||
" run invocation. For example: --limit \"compute-0,"
|
help=_("A string that identifies a single node or comma-separated"
|
||||||
" compute-1, compute-5\".")
|
"list of nodes the config-download Ansible playbook "
|
||||||
|
"execution will be limited to. For example: --limit"
|
||||||
|
" \"compute-0,compute-1,compute-5\".")
|
||||||
)
|
)
|
||||||
parser.add_argument('--playbook',
|
parser.add_argument('--playbook',
|
||||||
action="store",
|
action="store",
|
||||||
|
@ -136,7 +138,20 @@ class UpdateRun(command.Command):
|
||||||
'system command instead of running Ansible'
|
'system command instead of running Ansible'
|
||||||
'via the TripleO mistral workflows.')
|
'via the TripleO mistral workflows.')
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--tags',
|
||||||
|
action='store',
|
||||||
|
default=None,
|
||||||
|
help=_('A list of tags to use when running the config-download'
|
||||||
|
' ansible-playbook command.')
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--skip-tags',
|
||||||
|
action='store',
|
||||||
|
default=None,
|
||||||
|
help=_('A list of tags to skip when running the'
|
||||||
|
' config-download ansible-playbook command.')
|
||||||
|
)
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
|
@ -155,17 +170,23 @@ class UpdateRun(command.Command):
|
||||||
key = package_update.get_key(clients)
|
key = package_update.get_key(clients)
|
||||||
|
|
||||||
# Run ansible:
|
# Run ansible:
|
||||||
limit_hosts = parsed_args.limit
|
|
||||||
|
|
||||||
playbook = parsed_args.playbook
|
playbook = parsed_args.playbook
|
||||||
inventory = oooutils.get_tripleo_ansible_inventory(
|
inventory = oooutils.get_tripleo_ansible_inventory(
|
||||||
parsed_args.static_inventory, parsed_args.ssh_user, stack)
|
parsed_args.static_inventory, parsed_args.ssh_user, stack)
|
||||||
oooutils.run_update_ansible_action(self.log, clients, stack,
|
limit_hosts = oooutils.playbook_limit_parse(
|
||||||
limit_hosts, inventory, playbook,
|
limit_nodes=parsed_args.limit)
|
||||||
|
oooutils.run_update_ansible_action(
|
||||||
|
self.log,
|
||||||
|
clients,
|
||||||
|
stack,
|
||||||
|
limit_hosts,
|
||||||
|
inventory,
|
||||||
|
playbook,
|
||||||
constants.MINOR_UPDATE_PLAYBOOKS,
|
constants.MINOR_UPDATE_PLAYBOOKS,
|
||||||
parsed_args.ssh_user,
|
parsed_args.ssh_user,
|
||||||
(None if parsed_args.no_workflow
|
(None if parsed_args.no_workflow else package_update),
|
||||||
else package_update),
|
skip_tags=parsed_args.skip_tags,
|
||||||
|
tags=parsed_args.tags,
|
||||||
verbosity=verbosity,
|
verbosity=verbosity,
|
||||||
workdir=ansible_dir,
|
workdir=ansible_dir,
|
||||||
priv_key=key)
|
priv_key=key)
|
||||||
|
|
|
@ -108,11 +108,13 @@ class UpgradeRun(command.Command):
|
||||||
def get_parser(self, prog_name):
|
def get_parser(self, prog_name):
|
||||||
parser = super(UpgradeRun, self).get_parser(prog_name)
|
parser = super(UpgradeRun, self).get_parser(prog_name)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--limit', action='store', required=True, help=_(
|
'--limit',
|
||||||
"A string that identifies a single node or comma-separated"
|
action='store',
|
||||||
"list of nodes to be upgraded in parallel in this upgrade"
|
required=True,
|
||||||
" run invocation. For example: --limit \"compute-0,"
|
help=_("A string that identifies a single node or comma-separated"
|
||||||
" compute-1, compute-5\".")
|
"list of nodes the config-download Ansible playbook "
|
||||||
|
"execution will be limited to. For example: --limit"
|
||||||
|
" \"compute-0,compute-1,compute-5\".")
|
||||||
)
|
)
|
||||||
parser.add_argument('--playbook',
|
parser.add_argument('--playbook',
|
||||||
action="store",
|
action="store",
|
||||||
|
@ -211,20 +213,24 @@ class UpgradeRun(command.Command):
|
||||||
key = package_update.get_key(clients)
|
key = package_update.get_key(clients)
|
||||||
|
|
||||||
# Run ansible:
|
# Run ansible:
|
||||||
limit_hosts = parsed_args.limit
|
|
||||||
|
|
||||||
playbook = parsed_args.playbook
|
playbook = parsed_args.playbook
|
||||||
inventory = oooutils.get_tripleo_ansible_inventory(
|
inventory = oooutils.get_tripleo_ansible_inventory(
|
||||||
parsed_args.static_inventory, parsed_args.ssh_user, stack)
|
parsed_args.static_inventory, parsed_args.ssh_user, stack)
|
||||||
skip_tags = self._validate_skip_tags(parsed_args.skip_tags)
|
skip_tags = self._validate_skip_tags(parsed_args.skip_tags)
|
||||||
oooutils.run_update_ansible_action(self.log, clients, stack,
|
limit_hosts = oooutils.playbook_limit_parse(
|
||||||
limit_hosts, inventory, playbook,
|
limit_nodes=parsed_args.limit)
|
||||||
|
oooutils.run_update_ansible_action(
|
||||||
|
self.log,
|
||||||
|
clients,
|
||||||
|
stack,
|
||||||
|
limit_hosts,
|
||||||
|
inventory,
|
||||||
|
playbook,
|
||||||
constants.MAJOR_UPGRADE_PLAYBOOKS,
|
constants.MAJOR_UPGRADE_PLAYBOOKS,
|
||||||
parsed_args.ssh_user,
|
parsed_args.ssh_user,
|
||||||
(None if parsed_args.no_workflow
|
(None if parsed_args.no_workflow else package_update),
|
||||||
else package_update),
|
|
||||||
parsed_args.tags,
|
|
||||||
skip_tags,
|
skip_tags,
|
||||||
|
parsed_args.tags,
|
||||||
verbosity,
|
verbosity,
|
||||||
workdir=ansible_dir,
|
workdir=ansible_dir,
|
||||||
priv_key=key)
|
priv_key=key)
|
||||||
|
|
|
@ -318,15 +318,21 @@ def enable_ssh_admin(log, clients, plan_name, hosts, ssh_user, ssh_key,
|
||||||
print("Enabling ssh admin - COMPLETE.")
|
print("Enabling ssh admin - COMPLETE.")
|
||||||
|
|
||||||
|
|
||||||
def config_download(log, clients, stack, templates, ssh_user, ssh_key,
|
def config_download(log, clients, stack, templates,
|
||||||
ssh_network, output_dir, override_ansible_cfg, timeout=600,
|
ssh_user, ssh_key, ssh_network,
|
||||||
verbosity=1, deployment_options={},
|
output_dir, override_ansible_cfg, timeout, verbosity=1,
|
||||||
in_flight_validations=False, deployment_timeout=None):
|
deployment_options={},
|
||||||
|
in_flight_validations=False,
|
||||||
|
deployment_timeout=None,
|
||||||
|
skip_tags=None,
|
||||||
|
tags=None,
|
||||||
|
limit_hosts=None):
|
||||||
workflow_client = clients.workflow_engine
|
workflow_client = clients.workflow_engine
|
||||||
tripleoclients = clients.tripleoclient
|
tripleoclients = clients.tripleoclient
|
||||||
|
|
||||||
if in_flight_validations:
|
if not in_flight_validations:
|
||||||
skip_tags = ''
|
if skip_tags:
|
||||||
|
skip_tags = 'opendev-validation,{}'.format(skip_tags)
|
||||||
else:
|
else:
|
||||||
skip_tags = 'opendev-validation'
|
skip_tags = 'opendev-validation'
|
||||||
|
|
||||||
|
@ -337,7 +343,9 @@ def config_download(log, clients, stack, templates, ssh_user, ssh_key,
|
||||||
'connection_timeout': timeout,
|
'connection_timeout': timeout,
|
||||||
'config_download_timeout': deployment_timeout,
|
'config_download_timeout': deployment_timeout,
|
||||||
'deployment_options': deployment_options,
|
'deployment_options': deployment_options,
|
||||||
'skip_tags': skip_tags
|
'skip_tags': skip_tags,
|
||||||
|
'tags': tags,
|
||||||
|
'limit_hosts': utils.playbook_limit_parse(limit_hosts)
|
||||||
}
|
}
|
||||||
if output_dir:
|
if output_dir:
|
||||||
workflow_input.update(dict(work_dir=output_dir))
|
workflow_input.update(dict(work_dir=output_dir))
|
||||||
|
|
Loading…
Reference in New Issue