summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/common/versions.py114
-rw-r--r--openstackclient/compute/v2/server.py13
-rw-r--r--openstackclient/tests/functional/common/test_versions.py31
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server.py35
4 files changed, 188 insertions, 5 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/compute/v2/server.py b/openstackclient/compute/v2/server.py
index 777f7744..a6a59084 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -21,6 +21,7 @@ import io
import logging
import os
+from novaclient import api_versions
from novaclient.v2 import servers
from osc_lib.cli import parseractions
from osc_lib.command import command
@@ -1384,11 +1385,13 @@ class MigrateServer(command.Command):
parsed_args.server,
)
if parsed_args.live:
- server.live_migrate(
- host=parsed_args.live,
- block_migration=parsed_args.block_migration,
- disk_over_commit=parsed_args.disk_overcommit,
- )
+ kwargs = {
+ 'host': parsed_args.live,
+ 'block_migration': parsed_args.block_migration
+ }
+ if compute_client.api_version < api_versions.APIVersion('2.25'):
+ kwargs['disk_over_commit'] = parsed_args.disk_overcommit
+ server.live_migrate(**kwargs)
else:
if parsed_args.block_migration or parsed_args.disk_overcommit:
raise exceptions.CommandError("--live must be specified if "
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],
+ )
diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py
index 46d4c241..b3d32681 100644
--- a/openstackclient/tests/unit/compute/v2/test_server.py
+++ b/openstackclient/tests/unit/compute/v2/test_server.py
@@ -18,6 +18,7 @@ import getpass
import mock
from mock import call
+from novaclient import api_versions
from osc_lib import exceptions
from osc_lib import utils as common_utils
from oslo_utils import timeutils
@@ -2207,6 +2208,9 @@ class TestServerMigrate(TestServer):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.24')
+
result = self.cmd.take_action(parsed_args)
self.servers_mock.get.assert_called_with(self.server.id)
@@ -2228,6 +2232,9 @@ class TestServerMigrate(TestServer):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.24')
+
result = self.cmd.take_action(parsed_args)
self.servers_mock.get.assert_called_with(self.server.id)
@@ -2249,6 +2256,9 @@ class TestServerMigrate(TestServer):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.24')
+
result = self.cmd.take_action(parsed_args)
self.servers_mock.get.assert_called_with(self.server.id)
@@ -2271,6 +2281,9 @@ class TestServerMigrate(TestServer):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.24')
+
result = self.cmd.take_action(parsed_args)
self.servers_mock.get.assert_called_with(self.server.id)
@@ -2280,6 +2293,28 @@ class TestServerMigrate(TestServer):
self.assertNotCalled(self.servers_mock.migrate)
self.assertIsNone(result)
+ def test_server_live_migrate_225(self):
+ arglist = [
+ '--live', 'fakehost', self.server.id,
+ ]
+ verifylist = [
+ ('live', 'fakehost'),
+ ('block_migration', False),
+ ('wait', False),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.app.client_manager.compute.api_version = \
+ api_versions.APIVersion('2.25')
+
+ result = self.cmd.take_action(parsed_args)
+
+ self.servers_mock.get.assert_called_with(self.server.id)
+ self.server.live_migrate.assert_called_with(block_migration=False,
+ host='fakehost')
+ self.assertNotCalled(self.servers_mock.migrate)
+ self.assertIsNone(result)
+
@mock.patch.object(common_utils, 'wait_for_status', return_value=True)
def test_server_migrate_with_wait(self, mock_wait_for_status):
arglist = [