From 1c7d2b320a72ad8da66e2948c0cfe22ffd632471 Mon Sep 17 00:00:00 2001 From: liusheng Date: Fri, 17 Feb 2017 17:08:16 +0800 Subject: [PATCH] Add support for showing network info of specified server Change-Id: I051c004fd9d0916f9f64dd17e26403a86216230c --- moganclient/osc/v1/server.py | 35 ++++++++++++++++++++ moganclient/tests/unit/osc/v1/test_server.py | 18 ++++++++++ moganclient/v1/server.py | 4 +++ setup.cfg | 1 + 4 files changed, 58 insertions(+) diff --git a/moganclient/osc/v1/server.py b/moganclient/osc/v1/server.py index cd889a7..6186b7e 100644 --- a/moganclient/osc/v1/server.py +++ b/moganclient/osc/v1/server.py @@ -16,6 +16,7 @@ """Mogan v1 Baremetal server action implementations""" +import json import logging from osc_lib.cli import parseractions @@ -436,3 +437,37 @@ class UnLockServer(ServersActionBase): def take_action(self, parsed_args): self._action_multiple_items(parsed_args, 'unlock', 'set_lock_state', lock_state=False) + + +class ShowServerNetworkInfo(command.Lister): + """Display baremetal server's network info""" + + def get_parser(self, prog_name): + parser = super(ShowServerNetworkInfo, self).get_parser(prog_name) + parser.add_argument( + 'server', + metavar='', + help=_("Baremetal server to display its network information (name " + "or UUID)") + ) + return parser + + def take_action(self, parsed_args): + bc_client = self.app.client_manager.baremetal_compute + server = utils.find_resource( + bc_client.server, + parsed_args.server, + ) + data = bc_client.server.get_network_info(server.uuid) + info = data._info + nics = [] + for port_id in list(info): + nic = {'port_id': port_id} + nic.update(info[port_id]) + nics.append(nic) + columns = ('network', 'port_id', 'mac_address', 'fixed_ips', + 'floatingip', 'port_type') + formatters = {'fixed_ips': lambda s: json.dumps(s, indent=4)} + return (columns, + (utils.get_dict_properties( + s, columns, formatters=formatters) for s in nics)) diff --git a/moganclient/tests/unit/osc/v1/test_server.py b/moganclient/tests/unit/osc/v1/test_server.py index f4ab5ee..19b0ae7 100644 --- a/moganclient/tests/unit/osc/v1/test_server.py +++ b/moganclient/tests/unit/osc/v1/test_server.py @@ -636,3 +636,21 @@ class TestServerUnLock(TestServerLockActionBase): mock_update_all, mock_find): self._test_server_lock_more_than_one_partly_failed( mock_update_all, mock_find) + + +@mock.patch.object(server_mgr.ServerManager, 'get_network_info') +@mock.patch.object(server_mgr.ServerManager, 'get') +class TestServerShowNetInfo(TestServer): + def setUp(self): + super(TestServerShowNetInfo, self).setUp() + self.cmd = server.ShowServerNetworkInfo(self.app, None) + self.fake_server = fakes.FakeServer.create_one_server() + + def test_server_netinfo_show(self, mock_get, mock_netinfo): + args = [self.fake_server.uuid] + verify_args = [('server', self.fake_server.uuid)] + mock_get.return_value = self.fake_server + parsed_args = self.check_parser(self.cmd, args, verify_args) + self.cmd.take_action(parsed_args) + mock_get.assert_called_once_with(self.fake_server.uuid) + mock_netinfo.assert_called_once_with(self.fake_server.uuid) diff --git a/moganclient/v1/server.py b/moganclient/v1/server.py index cabff37..d1bbaa3 100644 --- a/moganclient/v1/server.py +++ b/moganclient/v1/server.py @@ -71,3 +71,7 @@ class ServerManager(base.ManagerWithFind): def set_lock_state(self, server_id, lock_state): url = '/instances/%s/states/lock' % base.getid(server_id) return self._update_all(url, data={'target': lock_state}) + + def get_network_info(self, server_id): + url = '/instances/%s/networks' % base.getid(server_id) + return self._get(url, response_key='ports') diff --git a/setup.cfg b/setup.cfg index bc506dc..8990968 100644 --- a/setup.cfg +++ b/setup.cfg @@ -47,6 +47,7 @@ openstack.baremetal_compute.v1 = baremetal_server_reboot = moganclient.osc.v1.server:RebootServer baremetal_server_update = moganclient.osc.v1.server:UpdateServer baremetal_server_unlock = moganclient.osc.v1.server:UnLockServer + baremetal_server_netinfo = moganclient.osc.v1.server:ShowServerNetworkInfo baremetal_availability_zone_list = moganclient.osc.v1.availability_zone:ListAvailabilityZone