Add image members tests.
This commit adds client methods for the glance v1 api for
interacting with image members. It also adds some basic tests
for creating, getting, and deleting image members.
Partially implements bp add-glance-api-v1-tests
Change-Id: I997ab525c05ed15bfd857b2cfb634379d0b3fec2
diff --git a/tempest/services/image/v1/json/image_client.py b/tempest/services/image/v1/json/image_client.py
index 88105c2..45e93e2 100644
--- a/tempest/services/image/v1/json/image_client.py
+++ b/tempest/services/image/v1/json/image_client.py
@@ -202,3 +202,35 @@
except exceptions.NotFound:
return True
return False
+
+ def get_image_membership(self, image_id):
+ url = 'v1/images/%s/members' % image_id
+ resp, body = self.get(url)
+ body = json.loads(body)
+ return resp, body
+
+ def get_shared_images(self, member_id):
+ url = 'v1/shared-images/%s' % member_id
+ resp, body = self.get(url)
+ body = json.loads(body)
+ return resp, body
+
+ def add_member(self, member_id, image_id, can_share=False):
+ url = 'v1/images/%s/members/%s' % (image_id, member_id)
+ body = None
+ if can_share:
+ body = json.dumps({'member': {'can_share': True}})
+ resp, __ = self.put(url, body, self.headers)
+ return resp
+
+ def delete_member(self, member_id, image_id):
+ url = 'v1/images/%s/members/%s' % (image_id, member_id)
+ resp, __ = self.delete(url)
+ return resp
+
+ def replace_membership_list(self, image_id, member_list):
+ url = 'v1/images/%s/members' % image_id
+ body = json.dumps({'membership': member_list})
+ resp, data = self.put(url, body, self.headers)
+ data = json.loads(data)
+ return resp, data
diff --git a/tempest/tests/image/v1/test_image_members.py b/tempest/tests/image/v1/test_image_members.py
new file mode 100644
index 0000000..30fa6c6
--- /dev/null
+++ b/tempest/tests/image/v1/test_image_members.py
@@ -0,0 +1,93 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2013 IBM Corp.
+#
+# 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 cStringIO as StringIO
+
+from tempest import clients
+import tempest.test
+
+
+class ImageMembersTests(tempest.test.BaseTestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ cls.os = clients.Manager()
+ cls.client = cls.os.image_client
+ admin = clients.AdminManager(interface='json')
+ cls.admin_client = admin.identity_client
+ cls.created_images = []
+ cls.tenants = cls._get_tenants()
+
+ @classmethod
+ def tearDownClass(cls):
+ for image_id in cls.created_images:
+ cls.client.delete_image(image_id)
+ cls.client.wait_for_resource_deletion(image_id)
+
+ @classmethod
+ def _get_tenants(cls):
+ resp, tenants = cls.admin_client.list_tenants()
+ tenants = map(lambda x: x['id'], tenants)
+ return tenants
+
+ def _create_image(self, name=None):
+ image_file = StringIO.StringIO('*' * 1024)
+ if name is not None:
+ name = 'New Standard Image with Members'
+ resp, image = self.client.create_image(name,
+ 'bare', 'raw',
+ is_public=True, data=image_file)
+ self.assertEquals(201, resp.status)
+ image_id = image['id']
+ self.created_images.append(image_id)
+ return image_id
+
+ def test_add_image_member(self):
+ image = self._create_image()
+ resp = self.client.add_member(self.tenants[0], image)
+ self.assertEquals(204, resp.status)
+ resp, body = self.client.get_image_membership(image)
+ self.assertEquals(200, resp.status)
+ members = body['members']
+ members = map(lambda x: x['member_id'], members)
+ self.assertIn(self.tenants[0], members)
+
+ def test_get_shared_images(self):
+ image = self._create_image()
+ resp = self.client.add_member(self.tenants[0], image)
+ self.assertEquals(204, resp.status)
+ name = 'Shared Image'
+ share_image = self._create_image(name=name)
+ resp = self.client.add_member(self.tenants[0], share_image)
+ self.assertEquals(204, resp.status)
+ resp, body = self.client.get_shared_images(self.tenants[0])
+ self.assertEquals(200, resp.status)
+ images = body['shared_images']
+ images = map(lambda x: x['image_id'], images)
+ self.assertIn(share_image, images)
+ self.assertIn(image, images)
+
+ def test_remove_member(self):
+ name = 'Shared Image for Delete Test'
+ image_id = self._create_image(name=name)
+ resp = self.client.add_member(self.tenants[0], image_id)
+ self.assertEquals(204, resp.status)
+ resp = self.client.delete_member(self.tenants[0], image_id)
+ self.assertEquals(204, resp.status)
+ resp, body = self.client.get_image_membership(image_id)
+ self.assertEquals(200, resp.status)
+ members = body['members']
+ self.assertEquals(0, len(members))