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
This commit is contained in:
parent
66b66fd629
commit
cedff4e378
@ -59,10 +59,6 @@ def _attach_interfaces_to_driver(driver, node, driver_name=None):
|
|||||||
setattr(driver, iface, impl)
|
setattr(driver, iface, impl)
|
||||||
|
|
||||||
network_iface = node.network_interface
|
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()
|
network_factory = NetworkInterfaceFactory()
|
||||||
try:
|
try:
|
||||||
net_driver = network_factory.get_driver(network_iface)
|
net_driver = network_factory.get_driver(network_iface)
|
||||||
|
@ -19,6 +19,7 @@ from oslo_versionedobjects import base as object_base
|
|||||||
|
|
||||||
from ironic.common import exception
|
from ironic.common import exception
|
||||||
from ironic.common.i18n import _
|
from ironic.common.i18n import _
|
||||||
|
from ironic.conf import CONF
|
||||||
from ironic.db import api as db_api
|
from ironic.db import api as db_api
|
||||||
from ironic.objects import base
|
from ironic.objects import base
|
||||||
from ironic.objects import fields as object_fields
|
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']
|
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
|
@base.IronicObjectRegistry.register
|
||||||
class Node(base.IronicObject, object_base.VersionedObjectDictCompat):
|
class Node(base.IronicObject, object_base.VersionedObjectDictCompat):
|
||||||
# Version 1.0: Initial version
|
# 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.15: Add get_by_port_addresses
|
||||||
# Version 1.16: Add network_interface field
|
# Version 1.16: Add network_interface field
|
||||||
# Version 1.17: Add resource_class 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()
|
dbapi = db_api.get_instance()
|
||||||
|
|
||||||
@ -108,9 +117,15 @@ class Node(base.IronicObject, object_base.VersionedObjectDictCompat):
|
|||||||
|
|
||||||
'extra': object_fields.FlexibleDictField(nullable=True),
|
'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):
|
def _validate_property_values(self, properties):
|
||||||
"""Check if the input of local_gb, cpus and memory_mb are valid.
|
"""Check if the input of local_gb, cpus and memory_mb are valid.
|
||||||
|
|
||||||
|
@ -1799,6 +1799,8 @@ class AgentMethodsTestCase(db_base.DbTestCase):
|
|||||||
def test_prepare_inband_cleaning_ports_provider_does_not_create(
|
def test_prepare_inband_cleaning_ports_provider_does_not_create(
|
||||||
self, dhcp_factory_mock, add_clean_net_mock):
|
self, dhcp_factory_mock, add_clean_net_mock):
|
||||||
self.config(group='dhcp', dhcp_provider='my_shiny_dhcp_provider')
|
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
|
dhcp_provider = dhcp_factory_mock.return_value.provider
|
||||||
del dhcp_provider.delete_cleaning_ports
|
del dhcp_provider.delete_cleaning_ports
|
||||||
del dhcp_provider.create_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(
|
def test_tear_down_inband_cleaning_ports_provider_does_not_delete(
|
||||||
self, dhcp_factory_mock, rm_clean_net_mock):
|
self, dhcp_factory_mock, rm_clean_net_mock):
|
||||||
self.config(group='dhcp', dhcp_provider='my_shiny_dhcp_provider')
|
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
|
dhcp_provider = dhcp_factory_mock.return_value.provider
|
||||||
del dhcp_provider.delete_cleaning_ports
|
del dhcp_provider.delete_cleaning_ports
|
||||||
with task_manager.acquire(
|
with task_manager.acquire(
|
||||||
|
@ -16,17 +16,22 @@
|
|||||||
import mock
|
import mock
|
||||||
from testtools.matchers import HasLength
|
from testtools.matchers import HasLength
|
||||||
|
|
||||||
|
from ironic.common import context
|
||||||
from ironic.common import exception
|
from ironic.common import exception
|
||||||
|
from ironic.conf import CONF
|
||||||
from ironic import objects
|
from ironic import objects
|
||||||
from ironic.tests.unit.db import base
|
from ironic.tests.unit.db import base
|
||||||
from ironic.tests.unit.db import utils
|
from ironic.tests.unit.db import utils
|
||||||
|
from ironic.tests.unit.objects import utils as obj_utils
|
||||||
|
|
||||||
|
|
||||||
class TestNodeObject(base.DbTestCase):
|
class TestNodeObject(base.DbTestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestNodeObject, self).setUp()
|
super(TestNodeObject, self).setUp()
|
||||||
|
self.ctxt = context.get_admin_context()
|
||||||
self.fake_node = utils.get_test_node()
|
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):
|
def test_get_by_id(self):
|
||||||
node_id = self.fake_node['id']
|
node_id = self.fake_node['id']
|
||||||
@ -191,3 +196,22 @@ class TestNodeObject(base.DbTestCase):
|
|||||||
}
|
}
|
||||||
node._validate_property_values(values['properties'])
|
node._validate_property_values(values['properties'])
|
||||||
self.assertEqual(expect, 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)
|
||||||
|
@ -404,7 +404,7 @@ class TestObject(_LocalTest, _TestObject):
|
|||||||
# version bump. It is md5 hash of object fields and remotable methods.
|
# 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.
|
# The fingerprint values should only be changed if there is a version bump.
|
||||||
expected_object_fingerprints = {
|
expected_object_fingerprints = {
|
||||||
'Node': '1.17-ed09e704576dc1b5a74abcbb727bf722',
|
'Node': '1.18-8cdb6010014b29f17ca636bef72b7800',
|
||||||
'MyObj': '1.5-4f5efe8f0fcaf182bbe1c7fe3ba858db',
|
'MyObj': '1.5-4f5efe8f0fcaf182bbe1c7fe3ba858db',
|
||||||
'Chassis': '1.3-d656e039fd8ae9f34efc232ab3980905',
|
'Chassis': '1.3-d656e039fd8ae9f34efc232ab3980905',
|
||||||
'Port': '1.6-609504503d68982a10f495659990084b',
|
'Port': '1.6-609504503d68982a10f495659990084b',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user