diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-03-20 04:55:46 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-03-20 04:55:46 +0000 |
| commit | 3a70a2f9281fdfec6f770cfb60fcd2dce5a77c5f (patch) | |
| tree | bda536f5e8ec77339c6185bb0bc409abdb2e0545 /keystone | |
| parent | 632fb0a8cb4eddf76ce0695472601d69115149a9 (diff) | |
| parent | 193374af3860e17ed03bb0431d823046079ae444 (diff) | |
| download | keystone-3a70a2f9281fdfec6f770cfb60fcd2dce5a77c5f.tar.gz keystone-3a70a2f9281fdfec6f770cfb60fcd2dce5a77c5f.tar.xz keystone-3a70a2f9281fdfec6f770cfb60fcd2dce5a77c5f.zip | |
Merge "Fixes LP #954089 - Service list templated catalog"
Diffstat (limited to 'keystone')
| -rw-r--r-- | keystone/catalog/backends/kvs.py | 9 | ||||
| -rw-r--r-- | keystone/catalog/backends/sql.py | 10 | ||||
| -rw-r--r-- | keystone/catalog/backends/templated.py | 3 | ||||
| -rw-r--r-- | keystone/catalog/core.py | 12 | ||||
| -rw-r--r-- | keystone/exception.py | 4 | ||||
| -rw-r--r-- | keystone/test.py | 75 |
6 files changed, 69 insertions, 44 deletions
diff --git a/keystone/catalog/backends/kvs.py b/keystone/catalog/backends/kvs.py index 58025ca1..f92a949a 100644 --- a/keystone/catalog/backends/kvs.py +++ b/keystone/catalog/backends/kvs.py @@ -16,6 +16,7 @@ from keystone import catalog +from keystone import exception from keystone.common import kvs @@ -25,7 +26,10 @@ class Catalog(kvs.Base, catalog.Driver): return self.db.get('catalog-%s-%s' % (tenant_id, user_id)) def get_service(self, service_id): - return self.db.get('service-%s' % service_id) + res = self.db.get('service-%s' % service_id) + if not res: + raise exception.ServiceNotFound(service_id=service_id) + return res def list_services(self): return self.db.get('service_list', []) @@ -42,6 +46,9 @@ class Catalog(kvs.Base, catalog.Driver): return service def delete_service(self, service_id): + if not self.db.get('service-%s' % service_id): + raise exception.ServiceNotFound(service_id=service_id) + self.db.delete('service-%s' % service_id) service_list = set(self.db.get('service_list', [])) service_list.remove(service_id) diff --git a/keystone/catalog/backends/sql.py b/keystone/catalog/backends/sql.py index b2a12dde..cf883eee 100644 --- a/keystone/catalog/backends/sql.py +++ b/keystone/catalog/backends/sql.py @@ -90,11 +90,15 @@ class Catalog(sql.Base, catalog.Driver): def get_service(self, service_id): session = self.get_session() service_ref = session.query(Service).filter_by(id=service_id).first() + if not service_ref: + raise exception.ServiceNotFound(service_id=service_id) return service_ref.to_dict() def delete_service(self, service_id): session = self.get_session() service_ref = session.query(Service).filter_by(id=service_id).first() + if not service_ref: + raise exception.ServiceNotFound(service_id=service_id) with session.begin(): session.delete(service_ref) session.flush() @@ -107,12 +111,6 @@ class Catalog(sql.Base, catalog.Driver): session.flush() return service.to_dict() - def service_exists(self, service_id): - session = self.get_session() - if not session.query(Service).filter_by(id=service_id).first(): - return False - return True - # Endpoints def create_endpoint(self, endpoint_id, endpoint_ref): session = self.get_session() diff --git a/keystone/catalog/backends/templated.py b/keystone/catalog/backends/templated.py index d1151113..21b4e2f6 100644 --- a/keystone/catalog/backends/templated.py +++ b/keystone/catalog/backends/templated.py @@ -52,6 +52,9 @@ def parse_templates(template_lines): return o +# TODO(jaypipes): should be templated.Catalog, +# not templated.TemplatedCatalog to be consistent with +# other catalog backends class TemplatedCatalog(kvs.Catalog): """A backend that generates endpoints for the Catalog based on templates. diff --git a/keystone/catalog/core.py b/keystone/catalog/core.py index f6e71232..0fc11bf7 100644 --- a/keystone/catalog/core.py +++ b/keystone/catalog/core.py @@ -69,14 +69,6 @@ class Driver(object): def create_service(self, service_id, service_ref): raise exception.NotImplemented() - def service_exists(self, service_id): - """Query existence of a service by id. - - Returns: True if the service exists or False. - - """ - raise exception.NotImplemented() - def create_endpoint(self, endpoint_id, endpoint_ref): raise exception.NotImplemented() @@ -176,7 +168,9 @@ class EndpointController(wsgi.Application): endpoint_ref['id'] = endpoint_id service_id = endpoint_ref['service_id'] - if not self.catalog_api.service_exists(context, service_id): + try: + service = self.catalog_api.get_service(context, service_id) + except exception.ServiceNotFound: msg = 'No service exists with id %s' % service_id raise webob.exc.HTTPBadRequest(msg) diff --git a/keystone/exception.py b/keystone/exception.py index d95a75e0..e905dd38 100644 --- a/keystone/exception.py +++ b/keystone/exception.py @@ -77,3 +77,7 @@ class NotImplemented(Error): class TokenNotFound(NotFound): """Could not find token: %(token_id)s""" + + +class ServiceNotFound(NotFound): + """Could not find service: %(service_id)s""" diff --git a/keystone/test.py b/keystone/test.py index 9712aa26..9aea3ab1 100644 --- a/keystone/test.py +++ b/keystone/test.py @@ -122,6 +122,7 @@ class TestCase(unittest.TestCase): self._paths = [] self._memo = {} self._overrides = [] + self._group_overrides = {} def setUp(self): super(TestCase, self).setUp() @@ -147,15 +148,26 @@ class TestCase(unittest.TestCase): kvs.INMEMDB.clear() self.reset_opts() + def opt_in_group(self, group, **kw): + for k, v in kw.iteritems(): + CONF.set_override(k, v, group) + if group not in self._group_overrides: + self._group_overrides[group] = [] + self._group_overrides[group].append(k) + def opt(self, **kw): for k, v in kw.iteritems(): CONF.set_override(k, v) self._overrides.append(k) def reset_opts(self): + for group, opt_list in self._group_overrides.iteritems(): + for k in opt_list: + CONF.set_override(k, None, group) for k in self._overrides: CONF.set_override(k, None) self._overrides = [] + self._group_overrides = {} CONF.reset() def load_backends(self): @@ -173,34 +185,41 @@ class TestCase(unittest.TestCase): """ # TODO(termie): doing something from json, probably based on Django's # loaddata will be much preferred. - for tenant in fixtures.TENANTS: - rv = self.identity_api.create_tenant(tenant['id'], tenant) - setattr(self, 'tenant_%s' % tenant['id'], rv) - - for user in fixtures.USERS: - user_copy = user.copy() - tenants = user_copy.pop('tenants') - rv = self.identity_api.create_user(user['id'], user_copy.copy()) - for tenant_id in tenants: - self.identity_api.add_user_to_tenant(tenant_id, user['id']) - setattr(self, 'user_%s' % user['id'], user_copy) - - for role in fixtures.ROLES: - rv = self.identity_api.create_role(role['id'], role) - setattr(self, 'role_%s' % role['id'], rv) - - for metadata in fixtures.METADATA: - metadata_ref = metadata.copy() - # TODO(termie): these will probably end up in the model anyway, - # so this may be futile - del metadata_ref['user_id'] - del metadata_ref['tenant_id'] - rv = self.identity_api.create_metadata(metadata['user_id'], - metadata['tenant_id'], - metadata_ref) - setattr(self, - 'metadata_%s%s' % (metadata['user_id'], - metadata['tenant_id']), rv) + if hasattr(self, 'catalog_api'): + for service in fixtures.SERVICES: + rv = self.catalog_api.create_service(service['id'], service) + setattr(self, 'service_%s' % service['id'], rv) + + if hasattr(self, 'identity_api'): + for tenant in fixtures.TENANTS: + rv = self.identity_api.create_tenant(tenant['id'], tenant) + setattr(self, 'tenant_%s' % tenant['id'], rv) + + for user in fixtures.USERS: + user_copy = user.copy() + tenants = user_copy.pop('tenants') + rv = self.identity_api.create_user(user['id'], + user_copy.copy()) + for tenant_id in tenants: + self.identity_api.add_user_to_tenant(tenant_id, user['id']) + setattr(self, 'user_%s' % user['id'], user_copy) + + for role in fixtures.ROLES: + rv = self.identity_api.create_role(role['id'], role) + setattr(self, 'role_%s' % role['id'], rv) + + for metadata in fixtures.METADATA: + metadata_ref = metadata.copy() + # TODO(termie): these will probably end up in the model anyway, + # so this may be futile + del metadata_ref['user_id'] + del metadata_ref['tenant_id'] + rv = self.identity_api.create_metadata(metadata['user_id'], + metadata['tenant_id'], + metadata_ref) + setattr(self, + 'metadata_%s%s' % (metadata['user_id'], + metadata['tenant_id']), rv) def _paste_config(self, config): if not config.startswith('config:'): |
