diff --git a/ironic/common/driver_factory.py b/ironic/common/driver_factory.py index a51e7bc54a..9ab997a8ec 100644 --- a/ironic/common/driver_factory.py +++ b/ironic/common/driver_factory.py @@ -175,10 +175,19 @@ def default_interface(driver_or_hw_type, interface_type, hardware_type.AbstractHardwareType) # Explicit interface defaults additional_defaults = { - 'network': 'flat' if CONF.dhcp.dhcp_provider == 'neutron' else 'noop', 'storage': 'noop' } + if not is_hardware_type: + # For non hardware types we need to set a fallback for the network + # interface however hardware_types specify their own defaults if not in + # the config file. + if (CONF.dhcp.dhcp_provider == 'neutron' and + 'flat' in CONF.enabled_network_interfaces): + additional_defaults['network'] = 'flat' + elif 'noop' in CONF.enabled_network_interfaces: + additional_defaults['network'] = 'noop' + # The fallback default from the configuration impl_name = getattr(CONF, 'default_%s_interface' % interface_type) if impl_name is None: diff --git a/ironic/drivers/fake_hardware.py b/ironic/drivers/fake_hardware.py index 6cf6f0d560..5d0776f226 100644 --- a/ironic/drivers/fake_hardware.py +++ b/ironic/drivers/fake_hardware.py @@ -80,3 +80,10 @@ class FakeHardware(hardware_type.AbstractHardwareType): def supported_vendor_interfaces(self): """List of classes of supported rescue interfaces.""" return [fake.FakeVendorB, fake.FakeVendorA] + + @property + def supported_network_interfaces(self): + # import late to avoid circular imports + from ironic.drivers.modules.network import flat + from ironic.drivers.modules.network import noop + return [flat.FlatNetwork, noop.NoopNetwork] diff --git a/ironic/tests/unit/common/test_driver_factory.py b/ironic/tests/unit/common/test_driver_factory.py index 12cb0dbe7c..9d7cbd5dc3 100644 --- a/ironic/tests/unit/common/test_driver_factory.py +++ b/ironic/tests/unit/common/test_driver_factory.py @@ -480,7 +480,8 @@ class CheckAndUpdateNodeInterfacesTestCase(db_base.DbTestCase): class DefaultInterfaceTestCase(db_base.DbTestCase): def setUp(self): super(DefaultInterfaceTestCase, self).setUp() - self.config(enabled_hardware_types=['manual-management']) + self.config(enabled_hardware_types=['manual-management'], + enabled_drivers=['fake']) self.driver = driver_factory.get_hardware_type('manual-management') def test_from_config(self): @@ -493,16 +494,27 @@ class DefaultInterfaceTestCase(db_base.DbTestCase): iface = driver_factory.default_interface(self.driver, 'storage') self.assertEqual('noop', iface) + def test_network_from_additional_defaults_hardware_type(self): + self.config(default_network_interface=None) + self.config(dhcp_provider='none', group='dhcp') + self.config(enabled_network_interfaces=['neutron']) + iface = driver_factory.default_interface(self.driver, 'network') + self.assertEqual('neutron', iface) + def test_network_from_additional_defaults(self): self.config(default_network_interface=None) self.config(dhcp_provider='none', group='dhcp') - iface = driver_factory.default_interface(self.driver, 'network') + iface = driver_factory.default_interface( + driver_factory.get_driver_or_hardware_type('fake'), + 'network') self.assertEqual('noop', iface) def test_network_from_additional_defaults_neutron_dhcp(self): self.config(default_network_interface=None) self.config(dhcp_provider='neutron', group='dhcp') - iface = driver_factory.default_interface(self.driver, 'network') + iface = driver_factory.default_interface( + driver_factory.get_driver_or_hardware_type('fake'), + 'network') self.assertEqual('flat', iface) def test_calculated_with_one(self): diff --git a/releasenotes/notes/only_default_flat_network_if_enabled-b5c6ea415239a53c.yaml b/releasenotes/notes/only_default_flat_network_if_enabled-b5c6ea415239a53c.yaml new file mode 100644 index 0000000000..5a8fd20298 --- /dev/null +++ b/releasenotes/notes/only_default_flat_network_if_enabled-b5c6ea415239a53c.yaml @@ -0,0 +1,9 @@ +--- +fixes: + - | + Fixes a bug seen when no ``default_network_interface`` is set, because the + conductor tries use the ``flat`` network interface instead even if it is + not included in the conductor's ``enabled_network_interfaces`` config + option. Resulting in `Failed to register hardware types` error. See + `bug 1744332 `_ + for more information. \ No newline at end of file