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
This commit is contained in:
parent
ee35409069
commit
9ece632f96
41
doc/source/cli/command-objects/versions.rst
Normal file
41
doc/source/cli/command-objects/versions.rst
Normal file
@ -0,0 +1,41 @@
|
||||
========
|
||||
versions
|
||||
========
|
||||
|
||||
Get a list of every version of every service in a given cloud.
|
||||
|
||||
versions show
|
||||
-------------
|
||||
|
||||
Show service versions:
|
||||
|
||||
.. program:: versions show
|
||||
.. code:: bash
|
||||
|
||||
openstack versions show
|
||||
[--all-interfaces]
|
||||
[--interface <interface>]
|
||||
[--region-name <region-name>]
|
||||
[--service <service>]
|
||||
|
||||
.. option:: --all-interfaces
|
||||
|
||||
Return results for every interface of every service.
|
||||
[Mutually exclusive with --interface]
|
||||
|
||||
.. option:: --interface <interface>
|
||||
|
||||
Limit results to only those on given interface.
|
||||
[Default 'public'. Mutually exclusive with --all-interfaces]
|
||||
|
||||
.. option:: --region-name <region-name>
|
||||
|
||||
Limit results to only those from region-name
|
||||
|
||||
.. option:: --service <service>
|
||||
|
||||
Limit results to only those for service. The argument should be either
|
||||
an exact match to what is in the catalog or a known official value or
|
||||
alias from `service-types-authority`_.
|
||||
|
||||
.. _service-types-authority: https://service-types.openstack.org/
|
114
openstackclient/common/versions.py
Normal file
114
openstackclient/common/versions.py
Normal file
@ -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)
|
31
openstackclient/tests/functional/common/test_versions.py
Normal file
31
openstackclient/tests/functional/common/test_versions.py
Normal file
@ -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],
|
||||
)
|
7
releasenotes/notes/versions-show-12a2443624c83048.yaml
Normal file
7
releasenotes/notes/versions-show-12a2443624c83048.yaml
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
features:
|
||||
- |
|
||||
A new command, ``openstack versions show`` was added, which will
|
||||
provide a list of all versions of all services in the cloud. It
|
||||
includes relevant metadata, such as min/max microversion, endpoint,
|
||||
status and region.
|
@ -51,6 +51,7 @@ openstack.common =
|
||||
quota_list = openstackclient.common.quota:ListQuota
|
||||
quota_set = openstackclient.common.quota:SetQuota
|
||||
quota_show = openstackclient.common.quota:ShowQuota
|
||||
versions_show = openstackclient.common.versions:ShowVersions
|
||||
|
||||
openstack.compute.v2 =
|
||||
compute_agent_create = openstackclient.compute.v2.agent:CreateAgent
|
||||
|
Loading…
Reference in New Issue
Block a user