diff --git a/glanceclient/v1/image_members.py b/glanceclient/v1/image_members.py index 459d6f74..e06b42dc 100644 --- a/glanceclient/v1/image_members.py +++ b/glanceclient/v1/image_members.py @@ -20,25 +20,60 @@ class ImageMember(base.Resource): def __repr__(self): return "" % self._info + def delete(self): + self.manager.delete(self) + class ImageMemberManager(base.Manager): resource_class = ImageMember def get(self, image, member_id): - url = '/v1/images/%s' % (base.getid(image), member_id) - return self._get(url, 'member') - - def list(self, image): - url = '/v1/images/%s/members' % base.getid(image) - return self._list(url, 'members') - - def delete(self, image, member): image_id = base.getid(image) - try: - member_id = base.getid(member) - except AttributeError: - member_id = member + url = '/v1/images/%s/members/%s' % (image_id, member_id) + resp, body = self.api.get(url) + member = body['member'] + member['image_id'] = image_id + return ImageMember(self, member, loaded=True) + def list(self, image=None, member=None): + out = [] + if image and member: + try: + out.append(self.get(image, member)) + #TODO: narrow this down to 404 + except: + pass + elif image: + out.extend(self._list_by_image(image)) + elif member: + out.extend(self._list_by_member(member)) + else: + #TODO: figure out what is appropriate to do here as we are + # unable to provide the requested response + pass + return out + + def _list_by_image(self, image): + image_id = base.getid(image) + resp, body = self.api.get('/v1/images/%s/members' % image_id) + out = [] + for member in body['members']: + member['image_id'] = image_id + out.append(ImageMember(self, member, loaded=True)) + return out + + def _list_by_member(self, member): + member_id = base.getid(member) + resp, body = self.api.get('/v1/shared_images/%s' % member_id) + out = [] + for member in body['shared_images']: + member['member_id'] = member_id + out.append(ImageMember(self, member, loaded=True)) + return out + + def delete(self, member): + member_id = member.member_id + image_id = member.image_id self._delete("/v1/images/%s/members/%s" % (image_id, member_id)) def create(self, image, member_id, can_share=False): diff --git a/tests/v1/test_image_members.py b/tests/v1/test_image_members.py index f7d06593..9fa94154 100644 --- a/tests/v1/test_image_members.py +++ b/tests/v1/test_image_members.py @@ -14,17 +14,39 @@ class ImageMemberManagerTest(unittest.TestCase): self.mgr = glanceclient.v1.image_members.ImageMemberManager(self.api) self.image = glanceclient.v1.images.Image(self.api, {'id': '1'}, True) - def test_list(self): - members = self.mgr.list(self.image) + def test_list_by_image(self): + members = self.mgr.list(image=self.image) expect = [('GET', '/v1/images/1/members', {}, None)] self.assertEqual(self.api.calls, expect) self.assertEqual(len(members), 1) self.assertEqual(members[0].member_id, '1') + self.assertEqual(members[0].image_id, '1') self.assertEqual(members[0].can_share, False) + def test_list_by_member(self): + members = self.mgr.list(member='1') + expect = [('GET', '/v1/shared_images/1', {}, None)] + self.assertEqual(self.api.calls, expect) + self.assertEqual(len(members), 1) + self.assertEqual(members[0].member_id, '1') + self.assertEqual(members[0].image_id, '1') + self.assertEqual(members[0].can_share, False) + + def test_get(self): + member = self.mgr.get(self.image, '1') + expect = [('GET', '/v1/images/1/members/1', {}, None)] + self.assertEqual(self.api.calls, expect) + self.assertEqual(member.member_id, '1') + self.assertEqual(member.image_id, '1') + self.assertEqual(member.can_share, False) + def test_delete(self): - self.mgr.delete(self.image, '1') - expect = [('DELETE', '/v1/images/1/members/1', {}, None)] + member = self.mgr.get(self.image, '1') + self.mgr.delete(member) + expect = [ + ('GET', '/v1/images/1/members/1', {}, None), + ('DELETE', '/v1/images/1/members/1', {}, None), + ] self.assertEqual(self.api.calls, expect) def test_create(self): diff --git a/tests/v1/utils.py b/tests/v1/utils.py index 6719c35a..c06b0753 100644 --- a/tests/v1/utils.py +++ b/tests/v1/utils.py @@ -63,9 +63,24 @@ fixtures = { 'PUT': ({}, None), }, '/v1/images/1/members/1': { + 'GET': ( + {}, + {'member': { + 'member_id': '1', + 'can_share': False, + }}, + ), 'PUT': ({}, None), 'DELETE': ({}, None), }, + '/v1/shared_images/1': { + 'GET': ( + {}, + {'shared_images': [ + {'image_id': '1', 'can_share': False}, + ]}, + ), + }, }