diff --git a/openstack/config/cloud_region.py b/openstack/config/cloud_region.py index 32902bcf7..1bb421d84 100644 --- a/openstack/config/cloud_region.py +++ b/openstack/config/cloud_region.py @@ -257,6 +257,11 @@ class CloudRegion(object): try: float(version) except ValueError: + if 'latest' in version: + warnings.warn( + "You have a configured API_VERSION with 'latest' in" + " it. In the context of openstacksdk this doesn't make" + " any sense.") return None return version diff --git a/openstack/exceptions.py b/openstack/exceptions.py index 875b89fb1..8dbe70e85 100644 --- a/openstack/exceptions.py +++ b/openstack/exceptions.py @@ -228,6 +228,10 @@ def raise_from_response(response, error_message=None): ) +class UnsupportedServiceVersion(Warning): + """The user has configured a major version that SDK doesn't know.""" + + class ArgumentDeprecationWarning(Warning): """A deprecated argument has been provided.""" pass diff --git a/openstack/service_description.py b/openstack/service_description.py index 4ba5f5eb2..0e669b182 100644 --- a/openstack/service_description.py +++ b/openstack/service_description.py @@ -11,9 +11,12 @@ # License for the specific language governing permissions and limitations # under the License. +import warnings + import os_service_types from openstack import _log +from openstack import exceptions from openstack import proxy __all__ = [ @@ -74,12 +77,16 @@ class ServiceDescription(object): if instance is None: return self if self.service_type not in instance._proxies: - instance._proxies[self.service_type] = self._make_proxy( - instance, owner) + instance._proxies[self.service_type] = self._make_proxy(instance) instance._proxies[self.service_type]._connection = instance return instance._proxies[self.service_type] - def _make_proxy(self, instance, owner): + def _make_proxy(self, instance): + """Create a Proxy for the service in question. + + :param instance: + The `openstack.connection.Connection` we're working with. + """ config = instance.config # First, check to see if we've got config that matches what we @@ -90,7 +97,7 @@ class ServiceDescription(object): # If the user doesn't give a version in config, but we only support # one version, then just use that version. if not version_string and len(self.supported_versions) == 1: - version_string = list(self.supported_versions.keys())[0] + version_string = list(self.supported_versions)[0] proxy_obj = None if endpoint_override and version_string and self.supported_versions: @@ -103,6 +110,15 @@ class ServiceDescription(object): constructor=proxy_class, task_manager=instance.task_manager, ) + else: + warnings.warn( + "The configured version, {version} for service" + " {service_type} is not known or supported by" + " openstacksdk. The resulting Proxy object will only" + " have direct passthrough REST capabilities.".format( + version=version_string, + service_type=self.service_type), + category=exceptions.UnsupportedVersionWarning) elif endpoint_override and self.supported_versions: temp_adapter = config.get_session_client( self.service_type @@ -115,6 +131,16 @@ class ServiceDescription(object): constructor=proxy_class, task_manager=instance.task_manager, ) + else: + warnings.warn( + "Service {service_type) has an endpoint override set" + " but the version discovered at that endpoint, {version}" + " is not supported by openstacksdk. The resulting Proxy" + " object will only have direct passthrough REST" + " capabilities.".format( + version=api_version, + service_type=self.service_type), + category=exceptions.UnsupportedVersionWarning) if proxy_obj: @@ -126,6 +152,12 @@ class ServiceDescription(object): return proxy_obj data = proxy_obj.get_endpoint_data() + # If we've gotten here with a proxy object it means we have + # an endpoint_override in place. If the catalog_url and + # service_url don't match, which can happen if there is a + # None plugin and auth.endpoint like with standalone ironic, + # we need to be explicit that this service has an endpoint_override + # so that subsequent discovery calls don't get made incorrectly. if data.catalog_url != data.service_url: ep_key = '{service_type}_endpoint_override'.format( service_type=self.service_type) @@ -160,9 +192,14 @@ class ServiceDescription(object): # REST API proxy layer for an unknown service in the # service catalog that also doesn't have any useful # version discovery? - instance._proxies[self.service_type] = temp_adapter - instance._proxies[self.service_type]._connection = instance - return instance._proxies[self.service_type] + warnings.warn( + "Service {service_type) has no discoverable version." + " The resulting Proxy object will only have direct" + " passthrough REST capabilities.".format( + version=api_version, + service_type=self.service_type), + category=exceptions.UnsupportedVersionWarning) + return temp_adapter proxy_class = self.supported_versions.get(str(found_version[0])) if not proxy_class: proxy_class = proxy.Proxy