summaryrefslogtreecommitdiff
path: root/openstackclient/compute
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/compute')
-rw-r--r--openstackclient/compute/client.py57
-rw-r--r--openstackclient/compute/v2/server.py14
2 files changed, 62 insertions, 9 deletions
diff --git a/openstackclient/compute/client.py b/openstackclient/compute/client.py
index 6ae87b79..dd40b9a9 100644
--- a/openstackclient/compute/client.py
+++ b/openstackclient/compute/client.py
@@ -15,17 +15,21 @@
import logging
+from openstackclient.common import exceptions
from openstackclient.common import utils
LOG = logging.getLogger(__name__)
-DEFAULT_COMPUTE_API_VERSION = '2'
+DEFAULT_API_VERSION = '2'
API_VERSION_OPTION = 'os_compute_api_version'
API_NAME = 'compute'
API_VERSIONS = {
"2": "novaclient.client",
}
+# Save the microversion if in use
+_compute_api_version = None
+
def make_client(instance):
"""Returns a compute service client."""
@@ -51,6 +55,9 @@ def make_client(instance):
# Remember interface only if it is set
kwargs = utils.build_kwargs_dict('endpoint_type', instance._interface)
+ if _compute_api_version is not None:
+ kwargs.update({'api_version': _compute_api_version})
+
client = compute_client(
session=instance.session,
extensions=extensions,
@@ -68,10 +75,50 @@ def build_option_parser(parser):
parser.add_argument(
'--os-compute-api-version',
metavar='<compute-api-version>',
- default=utils.env(
- 'OS_COMPUTE_API_VERSION',
- default=DEFAULT_COMPUTE_API_VERSION),
+ default=utils.env('OS_COMPUTE_API_VERSION'),
help='Compute API version, default=' +
- DEFAULT_COMPUTE_API_VERSION +
+ DEFAULT_API_VERSION +
' (Env: OS_COMPUTE_API_VERSION)')
return parser
+
+
+def check_api_version(check_version):
+ """Validate version supplied by user
+
+ Returns:
+ * True if version is OK
+ * False if the version has not been checked and the previous plugin
+ check should be performed
+ * throws an exception if the version is no good
+
+ TODO(dtroyer): make the exception thrown a version-related one
+ """
+
+ # Defer client imports until we actually need them
+ try:
+ from novaclient import api_versions
+ except ImportError:
+ # Retain previous behaviour
+ return False
+
+ import novaclient
+
+ global _compute_api_version
+
+ # Copy some logic from novaclient 2.27.0 for basic version detection
+ # NOTE(dtroyer): This is only enough to resume operations using API
+ # version 2.0 or any valid version supplied by the user.
+ _compute_api_version = api_versions.get_api_version(check_version)
+
+ if _compute_api_version > api_versions.APIVersion("2.0"):
+ if not _compute_api_version.matches(
+ novaclient.API_MIN_VERSION,
+ novaclient.API_MAX_VERSION,
+ ):
+ raise exceptions.CommandError(
+ "versions supported by client: %s - %s" % (
+ novaclient.API_MIN_VERSION.get_string(),
+ novaclient.API_MAX_VERSION.get_string(),
+ ),
+ )
+ return True
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index 4efef975..6d837d9c 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -107,14 +107,20 @@ def _prep_server_detail(compute_client, server):
image_info = info.get('image', {})
if image_info:
image_id = image_info.get('id', '')
- image = utils.find_resource(compute_client.images, image_id)
- info['image'] = "%s (%s)" % (image.name, image_id)
+ try:
+ image = utils.find_resource(compute_client.images, image_id)
+ info['image'] = "%s (%s)" % (image.name, image_id)
+ except Exception:
+ info['image'] = image_id
# Convert the flavor blob to a name
flavor_info = info.get('flavor', {})
flavor_id = flavor_info.get('id', '')
- flavor = utils.find_resource(compute_client.flavors, flavor_id)
- info['flavor'] = "%s (%s)" % (flavor.name, flavor_id)
+ try:
+ flavor = utils.find_resource(compute_client.flavors, flavor_id)
+ info['flavor'] = "%s (%s)" % (flavor.name, flavor_id)
+ except Exception:
+ info['flavor'] = flavor_id
# NOTE(dtroyer): novaclient splits these into separate entries...
# Format addresses in a useful way