From 07f5498842834823ec911811e6e9c8ba9ff4ac9b Mon Sep 17 00:00:00 2001 From: Akihiro Motoki Date: Wed, 3 May 2017 14:19:27 +0000 Subject: Use cliff formattable columns in network commands Use cliff formattable columns not to convert complex fields into a string when a machine readable format like JSON or YAML is requested. Partial-Bug: #1687955 Partially implement blueprint osc-formattable-columns Change-Id: If478fccd867a4bcd7c86e283c5aaf67a667cc080 --- openstackclient/network/v2/ip_availability.py | 3 +- openstackclient/network/v2/network.py | 30 ++++++++++-------- openstackclient/network/v2/network_agent.py | 23 ++++++++------ openstackclient/network/v2/port.py | 31 +++++++++--------- openstackclient/network/v2/router.py | 45 +++++++++++++++------------ openstackclient/network/v2/security_group.py | 15 +++++++-- openstackclient/network/v2/subnet.py | 30 +++++++++++------- openstackclient/network/v2/subnet_pool.py | 5 +-- 8 files changed, 109 insertions(+), 73 deletions(-) (limited to 'openstackclient/network') diff --git a/openstackclient/network/v2/ip_availability.py b/openstackclient/network/v2/ip_availability.py index 1d963580..ddc88e55 100644 --- a/openstackclient/network/v2/ip_availability.py +++ b/openstackclient/network/v2/ip_availability.py @@ -13,6 +13,7 @@ """IP Availability Info implementations""" +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import utils @@ -21,7 +22,7 @@ from openstackclient.identity import common as identity_common from openstackclient.network import sdk_utils _formatters = { - 'subnet_ip_availability': utils.format_list_of_dicts, + 'subnet_ip_availability': format_columns.ListDictColumn, } diff --git a/openstackclient/network/v2/network.py b/openstackclient/network/v2/network.py index 4c1725c5..742a0c5d 100644 --- a/openstackclient/network/v2/network.py +++ b/openstackclient/network/v2/network.py @@ -13,6 +13,8 @@ """Network action implementations""" +from cliff import columns as cliff_columns +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import utils @@ -23,24 +25,26 @@ from openstackclient.network import sdk_utils from openstackclient.network.v2 import _tag -def _format_admin_state(item): - return 'UP' if item else 'DOWN' +class AdminStateColumn(cliff_columns.FormattableColumn): + def human_readable(self): + return 'UP' if self._value else 'DOWN' -def _format_router_external(item): - return 'External' if item else 'Internal' +class RouterExternalColumn(cliff_columns.FormattableColumn): + def human_readable(self): + return 'External' if self._value else 'Internal' _formatters = { - 'subnets': utils.format_list, - 'subnet_ids': utils.format_list, - 'admin_state_up': _format_admin_state, - 'is_admin_state_up': _format_admin_state, - 'router:external': _format_router_external, - 'is_router_external': _format_router_external, - 'availability_zones': utils.format_list, - 'availability_zone_hints': utils.format_list, - 'tags': utils.format_list, + 'subnets': format_columns.ListColumn, + 'subnet_ids': format_columns.ListColumn, + 'admin_state_up': AdminStateColumn, + 'is_admin_state_up': AdminStateColumn, + 'router:external': RouterExternalColumn, + 'is_router_external': RouterExternalColumn, + 'availability_zones': format_columns.ListColumn, + 'availability_zone_hints': format_columns.ListColumn, + 'tags': format_columns.ListColumn, } diff --git a/openstackclient/network/v2/network_agent.py b/openstackclient/network/v2/network_agent.py index ed4970a4..5175002f 100644 --- a/openstackclient/network/v2/network_agent.py +++ b/openstackclient/network/v2/network_agent.py @@ -15,6 +15,8 @@ import logging +from cliff import columns as cliff_columns +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -26,19 +28,22 @@ from openstackclient.network import sdk_utils LOG = logging.getLogger(__name__) -def _format_alive(alive): - return ":-)" if alive else "XXX" +class AliveColumn(cliff_columns.FormattableColumn): + def human_readable(self): + return ":-)" if self._value else "XXX" -def _format_admin_state(state): - return 'UP' if state else 'DOWN' +class AdminStateColumn(cliff_columns.FormattableColumn): + def human_readable(self): + return 'UP' if self._value else 'DOWN' + _formatters = { - 'is_alive': _format_alive, - 'alive': _format_alive, - 'admin_state_up': _format_admin_state, - 'is_admin_state_up': _format_admin_state, - 'configurations': utils.format_dict, + 'is_alive': AliveColumn, + 'alive': AliveColumn, + 'admin_state_up': AdminStateColumn, + 'is_admin_state_up': AdminStateColumn, + 'configurations': format_columns.DictColumn, } diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py index 9536fe86..ce35cd1a 100644 --- a/openstackclient/network/v2/port.py +++ b/openstackclient/network/v2/port.py @@ -18,6 +18,8 @@ import copy import json import logging +from cliff import columns as cliff_columns +from osc_lib.cli import format_columns from osc_lib.cli import parseractions from osc_lib.command import command from osc_lib import exceptions @@ -32,23 +34,24 @@ from openstackclient.network.v2 import _tag LOG = logging.getLogger(__name__) -def _format_admin_state(state): - return 'UP' if state else 'DOWN' +class AdminStateColumn(cliff_columns.FormattableColumn): + def human_readable(self): + return 'UP' if self._value else 'DOWN' _formatters = { - 'admin_state_up': _format_admin_state, - 'is_admin_state_up': _format_admin_state, - 'allowed_address_pairs': utils.format_list_of_dicts, - 'binding_profile': utils.format_dict, - 'binding_vif_details': utils.format_dict, - 'binding:profile': utils.format_dict, - 'binding:vif_details': utils.format_dict, - 'dns_assignment': utils.format_list_of_dicts, - 'extra_dhcp_opts': utils.format_list_of_dicts, - 'fixed_ips': utils.format_list_of_dicts, - 'security_group_ids': utils.format_list, - 'tags': utils.format_list, + 'admin_state_up': AdminStateColumn, + 'is_admin_state_up': AdminStateColumn, + 'allowed_address_pairs': format_columns.ListDictColumn, + 'binding_profile': format_columns.DictColumn, + 'binding_vif_details': format_columns.DictColumn, + 'binding:profile': format_columns.DictColumn, + 'binding:vif_details': format_columns.DictColumn, + 'dns_assignment': format_columns.ListDictColumn, + 'extra_dhcp_opts': format_columns.ListDictColumn, + 'fixed_ips': format_columns.ListDictColumn, + 'security_group_ids': format_columns.ListColumn, + 'tags': format_columns.ListColumn, } diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py index 4f908537..fb0de4d2 100644 --- a/openstackclient/network/v2/router.py +++ b/openstackclient/network/v2/router.py @@ -18,6 +18,8 @@ import copy import json import logging +from cliff import columns as cliff_columns +from osc_lib.cli import format_columns from osc_lib.cli import parseractions from osc_lib.command import command from osc_lib import exceptions @@ -32,33 +34,36 @@ from openstackclient.network.v2 import _tag LOG = logging.getLogger(__name__) -def _format_admin_state(state): - return 'UP' if state else 'DOWN' +class AdminStateColumn(cliff_columns.FormattableColumn): + def human_readable(self): + return 'UP' if self._value else 'DOWN' -def _format_external_gateway_info(info): - try: - return json.dumps(info) - except (TypeError, KeyError): - return '' +class ExternalGatewayInfoColumn(cliff_columns.FormattableColumn): + def human_readable(self): + try: + return json.dumps(self._value) + except (TypeError, KeyError): + return '' -def _format_routes(routes): - # Map the route keys to match --route option. - for route in routes: - if 'nexthop' in route: - route['gateway'] = route.pop('nexthop') - return utils.format_list_of_dicts(routes) +class RoutesColumn(cliff_columns.FormattableColumn): + def human_readable(self): + # Map the route keys to match --route option. + for route in self._value: + if 'nexthop' in route: + route['gateway'] = route.pop('nexthop') + return utils.format_list_of_dicts(self._value) _formatters = { - 'admin_state_up': _format_admin_state, - 'is_admin_state_up': _format_admin_state, - 'external_gateway_info': _format_external_gateway_info, - 'availability_zones': utils.format_list, - 'availability_zone_hints': utils.format_list, - 'routes': _format_routes, - 'tags': utils.format_list, + 'admin_state_up': AdminStateColumn, + 'is_admin_state_up': AdminStateColumn, + 'external_gateway_info': ExternalGatewayInfoColumn, + 'availability_zones': format_columns.ListColumn, + 'availability_zone_hints': format_columns.ListColumn, + 'routes': RoutesColumn, + 'tags': format_columns.ListColumn, } diff --git a/openstackclient/network/v2/security_group.py b/openstackclient/network/v2/security_group.py index 75af3587..6be2d229 100644 --- a/openstackclient/network/v2/security_group.py +++ b/openstackclient/network/v2/security_group.py @@ -15,6 +15,7 @@ import argparse +from cliff import columns as cliff_columns from osc_lib import utils import six @@ -63,13 +64,23 @@ def _format_compute_security_group_rules(sg_rules): return utils.format_list(rules, separator='\n') +class NetworkSecurityGroupRulesColumn(cliff_columns.FormattableColumn): + def human_readable(self): + return _format_network_security_group_rules(self._value) + + +class ComputeSecurityGroupRulesColumn(cliff_columns.FormattableColumn): + def human_readable(self): + return _format_compute_security_group_rules(self._value) + + _formatters_network = { - 'security_group_rules': _format_network_security_group_rules, + 'security_group_rules': NetworkSecurityGroupRulesColumn, } _formatters_compute = { - 'rules': _format_compute_security_group_rules, + 'rules': ComputeSecurityGroupRulesColumn, } diff --git a/openstackclient/network/v2/subnet.py b/openstackclient/network/v2/subnet.py index b96dff7f..3470d24e 100644 --- a/openstackclient/network/v2/subnet.py +++ b/openstackclient/network/v2/subnet.py @@ -16,6 +16,8 @@ import copy import logging +from cliff import columns as cliff_columns +from osc_lib.cli import format_columns from osc_lib.cli import parseractions from osc_lib.command import command from osc_lib import exceptions @@ -40,23 +42,27 @@ def _update_arguments(obj_list, parsed_args_list, option): raise exceptions.CommandError(msg) -def _format_allocation_pools(data): - pool_formatted = ['%s-%s' % (pool.get('start', ''), pool.get('end', '')) - for pool in data] - return ','.join(pool_formatted) +class AllocationPoolsColumn(cliff_columns.FormattableColumn): + def human_readable(self): + pool_formatted = ['%s-%s' % (pool.get('start', ''), + pool.get('end', '')) + for pool in self._value] + return ','.join(pool_formatted) -def _format_host_routes(data): - # Map the host route keys to match --host-route option. - return utils.format_list_of_dicts(convert_entries_to_gateway(data)) +class HostRoutesColumn(cliff_columns.FormattableColumn): + def human_readable(self): + # Map the host route keys to match --host-route option. + return utils.format_list_of_dicts( + convert_entries_to_gateway(self._value)) _formatters = { - 'allocation_pools': _format_allocation_pools, - 'dns_nameservers': utils.format_list, - 'host_routes': _format_host_routes, - 'service_types': utils.format_list, - 'tags': utils.format_list, + 'allocation_pools': AllocationPoolsColumn, + 'dns_nameservers': format_columns.ListColumn, + 'host_routes': HostRoutesColumn, + 'service_types': format_columns.ListColumn, + 'tags': format_columns.ListColumn, } diff --git a/openstackclient/network/v2/subnet_pool.py b/openstackclient/network/v2/subnet_pool.py index a5839868..bd19ebce 100644 --- a/openstackclient/network/v2/subnet_pool.py +++ b/openstackclient/network/v2/subnet_pool.py @@ -16,6 +16,7 @@ import copy import logging +from osc_lib.cli import format_columns from osc_lib.cli import parseractions from osc_lib.command import command from osc_lib import exceptions @@ -42,8 +43,8 @@ def _get_columns(item): _formatters = { - 'prefixes': utils.format_list, - 'tags': utils.format_list, + 'prefixes': format_columns.ListColumn, + 'tags': format_columns.ListColumn, } -- cgit v1.2.1