summaryrefslogtreecommitdiffstats
path: root/keystone
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-03-20 04:55:46 +0000
committerGerrit Code Review <review@openstack.org>2012-03-20 04:55:46 +0000
commit3a70a2f9281fdfec6f770cfb60fcd2dce5a77c5f (patch)
treebda536f5e8ec77339c6185bb0bc409abdb2e0545 /keystone
parent632fb0a8cb4eddf76ce0695472601d69115149a9 (diff)
parent193374af3860e17ed03bb0431d823046079ae444 (diff)
downloadkeystone-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.py9
-rw-r--r--keystone/catalog/backends/sql.py10
-rw-r--r--keystone/catalog/backends/templated.py3
-rw-r--r--keystone/catalog/core.py12
-rw-r--r--keystone/exception.py4
-rw-r--r--keystone/test.py75
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:'):