From e0d8b16161163e66908c2063a8013f14512cb94b Mon Sep 17 00:00:00 2001 From: Dao Cong Tien Date: Thu, 2 Nov 2017 20:25:59 +0700 Subject: [PATCH] Add rescue_interface to node and driver Add support for rescue_interface to the commands below: * openstack baremetal node create * openstack baremetal node show * openstack baremetal node set * openstack baremetal node unset * openstack baremetal driver list * openstack baremetal driver show Change-Id: Ib91d67a95092713add0d5025d8755f212c59f659 Partial-Bug: #1526449 --- ironicclient/osc/v1/baremetal_node.py | 29 +++++++++++++++++-- ironicclient/tests/unit/osc/v1/fakes.py | 4 +++ .../unit/osc/v1/test_baremetal_driver.py | 14 +++++++-- .../tests/unit/osc/v1/test_baremetal_node.py | 15 +++++++++- .../tests/unit/v1/test_driver_shell.py | 6 ++-- ironicclient/tests/unit/v1/test_node_shell.py | 1 + ironicclient/v1/node.py | 4 +-- ironicclient/v1/resource_fields.py | 6 ++++ ...e-to-node-and-driver-e3ff9b5df2628e5a.yaml | 12 ++++++++ 9 files changed, 81 insertions(+), 10 deletions(-) create mode 100644 releasenotes/notes/add-rescue-interface-to-node-and-driver-e3ff9b5df2628e5a.yaml diff --git a/ironicclient/osc/v1/baremetal_node.py b/ironicclient/osc/v1/baremetal_node.py index 313871520..141bba253 100755 --- a/ironicclient/osc/v1/baremetal_node.py +++ b/ironicclient/osc/v1/baremetal_node.py @@ -397,6 +397,12 @@ class CreateBaremetalNode(command.ShowOne): help=_('RAID interface used by the node\'s driver. This is ' 'only applicable when the specified --driver is a ' 'hardware type.')) + parser.add_argument( + '--rescue-interface', + metavar='', + help=_('Rescue interface used by the node\'s driver. This is ' + 'only applicable when the specified --driver is a ' + 'hardware type.')) parser.add_argument( '--storage-interface', metavar='', @@ -425,8 +431,8 @@ class CreateBaremetalNode(command.ShowOne): 'deploy_interface', 'inspect_interface', 'management_interface', 'network_interface', 'power_interface', 'raid_interface', - 'storage_interface', 'vendor_interface', - 'resource_class'] + 'rescue_interface', 'storage_interface', + 'vendor_interface', 'resource_class'] fields = dict((k, v) for (k, v) in vars(parsed_args).items() if k in field_list and not (v is None)) fields = utils.args_array_to_dict(fields, 'driver_info') @@ -1020,6 +1026,11 @@ class SetBaremetalNode(command.Command): metavar='', help=_('Set the RAID interface for the node'), ) + parser.add_argument( + '--rescue-interface', + metavar='', + help=_('Set the rescue interface for the node'), + ) parser.add_argument( '--storage-interface', metavar='', @@ -1147,6 +1158,11 @@ class SetBaremetalNode(command.Command): "raid_interface=%s" % parsed_args.raid_interface] properties.extend(utils.args_array_to_patch( 'add', raid_interface)) + if parsed_args.rescue_interface: + rescue_interface = [ + "rescue_interface=%s" % parsed_args.rescue_interface] + properties.extend(utils.args_array_to_patch( + 'add', rescue_interface)) if parsed_args.storage_interface: storage_interface = [ "storage_interface=%s" % parsed_args.storage_interface] @@ -1365,6 +1381,12 @@ class UnsetBaremetalNode(command.Command): action='store_true', help=_('Unset RAID interface on this baremetal node'), ) + parser.add_argument( + "--rescue-interface", + dest='rescue_interface', + action='store_true', + help=_('Unset rescue interface on this baremetal node'), + ) parser.add_argument( "--storage-interface", dest='storage_interface', @@ -1443,6 +1465,9 @@ class UnsetBaremetalNode(command.Command): if parsed_args.raid_interface: properties.extend(utils.args_array_to_patch('remove', ['raid_interface'])) + if parsed_args.rescue_interface: + properties.extend(utils.args_array_to_patch('remove', + ['rescue_interface'])) if parsed_args.storage_interface: properties.extend(utils.args_array_to_patch('remove', ['storage_interface'])) diff --git a/ironicclient/tests/unit/osc/v1/fakes.py b/ironicclient/tests/unit/osc/v1/fakes.py index 37e04e1bd..696ee2a2e 100644 --- a/ironicclient/tests/unit/osc/v1/fakes.py +++ b/ironicclient/tests/unit/osc/v1/fakes.py @@ -72,6 +72,7 @@ baremetal_driver_default_management_if = 'management' baremetal_driver_default_network_if = 'network' baremetal_driver_default_power_if = 'power' baremetal_driver_default_raid_if = 'raid' +baremetal_driver_default_rescue_if = 'rescue' baremetal_driver_default_storage_if = 'storage' baremetal_driver_default_vendor_if = 'vendor' baremetal_driver_enabled_boot_ifs = ['boot', 'boot2'] @@ -82,6 +83,7 @@ baremetal_driver_enabled_management_ifs = ['management', 'management2'] baremetal_driver_enabled_network_ifs = ['network', 'network2'] baremetal_driver_enabled_power_ifs = ['power', 'power2'] baremetal_driver_enabled_raid_ifs = ['raid', 'raid2'] +baremetal_driver_enabled_rescue_ifs = ['rescue', 'rescue2'] baremetal_driver_enabled_storage_ifs = ['storage', 'storage2'] baremetal_driver_enabled_vendor_ifs = ['vendor', 'vendor2'] @@ -97,6 +99,7 @@ BAREMETAL_DRIVER = { 'default_network_interface': baremetal_driver_default_network_if, 'default_power_interface': baremetal_driver_default_power_if, 'default_raid_interface': baremetal_driver_default_raid_if, + 'default_rescue_interface': baremetal_driver_default_rescue_if, 'default_storage_interface': baremetal_driver_default_storage_if, 'default_vendor_interface': baremetal_driver_default_vendor_if, 'enabled_boot_interfaces': baremetal_driver_enabled_boot_ifs, @@ -107,6 +110,7 @@ BAREMETAL_DRIVER = { 'enabled_network_interfaces': baremetal_driver_enabled_network_ifs, 'enabled_power_interfaces': baremetal_driver_enabled_power_ifs, 'enabled_raid_interfaces': baremetal_driver_enabled_raid_ifs, + 'enabled_rescue_interfaces': baremetal_driver_enabled_rescue_ifs, 'enabled_storage_interfaces': baremetal_driver_enabled_storage_ifs, 'enabled_vendor_interfaces': baremetal_driver_enabled_vendor_ifs, } diff --git a/ironicclient/tests/unit/osc/v1/test_baremetal_driver.py b/ironicclient/tests/unit/osc/v1/test_baremetal_driver.py index 85bfa79fb..14bcb97b9 100644 --- a/ironicclient/tests/unit/osc/v1/test_baremetal_driver.py +++ b/ironicclient/tests/unit/osc/v1/test_baremetal_driver.py @@ -96,6 +96,7 @@ class TestListBaremetalDriver(TestBaremetalDriver): 'Default Network Interface', 'Default Power Interface', 'Default RAID Interface', + 'Default Rescue Interface', 'Default Storage Interface', 'Default Vendor Interface', 'Enabled Boot Interfaces', @@ -106,6 +107,7 @@ class TestListBaremetalDriver(TestBaremetalDriver): 'Enabled Network Interfaces', 'Enabled Power Interfaces', 'Enabled RAID Interfaces', + 'Enabled Rescue Interfaces', 'Enabled Storage Interfaces', 'Enabled Vendor Interfaces' ) @@ -123,6 +125,7 @@ class TestListBaremetalDriver(TestBaremetalDriver): baremetal_fakes.baremetal_driver_default_network_if, baremetal_fakes.baremetal_driver_default_power_if, baremetal_fakes.baremetal_driver_default_raid_if, + baremetal_fakes.baremetal_driver_default_rescue_if, baremetal_fakes.baremetal_driver_default_storage_if, baremetal_fakes.baremetal_driver_default_vendor_if, ', '.join(baremetal_fakes.baremetal_driver_enabled_boot_ifs), @@ -133,6 +136,7 @@ class TestListBaremetalDriver(TestBaremetalDriver): ', '.join(baremetal_fakes.baremetal_driver_enabled_network_ifs), ', '.join(baremetal_fakes.baremetal_driver_enabled_power_ifs), ', '.join(baremetal_fakes.baremetal_driver_enabled_raid_ifs), + ', '.join(baremetal_fakes.baremetal_driver_enabled_rescue_ifs), ', '.join(baremetal_fakes.baremetal_driver_enabled_storage_ifs), ', '.join(baremetal_fakes.baremetal_driver_enabled_vendor_ifs), ),) @@ -361,13 +365,15 @@ class TestShowBaremetalDriver(TestBaremetalDriver): 'default_deploy_interface', 'default_inspect_interface', 'default_management_interface', 'default_network_interface', 'default_power_interface', 'default_raid_interface', - 'default_storage_interface', 'default_vendor_interface', + 'default_rescue_interface', 'default_storage_interface', + 'default_vendor_interface', 'enabled_boot_interfaces', 'enabled_console_interfaces', 'enabled_deploy_interfaces', 'enabled_inspect_interfaces', 'enabled_management_interfaces', 'enabled_network_interfaces', 'enabled_power_interfaces', - 'enabled_raid_interfaces', 'enabled_storage_interfaces', - 'enabled_vendor_interfaces', 'hosts', 'name', 'type') + 'enabled_raid_interfaces', 'enabled_rescue_interfaces', + 'enabled_storage_interfaces', 'enabled_vendor_interfaces', + 'hosts', 'name', 'type') self.assertEqual(collist, columns) datalist = ( @@ -379,6 +385,7 @@ class TestShowBaremetalDriver(TestBaremetalDriver): baremetal_fakes.baremetal_driver_default_network_if, baremetal_fakes.baremetal_driver_default_power_if, baremetal_fakes.baremetal_driver_default_raid_if, + baremetal_fakes.baremetal_driver_default_rescue_if, baremetal_fakes.baremetal_driver_default_storage_if, baremetal_fakes.baremetal_driver_default_vendor_if, ', '.join(baremetal_fakes.baremetal_driver_enabled_boot_ifs), @@ -389,6 +396,7 @@ class TestShowBaremetalDriver(TestBaremetalDriver): ', '.join(baremetal_fakes.baremetal_driver_enabled_network_ifs), ', '.join(baremetal_fakes.baremetal_driver_enabled_power_ifs), ', '.join(baremetal_fakes.baremetal_driver_enabled_raid_ifs), + ', '.join(baremetal_fakes.baremetal_driver_enabled_rescue_ifs), ', '.join(baremetal_fakes.baremetal_driver_enabled_storage_ifs), ', '.join(baremetal_fakes.baremetal_driver_enabled_vendor_ifs), ', '.join(baremetal_fakes.baremetal_driver_hosts), diff --git a/ironicclient/tests/unit/osc/v1/test_baremetal_node.py b/ironicclient/tests/unit/osc/v1/test_baremetal_node.py index 80b614279..49f8338d0 100644 --- a/ironicclient/tests/unit/osc/v1/test_baremetal_node.py +++ b/ironicclient/tests/unit/osc/v1/test_baremetal_node.py @@ -425,6 +425,11 @@ class TestBaremetalCreate(TestBaremetal): [('raid_interface', 'raid')], {'raid_interface': 'raid'}) + def test_baremetal_create_with_rescue_interface(self): + self.check_with_options(['--rescue-interface', 'rescue'], + [('rescue_interface', 'rescue')], + {'rescue_interface': 'rescue'}) + def test_baremetal_create_with_storage_interface(self): self.check_with_options(['--storage-interface', 'storage'], [('storage_interface', 'storage')], @@ -599,7 +604,8 @@ class TestBaremetalList(TestBaremetal): 'Deploy Interface', 'Inspect Interface', 'Management Interface', 'Network Interface', 'Power Interface', 'RAID Interface', - 'Storage Interface', 'Vendor Interface') + 'Rescue Interface', 'Storage Interface', + 'Vendor Interface') self.assertEqual(collist, columns) datalist = (( '', @@ -641,6 +647,7 @@ class TestBaremetalList(TestBaremetal): '', '', '', + '', ), ) self.assertEqual(datalist, tuple(data)) @@ -2031,6 +2038,9 @@ class TestBaremetalSet(TestBaremetal): def test_baremetal_set_raid_interface(self): self._test_baremetal_set_hardware_interface('raid') + def test_baremetal_set_rescue_interface(self): + self._test_baremetal_set_hardware_interface('rescue') + def test_baremetal_set_storage_interface(self): self._test_baremetal_set_hardware_interface('storage') @@ -2649,6 +2659,9 @@ class TestBaremetalUnset(TestBaremetal): def test_baremetal_unset_raid_interface(self): self._test_baremetal_unset_hw_interface('raid') + def test_baremetal_unset_rescue_interface(self): + self._test_baremetal_unset_hw_interface('rescue') + def test_baremetal_unset_storage_interface(self): self._test_baremetal_unset_hw_interface('storage') diff --git a/ironicclient/tests/unit/v1/test_driver_shell.py b/ironicclient/tests/unit/v1/test_driver_shell.py index aecf5700f..67aad9b28 100644 --- a/ironicclient/tests/unit/v1/test_driver_shell.py +++ b/ironicclient/tests/unit/v1/test_driver_shell.py @@ -39,12 +39,14 @@ class DriverShellTest(utils.BaseTestCase): 'default_deploy_interface', 'default_inspect_interface', 'default_management_interface', 'default_network_interface', 'default_power_interface', 'default_raid_interface', - 'default_storage_interface', 'default_vendor_interface', + 'default_rescue_interface', 'default_storage_interface', + 'default_vendor_interface', 'enabled_boot_interfaces', 'enabled_console_interfaces', 'enabled_deploy_interfaces', 'enabled_inspect_interfaces', 'enabled_management_interfaces', 'enabled_network_interfaces', 'enabled_power_interfaces', 'enabled_raid_interfaces', - 'enabled_storage_interfaces', 'enabled_vendor_interfaces'] + 'enabled_rescue_interfaces', 'enabled_storage_interfaces', + 'enabled_vendor_interfaces'] act = actual.keys() self.assertEqual(sorted(exp), sorted(act)) diff --git a/ironicclient/tests/unit/v1/test_node_shell.py b/ironicclient/tests/unit/v1/test_node_shell.py index f861572dc..a8152142e 100644 --- a/ironicclient/tests/unit/v1/test_node_shell.py +++ b/ironicclient/tests/unit/v1/test_node_shell.py @@ -55,6 +55,7 @@ class NodeShellTest(utils.BaseTestCase): 'network_interface', 'power_interface', 'raid_interface', + 'rescue_interface', 'storage_interface', 'vendor_interface', 'power_state', diff --git a/ironicclient/v1/node.py b/ironicclient/v1/node.py index 0be96f700..c9af47034 100644 --- a/ironicclient/v1/node.py +++ b/ironicclient/v1/node.py @@ -51,8 +51,8 @@ class NodeManager(base.CreateManager): 'deploy_interface', 'inspect_interface', 'management_interface', 'network_interface', 'power_interface', 'raid_interface', - 'storage_interface', 'vendor_interface', - 'resource_class'] + 'rescue_interface', 'storage_interface', + 'vendor_interface', 'resource_class'] _resource_name = 'nodes' def list(self, associated=None, maintenance=None, marker=None, limit=None, diff --git a/ironicclient/v1/resource_fields.py b/ironicclient/v1/resource_fields.py index d027135ef..a67383dfe 100644 --- a/ironicclient/v1/resource_fields.py +++ b/ironicclient/v1/resource_fields.py @@ -47,6 +47,7 @@ class Resource(object): 'default_network_interface': 'Default Network Interface', 'default_power_interface': 'Default Power Interface', 'default_raid_interface': 'Default RAID Interface', + 'default_rescue_interface': 'Default Rescue Interface', 'default_storage_interface': 'Default Storage Interface', 'default_vendor_interface': 'Default Vendor Interface', 'description': 'Description', @@ -61,6 +62,7 @@ class Resource(object): 'enabled_network_interfaces': 'Enabled Network Interfaces', 'enabled_power_interfaces': 'Enabled Power Interfaces', 'enabled_raid_interfaces': 'Enabled RAID Interfaces', + 'enabled_rescue_interfaces': 'Enabled Rescue Interfaces', 'enabled_storage_interfaces': 'Enabled Storage Interfaces', 'enabled_vendor_interfaces': 'Enabled Vendor Interfaces', 'extra': 'Extra', @@ -104,6 +106,7 @@ class Resource(object): 'network_interface': 'Network Interface', 'power_interface': 'Power Interface', 'raid_interface': 'RAID Interface', + 'rescue_interface': 'Rescue Interface', 'storage_interface': 'Storage Interface', 'vendor_interface': 'Vendor Interface', 'standalone_ports_supported': 'Standalone Ports Supported', @@ -225,6 +228,7 @@ NODE_DETAILED_RESOURCE = Resource( 'network_interface', 'power_interface', 'raid_interface', + 'rescue_interface', 'storage_interface', 'vendor_interface', ], @@ -339,6 +343,7 @@ DRIVER_DETAILED_RESOURCE = Resource( 'default_network_interface', 'default_power_interface', 'default_raid_interface', + 'default_rescue_interface', 'default_storage_interface', 'default_vendor_interface', 'enabled_boot_interfaces', @@ -349,6 +354,7 @@ DRIVER_DETAILED_RESOURCE = Resource( 'enabled_network_interfaces', 'enabled_power_interfaces', 'enabled_raid_interfaces', + 'enabled_rescue_interfaces', 'enabled_storage_interfaces', 'enabled_vendor_interfaces' ], diff --git a/releasenotes/notes/add-rescue-interface-to-node-and-driver-e3ff9b5df2628e5a.yaml b/releasenotes/notes/add-rescue-interface-to-node-and-driver-e3ff9b5df2628e5a.yaml new file mode 100644 index 000000000..c4b646f1e --- /dev/null +++ b/releasenotes/notes/add-rescue-interface-to-node-and-driver-e3ff9b5df2628e5a.yaml @@ -0,0 +1,12 @@ +--- +features: + - | + Adds support for rescue_interface for the commands below. + They are available starting with ironic API microversion 1.38. + + * ``openstack baremetal node create`` + * ``openstack baremetal node show`` + * ``openstack baremetal node set`` + * ``openstack baremetal node unset`` + * ``openstack baremetal driver list`` + * ``openstack baremetal driver show``