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
This commit is contained in:
Dao Cong Tien 2017-05-19 12:25:26 +07:00 committed by John L. Villalovos
parent 15dc9cf958
commit 525f60912c
11 changed files with 98 additions and 12 deletions

View File

@ -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)

View File

@ -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='<storage_interface>',
help=_('Storage interface used by the node\'s driver.'))
parser.add_argument(
'--vendor-interface',
metavar='<vendor_interface>',
@ -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='<raid_interface>',
help=_('Set the RAID interface for the node'),
)
parser.add_argument(
'--storage-interface',
metavar='<storage_interface>',
help=_('Set the storage interface for the node'),
)
parser.add_argument(
'--vendor-interface',
metavar='<vendor_interface>',
@ -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']))

View File

@ -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,
}

View File

@ -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,

View File

@ -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')

View File

@ -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))

View File

@ -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()

View File

@ -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,

View File

@ -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='<storage-interface>',
help='Storage interface used by the node\'s driver.')
@cliutils.arg(
'--vendor-interface',
metavar='<vendor-interface>',
@ -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')

View File

@ -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)'}

View File

@ -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