Support configuring enabled hardware types
Enables two generic hardware types by default: IPMI and Redfish. Calculates enabled power and management interfaces based on enabled hardware types. Enables support for ironic-inspector and socat console. Also fixes enabled_drivers which was using deprecated (and removed) puppet variable ironic::enabled_drivers. Part of blueprint ironic-driver-composition and blueprint redfish-support. Change-Id: I22dd51fa871ad9141af2ad935d248262789780a5
This commit is contained in:
parent
1eaed08c1b
commit
c8776d9a76
|
@ -505,8 +505,10 @@ include ::ironic::conductor
|
||||||
include ::ironic::drivers::drac
|
include ::ironic::drivers::drac
|
||||||
include ::ironic::drivers::ilo
|
include ::ironic::drivers::ilo
|
||||||
include ::ironic::drivers::inspector
|
include ::ironic::drivers::inspector
|
||||||
|
include ::ironic::drivers::interfaces
|
||||||
include ::ironic::drivers::ipmi
|
include ::ironic::drivers::ipmi
|
||||||
include ::ironic::drivers::pxe
|
include ::ironic::drivers::pxe
|
||||||
|
include ::ironic::drivers::redfish
|
||||||
include ::ironic::glance
|
include ::ironic::glance
|
||||||
include ::ironic::inspector
|
include ::ironic::inspector
|
||||||
include ::ironic::neutron
|
include ::ironic::neutron
|
||||||
|
|
|
@ -462,7 +462,6 @@ nova::db::sync_api::db_sync_timeout: 900
|
||||||
# Ironic
|
# Ironic
|
||||||
ironic::debug: "%{hiera('debug')}"
|
ironic::debug: "%{hiera('debug')}"
|
||||||
ironic::my_ip: {{LOCAL_IP}}
|
ironic::my_ip: {{LOCAL_IP}}
|
||||||
ironic::enabled_drivers: {{ENABLED_DRIVERS}}
|
|
||||||
ironic::rpc_response_timeout: 600
|
ironic::rpc_response_timeout: 600
|
||||||
ironic::api::authtoken::password: {{UNDERCLOUD_IRONIC_PASSWORD}}
|
ironic::api::authtoken::password: {{UNDERCLOUD_IRONIC_PASSWORD}}
|
||||||
ironic::api::authtoken::auth_uri: "%{hiera('keystone_auth_uri')}"
|
ironic::api::authtoken::auth_uri: "%{hiera('keystone_auth_uri')}"
|
||||||
|
@ -491,6 +490,13 @@ ironic::conductor::cleaning_disk_erase: 'metadata'
|
||||||
ironic::conductor::cleaning_network: 'ctlplane'
|
ironic::conductor::cleaning_network: 'ctlplane'
|
||||||
ironic::conductor::provisioning_network: 'ctlplane'
|
ironic::conductor::provisioning_network: 'ctlplane'
|
||||||
ironic::conductor::default_boot_option: 'local'
|
ironic::conductor::default_boot_option: 'local'
|
||||||
|
ironic::conductor::enabled_drivers: {{ENABLED_DRIVERS}}
|
||||||
|
ironic::conductor::enabled_hardware_types: {{ENABLED_HARDWARE_TYPES}}
|
||||||
|
ironic::drivers::interfaces::default_inspect_interface: inspector
|
||||||
|
ironic::drivers::interfaces::enabled_console_interfaces: ['no-console', 'ipmitool-socat']
|
||||||
|
ironic::drivers::interfaces::enabled_inspect_interfaces: ['no-inspect', 'inspector']
|
||||||
|
ironic::drivers::interfaces::enabled_management_interfaces: {{ENABLED_MANAGEMENT_INTERFACES}}
|
||||||
|
ironic::drivers::interfaces::enabled_power_interfaces: {{ENABLED_POWER_INTERFACES}}
|
||||||
ironic::keystone::auth::tenant: 'service'
|
ironic::keystone::auth::tenant: 'service'
|
||||||
ironic::keystone::auth::public_url: {{UNDERCLOUD_ENDPOINT_IRONIC_PUBLIC}}
|
ironic::keystone::auth::public_url: {{UNDERCLOUD_ENDPOINT_IRONIC_PUBLIC}}
|
||||||
ironic::keystone::auth::internal_url: {{UNDERCLOUD_ENDPOINT_IRONIC_INTERNAL}}
|
ironic::keystone::auth::internal_url: {{UNDERCLOUD_ENDPOINT_IRONIC_INTERNAL}}
|
||||||
|
|
|
@ -418,6 +418,23 @@ class TestGenerateEnvironment(BaseTestCase):
|
||||||
'pxe_ipmitool'])
|
'pxe_ipmitool'])
|
||||||
self.assertEqual(env['INSPECTION_NODE_NOT_FOUND_HOOK'], 'enroll')
|
self.assertEqual(env['INSPECTION_NODE_NOT_FOUND_HOOK'], 'enroll')
|
||||||
|
|
||||||
|
def test_enabled_hardware_types(self):
|
||||||
|
conf = config_fixture.Config()
|
||||||
|
self.useFixture(conf)
|
||||||
|
conf.config(enable_node_discovery=True,
|
||||||
|
discovery_default_driver='foobar',
|
||||||
|
enabled_hardware_types=['ipmi', 'foobar'])
|
||||||
|
env = undercloud._generate_environment('.')
|
||||||
|
# The list is generated from a set, so we can't rely on ordering.
|
||||||
|
# Instead make sure that it looks like a valid list by parsing it.
|
||||||
|
drivers = json.loads(env['ENABLED_DRIVERS'])
|
||||||
|
hw_types = json.loads(env['ENABLED_HARDWARE_TYPES'])
|
||||||
|
# The driver is already in hardware types, so we don't try adding it to
|
||||||
|
# the driver list.
|
||||||
|
self.assertEqual(sorted(drivers), ['pxe_drac', 'pxe_ilo',
|
||||||
|
'pxe_ipmitool'])
|
||||||
|
self.assertEqual(sorted(hw_types), ['foobar', 'ipmi'])
|
||||||
|
|
||||||
def test_docker_registry_mirror(self):
|
def test_docker_registry_mirror(self):
|
||||||
conf = config_fixture.Config()
|
conf = config_fixture.Config()
|
||||||
self.useFixture(conf)
|
self.useFixture(conf)
|
||||||
|
|
|
@ -364,6 +364,10 @@ _opts = [
|
||||||
cfg.ListOpt('enabled_drivers',
|
cfg.ListOpt('enabled_drivers',
|
||||||
default=['pxe_ipmitool', 'pxe_drac', 'pxe_ilo'],
|
default=['pxe_ipmitool', 'pxe_drac', 'pxe_ilo'],
|
||||||
help=('List of enabled bare metal drivers.')),
|
help=('List of enabled bare metal drivers.')),
|
||||||
|
cfg.ListOpt('enabled_hardware_types',
|
||||||
|
default=['ipmi', 'redfish'],
|
||||||
|
help=('List of enabled bare metal hardware types (next '
|
||||||
|
'generation drivers).')),
|
||||||
cfg.StrOpt('docker_registry_mirror',
|
cfg.StrOpt('docker_registry_mirror',
|
||||||
default='',
|
default='',
|
||||||
help=('An optional docker \'registry-mirror\' that will be'
|
help=('An optional docker \'registry-mirror\' that will be'
|
||||||
|
@ -996,7 +1000,9 @@ class InstackEnvironment(dict):
|
||||||
DYNAMIC_KEYS = {'INSPECTION_COLLECTORS', 'INSPECTION_KERNEL_ARGS',
|
DYNAMIC_KEYS = {'INSPECTION_COLLECTORS', 'INSPECTION_KERNEL_ARGS',
|
||||||
'INSPECTION_NODE_NOT_FOUND_HOOK',
|
'INSPECTION_NODE_NOT_FOUND_HOOK',
|
||||||
'TRIPLEO_INSTALL_USER', 'TRIPLEO_UNDERCLOUD_CONF_FILE',
|
'TRIPLEO_INSTALL_USER', 'TRIPLEO_UNDERCLOUD_CONF_FILE',
|
||||||
'TRIPLEO_UNDERCLOUD_PASSWORD_FILE'}
|
'TRIPLEO_UNDERCLOUD_PASSWORD_FILE',
|
||||||
|
'ENABLED_POWER_INTERFACES',
|
||||||
|
'ENABLED_MANAGEMENT_INTERFACES'}
|
||||||
"""The variables we calculate in _generate_environment call."""
|
"""The variables we calculate in _generate_environment call."""
|
||||||
|
|
||||||
PUPPET_KEYS = DYNAMIC_KEYS | {opt.name.upper() for _, group in list_opts()
|
PUPPET_KEYS = DYNAMIC_KEYS | {opt.name.upper() for _, group in list_opts()
|
||||||
|
@ -1016,6 +1022,11 @@ class InstackEnvironment(dict):
|
||||||
return super(InstackEnvironment, self).__setitem__(key, value)
|
return super(InstackEnvironment, self).__setitem__(key, value)
|
||||||
|
|
||||||
|
|
||||||
|
def _make_list(values):
|
||||||
|
"""Generate a list suitable to pass to templates."""
|
||||||
|
return '[%s]' % ', '.join('"%s"' % item for item in values)
|
||||||
|
|
||||||
|
|
||||||
def _generate_environment(instack_root):
|
def _generate_environment(instack_root):
|
||||||
"""Generate an environment dict for instack
|
"""Generate an environment dict for instack
|
||||||
|
|
||||||
|
@ -1098,14 +1109,29 @@ def _generate_environment(instack_root):
|
||||||
|
|
||||||
# Ensure correct rendering of the list and uniqueness of the items
|
# Ensure correct rendering of the list and uniqueness of the items
|
||||||
enabled_drivers = set(CONF.enabled_drivers)
|
enabled_drivers = set(CONF.enabled_drivers)
|
||||||
|
enabled_hardware_types = set(CONF.enabled_hardware_types)
|
||||||
if CONF.enable_node_discovery:
|
if CONF.enable_node_discovery:
|
||||||
enabled_drivers.add(CONF.discovery_default_driver)
|
if (CONF.discovery_default_driver not in (enabled_drivers |
|
||||||
|
enabled_hardware_types)):
|
||||||
|
enabled_drivers.add(CONF.discovery_default_driver)
|
||||||
instack_env['INSPECTION_NODE_NOT_FOUND_HOOK'] = 'enroll'
|
instack_env['INSPECTION_NODE_NOT_FOUND_HOOK'] = 'enroll'
|
||||||
else:
|
else:
|
||||||
instack_env['INSPECTION_NODE_NOT_FOUND_HOOK'] = ''
|
instack_env['INSPECTION_NODE_NOT_FOUND_HOOK'] = ''
|
||||||
|
|
||||||
instack_env['ENABLED_DRIVERS'] = (
|
# In most cases power and management interfaces are called the same, so we
|
||||||
'[%s]' % ', '.join('"%s"' % drv for drv in set(enabled_drivers)))
|
# use one variable for them.
|
||||||
|
enabled_interfaces = set()
|
||||||
|
if 'ipmi' in enabled_hardware_types:
|
||||||
|
enabled_interfaces.add('ipmitool')
|
||||||
|
if 'redfish' in enabled_hardware_types:
|
||||||
|
enabled_interfaces.add('redfish')
|
||||||
|
|
||||||
|
instack_env['ENABLED_DRIVERS'] = _make_list(enabled_drivers)
|
||||||
|
instack_env['ENABLED_HARDWARE_TYPES'] = _make_list(enabled_hardware_types)
|
||||||
|
|
||||||
|
enabled_interfaces = _make_list(enabled_interfaces)
|
||||||
|
instack_env['ENABLED_POWER_INTERFACES'] = enabled_interfaces
|
||||||
|
instack_env['ENABLED_MANAGEMENT_INTERFACES'] = enabled_interfaces
|
||||||
|
|
||||||
if CONF.docker_registry_mirror:
|
if CONF.docker_registry_mirror:
|
||||||
instack_env['DOCKER_REGISTRY_MIRROR'] = CONF.docker_registry_mirror
|
instack_env['DOCKER_REGISTRY_MIRROR'] = CONF.docker_registry_mirror
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Allow configuring enabled hardware types via new ``enabled_hardware_types``
|
||||||
|
configuration option. See `the driver composition reform spec
|
||||||
|
<http://specs.openstack.org/openstack/ironic-specs/specs/approved/driver-composition-reform.html>`_
|
||||||
|
for details. Enabled management and power interfaces are derived for
|
||||||
|
known hardware types. Inspection via **ironic-inspector** and
|
||||||
|
``socat``-based serial console support is enabled by default.
|
||||||
|
- |
|
||||||
|
Support Redfish-compatible hardware via ``redfish`` hardware type.
|
|
@ -208,6 +208,10 @@
|
||||||
# List of enabled bare metal drivers. (list value)
|
# List of enabled bare metal drivers. (list value)
|
||||||
#enabled_drivers = pxe_ipmitool,pxe_drac,pxe_ilo
|
#enabled_drivers = pxe_ipmitool,pxe_drac,pxe_ilo
|
||||||
|
|
||||||
|
# List of enabled bare metal hardware types (next generation drivers).
|
||||||
|
# (list value)
|
||||||
|
#enabled_hardware_types = ipmi,redfish
|
||||||
|
|
||||||
# An optional docker 'registry-mirror' that will beconfigured in
|
# An optional docker 'registry-mirror' that will beconfigured in
|
||||||
# /etc/docker/daemon.json. (string value)
|
# /etc/docker/daemon.json. (string value)
|
||||||
#docker_registry_mirror =
|
#docker_registry_mirror =
|
||||||
|
|
Loading…
Reference in New Issue