Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / livetest / image.py @ 1e1d6f27

History | View | Annotate | Download (9.2 kB)

1 420598d0 Stavros Sachtouris
# Copyright 2012-2013 GRNET S.A. All rights reserved.
2 420598d0 Stavros Sachtouris
#
3 420598d0 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 420598d0 Stavros Sachtouris
# without modification, are permitted provided that the following
5 420598d0 Stavros Sachtouris
# conditions are met:
6 420598d0 Stavros Sachtouris
#
7 420598d0 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 420598d0 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 420598d0 Stavros Sachtouris
#      disclaimer.
10 420598d0 Stavros Sachtouris
#
11 420598d0 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 420598d0 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 420598d0 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 420598d0 Stavros Sachtouris
#      provided with the distribution.
15 420598d0 Stavros Sachtouris
#
16 420598d0 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 420598d0 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 420598d0 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 420598d0 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 420598d0 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 420598d0 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 420598d0 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 420598d0 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 420598d0 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 420598d0 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 420598d0 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 420598d0 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 420598d0 Stavros Sachtouris
#
29 420598d0 Stavros Sachtouris
# The views and conclusions contained in the software and
30 420598d0 Stavros Sachtouris
# documentation are those of the authors and should not be
31 420598d0 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 420598d0 Stavros Sachtouris
# or implied, of GRNET S.A.
33 420598d0 Stavros Sachtouris
34 420598d0 Stavros Sachtouris
import time
35 420598d0 Stavros Sachtouris
36 f5f2dc53 Stavros Sachtouris
from kamaki.clients import livetest
37 9b745324 Stavros Sachtouris
from kamaki.clients.astakos import AstakosClient as AstakosCachedClient
38 420598d0 Stavros Sachtouris
from kamaki.clients.cyclades import CycladesClient
39 420598d0 Stavros Sachtouris
from kamaki.clients.image import ImageClient
40 420598d0 Stavros Sachtouris
from kamaki.clients import ClientError
41 420598d0 Stavros Sachtouris
42 420598d0 Stavros Sachtouris
43 7b6e977c Stavros Sachtouris
IMGMETA = set([
44 7b6e977c Stavros Sachtouris
    'id', 'name', 'checksum', 'container-format', 'location', 'disk-format',
45 7b6e977c Stavros Sachtouris
    'is-public', 'status', 'deleted-at', 'updated-at', 'created-at', 'owner',
46 7b6e977c Stavros Sachtouris
    'size'])
47 7b6e977c Stavros Sachtouris
48 7b6e977c Stavros Sachtouris
49 f5f2dc53 Stavros Sachtouris
class Image(livetest.Generic):
50 420598d0 Stavros Sachtouris
    def setUp(self):
51 420598d0 Stavros Sachtouris
        self.now = time.mktime(time.gmtime())
52 2feb9477 Stavros Sachtouris
        self.cloud = 'cloud.%s' % self['testcloud']
53 2feb9477 Stavros Sachtouris
        aurl, self.token = self[self.cloud, 'url'], self[self.cloud, 'token']
54 9b745324 Stavros Sachtouris
        self.auth_base = AstakosCachedClient(aurl, self.token)
55 420598d0 Stavros Sachtouris
        self.imgname = 'img_%s' % self.now
56 9b745324 Stavros Sachtouris
        url = self.auth_base.get_service_endpoints('image')['publicURL']
57 9b745324 Stavros Sachtouris
        self.token = self.auth_base.token
58 9b745324 Stavros Sachtouris
        self.client = ImageClient(url, self.token)
59 9b745324 Stavros Sachtouris
        cyclades_url = self.auth_base.get_service_endpoints(
60 9b745324 Stavros Sachtouris
            'compute')['publicURL']
61 9b745324 Stavros Sachtouris
        self.cyclades = CycladesClient(cyclades_url, self.token)
62 420598d0 Stavros Sachtouris
        self._imglist = {}
63 7b6e977c Stavros Sachtouris
        self._imgdetails = {}
64 420598d0 Stavros Sachtouris
65 54d7c02a Stavros Sachtouris
    def test_000(self):
66 54d7c02a Stavros Sachtouris
        self._prepare_img()
67 54d7c02a Stavros Sachtouris
        super(self.__class__, self).test_000()
68 54d7c02a Stavros Sachtouris
69 420598d0 Stavros Sachtouris
    def _prepare_img(self):
70 420598d0 Stavros Sachtouris
        f = open(self['image', 'local_path'], 'rb')
71 9b745324 Stavros Sachtouris
        (token, uuid) = (self.token, self.auth_base.user_term('id'))
72 9b745324 Stavros Sachtouris
        purl = self.auth_base.get_service_endpoints(
73 9b745324 Stavros Sachtouris
            'object-store')['publicURL']
