diff options
Diffstat (limited to 'openstackclient')
33 files changed, 330 insertions, 211 deletions
diff --git a/openstackclient/api/auth_plugin.py b/openstackclient/api/auth_plugin.py deleted file mode 100644 index a106b1eb..00000000 --- a/openstackclient/api/auth_plugin.py +++ /dev/null @@ -1,61 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# - -"""Authentication Plugin Library""" - -from keystoneauth1 import loading -from keystoneauth1 import token_endpoint - -from openstackclient.i18n import _ - - -class TokenEndpoint(loading.BaseLoader): - """Auth plugin to handle traditional token/endpoint usage - - Keystoneauth contains a Token plugin class that now correctly - handles the token/endpoint auth compatible with OSC. However, - the AdminToken loader deprecates the 'url' argument, which breaks - OSC compatibility, so make one that works. - """ - - @property - def plugin_class(self): - return token_endpoint.Token - - def load_from_options(self, url, token, **kwargs): - """A plugin for static authentication with an existing token - - :param string url: Service endpoint - :param string token: Existing token - """ - - return super(TokenEndpoint, self).load_from_options( - endpoint=url, - token=token, - ) - - def get_options(self): - """Return the legacy options""" - - options = [ - loading.Opt( - 'url', - help=_('Specific service endpoint to use'), - ), - loading.Opt( - 'token', - secret=True, - help=_('Authentication token to use'), - ), - ] - return options diff --git a/openstackclient/compute/v2/hypervisor.py b/openstackclient/compute/v2/hypervisor.py index 406aa917..0d367fee 100644 --- a/openstackclient/compute/v2/hypervisor.py +++ b/openstackclient/compute/v2/hypervisor.py @@ -112,7 +112,7 @@ class ShowHypervisor(command.ShowOne): # example: 17:37:14 up 2:33, 3 users, # load average: 0.33, 0.36, 0.34 m = re.match( - "\s*(.+)\sup\s+(.+),\s+(.+)\susers?,\s+load average:\s(.+)", + r"\s*(.+)\sup\s+(.+),\s+(.+)\susers?,\s+load average:\s(.+)", uptime['uptime']) if m: hypervisor["host_time"] = m.group(1) diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index 493fd5ad..538c9c4f 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -79,37 +79,37 @@ def _format_servers_list_power_state(state): def _get_ip_address(addresses, address_type, ip_address_family): - # Old style addresses - if address_type in addresses: - for addy in addresses[address_type]: + # Old style addresses + if address_type in addresses: + for addy in addresses[address_type]: + if int(addy['version']) in ip_address_family: + return addy['addr'] + + # New style addresses + new_address_type = address_type + if address_type == 'public': + new_address_type = 'floating' + if address_type == 'private': + new_address_type = 'fixed' + for network in addresses: + for addy in addresses[network]: + # Case where it is list of strings + if isinstance(addy, six.string_types): + if new_address_type == 'fixed': + return addresses[network][0] + else: + return addresses[network][-1] + # Case where it is a dict + if 'OS-EXT-IPS:type' not in addy: + continue + if addy['OS-EXT-IPS:type'] == new_address_type: if int(addy['version']) in ip_address_family: return addy['addr'] - - # New style addresses - new_address_type = address_type - if address_type == 'public': - new_address_type = 'floating' - if address_type == 'private': - new_address_type = 'fixed' - for network in addresses: - for addy in addresses[network]: - # Case where it is list of strings - if isinstance(addy, six.string_types): - if new_address_type == 'fixed': - return addresses[network][0] - else: - return addresses[network][-1] - # Case where it is a dict - if 'OS-EXT-IPS:type' not in addy: - continue - if addy['OS-EXT-IPS:type'] == new_address_type: - if int(addy['version']) in ip_address_family: - return addy['addr'] - msg = _("ERROR: No %(type)s IP version %(family)s address found") - raise exceptions.CommandError( - msg % {"type": address_type, - "family": ip_address_family} - ) + msg = _("ERROR: No %(type)s IP version %(family)s address found") + raise exceptions.CommandError( + msg % {"type": address_type, + "family": ip_address_family} + ) def _prefix_checked_value(prefix): @@ -2811,12 +2811,32 @@ class UnshelveServer(command.Command): nargs='+', help=_('Server(s) to unshelve (name or ID)'), ) + parser.add_argument( + '--availability-zone', + default=None, + help=_('Name of the availability zone in which to unshelve a ' + 'SHELVED_OFFLOADED server (supported by ' + '--os-compute-api-version 2.77 or above)'), + ) return parser def take_action(self, parsed_args): compute_client = self.app.client_manager.compute + support_az = compute_client.api_version >= api_versions.APIVersion( + '2.77') + if not support_az and parsed_args.availability_zone: + msg = _("--os-compute-api-version 2.77 or greater is required " + "to support the '--availability-zone' option.") + raise exceptions.CommandError(msg) + for server in parsed_args.server: - utils.find_resource( - compute_client.servers, - server, - ).unshelve() + if support_az: + utils.find_resource( + compute_client.servers, + server + ).unshelve(availability_zone=parsed_args.availability_zone) + else: + utils.find_resource( + compute_client.servers, + server, + ).unshelve() diff --git a/openstackclient/network/v2/address_scope.py b/openstackclient/network/v2/address_scope.py index 71c1a9af..7efbb631 100644 --- a/openstackclient/network/v2/address_scope.py +++ b/openstackclient/network/v2/address_scope.py @@ -15,6 +15,7 @@ import logging +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -27,6 +28,11 @@ from openstackclient.network import sdk_utils LOG = logging.getLogger(__name__) +_formatters = { + 'location': format_columns.DictColumn, +} + + def _get_columns(item): column_map = { 'is_shared': 'shared', @@ -100,7 +106,7 @@ class CreateAddressScope(command.ShowOne): attrs = _get_attrs(self.app.client_manager, parsed_args) obj = client.create_address_scope(**attrs) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns, formatters={}) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) @@ -289,6 +295,6 @@ class ShowAddressScope(command.ShowOne): parsed_args.address_scope, ignore_missing=False) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns, formatters={}) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) diff --git a/openstackclient/network/v2/floating_ip.py b/openstackclient/network/v2/floating_ip.py index 8ac8e107..e0aa0435 100644 --- a/openstackclient/network/v2/floating_ip.py +++ b/openstackclient/network/v2/floating_ip.py @@ -13,6 +13,7 @@ """IP Floating action implementations""" +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import utils @@ -24,6 +25,7 @@ from openstackclient.network.v2 import _tag _formatters = { + 'location': format_columns.DictColumn, 'port_details': utils.format_dict, } diff --git a/openstackclient/network/v2/ip_availability.py b/openstackclient/network/v2/ip_availability.py index ddc88e55..c026baa0 100644 --- a/openstackclient/network/v2/ip_availability.py +++ b/openstackclient/network/v2/ip_availability.py @@ -21,7 +21,9 @@ from openstackclient.i18n import _ from openstackclient.identity import common as identity_common from openstackclient.network import sdk_utils + _formatters = { + 'location': format_columns.DictColumn, 'subnet_ip_availability': format_columns.ListDictColumn, } diff --git a/openstackclient/network/v2/network.py b/openstackclient/network/v2/network.py index 63aec714..09f3556c 100644 --- a/openstackclient/network/v2/network.py +++ b/openstackclient/network/v2/network.py @@ -40,6 +40,7 @@ _formatters = { 'subnet_ids': format_columns.ListColumn, 'admin_state_up': AdminStateColumn, 'is_admin_state_up': AdminStateColumn, + 'location': format_columns.DictColumn, 'router:external': RouterExternalColumn, 'is_router_external': RouterExternalColumn, 'availability_zones': format_columns.ListColumn, diff --git a/openstackclient/network/v2/network_agent.py b/openstackclient/network/v2/network_agent.py index 16784854..a6ed3629 100644 --- a/openstackclient/network/v2/network_agent.py +++ b/openstackclient/network/v2/network_agent.py @@ -43,6 +43,7 @@ _formatters = { 'alive': AliveColumn, 'admin_state_up': AdminStateColumn, 'is_admin_state_up': AdminStateColumn, + 'location': format_columns.DictColumn, 'configurations': format_columns.DictColumn, } diff --git a/openstackclient/network/v2/network_auto_allocated_topology.py b/openstackclient/network/v2/network_auto_allocated_topology.py index 36f39200..f6070a02 100644 --- a/openstackclient/network/v2/network_auto_allocated_topology.py +++ b/openstackclient/network/v2/network_auto_allocated_topology.py @@ -15,6 +15,7 @@ import logging +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import utils @@ -25,6 +26,11 @@ from openstackclient.network import sdk_utils LOG = logging.getLogger(__name__) +_formatters = { + 'location': format_columns.DictColumn, +} + + def _get_columns(item): column_map = { 'tenant_id': 'project_id', @@ -93,16 +99,17 @@ class CreateAutoAllocatedTopology(command.ShowOne): obj = client.validate_auto_allocated_topology(parsed_args.project) columns = _format_check_resource_columns() - data = utils.get_item_properties(_format_check_resource(obj), - columns, - formatters={}) - + data = utils.get_item_properties( + _format_check_resource(obj), + columns, + formatters=_formatters, + ) return (columns, data) def get_topology(self, client, parsed_args): obj = client.get_auto_allocated_topology(parsed_args.project) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns, formatters={}) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) def take_action(self, parsed_args): diff --git a/openstackclient/network/v2/network_flavor.py b/openstackclient/network/v2/network_flavor.py index c9d368bf..355d04c1 100644 --- a/openstackclient/network/v2/network_flavor.py +++ b/openstackclient/network/v2/network_flavor.py @@ -15,6 +15,7 @@ import logging +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -27,6 +28,11 @@ from openstackclient.network import sdk_utils LOG = logging.getLogger(__name__) +_formatters = { + 'location': format_columns.DictColumn, +} + + def _get_columns(item): column_map = { 'is_enabled': 'enabled', @@ -136,7 +142,7 @@ class CreateNetworkFlavor(command.ShowOne): attrs = _get_attrs(self.app.client_manager, parsed_args) obj = client.create_flavor(**attrs) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns, formatters={}) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) @@ -300,5 +306,5 @@ class ShowNetworkFlavor(command.ShowOne): client = self.app.client_manager.network obj = client.find_flavor(parsed_args.flavor, ignore_missing=False) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return display_columns, data diff --git a/openstackclient/network/v2/network_flavor_profile.py b/openstackclient/network/v2/network_flavor_profile.py index 6cf0c412..492fd432 100644 --- a/openstackclient/network/v2/network_flavor_profile.py +++ b/openstackclient/network/v2/network_flavor_profile.py @@ -13,6 +13,7 @@ import logging +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -25,6 +26,11 @@ from openstackclient.network import sdk_utils LOG = logging.getLogger(__name__) +_formatters = { + 'location': format_columns.DictColumn, +} + + def _get_columns(item): column_map = { 'is_enabled': 'enabled', @@ -110,7 +116,7 @@ class CreateNetworkFlavorProfile(command.ShowOne): obj = client.create_service_profile(**attrs) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns, formatters={}) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) @@ -246,5 +252,5 @@ class ShowNetworkFlavorProfile(command.ShowOne): obj = client.find_service_profile(parsed_args.flavor_profile, ignore_missing=False) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) diff --git a/openstackclient/network/v2/network_meter.py b/openstackclient/network/v2/network_meter.py index df0e1da1..cde7a304 100644 --- a/openstackclient/network/v2/network_meter.py +++ b/openstackclient/network/v2/network_meter.py @@ -15,6 +15,7 @@ import logging +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -26,6 +27,11 @@ from openstackclient.network import sdk_utils LOG = logging.getLogger(__name__) +_formatters = { + 'location': format_columns.DictColumn, +} + + def _get_columns(item): column_map = { 'is_shared': 'shared', @@ -102,7 +108,7 @@ class CreateMeter(command.ShowOne): attrs = _get_attrs(self.app.client_manager, parsed_args) obj = client.create_metering_label(**attrs) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns, formatters={}) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) @@ -186,5 +192,5 @@ class ShowMeter(command.ShowOne): obj = client.find_metering_label(parsed_args.meter, ignore_missing=False) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return display_columns, data diff --git a/openstackclient/network/v2/network_meter_rule.py b/openstackclient/network/v2/network_meter_rule.py index 49ff9e1b..5f31255a 100644 --- a/openstackclient/network/v2/network_meter_rule.py +++ b/openstackclient/network/v2/network_meter_rule.py @@ -15,6 +15,7 @@ import logging +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -26,6 +27,11 @@ from openstackclient.network import sdk_utils LOG = logging.getLogger(__name__) +_formatters = { + 'location': format_columns.DictColumn, +} + + def _get_columns(item): column_map = { 'tenant_id': 'project_id', @@ -116,7 +122,7 @@ class CreateMeterRule(command.ShowOne): attrs = _get_attrs(self.app.client_manager, parsed_args) obj = client.create_metering_label_rule(**attrs) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns, formatters={}) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) @@ -199,5 +205,5 @@ class ShowMeterRule(command.ShowOne): obj = client.find_metering_label_rule(parsed_args.meter_rule_id, ignore_missing=False) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return display_columns, data diff --git a/openstackclient/network/v2/network_qos_policy.py b/openstackclient/network/v2/network_qos_policy.py index fd5ff937..1622de4a 100644 --- a/openstackclient/network/v2/network_qos_policy.py +++ b/openstackclient/network/v2/network_qos_policy.py @@ -15,6 +15,7 @@ import logging +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -27,6 +28,11 @@ from openstackclient.network import sdk_utils LOG = logging.getLogger(__name__) +_formatters = { + 'location': format_columns.DictColumn, +} + + def _get_columns(item): column_map = { 'is_shared': 'shared', @@ -119,7 +125,7 @@ class CreateNetworkQosPolicy(command.ShowOne): attrs = _get_attrs(self.app.client_manager, parsed_args) obj = client.create_qos_policy(**attrs) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns, formatters={}) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) @@ -279,5 +285,5 @@ class ShowNetworkQosPolicy(command.ShowOne): obj = client.find_qos_policy(parsed_args.policy, ignore_missing=False) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) diff --git a/openstackclient/network/v2/network_qos_rule.py b/openstackclient/network/v2/network_qos_rule.py index 28c5600a..d74beda7 100644 --- a/openstackclient/network/v2/network_qos_rule.py +++ b/openstackclient/network/v2/network_qos_rule.py @@ -15,6 +15,7 @@ import itertools +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -46,6 +47,11 @@ ACTION_SET = 'update' ACTION_SHOW = 'get' +_formatters = { + 'location': format_columns.DictColumn, +} + + def _get_columns(item): column_map = { 'tenant_id': 'project_id', @@ -208,7 +214,7 @@ class CreateNetworkQosRule(command.ShowOne): msg = (_('Failed to create Network QoS rule: %(e)s') % {'e': e}) raise exceptions.CommandError(msg) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return display_columns, data @@ -358,5 +364,5 @@ class ShowNetworkQosRule(command.ShowOne): {'rule': rule_id, 'e': e}) raise exceptions.CommandError(msg) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return display_columns, data diff --git a/openstackclient/network/v2/network_qos_rule_type.py b/openstackclient/network/v2/network_qos_rule_type.py index 7b92c8ad..e842944c 100644 --- a/openstackclient/network/v2/network_qos_rule_type.py +++ b/openstackclient/network/v2/network_qos_rule_type.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import utils @@ -20,6 +21,11 @@ from openstackclient.i18n import _ from openstackclient.network import sdk_utils +_formatters = { + 'location': format_columns.DictColumn, +} + + def _get_columns(item): column_map = { "type": "rule_type_name", @@ -65,5 +71,5 @@ class ShowNetworkQosRuleType(command.ShowOne): client = self.app.client_manager.network obj = client.get_qos_rule_type(parsed_args.rule_type) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return display_columns, data diff --git a/openstackclient/network/v2/network_rbac.py b/openstackclient/network/v2/network_rbac.py index 140c837e..1781193f 100644 --- a/openstackclient/network/v2/network_rbac.py +++ b/openstackclient/network/v2/network_rbac.py @@ -15,6 +15,7 @@ import logging +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -27,6 +28,11 @@ from openstackclient.network import sdk_utils LOG = logging.getLogger(__name__) +_formatters = { + 'location': format_columns.DictColumn, +} + + def _get_columns(item): column_map = { 'target_tenant': 'target_project_id', @@ -136,7 +142,7 @@ class CreateNetworkRBAC(command.ShowOne): attrs = _get_attrs(self.app.client_manager, parsed_args) obj = client.create_rbac_policy(**attrs) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return display_columns, data @@ -293,5 +299,5 @@ class ShowNetworkRBAC(command.ShowOne): obj = client.find_rbac_policy(parsed_args.rbac_policy, ignore_missing=False) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return display_columns, data diff --git a/openstackclient/network/v2/network_segment.py b/openstackclient/network/v2/network_segment.py index c1a672e2..5899dc69 100644 --- a/openstackclient/network/v2/network_segment.py +++ b/openstackclient/network/v2/network_segment.py @@ -15,6 +15,7 @@ import logging +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -26,6 +27,11 @@ from openstackclient.network import sdk_utils LOG = logging.getLogger(__name__) +_formatters = { + 'location': format_columns.DictColumn, +} + + def _get_columns(item): return sdk_utils.get_osc_show_columns_for_sdk_resource(item, {}) @@ -90,7 +96,7 @@ class CreateNetworkSegment(command.ShowOne): attrs['segmentation_id'] = parsed_args.segment obj = client.create_segment(**attrs) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) @@ -242,5 +248,5 @@ class ShowNetworkSegment(command.ShowOne): ignore_missing=False ) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) diff --git a/openstackclient/network/v2/network_segment_range.py b/openstackclient/network/v2/network_segment_range.py index 567b5b6e..f03bcc1c 100644 --- a/openstackclient/network/v2/network_segment_range.py +++ b/openstackclient/network/v2/network_segment_range.py @@ -19,6 +19,7 @@ import itertools import logging +from osc_lib.cli import format_columns from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -31,6 +32,10 @@ from openstackclient.network import sdk_utils LOG = logging.getLogger(__name__) +_formatters = { + 'location': format_columns.DictColumn, +} + def _get_columns(item): return sdk_utils.get_osc_show_columns_for_sdk_resource(item, {}) @@ -212,7 +217,7 @@ class CreateNetworkSegmentRange(command.ShowOne): attrs['physical_network'] = parsed_args.physical_network obj = network_client.create_network_segment_range(**attrs) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) data = _update_additional_fields_from_props(columns, props=data) return (display_columns, data) @@ -358,7 +363,7 @@ class ListNetworkSegmentRange(command.Lister): parsed_args.used and _is_prop_empty(columns, props, 'used') or \ parsed_args.unused and \ not _is_prop_empty(columns, props, 'used'): - continue + continue if parsed_args.long: props = _update_additional_fields_from_props(columns, props) display_props += (props,) @@ -451,6 +456,6 @@ class ShowNetworkSegmentRange(command.ShowOne): ignore_missing=False ) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) data = _update_additional_fields_from_props(columns, props=data) return (display_columns, data) diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py index e6bfe853..4d7e5189 100644 --- a/openstackclient/network/v2/port.py +++ b/openstackclient/network/v2/port.py @@ -51,6 +51,7 @@ _formatters = { 'dns_assignment': format_columns.ListDictColumn, 'extra_dhcp_opts': format_columns.ListDictColumn, 'fixed_ips': format_columns.ListDictColumn, + 'location': format_columns.DictColumn, '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 11b012e6..02da50c3 100644 --- a/openstackclient/network/v2/router.py +++ b/openstackclient/network/v2/router.py @@ -61,6 +61,7 @@ _formatters = { 'external_gateway_info': RouterInfoColumn, 'availability_zones': format_columns.ListColumn, 'availability_zone_hints': format_columns.ListColumn, + 'location': format_columns.DictColumn, 'routes': RoutesColumn, 'tags': format_columns.ListColumn, } diff --git a/openstackclient/network/v2/security_group.py b/openstackclient/network/v2/security_group.py index e3894738..38b4e97a 100644 --- a/openstackclient/network/v2/security_group.py +++ b/openstackclient/network/v2/security_group.py @@ -16,6 +16,7 @@ import argparse 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 import six @@ -77,11 +78,13 @@ class ComputeSecurityGroupRulesColumn(cliff_columns.FormattableColumn): _formatters_network = { + 'location': format_columns.DictColumn, 'security_group_rules': NetworkSecurityGroupRulesColumn, } _formatters_compute = { + 'location': format_columns.DictColumn, 'rules': ComputeSecurityGroupRulesColumn, } diff --git a/openstackclient/network/v2/security_group_rule.py b/openstackclient/network/v2/security_group_rule.py index dbea7473..15f099b1 100644 --- a/openstackclient/network/v2/security_group_rule.py +++ b/openstackclient/network/v2/security_group_rule.py @@ -16,6 +16,7 @@ import argparse import logging +from osc_lib.cli import format_columns from osc_lib.cli import parseractions from osc_lib import exceptions from osc_lib import utils @@ -31,6 +32,11 @@ from openstackclient.network import utils as network_utils LOG = logging.getLogger(__name__) +_formatters = { + 'location': format_columns.DictColumn, +} + + def _format_security_group_rule_show(obj): data = network_utils.transform_compute_security_group_rule(obj) return zip(*sorted(six.iteritems(data))) @@ -337,7 +343,7 @@ class CreateSecurityGroupRule(common.NetworkAndComputeShowOne): # Create and show the security group rule. obj = client.create_security_group_rule(**attrs) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) def take_action_compute(self, client, parsed_args): @@ -596,7 +602,7 @@ class ShowSecurityGroupRule(common.NetworkAndComputeShowOne): if not obj['remote_ip_prefix']: obj['remote_ip_prefix'] = _format_remote_ip_prefix(obj) display_columns, columns = _get_columns(obj) - data = utils.get_item_properties(obj, columns) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (display_columns, data) def take_action_compute(self, client, parsed_args): diff --git a/openstackclient/network/v2/subnet.py b/openstackclient/network/v2/subnet.py index 1f0c2d94..c5368861 100644 --- a/openstackclient/network/v2/subnet.py +++ b/openstackclient/network/v2/subnet.py @@ -61,6 +61,7 @@ _formatters = { 'allocation_pools': AllocationPoolsColumn, 'dns_nameservers': format_columns.ListColumn, 'host_routes': HostRoutesColumn, + 'location': format_columns.DictColumn, '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 7ece263a..d5a15475 100644 --- a/openstackclient/network/v2/subnet_pool.py +++ b/openstackclient/network/v2/subnet_pool.py @@ -42,6 +42,7 @@ def _get_columns(item): _formatters = { + 'location': format_columns.DictColumn, 'prefixes': format_columns.ListColumn, 'tags': format_columns.ListColumn, } diff --git a/openstackclient/shell.py b/openstackclient/shell.py index 22d8412c..4489219f 100644 --- a/openstackclient/shell.py +++ b/openstackclient/shell.py @@ -58,10 +58,10 @@ class OpenStackShell(shell.OpenStackShell): def _final_defaults(self): super(OpenStackShell, self)._final_defaults() - # Set the default plugin to token_endpoint if url and token are given - if (self.options.url and self.options.token): - # Use service token authentication - self._auth_type = 'token_endpoint' + # Set the default plugin to admin_token if endpoint and token are given + if (self.options.endpoint and self.options.token): + # Use token authentication + self._auth_type = 'admin_token' else: self._auth_type = 'password' @@ -209,5 +209,6 @@ def main(argv=None): return OpenStackShell().run(argv) + if __name__ == "__main__": sys.exit(main()) diff --git a/openstackclient/tests/functional/common/test_args.py b/openstackclient/tests/functional/common/test_args.py index dd1fd0fb..02cad6c1 100644 --- a/openstackclient/tests/functional/common/test_args.py +++ b/openstackclient/tests/functional/common/test_args.py @@ -12,6 +12,8 @@ import json +from tempest.lib import exceptions as tempest_exc + from openstackclient.tests.functional import base @@ -49,19 +51,17 @@ class ArgumentTests(base.TestCase): ) def test_auth_type_token_endpoint_opt(self): - cmd_output = json.loads(self.openstack( - 'configuration show -f json --os-auth-type token_endpoint', - cloud=None, - )) - self.assertIsNotNone(cmd_output) - self.assertIn( - 'auth_type', - cmd_output.keys(), - ) - self.assertEqual( - 'token_endpoint', - cmd_output['auth_type'], - ) + # Make sure token_endpoint is really gone + try: + self.openstack( + 'configuration show -f json --os-auth-type token_endpoint', + cloud=None, + ) + except tempest_exc.CommandFailed as e: + self.assertIn('--os-auth-type: invalid choice:', str(e)) + self.assertIn('token_endpoint', str(e)) + else: + self.fail('CommandFailed should be raised') def test_auth_type_password_opt(self): cmd_output = json.loads(self.openstack( diff --git a/openstackclient/tests/functional/network/v2/test_floating_ip.py b/openstackclient/tests/functional/network/v2/test_floating_ip.py index f189c2da..9d109f87 100644 --- a/openstackclient/tests/functional/network/v2/test_floating_ip.py +++ b/openstackclient/tests/functional/network/v2/test_floating_ip.py @@ -24,12 +24,9 @@ class FloatingIpTests(common.NetworkTests): def setUpClass(cls): common.NetworkTests.setUpClass() if cls.haz_network: + # Create common networks that all tests share cls.EXTERNAL_NETWORK_NAME = uuid.uuid4().hex - cls.EXTERNAL_SUBNET_NAME = uuid.uuid4().hex cls.PRIVATE_NETWORK_NAME = uuid.uuid4().hex - cls.PRIVATE_SUBNET_NAME = uuid.uuid4().hex - cls.ROUTER = uuid.uuid4().hex - cls.PORT_NAME = uuid.uuid4().hex # Create a network for the floating ip json_output = json.loads(cls.openstack( @@ -46,57 +43,11 @@ class FloatingIpTests(common.NetworkTests): )) cls.private_network_id = json_output["id"] - # Try random subnet range for subnet creating - # Because we can not determine ahead of time what subnets are - # already in use, possibly by another test running in parallel, - # try 4 times - for i in range(4): - # Make a random subnet - cls.external_subnet = ".".join(map( - str, - (random.randint(0, 223) for _ in range(3)) - )) + ".0/26" - cls.private_subnet = ".".join(map( - str, - (random.randint(0, 223) for _ in range(3)) - )) + ".0/26" - try: - # Create a subnet for the network - json_output = json.loads(cls.openstack( - 'subnet create -f json ' + - '--network ' + cls.EXTERNAL_NETWORK_NAME + ' ' + - '--subnet-range ' + cls.external_subnet + ' ' + - cls.EXTERNAL_SUBNET_NAME - )) - cls.external_subnet_id = json_output["id"] - # Create a subnet for the private network - json_output = json.loads(cls.openstack( - 'subnet create -f json ' + - '--network ' + cls.PRIVATE_NETWORK_NAME + ' ' + - '--subnet-range ' + cls.private_subnet + ' ' + - cls.PRIVATE_SUBNET_NAME - )) - cls.private_subnet_id = json_output["id"] - except Exception: - if (i == 3): - # raise the exception at the last time - raise - pass - else: - # break and no longer retry if create successfully - break - @classmethod def tearDownClass(cls): try: if cls.haz_network: del_output = cls.openstack( - 'subnet delete ' + - cls.EXTERNAL_SUBNET_NAME + ' ' + - cls.PRIVATE_SUBNET_NAME - ) - cls.assertOutput('', del_output) - del_output = cls.openstack( 'network delete ' + cls.EXTERNAL_NETWORK_NAME + ' ' + cls.PRIVATE_NETWORK_NAME @@ -114,11 +65,50 @@ class FloatingIpTests(common.NetworkTests): # Verify setup self.assertIsNotNone(self.external_network_id) self.assertIsNotNone(self.private_network_id) - self.assertIsNotNone(self.external_subnet_id) - self.assertIsNotNone(self.private_subnet_id) + + def _create_subnet(self, network_name, subnet_name): + subnet_id = None + + # Try random subnet range for subnet creating + # Because we can not determine ahead of time what subnets are + # already in use, possibly by another test running in parallel, + # try 4 times + for i in range(4): + # Make a random subnet + subnet = ".".join(map( + str, + (random.randint(0, 223) for _ in range(3)) + )) + ".0/26" + try: + # Create a subnet for the network + json_output = json.loads(self.openstack( + 'subnet create -f json ' + + '--network ' + network_name + ' ' + + '--subnet-range ' + subnet + ' ' + + subnet_name + )) + self.assertIsNotNone(json_output["id"]) + subnet_id = json_output["id"] + except Exception: + if (i == 3): + # raise the exception at the last time + raise + pass + else: + # break and no longer retry if create successfully + break + return subnet_id def test_floating_ip_delete(self): """Test create, delete multiple""" + + # Subnets must exist even if not directly referenced here + ext_subnet_id = self._create_subnet( + self.EXTERNAL_NETWORK_NAME, + "ext-test-delete" + ) + self.addCleanup(self.openstack, 'subnet delete ' + ext_subnet_id) + json_output = json.loads(self.openstack( 'floating ip create -f json ' + '--description aaaa ' + @@ -151,6 +141,14 @@ class FloatingIpTests(common.NetworkTests): def test_floating_ip_list(self): """Test create defaults, list filters, delete""" + + # Subnets must exist even if not directly referenced here + ext_subnet_id = self._create_subnet( + self.EXTERNAL_NETWORK_NAME, + "ext-test-delete" + ) + self.addCleanup(self.openstack, 'subnet delete ' + ext_subnet_id) + json_output = json.loads(self.openstack( 'floating ip create -f json ' + '--description aaaa ' + @@ -237,6 +235,22 @@ class FloatingIpTests(common.NetworkTests): def test_floating_ip_set_and_unset_port(self): """Test Floating IP Set and Unset port""" + + # Subnets must exist even if not directly referenced here + ext_subnet_id = self._create_subnet( + self.EXTERNAL_NETWORK_NAME, + "ext-test-delete" + ) + self.addCleanup(self.openstack, 'subnet delete ' + ext_subnet_id) + priv_subnet_id = self._create_subnet( + self.PRIVATE_NETWORK_NAME, + "priv-test-delete" + ) + self.addCleanup(self.openstack, 'subnet delete ' + priv_subnet_id) + + self.ROUTER = uuid.uuid4().hex + self.PORT_NAME = uuid.uuid4().hex + json_output = json.loads(self.openstack( 'floating ip create -f json ' + '--description aaaa ' + @@ -253,7 +267,7 @@ class FloatingIpTests(common.NetworkTests): json_output = json.loads(self.openstack( 'port create -f json ' + '--network ' + self.PRIVATE_NETWORK_NAME + ' ' + - '--fixed-ip subnet=' + self.PRIVATE_SUBNET_NAME + ' ' + + '--fixed-ip subnet=' + priv_subnet_id + ' ' + self.PORT_NAME )) self.assertIsNotNone(json_output["id"]) diff --git a/openstackclient/tests/unit/common/test_clientmanager.py b/openstackclient/tests/unit/common/test_clientmanager.py index f15f9af1..a83b1318 100644 --- a/openstackclient/tests/unit/common/test_clientmanager.py +++ b/openstackclient/tests/unit/common/test_clientmanager.py @@ -28,19 +28,19 @@ class TestClientManager(osc_lib_test_utils.TestClientManager): """Allow subclasses to override the ClientManager class""" return clientmanager.ClientManager - def test_client_manager_token_endpoint(self): + def test_client_manager_admin_token(self): token_auth = { - 'url': fakes.AUTH_URL, + 'endpoint': fakes.AUTH_URL, 'token': fakes.AUTH_TOKEN, } client_manager = self._make_clientmanager( auth_args=token_auth, - auth_plugin_name='token_endpoint', + auth_plugin_name='admin_token', ) self.assertEqual( fakes.AUTH_URL, - client_manager._cli_options.config['auth']['url'], + client_manager._cli_options.config['auth']['endpoint'], ) self.assertEqual( fakes.AUTH_TOKEN, diff --git a/openstackclient/tests/unit/compute/v2/fakes.py b/openstackclient/tests/unit/compute/v2/fakes.py index ee7d4983..7357e143 100644 --- a/openstackclient/tests/unit/compute/v2/fakes.py +++ b/openstackclient/tests/unit/compute/v2/fakes.py @@ -505,7 +505,7 @@ class FakeSecurityGroup(object): @staticmethod def get_security_groups(security_groups=None, count=2): - """Get an iterable MagicMock object with a list of faked security groups. + """Get an iterable MagicMock with a list of faked security groups. If security groups list is provided, then initialize the Mock object with the list. Otherwise create one. diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py index 0793116a..5c98188a 100644 --- a/openstackclient/tests/unit/compute/v2/test_server.py +++ b/openstackclient/tests/unit/compute/v2/test_server.py @@ -109,6 +109,10 @@ class TestServer(compute_fakes.TestComputev2): version = self.app.client_manager.compute.api_version if version >= api_versions.APIVersion('2.73'): method.assert_called_with(reason=None) + elif method_name == 'unshelve': + version = self.app.client_manager.compute.api_version + if version >= api_versions.APIVersion('2.77'): + method.assert_called_with(availability_zone=None) else: method.assert_called_with() else: @@ -4777,6 +4781,56 @@ class TestServerUnshelve(TestServer): def test_unshelve_multi_servers(self): self.run_method_with_servers('unshelve', 3) + def test_unshelve_server_with_specified_az(self): + server = compute_fakes.FakeServer.create_one_server() + arglist = [ + server.id, + '--availability-zone', "foo-az", + ] + verifylist = [ + ('availability_zone', "foo-az"), + ('server', [server.id]) + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + ex = self.assertRaises(exceptions.CommandError, + self.cmd.take_action, + parsed_args) + self.assertIn( + '--os-compute-api-version 2.77 or greater is required', str(ex)) + + +class TestServerUnshelveV277(TestServerUnshelve): + + def setUp(self): + super(TestServerUnshelveV277, self).setUp() + + self.server = compute_fakes.FakeServer.create_one_server( + methods=self.methods) + + # This is the return value for utils.find_resource() + self.servers_mock.get.return_value = self.server + + # Get the command object to test + self.cmd = server.UnshelveServer(self.app, None) + + def test_specified_az_to_unshelve_with_v277(self): + self.app.client_manager.compute.api_version = api_versions.APIVersion( + '2.77') + + arglist = [ + '--availability-zone', "foo-az", + self.server.id, + ] + verifylist = [ + ('availability_zone', "foo-az"), + ('server', [self.server.id]) + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + self.servers_mock.get.assert_called_with(self.server.id) + self.server.unshelve.assert_called_with(availability_zone="foo-az") + class TestServerGeneral(TestServer): OLD = { diff --git a/openstackclient/tests/unit/network/v2/fakes.py b/openstackclient/tests/unit/network/v2/fakes.py index 27a7485a..35f0b1a5 100644 --- a/openstackclient/tests/unit/network/v2/fakes.py +++ b/openstackclient/tests/unit/network/v2/fakes.py @@ -1344,7 +1344,7 @@ class FakeSecurityGroupRule(object): @staticmethod def get_security_group_rules(security_group_rules=None, count=2): - """Get an iterable Mock object with a list of faked security group rules. + """Get an iterable Mock with a list of faked security group rules. If security group rules list is provided, then initialize the Mock object with the list. Otherwise create one. diff --git a/openstackclient/tests/unit/test_shell.py b/openstackclient/tests/unit/test_shell.py index 5d413e7e..31675c47 100644 --- a/openstackclient/tests/unit/test_shell.py +++ b/openstackclient/tests/unit/test_shell.py @@ -153,7 +153,7 @@ class TestShell(osc_lib_test_utils.TestShell): # released in osc-lib self.shell_class = importutils.import_class(self.shell_class_name) - def _assert_token_endpoint_auth(self, cmd_options, default_args): + def _assert_admin_token_auth(self, cmd_options, default_args): with mock.patch( self.shell_class_name + ".initialize_app", self.app, @@ -172,9 +172,9 @@ class TestShell(osc_lib_test_utils.TestShell): "token", ) self.assertEqual( - default_args.get("url", ''), - _shell.options.url, - "url", + default_args.get("endpoint", ''), + _shell.options.endpoint, + "endpoint", ) def _assert_token_auth(self, cmd_options, default_args): @@ -338,7 +338,7 @@ class TestShellTokenEndpointAuthEnv(TestShell): super(TestShellTokenEndpointAuthEnv, self).setUp() env = { "OS_TOKEN": DEFAULT_TOKEN, - "OS_URL": DEFAULT_SERVICE_URL, + "OS_ENDPOINT": DEFAULT_SERVICE_URL, } self.useFixture(osc_lib_test_utils.EnvFixture(env.copy())) @@ -346,23 +346,23 @@ class TestShellTokenEndpointAuthEnv(TestShell): flag = "" kwargs = { "token": DEFAULT_TOKEN, - "url": DEFAULT_SERVICE_URL, + "endpoint": DEFAULT_SERVICE_URL, } - self._assert_token_endpoint_auth(flag, kwargs) + self._assert_admin_token_auth(flag, kwargs) def test_only_token(self): flag = "--os-token xyzpdq" kwargs = { "token": "xyzpdq", - "url": DEFAULT_SERVICE_URL, + "endpoint": DEFAULT_SERVICE_URL, } self._assert_token_auth(flag, kwargs) def test_only_url(self): - flag = "--os-url http://cloud.local:555" + flag = "--os-endpoint http://cloud.local:555" kwargs = { "token": DEFAULT_TOKEN, - "url": "http://cloud.local:555", + "endpoint": "http://cloud.local:555", } self._assert_token_auth(flag, kwargs) @@ -371,7 +371,7 @@ class TestShellTokenEndpointAuthEnv(TestShell): flag = "" kwargs = { "token": '', - "url": '', + "endpoint": '', } self._assert_token_auth(flag, kwargs) |
