From: Benjamin Diaz Date: Wed, 22 Aug 2018 20:18:21 +0000 (-0300) Subject: Adds exception throwing when Openstack services missing X-Git-Tag: v5.0.0~47^2 X-Git-Url: https://osm.etsi.org/gitweb/?a=commitdiff_plain;h=38d905ad4d53b3f070dc98a639a6082397f100f3;hp=58834ab6fcbcc4039c479de89ecc82f0eb2fd2f3;p=osm%2FMON.git 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 --- 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,