Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / livetest / image.py @ 2feb9477

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 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 24ff0a35 Stavros Sachtouris
            self.imgname,
89 420598d0 Stavros Sachtouris
            self.location,
90 420598d0 Stavros Sachtouris
            params=dict(is_public=True))
91 7b6e977c Stavros Sachtouris
        self._imglist[self.imgname] = dict(
92 17b255c7 Stavros Sachtouris
            name=r['name'], id=r['id'])
93 7b6e977c Stavros Sachtouris
        self._imgdetails[self.imgname] = r
94 420598d0 Stavros Sachtouris
95 420598d0 Stavros Sachtouris
    def tearDown(self):
96 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
97 420598d0 Stavros Sachtouris
            print('\tDeleting image %s' % img['id'])
98 420598d0 Stavros Sachtouris
            self.cyclades.delete_image(img['id'])
99 420598d0 Stavros Sachtouris
        if hasattr(self, 'pithcli'):
100 420598d0 Stavros Sachtouris
            print('\tDeleting container %s' % self.pithcli.container)
101 420598d0 Stavros Sachtouris
            try:
102 420598d0 Stavros Sachtouris
                self.pithcli.del_container(delimiter='/')
103 420598d0 Stavros Sachtouris
                self.pithcli.purge_container()
104 420598d0 Stavros Sachtouris
            except ClientError:
105 420598d0 Stavros Sachtouris
                pass
106 420598d0 Stavros Sachtouris
107 420598d0 Stavros Sachtouris
    def _get_img_by_name(self, name):
108 420598d0 Stavros Sachtouris
        r = self.cyclades.list_images()
109 420598d0 Stavros Sachtouris
        for img in r:
110 420598d0 Stavros Sachtouris
            if img['name'] == name:
111 420598d0 Stavros Sachtouris
                return img
112 420598d0 Stavros Sachtouris
        return None
113 420598d0 Stavros Sachtouris
114 420598d0 Stavros Sachtouris
    def test_list_public(self):
115 420598d0 Stavros Sachtouris
        """Test list_public"""
116 54d7c02a Stavros Sachtouris
        self._test_list_public()
117 54d7c02a Stavros Sachtouris
118 54d7c02a Stavros Sachtouris
    def _test_list_public(self):
119 420598d0 Stavros Sachtouris
        r = self.client.list_public()
120 420598d0 Stavros Sachtouris
        r0 = self.client.list_public(order='-')
121 420598d0 Stavros Sachtouris
        self.assertTrue(len(r) > 0)
122 420598d0 Stavros Sachtouris
        for img in r:
123 24ff0a35 Stavros Sachtouris
            for term in (
124 24ff0a35 Stavros Sachtouris
                    'status',
125 24ff0a35 Stavros Sachtouris
                    'name',
126 24ff0a35 Stavros Sachtouris
                    'container_format',
127 24ff0a35 Stavros Sachtouris
                    'disk_format',
128 24ff0a35 Stavros Sachtouris
                    'id',
129 24ff0a35 Stavros Sachtouris
                    'size'):
130 420598d0 Stavros Sachtouris
                self.assertTrue(term in img)
131 54d7c02a Stavros Sachtouris
        self.assertTrue(r, r0)
132 420598d0 Stavros Sachtouris
        r0.reverse()
133 420598d0 Stavros Sachtouris
        for i, img in enumerate(r):
134 9b745324 Stavros Sachtouris
            self.assert_dicts_are_equal(img, r0[i])
135 420598d0 Stavros Sachtouris
        r1 = self.client.list_public(detail=True)
136 420598d0 Stavros Sachtouris
        for img in r1:
137 24ff0a35 Stavros Sachtouris
            for term in (
138 24ff0a35 Stavros Sachtouris
                    'status',
139 24ff0a35 Stavros Sachtouris
                    'name',
140 24ff0a35 Stavros Sachtouris
                    'checksum',
141 24ff0a35 Stavros Sachtouris
                    'created_at',
142 24ff0a35 Stavros Sachtouris
                    'disk_format',
143 24ff0a35 Stavros Sachtouris
                    'updated_at',
144 24ff0a35 Stavros Sachtouris
                    'id',
145 24ff0a35 Stavros Sachtouris
                    'location',
146 24ff0a35 Stavros Sachtouris
                    'container_format',
147 24ff0a35 Stavros Sachtouris
                    'owner',
148 24ff0a35 Stavros Sachtouris
                    'is_public',
149 24ff0a35 Stavros Sachtouris
                    'deleted_at',
150 24ff0a35 Stavros Sachtouris
                    'properties',
151 24ff0a35 Stavros Sachtouris
                    'size'):
