Add support for logical names

Add client support for node logical names.

- update help strings to indicate places where Names can be used instead
  of UUIDs
- add new "-n" / "--name" parameter to "ironic node-create"
- add Name field to output of both "node-list" and "node-show"

Change-Id: Id16255e9611e95bd37a225ff475268f609726e37
Implements: blueprint logical-names
This commit is contained in:
Devananda van der Veen 2015-02-23 16:47:30 -08:00 committed by Jim Rollenhagen
parent 38c55e4401
commit 94abd4972d
5 changed files with 56 additions and 19 deletions

@ -32,6 +32,7 @@ NODE1 = {'id': 123,
'driver': 'fake',
'driver_info': {'user': 'foo', 'password': 'bar'},
'properties': {'num_cpu': 4},
'name': 'fake-node-1',
'extra': {}}
NODE2 = {'id': 456,
'uuid': '66666666-7777-8888-9999-111111111111',
@ -165,6 +166,13 @@ fake_responses = {
NODE2,
),
},
'/v1/nodes/%s' % NODE1['name']:
{
'GET': (
{},
NODE1,
),
},
'/v1/nodes/%s/ports' % NODE1['uuid']:
{
'GET': (
@ -342,6 +350,10 @@ class NodeManagerTest(testtools.TestCase):
self.assertEqual(expect, self.api.calls)
self.assertEqual(2, len(nodes))
def test_node_list_shows_name(self):
nodes = self.mgr.list()
self.assertIsNotNone(getattr(nodes[0], 'name'))
def test_node_list_limit(self):
self.api = utils.FakeAPI(fake_responses_pagination)
self.mgr = node.NodeManager(self.api)
@ -464,6 +476,14 @@ class NodeManagerTest(testtools.TestCase):
self.assertEqual(expect, self.api.calls)
self.assertEqual(NODE2['uuid'], node.uuid)
def test_node_show_by_name(self):
node = self.mgr.get(NODE1['name'])
expect = [
('GET', '/v1/nodes/%s' % NODE1['name'], {}, None),
]
self.assertEqual(expect, self.api.calls)
self.assertEqual(NODE1['uuid'], node.uuid)
def test_create(self):
node = self.mgr.create(**CREATE_NODE)
expect = [

@ -42,6 +42,7 @@ class NodeShellTest(utils.BaseTestCase):
'last_error',
'maintenance',
'maintenance_reason',
'name',
'power_state',
'properties',
'provision_state',
@ -147,6 +148,14 @@ class NodeShellTest(utils.BaseTestCase):
n_shell.do_node_create(client_mock, args)
client_mock.node.create.assert_called_once_with(uuid=args.uuid)
def test_do_node_create_with_name(self):
client_mock = mock.MagicMock()
args = mock.MagicMock()
args.name = 'node_name'
n_shell.do_node_create(client_mock, args)
client_mock.node.create.assert_called_once_with(name=args.name)
def test_do_node_show(self):
client_mock = mock.MagicMock()
args = mock.MagicMock()

@ -21,7 +21,7 @@ from ironicclient.common import utils
from ironicclient import exc
CREATION_ATTRIBUTES = ['chassis_uuid', 'driver', 'driver_info', 'extra',
'uuid', 'properties']
'uuid', 'properties', 'name']
class Node(base.Resource):

@ -33,7 +33,8 @@ def _print_node_show(node):
@cliutils.arg(
'node',
metavar='<id>',
help="UUID of the node (or instance UUID if --instance is specified).")
help="Name or UUID of the node "
"(or instance UUID if --instance is specified).")
@cliutils.arg(
'--instance',
dest='instance_uuid',
@ -151,10 +152,14 @@ def do_node_list(cc, args):
'-u', '--uuid',
metavar='<uuid>',
help="Unique UUID for the node.")
@cliutils.arg(
'-n', '--name',
metavar='<name>',
help="Unique name for the node.")
def do_node_create(cc, args):
"""Register a new node with the Ironic service."""
field_list = ['chassis_uuid', 'driver', 'driver_info',
'properties', 'extra', 'uuid']
'properties', 'extra', 'uuid', 'name']
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')
@ -166,7 +171,10 @@ def do_node_create(cc, args):
cliutils.print_dict(data, wrap=72)
@cliutils.arg('node', metavar='<node>', nargs='+', help="UUID of the node.")
@cliutils.arg('node',
metavar='<node>',
nargs='+',
help="Name or UUID of the node.")
def do_node_delete(cc, args):
"""Unregister a node from the Ironic service."""
for n in args.node:
@ -174,7 +182,7 @@ def do_node_delete(cc, args):
print(_('Deleted node %s') % n)
@cliutils.arg('node', metavar='<node>', help="UUID of the node.")
@cliutils.arg('node', metavar='<node>', help="Name or UUID of the node.")
@cliutils.arg(
'op',
metavar='<op>',
@ -197,7 +205,7 @@ def do_node_update(cc, args):
@cliutils.arg('node',
metavar='<node>',
help="UUID of the node.")
help="Name or UUID of the node.")
@cliutils.arg('method',
metavar='<method>',
help="Vendor-passthru method to be called.")
@ -279,7 +287,7 @@ def do_node_port_list(cc, args):
sortby_index=None)
@cliutils.arg('node', metavar='<node>', help="UUID of the node.")
@cliutils.arg('node', metavar='<node>', help="Name or UUID of the node.")
@cliutils.arg(
'maintenance_mode',
metavar='<maintenance-mode>',
@ -300,7 +308,7 @@ def do_node_set_maintenance(cc, args):
maint_reason=args.reason)
@cliutils.arg('node', metavar='<node>', help="UUID of the node.")
@cliutils.arg('node', metavar='<node>', help="Name or UUID of the node.")
@cliutils.arg(
'power_state',
metavar='<power-state>',
@ -311,7 +319,7 @@ def do_node_set_power_state(cc, args):
cc.node.set_power_state(args.node, args.power_state)
@cliutils.arg('node', metavar='<node>', help="UUID of the node.")
@cliutils.arg('node', metavar='<node>', help="Name or UUID of the node.")
@cliutils.arg(
'provision_state',
metavar='<provision state>',
@ -335,7 +343,7 @@ def do_node_set_provision_state(cc, args):
configdrive=args.config_drive)
@cliutils.arg('node', metavar='<node>', help="UUID of the node.")
@cliutils.arg('node', metavar='<node>', help="Name or UUID of the node.")
def do_node_validate(cc, args):
"""Validate a node's driver interfaces."""
ifaces = cc.node.validate(args.node)
@ -349,14 +357,14 @@ def do_node_validate(cc, args):
cliutils.print_list(obj_list, fields, field_labels=field_labels)
@cliutils.arg('node', metavar='<node>', help="UUID of the node.")
@cliutils.arg('node', metavar='<node>', help="Name or UUID of the node.")
def do_node_get_console(cc, args):
"""Get the connection information for a node's console, if enabled."""
info = cc.node.get_console(args.node)
cliutils.print_dict(info, wrap=72)
@cliutils.arg('node', metavar='<node>', help="UUID of the node.")
@cliutils.arg('node', metavar='<node>', help="Name or UUID of the node.")
@cliutils.arg(
'enabled',
metavar='<enabled>',
@ -368,7 +376,7 @@ def do_node_set_console_mode(cc, args):
cc.node.set_console_mode(args.node, args.enabled)
@cliutils.arg('node', metavar='<node>', help="UUID of the node.")
@cliutils.arg('node', metavar='<node>', help="Name or UUID of the node.")
@cliutils.arg(
'device',
metavar='<boot-device>',
@ -385,14 +393,14 @@ def do_node_set_boot_device(cc, args):
cc.node.set_boot_device(args.node, args.device, args.persistent)
@cliutils.arg('node', metavar='<node>', help="UUID of the node.")
@cliutils.arg('node', metavar='<node>', help="Name or UUID of the node.")
def do_node_get_boot_device(cc, args):
"""Get the current boot device for a node."""
boot_device = cc.node.get_boot_device(args.node)
cliutils.print_dict(boot_device, wrap=72)
@cliutils.arg('node', metavar='<node>', help="UUID of the node.")
@cliutils.arg('node', metavar='<node>', help="Name or UUID of the node.")
def do_node_get_supported_boot_devices(cc, args):
"""Get the supported boot devices for a node."""
boot_devices = cc.node.get_supported_boot_devices(args.node)

@ -37,7 +37,7 @@ NODE_FIELDS = ['chassis_uuid', 'created_at', 'console_enabled', 'driver',
'properties', 'provision_state', 'reservation',
'target_power_state', 'target_provision_state',
'updated_at', 'inspection_finished_at',
'inspection_started_at', 'uuid']
'inspection_started_at', 'uuid', 'name']
NODE_FIELD_LABELS = ['Chassis UUID', 'Created At', 'Console Enabled', 'Driver',
'Driver Info', 'Driver Internal Info', 'Extra',
@ -46,12 +46,12 @@ NODE_FIELD_LABELS = ['Chassis UUID', 'Created At', 'Console Enabled', 'Driver',
'Properties', 'Provision State', 'Reservation',
'Target Power State', 'Target Provision State',
'Updated At', 'Inspection Finished At',
'Inspection Started At', 'UUID']
'Inspection Started At', 'UUID', 'Name']
NODE_LIST_FIELDS = ['uuid', 'instance_uuid', 'power_state',
NODE_LIST_FIELDS = ['uuid', 'name', 'instance_uuid', 'power_state',
'provision_state', 'maintenance']
NODE_LIST_FIELD_LABELS = ['UUID', 'Instance UUID', 'Power State',
NODE_LIST_FIELD_LABELS = ['UUID', 'Name', 'Instance UUID', 'Power State',
'Provisioning State', 'Maintenance']