diff --git a/etc/ironic/ironic.conf.sample b/etc/ironic/ironic.conf.sample index 405a66003f..d7ed6fc41e 100644 --- a/etc/ironic/ironic.conf.sample +++ b/etc/ironic/ironic.conf.sample @@ -260,7 +260,7 @@ # this value, please make sure that every enabled hardware # type will have the same set of enabled vendor interfaces on # every ironic-conductor service. (list value) -#enabled_vendor_interfaces = no-vendor +#enabled_vendor_interfaces = ipmitool,no-vendor # Default vendor interface to be used for nodes that do not # have vendor_interface field set. A complete list of vendor diff --git a/ironic/conf/default.py b/ironic/conf/default.py index de45b7e11e..1eaa8e49b3 100644 --- a/ironic/conf/default.py +++ b/ironic/conf/default.py @@ -140,7 +140,7 @@ driver_opts = [ cfg.StrOpt('default_storage_interface', help=_DEFAULT_IFACE_HELP.format('storage')), cfg.ListOpt('enabled_vendor_interfaces', - default=['no-vendor'], + default=['ipmitool', 'no-vendor'], help=_ENABLED_IFACE_HELP.format('vendor')), cfg.StrOpt('default_vendor_interface', help=_DEFAULT_IFACE_HELP.format('vendor')), diff --git a/ironic/drivers/ipmi.py b/ironic/drivers/ipmi.py index 6e95462f7e..3319f0eea8 100644 --- a/ironic/drivers/ipmi.py +++ b/ironic/drivers/ipmi.py @@ -47,6 +47,11 @@ class IPMIHardware(generic.GenericHardware): """List of supported power interfaces.""" return [ipmitool.IPMIPower] + @property + def supported_vendor_interfaces(self): + """List of supported vendor interfaces.""" + return [ipmitool.VendorPassthru, noop.NoVendor] + class PXEAndIPMIToolDriver(base.BaseDriver): """PXE + IPMITool driver. diff --git a/ironic/tests/unit/drivers/test_ipmi.py b/ironic/tests/unit/drivers/test_ipmi.py index c12e6dda6c..99e260708e 100644 --- a/ironic/tests/unit/drivers/test_ipmi.py +++ b/ironic/tests/unit/drivers/test_ipmi.py @@ -31,7 +31,8 @@ class IPMIHardwareTestCase(db_base.DbTestCase): enabled_power_interfaces=['ipmitool'], enabled_management_interfaces=['ipmitool'], enabled_raid_interfaces=['no-raid', 'agent'], - enabled_console_interfaces=['no-console']) + enabled_console_interfaces=['no-console'], + enabled_vendor_interfaces=['ipmitool', 'no-vendor']) def test_default_interfaces(self): node = obj_utils.create_test_node(self.context, driver='ipmi') @@ -43,6 +44,7 @@ class IPMIHardwareTestCase(db_base.DbTestCase): self.assertIsInstance(task.driver.deploy, iscsi_deploy.ISCSIDeploy) self.assertIsInstance(task.driver.console, noop.NoConsole) self.assertIsInstance(task.driver.raid, noop.NoRAID) + self.assertIsInstance(task.driver.vendor, ipmitool.VendorPassthru) def test_override_with_shellinabox(self): self.config(enabled_console_interfaces=['ipmitool-shellinabox', @@ -51,7 +53,8 @@ class IPMIHardwareTestCase(db_base.DbTestCase): self.context, driver='ipmi', deploy_interface='direct', raid_interface='agent', - console_interface='ipmitool-shellinabox') + console_interface='ipmitool-shellinabox', + vendor_interface='no-vendor') with task_manager.acquire(self.context, node.id) as task: self.assertIsInstance(task.driver.management, ipmitool.IPMIManagement) @@ -61,6 +64,7 @@ class IPMIHardwareTestCase(db_base.DbTestCase): self.assertIsInstance(task.driver.console, ipmitool.IPMIShellinaboxConsole) self.assertIsInstance(task.driver.raid, agent.AgentRAID) + self.assertIsInstance(task.driver.vendor, noop.NoVendor) class IPMIClassicDriversTestCase(testtools.TestCase): diff --git a/releasenotes/notes/ipmitool-vendor-3f0f52240ebbe489.yaml b/releasenotes/notes/ipmitool-vendor-3f0f52240ebbe489.yaml new file mode 100644 index 0000000000..bba7113711 --- /dev/null +++ b/releasenotes/notes/ipmitool-vendor-3f0f52240ebbe489.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + The ``ipmi`` hardware type now supports ``ipmitool`` vendor interface + (similar to classic ipmitool drivers). diff --git a/setup.cfg b/setup.cfg index 5e7f184549..7077169c38 100644 --- a/setup.cfg +++ b/setup.cfg @@ -141,6 +141,7 @@ ironic.hardware.interfaces.storage = ironic.hardware.interfaces.vendor = fake = ironic.drivers.modules.fake:FakeVendorB + ipmitool = ironic.drivers.modules.ipmitool:VendorPassthru no-vendor = ironic.drivers.modules.noop:NoVendor ironic.hardware.types =