From bfed90d630ed90ca2163ab0a350a87b8a5e2f03d Mon Sep 17 00:00:00 2001 From: Kevin Carter Date: Mon, 3 Feb 2020 11:19:53 -0600 Subject: [PATCH] Remove mistral from the discover_and_enroll workflow This change removes mistral from the discover_and_enroll workflow by managing the context and simply calling the required methods. This change will speed up the general execution process and ensure better reliability as we'll no longer require mistral or zaqar to execute this workflow. Story: 2007212 Task: 38450 Change-Id: Ic13a3f70383afdc23abd29b8db230f01e0bebf55 Signed-off-by: Kevin Carter --- .../v1/overcloud_node/test_overcloud_node.py | 52 +++++------- tripleoclient/workflows/baremetal.py | 84 ++++++++++++++----- 2 files changed, 83 insertions(+), 53 deletions(-) diff --git a/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py b/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py index 38cb76559..7146725ee 100644 --- a/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py +++ b/tripleoclient/tests/v1/overcloud_node/test_overcloud_node.py @@ -26,6 +26,8 @@ from osc_lib.tests import utils as test_utils import yaml from tripleoclient import exceptions +from tripleoclient import plugin +from tripleoclient.tests import fakes as ooofakes from tripleoclient.tests.v1.overcloud_node import fakes from tripleoclient.v1 import overcloud_node @@ -1205,10 +1207,26 @@ class TestDiscoverNode(fakes.TestOvercloudNode): execution.id = "IDID" self.workflow.executions.create.return_value = execution client = self.app.client_manager.tripleoclient + client.create_mistral_context = plugin.ClientWrapper( + instance=ooofakes.FakeInstanceData + ).create_mistral_context self.websocket = client.messaging_websocket() self.cmd = overcloud_node.DiscoverNode(self.app, None) + self.gcn = mock.patch( + 'tripleo_common.actions.baremetal.GetCandidateNodes', + autospec=True + ) + self.gcn.start() + self.addCleanup(self.gcn.stop) + self.roun = mock.patch( + 'tripleo_common.actions.baremetal.RegisterOrUpdateNodes', + autospec=True + ) + self.roun.start() + self.addCleanup(self.roun.stop) + self.websocket.wait_for_messages.return_value = [{ "status": "SUCCESS", "message": "Success", @@ -1229,17 +1247,6 @@ class TestDiscoverNode(fakes.TestOvercloudNode): parsed_args = self.check_parser(self.cmd, argslist, verifylist) self.cmd.take_action(parsed_args) - self.workflow.executions.create.assert_called_once_with( - 'tripleo.baremetal.v1.discover_and_enroll_nodes', - workflow_input={ - 'ip_addresses': '10.0.0.0/24', - 'credentials': [['admin', 'password']], - 'kernel_name': 'file://%s/agent.kernel' % self.http_boot, - 'ramdisk_name': 'file://%s/agent.ramdisk' % self.http_boot, - 'instance_boot_option': 'local' - } - ) - def test_with_address_list(self): argslist = ['--ip', '10.0.0.1', '--ip', '10.0.0.2', '--credentials', 'admin:password'] @@ -1249,17 +1256,6 @@ class TestDiscoverNode(fakes.TestOvercloudNode): parsed_args = self.check_parser(self.cmd, argslist, verifylist) self.cmd.take_action(parsed_args) - self.workflow.executions.create.assert_called_once_with( - 'tripleo.baremetal.v1.discover_and_enroll_nodes', - workflow_input={ - 'ip_addresses': ['10.0.0.1', '10.0.0.2'], - 'credentials': [['admin', 'password']], - 'kernel_name': 'file://%s/agent.kernel' % self.http_boot, - 'ramdisk_name': 'file://%s/agent.ramdisk' % self.http_boot, - 'instance_boot_option': 'local' - } - ) - def test_with_all_options(self): argslist = ['--range', '10.0.0.0/24', '--credentials', 'admin:password', @@ -1282,20 +1278,12 @@ class TestDiscoverNode(fakes.TestOvercloudNode): self.cmd.take_action(parsed_args) workflows_calls = [ - mock.call('tripleo.baremetal.v1.discover_and_enroll_nodes', - workflow_input={'ip_addresses': '10.0.0.0/24', - 'credentials': [['admin', 'password'], - ['admin2', 'password2']], - 'ports': [623, 6230], - 'kernel_name': None, - 'ramdisk_name': None, - 'instance_boot_option': 'netboot'}), mock.call('tripleo.baremetal.v1.introspect', - workflow_input={'node_uuids': ['MOCK_NODE_UUID'], + workflow_input={'node_uuids': [], 'run_validations': True, 'concurrency': 10}), mock.call('tripleo.baremetal.v1.provide', - workflow_input={'node_uuids': ['MOCK_NODE_UUID']} + workflow_input={'node_uuids': []} ) ] self.workflow.executions.create.assert_has_calls(workflows_calls) diff --git a/tripleoclient/workflows/baremetal.py b/tripleoclient/workflows/baremetal.py index c9a8a5a5f..ccd559fdd 100644 --- a/tripleoclient/workflows/baremetal.py +++ b/tripleoclient/workflows/baremetal.py @@ -16,6 +16,8 @@ from __future__ import print_function import six +from tripleo_common.actions import baremetal + from tripleoclient import exceptions from tripleoclient.workflows import base @@ -313,34 +315,74 @@ def create_raid_configuration(clients, **workflow_input): 'Failed to create RAID: {}'.format(payload['message'])) -def discover_and_enroll(clients, **workflow_input): - """Discover nodes. +def discover_and_enroll(clients, ip_addresses, credentials, kernel_name, + ramdisk_name, instance_boot_option, + existing_nodes=None, ports=None): + """Discover nodes and enroll baremetal nodes. - Run the tripleo.baremetal.v1.discover_and_enroll_nodes Mistral workflow. + :param clients: application client object. + :type clients: Object + + :param ip_addresses: List of IP addresses. + :type ip_addresses: List || String + + :param credentials: Credential information object + :type credentials: Tuple + + :param kernel_name: Kernel to use + :type kernel_name: String + + :param ramdisk_name: RAMDISK to use + :type ramdisk_name: String + + :param instance_boot_option: Boot options to use + :type instance_boot_option: String + + :param existing_nodes: List of nodes already discovered. If this is + undefined this object will be set to an empty + array. + :type existing_nodes: List + + :param ports: List of ports, if no ports are provided the list of ports + will be limted to [623]. + :type ports: List + + :returns: List """ - workflow_client = clients.workflow_engine - tripleoclients = clients.tripleoclient + if not ports: + ports = [623] - with tripleoclients.messaging_websocket() as ws: - execution = base.start_workflow( - workflow_client, - 'tripleo.baremetal.v1.discover_and_enroll_nodes', - workflow_input=workflow_input + if not existing_nodes: + existing_nodes = list() + + context = clients.tripleoclient.create_mistral_context() + + get_candiate_nodes = baremetal.GetCandidateNodes( + ip_addresses, + ports, + credentials, + existing_nodes + ) + probed_nodes = list() + for node in get_candiate_nodes.run(context=context): + probed_nodes.append( + baremetal.ProbeNode(**node).run(context=context) ) + print('Successfully probed node IP {}'.format(node['ip'])) - for payload in base.wait_for_messages(workflow_client, ws, execution): - if payload.get('message'): - print(payload['message']) - - if payload['status'] == 'SUCCESS': - registered_nodes = payload['registered_nodes'] - for nd in registered_nodes: - print('Successfully registered node UUID %s' % nd['uuid']) - return registered_nodes + register_or_update = baremetal.RegisterOrUpdateNodes( + nodes_json=probed_nodes, + instance_boot_option=instance_boot_option, + kernel_name=kernel_name, + ramdisk_name=ramdisk_name + ) + registered_nodes = list() + for node in register_or_update.run(context=context): + print('Successfully registered node UUID {}'.format(node['uuid'])) + registered_nodes.append(node) else: - raise exceptions.RegisterOrUpdateError( - 'Exception discovering nodes: {}'.format(payload['message'])) + return registered_nodes def clean_nodes(clients, **workflow_input):