Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / livetest / image.py @ 17b255c7

History | View | Annotate | Download (9.3 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 420598d0 Stavros Sachtouris
from kamaki.clients.cyclades import CycladesClient
38 420598d0 Stavros Sachtouris
from kamaki.clients.image import ImageClient
39 420598d0 Stavros Sachtouris
from kamaki.clients import ClientError
40 420598d0 Stavros Sachtouris
41 420598d0 Stavros Sachtouris
42 7b6e977c Stavros Sachtouris
IMGMETA = set([
43 7b6e977c Stavros Sachtouris
    'id', 'name', 'checksum', 'container-format', 'location', 'disk-format',
44 7b6e977c Stavros Sachtouris
    'is-public', 'status', 'deleted-at', 'updated-at', 'created-at', 'owner',
45 7b6e977c Stavros Sachtouris
    'size'])
46 7b6e977c Stavros Sachtouris
47 7b6e977c Stavros Sachtouris
48 f5f2dc53 Stavros Sachtouris
class Image(livetest.Generic):
49 420598d0 Stavros Sachtouris
    def setUp(self):
50 420598d0 Stavros Sachtouris
        self.now = time.mktime(time.gmtime())
51 420598d0 Stavros Sachtouris
52 420598d0 Stavros Sachtouris
        self.imgname = 'img_%s' % self.now
53 420598d0 Stavros Sachtouris
        url = self['image', 'url']
54 420598d0 Stavros Sachtouris
        self.client = ImageClient(url, self['token'])
55 420598d0 Stavros Sachtouris
        cyclades_url = self['compute', 'url']
56 420598d0 Stavros Sachtouris
        self.cyclades = CycladesClient(cyclades_url, self['token'])
57 420598d0 Stavros Sachtouris
        self._imglist = {}
58 7b6e977c Stavros Sachtouris
        self._imgdetails = {}
59 420598d0 Stavros Sachtouris
60 54d7c02a Stavros Sachtouris
    def test_000(self):
61 54d7c02a Stavros Sachtouris
        self._prepare_img()
62 54d7c02a Stavros Sachtouris
        super(self.__class__, self).test_000()
63 54d7c02a Stavros Sachtouris
64 420598d0 Stavros Sachtouris
    def _prepare_img(self):
65 420598d0 Stavros Sachtouris
        f = open(self['image', 'local_path'], 'rb')
66 3ae60112 Stavros Sachtouris
        (token, uuid) = (self['token'], self['file', 'account'])
67 a2ba4204 Stavros Sachtouris
        if not uuid:
68 a2ba4204 Stavros Sachtouris
            from kamaki.clients.astakos import AstakosClient
69 1792ed1d Stavros Sachtouris
            uuid = AstakosClient(self['user', 'url'], token).term('uuid')
70 420598d0 Stavros Sachtouris
        from kamaki.clients.pithos import PithosClient
71 3ae60112 Stavros Sachtouris
        self.pithcli = PithosClient(self['file', 'url'], token, uuid)
72 420598d0 Stavros Sachtouris
        cont = 'cont_%s' % self.now
73 420598d0 Stavros Sachtouris
        self.pithcli.container = cont
74 420598d0 Stavros Sachtouris
        self.obj = 'obj_%s' % self.now
75 420598d0 Stavros Sachtouris
        print('\t- Create container %s on Pithos server' % cont)
76 420598d0 Stavros Sachtouris
        self.pithcli.container_put()
77 420598d0 Stavros Sachtouris
        self.location = 'pithos://%s/%s/%s' % (uuid, cont, self.obj)
78 e7e7dbbd Stavros Sachtouris
        print('\t- Upload an image at %s...\n' % self.location)
79 420598d0 Stavros Sachtouris
        self.pithcli.upload_object(self.obj, f)
80 420598d0 Stavros Sachtouris
        print('\t- ok')
81 420598d0 Stavros Sachtouris
        f.close()
82 420598d0 Stavros Sachtouris
83 7b6e977c Stavros Sachtouris
        r = self.client.register(
84 24ff0a35 Stavros Sachtouris
            self.imgname,
85 420598d0 Stavros Sachtouris
            self.location,
86 420598d0 Stavros Sachtouris
            params=dict(is_public=True))
87 7b6e977c Stavros Sachtouris
        self._imglist[self.imgname] = dict(
88 17b255c7 Stavros Sachtouris
            name=r['name'], id=r['id'])
89 7b6e977c Stavros Sachtouris
        self._imgdetails[self.imgname] = r
90 420598d0 Stavros Sachtouris
91 420598d0 Stavros Sachtouris
    def tearDown(self):
92 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
93 420598d0 Stavros Sachtouris
            print('\tDeleting image %s' % img['id'])
94 420598d0 Stavros Sachtouris
            self.cyclades.delete_image(img['id'])
95 420598d0 Stavros Sachtouris
        if hasattr(self, 'pithcli'):
96 420598d0 Stavros Sachtouris
            print('\tDeleting container %s' % self.pithcli.container)
97 420598d0 Stavros Sachtouris
            try:
98 420598d0 Stavros Sachtouris
                self.pithcli.del_container(delimiter='/')
99 420598d0 Stavros Sachtouris
                self.pithcli.purge_container()
100 420598d0 Stavros Sachtouris
            except ClientError:
101 420598d0 Stavros Sachtouris
                pass
102 420598d0 Stavros Sachtouris
103 420598d0 Stavros Sachtouris
    def _get_img_by_name(self, name):
104 420598d0 Stavros Sachtouris
        r = self.cyclades.list_images()
105 420598d0 Stavros Sachtouris
        for img in r:
106 420598d0 Stavros Sachtouris
            if img['name'] == name:
107 420598d0 Stavros Sachtouris
                return img
108 420598d0 Stavros Sachtouris
        return None
109 420598d0 Stavros Sachtouris
110 420598d0 Stavros Sachtouris
    def assert_dicts_are_deeply_equal(self, d1, d2):
111 420598d0 Stavros Sachtouris
        for k, v in d1.items():
112 420598d0 Stavros Sachtouris
            self.assertTrue(k in d2)
113 420598d0 Stavros Sachtouris
            if isinstance(v, dict):
114 420598d0 Stavros Sachtouris
                self.assert_dicts_are_deeply_equal(v, d2[k])
115 420598d0 Stavros Sachtouris
            else:
116 420598d0 Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
117 420598d0 Stavros Sachtouris
118 420598d0 Stavros Sachtouris
    def test_list_public(self):
119 420598d0 Stavros Sachtouris
        """Test list_public"""
120 54d7c02a Stavros Sachtouris
        self._test_list_public()
121 54d7c02a Stavros Sachtouris
122 54d7c02a Stavros Sachtouris
    def _test_list_public(self):
123 420598d0 Stavros Sachtouris
        r = self.client.list_public()
124 420598d0 Stavros Sachtouris
        r0 = self.client.list_public(order='-')
125 420598d0 Stavros Sachtouris
        self.assertTrue(len(r) > 0)
126 420598d0 Stavros Sachtouris
        for img in r:
127 24ff0a35 Stavros Sachtouris
            for term in (
128 24ff0a35 Stavros Sachtouris
                    'status',
129 24ff0a35 Stavros Sachtouris
                    'name',
130 24ff0a35 Stavros Sachtouris
                    'container_format',
131 24ff0a35 Stavros Sachtouris
                    'disk_format',
132 24ff0a35 Stavros Sachtouris
                    'id',
133 24ff0a35 Stavros Sachtouris
                    'size'):
134 420598d0 Stavros Sachtouris
                self.assertTrue(term in img)
135 54d7c02a Stavros Sachtouris
        self.assertTrue(r, r0)
136 420598d0 Stavros Sachtouris
        r0.reverse()
137 420598d0 Stavros Sachtouris
        for i, img in enumerate(r):
138 420598d0 Stavros Sachtouris
            self.assert_dicts_are_deeply_equal(img, r0[i])
139 420598d0 Stavros Sachtouris
        r1 = self.client.list_public(detail=True)
140 420598d0 Stavros Sachtouris
        for img in r1:
141 24ff0a35 Stavros Sachtouris
            for term in (
142 24ff0a35 Stavros Sachtouris
                    'status',
143 24ff0a35 Stavros Sachtouris
                    'name',
144 24ff0a35 Stavros Sachtouris
                    'checksum',
145 24ff0a35 Stavros Sachtouris
                    'created_at',
146 24ff0a35 Stavros Sachtouris
                    'disk_format',
147 24ff0a35 Stavros Sachtouris
                    'updated_at',
148 24ff0a35 Stavros Sachtouris
                    'id',
149 24ff0a35 Stavros Sachtouris
                    'location',
150 24ff0a35 Stavros Sachtouris
                    'container_format',
151 24ff0a35 Stavros Sachtouris
                    'owner',
152 24ff0a35 Stavros Sachtouris
                    'is_public',
153 24ff0a35 Stavros Sachtouris
                    'deleted_at',
154 24ff0a35 Stavros Sachtouris
                    'properties',
155 24ff0a35 Stavros Sachtouris
                    'size'):
156 420598d0 Stavros Sachtouris
                self.assertTrue(term in img)
157 17b255c7 Stavros Sachtouris
                if len(img['properties']):
158 1a7f53e9 Stavros Sachtouris
                    for interm in ('osfamily', 'users', 'root_partition'):
159 54d7c02a Stavros Sachtouris
                        self.assertTrue(interm in img['properties'])
160 420598d0 Stavros Sachtouris
        size_max = 1000000000
161 420598d0 Stavros Sachtouris
        r2 = self.client.list_public(filters=dict(size_max=size_max))
162 420598d0 Stavros Sachtouris
        self.assertTrue(len(r2) <= len(r))
163 420598d0 Stavros Sachtouris
        for img in r2:
164 420598d0 Stavros Sachtouris
            self.assertTrue(int(img['size']) <= size_max)
165 420598d0 Stavros Sachtouris
166 420598d0 Stavros Sachtouris
    def test_get_meta(self):
167 420598d0 Stavros Sachtouris
        """Test get_meta"""
168 54d7c02a Stavros Sachtouris
        self._test_get_meta()
169 54d7c02a Stavros Sachtouris
170 54d7c02a Stavros Sachtouris
    def _test_get_meta(self):
171 420598d0 Stavros Sachtouris
        r = self.client.get_meta(self['image', 'id'])
172 420598d0 Stavros Sachtouris
        self.assertEqual(r['id'], self['image', 'id'])
173 24ff0a35 Stavros Sachtouris
        for term in (
174 24ff0a35 Stavros Sachtouris
                'status',
175 24ff0a35 Stavros Sachtouris
                'name',
176 24ff0a35 Stavros Sachtouris
                'checksum',
177 24ff0a35 Stavros Sachtouris
                'updated-at',
178 24ff0a35 Stavros Sachtouris
                'created-at',
179 24ff0a35 Stavros Sachtouris
                'deleted-at',
180 24ff0a35 Stavros Sachtouris
                'location',
181 24ff0a35 Stavros Sachtouris
                'is-public',
182 24ff0a35 Stavros Sachtouris
                'owner',
183 24ff0a35 Stavros Sachtouris
                'disk-format',
184 24ff0a35 Stavros Sachtouris
                'size',
185 24ff0a35 Stavros Sachtouris
                'container-format'):
186 420598d0 Stavros Sachtouris
            self.assertTrue(term in r)
187 24ff0a35 Stavros Sachtouris
            for interm in (
188 17b255c7 Stavros Sachtouris
                    'KERNEL',
189 17b255c7 Stavros Sachtouris
                    'OSFAMILY',
190 17b255c7 Stavros Sachtouris
                    'USERS',
191 17b255c7 Stavros Sachtouris
                    'GUI',
192 17b255c7 Stavros Sachtouris
                    'SORTORDER',
193 17b255c7 Stavros Sachtouris
                    'ROOT_PARTITION',
194 17b255c7 Stavros Sachtouris
                    'OS',
195 17b255c7 Stavros Sachtouris
                    'DESCRIPTION'):
196 420598d0 Stavros Sachtouris
                self.assertTrue(interm in r['properties'])
197 420598d0 Stavros Sachtouris
198 420598d0 Stavros Sachtouris
    def test_register(self):
199 420598d0 Stavros Sachtouris
        """Test register"""
200 420598d0 Stavros Sachtouris
        self._prepare_img()
201 54d7c02a Stavros Sachtouris
        self._test_register()
202 54d7c02a Stavros Sachtouris
203 54d7c02a Stavros Sachtouris
    def _test_register(self):
204 54d7c02a Stavros Sachtouris
        self.assertTrue(self._imglist)
205 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
206 24ff0a35 Stavros Sachtouris
            self.assertTrue(img is not None)
207 7b6e977c Stavros Sachtouris
            r = set(self._imgdetails[img['name']].keys())
208 17b255c7 Stavros Sachtouris
            self.assertTrue(r.issubset(IMGMETA.union(['properties'])))
209 420598d0 Stavros Sachtouris
210 4fbc9d34 Stavros Sachtouris
    def test_unregister(self):
211 4fbc9d34 Stavros Sachtouris
        """Test unregister"""
212 4fbc9d34 Stavros Sachtouris
        self._prepare_img()
213 4fbc9d34 Stavros Sachtouris
        self._test_unregister()
214 4fbc9d34 Stavros Sachtouris
215 4fbc9d34 Stavros Sachtouris
    def _test_unregister(self):
216 4fbc9d34 Stavros Sachtouris
        try:
217 4fbc9d34 Stavros Sachtouris
            for img in self._imglist.values():
218 4fbc9d34 Stavros Sachtouris
                self.client.unregister(img['id'])
219 4fbc9d34 Stavros Sachtouris
                self._prepare_img()
220 4fbc9d34 Stavros Sachtouris
                break
221 4fbc9d34 Stavros Sachtouris
        except ClientError as ce:
222 4fbc9d34 Stavros Sachtouris
            if ce.status in (405,):
223 4fbc9d34 Stavros Sachtouris
                print 'IMAGE UNREGISTER is not supported by server: %s' % ce
224 4fbc9d34 Stavros Sachtouris
            else:
225 4fbc9d34 Stavros Sachtouris
                raise
226 4fbc9d34 Stavros Sachtouris
227 420598d0 Stavros Sachtouris
    def test_set_members(self):
228 420598d0 Stavros Sachtouris
        """Test set_members"""
229 420598d0 Stavros Sachtouris
        self._prepare_img()
230 54d7c02a Stavros Sachtouris
        self._test_set_members()
231 54d7c02a Stavros Sachtouris
232 54d7c02a Stavros Sachtouris
    def _test_set_members(self):
233 420598d0 Stavros Sachtouris
        members = ['%s@fake.net' % self.now]
234 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
235 420598d0 Stavros Sachtouris
            self.client.set_members(img['id'], members)
236 420598d0 Stavros Sachtouris
            r = self.client.list_members(img['id'])
237 420598d0 Stavros Sachtouris
            self.assertEqual(r[0]['member_id'], members[0])
238 420598d0 Stavros Sachtouris
239 420598d0 Stavros Sachtouris
    def test_list_members(self):
240 420598d0 Stavros Sachtouris
        """Test list_members"""
241 54d7c02a Stavros Sachtouris
        self._test_list_members()
242 54d7c02a Stavros Sachtouris
243 54d7c02a Stavros Sachtouris
    def _test_list_members(self):
244 54d7c02a Stavros Sachtouris
        self._test_set_members()
245 420598d0 Stavros Sachtouris
246 420598d0 Stavros Sachtouris
    def test_remove_members(self):
247 420598d0 Stavros Sachtouris
        """Test remove_members - NO CHECK"""
248 420598d0 Stavros Sachtouris
        self._prepare_img()
249 54d7c02a Stavros Sachtouris
        self._test_remove_members()
250 54d7c02a Stavros Sachtouris
251 54d7c02a Stavros Sachtouris
    def _test_remove_members(self):
252 54d7c02a Stavros Sachtouris
        return
253 420598d0 Stavros Sachtouris
        members = ['%s@fake.net' % self.now, '%s_v2@fake.net' % self.now]
254 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
255 420598d0 Stavros Sachtouris
            self.client.set_members(img['id'], members)
256 420598d0 Stavros Sachtouris
            r = self.client.list_members(img['id'])
257 420598d0 Stavros Sachtouris
            self.assertTrue(len(r) > 1)
258 420598d0 Stavros Sachtouris
            self.client.remove_member(img['id'], members[0])
259 420598d0 Stavros Sachtouris
            r0 = self.client.list_members(img['id'])
260 420598d0 Stavros Sachtouris
            self.assertEqual(len(r), 1 + len(r0))
261 420598d0 Stavros Sachtouris
            self.assertEqual(r0[0]['member_id'], members[1])
262 420598d0 Stavros Sachtouris
263 420598d0 Stavros Sachtouris
    def test_list_shared(self):
264 420598d0 Stavros Sachtouris
        """Test list_shared - NOT CHECKED"""
265 54d7c02a Stavros Sachtouris
        self._test_list_shared()
266 54d7c02a Stavros Sachtouris
267 54d7c02a Stavros Sachtouris
    def _test_list_shared(self):
268 420598d0 Stavros Sachtouris
        #No way to test this, if I dont have member images
269 420598d0 Stavros Sachtouris
        pass