def url_for(self, attr=None, filter_value=None, service_type='platform', endpoint_type='publicURL'): """Fetch the URL from the Neutron service for a particular endpoint type. If none given, return publicURL. """ catalog = self.catalog['access'].get('serviceCatalog', []) matching_endpoints = [] for service in catalog: if service['type'] != service_type: continue endpoints = service['endpoints'] for endpoint in endpoints: if not filter_value or endpoint.get(attr) == filter_value: matching_endpoints.append(endpoint) if not matching_endpoints: raise exceptions.EndpointNotFound() elif len(matching_endpoints) > 1: raise exceptions.AmbiguousEndpoints(reason=matching_endpoints) else: if endpoint_type not in matching_endpoints[0]: raise exceptions.EndpointTypeNotFound(reason=endpoint_type) return matching_endpoints[0][endpoint_type]
def _get_endpoint_url(self): url = self.auth_url + '/tokens/%s/endpoints' % self.auth_token try: resp, body = self._cs_request(url, "GET") except exceptions.HTTPUnauthorized: # rollback to authenticate() to handle case when neutron client # is initialized just before the token is expired self.authenticate() return self.endpoint_url body = json.loads(body) for endpoint in body.get('endpoints', []): if (endpoint['type'] == 'platform' and endpoint.get('region') == self.region_name): if self.endpoint_type not in endpoint: raise exceptions.EndpointTypeNotFound( reason=self.endpoint_type) return endpoint[self.endpoint_type] raise exceptions.EndpointNotFound()