Extract the formatter methods as common utils

* Extract the formatter methods of image, flavor, address as common utils
* Support formatting address info of "server manage" command

Change-Id: I217a8b7e2489994eee4cf77cd373dc41722dbffe
This commit is contained in:
liusheng 2017-09-12 11:42:34 +08:00
parent fc7fa8cc98
commit 63f1e18393
4 changed files with 51 additions and 57 deletions

View File

@ -12,7 +12,6 @@
# License for the specific language governing permissions and limitations
# under the License.
#
import logging
@ -35,3 +34,32 @@ def get_response_body(resp):
else:
body = None
return body
def addresses_formatter(network_client, networks):
output = []
for (network, addresses) in networks.items():
if not addresses:
continue
addrs = [addr['addr'] for addr in addresses]
network_data = network_client.find_network(
network, ignore_missing=False)
net_ident = network_data.name or network_data.id
addresses_csv = ', '.join(addrs)
group = "%s=%s" % (net_ident, addresses_csv)
output.append(group)
return '; '.join(output)
def image_formatter(image_client, image_id):
if image_id:
image = image_client.images.get(image_id)
return '%s (%s)' % (image.name, image_id)
return ''
def flavor_formatter(bc_client, flavor_id):
if flavor_id:
flavor = bc_client.flavor.get(flavor_id)
return '%s (%s)' % (flavor.name, flavor_id)
return ''

View File

@ -17,15 +17,13 @@
"""Mogan v1 manageable servers action implementations"""
import json
import logging
from osc_lib.cli import parseractions
from osc_lib.command import command
from osc_lib import utils
from moganclient.common.i18n import _
LOG = logging.getLogger(__name__)
from moganclient.common import utils as cli_utils
class ListManageableServer(command.Lister):
@ -124,22 +122,10 @@ class ManageServer(command.ShowOne):
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
image_client = self.app.client_manager.image
network_client = self.app.client_manager.network
boot_kwargs = dict(
name=parsed_args.name,
@ -152,8 +138,13 @@ class ManageServer(command.ShowOne):
data._info.update(
{
'properties': utils.format_dict(data._info.pop('metadata')),
'flavor': self._format_flavor_field(data),
'image': self._format_image_field(data)
'flavor': cli_utils.flavor_formatter(
bc_client, data._info.pop('flavor_uuid')),
'image': cli_utils.image_formatter(
image_client, data._info.pop('image_uuid')),
'addresses': cli_utils.addresses_formatter(
network_client,
data._info.pop('addresses'))
},
)

View File

@ -15,7 +15,7 @@
"""Mogan v1 Baremetal server action implementations"""
import functools
import io
import json
import logging
@ -27,25 +27,11 @@ from osc_lib import exceptions
from osc_lib import utils
from moganclient.common.i18n import _
from moganclient.common import utils as cli_utils
LOG = logging.getLogger(__name__)
def _addresses_formatter(network_client, networks):
output = []
for (network, addresses) in networks.items():
if not addresses:
continue
addrs = [addr['addr'] for addr in addresses]
network_data = network_client.find_network(
network, ignore_missing=False)
net_ident = network_data.name or network_data.id
addresses_csv = ', '.join(addrs)
group = "%s=%s" % (net_ident, addresses_csv)
output.append(group)
return '; '.join(output)
class ServersActionBase(command.Command):
def _get_parser_with_action(self, prog_name, action):
parser = super(ServersActionBase, self).get_parser(prog_name)
@ -394,8 +380,8 @@ class ListServer(command.Lister):
data = bc_client.server.list(detailed=True,
all_projects=parsed_args.all_projects)
net_client = self.app.client_manager.network
addr_formatter = lambda addr: _addresses_formatter(net_client, addr)
formatters = {'addresses': addr_formatter,
addr_fmt = functools.partial(cli_utils.addresses_formatter, net_client)
formatters = {'addresses': addr_fmt,
'metadata': utils.format_dict
}
@ -455,20 +441,6 @@ class ShowServer(command.ShowOne):
)
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
data = utils.find_resource(
@ -478,14 +450,17 @@ class ShowServer(command.ShowOne):
# Special mapping for columns to make the output easier to read:
# 'metadata' --> 'properties'
network_client = self.app.client_manager.network
image_client = self.app.client_manager.image
data._info.update(
{
'properties': utils.format_dict(data._info.pop('metadata')),
'addresses': _addresses_formatter(
'addresses': cli_utils.addresses_formatter(
network_client,
data._info.pop('addresses')),
'image': self._format_image_field(data),
'flavor': self._format_flavor_field(data)
'image': cli_utils.image_formatter(
image_client, data._info.pop('image_uuid')),
'flavor': cli_utils.flavor_formatter(
bc_client, data._info.pop('flavor_uuid'))
},
)

View File

@ -161,11 +161,11 @@ class TestServerManage(TestManageableServer):
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,