[train-only] Honour DeploymentServerBlacklist

With external-update/upgrade run, --limit is not mandatory,
as it can be run on all nodes. However, we don't seem to honor
blacklisted hosts.

This is fine from ussuri onwards after we dropped mistral[1] and
used deployment.config_download() for all these.

[1] https://review.opendev.org/c/openstack/python-tripleoclient/+/707894
Change-Id: I7072617770d258b2ba790fa274d2153c01bfe650
This commit is contained in:
rabi 2021-08-18 09:39:39 +05:30
parent 4203d1792e
commit 935c6592cd
3 changed files with 28 additions and 10 deletions

View File

@ -34,6 +34,8 @@ class TestOvercloudExternalUpdateRun(fakes.TestOvercloudExternalUpdateRun):
self.mock_uuid4 = uuid4_patcher.start()
self.addCleanup(self.mock_uuid4.stop)
@mock.patch('tripleoclient.utils.get_stack_output_item',
autospec=True)
@mock.patch('tripleoclient.utils.get_tripleo_ansible_inventory',
return_value='/home/fake/inventory.yaml')
@mock.patch('tripleoclient.utils.prompt_user_for_confirmation',
@ -44,7 +46,8 @@ class TestOvercloudExternalUpdateRun(fakes.TestOvercloudExternalUpdateRun):
@mock.patch('oslo_concurrency.processutils.execute')
def test_update_with_user_and_tags(self, mock_execute,
mock_expanduser, update_ansible,
mock_confirm, mock_inventory):
mock_confirm, mock_inventory,
mock_stack_output):
mock_expanduser.return_value = '/home/fake/'
argslist = ['--ssh-user', 'tripleo-admin',
'--tags', 'ceph']
@ -52,7 +55,7 @@ class TestOvercloudExternalUpdateRun(fakes.TestOvercloudExternalUpdateRun):
('ssh_user', 'tripleo-admin'),
('tags', 'ceph'),
]
mock_stack_output.return_value = []
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
@ -70,6 +73,8 @@ class TestOvercloudExternalUpdateRun(fakes.TestOvercloudExternalUpdateRun):
extra_vars={}
)
@mock.patch('tripleoclient.utils.get_stack_output_item',
autospec=True)
@mock.patch('tripleoclient.utils.get_tripleo_ansible_inventory',
return_value='/home/stack/inventory.yaml')
@mock.patch('tripleoclient.utils.prompt_user_for_confirmation',
@ -80,7 +85,8 @@ class TestOvercloudExternalUpdateRun(fakes.TestOvercloudExternalUpdateRun):
@mock.patch('oslo_concurrency.processutils.execute')
def test_update_with_user_and_extra_vars(self, mock_execute,
mock_expanduser, update_ansible,
mock_confirm, mock_inventory):
mock_confirm, mock_inventory,
mock_stack_output):
mock_expanduser.return_value = '/home/fake/'
argslist = ['--ssh-user', 'tripleo-admin',
'--extra-vars', 'key1=val1',
@ -89,7 +95,7 @@ class TestOvercloudExternalUpdateRun(fakes.TestOvercloudExternalUpdateRun):
('ssh_user', 'tripleo-admin'),
('extra_vars', ['key1=val1', 'key2=val2'])
]
mock_stack_output.return_value = ['compute1']
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
@ -97,7 +103,7 @@ class TestOvercloudExternalUpdateRun(fakes.TestOvercloudExternalUpdateRun):
update_ansible.assert_called_once_with(
self.app.client_manager,
container='overcloud',
nodes=None,
nodes='!compute1',
inventory_file=mock_inventory.return_value,
playbook='external_update_steps_playbook.yaml',
node_user='tripleo-admin',

View File

@ -34,6 +34,8 @@ class TestOvercloudExternalUpgradeRun(fakes.TestOvercloudExternalUpgradeRun):
self.mock_uuid4 = uuid4_patcher.start()
self.addCleanup(self.mock_uuid4.stop)
@mock.patch('tripleoclient.utils.get_stack_output_item',
autospec=True)
@mock.patch('tripleoclient.utils.get_tripleo_ansible_inventory',
return_value='/home/fake/inventory.yaml')
@mock.patch('tripleoclient.utils.prompt_user_for_confirmation',
@ -44,7 +46,8 @@ class TestOvercloudExternalUpgradeRun(fakes.TestOvercloudExternalUpgradeRun):
@mock.patch('oslo_concurrency.processutils.execute')
def test_upgrade_with_user_and_tags(self, mock_execute,
mock_expanduser, update_ansible,
mock_confirm, mock_inventory):
mock_confirm, mock_inventory,
mock_stack_output):
mock_expanduser.return_value = '/home/fake/'
argslist = ['--ssh-user', 'tripleo-admin',
'--tags', 'ceph']
@ -52,7 +55,7 @@ class TestOvercloudExternalUpgradeRun(fakes.TestOvercloudExternalUpgradeRun):
('ssh_user', 'tripleo-admin'),
('tags', 'ceph'),
]
mock_stack_output.return_value = []
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
@ -70,6 +73,8 @@ class TestOvercloudExternalUpgradeRun(fakes.TestOvercloudExternalUpgradeRun):
extra_vars={}
)
@mock.patch('tripleoclient.utils.get_stack_output_item',
autospec=True)
@mock.patch('tripleoclient.utils.get_tripleo_ansible_inventory',
return_value='/home/fake/inventory.yaml')
@mock.patch('tripleoclient.utils.prompt_user_for_confirmation',
@ -80,7 +85,8 @@ class TestOvercloudExternalUpgradeRun(fakes.TestOvercloudExternalUpgradeRun):
@mock.patch('oslo_concurrency.processutils.execute')
def test_upgrade_with_user_and_extra_vars(self, mock_execute,
mock_expanduser, update_ansible,
mock_confirm, mock_inventory):
mock_confirm, mock_inventory,
mock_stack_output):
mock_expanduser.return_value = '/home/fake/'
argslist = ['--ssh-user', 'tripleo-admin',
'--extra-vars', 'key1=val1',
@ -89,7 +95,7 @@ class TestOvercloudExternalUpgradeRun(fakes.TestOvercloudExternalUpgradeRun):
('ssh_user', 'tripleo-admin'),
('extra_vars', ['key1=val1', 'key2=val2'])
]
mock_stack_output.return_value = ['compute1', 'compute2']
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists:
mock_exists.return_value = True
@ -97,7 +103,7 @@ class TestOvercloudExternalUpgradeRun(fakes.TestOvercloudExternalUpgradeRun):
update_ansible.assert_called_once_with(
self.app.client_manager,
container='overcloud',
nodes=None,
nodes='!compute1:!compute2',
inventory_file=mock_inventory.return_value,
playbook='external_upgrade_steps_playbook.yaml',
node_user='tripleo-admin',

View File

@ -1402,6 +1402,12 @@ def run_update_ansible_action(log, clients, stack, nodes, inventory,
verbosity='1', extra_vars=None,
workdir='', priv_key='', forks=None):
if not nodes:
stack_obj = get_stack(clients.orchestration, stack)
blacklist = get_stack_output_item(stack_obj, 'BlacklistedHostnames')
if blacklist:
nodes = ':'.join(['!%s' % host for host in blacklist if host])
playbooks = [playbook]
if playbook == "all":
playbooks = all_playbooks