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:
parent
3e4658c5d4
commit
28d8ec0de2
|
@ -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)
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue