From 38d905ad4d53b3f070dc98a639a6082397f100f3 Mon Sep 17 00:00:00 2001 From: Benjamin Diaz Date: Wed, 22 Aug 2018 17:18:21 -0300 Subject: [PATCH] Adds exception throwing when Openstack services missing 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 --- osm_mon/plugins/OpenStack/common.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/osm_mon/plugins/OpenStack/common.py b/osm_mon/plugins/OpenStack/common.py index 64cbf7f..09c911d 100644 --- a/osm_mon/plugins/OpenStack/common.py +++ b/osm_mon/plugins/OpenStack/common.py @@ -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, -- 2.25.1