diff --git a/tripleoclient/tests/v1/test_overcloud_bios.py b/tripleoclient/tests/v1/test_overcloud_bios.py index 2c44fca05..035d1ae72 100644 --- a/tripleoclient/tests/v1/test_overcloud_bios.py +++ b/tripleoclient/tests/v1/test_overcloud_bios.py @@ -11,6 +11,7 @@ # under the License. import json +import mock import tempfile from osc_lib.tests import utils as test_utils @@ -30,6 +31,7 @@ class Base(fakes.TestBaremetal): ] } tripleoclient = self.app.client_manager.tripleoclient + self.app.client_manager.baremetal.node.list.return_value = [] self.websocket = tripleoclient.messaging_websocket() self.websocket.wait_for_messages.return_value = iter([{ 'status': "SUCCESS", @@ -47,6 +49,12 @@ class TestConfigureBIOS(Base): def setUp(self): super(TestConfigureBIOS, self).setUp() self.cmd = overcloud_bios.ConfigureBIOS(self.app, None) + playbook_runner = mock.patch( + 'tripleoclient.utils.run_ansible_playbook', + autospec=True + ) + playbook_runner.start() + self.addCleanup(playbook_runner.stop) def test_configure_specified_nodes_ok(self): conf = json.dumps(self.conf) @@ -59,14 +67,6 @@ class TestConfigureBIOS(Base): self.cmd.take_action(parsed_args) - self.workflow.executions.create.assert_called_once_with( - 'tripleo.baremetal.v1.apply_bios_settings', - workflow_input={ - 'node_uuids': ['node_uuid1', 'node_uuid2'], - 'configuration': self.conf, - } - ) - def test_configure_specified_nodes_and_configuration_from_file(self): with tempfile.NamedTemporaryFile('w+t') as fp: json.dump(self.conf, fp) @@ -80,23 +80,6 @@ class TestConfigureBIOS(Base): self.cmd.take_action(parsed_args) - self.workflow.executions.create.assert_called_once_with( - 'tripleo.baremetal.v1.apply_bios_settings', - workflow_input={ - 'node_uuids': ['node_uuid1', 'node_uuid2'], - 'configuration': self.conf, - } - ) - - def test_configure_no_nodes(self): - arglist = ['--configuration', '{}'] - verifylist = [ - ('configuration', '{}') - ] - self.assertRaises(test_utils.ParserException, self.check_parser, - self.cmd, arglist, verifylist) - self.assertFalse(self.workflow.executions.create.called) - def test_configure_specified_nodes_and_configuration_not_yaml(self): arglist = ['--configuration', ':', 'node_uuid1', 'node_uuid2'] verifylist = [ @@ -156,38 +139,18 @@ class TestConfigureBIOS(Base): self.cmd.take_action(parsed_args) - self.workflow.executions.create.assert_called_once_with( - 'tripleo.baremetal.v1.apply_bios_settings_on_manageable_nodes', - workflow_input={'configuration': self.conf}) - - def test_configure_all_manageable_nodes_fail(self): - conf = json.dumps(self.conf) - arglist = ['--configuration', conf, '--all-manageable'] - verifylist = [ - ('all_manageable', True), - ('configuration', conf) - ] - - self.websocket.wait_for_messages.return_value = iter([{ - "status": "FAILED", - "message": "Test failure.", - 'execution_id': 'fake id', - 'root_execution_id': 'fake id', - }]) - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - self.assertRaisesRegex(RuntimeError, 'Failed to apply BIOS settings', - self.cmd.take_action, parsed_args) - - self.workflow.executions.create.assert_called_once_with( - 'tripleo.baremetal.v1.apply_bios_settings_on_manageable_nodes', - workflow_input={'configuration': self.conf}) - class TestResetBIOS(Base): def setUp(self): super(TestResetBIOS, self).setUp() self.cmd = overcloud_bios.ResetBIOS(self.app, None) + playbook_runner = mock.patch( + 'tripleoclient.utils.run_ansible_playbook', + autospec=True + ) + playbook_runner.start() + self.addCleanup(playbook_runner.stop) def test_reset_specified_nodes_ok(self): arglist = ['node_uuid1', 'node_uuid2'] @@ -196,28 +159,6 @@ class TestResetBIOS(Base): self.cmd.take_action(parsed_args) - self.workflow.executions.create.assert_called_once_with( - 'tripleo.baremetal.v1.reset_bios_settings', - workflow_input={'node_uuids': ['node_uuid1', 'node_uuid2']}) - - def test_reset_specified_nodes_fail(self): - arglist = ['node_uuid1', 'node_uuid2'] - verifylist = [('node_uuids', ['node_uuid1', 'node_uuid2'])] - - self.websocket.wait_for_messages.return_value = iter([{ - "status": "FAILED", - "message": "Test failure.", - 'execution_id': 'fake id', - 'root_execution_id': 'fake id', - }]) - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - self.assertRaisesRegex(RuntimeError, 'Failed to reset BIOS settings', - self.cmd.take_action, parsed_args) - - self.workflow.executions.create.assert_called_once_with( - 'tripleo.baremetal.v1.reset_bios_settings', - workflow_input={'node_uuids': ['node_uuid1', 'node_uuid2']}) - def test_reset_all_manageable_nodes_ok(self): arglist = ['--all-manageable'] verifylist = [('all_manageable', True)] @@ -225,28 +166,6 @@ class TestResetBIOS(Base): self.cmd.take_action(parsed_args) - self.workflow.executions.create.assert_called_once_with( - 'tripleo.baremetal.v1.reset_bios_settings_on_manageable_nodes', - workflow_input={}) - - def test_reset_all_manageable_nodes_fail(self): - arglist = ['--all-manageable'] - verifylist = [('all_manageable', True)] - - self.websocket.wait_for_messages.return_value = iter([{ - "status": "FAILED", - "message": "Test failure.", - 'execution_id': 'fake id', - 'root_execution_id': 'fake id', - }]) - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - self.assertRaisesRegex(RuntimeError, 'Failed to reset BIOS settings', - self.cmd.take_action, parsed_args) - - self.workflow.executions.create.assert_called_once_with( - 'tripleo.baremetal.v1.reset_bios_settings_on_manageable_nodes', - workflow_input={}) - def test_reset_no_nodes(self): arglist = [] verifylist = [] diff --git a/tripleoclient/workflows/baremetal.py b/tripleoclient/workflows/baremetal.py index de98b6133..ec59c219d 100644 --- a/tripleoclient/workflows/baremetal.py +++ b/tripleoclient/workflows/baremetal.py @@ -447,122 +447,84 @@ def clean_manageable_nodes(clients, **workflow_input): print('Cleaned %d node(s)' % len(payload['cleaned_nodes'])) -def apply_bios_configuration(clients, **workflow_input): +def apply_bios_configuration(clients, node_uuids, configuration): """Apply BIOS settings on nodes. Run the tripleo.baremetal.v1.apply_bios_settings Mistral workflow. """ - workflow_client = clients.workflow_engine - ooo_client = clients.tripleoclient - print('Applying BIOS settings for given nodes, this may take time') - with ooo_client.messaging_websocket() as ws: - execution = base.start_workflow( - workflow_client, - 'tripleo.baremetal.v1.apply_bios_settings', - workflow_input=workflow_input + with utils.TempDirs() as tmp: + utils.run_ansible_playbook( + playbook='cli-baremetal-bios.yaml', + inventory='localhost,', + workdir=tmp, + playbook_dir=constants.ANSIBLE_TRIPLEO_PLAYBOOKS, + extra_vars={ + 'node_uuids': node_uuids, + 'bios_configuration': configuration + } ) - for payload in base.wait_for_messages(workflow_client, ws, execution): - if payload.get('message'): - print(payload['message']) - - if payload['status'] == 'SUCCESS': - print('Success') - else: - raise RuntimeError( - 'Failed to apply BIOS settings: {}'.format(payload['message'])) + print('Successfully applied the BIOS for nodes: {}'.format(node_uuids)) -def apply_bios_configuration_on_manageable_nodes(clients, **workflow_input): +def apply_bios_configuration_on_manageable_nodes(clients, configuration): """Apply BIOS settings on manageable nodes. Run the tripleo.baremetal.v1.apply_bios_settings_on_manageable_nodes Mistral workflow. """ - workflow_client = clients.workflow_engine - ooo_client = clients.tripleoclient - - print('Applying BIOS settings for manageable nodes, this may take time') - - with ooo_client.messaging_websocket() as ws: - execution = base.start_workflow( - workflow_client, - 'tripleo.baremetal.v1.apply_bios_settings_on_manageable_nodes', - workflow_input=workflow_input - ) - - for payload in base.wait_for_messages(workflow_client, ws, execution): - if payload.get('message'): - print(payload['message']) - - if payload['status'] == 'SUCCESS': - print('Success') - else: - raise RuntimeError( - 'Failed to apply BIOS settings: {}'.format(payload['message'])) + apply_bios_configuration( + clients=clients, + node_uuids=[ + i.uuid for i in clients.baremetal.node.list() + if i.provision_state == "manageable" and not i.maintenance + ], + configuration=configuration + ) -def reset_bios_configuration(clients, **workflow_input): +def reset_bios_configuration(clients, node_uuids): """Reset BIOS settings on nodes. - Run the tripleo.baremetal.v1.reset_bios_settings Mistral workflow. + :param clients: application client object. + :type clients: Object + + :param node_uuids: List of instance UUID(s). + :type node_uuids: List """ - workflow_client = clients.workflow_engine - ooo_client = clients.tripleoclient - - print('Reset BIOS settings on given nodes, this may take time') - - with ooo_client.messaging_websocket() as ws: - execution = base.start_workflow( - workflow_client, - 'tripleo.baremetal.v1.reset_bios_settings', - workflow_input=workflow_input + with utils.TempDirs() as tmp: + utils.run_ansible_playbook( + playbook='cli-baremetal-bios-reset.yaml', + inventory='localhost,', + workdir=tmp, + playbook_dir=constants.ANSIBLE_TRIPLEO_PLAYBOOKS, + extra_vars={ + 'node_uuids': node_uuids + } ) - for payload in base.wait_for_messages(workflow_client, ws, execution): - if payload.get('message'): - print(payload['message']) - - if payload['status'] == 'SUCCESS': - print('Success') - else: - raise RuntimeError( - 'Failed to reset BIOS settings: {}'.format(payload['message'])) + print('Successfully reset the BIOS for nodes: {}'.format(node_uuids)) def reset_bios_configuration_on_manageable_nodes(clients, **workflow_input): """Reset BIOS settings on manageable nodes. - Run the tripleo.baremetal.v1.reset_bios_settings_on_manageable_nodes - Mistral workflow. + :param clients: application client object. + :type clients: Object """ - workflow_client = clients.workflow_engine - ooo_client = clients.tripleoclient - - print('Reset BIOS settings on manageable nodes, this may take time') - - with ooo_client.messaging_websocket() as ws: - execution = base.start_workflow( - workflow_client, - 'tripleo.baremetal.v1.reset_bios_settings_on_manageable_nodes', - workflow_input=workflow_input - ) - - for payload in base.wait_for_messages(workflow_client, ws, execution): - if payload.get('message'): - print(payload['message']) - - if payload['status'] == 'SUCCESS': - print('Success') - else: - raise RuntimeError( - 'Failed to reset BIOS settings: {}'.format(payload['message'])) + reset_bios_configuration( + clients=clients, + node_uuids=[ + i.uuid for i in clients.baremetal.node.list() + if i.provision_state == "manageable" and not i.maintenance + ], + ) def deploy_roles(clients, **workflow_input):