Allow enabling node auto-discovery on the undercloud

Implements: blueprint inspector-node-autodiscovery
Change-Id: Ifa6f37de0e173744257931e7d13e2f98dc4513fa
This commit is contained in:
Dmitry Tantsur 2017-01-20 14:32:29 +01:00
parent 2aa658588a
commit 350aeaff66
4 changed files with 54 additions and 1 deletions

View File

@ -503,6 +503,8 @@ ironic::inspector::ramdisk_collectors: {{INSPECTION_COLLECTORS}}
ironic::inspector::additional_processing_hooks: 'extra_hardware'
ironic::inspector::ramdisk_kernel_args: {{INSPECTION_KERNEL_ARGS}}
ironic::inspector::ipxe_timeout: 60
ironic::inspector::node_not_found_hook: {{INSPECTION_NODE_NOT_FOUND_HOOK}}
ironic::inspector::discovery_default_driver: {{DISCOVERY_DEFAULT_DRIVER}}
# Ironic PXE driver
ironic::drivers::pxe::ipxe_timeout: 60

View File

@ -343,6 +343,21 @@ class TestGenerateEnvironment(BaseTestCase):
drivers = json.loads(env['ENABLED_DRIVERS'])
self.assertEqual(sorted(drivers), ['pxe_drac', 'pxe_ilo',
'pxe_ipmitool', 'pxe_ssh'])
self.assertEqual(env['INSPECTION_NODE_NOT_FOUND_HOOK'], '')
def test_enabled_discovery(self):
conf = config_fixture.Config()
self.useFixture(conf)
conf.config(enable_node_discovery=True)
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'])
# Discovery requires enabling the default driver, which is fake by
# default
self.assertEqual(sorted(drivers), ['fake', 'pxe_drac', 'pxe_ilo',
'pxe_ipmitool', 'pxe_ssh'])
self.assertEqual(env['INSPECTION_NODE_NOT_FOUND_HOOK'], 'enroll')
def test_generate_endpoints(self):
env = undercloud._generate_environment('.')

View File

@ -267,6 +267,22 @@ _opts = [
help=('Whether to support introspection of nodes that have '
'UEFI-only firmware.')
),
cfg.BoolOpt('enable_node_discovery',
default=False,
help=('Makes ironic-inspector enroll any unknown node that '
'PXE-boots introspection ramdisk in Ironic. By default, '
'the "fake" driver is used for new nodes (it is '
'automatically enabled when this option is set to True).'
' Set discovery_default_driver to override. '
'Introspection rules can also be used to specify driver '
'information for newly enrolled nodes.')
),
cfg.StrOpt('discovery_default_driver',
default='fake',
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.')
),
cfg.BoolOpt('undercloud_debug',
default=True,
help=('Whether to enable the debug log level for Undercloud '
@ -925,8 +941,15 @@ def _generate_environment(instack_root):
instack_env['INSPECTION_KERNEL_ARGS'] = ' '.join(inspection_kernel_args)
# Ensure correct rendering of the list and uniqueness of the items
enabled_drivers = set(CONF.enabled_drivers)
if CONF.enable_node_discovery:
enabled_drivers.add(CONF.discovery_default_driver)
instack_env['INSPECTION_NODE_NOT_FOUND_HOOK'] = 'enroll'
else:
instack_env['INSPECTION_NODE_NOT_FOUND_HOOK'] = ''
instack_env['ENABLED_DRIVERS'] = (
'[%s]' % ', '.join('"%s"' % drv for drv in set(CONF.enabled_drivers)))
'[%s]' % ', '.join('"%s"' % drv for drv in set(enabled_drivers)))
instack_env['PUBLIC_INTERFACE_IP'] = instack_env['LOCAL_IP']
instack_env['LOCAL_IP'] = instack_env['LOCAL_IP'].split('/')[0]

View File

@ -130,6 +130,19 @@
# firmware. (boolean value)
#inspection_enable_uefi = true
# Makes ironic-inspector enroll any unknown node that PXE-boots
# introspection ramdisk in Ironic. By default, the "fake" driver is
# used for new nodes (it is automatically enabled when this option is
# set to True). Set discovery_default_driver to override.
# Introspection rules can also be used to specify driver information
# for newly enrolled nodes. (boolean value)
#enable_node_discovery = false
# The default driver to use for newly discovered nodes (requires
# enable_node_discovery set to True). This driver is automatically
# added to enabled_drivers. (string value)
#discovery_default_driver = fake
# Whether to enable the debug log level for Undercloud OpenStack
# services. (boolean value)
#undercloud_debug = true