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
This commit is contained in:
Dmitry Tantsur 2015-08-20 12:35:37 +02:00
parent 17c7e05235
commit dab1ce9831
2 changed files with 87 additions and 8 deletions

View File

@ -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

View File

@ -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'
},
})