From cedff4e3780191f6d43d5ccfa6a1a363c728d859 Mon Sep 17 00:00:00 2001 From: Jim Rollenhagen Date: Mon, 1 Aug 2016 12:47:01 +0000 Subject: [PATCH] Move default network_interface logic in node object This patch moves the default network_interface logic into the node object using a field default value. This means if the network_interface on a node object is ever set to None it'll calculate the default to place into that field. Change-Id: I753d969b31ba2d12df4db3fc95a7d9e9ca1e4df6 Partial-Bug: #1608511 --- ironic/common/driver_factory.py | 4 ---- ironic/objects/node.py | 19 +++++++++++++-- .../unit/drivers/modules/test_deploy_utils.py | 4 ++++ ironic/tests/unit/objects/test_node.py | 24 +++++++++++++++++++ ironic/tests/unit/objects/test_objects.py | 2 +- 5 files changed, 46 insertions(+), 7 deletions(-) diff --git a/ironic/common/driver_factory.py b/ironic/common/driver_factory.py index 98800c44cc..500396a924 100644 --- a/ironic/common/driver_factory.py +++ b/ironic/common/driver_factory.py @@ -59,10 +59,6 @@ def _attach_interfaces_to_driver(driver, node, driver_name=None): setattr(driver, iface, impl) network_iface = node.network_interface - if network_iface is None: - network_iface = (CONF.default_network_interface or - ('flat' if CONF.dhcp.dhcp_provider == 'neutron' - else 'noop')) network_factory = NetworkInterfaceFactory() try: net_driver = network_factory.get_driver(network_iface) diff --git a/ironic/objects/node.py b/ironic/objects/node.py index 3d4c5d83dc..6bb03d5c87 100644 --- a/ironic/objects/node.py +++ b/ironic/objects/node.py @@ -19,6 +19,7 @@ from oslo_versionedobjects import base as object_base from ironic.common import exception from ironic.common.i18n import _ +from ironic.conf import CONF from ironic.db import api as db_api from ironic.objects import base from ironic.objects import fields as object_fields @@ -26,6 +27,13 @@ from ironic.objects import fields as object_fields REQUIRED_INT_PROPERTIES = ['local_gb', 'cpus', 'memory_mb'] +def _default_network_interface(): + network_iface = (CONF.default_network_interface or + ('flat' if CONF.dhcp.dhcp_provider == 'neutron' + else 'noop')) + return network_iface + + @base.IronicObjectRegistry.register class Node(base.IronicObject, object_base.VersionedObjectDictCompat): # Version 1.0: Initial version @@ -48,7 +56,8 @@ class Node(base.IronicObject, object_base.VersionedObjectDictCompat): # Version 1.15: Add get_by_port_addresses # Version 1.16: Add network_interface field # Version 1.17: Add resource_class field - VERSION = '1.17' + # Version 1.18: Add default setting for network_interface + VERSION = '1.18' dbapi = db_api.get_instance() @@ -108,9 +117,15 @@ class Node(base.IronicObject, object_base.VersionedObjectDictCompat): 'extra': object_fields.FlexibleDictField(nullable=True), - 'network_interface': object_fields.StringField(nullable=True), + 'network_interface': object_fields.StringField( + nullable=False, default=_default_network_interface()), } + def __init__(self, context=None, **kwargs): + self.fields['network_interface']._default = ( + _default_network_interface()) + super(Node, self).__init__(context, **kwargs) + def _validate_property_values(self, properties): """Check if the input of local_gb, cpus and memory_mb are valid. diff --git a/ironic/tests/unit/drivers/modules/test_deploy_utils.py b/ironic/tests/unit/drivers/modules/test_deploy_utils.py index 068c599a11..44626a1a72 100644 --- a/ironic/tests/unit/drivers/modules/test_deploy_utils.py +++ b/ironic/tests/unit/drivers/modules/test_deploy_utils.py @@ -1799,6 +1799,8 @@ class AgentMethodsTestCase(db_base.DbTestCase): def test_prepare_inband_cleaning_ports_provider_does_not_create( self, dhcp_factory_mock, add_clean_net_mock): self.config(group='dhcp', dhcp_provider='my_shiny_dhcp_provider') + self.node.network_interface = 'noop' + self.node.save() dhcp_provider = dhcp_factory_mock.return_value.provider del dhcp_provider.delete_cleaning_ports del dhcp_provider.create_cleaning_ports @@ -1846,6 +1848,8 @@ class AgentMethodsTestCase(db_base.DbTestCase): def test_tear_down_inband_cleaning_ports_provider_does_not_delete( self, dhcp_factory_mock, rm_clean_net_mock): self.config(group='dhcp', dhcp_provider='my_shiny_dhcp_provider') + self.node.network_interface = 'noop' + self.node.save() dhcp_provider = dhcp_factory_mock.return_value.provider del dhcp_provider.delete_cleaning_ports with task_manager.acquire( diff --git a/ironic/tests/unit/objects/test_node.py b/ironic/tests/unit/objects/test_node.py index 34690e8a6b..74d95157ec 100644 --- a/ironic/tests/unit/objects/test_node.py +++ b/ironic/tests/unit/objects/test_node.py @@ -16,17 +16,22 @@ import mock from testtools.matchers import HasLength +from ironic.common import context from ironic.common import exception +from ironic.conf import CONF from ironic import objects from ironic.tests.unit.db import base from ironic.tests.unit.db import utils +from ironic.tests.unit.objects import utils as obj_utils class TestNodeObject(base.DbTestCase): def setUp(self): super(TestNodeObject, self).setUp() + self.ctxt = context.get_admin_context() self.fake_node = utils.get_test_node() + self.node = obj_utils.get_test_node(self.ctxt, **self.fake_node) def test_get_by_id(self): node_id = self.fake_node['id'] @@ -191,3 +196,22 @@ class TestNodeObject(base.DbTestCase): } node._validate_property_values(values['properties']) self.assertEqual(expect, values['properties']) + + def test_get_network_interface_use_field(self): + CONF.set_override('default_network_interface', None) + for nif in ('neutron', 'flat', 'noop'): + self.node.network_interface = nif + self.assertEqual(nif, self.node.network_interface) + + def test_get_network_interface_use_conf(self): + for nif in ('neutron', 'flat', 'noop'): + CONF.set_override('default_network_interface', nif) + self.node = obj_utils.get_test_node(self.ctxt, **self.fake_node) + self.assertEqual(nif, self.node.network_interface) + + def test_get_network_interface_use_dhcp_provider(self): + CONF.set_override('default_network_interface', None) + for dhcp, nif in (('neutron', 'flat'), ('none', 'noop')): + CONF.set_override('dhcp_provider', dhcp, 'dhcp') + self.node = obj_utils.get_test_node(self.ctxt, **self.fake_node) + self.assertEqual(nif, self.node.network_interface) diff --git a/ironic/tests/unit/objects/test_objects.py b/ironic/tests/unit/objects/test_objects.py index b734031d76..bd21bd950f 100644 --- a/ironic/tests/unit/objects/test_objects.py +++ b/ironic/tests/unit/objects/test_objects.py @@ -404,7 +404,7 @@ class TestObject(_LocalTest, _TestObject): # version bump. It is md5 hash of object fields and remotable methods. # The fingerprint values should only be changed if there is a version bump. expected_object_fingerprints = { - 'Node': '1.17-ed09e704576dc1b5a74abcbb727bf722', + 'Node': '1.18-8cdb6010014b29f17ca636bef72b7800', 'MyObj': '1.5-4f5efe8f0fcaf182bbe1c7fe3ba858db', 'Chassis': '1.3-d656e039fd8ae9f34efc232ab3980905', 'Port': '1.6-609504503d68982a10f495659990084b',