From cd9933a797ee70286af2a68169105288cd632d0e Mon Sep 17 00:00:00 2001 From: Michael Davies Date: Thu, 21 Aug 2014 23:32:16 +0930 Subject: [PATCH] Nova review updates for _node_resource In review https://review.openstack.org/#/c/111425/14 it has been raised that if the cpu_arch is not set, we should be using Nova helper functions instead of 'NotFound'. Also we should be canonicalizing the user provided config value. Once this is approved and merged, it will be proposed back into the Nova tree. Change-Id: Idfe0730daa22c6550a1a15b45f481635d2eb5195 --- ironic/nova/tests/virt/ironic/test_driver.py | 21 ++++++++++++++++++++ ironic/nova/virt/ironic/driver.py | 14 ++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/ironic/nova/tests/virt/ironic/test_driver.py b/ironic/nova/tests/virt/ironic/test_driver.py index 1910bf3769..94193d9490 100644 --- a/ironic/nova/tests/virt/ironic/test_driver.py +++ b/ironic/nova/tests/virt/ironic/test_driver.py @@ -144,9 +144,30 @@ class IronicDriverTestCase(test.NoDBTestCase): self.assertEqual(props['memory_mb'], result['memory_mb_used']) self.assertEqual(props['local_gb'], result['local_gb']) self.assertEqual(props['local_gb'], result['local_gb_used']) + self.assertEqual(props['cpu_arch'], + jsonutils.loads(result['supported_instances'])[0][0]) self.assertEqual(node_uuid, result['hypervisor_hostname']) self.assertEqual(stats, jsonutils.loads(result['stats'])) + def test__node_resource_canonicalizes_arch(self): + node_uuid = uuidutils.generate_uuid() + props = _get_properties() + props['cpu_arch'] = 'i386' + node = ironic_utils.get_test_node(uuid=node_uuid, properties=props) + + result = self.driver._node_resource(node) + self.assertEqual('i686', + jsonutils.loads(result['supported_instances'])[0][0]) + + def test__node_resource_unknown_arch(self): + node_uuid = uuidutils.generate_uuid() + props = _get_properties() + del props['cpu_arch'] + node = ironic_utils.get_test_node(uuid=node_uuid, properties=props) + + result = self.driver._node_resource(node) + self.assertEqual([], jsonutils.loads(result['supported_instances'])) + def test__node_resource_exposes_capabilities(self): props = _get_properties() props['capabilities'] = 'test:capability' diff --git a/ironic/nova/virt/ironic/driver.py b/ironic/nova/virt/ironic/driver.py index 64e42d7439..608634a963 100644 --- a/ironic/nova/virt/ironic/driver.py +++ b/ironic/nova/virt/ironic/driver.py @@ -28,9 +28,10 @@ from oslo.config import cfg from ironic.nova.virt.ironic import client_wrapper from ironic.nova.virt.ironic import ironic_states from ironic.nova.virt.ironic import patcher -from nova import context as nova_context +from nova.compute import arch from nova.compute import power_state from nova.compute import task_states +from nova import context as nova_context from nova import exception from nova.objects import flavor as flavor_obj from nova.objects import instance as instance_obj @@ -116,8 +117,10 @@ def _validate_instance_and_node(icli, instance): raise exception.InstanceNotFound(instance_id=instance['uuid']) -def _get_nodes_supported_instances(cpu_arch=''): +def _get_nodes_supported_instances(cpu_arch=None): """Return supported instances for a node.""" + if not cpu_arch: + return [] return [(cpu_arch, 'baremetal', 'baremetal')] @@ -183,7 +186,12 @@ class IronicDriver(virt_driver.ComputeDriver): vcpus = int(node.properties.get('cpus', 0)) memory_mb = int(node.properties.get('memory_mb', 0)) local_gb = int(node.properties.get('local_gb', 0)) - cpu_arch = str(node.properties.get('cpu_arch', 'NotFound')) + try: + cpu_arch = arch.canonicalize(node.properties.get('cpu_arch', None)) + except exception.InvalidArchitectureName: + cpu_arch = None + if not cpu_arch: + LOG.warn(_LW("cpu_arch not defined for node '%s'"), node.uuid) nodes_extra_specs = self.extra_specs.copy()