74 420598d0 Stavros Sachtouris
        from kamaki.clients.pithos import PithosClient
75 9b745324 Stavros Sachtouris
        self.pithcli = PithosClient(purl, token, uuid)
76 420598d0 Stavros Sachtouris
        cont = 'cont_%s' % self.now
77 420598d0 Stavros Sachtouris
        self.pithcli.container = cont
78 420598d0 Stavros Sachtouris
        self.obj = 'obj_%s' % self.now
79 420598d0 Stavros Sachtouris
        print('\t- Create container %s on Pithos server' % cont)
80 420598d0 Stavros Sachtouris
        self.pithcli.container_put()
81 420598d0 Stavros Sachtouris
        self.location = 'pithos://%s/%s/%s' % (uuid, cont, self.obj)
82 e7e7dbbd Stavros Sachtouris
        print('\t- Upload an image at %s...\n' % self.location)
83 420598d0 Stavros Sachtouris
        self.pithcli.upload_object(self.obj, f)
84 420598d0 Stavros Sachtouris
        print('\t- ok')
85 420598d0 Stavros Sachtouris
        f.close()
86 420598d0 Stavros Sachtouris
87 7b6e977c Stavros Sachtouris
        r = self.client.register(
88 1e1d6f27 Stavros Sachtouris
            self.imgname, self.location, params=dict(is_public=True))
89 7b6e977c Stavros Sachtouris
        self._imglist[self.imgname] = dict(
90 17b255c7 Stavros Sachtouris
            name=r['name'], id=r['id'])
91 7b6e977c Stavros Sachtouris
        self._imgdetails[self.imgname] = r
92 420598d0 Stavros Sachtouris
93 420598d0 Stavros Sachtouris
    def tearDown(self):
94 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
95 420598d0 Stavros Sachtouris
            print('\tDeleting image %s' % img['id'])
96 420598d0 Stavros Sachtouris
            self.cyclades.delete_image(img['id'])
97 420598d0 Stavros Sachtouris
        if hasattr(self, 'pithcli'):
98 420598d0 Stavros Sachtouris
            print('\tDeleting container %s' % self.pithcli.container)
99 420598d0 Stavros Sachtouris
            try:
100 420598d0 Stavros Sachtouris
                self.pithcli.del_container(delimiter='/')
101 420598d0 Stavros Sachtouris
                self.pithcli.purge_container()
102 420598d0 Stavros Sachtouris
            except ClientError:
103 420598d0 Stavros Sachtouris
                pass
104 420598d0 Stavros Sachtouris
105 420598d0 Stavros Sachtouris
    def _get_img_by_name(self, name):
106 420598d0 Stavros Sachtouris
        r = self.cyclades.list_images()
107 420598d0 Stavros Sachtouris
        for img in r:
108 420598d0 Stavros Sachtouris
            if img['name'] == name:
109 420598d0 Stavros Sachtouris
                return img
110 420598d0 Stavros Sachtouris
        return None
111 420598d0 Stavros Sachtouris
112 420598d0 Stavros Sachtouris
    def test_list_public(self):
113 420598d0 Stavros Sachtouris
        """Test list_public"""
114 54d7c02a Stavros Sachtouris
        self._test_list_public()
115 54d7c02a Stavros Sachtouris
116 54d7c02a Stavros Sachtouris
    def _test_list_public(self):
117 420598d0 Stavros Sachtouris
        r = self.client.list_public()
118 420598d0 Stavros Sachtouris
        r0 = self.client.list_public(order='-')
119 420598d0 Stavros Sachtouris
        self.assertTrue(len(r) > 0)
120 420598d0 Stavros Sachtouris
        for img in r:
121 24ff0a35 Stavros Sachtouris
            for term in (
122 24ff0a35 Stavros Sachtouris
                    'status',
123 24ff0a35 Stavros Sachtouris
                    'name',
124 24ff0a35 Stavros Sachtouris
                    'container_format',
125 24ff0a35 Stavros Sachtouris
                    'disk_format',
126 24ff0a35 Stavros Sachtouris
                    'id',
127 24ff0a35 Stavros Sachtouris
                    'size'):
128 420598d0 Stavros Sachtouris
                self.assertTrue(term in img)
129 54d7c02a Stavros Sachtouris
        self.assertTrue(r, r0)
130 420598d0 Stavros Sachtouris
        r0.reverse()
131 420598d0 Stavros Sachtouris
        for i, img in enumerate(r):
132 9b745324 Stavros Sachtouris
            self.assert_dicts_are_equal(img, r0[i])
133 420598d0 Stavros Sachtouris
        r1 = self.client.list_public(detail=True)