152 420598d0 Stavros Sachtouris
                self.assertTrue(term in img)
153 17b255c7 Stavros Sachtouris
                if len(img['properties']):
154 1a7f53e9 Stavros Sachtouris
                    for interm in ('osfamily', 'users', 'root_partition'):
155 54d7c02a Stavros Sachtouris
                        self.assertTrue(interm in img['properties'])
156 420598d0 Stavros Sachtouris
        size_max = 1000000000
157 420598d0 Stavros Sachtouris
        r2 = self.client.list_public(filters=dict(size_max=size_max))
158 420598d0 Stavros Sachtouris
        self.assertTrue(len(r2) <= len(r))
159 420598d0 Stavros Sachtouris
        for img in r2:
160 420598d0 Stavros Sachtouris
            self.assertTrue(int(img['size']) <= size_max)
161 420598d0 Stavros Sachtouris
162 420598d0 Stavros Sachtouris
    def test_get_meta(self):
163 420598d0 Stavros Sachtouris
        """Test get_meta"""
164 54d7c02a Stavros Sachtouris
        self._test_get_meta()
165 54d7c02a Stavros Sachtouris
166 54d7c02a Stavros Sachtouris
    def _test_get_meta(self):
167 420598d0 Stavros Sachtouris
        r = self.client.get_meta(self['image', 'id'])
168 420598d0 Stavros Sachtouris
        self.assertEqual(r['id'], self['image', 'id'])
169 24ff0a35 Stavros Sachtouris
        for term in (
170 24ff0a35 Stavros Sachtouris
                'status',
171 24ff0a35 Stavros Sachtouris
                'name',
172 24ff0a35 Stavros Sachtouris
                'checksum',
173 24ff0a35 Stavros Sachtouris
                'updated-at',
174 24ff0a35 Stavros Sachtouris
                'created-at',
175 24ff0a35 Stavros Sachtouris
                'deleted-at',
176 24ff0a35 Stavros Sachtouris
                'location',
177 24ff0a35 Stavros Sachtouris
                'is-public',
178 24ff0a35 Stavros Sachtouris
                'owner',
179 24ff0a35 Stavros Sachtouris
                'disk-format',
180 24ff0a35 Stavros Sachtouris
                'size',
181 24ff0a35 Stavros Sachtouris
                'container-format'):
182 420598d0 Stavros Sachtouris
            self.assertTrue(term in r)
183 24ff0a35 Stavros Sachtouris
            for interm in (
184 17b255c7 Stavros Sachtouris
                    'KERNEL',
185 17b255c7 Stavros Sachtouris
                    'OSFAMILY',
186 17b255c7 Stavros Sachtouris
                    'USERS',
187 17b255c7 Stavros Sachtouris
                    'GUI',
188 17b255c7 Stavros Sachtouris
                    'SORTORDER',
189 17b255c7 Stavros Sachtouris
                    'ROOT_PARTITION',
190 17b255c7 Stavros Sachtouris
                    'OS',
191 17b255c7 Stavros Sachtouris
                    'DESCRIPTION'):
192 420598d0 Stavros Sachtouris
                self.assertTrue(interm in r['properties'])
193 420598d0 Stavros Sachtouris
194 420598d0 Stavros Sachtouris
    def test_register(self):
195 420598d0 Stavros Sachtouris
        """Test register"""
196 420598d0 Stavros Sachtouris
        self._prepare_img()
197 54d7c02a Stavros Sachtouris
        self._test_register()
198 54d7c02a Stavros Sachtouris
199 54d7c02a Stavros Sachtouris
    def _test_register(self):
200 54d7c02a Stavros Sachtouris
        self.assertTrue(self._imglist)
201 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
202 24ff0a35 Stavros Sachtouris
            self.assertTrue(img is not None)
203 7b6e977c Stavros Sachtouris
            r = set(self._imgdetails[img['name']].keys())
204 17b255c7 Stavros Sachtouris
            self.assertTrue(r.issubset(IMGMETA.union(['properties'])))
205 420598d0 Stavros Sachtouris
206 4fbc9d34 Stavros Sachtouris
    def test_unregister(self):
207 4fbc9d34 Stavros Sachtouris
        """Test unregister"""
