From 9c6c7c0a5751e2970061a9aabbc22454cc5310d5 Mon Sep 17 00:00:00 2001 From: Kaifeng Wang Date: Tue, 26 Feb 2019 16:08:31 +0800 Subject: [PATCH] Follow up to introspection data driver api revision In https://review.openstack.org/#/c/637673, the get introspection interface is narrowed down to only accept node uuid, which previously accepts both uuid and name. But the name to uuid conversion is missing in the reapply api, which causes feature regression, and this is the fix :( Story: 1726713 Task: 11373 Change-Id: I6912853deab77f1365f665ca1e52c13063d2cdf1 --- ironic_inspector/conductor/manager.py | 6 +++--- ironic_inspector/main.py | 6 ++++-- ironic_inspector/process.py | 8 ++++---- ironic_inspector/test/unit/test_main.py | 15 ++++++++++++--- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/ironic_inspector/conductor/manager.py b/ironic_inspector/conductor/manager.py index 2fa00b3f2..b0bfebadd 100644 --- a/ironic_inspector/conductor/manager.py +++ b/ironic_inspector/conductor/manager.py @@ -126,16 +126,16 @@ class ConductorManager(object): introspect.abort(node_id, token=token) @messaging.expected_exceptions(utils.Error) - def do_reapply(self, context, node_id, token=None): + def do_reapply(self, context, node_uuid, token=None): try: - data = process.get_introspection_data(node_id, processed=False, + data = process.get_introspection_data(node_uuid, processed=False, get_json=True) except utils.IntrospectionDataStoreDisabled: raise utils.Error(_('Inspector is not configured to store ' 'data. Set the [processing]store_data ' 'configuration option to change this.'), code=400) - process.reapply(node_id, data) + process.reapply(node_uuid, data) def periodic_clean_up(): # pragma: no cover diff --git a/ironic_inspector/main.py b/ironic_inspector/main.py index ca3f62a80..6a7842ccd 100644 --- a/ironic_inspector/main.py +++ b/ironic_inspector/main.py @@ -310,9 +310,11 @@ def api_introspection_reapply(node_id): if flask.request.content_length: return error_response(_('User data processing is not ' 'supported yet'), code=400) - + if not uuidutils.is_uuid_like(node_id): + node = ir_utils.get_node(node_id, fields=['uuid']) + node_id = node.uuid client = rpc.get_client() - client.call({}, 'do_reapply', node_id=node_id) + client.call({}, 'do_reapply', node_uuid=node_id) return '', 202 diff --git a/ironic_inspector/process.py b/ironic_inspector/process.py index 29673423c..8d476cfef 100644 --- a/ironic_inspector/process.py +++ b/ironic_inspector/process.py @@ -285,20 +285,20 @@ def _finish(node_info, ironic, introspection_data, power_off=True): node_info=node_info, data=introspection_data) -def reapply(node_ident, data=None): +def reapply(node_uuid, data=None): """Re-apply introspection steps. Re-apply preprocessing, postprocessing and introspection rules on stored data. - :param node_ident: node UUID or name + :param node_uuid: node UUID :raises: utils.Error """ LOG.debug('Processing re-apply introspection request for node ' - 'UUID: %s', node_ident) - node_info = node_cache.get_node(node_ident, locked=False) + 'UUID: %s', node_uuid) + node_info = node_cache.get_node(node_uuid, locked=False) if not node_info.acquire_lock(blocking=False): # Note (mkovacik): it should be sufficient to check data # presence & locking. If either introspection didn't start diff --git a/ironic_inspector/test/unit/test_main.py b/ironic_inspector/test/unit/test_main.py index 892231ba6..800701bed 100644 --- a/ironic_inspector/test/unit/test_main.py +++ b/ironic_inspector/test/unit/test_main.py @@ -370,7 +370,7 @@ class TestApiReapply(BaseAPITest): self.app.post('/v1/introspection/%s/data/unprocessed' % self.uuid) self.client_mock.call.assert_called_once_with({}, 'do_reapply', - node_id=self.uuid) + node_uuid=self.uuid) def test_user_data(self): res = self.app.post('/v1/introspection/%s/data/unprocessed' % @@ -392,7 +392,7 @@ class TestApiReapply(BaseAPITest): message = json.loads(res.data.decode())['error']['message'] self.assertEqual(str(exc), message) self.client_mock.call.assert_called_once_with({}, 'do_reapply', - node_id=self.uuid) + node_uuid=self.uuid) def test_generic_error(self): exc = utils.Error('Oops', code=400) @@ -405,7 +405,16 @@ class TestApiReapply(BaseAPITest): message = json.loads(res.data.decode())['error']['message'] self.assertEqual(str(exc), message) self.client_mock.call.assert_called_once_with({}, 'do_reapply', - node_id=self.uuid) + node_uuid=self.uuid) + + @mock.patch.object(ir_utils, 'get_node', autospec=True) + def test_reapply_with_node_name(self, get_mock): + get_mock.return_value = mock.Mock(uuid=self.uuid) + self.app.post('/v1/introspection/%s/data/unprocessed' % + 'fake-node') + self.client_mock.call.assert_called_once_with({}, 'do_reapply', + node_uuid=self.uuid) + get_mock.assert_called_once_with('fake-node', fields=['uuid']) class TestApiRules(BaseAPITest):