From c6887750f02b18695a6e1bd4e6e7097373b695f1 Mon Sep 17 00:00:00 2001 From: Shubham Date: Wed, 29 Apr 2020 14:17:00 +0530 Subject: [PATCH] Improve readability of vnflcm show command Display show command data in human_readable format for better readability for complex attributes of vnf instance like 'vimConnectionInfo', 'instantiatedVnfInfo', '_links'. Please checkout below link to see the difference in vnflcm show response data before and after resolving the issue. http://paste.openstack.org/show/792866 Change-Id: I52684618f7042f5566ea3bed7255d17d2fd61df2 --- tackerclient/osc/utils.py | 7 +++++++ tackerclient/osc/v1/vnflcm/vnflcm.py | 13 ++++++++----- tackerclient/osc/v1/vnfpkgm/vnf_package.py | 15 ++++----------- tackerclient/tests/unit/osc/v1/test_vnflcm.py | 14 ++++++++++---- .../tests/unit/osc/v1/vnf_package_fakes.py | 4 ++-- tackerclient/tests/unit/osc/v1/vnflcm_fakes.py | 11 ++++++++++- 6 files changed, 41 insertions(+), 23 deletions(-) diff --git a/tackerclient/osc/utils.py b/tackerclient/osc/utils.py index 8c31051d..205e271b 100644 --- a/tackerclient/osc/utils.py +++ b/tackerclient/osc/utils.py @@ -22,6 +22,7 @@ to this module. They should go to tackerclient.osc.v1.utils. import operator +from cliff import columns as cliff_columns from keystoneclient import exceptions as identity_exc from keystoneclient.v3 import domains from keystoneclient.v3 import projects @@ -205,3 +206,9 @@ def _find_identity_resource(identity_client_manager, name_or_id, # The above are borrowed from openstackclient.identity.common. + + +class FormatComplexDataColumn(cliff_columns.FormattableColumn): + + def human_readable(self): + return format_dict_with_indention(self._value) diff --git a/tackerclient/osc/v1/vnflcm/vnflcm.py b/tackerclient/osc/v1/vnflcm/vnflcm.py index 8a830b2e..049a9ecb 100644 --- a/tackerclient/osc/v1/vnflcm/vnflcm.py +++ b/tackerclient/osc/v1/vnflcm/vnflcm.py @@ -18,7 +18,6 @@ import logging import os import time -from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import utils @@ -52,6 +51,10 @@ EXTRA_WAITING_TIME = 10 SLEEP_TIME = 1 +formatters = {'vimConnectionInfo': tacker_osc_utils.FormatComplexDataColumn, + 'instantiatedVnfInfo': tacker_osc_utils.FormatComplexDataColumn, + '_links': tacker_osc_utils.FormatComplexDataColumn} + def _get_columns(vnflcm_obj, action=None): column_map = { @@ -132,9 +135,9 @@ class CreateVnfLcm(command.ShowOne): print((_('VNF Instance %(id)s is created and instantiation' ' request has been accepted.') % {'id': vnf['id']})) display_columns, columns = _get_columns(vnf) - data = utils.get_item_properties( - sdk_utils.DictModel(vnf), - columns, mixed_case_fields=_mixed_case_fields) + data = utils.get_item_properties(sdk_utils.DictModel(vnf), + columns, formatters=formatters, + mixed_case_fields=_mixed_case_fields) return (display_columns, data) @@ -156,7 +159,7 @@ class ShowVnfLcm(command.ShowOne): data = utils.get_item_properties( sdk_utils.DictModel(obj), columns, mixed_case_fields=_mixed_case_fields, - formatters={'instantiatedVnfInfo': format_columns.DictColumn}) + formatters=formatters) return (display_columns, data) diff --git a/tackerclient/osc/v1/vnfpkgm/vnf_package.py b/tackerclient/osc/v1/vnfpkgm/vnf_package.py index 7c1673a7..91838c65 100644 --- a/tackerclient/osc/v1/vnfpkgm/vnf_package.py +++ b/tackerclient/osc/v1/vnfpkgm/vnf_package.py @@ -17,7 +17,6 @@ from functools import reduce import logging import sys -from cliff import columns as cliff_columns from osc_lib.cli import parseractions from osc_lib.command import command from osc_lib import utils @@ -30,16 +29,10 @@ from tackerclient.osc import utils as tacker_osc_utils LOG = logging.getLogger(__name__) -class FormatComplexDataColumn(cliff_columns.FormattableColumn): - - def human_readable(self): - return tacker_osc_utils.format_dict_with_indention(self._value) - - -formatters = {'softwareImages': FormatComplexDataColumn, - 'checksum': FormatComplexDataColumn, - '_links': FormatComplexDataColumn, - 'userDefinedData': FormatComplexDataColumn} +formatters = {'softwareImages': tacker_osc_utils.FormatComplexDataColumn, + 'checksum': tacker_osc_utils.FormatComplexDataColumn, + '_links': tacker_osc_utils.FormatComplexDataColumn, + 'userDefinedData': tacker_osc_utils.FormatComplexDataColumn} _mixed_case_fields = ('usageState', 'onboardingState', 'operationalState', diff --git a/tackerclient/tests/unit/osc/v1/test_vnflcm.py b/tackerclient/tests/unit/osc/v1/test_vnflcm.py index 3a88f14a..f45ab6ce 100644 --- a/tackerclient/tests/unit/osc/v1/test_vnflcm.py +++ b/tackerclient/tests/unit/osc/v1/test_vnflcm.py @@ -105,7 +105,9 @@ class TestCreateVnfLcm(TestVnfLcm): json={}, headers=self.header) sys.stdout = buffer = StringIO() - columns, data = (self.create_vnf_lcm.take_action(parsed_args)) + actual_columns, data = (self.create_vnf_lcm.take_action(parsed_args)) + + headers, attributes = vnflcm._get_columns(json) expected_message = ( 'VNF Instance ' + json['id'] + ' is created and instantiation ' @@ -114,9 +116,9 @@ class TestCreateVnfLcm(TestVnfLcm): self.assertEqual(expected_message, buffer.getvalue().strip()) self.assertItemsEqual(_get_columns_vnflcm(), - columns) - self.assertItemsEqual(vnflcm_fakes.get_vnflcm_data(json), - data) + actual_columns) + self.assertListItemsEqual(vnflcm_fakes.get_vnflcm_data( + json, columns=attributes), data) class TestShowVnfLcm(TestVnfLcm): @@ -145,6 +147,10 @@ class TestShowVnfLcm(TestVnfLcm): columns, data = (self.show_vnf_lcm.take_action(parsed_args)) self.assertItemsEqual(_get_columns_vnflcm(action='show'), columns) + headers, attributes = vnflcm._get_columns(vnf_instance, action='show') + self.assertListItemsEqual( + vnflcm_fakes.get_vnflcm_data(vnf_instance, columns=attributes), + data) class TestListVnfLcm(TestVnfLcm): diff --git a/tackerclient/tests/unit/osc/v1/vnf_package_fakes.py b/tackerclient/tests/unit/osc/v1/vnf_package_fakes.py index b9ad73b6..e866521a 100644 --- a/tackerclient/tests/unit/osc/v1/vnf_package_fakes.py +++ b/tackerclient/tests/unit/osc/v1/vnf_package_fakes.py @@ -15,7 +15,7 @@ from oslo_utils import uuidutils -from tackerclient.osc.v1.vnfpkgm import vnf_package +from tackerclient.osc import utils as tacker_osc_utils def vnf_package_obj(attrs=None, onboarded_state=False): @@ -106,7 +106,7 @@ def get_vnf_package_data(vnf_package_obj, **kwargs): for attribute in complex_attributes: if vnf_package_obj.get(attribute): vnf_package_obj.update( - {attribute: vnf_package.FormatComplexDataColumn( + {attribute: tacker_osc_utils.FormatComplexDataColumn( vnf_package_obj[attribute])}) if kwargs.get('list_action'): diff --git a/tackerclient/tests/unit/osc/v1/vnflcm_fakes.py b/tackerclient/tests/unit/osc/v1/vnflcm_fakes.py index 02a76172..828940d0 100644 --- a/tackerclient/tests/unit/osc/v1/vnflcm_fakes.py +++ b/tackerclient/tests/unit/osc/v1/vnflcm_fakes.py @@ -16,6 +16,8 @@ from oslo_utils.fixture import uuidsentinel from oslo_utils import uuidutils +from tackerclient.osc import utils as tacker_osc_utils + def vnf_instance_response(attrs=None, instantiation_state='NOT_INSTANTIATED'): """Create a fake vnf instance. @@ -117,6 +119,12 @@ def get_vnflcm_data(vnf_instance, list_action=False, columns=None): :return: A tuple object sorted based on the name of the columns. """ + complex_attributes = ['vimConnectionInfo', 'instantiatedVnfInfo', '_links'] + for attribute in complex_attributes: + if vnf_instance.get(attribute): + vnf_instance.update( + {attribute: tacker_osc_utils.FormatComplexDataColumn( + vnf_instance[attribute])}) if list_action: for item in ['vnfInstanceDescription', 'vnfdVersion']: @@ -126,7 +134,8 @@ def get_vnflcm_data(vnf_instance, list_action=False, columns=None): if columns: return tuple([vnf_instance[key] for key in columns]) - return tuple([vnf_instance[key] for key in sorted(vnf_instance.keys())]) + return tuple([vnf_instance[key] for key in sorted( + vnf_instance.keys())]) def create_vnf_instances(count=2):