Adds exception throwing when Openstack services missing 37/6437/1
authorBenjamin Diaz <bdiaz@whitestack.com>
Wed, 22 Aug 2018 20:18:21 +0000 (17:18 -0300)
committerBenjamin Diaz <bdiaz@whitestack.com>
Wed, 22 Aug 2018 20:25:47 +0000 (17:25 -0300)
Currently if MON can't find Gnocchi or Aodh services it fails obscurely.
Same thing happens if it can't find endpoints for those services in the
specified region. This patch adds throwing an exception in those cases
to ease troubleshooting.

Signed-off-by: Benjamin Diaz <bdiaz@whitestack.com>
osm_mon/plugins/OpenStack/common.py

index 64cbf7f..09c911d 100644 (file)
@@ -61,7 +61,15 @@ class Common(object):
 
     @staticmethod
     def get_endpoint(service_type, vim_uuid, verify_ssl=True):
-        """Get the endpoint for Gnocchi/Aodh."""
+        """
+        Gets the public endpoint for an OpenStack service in the configured region (default: RegionOne).
+        :param service_type: Service type name (eg. metric or alarming)
+        :param vim_uuid: VIM UUID generated by OSM
+        :param verify_ssl: If False, disables SSL validation. Useful when using self signed certs.
+        :return: Endpoint url string.
+
+        :raises ValueError If it can't find services, or if it can find services but no endpoint for specified region.
+        """
         auth_manager = AuthManager()
         creds = auth_manager.get_credentials(vim_uuid)
         auth = v3.Password(auth_url=creds.url,
@@ -72,7 +80,10 @@ class Common(object):
                            user_domain_id='default')
         sess = session.Session(auth=auth, verify=verify_ssl)
         ks = client.Client(session=sess, interface='public')
-        service = ks.services.list(type=service_type)[0]
+        services = ks.services.list(type=service_type)
+        if not services:
+            raise ValueError("No services found for {}. Is the corresponding service enabled?".format(service_type))
+        service = services[0]
         endpoints = ks.endpoints.list(service)
         endpoint_type = 'publicURL'
         region_name = 'RegionOne'
@@ -88,6 +99,7 @@ class Common(object):
         for endpoint in endpoints:
             if endpoint.interface in endpoint_type and endpoint.region == region_name:
                 return endpoint.url
+        raise ValueError("No endpoints found for service {} in region {}".format(service_type, region_name))
 
     @staticmethod
     def perform_request(url, auth_token,