Support more hardware types and deprecate enabled_drivers

Ironic is going to deprecate classic drivers in Queens and remove them in Rocky.
This change enables hardware types ilo and idrac that correspond to alreadys
enabled classic drivers pxe_ilo and pxe_drac. It also adds support for others
common hardware types, but does not enable them by default.

The enabled_drivers option is deprecated.

This change mostly copies commit 58701fe014bf118ee0bbed5272c1a08e3f594ae0
from instack-undercloud, but adapts it for heat-driver undercloud.
Also adds staging-ovirt from review I3e5d0a72e2ba22537ce2c0eb30000c29f429dc3f

Change-Id: I3c20591a9900afb60aadcfa151b9ff29e7d3e16d
This commit is contained in:
Dmitry Tantsur 2017-12-01 13:55:10 +01:00
parent 3e4658c5d4
commit 28d8ec0de2
2 changed files with 179 additions and 10 deletions

View File

@ -0,0 +1,92 @@
# Copyright 2017 Red Hat, 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.
#
import mock
from tripleoclient.tests import base
from tripleoclient.v1 import undercloud_config
class TestProcessDriversAndHardwareTypes(base.TestCase):
def setUp(self):
super(TestProcessDriversAndHardwareTypes, self).setUp()
self.conf = mock.Mock(**{key: getattr(undercloud_config.CONF, key)
for key in ('enabled_drivers',
'enabled_hardware_types',
'enable_node_discovery',
'discovery_default_driver')})
def test_defaults(self):
env = {}
undercloud_config._process_drivers_and_hardware_types(self.conf, env)
self.assertEqual({
'IronicEnabledDrivers': ['pxe_drac', 'pxe_ilo', 'pxe_ipmitool'],
'IronicEnabledHardwareTypes': ['idrac', 'ilo', 'ipmi', 'redfish'],
'IronicEnabledBootInterfaces': ['ilo-pxe', 'pxe'],
'IronicEnabledManagementInterfaces': ['fake', 'idrac', 'ilo',
'ipmitool', 'redfish'],
'IronicEnabledPowerInterfaces': ['fake', 'idrac', 'ilo',
'ipmitool', 'redfish'],
'IronicEnabledRaidInterfaces': ['idrac', 'no-raid'],
'IronicEnabledVendorInterfaces': ['idrac', 'ipmitool', 'no-vendor']
}, env)
def test_one_hardware_type_with_discovery(self):
env = {}
self.conf.enabled_hardware_types = ['redfish']
self.conf.enable_node_discovery = True
undercloud_config._process_drivers_and_hardware_types(self.conf, env)
self.assertEqual({
'IronicEnabledDrivers': ['pxe_drac', 'pxe_ilo', 'pxe_ipmitool'],
# ipmi added because it's the default discovery driver
'IronicEnabledHardwareTypes': ['ipmi', 'redfish'],
'IronicEnabledBootInterfaces': ['pxe'],
'IronicEnabledManagementInterfaces': ['fake', 'ipmitool',
'redfish'],
'IronicEnabledPowerInterfaces': ['fake', 'ipmitool', 'redfish'],
'IronicEnabledRaidInterfaces': ['no-raid'],
'IronicEnabledVendorInterfaces': ['ipmitool', 'no-vendor'],
'IronicInspectorDiscoveryDefaultDriver': 'ipmi',
'IronicInspectorEnableNodeDiscovery': True
}, env)
def test_all_hardware_types(self):
env = {}
self.conf.enabled_hardware_types = (
self.conf.enabled_hardware_types + ['staging-ovirt', 'snmp',
'irmc', 'cisco-ucs-managed',
'cisco-ucs-standalone']
)
undercloud_config._process_drivers_and_hardware_types(self.conf, env)
self.assertEqual({
'IronicEnabledDrivers': ['pxe_drac', 'pxe_ilo', 'pxe_ipmitool'],
'IronicEnabledHardwareTypes': ['cisco-ucs-managed',
'cisco-ucs-standalone',
'idrac', 'ilo', 'ipmi', 'irmc',
'redfish', 'snmp', 'staging-ovirt'],
'IronicEnabledBootInterfaces': ['ilo-pxe', 'irmc-pxe', 'pxe'],
'IronicEnabledManagementInterfaces': ['cimc', 'fake', 'idrac',
'ilo', 'ipmitool', 'irmc',
'redfish', 'staging-ovirt',
'ucsm'],
'IronicEnabledPowerInterfaces': ['cimc', 'fake', 'idrac',
'ilo', 'ipmitool', 'irmc',
'redfish', 'snmp',
'staging-ovirt', 'ucsm'],
'IronicEnabledRaidInterfaces': ['idrac', 'no-raid'],
'IronicEnabledVendorInterfaces': ['idrac', 'ipmitool', 'no-vendor']
}, env)

View File

