Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / livetest / image.py @ 7b6e977c

History | View | Annotate | Download (9 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 a2ba4204 Stavros Sachtouris
        (token, uuid) = (self['token'], self['store', 'account'])
67 a2ba4204 Stavros Sachtouris
        if not uuid:
68 a2ba4204 Stavros Sachtouris
            from kamaki.clients.astakos import AstakosClient
69 a2ba4204 Stavros Sachtouris
            uuid = AstakosClient(self['astakos', 'url'], token).term('uuid')
70 420598d0 Stavros Sachtouris
        from kamaki.clients.pithos import PithosClient
71 a2ba4204 Stavros Sachtouris
        self.pithcli = PithosClient(self['store', '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 7b6e977c Stavros Sachtouris
            name=r['x-image-meta-name'], id=r['x-image-meta-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 54d7c02a Stavros Sachtouris
                if img['properties']:
158 54d7c02a Stavros Sachtouris
                    for interm in (
159 24ff0a35 Stavros Sachtouris
                            'osfamily',
160 24ff0a35 Stavros Sachtouris
                            'users',
161 24ff0a35 Stavros Sachtouris
                            'os',
162 24ff0a35 Stavros Sachtouris
                            'root_partition',
163 24ff0a35 Stavros Sachtouris
                            'description'):
164 54d7c02a Stavros Sachtouris
                        self.assertTrue(interm in img['properties'])
165 420598d0 Stavros Sachtouris
        size_max = 1000000000
166 420598d0 Stavros Sachtouris
        r2 = self.client.list_public(filters=dict(size_max=size_max))
167 420598d0 Stavros Sachtouris
        self.assertTrue(len(r2) <= len(r))
168 420598d0 Stavros Sachtouris
        for img in r2:
169 420598d0 Stavros Sachtouris
            self.assertTrue(int(img['size']) <= size_max)
170 420598d0 Stavros Sachtouris
171 420598d0 Stavros Sachtouris
    def test_get_meta(self):
172 420598d0 Stavros Sachtouris
        """Test get_meta"""
173 54d7c02a Stavros Sachtouris
        self._test_get_meta()
174 54d7c02a Stavros Sachtouris
175 54d7c02a Stavros Sachtouris
    def _test_get_meta(self):
176 420598d0 Stavros Sachtouris
        r = self.client.get_meta(self['image', 'id'])
177 420598d0 Stavros Sachtouris
        self.assertEqual(r['id'], self['image', 'id'])
178 24ff0a35 Stavros Sachtouris
        for term in (
179 24ff0a35 Stavros Sachtouris
                'status',
180 24ff0a35 Stavros Sachtouris
                'name',
181 24ff0a35 Stavros Sachtouris
                'checksum',
182 24ff0a35 Stavros Sachtouris
                'updated-at',
183 24ff0a35 Stavros Sachtouris
                'created-at',
184 24ff0a35 Stavros Sachtouris
                'deleted-at',
185 24ff0a35 Stavros Sachtouris
                'location',
186 24ff0a35 Stavros Sachtouris
                'is-public',
187 24ff0a35 Stavros Sachtouris
                'owner',
188 24ff0a35 Stavros Sachtouris
                'disk-format',
189 24ff0a35 Stavros Sachtouris
                'size',
190 24ff0a35 Stavros Sachtouris
                'container-format'):
191 420598d0 Stavros Sachtouris
            self.assertTrue(term in r)
192 24ff0a35 Stavros Sachtouris
            for interm in (
193 24ff0a35 Stavros Sachtouris
                    'kernel',
194 24ff0a35 Stavros Sachtouris
                    'osfamily',
195 24ff0a35 Stavros Sachtouris
                    'users',
196 24ff0a35 Stavros Sachtouris
                    'gui', 'sortorder',
197 24ff0a35 Stavros Sachtouris
                    'root-partition',
198 24ff0a35 Stavros Sachtouris
                    'os',
199 24ff0a35 Stavros Sachtouris
                    'description'):
200 420598d0 Stavros Sachtouris
                self.assertTrue(interm in r['properties'])
201 420598d0 Stavros Sachtouris
202 420598d0 Stavros Sachtouris
    def test_register(self):
203 420598d0 Stavros Sachtouris
        """Test register"""
204 420598d0 Stavros Sachtouris
        self._prepare_img()
205 54d7c02a Stavros Sachtouris
        self._test_register()
206 54d7c02a Stavros Sachtouris
207 54d7c02a Stavros Sachtouris
    def _test_register(self):
208 54d7c02a Stavros Sachtouris
        self.assertTrue(self._imglist)
209 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
210 24ff0a35 Stavros Sachtouris
            self.assertTrue(img is not None)
211 7b6e977c Stavros Sachtouris
            r = set(self._imgdetails[img['name']].keys())
212 7b6e977c Stavros Sachtouris
            self.assertTrue(
213 7b6e977c Stavros Sachtouris
                r.issubset(['x-image-meta-%s' % k for k in IMGMETA]))
214 420598d0 Stavros Sachtouris
215 420598d0 Stavros Sachtouris
    def test_set_members(self):
216 420598d0 Stavros Sachtouris
        """Test set_members"""
217 420598d0 Stavros Sachtouris
        self._prepare_img()
218 54d7c02a Stavros Sachtouris
        self._test_set_members()
219 54d7c02a Stavros Sachtouris
220 54d7c02a Stavros Sachtouris
    def _test_set_members(self):
221 420598d0 Stavros Sachtouris
        members = ['%s@fake.net' % self.now]
222 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
223 420598d0 Stavros Sachtouris
            self.client.set_members(img['id'], members)
224 420598d0 Stavros Sachtouris
            r = self.client.list_members(img['id'])
225 420598d0 Stavros Sachtouris
            self.assertEqual(r[0]['member_id'], members[0])
226 420598d0 Stavros Sachtouris
227 420598d0 Stavros Sachtouris
    def test_list_members(self):
228 420598d0 Stavros Sachtouris
        """Test list_members"""
229 54d7c02a Stavros Sachtouris
        self._test_list_members()
230 54d7c02a Stavros Sachtouris
231 54d7c02a Stavros Sachtouris
    def _test_list_members(self):
232 54d7c02a Stavros Sachtouris
        self._test_set_members()
233 420598d0 Stavros Sachtouris
234 420598d0 Stavros Sachtouris
    def test_remove_members(self):
235 420598d0 Stavros Sachtouris
        """Test remove_members - NO CHECK"""
236 420598d0 Stavros Sachtouris
        self._prepare_img()
237 54d7c02a Stavros Sachtouris
        self._test_remove_members()
238 54d7c02a Stavros Sachtouris
239 54d7c02a Stavros Sachtouris
    def _test_remove_members(self):
240 54d7c02a Stavros Sachtouris
        return
241 420598d0 Stavros Sachtouris
        members = ['%s@fake.net' % self.now, '%s_v2@fake.net' % self.now]
242 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
243 420598d0 Stavros Sachtouris
            self.client.set_members(img['id'], members)
244 420598d0 Stavros Sachtouris
            r = self.client.list_members(img['id'])
245 420598d0 Stavros Sachtouris
            self.assertTrue(len(r) > 1)
246 420598d0 Stavros Sachtouris
            self.client.remove_member(img['id'], members[0])
247 420598d0 Stavros Sachtouris
            r0 = self.client.list_members(img['id'])
248 420598d0 Stavros Sachtouris
            self.assertEqual(len(r), 1 + len(r0))
249 420598d0 Stavros Sachtouris
            self.assertEqual(r0[0]['member_id'], members[1])
250 420598d0 Stavros Sachtouris
251 420598d0 Stavros Sachtouris
    def test_list_shared(self):
252 420598d0 Stavros Sachtouris
        """Test list_shared - NOT CHECKED"""
253 54d7c02a Stavros Sachtouris
        self._test_list_shared()
254 54d7c02a Stavros Sachtouris
255 54d7c02a Stavros Sachtouris
    def _test_list_shared(self):
256 420598d0 Stavros Sachtouris
        #No way to test this, if I dont have member images
257 420598d0 Stavros Sachtouris
        pass