Adding shared-images support
This commit is contained in:
@@ -20,25 +20,60 @@ class ImageMember(base.Resource):
|
|||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<ImageMember %s>" % self._info
|
return "<ImageMember %s>" % self._info
|
||||||
|
|
||||||
|
def delete(self):
|
||||||
|
self.manager.delete(self)
|
||||||
|
|
||||||
|
|
||||||
class ImageMemberManager(base.Manager):
|
class ImageMemberManager(base.Manager):
|
||||||
resource_class = ImageMember
|
resource_class = ImageMember
|
||||||
|
|
||||||
def get(self, image, member_id):
|
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)
|
image_id = base.getid(image)
|
||||||
try:
|
url = '/v1/images/%s/members/%s' % (image_id, member_id)
|
||||||
member_id = base.getid(member)
|
resp, body = self.api.get(url)
|
||||||
except AttributeError:
|
member = body['member']
|
||||||
member_id = 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))
|
self._delete("/v1/images/%s/members/%s" % (image_id, member_id))
|
||||||
|
|
||||||
def create(self, image, member_id, can_share=False):
|
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.mgr = glanceclient.v1.image_members.ImageMemberManager(self.api)
|
||||||
self.image = glanceclient.v1.images.Image(self.api, {'id': '1'}, True)
|
self.image = glanceclient.v1.images.Image(self.api, {'id': '1'}, True)
|
||||||
|
|
||||||
def test_list(self):
|
def test_list_by_image(self):
|
||||||
members = self.mgr.list(self.image)
|
members = self.mgr.list(image=self.image)
|
||||||
expect = [('GET', '/v1/images/1/members', {}, None)]
|
expect = [('GET', '/v1/images/1/members', {}, None)]
|
||||||
self.assertEqual(self.api.calls, expect)
|
self.assertEqual(self.api.calls, expect)
|
||||||
self.assertEqual(len(members), 1)
|
self.assertEqual(len(members), 1)
|
||||||
self.assertEqual(members[0].member_id, '1')
|
self.assertEqual(members[0].member_id, '1')
|
||||||
|
self.assertEqual(members[0].image_id, '1')
|
||||||
self.assertEqual(members[0].can_share, False)
|
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):
|
def test_delete(self):
|
||||||
self.mgr.delete(self.image, '1')
|
member = self.mgr.get(self.image, '1')
|
||||||
expect = [('DELETE', '/v1/images/1/members/1', {}, None)]
|
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)
|
self.assertEqual(self.api.calls, expect)
|
||||||
|
|
||||||
def test_create(self):
|
def test_create(self):
|
||||||
|
@@ -63,9 +63,24 @@ fixtures = {
|
|||||||
'PUT': ({}, None),
|
'PUT': ({}, None),
|
||||||
},
|
},
|
||||||
'/v1/images/1/members/1': {
|
'/v1/images/1/members/1': {
|
||||||
|
'GET': (
|
||||||
|
{},
|
||||||
|
{'member': {
|
||||||
|
'member_id': '1',
|
||||||
|
'can_share': False,
|
||||||
|
}},
|
||||||
|
),
|
||||||
'PUT': ({}, None),
|
'PUT': ({}, None),
|
||||||
'DELETE': ({}, None),
|
'DELETE': ({}, None),
|
||||||
},
|
},
|
||||||
|
'/v1/shared_images/1': {
|
||||||
|
'GET': (
|
||||||
|
{},
|
||||||
|
{'shared_images': [
|
||||||
|
{'image_id': '1', 'can_share': False},
|
||||||
|
]},
|
||||||
|
),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user