208 4fbc9d34 Stavros Sachtouris
        self._prepare_img()
209 4fbc9d34 Stavros Sachtouris
        self._test_unregister()
210 4fbc9d34 Stavros Sachtouris
211 4fbc9d34 Stavros Sachtouris
    def _test_unregister(self):
212 4fbc9d34 Stavros Sachtouris
        try:
213 4fbc9d34 Stavros Sachtouris
            for img in self._imglist.values():
214 4fbc9d34 Stavros Sachtouris
                self.client.unregister(img['id'])
215 4fbc9d34 Stavros Sachtouris
                self._prepare_img()
216 4fbc9d34 Stavros Sachtouris
                break
217 4fbc9d34 Stavros Sachtouris
        except ClientError as ce:
218 4fbc9d34 Stavros Sachtouris
            if ce.status in (405,):
219 4fbc9d34 Stavros Sachtouris
                print 'IMAGE UNREGISTER is not supported by server: %s' % ce
220 4fbc9d34 Stavros Sachtouris
            else:
221 4fbc9d34 Stavros Sachtouris
                raise
222 4fbc9d34 Stavros Sachtouris
223 420598d0 Stavros Sachtouris
    def test_set_members(self):
224 420598d0 Stavros Sachtouris
        """Test set_members"""
225 420598d0 Stavros Sachtouris
        self._prepare_img()
226 54d7c02a Stavros Sachtouris
        self._test_set_members()
227 54d7c02a Stavros Sachtouris
228 54d7c02a Stavros Sachtouris
    def _test_set_members(self):
229 420598d0 Stavros Sachtouris
        members = ['%s@fake.net' % self.now]
230 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
231 420598d0 Stavros Sachtouris
            self.client.set_members(img['id'], members)
232 420598d0 Stavros Sachtouris
            r = self.client.list_members(img['id'])
233 420598d0 Stavros Sachtouris
            self.assertEqual(r[0]['member_id'], members[0])
234 420598d0 Stavros Sachtouris
235 420598d0 Stavros Sachtouris
    def test_list_members(self):
236 420598d0 Stavros Sachtouris
        """Test list_members"""
237 54d7c02a Stavros Sachtouris
        self._test_list_members()
238 54d7c02a Stavros Sachtouris
239 54d7c02a Stavros Sachtouris
    def _test_list_members(self):
240 54d7c02a Stavros Sachtouris
        self._test_set_members()
241 420598d0 Stavros Sachtouris
242 420598d0 Stavros Sachtouris
    def test_remove_members(self):
243 420598d0 Stavros Sachtouris
        """Test remove_members - NO CHECK"""
244 420598d0 Stavros Sachtouris
        self._prepare_img()
245 54d7c02a Stavros Sachtouris
        self._test_remove_members()
246 54d7c02a Stavros Sachtouris
247 54d7c02a Stavros Sachtouris
    def _test_remove_members(self):
248 54d7c02a Stavros Sachtouris
        return
249 420598d0 Stavros Sachtouris
        members = ['%s@fake.net' % self.now, '%s_v2@fake.net' % self.now]
250 420598d0 Stavros Sachtouris
        for img in self._imglist.values():
251 420598d0 Stavros Sachtouris
            self.client.set_members(img['id'], members)
252 420598d0 Stavros Sachtouris
            r = self.client.list_members(img['id'])
253 420598d0 Stavros Sachtouris
            self.assertTrue(len(r) > 1)
254 420598d0 Stavros Sachtouris
            self.client.remove_member(img['id'], members[0])
255 420598d0 Stavros Sachtouris
            r0 = self.client.list_members(img['id'])
256 420598d0 Stavros Sachtouris
            self.assertEqual(len(r), 1 + len(r0))
257 420598d0 Stavros Sachtouris
            self.assertEqual(r0[0]['member_id'], members[1])
258 420598d0 Stavros Sachtouris
259 420598d0 Stavros Sachtouris
    def test_list_shared(self):
260 420598d0 Stavros Sachtouris
        """Test list_shared - NOT CHECKED"""
261 54d7c02a Stavros Sachtouris
        self._test_list_shared()
262 54d7c02a Stavros Sachtouris
263 54d7c02a Stavros Sachtouris
    def _test_list_shared(self):
264 420598d0 Stavros Sachtouris
        #No way to test this, if I dont have member images
265 420598d0 Stavros Sachtouris
        pass