diff options
Diffstat (limited to 'keystone-moon/keystone/catalog/backends/templated.py')
-rw-r--r-- | keystone-moon/keystone/catalog/backends/templated.py | 298 |
1 files changed, 0 insertions, 298 deletions
diff --git a/keystone-moon/keystone/catalog/backends/templated.py b/keystone-moon/keystone/catalog/backends/templated.py deleted file mode 100644 index 2e80fd32..00000000 --- a/keystone-moon/keystone/catalog/backends/templated.py +++ /dev/null @@ -1,298 +0,0 @@ -# Copyright 2012 OpenStack Foundation -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import itertools -import os.path - -from oslo_config import cfg -from oslo_log import log -import six - -from keystone.catalog import core -from keystone import exception -from keystone.i18n import _LC - - -LOG = log.getLogger(__name__) - -CONF = cfg.CONF - - -def parse_templates(template_lines): - o = {} - for line in template_lines: - if ' = ' not in line: - continue - - k, v = line.strip().split(' = ') - if not k.startswith('catalog.'): - continue - - parts = k.split('.') - - region = parts[1] - # NOTE(termie): object-store insists on having a dash - service = parts[2].replace('_', '-') - key = parts[3] - - region_ref = o.get(region, {}) - service_ref = region_ref.get(service, {}) - service_ref[key] = v - - region_ref[service] = service_ref - o[region] = region_ref - - return o - - -class Catalog(core.Driver): - """A backend that generates endpoints for the Catalog based on templates. - - It is usually configured via config entries that look like: - - catalog.$REGION.$SERVICE.$key = $value - - and is stored in a similar looking hierarchy. Where a value can contain - values to be interpolated by standard python string interpolation that look - like (the % is replaced by a $ due to paste attempting to interpolate on - its own: - - http://localhost:$(public_port)s/ - - When expanding the template it will pass in a dict made up of the conf - instance plus a few additional key-values, notably tenant_id and user_id. - - It does not care what the keys and values are but it is worth noting that - keystone_compat will expect certain keys to be there so that it can munge - them into the output format keystone expects. These keys are: - - name - the name of the service, most likely repeated for all services of - the same type, across regions. - - adminURL - the url of the admin endpoint - - publicURL - the url of the public endpoint - - internalURL - the url of the internal endpoint - - """ - - def __init__(self, templates=None): - super(Catalog, self).__init__() - if templates: - self.templates = templates - else: - template_file = CONF.catalog.template_file - if not os.path.exists(template_file): - template_file = CONF.find_file(template_file) - self._load_templates(template_file) - - def _load_templates(self, template_file): - try: - with open(template_file) as f: - self.templates = parse_templates(f) - except IOError: - LOG.critical(_LC('Unable to open template file %s'), template_file) - raise - - # region crud - - def create_region(self, region_ref): - raise exception.NotImplemented() - - def list_regions(self, hints): - return [{'id': region_id, 'description': '', 'parent_region_id': ''} - for region_id in self.templates] - - def get_region(self, region_id): - if region_id in self.templates: - return {'id': region_id, 'description': '', 'parent_region_id': ''} - raise exception.RegionNotFound(region_id=region_id) - - def update_region(self, region_id, region_ref): - raise exception.NotImplemented() - - def delete_region(self, region_id): - raise exception.NotImplemented() - - # service crud - - def create_service(self, service_id, service_ref): - raise exception.NotImplemented() - - def _list_services(self, hints): - for region_ref in six.itervalues(self.templates): - for service_type, service_ref in six.iteritems(region_ref): - yield { - 'id': service_type, - 'enabled': True, - 'name': service_ref.get('name', ''), - 'description': service_ref.get('description', ''), - 'type': service_type, - } - - def list_services(self, hints): - return list(self._list_services(hints=None)) - - def get_service(self, service_id): - for service in self._list_services(hints=None): - if service['id'] == service_id: - return service - raise exception.ServiceNotFound(service_id=service_id) - - def update_service(self, service_id, service_ref): - raise exception.NotImplemented() - - def delete_service(self, service_id): - raise exception.NotImplemented() - - # endpoint crud - - def create_endpoint(self, endpoint_id, endpoint_ref): - raise exception.NotImplemented() - - def _list_endpoints(self): - for region_id, region_ref in six.iteritems(self.templates): - for service_type, service_ref in six.iteritems(region_ref): - for key in service_ref: - if key.endswith('URL'): - interface = key[:-3] - endpoint_id = ('%s-%s-%s' % - (region_id, service_type, interface)) - yield { - 'id': endpoint_id, - 'service_id': service_type, - 'interface': interface, - 'url': service_ref[key], - 'legacy_endpoint_id': None, - 'region_id': region_id, - 'enabled': True, - } - - def list_endpoints(self, hints): - return list(self._list_endpoints()) - - def get_endpoint(self, endpoint_id): - for endpoint in self._list_endpoints(): - if endpoint['id'] == endpoint_id: - return endpoint - raise exception.EndpointNotFound(endpoint_id=endpoint_id) - - def update_endpoint(self, endpoint_id, endpoint_ref): - raise exception.NotImplemented() - - def delete_endpoint(self, endpoint_id): - raise exception.NotImplemented() - - def get_catalog(self, user_id, tenant_id): - """Retrieve and format the V2 service catalog. - - :param user_id: The id of the user who has been authenticated for - creating service catalog. - :param tenant_id: The id of the project. 'tenant_id' will be None in - the case this being called to create a catalog to go in a domain - scoped token. In this case, any endpoint that requires a tenant_id - as part of their URL will be skipped. - - :returns: A nested dict representing the service catalog or an - empty dict. - - """ - substitutions = dict( - itertools.chain(CONF.items(), CONF.eventlet_server.items())) - substitutions.update({'user_id': user_id}) - silent_keyerror_failures = [] - if tenant_id: - substitutions.update({ - 'tenant_id': tenant_id, - 'project_id': tenant_id, - }) - else: - silent_keyerror_failures = ['tenant_id', 'project_id', ] - - catalog = {} - # TODO(davechen): If there is service with no endpoints, we should - # skip the service instead of keeping it in the catalog. - # see bug #1436704. - for region, region_ref in self.templates.items(): - catalog[region] = {} - for service, service_ref in region_ref.items(): - service_data = {} - try: - for k, v in service_ref.items(): - formatted_value = core.format_url( - v, substitutions, - silent_keyerror_failures=silent_keyerror_failures) - if formatted_value: - service_data[k] = formatted_value - except exception.MalformedEndpoint: - continue # this failure is already logged in format_url() - catalog[region][service] = service_data - - return catalog - - def add_endpoint_to_project(self, endpoint_id, project_id): - raise exception.NotImplemented() - - def remove_endpoint_from_project(self, endpoint_id, project_id): - raise exception.NotImplemented() - - def check_endpoint_in_project(self, endpoint_id, project_id): - raise exception.NotImplemented() - - def list_endpoints_for_project(self, project_id): - raise exception.NotImplemented() - - def list_projects_for_endpoint(self, endpoint_id): - raise exception.NotImplemented() - - def delete_association_by_endpoint(self, endpoint_id): - raise exception.NotImplemented() - - def delete_association_by_project(self, project_id): - raise exception.NotImplemented() - - def create_endpoint_group(self, endpoint_group): - raise exception.NotImplemented() - - def get_endpoint_group(self, endpoint_group_id): - raise exception.NotImplemented() - - def update_endpoint_group(self, endpoint_group_id, endpoint_group): - raise exception.NotImplemented() - - def delete_endpoint_group(self, endpoint_group_id): - raise exception.NotImplemented() - - def add_endpoint_group_to_project(self, endpoint_group_id, project_id): - raise exception.NotImplemented() - - def get_endpoint_group_in_project(self, endpoint_group_id, project_id): - raise exception.NotImplemented() - - def list_endpoint_groups(self): - raise exception.NotImplemented() - - def list_endpoint_groups_for_project(self, project_id): - raise exception.NotImplemented() - - def list_projects_associated_with_endpoint_group(self, endpoint_group_id): - raise exception.NotImplemented() - - def remove_endpoint_group_from_project(self, endpoint_group_id, - project_id): - raise exception.NotImplemented() - - def delete_endpoint_group_association_by_project(self, project_id): - raise exception.NotImplemented() |