From dab1ce983102ad315d073fa39aa2f9531e08f73b Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Thu, 20 Aug 2015 12:35:37 +0200 Subject: [PATCH] Allow passing node UUID to lookup After successful inspection we will know node UUID already, so no need to do a proper lookup. In the future we might get rid of lookup completely in this case. Change-Id: Ic00049bf69f9ecc59ac4e389a3e6afe20ba67aba --- ironic_python_agent/ironic_api_client.py | 10 ++- .../tests/unit/test_ironic_api_client.py | 85 +++++++++++++++++-- 2 files changed, 87 insertions(+), 8 deletions(-) diff --git a/ironic_python_agent/ironic_api_client.py b/ironic_python_agent/ironic_api_client.py index 51cb66dfc..5816b95af 100644 --- a/ironic_python_agent/ironic_api_client.py +++ b/ironic_python_agent/ironic_api_client.py @@ -78,10 +78,12 @@ class APIClient(object): msg = 'Invalid status code: {0}'.format(response.status_code) raise errors.HeartbeatError(msg) - def lookup_node(self, hardware_info, timeout, starting_interval): + def lookup_node(self, hardware_info, timeout, starting_interval, + node_uuid=None): timer = backoff.BackOffLoopingCall( self._do_lookup, - hardware_info=hardware_info) + hardware_info=hardware_info, + node_uuid=node_uuid) try: node_content = timer.start(starting_interval=starting_interval, timeout=timeout).wait() @@ -90,7 +92,7 @@ class APIClient(object): 'logs for details.') return node_content - def _do_lookup(self, hardware_info): + def _do_lookup(self, hardware_info, node_uuid): """The actual call to lookup a node. Should be called as a `loopingcall.BackOffLoopingCall`. @@ -105,6 +107,8 @@ class APIClient(object): 'version': self.payload_version, 'inventory': hardware_info } + if node_uuid: + data['node_uuid'] = node_uuid # Make the POST, make sure we get back normal data/status codes and # content diff --git a/ironic_python_agent/tests/unit/test_ironic_api_client.py b/ironic_python_agent/tests/unit/test_ironic_api_client.py index b6c29c23d..fbaf82050 100644 --- a/ironic_python_agent/tests/unit/test_ironic_api_client.py +++ b/ironic_python_agent/tests/unit/test_ironic_api_client.py @@ -131,7 +131,8 @@ class TestBaseIronicPythonAgent(test_base.BaseTestCase): self.assertRaises(loopingcall.LoopingCallDone, self.api_client._do_lookup, - hardware_info=self.hardware_info) + hardware_info=self.hardware_info, + node_uuid=None) url = '{api_url}v1/drivers/{driver}/vendor_passthru/lookup'.format( api_url=API_URL, driver=DRIVER) @@ -141,6 +142,7 @@ class TestBaseIronicPythonAgent(test_base.BaseTestCase): data = self.api_client.session.request.call_args[1]['data'] content = json.loads(data) + self.assertNotIn('node_uuid', content) self.assertEqual(content['version'], self.api_client.payload_version) self.assertEqual(content['inventory'], { u'interfaces': [ @@ -195,7 +197,8 @@ class TestBaseIronicPythonAgent(test_base.BaseTestCase): self.api_client.session.request = mock.Mock() self.api_client.session.request.return_value = response - error = self.api_client._do_lookup(self.hardware_info) + error = self.api_client._do_lookup(self.hardware_info, + node_uuid=None) self.assertFalse(error) @@ -207,7 +210,8 @@ class TestBaseIronicPythonAgent(test_base.BaseTestCase): self.api_client.session.request = mock.Mock() self.api_client.session.request.return_value = response - error = self.api_client._do_lookup(self.hardware_info) + error = self.api_client._do_lookup(self.hardware_info, + node_uuid=None) self.assertFalse(error) @@ -221,7 +225,8 @@ class TestBaseIronicPythonAgent(test_base.BaseTestCase): self.api_client.session.request = mock.Mock() self.api_client.session.request.return_value = response - error = self.api_client._do_lookup(self.hardware_info) + error = self.api_client._do_lookup(self.hardware_info, + node_uuid=None) self.assertFalse(error) @@ -233,6 +238,76 @@ class TestBaseIronicPythonAgent(test_base.BaseTestCase): self.api_client.session.request = mock.Mock() self.api_client.session.request.return_value = response - error = self.api_client._do_lookup(self.hardware_info) + error = self.api_client._do_lookup(self.hardware_info, + node_uuid=None) self.assertFalse(error) + + def test_do_lookup_with_node_uuid(self): + response = FakeResponse(status_code=200, content={ + 'node': { + 'uuid': 'deadbeef-dabb-ad00-b105-f00d00bab10c' + }, + 'heartbeat_timeout': 300 + }) + + self.api_client.session.request = mock.Mock() + self.api_client.session.request.return_value = response + + self.assertRaises(loopingcall.LoopingCallDone, + self.api_client._do_lookup, + hardware_info=self.hardware_info, + node_uuid='uuid') + + url = '{api_url}v1/drivers/{driver}/vendor_passthru/lookup'.format( + api_url=API_URL, driver=DRIVER) + request_args = self.api_client.session.request.call_args[0] + self.assertEqual(request_args[0], 'POST') + self.assertEqual(request_args[1], url) + + data = self.api_client.session.request.call_args[1]['data'] + content = json.loads(data) + self.assertEqual(content['node_uuid'], 'uuid') + self.assertEqual(content['version'], self.api_client.payload_version) + self.assertEqual(content['inventory'], { + u'interfaces': [ + { + u'mac_address': u'00:0c:29:8c:11:b1', + u'name': u'eth0', + u'ipv4_address': None, + u'switch_chassis_descr': None, + u'switch_port_descr': None + }, + { + u'mac_address': u'00:0c:29:8c:11:b2', + u'name': u'eth1', + u'ipv4_address': None, + u'switch_chassis_descr': None, + 'switch_port_descr': None + } + ], + u'cpu': { + u'model_name': u'Awesome Jay CPU x10 9001', + u'frequency': u'9001', + u'count': u'10', + u'architecture': u'ARMv9' + }, + u'disks': [ + { + u'model': u'small', + u'name': u'/dev/sdj', + u'rotational': False, + u'size': u'9001', + }, + { + u'model': u'big', + u'name': u'/dev/hdj', + u'rotational': False, + u'size': u'9002', + } + ], + u'memory': { + u'total': u'8675309', + u'physical_mb': u'8675' + }, + })