Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / test / image.py @ d86c3c7d

History | View | Annotate | Download (7.9 kB)

1
# Copyright 2012-2013 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from mock import patch
35
import time
36

    
37
from unittest import TestCase
38
from kamaki.clients import ClientError
39

    
40
example_images = [
41
    {
42
        "status": "available",
43
        "name": "Archlinux",
44
        "disk_format": "diskdump",
45
        "container_format": "bare",
46
        "id": "b4713f20-3a41-4eaf-81ae-88698c18b3e8",
47
        "size": 752782848},
48
    {
49
        "status": "available",
50
        "name": "Debian_Wheezy_Base",
51
        "disk_format": "diskdump",
52
        "container_format": "bare",
53
        "id": "1f8454f0-8e3e-4b6c-ab8e-5236b728dffe",
54
        "size": 795107328},
55
    {
56
        "status": "available",
57
        "name": "maelstrom",
58
        "disk_format": "diskdump",
59
        "container_format": "bare",
60
        "id": "0fb03e45-7d5a-4515-bd4e-e6bbf6457f06",
61
        "size": 2583195644},
62
    {
63
        "status": "available",
64
        "name": "Gardenia",
65
        "disk_format": "diskdump",
66
        "container_format": "bare",
67
        "id": "5963020b-ab74-4e11-bc59-90c494bbdedb",
68
        "size": 2589802496}]
69

    
70
class Image(TestCase):
71

    
72
    class FR(object):
73
        json = example_images
74
        headers = {}
75
        content = json
76
        status = None
77
        status_code = 200
78

    
79
    def setUp(self):
80
        self.now = time.mktime(time.gmtime())
81
        self.imgname = 'img_%s' % self.now
82
        self.url = 'http://image.example.com'
83
        self.token = 'an1m@g370k3n=='
84
        from kamaki.clients.image import ImageClient
85
        self.client = ImageClient(self.url, self.token)
86
        self.cyclades_url = 'http://cyclades.example.com'
87
        from kamaki.clients.cyclades import CycladesClient
88
        self.cyclades = CycladesClient(self.cyclades_url, self.token)
89
        from kamaki.clients.connection.kamakicon import KamakiHTTPConnection
90
        self.C = KamakiHTTPConnection
91

    
92
    def tearDown(self):
93
        self.FR.json = example_images
94

    
95
    def assert_dicts_are_deeply_equal(self, d1, d2):
96
        for k, v in d1.items():
97
            self.assertTrue(k in d2)
98
            if isinstance(v, dict):
99
                self.assert_dicts_are_deeply_equal(v, d2[k])
100
            else:
101
                self.assertEqual(unicode(v), unicode(d2[k]))
102

    
103
    def test_list_public(self):
104
        with patch.object(
105
            self.C,
106
            'perform_request',
107
            return_value=self.FR()) as perform_req:
108
            r = self.client.list_public()
109
            self.assertEqual(self.client.http_client.url, self.url)
110
            self.assertEqual(self.client.http_client.path, '/images/')
111
            params = perform_req.call_args[0][3]
112
            self.assertEqual(params['sort_dir'], 'asc')
113
            for i in range(len(r)):
114
                self.assert_dicts_are_deeply_equal(r[i], example_images[i])
115

    
116
            r = self.client.list_public(order='-')
117
            params = perform_req.call_args[0][3]
118
            self.assertEqual(params['sort_dir'], 'desc')
119
            self.assertEqual(self.client.http_client.url, self.url)
120
            self.assertEqual(self.client.http_client.path, '/images/')
121

    
122
            r = self.client.list_public(detail=True)
123
            self.assertEqual(self.client.http_client.url, self.url)
124
            self.assertEqual(self.client.http_client.path, '/images/detail')
125

    
126
            size_max = 1000000000
127
            r = self.client.list_public(filters=dict(size_max=size_max))
128
            params = perform_req.call_args[0][3]
129
            self.assertEqual(params['size_max'], size_max)
130
            self.assertEqual(self.client.http_client.url, self.url)
131
            self.assertEqual(self.client.http_client.path, '/images/')
132

    
133
    """
134
    def test_get_meta(self):
135
        ""Test get_meta""
136
        self._test_get_meta()
137

138
    def _test_get_meta(self):
139
        r = self.client.get_meta(self['image', 'id'])
140
        self.assertEqual(r['id'], self['image', 'id'])
141
        for term in (
142
                'status',
143
                'name',
144
                'checksum',
145
                'updated-at',
146
                'created-at',
147
                'deleted-at',
148
                'location',
149
                'is-public',
150
                'owner',
151
                'disk-format',
152
                'size',
153
                'container-format'):
154
            self.assertTrue(term in r)
155
            for interm in (
156
                    'kernel',
157
                    'osfamily',
158
                    'users',
159
                    'gui', 'sortorder',
160
                    'root-partition',
161
                    'os',
162
                    'description'):
163
                self.assertTrue(interm in r['properties'])
164

165
    def test_register(self):
166
        ""Test register""
167
        self._prepare_img()
168
        self._test_register()
169

170
    def _test_register(self):
171
        self.assertTrue(self._imglist)
172
        for img in self._imglist.values():
173
            self.assertTrue(img is not None)
174

175
    def test_reregister(self):
176
        ""Test reregister""
177
        self._prepare_img()
178
        self._test_reregister()
179

180
    def _test_reregister(self):
181
        self.client.reregister(
182
            self.location,
183
            properties=dict(my_property='some_value'))
184

185
    def test_set_members(self):
186
        ""Test set_members""
187
        self._prepare_img()
188
        self._test_set_members()
189

190
    def _test_set_members(self):
191
        members = ['%s@fake.net' % self.now]
192
        for img in self._imglist.values():
193
            self.client.set_members(img['id'], members)
194
            r = self.client.list_members(img['id'])
195
            self.assertEqual(r[0]['member_id'], members[0])
196

197
    def test_list_members(self):
198
        ""Test list_members""
199
        self._test_list_members()
200

201
    def _test_list_members(self):
202
        self._test_set_members()
203

204
    def test_remove_members(self):
205
        ""Test remove_members - NO CHECK""
206
        self._prepare_img()
207
        self._test_remove_members()
208

209
    def _test_remove_members(self):
210
        return
211
        members = ['%s@fake.net' % self.now, '%s_v2@fake.net' % self.now]
212
        for img in self._imglist.values():
213
            self.client.set_members(img['id'], members)
214
            r = self.client.list_members(img['id'])
215
            self.assertTrue(len(r) > 1)
216
            self.client.remove_member(img['id'], members[0])
217
            r0 = self.client.list_members(img['id'])
218
            self.assertEqual(len(r), 1 + len(r0))
219
            self.assertEqual(r0[0]['member_id'], members[1])
220

221
    def test_list_shared(self):
222
        ""Test list_shared - NOT CHECKED""
223
        self._test_list_shared()
224

225
    def _test_list_shared(self):
226
        #No way to test this, if I dont have member images
227
        pass
228
    """