134 420598d0 Stavros Sachtouris
        for img in r1:
135 24ff0a35 Stavros Sachtouris
            for term in (
136 24ff0a35 Stavros Sachtouris
                    'status',
137 24ff0a35 Stavros Sachtouris
                    'name',
138 24ff0a35 Stavros Sachtouris
                    'checksum',
139 24ff0a35 Stavros Sachtouris
                    'created_at',
140 24ff0a35 Stavros Sachtouris
                    'disk_format',
141 24ff0a35 Stavros Sachtouris
                    'updated_at',
142 24ff0a35 Stavros Sachtouris
                    'id',
143 24ff0a35 Stavros Sachtouris
                    'location',
144 24ff0a35 Stavros Sachtouris
                    'container_format',
145 24ff0a35 Stavros Sachtouris
                    'owner',
146 24ff0a35 Stavros Sachtouris
                    'is_public',
147 24ff0a35 Stavros Sachtouris
                    'deleted_at',
148 24ff0a35 Stavros Sachtouris
                    'properties',
149 24ff0a35 Stavros Sachtouris
                    'size'):
150 420598d0 Stavros Sachtouris
                self.assertTrue(term in img)
151 17b255c7 Stavros Sachtouris
                if len(img['properties']):
152 3e02e714 Stavros Sachtouris
                    for interm in ('osfamily', 'root_partition'):
153 54d7c02a Stavros Sachtouris
                        self.assertTrue(interm in img['properties'])
154 df0045d8 Stavros Sachtouris
        size_max = 1000000000000
155 420598d0 Stavros Sachtouris
        r2 = self.client.list_public(filters=dict(size_max=size_max))
156 420598d0 Stavros Sachtouris
        self.assertTrue(len(r2) <= len(r))
157 420598d0 Stavros Sachtouris
        for img in r2:
158 420598d0 Stavros Sachtouris
            self.assertTrue(int(img['size']) <= size_max)
159 420598d0 Stavros Sachtouris
160 420598d0 Stavros Sachtouris
    def test_get_meta(self):
161 420598d0 Stavros Sachtouris
        """Test get_meta"""
162 54d7c02a Stavros Sachtouris
        self._test_get_meta()
163 54d7c02a Stavros Sachtouris
164 54d7c02a Stavros Sachtouris
    def _test_get_meta(self):
165 420598d0 Stavros Sachtouris
        r = self.client.get_meta(self['image', 'id'])
166 420598d0 Stavros Sachtouris
        self.assertEqual(r['id'], self['image', 'id'])
167 24ff0a35 Stavros Sachtouris
        for term in (
168 24ff0a35 Stavros Sachtouris
                'status',
169 24ff0a35 Stavros Sachtouris
                'name',
170 24ff0a35 Stavros Sachtouris
                'checksum',
171 24ff0a35 Stavros Sachtouris
                'updated-at',
172 24ff0a35 Stavros Sachtouris
                'created-at',
173 24ff0a35 Stavros Sachtouris
                'deleted-at',
174 24ff0a35 Stavros Sachtouris
                'location',
175 24ff0a35 Stavros Sachtouris
                'is-public',
176 24ff0a35 Stavros Sachtouris
                'owner',
177 24ff0a35 Stavros Sachtouris
                'disk-format',
178 24ff0a35 Stavros Sachtouris
                'size',
179 24ff0a35 Stavros Sachtouris
                'container-format'):
180 420598d0 Stavros Sachtouris
            self.assertTrue(term in r)
181 24ff0a35 Stavros Sachtouris
            for interm in (
182 17b255c7 Stavros Sachtouris
                    'OSFAMILY',
183 17b255c7 Stavros Sachtouris
                    'USERS',
184 17b255c7 Stavros Sachtouris
                    'ROOT_PARTITION',
185 17b255c7 Stavros Sachtouris
                    'OS',
186 17b255c7 Stavros Sachtouris
                    'DESCRIPTION'):
187 420598d0 Stavros Sachtouris
                self.assertTrue(interm in r['properties'])
188 420598d0 Stavros Sachtouris
189 420598d0 Stavros Sachtouris
    def test_register(self):
190 420598d0 Stavros Sachtouris
        """Test register"""
191 420598d0 Stavros Sachtouris
        self._prepare_img()
192 54d7c02a Stavros Sachtouris
        self._test_register()
193 54d7c02a Stavros Sachtouris
194 54d7c02a Stavros Sachtouris
    def _test_register(self):
195 54d7c02a Stavros Sachtouris
        self.assertTrue(self._imglist)
196 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
197 24ff0a35 Stavros Sachtouris
            self.assertTrue(img is not None)
