Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
workloadmgrclient / workloadmgrclient / service_catalog.py
Size: Mime:
# 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)
        )