Add a QuotaClient and quota API tests

This change adds a QuotaClient for testing the Barbican quota API.
It adds a quota test suite and integrates the QuotaClient with the
plugin testing infrastructure.

Change-Id: I3249fb879f519da63129e0ec5117377a21094974
Depends-On: I813648476a3a7b0b0e416a524d4629dffe36c92e
Implements: bp tempest-plugin
diff --git a/barbican_tempest_plugin/tests/api/base.py b/barbican_tempest_plugin/tests/api/base.py
index abf1e83..7256a10 100644
--- a/barbican_tempest_plugin/tests/api/base.py
+++ b/barbican_tempest_plugin/tests/api/base.py
@@ -23,7 +23,7 @@
 CONF = config.CONF
 
 # NOTE(dane-fichter): We need to track resource types for cleanup.
-RESOURCE_TYPES = ['container', 'order', 'secret']
+RESOURCE_TYPES = ['container', 'order', 'quota', 'secret']
 
 
 def _get_uuid(href):
@@ -45,6 +45,9 @@
                 secret_ref = order_metadata.get('secret_ref')
                 if secret_ref:
                     cls.created_objects['secret'].add(_get_uuid(secret_ref))
+                uuid = _get_uuid(resp['order_ref'])
+            if resource == 'quota':
+                uuid = _get_uuid(args[0])
             if resource == 'secret':
                 uuid = _get_uuid(resp['secret_ref'])
             cls.created_objects[resource].add(uuid)
@@ -57,7 +60,7 @@
     """Base class for all api tests."""
 
     # Why do I have to be an admin to create secrets? No idea...
-    credentials = ('admin', )
+    credentials = ('admin', ['service_admin', 'key-manager:service-admin'])
     client_manager = clients.Clients
     created_objects = {}
 
@@ -77,6 +80,9 @@
             service='key-manager'
         )
 
+        os = getattr(cls, 'os_roles_%s' % cls.credentials[1][0])
+        cls.quota_client = os.secret_v1.QuotaClient(service='key-manager')
+
     @classmethod
     def resource_setup(cls):
         super(BaseKeyManagerTest, cls).resource_setup()
@@ -90,6 +96,8 @@
                 cls.delete_container(container_uuid)
             for order_uuid in list(cls.created_objects['order']):
                 cls.delete_order(order_uuid)
+            for project_quota_uuid in list(cls.created_objects['quota']):
+                cls.delete_project_quota(project_quota_uuid)
             for secret_uuid in list(cls.created_objects['secret']):
                 cls.delete_secret(secret_uuid)
         finally:
@@ -120,6 +128,16 @@
         return cls.order_client.delete_order(uuid)
 
     @classmethod
+    @creates('quota')
+    def create_project_quota(cls, project_id, **kwargs):
+        return cls.quota_client.create_project_quota(project_id, **kwargs)
+
+    @classmethod
+    def delete_project_quota(cls, project_id):
+        cls.created_objects['quota'].remove(project_id)
+        return cls.quota_client.delete_project_quota(project_id)
+
+    @classmethod
     @creates('secret')
     def create_secret(cls, **kwargs):
         return cls.secret_client.create_secret(**kwargs)