@ -236,10 +236,11 @@ _opts = [
'information for newly enrolled nodes.')
),
cfg.StrOpt('discovery_default_driver',
default='pxe_ipmitool',
help=('The default driver to use for newly discovered nodes '
'(requires enable_node_discovery set to True). This '
'driver is automatically added to enabled_drivers.')
default='ipmi',
help=('The default driver or hardware type to use for newly '
'discovered nodes (requires enable_node_discovery set to '
'True). It is automatically added to enabled_drivers '
'or enabled_hardware_types accordingly.')
),
cfg.BoolOpt('undercloud_debug',
default=True,
@ -308,9 +309,12 @@ _opts = [
'between deployments and after the introspection.')),
cfg.ListOpt('enabled_drivers',
default=['pxe_ipmitool', 'pxe_drac', 'pxe_ilo'],
help=('List of enabled bare metal drivers.')),
help=('List of enabled bare metal drivers.'),
deprecated_for_removal=True,
deprecated_reason=('Please switch to hardware types and '
'the enabled_hardware_types option.')),
cfg.ListOpt('enabled_hardware_types',
default=['ipmi', 'redfish'],
default=['ipmi', 'redfish', 'ilo', 'idrac'],
help=('List of enabled bare metal hardware types (next '
'generation drivers).')),
cfg.StrOpt('docker_registry_mirror',
@ -373,6 +377,76 @@ def _load_config():
CONF(conf_params)
def _is_classic_driver(name):
"""Poor man's way to detect if something is a driver or a hardware type.
To be removed when we remove support for classic drivers.
"""
return (name == 'fake' or
name.startswith('fake_') or
name.startswith('pxe_') or
name.startswith('agent_') or
name.startswith('iscsi_'))
def _process_drivers_and_hardware_types(conf, env):
"""Populate the environment with ironic driver information."""
# Ensure correct rendering of the list and uniqueness of the items
enabled_drivers = set(conf.enabled_drivers)
enabled_hardware_types = set(conf.enabled_hardware_types)
if conf.enable_node_discovery:
if _is_classic_driver(conf.discovery_default_driver):
if conf.discovery_default_driver not in enabled_drivers:
enabled_drivers.add(conf.discovery_default_driver)
else:
if conf.discovery_default_driver not in enabled_hardware_types:
enabled_hardware_types.add(conf.discovery_default_driver)
env['IronicInspectorEnableNodeDiscovery'] = True
env['IronicInspectorDiscoveryDefaultDriver'] = (
conf.discovery_default_driver)
# In most cases power and management interfaces are called the same, so we
# use one variable for them.
mgmt_interfaces = {'fake', 'ipmitool'}
# TODO(dtantsur): can we somehow avoid hardcoding hardware types here?
for hw_type in ('redfish', 'idrac', 'ilo', 'irmc', 'staging-ovirt'):
if hw_type in enabled_hardware_types:
mgmt_interfaces.add(hw_type)
for (hw_type, iface) in [('cisco-ucs-managed', 'ucsm'),
('cisco-ucs-standalone', 'cimc')]:
if hw_type in enabled_hardware_types:
mgmt_interfaces.add(iface)
# Two hardware types use non-default boot interfaces.
boot_interfaces = {'pxe'}
for hw_type in ('ilo', 'irmc'):
if hw_type in enabled_hardware_types:
boot_interfaces.add('%s-pxe' % hw_type)
raid_interfaces = {'no-raid'}
if 'idrac' in enabled_hardware_types:
raid_interfaces.add('idrac')
vendor_interfaces = {'no-vendor'}
for (hw_type, iface) in [('ipmi', 'ipmitool'),
('idrac', 'idrac')]:
if hw_type in enabled_hardware_types:
vendor_interfaces.add(iface)
env['IronicEnabledDrivers'] = sorted(enabled_drivers)
env['IronicEnabledHardwareTypes'] = sorted(enabled_hardware_types)
env['IronicEnabledBootInterfaces'] = sorted(boot_interfaces)
env['IronicEnabledManagementInterfaces'] = sorted(mgmt_interfaces)
env['IronicEnabledRaidInterfaces'] = sorted(raid_interfaces)
env['IronicEnabledVendorInterfaces'] = sorted(vendor_interfaces)
# The snmp hardware type uses fake management and snmp power
if 'snmp' in enabled_hardware_types:
mgmt_interfaces.add('snmp')
env['IronicEnabledPowerInterfaces'] = sorted(mgmt_interfaces)
def prepare_undercloud_deploy(upgrade=False, no_validations=False):
"""Prepare Undercloud deploy command based on undercloud.conf"""
@ -428,10 +502,13 @@ def prepare_undercloud_deploy(upgrade=False, no_validations=False):
deploy_args += ['-e', os.path.join(
tht_templates, "environments/services-docker/ironic.yaml")]
if CONF.get('enable_ironic_inspector'):
deploy_args += ['-e', os.path.join(
tht_templates,
"environments/services-docker/ironic-inspector.yaml")]
# ironic-inspector can only work if ironic is enabled
if CONF.get('enable_ironic_inspector'):
deploy_args += ['-e', os.path.join(
tht_templates,
"environments/services-docker/ironic-inspector.yaml")]
_process_drivers_and_hardware_types(CONF, env_data)
if CONF.get('enable_mistral'):
deploy_args += ['-e', os.path.join(