Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / test / image.py @ 274bcf7a

History | View | Annotate | Download (8.8 kB)

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