diff options
| author | Monty Taylor <mordred@inaugust.com> | 2018-07-23 09:31:17 -0500 |
|---|---|---|
| committer | Monty Taylor <mordred@inaugust.com> | 2018-07-23 16:58:30 -0500 |
| commit | 9ece632f96844fd78c2f717f2f6d35e61c3b9ef2 (patch) | |
| tree | 24747b229075ea5b0b16b660074006f8da7020fe /openstackclient | |
| parent | ee35409069b0f77984e912cfc0c90cb9cce52512 (diff) | |
| download | python-openstackclient-9ece632f96844fd78c2f717f2f6d35e61c3b9ef2.tar.gz | |
Add command to show all service versions
Knowing what services and what versions of those services exist on a
cloud isn't always a spectacular experience. Add a command that will use
get_all_version_data from keystoneauth to produce a report of the
available services and the version info for each service.
Depends-On: https://review.openstack.org/584944
Change-Id: I84751c175d0c5f6d857a5473d2db6d5f1b41f946
Diffstat (limited to 'openstackclient')
| -rw-r--r-- | openstackclient/common/versions.py | 114 | ||||
| -rw-r--r-- | openstackclient/tests/functional/common/test_versions.py | 31 |
2 files changed, 145 insertions, 0 deletions
diff --git a/openstackclient/common/versions.py b/openstackclient/common/versions.py new file mode 100644 index 00000000..6a93d300 --- /dev/null +++ b/openstackclient/common/versions.py @@ -0,0 +1,114 @@ +# Copyright 2018 Red Hat, Inc. +# +# 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. + +"""Versions Action Implementation""" + +import os_service_types +from osc_lib.command import command + +from openstackclient.i18n import _ + + +class ShowVersions(command.Lister): + _description = _("Show available versions of services") + + def get_parser(self, prog_name): + parser = super(ShowVersions, self).get_parser(prog_name) + interface_group = parser.add_mutually_exclusive_group() + interface_group.add_argument( + "--all-interfaces", + dest="is_all_interfaces", + action="store_true", + default=False, + help=_("Show values for all interfaces"), + ) + interface_group.add_argument( + '--interface', + default='public', + metavar='<interface>', + help=_('Show versions for a specific interface.'), + ) + parser.add_argument( + '--region-name', + metavar='<region_name>', + help=_('Show versions for a specific region.'), + ) + parser.add_argument( + '--service', + metavar='<region_name>', + help=_('Show versions for a specific service.'), + ) + parser.add_argument( + '--status', + metavar='<region_name>', + help=_('Show versions for a specific status.' + ' [Valid values are SUPPORTED, CURRENT,' + ' DEPRECATED, EXPERIMENTAL]'), + ) + return parser + + def take_action(self, parsed_args): + + interface = parsed_args.interface + if parsed_args.is_all_interfaces: + interface = None + + session = self.app.client_manager.session + version_data = session.get_all_version_data( + interface=interface, + region_name=parsed_args.region_name) + + columns = [ + "Region Name", + "Service Type", + "Version", + "Status", + "Endpoint", + "Min Microversion", + "Max Microversion", + ] + + status = parsed_args.status + if status: + status = status.upper() + + service = parsed_args.service + if service: + # Normalize service type argument to official type + service_type_manager = os_service_types.ServiceTypes() + service = service_type_manager.get_service_type(service) + + versions = [] + for region_name, interfaces in version_data.items(): + for interface, services in interfaces.items(): + for service_type, service_versions in services.items(): + if service and service != service_type: + # TODO(mordred) Once there is a version of + # keystoneauth that can do this filtering + # before making all the discovery calls, switch + # to that. + continue + for data in service_versions: + if status and status != data['status']: + continue + versions.append(( + region_name, + service_type, + data['version'], + data['status'], + data['url'], + data['min_microversion'], + data['max_microversion'], + )) + return (columns, versions) diff --git a/openstackclient/tests/functional/common/test_versions.py b/openstackclient/tests/functional/common/test_versions.py new file mode 100644 index 00000000..adc74ebc --- /dev/null +++ b/openstackclient/tests/functional/common/test_versions.py @@ -0,0 +1,31 @@ +# 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. + +import json + +from openstackclient.tests.functional import base + + +class VersionsTests(base.TestCase): + """Functional tests for versions.""" + + def test_versions_show(self): + # TODO(mordred) Make this better. The trick is knowing what in the + # payload to test for. + cmd_output = json.loads(self.openstack( + 'versions show -f json' + )) + self.assertIsNotNone(cmd_output) + self.assertIn( + "Region Name", + cmd_output[0], + ) |
