Add node-set-power-state to cli

Add the node-set-power-state command to allow changing the power state
of a node using the cli.

Change-Id: I176bfe54db84e1c5677f7955b9cf247f0d09be4e
This commit is contained in:
Lucas Alvares Gomes 2013-10-23 15:02:20 +01:00
parent 94e0fb78e4
commit ce93dd5ce1
5 changed files with 49 additions and 3 deletions

@ -71,9 +71,9 @@ class Manager(object):
return [obj_class(self, res, loaded=True) for res in data if res] return [obj_class(self, res, loaded=True) for res in data if res]
def _update(self, url, body, response_key=None): def _update(self, url, body, method='PATCH', response_key=None):
resp, body = self.api.json_request('PATCH', url, body=body) resp, body = self.api.json_request(method, url, body=body)
# PATCH requests may not return a body # PATCH/PUT requests may not return a body
if body: if body:
return self.resource_class(self, body) return self.resource_class(self, body)

@ -23,6 +23,9 @@ import ironicclient
from ironicclient import client as iroclient from ironicclient import client as iroclient
from ironicclient.common import utils from ironicclient.common import utils
from ironicclient import exc from ironicclient import exc
from ironicclient.openstack.common import gettextutils
gettextutils.install('ironicclient')
class IronicShell(object): class IronicShell(object):

@ -36,6 +36,9 @@ PORT = {'id': 456,
'address': 'AA:AA:AA:AA:AA:AA', 'address': 'AA:AA:AA:AA:AA:AA',
'extra': {}} 'extra': {}}
POWER_STATE = {'current': 'power off',
'target': 'power on'}
CREATE_NODE = copy.deepcopy(NODE) CREATE_NODE = copy.deepcopy(NODE)
del CREATE_NODE['id'] del CREATE_NODE['id']
del CREATE_NODE['uuid'] del CREATE_NODE['uuid']
@ -78,6 +81,13 @@ fixtures = {
{"ports": [PORT]}, {"ports": [PORT]},
), ),
}, },
'/v1/nodes/%s/state/power' % NODE['uuid']:
{
'PUT': (
{},
POWER_STATE,
),
},
} }
@ -140,3 +150,12 @@ class NodeManagerTest(testtools.TestCase):
self.assertEqual(len(ports), 1) self.assertEqual(len(ports), 1)
self.assertEqual(ports[0].uuid, PORT['uuid']) self.assertEqual(ports[0].uuid, PORT['uuid'])
self.assertEqual(ports[0].address, PORT['address']) self.assertEqual(ports[0].address, PORT['address'])
def test_node_set_power_state(self):
power_state = self.mgr.set_power_state(NODE['uuid'], "on")
body = {'target': 'power on'}
expect = [
('PUT', '/v1/nodes/%s/state/power' % NODE['uuid'], {}, body),
]
self.assertEqual(expect, self.api.calls)
self.assertEqual('power on', power_state.target)

@ -61,3 +61,8 @@ class NodeManager(base.Manager):
def update(self, node_id, patch): def update(self, node_id, patch):
return self._update(self._path(node_id), patch) return self._update(self._path(node_id), patch)
def set_power_state(self, node_id, state):
path = "%s/state/power" % node_id
target = {'target': "power %s" % state}
return self._update(self._path(path), target, method='PUT')

@ -134,3 +134,22 @@ def do_node_port_list(cc, args):
field_labels = ['UUID', 'Address'] field_labels = ['UUID', 'Address']
fields = ['uuid', 'address'] fields = ['uuid', 'address']
utils.print_list(ports, fields, field_labels, sortby=1) utils.print_list(ports, fields, field_labels, sortby=1)
@utils.arg('node',
metavar='<node id>',
help="ID of node")
@utils.arg('power_state',
metavar='<power state>',
choices=['on', 'off'],
help="Supported states: 'on' or 'off'")
def do_node_set_power_state(cc, args):
"""Power the node on or off."""
try:
state = cc.node.set_power_state(args.node, args.power_state)
except exc.HTTPNotFound:
raise exc.CommandError(_('Node not found: %s') % args.node)
field_list = ['current', 'target']
data = dict([(f, getattr(state, f, '')) for f in field_list])
utils.print_dict(data, wrap=72)