Add the CLI for managing server
Add 'openstack baremetal server manage' command for managing an existing baremetal node. Change-Id: I3d950511fbd37f129473a4d509e69280ac7572ff Implements: bp manage-existing-bms
This commit is contained in:
parent
57d952fe36
commit
fc7fa8cc98
|
@ -107,4 +107,7 @@ BaremetalCompute manageable server
|
|||
==================================
|
||||
|
||||
.. autoprogram-cliff:: openstack.baremetal_compute.v1
|
||||
:command: baremetalcompute manageable server *
|
||||
:command: baremetalcompute manageable server list
|
||||
|
||||
.. autoprogram-cliff:: openstack.baremetal_compute.v1
|
||||
:command: baremetalcompute server manage
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
import json
|
||||
import logging
|
||||
|
||||
from osc_lib.cli import parseractions
|
||||
from osc_lib.command import command
|
||||
from osc_lib import utils
|
||||
|
||||
|
@ -91,3 +92,71 @@ class ListManageableServer(command.Lister):
|
|||
return (column_headers,
|
||||
(utils.get_item_properties(
|
||||
s, columns, formatters=formatters) for s in data))
|
||||
|
||||
|
||||
class ManageServer(command.ShowOne):
|
||||
"""Manage an existing bare metal node"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ManageServer, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
"node_uuid",
|
||||
metavar="<node_uuid>",
|
||||
help=_("The manageable bare metal node uuid")
|
||||
)
|
||||
parser.add_argument(
|
||||
"name",
|
||||
metavar="<name>",
|
||||
help=_("New bare metal server name")
|
||||
)
|
||||
parser.add_argument(
|
||||
"--description",
|
||||
metavar="<description>",
|
||||
help=_("Bare metal server description"),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--property',
|
||||
metavar='<key=value>',
|
||||
action=parseractions.KeyValueAction,
|
||||
help=_('Set a property on this server '
|
||||
'(repeat option to set multiple values)'),
|
||||
)
|
||||
|
||||
return parser
|
||||
|
||||
def _format_image_field(self, data):
|
||||
image_client = self.app.client_manager.image
|
||||
image_uuid = data._info.pop('image_uuid')
|
||||
if image_uuid:
|
||||
image = image_client.images.get(image_uuid)
|
||||
return '%s (%s)' % (image.name, image_uuid)
|
||||
|
||||
def _format_flavor_field(self, data):
|
||||
bc_client = self.app.client_manager.baremetal_compute
|
||||
flavor_uuid = data._info.pop('flavor_uuid')
|
||||
if flavor_uuid:
|
||||
flavor = bc_client.flavor.get(flavor_uuid)
|
||||
return '%s (%s)' % (flavor.name, flavor_uuid)
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
bc_client = self.app.client_manager.baremetal_compute
|
||||
|
||||
boot_kwargs = dict(
|
||||
name=parsed_args.name,
|
||||
node_uuid=parsed_args.node_uuid,
|
||||
description=parsed_args.description,
|
||||
metadata=parsed_args.property
|
||||
)
|
||||
|
||||
data = bc_client.manageable_server.manage(**boot_kwargs)
|
||||
data._info.update(
|
||||
{
|
||||
'properties': utils.format_dict(data._info.pop('metadata')),
|
||||
'flavor': self._format_flavor_field(data),
|
||||
'image': self._format_image_field(data)
|
||||
},
|
||||
)
|
||||
|
||||
info = {}
|
||||
info.update(data._info)
|
||||
return zip(*sorted(info.items()))
|
||||
|
|
|
@ -458,14 +458,16 @@ class ShowServer(command.ShowOne):
|
|||
def _format_image_field(self, data):
|
||||
image_client = self.app.client_manager.image
|
||||
image_uuid = data._info.pop('image_uuid')
|
||||
image = image_client.images.get(image_uuid)
|
||||
return '%s (%s)' % (image.name, image_uuid)
|
||||
if image_uuid:
|
||||
image = image_client.images.get(image_uuid)
|
||||
return '%s (%s)' % (image.name, image_uuid)
|
||||
|
||||
def _format_flavor_field(self, data):
|
||||
bc_client = self.app.client_manager.baremetal_compute
|
||||
flavor_uuid = data._info.pop('flavor_uuid')
|
||||
flavor = bc_client.flavor.get(flavor_uuid)
|
||||
return '%s (%s)' % (flavor.name, flavor_uuid)
|
||||
if flavor_uuid:
|
||||
flavor = bc_client.flavor.get(flavor_uuid)
|
||||
return '%s (%s)' % (flavor.name, flavor_uuid)
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
bc_client = self.app.client_manager.baremetal_compute
|
||||
|
|
|
@ -17,6 +17,7 @@ import copy
|
|||
import json
|
||||
|
||||
import mock
|
||||
from osc_lib import utils
|
||||
|
||||
from moganclient.osc.v1 import manageable_server
|
||||
from moganclient.tests.unit import base as test_base
|
||||
|
@ -24,6 +25,36 @@ from moganclient.tests.unit import fakes
|
|||
from moganclient.v1 import manageable_server as ms_mgr
|
||||
|
||||
|
||||
class TestManageableServer(test_base.TestBaremetalComputeV1):
|
||||
fake_server = fakes.FakeServer.create_one_server()
|
||||
|
||||
columns = (
|
||||
'addresses',
|
||||
'availability_zone',
|
||||
'created_at',
|
||||
'description',
|
||||
'flavor',
|
||||
'image',
|
||||
'links',
|
||||
'name',
|
||||
'node_uuid',
|
||||
'properties',
|
||||
'updated_at',
|
||||
'uuid')
|
||||
|
||||
data = (
|
||||
fake_server.addresses,
|
||||
fake_server.availability_zone,
|
||||
fake_server.created_at,
|
||||
fake_server.description,
|
||||
fake_server.flavor_uuid,
|
||||
fake_server.image_uuid,
|
||||
fake_server.links,
|
||||
fake_server.name,
|
||||
fake_server.updated_at,
|
||||
fake_server.uuid)
|
||||
|
||||
|
||||
@mock.patch.object(ms_mgr.ManageableServerManager, '_list')
|
||||
class TestManageableServerList(test_base.TestBaremetalComputeV1):
|
||||
def setUp(self):
|
||||
|
@ -88,3 +119,64 @@ class TestManageableServerList(test_base.TestBaremetalComputeV1):
|
|||
"755cac03-a460-4de0-8d8e-d1ac842768bf",
|
||||
"baremetal", p_str, pg_str
|
||||
),), tuple(data))
|
||||
|
||||
|
||||
class TestServerManage(TestManageableServer):
|
||||
def setUp(self):
|
||||
super(TestServerManage, self).setUp()
|
||||
self.cmd = manageable_server.ManageServer(self.app, None)
|
||||
mocked_img = mock.Mock()
|
||||
mocked_img.name = 'test-image'
|
||||
image_mock = mock.MagicMock()
|
||||
image_mock.images.get.return_value = mocked_img
|
||||
self.app.client_manager.image = image_mock
|
||||
|
||||
def _test_manage_fake_server(self, mock_create, name, node,
|
||||
description=None, properties=None):
|
||||
arglist = [node, name]
|
||||
verifylist = [
|
||||
('name', name),
|
||||
('node_uuid', node)]
|
||||
|
||||
called_data = {'name': name,
|
||||
'node_uuid': node}
|
||||
|
||||
if description:
|
||||
arglist.extend(['--description', description])
|
||||
verifylist.append(('description', description))
|
||||
called_data['description'] = description
|
||||
if properties:
|
||||
arglist.extend(['--property', properties])
|
||||
verifylist.append(('property', {'key1': 'test'}))
|
||||
called_data['metadata'] = {'key1': 'test'}
|
||||
|
||||
fk_server = fakes.FakeServer.create_one_server(called_data)
|
||||
fk_server._info['flavor_uuid'] = None
|
||||
|
||||
mock_create.return_value = fk_server
|
||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||
columns, data = self.cmd.take_action(parsed_args)
|
||||
mock_create.assert_called_once_with(
|
||||
'/manageable_servers',
|
||||
data=called_data)
|
||||
self.assertEqual(self.columns, columns)
|
||||
expected_data = (
|
||||
fk_server.addresses,
|
||||
fk_server.availability_zone,
|
||||
fk_server.created_at,
|
||||
fk_server.description,
|
||||
None,
|
||||
'test-image (%s)' % fk_server.image_uuid,
|
||||
fk_server.links,
|
||||
fk_server.name,
|
||||
fk_server.node_uuid,
|
||||
utils.format_dict(fk_server.metadata),
|
||||
fk_server.updated_at,
|
||||
fk_server.uuid)
|
||||
self.assertEqual(expected_data, data)
|
||||
|
||||
@mock.patch.object(ms_mgr.ManageableServerManager, '_create')
|
||||
def test_server_manage(self, mock_create):
|
||||
name = 'server1'
|
||||
node = 'aacdbd78-d670-409e-95aa-ecfcfb94fee2'
|
||||
self._test_manage_fake_server(mock_create, name, node)
|
||||
|
|
|
@ -26,3 +26,17 @@ class ManageableServerManager(base.ManagerWithFind):
|
|||
def list(self):
|
||||
url = '/manageable_servers'
|
||||
return self._list(url, response_key='manageable_servers')
|
||||
|
||||
def manage(self, name, node_uuid, description=None, metadata=None,):
|
||||
url = '/manageable_servers'
|
||||
data = {
|
||||
'name': name,
|
||||
'node_uuid': node_uuid
|
||||
}
|
||||
|
||||
if description is not None:
|
||||
data['description'] = description
|
||||
if metadata is not None:
|
||||
data['metadata'] = metadata
|
||||
|
||||
return self._create(url, data=data)
|
||||
|
|
|
@ -73,6 +73,7 @@ openstack.baremetal_compute.v1 =
|
|||
baremetalcompute_aggregate_list_node = moganclient.osc.v1.aggregate:AggregateListNode
|
||||
baremetalcompute_aggregate_remove_node = moganclient.osc.v1.aggregate:AggregateRemoveNode
|
||||
baremetalcompute_manageable_server_list = moganclient.osc.v1.manageable_server:ListManageableServer
|
||||
baremetalcompute_server_manage = moganclient.osc.v1.manageable_server:ManageServer
|
||||
|
||||
[build_sphinx]
|
||||
source-dir = doc/source
|
||||
|
|
Loading…
Reference in New Issue