Adding shared-images support
This commit is contained in:
@@ -20,25 +20,60 @@ class ImageMember(base.Resource):
|
||||
def __repr__(self):
|
||||
return "<ImageMember %s>" % 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):
|
||||
|
@@ -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):
|
||||
|
@@ -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},
|
||||
]},
|
||||
),
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user