From 525f60912cd214088ddc4cf6dacdb06b95e2b3a5 Mon Sep 17 00:00:00 2001 From: Dao Cong Tien Date: Fri, 19 May 2017 12:25:26 +0700 Subject: [PATCH] Add support for storage_interface to node and driver CLI Add support for storage_interface to the commands below: * ironic node-create * ironic node-show * ironic node-update * ironic driver-list * ironic driver-show * 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: Ia0437529bcb1a3e8dd20bde55eb57e0443290028 Partial-Bug: #1526231 Depends-On: I2c74f386291e588a25612f73de08e8367795acff --- ironicclient/osc/plugin.py | 2 +- ironicclient/osc/v1/baremetal_node.py | 26 ++++++++++++++++++- ironicclient/tests/unit/osc/v1/fakes.py | 4 +++ .../unit/osc/v1/test_baremetal_driver.py | 16 ++++++++---- .../tests/unit/osc/v1/test_baremetal_node.py | 14 +++++++++- .../tests/unit/v1/test_driver_shell.py | 4 +-- ironicclient/tests/unit/v1/test_node_shell.py | 11 ++++++++ ironicclient/v1/node.py | 3 ++- ironicclient/v1/node_shell.py | 7 ++++- ironicclient/v1/resource_fields.py | 6 +++++ ...rt-storage-interface-e93fc8d4de5d24d6.yaml | 17 ++++++++++++ 11 files changed, 98 insertions(+), 12 deletions(-) create mode 100644 releasenotes/notes/node-driver-support-storage-interface-e93fc8d4de5d24d6.yaml diff --git a/ironicclient/osc/plugin.py b/ironicclient/osc/plugin.py index 2b27263ac..a1c88edc1 100644 --- a/ironicclient/osc/plugin.py +++ b/ironicclient/osc/plugin.py @@ -26,7 +26,7 @@ LOG = logging.getLogger(__name__) API_VERSION_OPTION = 'os_baremetal_api_version' API_NAME = 'baremetal' -LAST_KNOWN_API_VERSION = 32 +LAST_KNOWN_API_VERSION = 33 API_VERSIONS = { '1.%d' % i: 'ironicclient.v1.client.Client' for i in range(1, LAST_KNOWN_API_VERSION + 1) diff --git a/ironicclient/osc/v1/baremetal_node.py b/ironicclient/osc/v1/baremetal_node.py index 50cca18f4..8b14621c2 100755 --- a/ironicclient/osc/v1/baremetal_node.py +++ b/ironicclient/osc/v1/baremetal_node.py @@ -389,6 +389,10 @@ 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( + '--storage-interface', + metavar='', + help=_('Storage interface used by the node\'s driver.')) parser.add_argument( '--vendor-interface', metavar='', @@ -413,7 +417,8 @@ class CreateBaremetalNode(command.ShowOne): 'deploy_interface', 'inspect_interface', 'management_interface', 'network_interface', 'power_interface', 'raid_interface', - 'vendor_interface', 'resource_class'] + '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') @@ -991,6 +996,11 @@ class SetBaremetalNode(command.Command): metavar='', help=_('Set the RAID interface for the node'), ) + parser.add_argument( + '--storage-interface', + metavar='', + help=_('Set the storage interface for the node'), + ) parser.add_argument( '--vendor-interface', metavar='', @@ -1113,6 +1123,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.storage_interface: + storage_interface = [ + "storage_interface=%s" % parsed_args.storage_interface] + properties.extend(utils.args_array_to_patch( + 'add', storage_interface)) if parsed_args.vendor_interface: vendor_interface = [ "vendor_interface=%s" % parsed_args.vendor_interface] @@ -1343,6 +1358,12 @@ class UnsetBaremetalNode(command.Command): action='store_true', help=_('Unset RAID interface on this baremetal node'), ) + parser.add_argument( + "--storage-interface", + dest='storage_interface', + action='store_true', + help=_('Unset storage interface on this baremetal node'), + ) parser.add_argument( "--vendor-interface", dest='vendor_interface', @@ -1415,6 +1436,9 @@ class UnsetBaremetalNode(command.Command): if parsed_args.raid_interface: properties.extend(utils.args_array_to_patch('remove', ['raid_interface'])) + if parsed_args.storage_interface: + properties.extend(utils.args_array_to_patch('remove', + ['storage_interface'])) if parsed_args.vendor_interface: properties.extend(utils.args_array_to_patch('remove', ['vendor_interface'])) diff --git a/ironicclient/tests/unit/osc/v1/fakes.py b/ironicclient/tests/unit/osc/v1/fakes.py index 4225b4ec6..9254155c5 100644 --- a/ironicclient/tests/unit/osc/v1/fakes.py +++ b/ironicclient/tests/unit/osc/v1/fakes.py @@ -71,6 +71,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_storage_if = 'storage' baremetal_driver_default_vendor_if = 'vendor' baremetal_driver_enabled_boot_ifs = ['boot', 'boot2'] baremetal_driver_enabled_console_ifs = ['console', 'console2'] @@ -80,6 +81,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_storage_ifs = ['storage', 'storage2'] baremetal_driver_enabled_vendor_ifs = ['vendor', 'vendor2'] BAREMETAL_DRIVER = { @@ -94,6 +96,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_storage_interface': baremetal_driver_default_storage_if, 'default_vendor_interface': baremetal_driver_default_vendor_if, 'enabled_boot_interfaces': baremetal_driver_enabled_boot_ifs, 'enabled_console_interfaces': baremetal_driver_enabled_console_ifs, @@ -103,6 +106,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_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 6988d8795..85bfa79fb 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 Storage Interface', 'Default Vendor Interface', 'Enabled Boot Interfaces', 'Enabled Console Interfaces', @@ -105,6 +106,7 @@ class TestListBaremetalDriver(TestBaremetalDriver): 'Enabled Network Interfaces', 'Enabled Power Interfaces', 'Enabled RAID Interfaces', + 'Enabled Storage Interfaces', 'Enabled Vendor Interfaces' ) self.assertEqual(collist, tuple(columns)) @@ -121,6 +123,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_storage_if, baremetal_fakes.baremetal_driver_default_vendor_if, ', '.join(baremetal_fakes.baremetal_driver_enabled_boot_ifs), ', '.join(baremetal_fakes.baremetal_driver_enabled_console_ifs), @@ -130,6 +133,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_storage_ifs), ', '.join(baremetal_fakes.baremetal_driver_enabled_vendor_ifs), ),) self.assertEqual(datalist, tuple(data)) @@ -357,13 +361,13 @@ class TestShowBaremetalDriver(TestBaremetalDriver): 'default_deploy_interface', 'default_inspect_interface', 'default_management_interface', 'default_network_interface', 'default_power_interface', 'default_raid_interface', - 'default_vendor_interface', 'enabled_boot_interfaces', - 'enabled_console_interfaces', 'enabled_deploy_interfaces', - 'enabled_inspect_interfaces', + '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_vendor_interfaces', - 'hosts', 'name', 'type') + 'enabled_raid_interfaces', 'enabled_storage_interfaces', + 'enabled_vendor_interfaces', 'hosts', 'name', 'type') self.assertEqual(collist, columns) datalist = ( @@ -375,6 +379,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_storage_if, baremetal_fakes.baremetal_driver_default_vendor_if, ', '.join(baremetal_fakes.baremetal_driver_enabled_boot_ifs), ', '.join(baremetal_fakes.baremetal_driver_enabled_console_ifs), @@ -384,6 +389,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_storage_ifs), ', '.join(baremetal_fakes.baremetal_driver_enabled_vendor_ifs), ', '.join(baremetal_fakes.baremetal_driver_hosts), baremetal_fakes.baremetal_driver_name, diff --git a/ironicclient/tests/unit/osc/v1/test_baremetal_node.py b/ironicclient/tests/unit/osc/v1/test_baremetal_node.py index ffcbc271e..338321493 100644 --- a/ironicclient/tests/unit/osc/v1/test_baremetal_node.py +++ b/ironicclient/tests/unit/osc/v1/test_baremetal_node.py @@ -424,6 +424,11 @@ class TestBaremetalCreate(TestBaremetal): [('raid_interface', 'raid')], {'raid_interface': 'raid'}) + def test_baremetal_create_with_storage_interface(self): + self.check_with_options(['--storage-interface', 'storage'], + [('storage_interface', 'storage')], + {'storage_interface': 'storage'}) + def test_baremetal_create_with_vendor_interface(self): self.check_with_options(['--vendor-interface', 'vendor'], [('vendor_interface', 'vendor')], @@ -593,7 +598,7 @@ class TestBaremetalList(TestBaremetal): 'Deploy Interface', 'Inspect Interface', 'Management Interface', 'Network Interface', 'Power Interface', 'RAID Interface', - 'Vendor Interface') + 'Storage Interface', 'Vendor Interface') self.assertEqual(collist, columns) datalist = (( '', @@ -633,6 +638,7 @@ class TestBaremetalList(TestBaremetal): '', '', '', + '', ), ) self.assertEqual(datalist, tuple(data)) @@ -1857,6 +1863,9 @@ class TestBaremetalSet(TestBaremetal): def test_baremetal_set_raid_interface(self): self._test_baremetal_set_hardware_interface('raid') + def test_baremetal_set_storage_interface(self): + self._test_baremetal_set_hardware_interface('storage') + def test_baremetal_set_vendor_interface(self): self._test_baremetal_set_hardware_interface('vendor') @@ -2460,6 +2469,9 @@ class TestBaremetalUnset(TestBaremetal): def test_baremetal_unset_raid_interface(self): self._test_baremetal_unset_hw_interface('raid') + def test_baremetal_unset_storage_interface(self): + self._test_baremetal_unset_hw_interface('storage') + def test_baremetal_unset_vendor_interface(self): self._test_baremetal_unset_hw_interface('vendor') diff --git a/ironicclient/tests/unit/v1/test_driver_shell.py b/ironicclient/tests/unit/v1/test_driver_shell.py index 2b55f5165..aecf5700f 100644 --- a/ironicclient/tests/unit/v1/test_driver_shell.py +++ b/ironicclient/tests/unit/v1/test_driver_shell.py @@ -39,12 +39,12 @@ class DriverShellTest(utils.BaseTestCase): 'default_deploy_interface', 'default_inspect_interface', 'default_management_interface', 'default_network_interface', 'default_power_interface', 'default_raid_interface', - 'default_vendor_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_vendor_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 7ddaa4a1f..b30eb20af 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', + 'storage_interface', 'vendor_interface', 'power_state', 'properties', @@ -286,6 +287,16 @@ class NodeShellTest(utils.BaseTestCase): client_mock.node.create.assert_called_once_with( raid_interface='raid') + def test_do_node_create_with_storage_interface(self): + client_mock = mock.MagicMock() + args = mock.MagicMock() + args.storage_interface = 'storage' + args.json = False + + n_shell.do_node_create(client_mock, args) + client_mock.node.create.assert_called_once_with( + storage_interface='storage') + def test_do_node_create_with_vendor_interface(self): client_mock = mock.MagicMock() args = mock.MagicMock() diff --git a/ironicclient/v1/node.py b/ironicclient/v1/node.py index 61910d5d3..192d6e768 100644 --- a/ironicclient/v1/node.py +++ b/ironicclient/v1/node.py @@ -51,7 +51,8 @@ class NodeManager(base.CreateManager): 'deploy_interface', 'inspect_interface', 'management_interface', 'network_interface', 'power_interface', 'raid_interface', - 'vendor_interface', 'resource_class'] + '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/node_shell.py b/ironicclient/v1/node_shell.py index c399d95fd..8f0713fae 100644 --- a/ironicclient/v1/node_shell.py +++ b/ironicclient/v1/node_shell.py @@ -259,6 +259,10 @@ def do_node_list(cc, args): help='RAID interface used by the node\'s driver. This is ' 'only applicable when the specified --driver is a ' 'hardware type.') +@cliutils.arg( + '--storage-interface', + metavar='', + help='Storage interface used by the node\'s driver.') @cliutils.arg( '--vendor-interface', metavar='', @@ -278,7 +282,8 @@ def do_node_create(cc, args): 'deploy_interface', 'inspect_interface', 'management_interface', 'network_interface', 'power_interface', 'raid_interface', - 'vendor_interface', 'resource_class'] + 'storage_interface', 'vendor_interface', + 'resource_class'] fields = dict((k, v) for (k, v) in vars(args).items() if k in field_list and not (v is None)) fields = utils.args_array_to_dict(fields, 'driver_info') diff --git a/ironicclient/v1/resource_fields.py b/ironicclient/v1/resource_fields.py index e7ced11c9..ae4969824 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_storage_interface': 'Default Storage Interface', 'default_vendor_interface': 'Default Vendor Interface', 'description': 'Description', 'driver': 'Driver', @@ -60,6 +61,7 @@ class Resource(object): 'enabled_network_interfaces': 'Enabled Network Interfaces', 'enabled_power_interfaces': 'Enabled Power Interfaces', 'enabled_raid_interfaces': 'Enabled RAID Interfaces', + 'enabled_storage_interfaces': 'Enabled Storage Interfaces', 'enabled_vendor_interfaces': 'Enabled Vendor Interfaces', 'extra': 'Extra', 'hosts': 'Active host(s)', @@ -101,6 +103,7 @@ class Resource(object): 'network_interface': 'Network Interface', 'power_interface': 'Power Interface', 'raid_interface': 'RAID Interface', + 'storage_interface': 'Storage Interface', 'vendor_interface': 'Vendor Interface', 'standalone_ports_supported': 'Standalone Ports Supported', 'id': 'ID', @@ -219,6 +222,7 @@ NODE_DETAILED_RESOURCE = Resource( 'network_interface', 'power_interface', 'raid_interface', + 'storage_interface', 'vendor_interface', ], sort_excluded=[ @@ -326,6 +330,7 @@ DRIVER_DETAILED_RESOURCE = Resource( 'default_network_interface', 'default_power_interface', 'default_raid_interface', + 'default_storage_interface', 'default_vendor_interface', 'enabled_boot_interfaces', 'enabled_console_interfaces', @@ -335,6 +340,7 @@ DRIVER_DETAILED_RESOURCE = Resource( 'enabled_network_interfaces', 'enabled_power_interfaces', 'enabled_raid_interfaces', + 'enabled_storage_interfaces', 'enabled_vendor_interfaces' ], override_labels={'name': 'Supported driver(s)'} diff --git a/releasenotes/notes/node-driver-support-storage-interface-e93fc8d4de5d24d6.yaml b/releasenotes/notes/node-driver-support-storage-interface-e93fc8d4de5d24d6.yaml new file mode 100644 index 000000000..49d750af9 --- /dev/null +++ b/releasenotes/notes/node-driver-support-storage-interface-e93fc8d4de5d24d6.yaml @@ -0,0 +1,17 @@ +--- +features: + - | + Adds support for storage_interface for the commands below. + They are available starting with ironic API microversion 1.33. + + * ironic node-create + * ironic node-show + * ironic node-update + * ironic driver-list + * ironic driver-show + * openstack baremetal node create + * openstack baremetal node show + * openstack baremetal node set + * openstack baremetal node unset + * openstack baremetal driver list + * openstack baremetal driver show