Remove the ipmitool classic drivers

This change removes pxe_ipmitool and agent_ipmitool. Some tests
and documentation bits are removed, since we no longer have any
classic drivers to provide examples.

The Inspector.create_if_enabled method is no longer used and was
removed. The [inspector]enabled option will be deprecated in
a follow-up.

IRONIC_ENABLED_DRIVERS is removed from devstack to prevent
devstack-gate from injecting the removed drivers into it.
A temporary migration from queens is updated to disable all
classic drivers. It will be removed when the enabled_drivers
option is completely removed.

Change-Id: Iab247e3b3336f90446ef0687edb340cf8282a925
This commit is contained in:
Dmitry Tantsur 2018-06-26 14:51:35 +02:00
parent 3d8f3ec1a9
commit 1a07137118
18 changed files with 38 additions and 368 deletions

View File

@ -101,7 +101,7 @@ IRONIC_HW_ARCH=${IRONIC_HW_ARCH:-x86_64}
# 192.168.110.107 00:1e:67:57:50:4c root otc123 # 192.168.110.107 00:1e:67:57:50:4c root otc123
# #
# Supported IRONIC_DEPLOY_DRIVERs: # Supported IRONIC_DEPLOY_DRIVERs:
# *_ipmitool or ipmi: # ipmi:
# <BMC address> <MAC address> <BMC username> <BMC password> # <BMC address> <MAC address> <BMC username> <BMC password>
# #
# cisco-ucs-standalone: # cisco-ucs-standalone:
@ -156,13 +156,6 @@ if [[ -n "$IRONIC_DEFAULT_API_VERSION" ]]; then
IRONIC_CMD="$IRONIC_CMD --os-baremetal-api-version $IRONIC_DEFAULT_API_VERSION" IRONIC_CMD="$IRONIC_CMD --os-baremetal-api-version $IRONIC_DEFAULT_API_VERSION"
fi fi
# driver / hardware type options
IRONIC_ENABLED_DRIVERS=${IRONIC_ENABLED_DRIVERS:-pxe_ipmitool,agent_ipmitool}
# NOTE(dtantsur): some places (I'm looking at you, devstack-gate) still
# hardcode "fake", and we cannot fix them without breaking stable branches.
# This ugly hack is only needed until we delete IRONIC_ENABLED_DRIVERS
# in the near future.
IRONIC_ENABLED_DRIVERS=$(echo $IRONIC_ENABLED_DRIVERS | sed -r 's/fake,?//')
IRONIC_ENABLED_HARDWARE_TYPES=${IRONIC_ENABLED_HARDWARE_TYPES:-"ipmi,fake-hardware"} IRONIC_ENABLED_HARDWARE_TYPES=${IRONIC_ENABLED_HARDWARE_TYPES:-"ipmi,fake-hardware"}
# list of all available driver interfaces types # list of all available driver interfaces types
IRONIC_DRIVER_INTERFACE_TYPES="bios boot power management deploy console inspect raid rescue storage network vendor" IRONIC_DRIVER_INTERFACE_TYPES="bios boot power management deploy console inspect raid rescue storage network vendor"
@ -289,16 +282,16 @@ if [[ "$IRONIC_DEPLOY_ISO_REQUIRED" = "True" \
or set IRONIC_BUILD_DEPLOY_RAMDISK=True to use ISOs" or set IRONIC_BUILD_DEPLOY_RAMDISK=True to use ISOs"
fi fi
# Which deploy driver to use - valid choices right now # Which deploy driver to use - valid choices right now
# are ``pxe_ipmitool``, ``agent_ipmitool``, ``snmp`` and ``ipmi``. # are ``ipmi``, ``snmp`` and ``redfish``.
# #
# Additional valid choices if IRONIC_IS_HARDWARE == true are: # Additional valid choices if IRONIC_IS_HARDWARE == true are:
# ``cisco-ucs-managed``, ``cisco-ucs-standalone``, ``oneview`` and ``idrac``. # ``cisco-ucs-managed``, ``cisco-ucs-standalone``, ``oneview`` and ``idrac``.
IRONIC_DEPLOY_DRIVER=${IRONIC_DEPLOY_DRIVER:-pxe_ipmitool} IRONIC_DEPLOY_DRIVER=${IRONIC_DEPLOY_DRIVER:-ipmi}
# If the requested driver is not yet enable, enable it, if it is not it will fail anyway # If the requested driver is not yet enable, enable it, if it is not it will fail anyway
if [[ -z "$(echo ${IRONIC_ENABLED_DRIVERS},${IRONIC_ENABLED_HARDWARE_TYPES} | grep -w ${IRONIC_DEPLOY_DRIVER})" ]]; then if [[ -z "$(echo ${IRONIC_ENABLED_HARDWARE_TYPES} | grep -w ${IRONIC_DEPLOY_DRIVER})" ]]; then
die "The deploy driver $IRONIC_DEPLOY_DRIVER is not in the list of enabled \ die "The deploy driver $IRONIC_DEPLOY_DRIVER is not in the list of enabled \
drivers $IRONIC_ENABLED_DRIVERS or hardware types $IRONIC_ENABLED_HARDWARE_TYPES" hardware types $IRONIC_ENABLED_HARDWARE_TYPES"
fi fi
# Support entry points installation of console scripts # Support entry points installation of console scripts
@ -613,8 +606,8 @@ function is_deployed_by_agent {
return 1 return 1
} }
function is_deployed_by_ipmitool { function is_deployed_by_ipmi {
[[ "$IRONIC_DEPLOY_DRIVER" == ipmi || -z "${IRONIC_DEPLOY_DRIVER##*_ipmitool}" ]] && return 0 [[ "$IRONIC_DEPLOY_DRIVER" == ipmi ]] && return 0
return 1 return 1
} }
@ -873,7 +866,7 @@ function install_ironic {
restart_libvirt restart_libvirt
fi fi
if is_deployed_by_ipmitool && [[ "$IRONIC_IS_HARDWARE" == "False" ]]; then if is_deployed_by_ipmi && [[ "$IRONIC_IS_HARDWARE" == "False" ]]; then
setup_virtualbmc setup_virtualbmc
fi fi
@ -1221,7 +1214,6 @@ function configure_ironic_conductor {
configure_rootwrap ironic configure_rootwrap ironic
# set up drivers / hardware types # set up drivers / hardware types
iniset $IRONIC_CONF_FILE DEFAULT enabled_drivers $IRONIC_ENABLED_DRIVERS
iniset $IRONIC_CONF_FILE DEFAULT enabled_hardware_types $IRONIC_ENABLED_HARDWARE_TYPES iniset $IRONIC_CONF_FILE DEFAULT enabled_hardware_types $IRONIC_ENABLED_HARDWARE_TYPES
# configure enabled and default interfaces # configure enabled and default interfaces
@ -1820,7 +1812,7 @@ function enroll_nodes {
local ironic_node_arch=x86_64 local ironic_node_arch=x86_64
local ironic_hwinfo_file=$IRONIC_VM_MACS_CSV_FILE local ironic_hwinfo_file=$IRONIC_VM_MACS_CSV_FILE
if is_deployed_by_ipmitool; then if is_deployed_by_ipmi; then
local node_options="\ local node_options="\
--driver-info ipmi_address=${HOST_IP} \ --driver-info ipmi_address=${HOST_IP} \
--driver-info ipmi_username=admin \ --driver-info ipmi_username=admin \
@ -1873,7 +1865,7 @@ function enroll_nodes {
if [[ "$IRONIC_IS_HARDWARE" == "False" ]]; then if [[ "$IRONIC_IS_HARDWARE" == "False" ]]; then
interface_info=$(echo $hardware_info | awk '{print $1}') interface_info=$(echo $hardware_info | awk '{print $1}')
if is_deployed_by_ipmitool; then if is_deployed_by_ipmi; then
local vbmc_port local vbmc_port
vbmc_port=$(echo $hardware_info | awk '{print $2}') vbmc_port=$(echo $hardware_info | awk '{print $2}')
node_options+=" --driver-info ipmi_port=$vbmc_port" node_options+=" --driver-info ipmi_port=$vbmc_port"
@ -1921,7 +1913,7 @@ function enroll_nodes {
bmc_passwd=$(echo $hardware_info |awk '{print $4}') bmc_passwd=$(echo $hardware_info |awk '{print $4}')
local node_options="$common_node_options" local node_options="$common_node_options"
if is_deployed_by_ipmitool; then if is_deployed_by_ipmi; then
node_options+=" --driver-info ipmi_address=$bmc_address \ node_options+=" --driver-info ipmi_address=$bmc_address \
--driver-info ipmi_password=$bmc_passwd \ --driver-info ipmi_password=$bmc_passwd \
--driver-info ipmi_username=$bmc_username" --driver-info ipmi_username=$bmc_username"
@ -2515,7 +2507,7 @@ function ironic_configure_tempest {
iniset $TEMPEST_CONFIG baremetal whole_disk_image_checksum $(md5sum $FILES/${IRONIC_WHOLEDISK_IMAGE_NAME}.img) iniset $TEMPEST_CONFIG baremetal whole_disk_image_checksum $(md5sum $FILES/${IRONIC_WHOLEDISK_IMAGE_NAME}.img)
fi fi
iniset $TEMPEST_CONFIG baremetal enabled_drivers $IRONIC_ENABLED_DRIVERS iniset $TEMPEST_CONFIG baremetal enabled_drivers ""
iniset $TEMPEST_CONFIG baremetal enabled_hardware_types $IRONIC_ENABLED_HARDWARE_TYPES iniset $TEMPEST_CONFIG baremetal enabled_hardware_types $IRONIC_ENABLED_HARDWARE_TYPES
iniset $TEMPEST_CONFIG baremetal enabled_bios_interfaces $IRONIC_ENABLED_BIOS_INTERFACES iniset $TEMPEST_CONFIG baremetal enabled_bios_interfaces $IRONIC_ENABLED_BIOS_INTERFACES
iniset $TEMPEST_CONFIG baremetal enabled_deploy_interfaces $IRONIC_ENABLED_DEPLOY_INTERFACES iniset $TEMPEST_CONFIG baremetal enabled_deploy_interfaces $IRONIC_ENABLED_DEPLOY_INTERFACES

View File

@ -1,5 +1,5 @@
function configure_ironic_upgrade { function configure_ironic_upgrade {
# Remove the fake driver from the configuration (forced by devstack-gate) # Remove the classic drivers from the configuration (forced by devstack-gate)
drivers=$(iniget $IRONIC_CONF_FILE DEFAULT enabled_drivers | sed -r 's/fake,?//') # TODO(dtantsur): remove when classic drivers are removed
iniset $IRONIC_CONF_FILE DEFAULT enabled_drivers $drivers sed -i '/^enabled_drivers/d' $IRONIC_CONF_FILE
} }

View File

@ -1,29 +1,15 @@
=============== ===========
IPMITool driver IPMI driver
=============== ===========
Overview Overview
======== ========
The IPMI_ (Intelligent Platform Management Interface) drivers manage nodes The ``ipmi`` hardware type manage nodes by using IPMI_ (Intelligent Platform
by using IPMI protocol versions 2.0 or 1.5. They use the IPMItool_ utility Management Interface) protocol versions 2.0 or 1.5. It uses the IPMItool_
which is an open-source command-line interface (CLI) for controlling utility which is an open-source command-line interface (CLI) for controlling
IPMI-enabled devices. IPMI-enabled devices.
The following hardware types and classic drivers use IPMItool for power and
management:
* hardware types:
* ``ipmi``
* classic drivers:
* ``agent_ipmitool``
* ``pxe_ipmitool``
* ``agent_ipmitool_socat``
* ``pxe_ipmitool_socat``
Glossary Glossary
======== ========
@ -32,7 +18,7 @@ Glossary
* BMC_ - Baseboard Management Controller. * BMC_ - Baseboard Management Controller.
* RMCP - Remote Management Control Protocol. * RMCP - Remote Management Control Protocol.
Enabling the IPMItool driver(s) Enabling the IPMI hardware type
=============================== ===============================
Please see :doc:`/install/configure-ipmi` for the required dependencies. Please see :doc:`/install/configure-ipmi` for the required dependencies.
@ -49,12 +35,11 @@ Please see :doc:`/install/configure-ipmi` for the required dependencies.
Please see :doc:`/install/enabling-drivers` for more details. Please see :doc:`/install/enabling-drivers` for more details.
Registering a node with the IPMItool driver Registering a node with the IPMI driver
=========================================== =======================================
Nodes configured to use the IPMItool drivers should have the ``driver`` field Nodes configured to use the IPMItool drivers should have the ``driver`` field
set to ``ipmi`` (hardware type) or to the name of one of the classic drivers set to ``ipmi``.
that support IPMItool.
The following configuration value is required and has to be added to The following configuration value is required and has to be added to
the node's ``driver_info`` field: the node's ``driver_info`` field:

View File

@ -86,14 +86,6 @@ enabled to use it:
[DEFAULT] [DEFAULT]
enabled_inspect_interfaces = inspector,no-inspect enabled_inspect_interfaces = inspector,no-inspect
If using classic drivers supporting in-band inspection, like ``pxe_ipmitool``,
another option has to be set as well:
.. code-block:: ini
[inspector]
enabled = True
You must additionally install python-ironic-inspector-client_ to use You must additionally install python-ironic-inspector-client_ to use
this functionality. this functionality.

View File

@ -262,10 +262,6 @@ default:
enabled_deploy_interfaces = enabled_deploy_interfaces =
direct direct
iscsi iscsi
enabled_drivers =
agent_ipmitool
fake
pxe_ipmitool
enabled_hardware_types = enabled_hardware_types =
ipmi ipmi
redfish redfish

View File

@ -6,9 +6,8 @@ Introduction
The Bare Metal service delegates actual hardware management to **drivers**. The Bare Metal service delegates actual hardware management to **drivers**.
Starting with the Ocata release, two types of drivers are supported: Starting with the Ocata release, two types of drivers are supported:
*classic drivers* (for example, ``pxe_ipmitool``, etc.) and *classic drivers* and the newer *hardware types* (for example, generic
the newer *hardware types* (for example, generic ``redfish`` and ``ipmi`` ``redfish`` and ``ipmi`` or vendor-specific ``ilo`` and ``irmc``).
or vendor-specific ``ilo`` and ``irmc``).
Drivers, in turn, consist of *hardware interfaces*: sets of functionality Drivers, in turn, consist of *hardware interfaces*: sets of functionality
dealing with some aspect of bare metal provisioning in a vendor-specific way. dealing with some aspect of bare metal provisioning in a vendor-specific way.
@ -301,32 +300,6 @@ existing nodes.
support the provided default implementation, its users will have to always support the provided default implementation, its users will have to always
provide an explicit value for this interface when creating a node. provide an explicit value for this interface when creating a node.
Enabling classic drivers
------------------------
Classic drivers are enabled in the configuration file of the
**ironic-conductor** service by setting the ``enabled_drivers`` configuration
option, for example:
.. code-block:: ini
[DEFAULT]
enabled_drivers = pxe_ipmitool
The names in this comma-separated list are entry point names of the drivers.
They have to be available at conductor start-up, and all dependencies must
be installed locally. For example,
* drivers starting with ``pxe`` and some drivers starting with ``agent``
require :doc:`configure-pxe`,
* drivers starting with ``pxe`` or having ``iscsi`` in their name require
:doc:`configure-iscsi`,
* drivers ending with ``ipmitool`` require :doc:`configure-ipmi`.
See :doc:`/admin/drivers` for the required configuration of each driver.
.. _driver composition reform specification: https://specs.openstack.org/openstack/ironic-specs/specs/approved/driver-composition-reform.html .. _driver composition reform specification: https://specs.openstack.org/openstack/ironic-specs/specs/approved/driver-composition-reform.html
.. _setup.cfg: https://git.openstack.org/cgit/openstack/ironic/tree/setup.cfg .. _setup.cfg: https://git.openstack.org/cgit/openstack/ironic/tree/setup.cfg
.. _ironic-inspector: https://docs.openstack.org/ironic-inspector/latest/ .. _ironic-inspector: https://docs.openstack.org/ironic-inspector/latest/

View File

@ -42,7 +42,6 @@ to list all drivers enabled on all hosts:
| Supported driver(s) | Active host(s) | | Supported driver(s) | Active host(s) |
+---------------------+-----------------------+ +---------------------+-----------------------+
| ipmi | localhost.localdomain | | ipmi | localhost.localdomain |
| pxe_ipmitool | localhost.localdomain |
+---------------------+-----------------------+ +---------------------+-----------------------+
Starting with API version 1.31 (and ``python-ironicclient`` 1.13), you can Starting with API version 1.31 (and ``python-ironicclient`` 1.13), you can

View File

@ -90,7 +90,7 @@ api_opts = [
driver_opts = [ driver_opts = [
cfg.ListOpt('enabled_drivers', cfg.ListOpt('enabled_drivers',
default=['pxe_ipmitool'], default=[],
help=_('Specify the list of drivers to load during service ' help=_('Specify the list of drivers to load during service '
'initialization. Missing drivers, or drivers which ' 'initialization. Missing drivers, or drivers which '
'fail to initialize, will prevent the conductor ' 'fail to initialize, will prevent the conductor '

View File

@ -138,7 +138,7 @@ class Connection(object):
'instance_uuid': None, 'instance_uuid': None,
'power_state': states.POWER_OFF, 'power_state': states.POWER_OFF,
'provision_state': states.AVAILABLE, 'provision_state': states.AVAILABLE,
'driver': 'pxe_ipmitool', 'driver': 'ipmi',
'driver_info': { ... }, 'driver_info': { ... },
'properties': { ... }, 'properties': { ... },
'extra': { ... }, 'extra': { ... },

View File

@ -1,20 +0,0 @@
# Copyright 2014 Rackspace, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from ironic.drivers import ipmi
# For backward compatibility
AgentAndIPMIToolDriver = ipmi.AgentAndIPMIToolDriver
AgentAndIPMIToolAndSocatDriver = ipmi.AgentAndIPMIToolAndSocatDriver

View File

@ -14,19 +14,9 @@
Hardware types and classic drivers for IPMI (using ipmitool). Hardware types and classic drivers for IPMI (using ipmitool).
""" """
from oslo_config import cfg
from ironic.drivers import base
from ironic.drivers import generic from ironic.drivers import generic
from ironic.drivers.modules import agent
from ironic.drivers.modules import inspector
from ironic.drivers.modules import ipmitool from ironic.drivers.modules import ipmitool
from ironic.drivers.modules import iscsi_deploy
from ironic.drivers.modules import noop from ironic.drivers.modules import noop
from ironic.drivers.modules import pxe
CONF = cfg.CONF
class IPMIHardware(generic.GenericHardware): class IPMIHardware(generic.GenericHardware):
@ -56,126 +46,3 @@ class IPMIHardware(generic.GenericHardware):
def supported_vendor_interfaces(self): def supported_vendor_interfaces(self):
"""List of supported vendor interfaces.""" """List of supported vendor interfaces."""
return [ipmitool.VendorPassthru, noop.NoVendor] return [ipmitool.VendorPassthru, noop.NoVendor]
def _to_hardware_type():
# NOTE(dtantsur): classic drivers are not affected by the
# enabled_inspect_interfaces configuration option.
if CONF.inspector.enabled:
inspect_interface = 'inspector'
else:
inspect_interface = 'no-inspect'
return {'boot': 'pxe',
'inspect': inspect_interface,
'management': 'ipmitool',
'power': 'ipmitool',
'raid': 'agent',
'vendor': 'ipmitool'}
class PXEAndIPMIToolDriver(base.BaseDriver):
"""PXE + IPMITool driver.
This driver implements the `core` functionality, combining
:class:`ironic.drivers.modules.ipmitool.IPMIPower` for power on/off
and reboot with
:class:`ironic.drivers.modules.iscsi_deploy.ISCSIDeploy` for
image deployment. Implementations are in those respective
classes; this class is merely the glue between them.
"""
def __init__(self):
self.power = ipmitool.IPMIPower()
self.console = ipmitool.IPMIShellinaboxConsole()
self.boot = pxe.PXEBoot()
self.deploy = iscsi_deploy.ISCSIDeploy()
self.management = ipmitool.IPMIManagement()
self.inspect = inspector.Inspector.create_if_enabled(
'PXEAndIPMIToolDriver')
self.vendor = ipmitool.VendorPassthru()
self.raid = agent.AgentRAID()
@classmethod
def to_hardware_type(cls):
return 'ipmi', dict(_to_hardware_type(),
console='ipmitool-shellinabox',
deploy='iscsi')
class PXEAndIPMIToolAndSocatDriver(PXEAndIPMIToolDriver):
"""PXE + IPMITool + socat driver.
This driver implements the `core` functionality, combining
:class:`ironic.drivers.modules.ipmitool.IPMIPower` for power on/off
and reboot with
:class:`ironic.drivers.modules.iscsi_deploy.ISCSIDeploy` (for
image deployment) and with
:class:`ironic.drivers.modules.ipmitool.IPMISocatConsole`.
This driver uses the socat console interface instead of the shellinabox
one.
Implementations are in those respective
classes; this class is merely the glue between them.
"""
def __init__(self):
PXEAndIPMIToolDriver.__init__(self)
self.console = ipmitool.IPMISocatConsole()
@classmethod
def to_hardware_type(cls):
return 'ipmi', dict(_to_hardware_type(),
console='ipmitool-socat',
deploy='iscsi')
class AgentAndIPMIToolDriver(base.BaseDriver):
"""Agent + IPMITool driver.
This driver implements the `core` functionality, combining
:class:`ironic.drivers.modules.ipmitool.IPMIPower` (for power on/off and
reboot) with :class:`ironic.drivers.modules.agent.AgentDeploy` (for
image deployment).
Implementations are in those respective classes; this class is merely the
glue between them.
"""
def __init__(self):
self.power = ipmitool.IPMIPower()
self.boot = pxe.PXEBoot()
self.deploy = agent.AgentDeploy()
self.management = ipmitool.IPMIManagement()
self.console = ipmitool.IPMIShellinaboxConsole()
self.vendor = ipmitool.VendorPassthru()
self.raid = agent.AgentRAID()
self.inspect = inspector.Inspector.create_if_enabled(
'AgentAndIPMIToolDriver')
@classmethod
def to_hardware_type(cls):
return 'ipmi', dict(_to_hardware_type(),
console='ipmitool-shellinabox',
deploy='direct')
class AgentAndIPMIToolAndSocatDriver(AgentAndIPMIToolDriver):
"""Agent + IPMITool + socat driver.
This driver implements the `core` functionality, combining
:class:`ironic.drivers.modules.ipmitool.IPMIPower` (for power on/off and
reboot) with :class:`ironic.drivers.modules.agent.AgentDeploy` (for
image deployment) and with
:class:`ironic.drivers.modules.ipmitool.IPMISocatConsole`.
This driver uses the socat console interface instead of the shellinabox
one.
Implementations are in those respective classes; this class is merely the
glue between them.
"""
def __init__(self):
AgentAndIPMIToolDriver.__init__(self)
self.console = ipmitool.IPMISocatConsole()
@classmethod
def to_hardware_type(cls):
return 'ipmi', dict(_to_hardware_type(),
console='ipmitool-socat',
deploy='direct')

View File

@ -74,21 +74,6 @@ def _get_client(context):
class Inspector(base.InspectInterface): class Inspector(base.InspectInterface):
"""In-band inspection via ironic-inspector project.""" """In-band inspection via ironic-inspector project."""
@classmethod
def create_if_enabled(cls, driver_name):
"""Create instance of Inspector if it's enabled.
Reports log warning with given driver_name if it's not.
:return: Inspector instance or None
"""
if CONF.inspector.enabled:
return cls()
else:
LOG.info("Inspection via ironic-inspector is disabled in "
"configuration for driver %s. To enable, change "
"[inspector] enabled = True.", driver_name)
def __init__(self): def __init__(self):
if not client: if not client:
raise exception.DriverLoadError( raise exception.DriverLoadError(

View File

@ -421,13 +421,6 @@ class HardwareTypeLoadTestCase(db_base.DbTestCase):
self.assertRaises(exception.DriverNotFound, self.assertRaises(exception.DriverNotFound,
driver_factory.get_hardware_type, 'fake_agent') driver_factory.get_hardware_type, 'fake_agent')
def test_get_driver_or_hardware_type(self):
self.config(enabled_drivers=['pxe_ipmitool'])
hw_type = driver_factory.get_driver_or_hardware_type('fake-hardware')
self.assertIsInstance(hw_type, fake_hardware.FakeHardware)
driver = driver_factory.get_driver_or_hardware_type('pxe_ipmitool')
self.assertNotIsInstance(driver, fake_hardware.FakeHardware)
def test_get_driver_or_hardware_type_missing(self): def test_get_driver_or_hardware_type_missing(self):
self.assertRaises(exception.DriverNotFound, self.assertRaises(exception.DriverNotFound,
driver_factory.get_driver_or_hardware_type, driver_factory.get_driver_or_hardware_type,

View File

@ -15,8 +15,6 @@ import ironic_inspector_client as client
import mock import mock
from ironic.common import context from ironic.common import context
from ironic.common import driver_factory
from ironic.common import exception
from ironic.common import states from ironic.common import states
from ironic.conductor import task_manager from ironic.conductor import task_manager
from ironic.drivers.modules import inspector from ironic.drivers.modules import inspector
@ -24,34 +22,6 @@ from ironic.tests.unit.db import base as db_base
from ironic.tests.unit.objects import utils as obj_utils from ironic.tests.unit.objects import utils as obj_utils
class DisabledTestCase(db_base.DbTestCase):
def _do_mock(self):
# NOTE(dtantsur): fake driver always has inspection, using another one
self.config(enabled_drivers=['pxe_ipmitool'])
self.driver = driver_factory.get_driver("pxe_ipmitool")
def test_disabled(self):
self.config(enabled=False, group='inspector')
self._do_mock()
self.assertIsNone(self.driver.inspect)
# Direct loading of the class is still possible
inspector.Inspector()
def test_enabled(self):
self.config(enabled=True, group='inspector')
self._do_mock()
self.assertIsNotNone(self.driver.inspect)
@mock.patch.object(inspector, 'client', None)
def test_init_inspector_not_imported(self):
self.assertRaises(exception.DriverLoadError,
inspector.Inspector)
def test_init_ok(self):
self.config(enabled=True, group='inspector')
inspector.Inspector()
@mock.patch('ironic.common.keystone.get_adapter', autospec=True) @mock.patch('ironic.common.keystone.get_adapter', autospec=True)
@mock.patch('ironic.common.keystone.get_service_auth', autospec=True, @mock.patch('ironic.common.keystone.get_service_auth', autospec=True,
return_value=mock.sentinel.sauth) return_value=mock.sentinel.sauth)
@ -132,17 +102,6 @@ class CommonFunctionsTestCase(BaseTestCase):
res = self.iface.get_properties() res = self.iface.get_properties()
self.assertEqual({}, res) self.assertEqual({}, res)
def test_create_if_enabled(self):
res = inspector.Inspector.create_if_enabled('driver')
self.assertIsInstance(res, inspector.Inspector)
@mock.patch.object(inspector.LOG, 'info', autospec=True)
def test_create_if_enabled_disabled(self, warn_mock):
self.config(enabled=False, group='inspector')
res = inspector.Inspector.create_if_enabled('driver')
self.assertIsNone(res)
self.assertTrue(warn_mock.called)
@mock.patch.object(eventlet, 'spawn_n', lambda f, *a, **kw: f(*a, **kw)) @mock.patch.object(eventlet, 'spawn_n', lambda f, *a, **kw: f(*a, **kw))
@mock.patch('ironic.drivers.modules.inspector._get_client', autospec=True) @mock.patch('ironic.drivers.modules.inspector._get_client', autospec=True)

View File

@ -10,10 +10,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import testtools
from ironic.conductor import task_manager from ironic.conductor import task_manager
from ironic.drivers import ipmi
from ironic.drivers.modules import agent from ironic.drivers.modules import agent
from ironic.drivers.modules import ipmitool from ironic.drivers.modules import ipmitool
from ironic.drivers.modules import iscsi_deploy from ironic.drivers.modules import iscsi_deploy
@ -102,52 +99,3 @@ class IPMIHardwareTestCase(db_base.DbTestCase):
rescue_interface='agent') rescue_interface='agent')
with task_manager.acquire(self.context, node.id) as task: with task_manager.acquire(self.context, node.id) as task:
self._validate_interfaces(task, rescue=agent.AgentRescue) self._validate_interfaces(task, rescue=agent.AgentRescue)
class IPMIClassicDriversTestCase(testtools.TestCase):
def test_pxe_ipmitool_driver(self):
driver = ipmi.PXEAndIPMIToolDriver()
self.assertIsInstance(driver.power, ipmitool.IPMIPower)
self.assertIsInstance(driver.console, ipmitool.IPMIShellinaboxConsole)
self.assertIsInstance(driver.boot, pxe.PXEBoot)
self.assertIsInstance(driver.deploy, iscsi_deploy.ISCSIDeploy)
self.assertIsInstance(driver.management, ipmitool.IPMIManagement)
self.assertIsNone(driver.inspect)
self.assertIsInstance(driver.vendor, ipmitool.VendorPassthru)
self.assertIsInstance(driver.raid, agent.AgentRAID)
def test_pxe_ipmitool_socat_driver(self):
driver = ipmi.PXEAndIPMIToolAndSocatDriver()
self.assertIsInstance(driver.power, ipmitool.IPMIPower)
self.assertIsInstance(driver.console, ipmitool.IPMISocatConsole)
self.assertIsInstance(driver.boot, pxe.PXEBoot)
self.assertIsInstance(driver.deploy, iscsi_deploy.ISCSIDeploy)
self.assertIsInstance(driver.management, ipmitool.IPMIManagement)
self.assertIsNone(driver.inspect)
self.assertIsInstance(driver.vendor, ipmitool.VendorPassthru)
self.assertIsInstance(driver.raid, agent.AgentRAID)
def test_agent_ipmitool_driver(self):
driver = ipmi.AgentAndIPMIToolDriver()
self.assertIsInstance(driver.power, ipmitool.IPMIPower)
self.assertIsInstance(driver.console, ipmitool.IPMIShellinaboxConsole)
self.assertIsInstance(driver.boot, pxe.PXEBoot)
self.assertIsInstance(driver.deploy, agent.AgentDeploy)
self.assertIsInstance(driver.management, ipmitool.IPMIManagement)
self.assertIsInstance(driver.vendor, ipmitool.VendorPassthru)
self.assertIsInstance(driver.raid, agent.AgentRAID)
def test_agent_ipmitool_socat_driver(self):
driver = ipmi.AgentAndIPMIToolAndSocatDriver()
self.assertIsInstance(driver.power, ipmitool.IPMIPower)
self.assertIsInstance(driver.console, ipmitool.IPMISocatConsole)
self.assertIsInstance(driver.boot, pxe.PXEBoot)
self.assertIsInstance(driver.deploy, agent.AgentDeploy)
self.assertIsInstance(driver.management, ipmitool.IPMIManagement)
self.assertIsInstance(driver.vendor, ipmitool.VendorPassthru)
self.assertIsInstance(driver.raid, agent.AgentRAID)

View File

@ -118,7 +118,9 @@
export DEVSTACK_GATE_NEUTRON=1 export DEVSTACK_GATE_NEUTRON=1
export DEVSTACK_GATE_VIRT_DRIVER=ironic export DEVSTACK_GATE_VIRT_DRIVER=ironic
export DEVSTACK_GATE_CONFIGDRIVE=1 export DEVSTACK_GATE_CONFIGDRIVE=1
export DEVSTACK_GATE_IRONIC_DRIVER=agent_ipmitool export DEVSTACK_GATE_IRONIC_DRIVER=ipmi
export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_DEFAULT_DEPLOY_INTERFACE=direct"
export BRANCH_OVERRIDE="{{ zuul.override_checkout | default('default') }}" export BRANCH_OVERRIDE="{{ zuul.override_checkout | default('default') }}"
if [ "$BRANCH_OVERRIDE" != "default" ] ; then if [ "$BRANCH_OVERRIDE" != "default" ] ; then
export OVERRIDE_ZUUL_BRANCH=$BRANCH_OVERRIDE export OVERRIDE_ZUUL_BRANCH=$BRANCH_OVERRIDE
@ -128,7 +130,7 @@
export DEVSTACK_GATE_TLSPROXY=1 export DEVSTACK_GATE_TLSPROXY=1
fi fi
# agent_* drivers require Swift temporary URLs # the direct deploy interface requires Swift temporary URLs
export DEVSTACK_LOCAL_CONFIG+=$'\n'"SWIFT_ENABLE_TEMPURLS=True" export DEVSTACK_LOCAL_CONFIG+=$'\n'"SWIFT_ENABLE_TEMPURLS=True"
export DEVSTACK_LOCAL_CONFIG+=$'\n'"SWIFT_TEMPURL_KEY=secretkey" export DEVSTACK_LOCAL_CONFIG+=$'\n'"SWIFT_TEMPURL_KEY=secretkey"

View File

@ -0,0 +1,5 @@
---
upgrade:
- |
The deprecated classic drivers ``pxe_ipmitool`` and ``agent_ipmitool``
have been removed. Please use the ``ipmi`` hardware type instead.

View File

@ -52,12 +52,6 @@ ironic.dhcp =
neutron = ironic.dhcp.neutron:NeutronDHCPApi neutron = ironic.dhcp.neutron:NeutronDHCPApi
none = ironic.dhcp.none:NoneDHCPApi none = ironic.dhcp.none:NoneDHCPApi
ironic.drivers =
agent_ipmitool = ironic.drivers.ipmi:AgentAndIPMIToolDriver
agent_ipmitool_socat = ironic.drivers.ipmi:AgentAndIPMIToolAndSocatDriver
pxe_ipmitool = ironic.drivers.ipmi:PXEAndIPMIToolDriver
pxe_ipmitool_socat = ironic.drivers.ipmi:PXEAndIPMIToolAndSocatDriver
ironic.hardware.interfaces.bios = ironic.hardware.interfaces.bios =
fake = ironic.drivers.modules.fake:FakeBIOS fake = ironic.drivers.modules.fake:FakeBIOS
no-bios = ironic.drivers.modules.noop:NoBIOS no-bios = ironic.drivers.modules.noop:NoBIOS