Repository URL to install this package:
|
Version:
6.0.24 ▾
|
# Copyright (c) 2014 TrilioData, Inc.
# All Rights Reserved.
import workloadmgrclient.exceptions
class ServiceCatalog(object):
"""Helper methods for dealing with a Keystone Service Catalog."""
def __init__(self, resource_dict):
self.catalog = resource_dict
def get_token(self):
return self.catalog["access"]["token"]["id"]
def url_for(
self,
attr=None,
filter_value=None,
service_type=None,
endpoint_type="publicURL",
service_name=None,
):
"""Fetch the public URL from the Compute service for
a particular endpoint attribute. If none given, return
the first. See tests for sample service catalog.
"""
matching_endpoints = []
if "endpoints" in self.catalog:
# We have a bastardized service catalog. Treat it special. :/
for endpoint in self.catalog["endpoints"]:
if not filter_value or endpoint[attr] == filter_value:
matching_endpoints.append(endpoint)
if not matching_endpoints:
raise workloadmgrclient.exceptions.EndpointNotFound()
# We don't always get a service catalog back ...
if "serviceCatalog" not in self.catalog["access"]:
return None
# Full catalog ...
catalog = self.catalog["access"]["serviceCatalog"]
for service in catalog:
if service.get("type") != service_type:
continue
if (
service_name
and service_type == "workloads"
and service.get("name") != service_name
):
continue
endpoints = service["endpoints"]
for endpoint in endpoints:
if not filter_value or endpoint.get(attr) == filter_value:
endpoint["serviceName"] = service.get("name")
matching_endpoints.append(endpoint)
if not matching_endpoints:
raise workloadmgrclient.exceptions.EndpointNotFound()
elif len(matching_endpoints) > 1:
raise workloadmgrclient.exceptions.AmbiguousEndpoints(
endpoints=matching_endpoints
)
else:
return matching_endpoints[0][endpoint_type]
def _normalize_endpoint_type(self, endpoint_type):
if endpoint_type:
endpoint_type = endpoint_type.rstrip("URL")
return endpoint_type
def url_for_v3(
self,
attr=None,
filter_value=None,
service_type=None,
endpoint_type="publicURL",
service_name=None,
):
endpoint_list = self.catalog["token"]["catalog"]
endpoint_type = self._normalize_endpoint_type(endpoint_type)
for endpoint in endpoint_list:
if endpoint["type"] == service_type:
for ed in endpoint["endpoints"]:
if ed["interface"] == endpoint_type:
if attr and filter_value == ed.get(attr, ""):
return ed["url"]
if attr is None:
return ed["url"]
raise Exception(
"Endpoint %s of type %s is not found" % (service_name, endpoint_type)
)
def url_for_v3oidcpassword(self,
attr=None,
filter_value=None,
service_type=None,
endpoint_type="publicURL",
service_name=None,):
endpoint_list = self.catalog
endpoint_type = self._normalize_endpoint_type(endpoint_type)
for endpoint in endpoint_list:
if endpoint["type"] == service_type:
for ed in endpoint["endpoints"]:
if ed["interface"] == endpoint_type:
if attr and filter_value == ed.get(attr, ""):
return ed["url"]
if attr is None:
return ed["url"]
raise Exception(
"Endpoint %s of type %s is not found" % (service_name, endpoint_type)
)