198 7b6e977c Stavros Sachtouris
            r = set(self._imgdetails[img['name']].keys())
199 17b255c7 Stavros Sachtouris
            self.assertTrue(r.issubset(IMGMETA.union(['properties'])))
200 420598d0 Stavros Sachtouris
201 4fbc9d34 Stavros Sachtouris
    def test_unregister(self):
202 4fbc9d34 Stavros Sachtouris
        """Test unregister"""
203 4fbc9d34 Stavros Sachtouris
        self._prepare_img()
204 4fbc9d34 Stavros Sachtouris
        self._test_unregister()
205 4fbc9d34 Stavros Sachtouris
206 4fbc9d34 Stavros Sachtouris
    def _test_unregister(self):
207 4fbc9d34 Stavros Sachtouris
        try:
208 4fbc9d34 Stavros Sachtouris
            for img in self._imglist.values():
209 4fbc9d34 Stavros Sachtouris
                self.client.unregister(img['id'])
210 4fbc9d34 Stavros Sachtouris
                self._prepare_img()
211 4fbc9d34 Stavros Sachtouris
                break
212 4fbc9d34 Stavros Sachtouris
        except ClientError as ce:
213 4fbc9d34 Stavros Sachtouris
            if ce.status in (405,):
214 4fbc9d34 Stavros Sachtouris
                print 'IMAGE UNREGISTER is not supported by server: %s' % ce
215 4fbc9d34 Stavros Sachtouris
            else:
216 4fbc9d34 Stavros Sachtouris
                raise
217 4fbc9d34 Stavros Sachtouris
218 420598d0 Stavros Sachtouris
    def test_set_members(self):
219 420598d0 Stavros Sachtouris
        """Test set_members"""
220 420598d0 Stavros Sachtouris
        self._prepare_img()
221 54d7c02a Stavros Sachtouris
        self._test_set_members()
222 54d7c02a Stavros Sachtouris
223 54d7c02a Stavros Sachtouris
    def _test_set_members(self):
224 420598d0 Stavros Sachtouris
        members = ['%s@fake.net' % self.now]
225 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
226 420598d0 Stavros Sachtouris
            self.client.set_members(img['id'], members)
227 420598d0 Stavros Sachtouris
            r = self.client.list_members(img['id'])
228 420598d0 Stavros Sachtouris
            self.assertEqual(r[0]['member_id'], members[0])
229 420598d0 Stavros Sachtouris
230 420598d0 Stavros Sachtouris
    def test_list_members(self):
231 420598d0 Stavros Sachtouris
        """Test list_members"""
232 54d7c02a Stavros Sachtouris
        self._test_list_members()
233 54d7c02a Stavros Sachtouris
234 54d7c02a Stavros Sachtouris
    def _test_list_members(self):
235 54d7c02a Stavros Sachtouris
        self._test_set_members()
236 420598d0 Stavros Sachtouris
237 420598d0 Stavros Sachtouris
    def test_remove_members(self):
238 420598d0 Stavros Sachtouris
        """Test remove_members - NO CHECK"""
239 420598d0 Stavros Sachtouris
        self._prepare_img()
240 54d7c02a Stavros Sachtouris
        self._test_remove_members()
241 54d7c02a Stavros Sachtouris
242 54d7c02a Stavros Sachtouris
    def _test_remove_members(self):
243 54d7c02a Stavros Sachtouris
        return
244 420598d0 Stavros Sachtouris
        members = ['%s@fake.net' % self.now, '%s_v2@fake.net' % self.now]
245 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
246 420598d0 Stavros Sachtouris
            self.client.set_members(img['id'], members)
247 420598d0 Stavros Sachtouris
            r = self.client.list_members(img['id'])
248 420598d0 Stavros Sachtouris
            self.assertTrue(len(r) > 1)
249 420598d0 Stavros Sachtouris
            self.client.remove_member(img['id'], members[0])
250 420598d0 Stavros Sachtouris
            r0 = self.client.list_members(img['id'])
251 420598d0 Stavros Sachtouris
            self.assertEqual(len(r), 1 + len(r0))
252 420598d0 Stavros Sachtouris
            self.assertEqual(r0[0]['member_id'], members[1])
253 420598d0 Stavros Sachtouris
254 420598d0 Stavros Sachtouris
    def test_list_shared(self):
255 420598d0 Stavros Sachtouris
        """Test list_shared - NOT CHECKED"""
256 54d7c02a Stavros Sachtouris
        self._test_list_shared()
257 54d7c02a Stavros Sachtouris
258 54d7c02a Stavros Sachtouris
    def _test_list_shared(self):
259 420598d0 Stavros Sachtouris
        #No way to test this, if I dont have member images
260 420598d0 Stavros Sachtouris
        pass