Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / _tests.py @ d1f78278

History | View | Annotate | Download (82.7 kB)

1 15618e89 Stavros Sachtouris
# Copyright 2011 GRNET S.A. All rights reserved.
2 15618e89 Stavros Sachtouris
#
3 15618e89 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 15618e89 Stavros Sachtouris
# without modification, are permitted provided that the following
5 15618e89 Stavros Sachtouris
# conditions are met:
6 15618e89 Stavros Sachtouris
#
7 15618e89 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 3dabe5d2 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 3dabe5d2 Stavros Sachtouris
#      disclaimer.
10 15618e89 Stavros Sachtouris
#
11 15618e89 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 3dabe5d2 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 3dabe5d2 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 3dabe5d2 Stavros Sachtouris
#      provided with the distribution.
15 15618e89 Stavros Sachtouris
#
16 15618e89 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 15618e89 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 15618e89 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 15618e89 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 15618e89 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 15618e89 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 15618e89 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 15618e89 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 15618e89 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 15618e89 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 15618e89 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 15618e89 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 15618e89 Stavros Sachtouris
#
29 15618e89 Stavros Sachtouris
# The views and conclusions contained in the software and
30 15618e89 Stavros Sachtouris
# documentation are those of the authors and should not be
31 15618e89 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 15618e89 Stavros Sachtouris
# or implied, of GRNET S.A.
33 15618e89 Stavros Sachtouris
34 1bb4d14d Stavros Sachtouris
from argparse import ArgumentParser
35 15618e89 Stavros Sachtouris
import unittest
36 3dabe5d2 Stavros Sachtouris
import time
37 3dabe5d2 Stavros Sachtouris
import datetime
38 3dabe5d2 Stavros Sachtouris
import os
39 3dabe5d2 Stavros Sachtouris
import sys
40 ffada4ea Dionysis Zindros
import tempfile
41 aa5c0458 Stavros Sachtouris
from logging import getLogger
42 aa5c0458 Stavros Sachtouris
43 aa5c0458 Stavros Sachtouris
kloger = getLogger('kamaki')
44 15618e89 Stavros Sachtouris
45 c2f6a275 Stavros Sachtouris
try:
46 c2f6a275 Stavros Sachtouris
    from progress.bar import FillingCirclesBar as IncrementalBar
47 c2f6a275 Stavros Sachtouris
except ImportError:
48 aa5c0458 Stavros Sachtouris
    kloger.warning('No progress bars in testing!')
49 c2f6a275 Stavros Sachtouris
    pass
50 ca30409e Stavros Sachtouris
51 435008b6 Stavros Sachtouris
from kamaki.clients import ClientError
52 435008b6 Stavros Sachtouris
from kamaki.clients.pithos import PithosClient as pithos
53 1bb4d14d Stavros Sachtouris
from kamaki.clients.cyclades import CycladesClient as cyclades
54 b9d07587 Stavros Sachtouris
from kamaki.clients.image import ImageClient as image
55 b9d07587 Stavros Sachtouris
from kamaki.clients.astakos import AstakosClient as astakos
56 7d91734c Stavros Sachtouris
from kamaki.cli.config import Config
57 1bb4d14d Stavros Sachtouris
58 1a85b14f Stavros Sachtouris
TEST_ALL = False
59 1a85b14f Stavros Sachtouris
60 c2f6a275 Stavros Sachtouris
cnf = Config()
61 277ca4ed Dionysis Zindros
global_username = None
62 277ca4ed Dionysis Zindros
token = None
63 277ca4ed Dionysis Zindros
64 277ca4ed Dionysis Zindros
65 277ca4ed Dionysis Zindros
def _init_cnf():
66 277ca4ed Dionysis Zindros
    global cnf
67 277ca4ed Dionysis Zindros
    global global_username
68 277ca4ed Dionysis Zindros
    global_username = cnf.get('test', 'account') or\
69 277ca4ed Dionysis Zindros
        cnf.get('global', 'account')
70 277ca4ed Dionysis Zindros
    global token
71 277ca4ed Dionysis Zindros
    token = cnf.get('test', 'token') or cnf.get('global', 'token')
72 3dabe5d2 Stavros Sachtouris
73 1037b811 Stavros Sachtouris
74 b9d07587 Stavros Sachtouris
class testAstakos(unittest.TestCase):
75 3dabe5d2 Stavros Sachtouris
    def setUp(self):
76 277ca4ed Dionysis Zindros
        _init_cnf()
77 7d91734c Stavros Sachtouris
        global cnf
78 277ca4ed Dionysis Zindros
        url = cnf.get('test', 'astakos_url') or cnf.get('astakos', 'url')
79 3dabe5d2 Stavros Sachtouris
        global token
80 3dabe5d2 Stavros Sachtouris
        self.client = astakos(url, token)
81 3dabe5d2 Stavros Sachtouris
82 3dabe5d2 Stavros Sachtouris
    def tearDown(self):
83 3dabe5d2 Stavros Sachtouris
        pass
84 3dabe5d2 Stavros Sachtouris
85 3dabe5d2 Stavros Sachtouris
    def test_authenticate(self):
86 3dabe5d2 Stavros Sachtouris
        r = self.client.authenticate()
87 3dabe5d2 Stavros Sachtouris
        for term in ('username',
88 3dabe5d2 Stavros Sachtouris
            'auth_token_expires',
89 3dabe5d2 Stavros Sachtouris
            'auth_token',
90 3dabe5d2 Stavros Sachtouris
            'auth_token_created',
91 3dabe5d2 Stavros Sachtouris
            'groups',
92 3dabe5d2 Stavros Sachtouris
            'uniq',
93 3dabe5d2 Stavros Sachtouris
            'has_credits',
94 3dabe5d2 Stavros Sachtouris
            'has_signed_terms'):
95 3dabe5d2 Stavros Sachtouris
            self.assertTrue(term in r)
96 3dabe5d2 Stavros Sachtouris
97 b9d07587 Stavros Sachtouris
98 b9d07587 Stavros Sachtouris
class testImage(unittest.TestCase):
99 3dabe5d2 Stavros Sachtouris
    def setUp(self):
100 277ca4ed Dionysis Zindros
        _init_cnf()
101 7d91734c Stavros Sachtouris
        global cnf
102 7d91734c Stavros Sachtouris
        cyclades_url = cnf.get('compute', 'url')
103 7d91734c Stavros Sachtouris
        url = cnf.get('image', 'url')
104 3dabe5d2 Stavros Sachtouris
        global token
105 3dabe5d2 Stavros Sachtouris
        self.token = token
106 3dabe5d2 Stavros Sachtouris
        self.imgid = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
107 3dabe5d2 Stavros Sachtouris
        self.now = time.mktime(time.gmtime())
108 3dabe5d2 Stavros Sachtouris
        self.imgname = 'img_%s' % self.now
109 3dabe5d2 Stavros Sachtouris
        global global_username
110 7d91734c Stavros Sachtouris
        self.imglocation = 'pithos://%s/pithos/my.img'\
111 3dabe5d2 Stavros Sachtouris
        % global_username
112 3dabe5d2 Stavros Sachtouris
        self.client = image(url, self.token)
113 3dabe5d2 Stavros Sachtouris
        self.cyclades = cyclades(cyclades_url, self.token)
114 3dabe5d2 Stavros Sachtouris
        self._imglist = {}
115 3dabe5d2 Stavros Sachtouris
116 3dabe5d2 Stavros Sachtouris
    def _prepare_img(self):
117 7d91734c Stavros Sachtouris
        global cnf
118 3dabe5d2 Stavros Sachtouris
        global global_username
119 7d91734c Stavros Sachtouris
        username = global_username.split('@')[0]
120 7d91734c Stavros Sachtouris
        imglocalpath =\
121 7d91734c Stavros Sachtouris
        '/home/%s/src/kamaki-settings/files/centos.diskdump' % username
122 3dabe5d2 Stavros Sachtouris
        f = open(imglocalpath, 'rb')
123 7d91734c Stavros Sachtouris
        pithcli = pithos(cnf.get('store', 'url'),
124 3dabe5d2 Stavros Sachtouris
            self.token,
125 7d91734c Stavros Sachtouris
            global_username,
126 3dabe5d2 Stavros Sachtouris
            'pithos')
127 7d91734c Stavros Sachtouris
        print('\t- Upload an image at %s...' % imglocalpath)
128 3dabe5d2 Stavros Sachtouris
        pithcli.upload_object('my.img', f)
129 7d91734c Stavros Sachtouris
        print('\t- ok')
130 3dabe5d2 Stavros Sachtouris
        f.close()
131 3dabe5d2 Stavros Sachtouris
132 3dabe5d2 Stavros Sachtouris
        self.client.register(self.imgname,
133 3dabe5d2 Stavros Sachtouris
            self.imglocation,
134 3dabe5d2 Stavros Sachtouris
            params=dict(is_public=True))
135 3dabe5d2 Stavros Sachtouris
        img = self._get_img_by_name(self.imgname)
136 3dabe5d2 Stavros Sachtouris
        self._imglist[self.imgname] = img
137 3dabe5d2 Stavros Sachtouris
138 3dabe5d2 Stavros Sachtouris
    def tearDown(self):
139 3dabe5d2 Stavros Sachtouris
        for img in self._imglist.values():
140 3dabe5d2 Stavros Sachtouris
            self.cyclades.delete_image(img['id'])
141 3dabe5d2 Stavros Sachtouris
142 3dabe5d2 Stavros Sachtouris
    def _get_img_by_name(self, name):
143 3dabe5d2 Stavros Sachtouris
        r = self.cyclades.list_images()
144 3dabe5d2 Stavros Sachtouris
        for img in r:
145 3dabe5d2 Stavros Sachtouris
            if img['name'] == name:
146 3dabe5d2 Stavros Sachtouris
                return img
147 3dabe5d2 Stavros Sachtouris
        return None
148 3dabe5d2 Stavros Sachtouris
149 3dabe5d2 Stavros Sachtouris
    def assert_dicts_are_deeply_equal(self, d1, d2):
150 3dabe5d2 Stavros Sachtouris
        for k, v in d1.items():
151 3dabe5d2 Stavros Sachtouris
            self.assertTrue(k in d2)
152 3dabe5d2 Stavros Sachtouris
            if isinstance(v, dict):
153 3dabe5d2 Stavros Sachtouris
                self.assert_dicts_are_deeply_equal(v, d2[k])
154 3dabe5d2 Stavros Sachtouris
            else:
155 3dabe5d2 Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
156 3dabe5d2 Stavros Sachtouris
157 3dabe5d2 Stavros Sachtouris
    def test_list_public(self):
158 3dabe5d2 Stavros Sachtouris
        """Test list_public"""
159 3dabe5d2 Stavros Sachtouris
        r = self.client.list_public()
160 3dabe5d2 Stavros Sachtouris
        r0 = self.client.list_public(order='-')
161 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r) > 0)
162 3dabe5d2 Stavros Sachtouris
        for img in r:
163 3dabe5d2 Stavros Sachtouris
            for term in ('status',
164 3dabe5d2 Stavros Sachtouris
                'name',
165 3dabe5d2 Stavros Sachtouris
                'container_format',
166 3dabe5d2 Stavros Sachtouris
                'disk_format',
167 3dabe5d2 Stavros Sachtouris
                'id',
168 3dabe5d2 Stavros Sachtouris
                'size'):
169 3dabe5d2 Stavros Sachtouris
                self.assertTrue(term in img)
170 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r), len(r0))
171 3dabe5d2 Stavros Sachtouris
        r0.reverse()
172 3dabe5d2 Stavros Sachtouris
        for i, img in enumerate(r):
173 3dabe5d2 Stavros Sachtouris
            self.assert_dicts_are_deeply_equal(img, r0[i])
174 3dabe5d2 Stavros Sachtouris
        r1 = self.client.list_public(detail=True)
175 3dabe5d2 Stavros Sachtouris
        for img in r1:
176 3dabe5d2 Stavros Sachtouris
            for term in ('status',
177 3dabe5d2 Stavros Sachtouris
                'name',
178 3dabe5d2 Stavros Sachtouris
                'checksum',
179 3dabe5d2 Stavros Sachtouris
                'created_at',
180 3dabe5d2 Stavros Sachtouris
                'disk_format',
181 3dabe5d2 Stavros Sachtouris
                'updated_at',
182 3dabe5d2 Stavros Sachtouris
                'id',
183 3dabe5d2 Stavros Sachtouris
                'location',
184 3dabe5d2 Stavros Sachtouris
                'container_format',
185 3dabe5d2 Stavros Sachtouris
                'owner',
186 3dabe5d2 Stavros Sachtouris
                'is_public',
187 3dabe5d2 Stavros Sachtouris
                'deleted_at',
188 3dabe5d2 Stavros Sachtouris
                'properties',
189 3dabe5d2 Stavros Sachtouris
                'size'):
190 3dabe5d2 Stavros Sachtouris
                self.assertTrue(term in img)
191 7d91734c Stavros Sachtouris
                for interm in (
192 3dabe5d2 Stavros Sachtouris
                    'osfamily',
193 3dabe5d2 Stavros Sachtouris
                    'users',
194 3dabe5d2 Stavros Sachtouris
                    'os',
195 3dabe5d2 Stavros Sachtouris
                    'root_partition',
196 3dabe5d2 Stavros Sachtouris
                    'description'):
197 3dabe5d2 Stavros Sachtouris
                    self.assertTrue(interm in img['properties'])
198 3dabe5d2 Stavros Sachtouris
        size_max = 1000000000
199 3dabe5d2 Stavros Sachtouris
        r2 = self.client.list_public(filters=dict(size_max=size_max))
200 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r2) <= len(r))
201 3dabe5d2 Stavros Sachtouris
        for img in r2:
202 3dabe5d2 Stavros Sachtouris
            self.assertTrue(int(img['size']) <= size_max)
203 3dabe5d2 Stavros Sachtouris
204 3dabe5d2 Stavros Sachtouris
    def test_get_meta(self):
205 3dabe5d2 Stavros Sachtouris
        """Test get_meta"""
206 3dabe5d2 Stavros Sachtouris
        r = self.client.get_meta(self.imgid)
207 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['id'], self.imgid)
208 3dabe5d2 Stavros Sachtouris
        for term in ('status',
209 3dabe5d2 Stavros Sachtouris
            'name',
210 3dabe5d2 Stavros Sachtouris
            'checksum',
211 3dabe5d2 Stavros Sachtouris
            'updated-at',
212 3dabe5d2 Stavros Sachtouris
            'created-at',
213 3dabe5d2 Stavros Sachtouris
            'deleted-at',
214 3dabe5d2 Stavros Sachtouris
            'location',
215 3dabe5d2 Stavros Sachtouris
            'is-public',
216 3dabe5d2 Stavros Sachtouris
            'owner',
217 3dabe5d2 Stavros Sachtouris
            'disk-format',
218 3dabe5d2 Stavros Sachtouris
            'size',
219 3dabe5d2 Stavros Sachtouris
            'container-format'):
220 3dabe5d2 Stavros Sachtouris
            self.assertTrue(term in r)
221 3dabe5d2 Stavros Sachtouris
            for interm in ('kernel',
222 3dabe5d2 Stavros Sachtouris
                'osfamily',
223 3dabe5d2 Stavros Sachtouris
                'users',
224 3dabe5d2 Stavros Sachtouris
                'gui', 'sortorder',
225 3dabe5d2 Stavros Sachtouris
                'root-partition',
226 3dabe5d2 Stavros Sachtouris
                'os',
227 3dabe5d2 Stavros Sachtouris
                'description'):
228 3dabe5d2 Stavros Sachtouris
                self.assertTrue(interm in r['properties'])
229 3dabe5d2 Stavros Sachtouris
230 3dabe5d2 Stavros Sachtouris
    def test_register(self):
231 3dabe5d2 Stavros Sachtouris
        """Test register"""
232 3dabe5d2 Stavros Sachtouris
        self._prepare_img()
233 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(self._imglist) > 0)
234 3dabe5d2 Stavros Sachtouris
        for img in self._imglist.values():
235 3dabe5d2 Stavros Sachtouris
            self.assertTrue(img != None)
236 3dabe5d2 Stavros Sachtouris
237 c2f6a275 Stavros Sachtouris
    def test_reregister(self):
238 c2f6a275 Stavros Sachtouris
        """Test reregister"""
239 c2f6a275 Stavros Sachtouris
        self._prepare_img()
240 c2f6a275 Stavros Sachtouris
        self.client.reregister(self.imglocation,
241 c2f6a275 Stavros Sachtouris
            properties=dict(my_property='some_value'))
242 c2f6a275 Stavros Sachtouris
243 3dabe5d2 Stavros Sachtouris
    def test_set_members(self):
244 3dabe5d2 Stavros Sachtouris
        """Test set_members"""
245 3dabe5d2 Stavros Sachtouris
        self._prepare_img()
246 3dabe5d2 Stavros Sachtouris
        members = ['%s@fake.net' % self.now]
247 3dabe5d2 Stavros Sachtouris
        for img in self._imglist.values():
248 3dabe5d2 Stavros Sachtouris
            self.client.set_members(img['id'], members)
249 3dabe5d2 Stavros Sachtouris
            r = self.client.list_members(img['id'])
250 3dabe5d2 Stavros Sachtouris
            self.assertEqual(r[0]['member_id'], members[0])
251 3dabe5d2 Stavros Sachtouris
252 3dabe5d2 Stavros Sachtouris
    def test_list_members(self):
253 3dabe5d2 Stavros Sachtouris
        """Test list_members"""
254 3dabe5d2 Stavros Sachtouris
        self.test_set_members()
255 3dabe5d2 Stavros Sachtouris
256 3dabe5d2 Stavros Sachtouris
    def test_remove_members(self):
257 3dabe5d2 Stavros Sachtouris
        """Test remove_members - NO CHECK"""
258 3dabe5d2 Stavros Sachtouris
        return
259 3dabe5d2 Stavros Sachtouris
        self._prepare_img()
260 3dabe5d2 Stavros Sachtouris
        members = ['%s@fake.net' % self.now, '%s_v2@fake.net' % self.now]
261 3dabe5d2 Stavros Sachtouris
        for img in self._imglist.values():
262 3dabe5d2 Stavros Sachtouris
            self.client.set_members(img['id'], members)
263 3dabe5d2 Stavros Sachtouris
            r = self.client.list_members(img['id'])
264 3dabe5d2 Stavros Sachtouris
            self.assertTrue(len(r) > 1)
265 3dabe5d2 Stavros Sachtouris
            self.client.remove_member(img['id'], members[0])
266 3dabe5d2 Stavros Sachtouris
            r0 = self.client.list_members(img['id'])
267 3dabe5d2 Stavros Sachtouris
            self.assertEqual(len(r), 1 + len(r0))
268 3dabe5d2 Stavros Sachtouris
            self.assertEqual(r0[0]['member_id'], members[1])
269 3dabe5d2 Stavros Sachtouris
270 3dabe5d2 Stavros Sachtouris
    def test_list_shared(self):
271 3dabe5d2 Stavros Sachtouris
        """Test list_shared - NOT CHECKED"""
272 3dabe5d2 Stavros Sachtouris
        #No way to test this, if I dont have member images
273 3dabe5d2 Stavros Sachtouris
        pass
274 3dabe5d2 Stavros Sachtouris
275 adb1dde9 Stavros Sachtouris
276 1bb4d14d Stavros Sachtouris
class testCyclades(unittest.TestCase):
277 3dabe5d2 Stavros Sachtouris
    """Set up a Cyclades thorough test"""
278 3dabe5d2 Stavros Sachtouris
    def setUp(self):
279 3dabe5d2 Stavros Sachtouris
        """okeanos"""
280 277ca4ed Dionysis Zindros
        _init_cnf()
281 277ca4ed Dionysis Zindros
        global cnf
282 277ca4ed Dionysis Zindros
        url = cnf.get('compute', 'url')
283 3dabe5d2 Stavros Sachtouris
        global token
284 3dabe5d2 Stavros Sachtouris
        global global_username
285 3dabe5d2 Stavros Sachtouris
        self.img = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
286 3dabe5d2 Stavros Sachtouris
        self.img_details = {
287 3dabe5d2 Stavros Sachtouris
            u'status': u'ACTIVE',
288 ca30409e Stavros Sachtouris
            u'updated': u'2012-11-19T13:52:16+00:00',
289 3dabe5d2 Stavros Sachtouris
            u'name': u'Debian Base',
290 3dabe5d2 Stavros Sachtouris
            u'created': u'2012-10-16T09:03:12+00:00',
291 3dabe5d2 Stavros Sachtouris
            u'progress': 100,
292 277ca4ed Dionysis Zindros
            u'id': self.img,
293 3dabe5d2 Stavros Sachtouris
            u'metadata': {
294 3dabe5d2 Stavros Sachtouris
                u'values': {
295 3dabe5d2 Stavros Sachtouris
                    u'kernel': u'2.6.32',
296 3dabe5d2 Stavros Sachtouris
                    u'osfamily': u'linux',
297 3dabe5d2 Stavros Sachtouris
                    u'users': u'root',
298 3dabe5d2 Stavros Sachtouris
                    u'gui': u'No GUI',
299 3dabe5d2 Stavros Sachtouris
                    u'sortorder': u'1',
300 3dabe5d2 Stavros Sachtouris
                    u'os': u'debian',
301 3dabe5d2 Stavros Sachtouris
                    u'root_partition': u'1',
302 ca30409e Stavros Sachtouris
                    u'description': u'Debian 6.0.6 (Squeeze) Base System'}
303 3dabe5d2 Stavros Sachtouris
                }
304 3dabe5d2 Stavros Sachtouris
            }
305 3dabe5d2 Stavros Sachtouris
        self.flavor_details = {u'name': u'C1R1024D20',
306 3dabe5d2 Stavros Sachtouris
            u'ram': 1024,
307 3dabe5d2 Stavros Sachtouris
            u'id': 1,
308 3dabe5d2 Stavros Sachtouris
            u'SNF:disk_template': u'drbd',
309 3dabe5d2 Stavros Sachtouris
            u'disk': 20,
310 3dabe5d2 Stavros Sachtouris
            u'cpu': 1}
311 3dabe5d2 Stavros Sachtouris
        self.PROFILES = ('ENABLED', 'DISABLED', 'PROTECTED')
312 3dabe5d2 Stavros Sachtouris
313 93542587 Stavros Sachtouris
        """okeanos.io """
314 277ca4ed Dionysis Zindros
        """
315 277ca4ed Dionysis Zindros
        self.img = 'b3e68235-3abd-4d60-adfe-1379a4f8d3fe'
316 277ca4ed Dionysis Zindros
        self.img_details = {
317 277ca4ed Dionysis Zindros
            u'status': u'ACTIVE',
318 277ca4ed Dionysis Zindros
            u'updated': u'2012-11-19T15:29:51+00:00',
319 277ca4ed Dionysis Zindros
            u'name': u'Debian Base',
320 277ca4ed Dionysis Zindros
            u'created': u'2012-11-19T14:54:57+00:00',
321 277ca4ed Dionysis Zindros
            u'progress': 100,
322 277ca4ed Dionysis Zindros
            u'id': self.img,
323 277ca4ed Dionysis Zindros
            u'metadata': {
324 277ca4ed Dionysis Zindros
                u'values': {
325 277ca4ed Dionysis Zindros
                    u'kernel': u'2.6.32',
326 277ca4ed Dionysis Zindros
                    u'osfamily': u'linux',
327 277ca4ed Dionysis Zindros
                    u'users': u'root',
328 277ca4ed Dionysis Zindros
                    u'gui': u'No GUI',
329 277ca4ed Dionysis Zindros
                    u'sortorder': u'1',
330 277ca4ed Dionysis Zindros
                    u'os': u'debian',
331 277ca4ed Dionysis Zindros
                    u'root_partition': u'1',
332 277ca4ed Dionysis Zindros
                    u'description': u'Debian 6.0.6 (Squeeze) Base System'}
333 277ca4ed Dionysis Zindros
                }
334 277ca4ed Dionysis Zindros
            }
335 93542587 Stavros Sachtouris
            """
336 3dabe5d2 Stavros Sachtouris
337 3dabe5d2 Stavros Sachtouris
        self.servers = {}
338 3dabe5d2 Stavros Sachtouris
        self.now = time.mktime(time.gmtime())
339 3dabe5d2 Stavros Sachtouris
        self.servname1 = 'serv' + unicode(self.now)
340 3dabe5d2 Stavros Sachtouris
        self.servname2 = self.servname1 + '_v2'
341 3dabe5d2 Stavros Sachtouris
        self.flavorid = 1
342 3dabe5d2 Stavros Sachtouris
        #servers have to be created at the begining...
343 3dabe5d2 Stavros Sachtouris
        self.networks = {}
344 3dabe5d2 Stavros Sachtouris
        self.netname1 = 'net' + unicode(self.now)
345 3dabe5d2 Stavros Sachtouris
        self.netname2 = 'net' + unicode(self.now) + '_v2'
346 3dabe5d2 Stavros Sachtouris
347 3dabe5d2 Stavros Sachtouris
        self.client = cyclades(url, token)
348 3dabe5d2 Stavros Sachtouris
        pass
349 3dabe5d2 Stavros Sachtouris
350 3dabe5d2 Stavros Sachtouris
    def tearDown(self):
351 3dabe5d2 Stavros Sachtouris
        """Destoy servers used in testing"""
352 3dabe5d2 Stavros Sachtouris
        print
353 3dabe5d2 Stavros Sachtouris
        for netid in self.networks.keys():
354 3dabe5d2 Stavros Sachtouris
            self._delete_network(netid)
355 3dabe5d2 Stavros Sachtouris
        if 0 >= len(self.servers):
356 3dabe5d2 Stavros Sachtouris
            return
357 3dabe5d2 Stavros Sachtouris
        print('-> Found %s servers to delete' % len(self.servers))
358 277ca4ed Dionysis Zindros
        for server in self.servers.values():
359 277ca4ed Dionysis Zindros
            self._delete_server(server['id'])
360 3dabe5d2 Stavros Sachtouris
361 3dabe5d2 Stavros Sachtouris
    def _create_server(self, servername, flavorid, imageid, personality=None):
362 3dabe5d2 Stavros Sachtouris
        server = self.client.create_server(servername,
363 3dabe5d2 Stavros Sachtouris
            flavorid,
364 3dabe5d2 Stavros Sachtouris
            imageid,
365 3dabe5d2 Stavros Sachtouris
            personality)
366 3dabe5d2 Stavros Sachtouris
        self.servers[servername] = server
367 3dabe5d2 Stavros Sachtouris
        return server
368 3dabe5d2 Stavros Sachtouris
369 3dabe5d2 Stavros Sachtouris
    def _delete_server(self, servid):
370 277ca4ed Dionysis Zindros
        try:
371 277ca4ed Dionysis Zindros
            current_state = self.client.get_server_details(servid)
372 277ca4ed Dionysis Zindros
            current_state = current_state['status']
373 277ca4ed Dionysis Zindros
            if current_state == 'DELETED':
374 277ca4ed Dionysis Zindros
                return
375 277ca4ed Dionysis Zindros
        except:
376 277ca4ed Dionysis Zindros
            return
377 3dabe5d2 Stavros Sachtouris
        self.client.delete_server(servid)
378 277ca4ed Dionysis Zindros
        self._wait_for_status(servid, current_state)
379 3dabe5d2 Stavros Sachtouris
380 3dabe5d2 Stavros Sachtouris
    def _create_network(self, netname, **kwargs):
381 3dabe5d2 Stavros Sachtouris
        net = self.client.create_network(netname, **kwargs)
382 3dabe5d2 Stavros Sachtouris
        self.networks[net['id']] = net
383 3dabe5d2 Stavros Sachtouris
        return net
384 3dabe5d2 Stavros Sachtouris
385 3dabe5d2 Stavros Sachtouris
    def _delete_network(self, netid):
386 3dabe5d2 Stavros Sachtouris
        sys.stdout.write('\tDelete network %s ' % netid)
387 3dabe5d2 Stavros Sachtouris
        self.client.disconnect_network_nics(netid)
388 3dabe5d2 Stavros Sachtouris
        wait = 3
389 3dabe5d2 Stavros Sachtouris
        while True:
390 3dabe5d2 Stavros Sachtouris
            try:
391 3dabe5d2 Stavros Sachtouris
                self.client.delete_network(netid)
392 3dabe5d2 Stavros Sachtouris
                print('\n\tSUCCESFULL COMMIT delete network %s' % netid)
393 3dabe5d2 Stavros Sachtouris
                break
394 3dabe5d2 Stavros Sachtouris
            except ClientError as err:
395 3dabe5d2 Stavros Sachtouris
                self.assertEqual(err.status, 421)
396 3dabe5d2 Stavros Sachtouris
                time.sleep(wait)
397 3dabe5d2 Stavros Sachtouris
                wait += 3
398 3dabe5d2 Stavros Sachtouris
                sys.stdout.write('.')
399 3dabe5d2 Stavros Sachtouris
400 3dabe5d2 Stavros Sachtouris
    def if_not_all(foo):
401 3dabe5d2 Stavros Sachtouris
        global TEST_ALL
402 3dabe5d2 Stavros Sachtouris
        if TEST_ALL:
403 3dabe5d2 Stavros Sachtouris
            return None
404 3dabe5d2 Stavros Sachtouris
        return foo
405 3dabe5d2 Stavros Sachtouris
406 3dabe5d2 Stavros Sachtouris
    def assert_dicts_are_deeply_equal(self, d1, d2):
407 3dabe5d2 Stavros Sachtouris
        for k, v in d1.items():
408 3dabe5d2 Stavros Sachtouris
            self.assertTrue(k in d2)
409 3dabe5d2 Stavros Sachtouris
            if isinstance(v, dict):
410 3dabe5d2 Stavros Sachtouris
                self.assert_dicts_are_deeply_equal(v, d2[k])
411 3dabe5d2 Stavros Sachtouris
            else:
412 3dabe5d2 Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
413 3dabe5d2 Stavros Sachtouris
414 3dabe5d2 Stavros Sachtouris
    def test_000(self):
415 3dabe5d2 Stavros Sachtouris
        "Prepare a full Cyclades test scenario"
416 3dabe5d2 Stavros Sachtouris
        global TEST_ALL
417 3dabe5d2 Stavros Sachtouris
        TEST_ALL = True
418 3dabe5d2 Stavros Sachtouris
419 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
420 3dabe5d2 Stavros Sachtouris
            self.flavorid,
421 3dabe5d2 Stavros Sachtouris
            self.img)
422 3dabe5d2 Stavros Sachtouris
        self.server2 = self._create_server(self.servname2,
423 3dabe5d2 Stavros Sachtouris
            self.flavorid + 2,
424 3dabe5d2 Stavros Sachtouris
            self.img)
425 3dabe5d2 Stavros Sachtouris
426 3dabe5d2 Stavros Sachtouris
        print('testing')
427 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test create server')
428 3dabe5d2 Stavros Sachtouris
        self._test_create_server()
429 3dabe5d2 Stavros Sachtouris
        print('...ok')
430 3dabe5d2 Stavros Sachtouris
431 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test list servers')
432 3dabe5d2 Stavros Sachtouris
        self._test_list_servers()
433 3dabe5d2 Stavros Sachtouris
        print('...ok')
434 3dabe5d2 Stavros Sachtouris
435 3dabe5d2 Stavros Sachtouris
        print('- wait for test servers to build')
436 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'BUILD')
437 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server2['id'], 'BUILD')
438 3dabe5d2 Stavros Sachtouris
        print('- ok')
439 3dabe5d2 Stavros Sachtouris
440 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test get server details')
441 3dabe5d2 Stavros Sachtouris
        self._test_get_server_details()
442 3dabe5d2 Stavros Sachtouris
        print('...ok')
443 3dabe5d2 Stavros Sachtouris
444 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test get image details')
445 3dabe5d2 Stavros Sachtouris
        self._test_get_image_details()
446 3dabe5d2 Stavros Sachtouris
        print('...ok')
447 3dabe5d2 Stavros Sachtouris
448 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test update_server_name')
449 3dabe5d2 Stavros Sachtouris
        self._test_update_server_name()
450 3dabe5d2 Stavros Sachtouris
        print('...ok')
451 3dabe5d2 Stavros Sachtouris
452 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test reboot_server')
453 3dabe5d2 Stavros Sachtouris
        self._test_reboot_server()
454 3dabe5d2 Stavros Sachtouris
        print('...ok')
455 3dabe5d2 Stavros Sachtouris
456 3dabe5d2 Stavros Sachtouris
        print('- wait for test servers to boot')
457 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'REBOOT')
458 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server2['id'], 'REBOOT')
459 3dabe5d2 Stavros Sachtouris
        print('- ok')
460 3dabe5d2 Stavros Sachtouris
461 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test create_server_metadata')
462 3dabe5d2 Stavros Sachtouris
        self._test_create_server_metadata()
463 3dabe5d2 Stavros Sachtouris
        print('...ok')
464 3dabe5d2 Stavros Sachtouris
465 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test get_server_metadata')
466 3dabe5d2 Stavros Sachtouris
        self._test_get_server_metadata()
467 3dabe5d2 Stavros Sachtouris
        print('...ok')
468 3dabe5d2 Stavros Sachtouris
469 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test update_server_metadata')
470 3dabe5d2 Stavros Sachtouris
        self._test_update_server_metadata()
471 3dabe5d2 Stavros Sachtouris
        print('...ok')
472 3dabe5d2 Stavros Sachtouris
473 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test delete_server_metadata')
474 3dabe5d2 Stavros Sachtouris
        self._test_delete_server_metadata()
475 3dabe5d2 Stavros Sachtouris
        print('...ok')
476 3dabe5d2 Stavros Sachtouris
477 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test list_flavors')
478 3dabe5d2 Stavros Sachtouris
        self._test_list_flavors()
479 3dabe5d2 Stavros Sachtouris
        print('...ok')
480 3dabe5d2 Stavros Sachtouris
481 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test get_flavor_details')
482 3dabe5d2 Stavros Sachtouris
        self._test_get_flavor_details()
483 3dabe5d2 Stavros Sachtouris
        print('...ok')
484 3dabe5d2 Stavros Sachtouris
485 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test list_images')
486 3dabe5d2 Stavros Sachtouris
        self._test_list_images()
487 3dabe5d2 Stavros Sachtouris
        print('...ok')
488 3dabe5d2 Stavros Sachtouris
489 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test get_image_details')
490 3dabe5d2 Stavros Sachtouris
        self._test_get_image_details()
491 3dabe5d2 Stavros Sachtouris
        print('...ok')
492 3dabe5d2 Stavros Sachtouris
493 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test get_image_metadata')
494 3dabe5d2 Stavros Sachtouris
        self._test_get_image_metadata()
495 3dabe5d2 Stavros Sachtouris
        print('...ok')
496 3dabe5d2 Stavros Sachtouris
497 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test shutdown_server')
498 3dabe5d2 Stavros Sachtouris
        self._test_shutdown_server()
499 3dabe5d2 Stavros Sachtouris
        print('...ok')
500 3dabe5d2 Stavros Sachtouris
501 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test start_server')
502 3dabe5d2 Stavros Sachtouris
        self._test_start_server()
503 3dabe5d2 Stavros Sachtouris
        print('...ok')
504 3dabe5d2 Stavros Sachtouris
505 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test get_server_console')
506 3dabe5d2 Stavros Sachtouris
        self._test_get_server_console()
507 3dabe5d2 Stavros Sachtouris
        print('...ok')
508 3dabe5d2 Stavros Sachtouris
509 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test get_firewall_profile')
510 be4eb3fa Stavros Sachtouris
        self._test_get_firewall_profile()
511 3dabe5d2 Stavros Sachtouris
        print('...ok')
512 3dabe5d2 Stavros Sachtouris
513 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test set_firewall_profile')
514 be4eb3fa Stavros Sachtouris
        self._test_set_firewall_profile()
515 3dabe5d2 Stavros Sachtouris
        print('...ok')
516 3dabe5d2 Stavros Sachtouris
517 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test get_server_stats')
518 3dabe5d2 Stavros Sachtouris
        self._test_get_server_stats()
519 3dabe5d2 Stavros Sachtouris
        print('...ok')
520 3dabe5d2 Stavros Sachtouris
521 3dabe5d2 Stavros Sachtouris
        self.network1 = self._create_network(self.netname1)
522 3dabe5d2 Stavros Sachtouris
523 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test create_network')
524 3dabe5d2 Stavros Sachtouris
        self._test_create_network()
525 3dabe5d2 Stavros Sachtouris
        print('...ok')
526 3dabe5d2 Stavros Sachtouris
527 7d91734c Stavros Sachtouris
        print('- wait for network to be activated')
528 3dabe5d2 Stavros Sachtouris
        self._wait_for_network(self.network1['id'], 'ACTIVE')
529 3dabe5d2 Stavros Sachtouris
        print('- ok')
530 3dabe5d2 Stavros Sachtouris
531 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test connect_server')
532 3dabe5d2 Stavros Sachtouris
        self._test_connect_server()
533 3dabe5d2 Stavros Sachtouris
        print('...ok')
534 3dabe5d2 Stavros Sachtouris
535 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test disconnect_server')
536 3dabe5d2 Stavros Sachtouris
        self._test_disconnect_server()
537 3dabe5d2 Stavros Sachtouris
        print('...ok')
538 3dabe5d2 Stavros Sachtouris
539 3dabe5d2 Stavros Sachtouris
        self.network2 = self._create_network(self.netname2)
540 7d91734c Stavros Sachtouris
        print('- wait for network to be activated')
541 3dabe5d2 Stavros Sachtouris
        self._wait_for_network(self.network2['id'], 'ACTIVE')
542 3dabe5d2 Stavros Sachtouris
        print('- ok')
543 3dabe5d2 Stavros Sachtouris
544 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test list_server_nics')
545 3dabe5d2 Stavros Sachtouris
        self._test_list_server_nics()
546 3dabe5d2 Stavros Sachtouris
        print('...ok')
547 3dabe5d2 Stavros Sachtouris
548 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test list_networks')
549 3dabe5d2 Stavros Sachtouris
        self._test_list_networks()
550 3dabe5d2 Stavros Sachtouris
        print('...ok')
551 3dabe5d2 Stavros Sachtouris
552 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test get_network_details')
553 3dabe5d2 Stavros Sachtouris
        self._test_get_network_details()
554 3dabe5d2 Stavros Sachtouris
        print('...ok')
555 3dabe5d2 Stavros Sachtouris
556 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test update_network_name')
557 3dabe5d2 Stavros Sachtouris
        self._test_update_network_name()
558 3dabe5d2 Stavros Sachtouris
        print('...ok')
559 3dabe5d2 Stavros Sachtouris
560 3dabe5d2 Stavros Sachtouris
        """Don't have auth for these:
561 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test delete_image')
562 3dabe5d2 Stavros Sachtouris
        self._test_delete_image()
563 3dabe5d2 Stavros Sachtouris
        print('...ok')
564 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test create_image_metadata')
565 3dabe5d2 Stavros Sachtouris
        self._test_create_image_metadata()
566 3dabe5d2 Stavros Sachtouris
        print('...ok')
567 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test update_image_metadata')
568 3dabe5d2 Stavros Sachtouris
        self._test_update_image_metadata()
569 3dabe5d2 Stavros Sachtouris
        print('...ok')
570 3dabe5d2 Stavros Sachtouris
        sys.stdout.write(' test delete_image_metadata')
571 3dabe5d2 Stavros Sachtouris
        self._test_delete_image_metadata()
572 3dabe5d2 Stavros Sachtouris
        print('...ok')
573 3dabe5d2 Stavros Sachtouris
        """
574 3dabe5d2 Stavros Sachtouris
575 ca30409e Stavros Sachtouris
    @if_not_all
576 ca30409e Stavros Sachtouris
    def test_parallel_creation(self):
577 ca30409e Stavros Sachtouris
        """test create with multiple threads"""
578 ca30409e Stavros Sachtouris
        from kamaki.clients import SilentEvent
579 ca30409e Stavros Sachtouris
        c1 = SilentEvent(self._create_server,
580 ca30409e Stavros Sachtouris
            self.servname1,
581 ca30409e Stavros Sachtouris
            self.flavorid,
582 ca30409e Stavros Sachtouris
            self.img)
583 ca30409e Stavros Sachtouris
        c2 = SilentEvent(self._create_server,
584 ca30409e Stavros Sachtouris
            self.servname2,
585 ca30409e Stavros Sachtouris
            self.flavorid + 2,
586 ca30409e Stavros Sachtouris
            self.img)
587 ca30409e Stavros Sachtouris
        c3 = SilentEvent(self._create_server,
588 ca30409e Stavros Sachtouris
            self.servname1,
589 ca30409e Stavros Sachtouris
            self.flavorid,
590 ca30409e Stavros Sachtouris
            self.img)
591 ca30409e Stavros Sachtouris
        c4 = SilentEvent(self._create_server,
592 ca30409e Stavros Sachtouris
            self.servname2,
593 ca30409e Stavros Sachtouris
            self.flavorid + 2,
594 ca30409e Stavros Sachtouris
            self.img)
595 ca30409e Stavros Sachtouris
        c5 = SilentEvent(self._create_server,
596 ca30409e Stavros Sachtouris
            self.servname1,
597 ca30409e Stavros Sachtouris
            self.flavorid,
598 ca30409e Stavros Sachtouris
            self.img)
599 ca30409e Stavros Sachtouris
        c6 = SilentEvent(self._create_server,
600 ca30409e Stavros Sachtouris
            self.servname2,
601 ca30409e Stavros Sachtouris
            self.flavorid + 2,
602 ca30409e Stavros Sachtouris
            self.img)
603 ca30409e Stavros Sachtouris
        c7 = SilentEvent(self._create_server,
604 ca30409e Stavros Sachtouris
            self.servname1,
605 ca30409e Stavros Sachtouris
            self.flavorid,
606 ca30409e Stavros Sachtouris
            self.img)
607 ca30409e Stavros Sachtouris
        c8 = SilentEvent(self._create_server,
608 ca30409e Stavros Sachtouris
            self.servname2,
609 ca30409e Stavros Sachtouris
            self.flavorid + 2,
610 ca30409e Stavros Sachtouris
            self.img)
611 ca30409e Stavros Sachtouris
        c1.start()
612 ca30409e Stavros Sachtouris
        c2.start()
613 ca30409e Stavros Sachtouris
        c3.start()
614 ca30409e Stavros Sachtouris
        c4.start()
615 ca30409e Stavros Sachtouris
        c5.start()
616 ca30409e Stavros Sachtouris
        c6.start()
617 ca30409e Stavros Sachtouris
        c7.start()
618 ca30409e Stavros Sachtouris
        c8.start()
619 ca30409e Stavros Sachtouris
620 3dabe5d2 Stavros Sachtouris
    def _wait_for_network(self, netid, status):
621 3dabe5d2 Stavros Sachtouris
        wait = 3
622 3dabe5d2 Stavros Sachtouris
        limit = 50
623 3dabe5d2 Stavros Sachtouris
        c = ['|', '/', '-', '\\']
624 3dabe5d2 Stavros Sachtouris
        sys.stdout.write('\t- make net %s %s  ' % (netid, status))
625 3dabe5d2 Stavros Sachtouris
        while wait < limit:
626 3dabe5d2 Stavros Sachtouris
            r = self.client.get_network_details(netid)
627 3dabe5d2 Stavros Sachtouris
            if r['status'] == status:
628 3dabe5d2 Stavros Sachtouris
                print('\tOK')
629 3dabe5d2 Stavros Sachtouris
                return True
630 3dabe5d2 Stavros Sachtouris
            sys.stdout.write('\tit is now %s, wait %ss  '\
631 3dabe5d2 Stavros Sachtouris
                % (r['status'], wait))
632 3dabe5d2 Stavros Sachtouris
            for i in range(wait * 4):
633 3dabe5d2 Stavros Sachtouris
                sys.stdout.write('\b%s' % c[i % 4])
634 3dabe5d2 Stavros Sachtouris
                sys.stdout.flush()
635 3dabe5d2 Stavros Sachtouris
                time.sleep(0.25)
636 3dabe5d2 Stavros Sachtouris
            print('\b ')
637 3dabe5d2 Stavros Sachtouris
            wait += 3
638 3dabe5d2 Stavros Sachtouris
        return False
639 3dabe5d2 Stavros Sachtouris
640 3dabe5d2 Stavros Sachtouris
    def _wait_for_nic(self, netid, servid, in_creation=True):
641 3dabe5d2 Stavros Sachtouris
        self._wait_for_network(netid, 'ACTIVE')
642 3dabe5d2 Stavros Sachtouris
        c = ['|', '/', '-', '\\']
643 3dabe5d2 Stavros Sachtouris
        limit = 50
644 3dabe5d2 Stavros Sachtouris
        wait = 3
645 3dabe5d2 Stavros Sachtouris
        largetry = 0
646 3dabe5d2 Stavros Sachtouris
        while wait < limit:
647 3dabe5d2 Stavros Sachtouris
            nics = self.client.list_server_nics(servid)
648 3dabe5d2 Stavros Sachtouris
            for net in nics:
649 3dabe5d2 Stavros Sachtouris
                found_nic = net['network_id'] == netid
650 3dabe5d2 Stavros Sachtouris
                if (in_creation and found_nic)\
651 3dabe5d2 Stavros Sachtouris
                or not (in_creation or found_nic):
652 3dabe5d2 Stavros Sachtouris
                    return True
653 3dabe5d2 Stavros Sachtouris
            dis = '' if in_creation else 'dis'
654 3dabe5d2 Stavros Sachtouris
            sys.stdout.write('\twait nic %s to %sconnect to %s: %ss  '\
655 3dabe5d2 Stavros Sachtouris
                % (netid, dis, servid, wait))
656 3dabe5d2 Stavros Sachtouris
            for i in range(wait * 4):
657 3dabe5d2 Stavros Sachtouris
                sys.stdout.write('\b%s' % c[i % 4])
658 3dabe5d2 Stavros Sachtouris
                sys.stdout.flush()
659 3dabe5d2 Stavros Sachtouris
                time.sleep(0.25)
660 3dabe5d2 Stavros Sachtouris
            print('\b ')
661 3dabe5d2 Stavros Sachtouris
            wait += 3
662 3dabe5d2 Stavros Sachtouris
            if wait >= limit and largetry < 3:
663 3dabe5d2 Stavros Sachtouris
                wait = 3
664 3dabe5d2 Stavros Sachtouris
                largetry += 1
665 3dabe5d2 Stavros Sachtouris
        return False
666 3dabe5d2 Stavros Sachtouris
667 3dabe5d2 Stavros Sachtouris
    def _has_status(self, servid, status):
668 3dabe5d2 Stavros Sachtouris
        r = self.client.get_server_details(servid)
669 3dabe5d2 Stavros Sachtouris
        return r['status'] == status
670 3dabe5d2 Stavros Sachtouris
671 3dabe5d2 Stavros Sachtouris
    def _wait_for_status(self, servid, status):
672 8574a687 Stavros Sachtouris
        withbar = True
673 8574a687 Stavros Sachtouris
        try:
674 8574a687 Stavros Sachtouris
            wait_bar = IncrementalBar('\tServer[%s] in %s ' % (servid, status))
675 8574a687 Stavros Sachtouris
        except NameError:
676 8574a687 Stavros Sachtouris
            withbar = False
677 8574a687 Stavros Sachtouris
678 8574a687 Stavros Sachtouris
        wait_cb = None
679 8574a687 Stavros Sachtouris
        if withbar:
680 8574a687 Stavros Sachtouris
            wait_bar.start()
681 ca30409e Stavros Sachtouris
682 8574a687 Stavros Sachtouris
            def progress_gen(n):
683 8574a687 Stavros Sachtouris
                for i in wait_bar.iter(range(int(n))):
684 8574a687 Stavros Sachtouris
                    yield
685 ca30409e Stavros Sachtouris
                yield
686 8574a687 Stavros Sachtouris
687 8574a687 Stavros Sachtouris
            wait_cb = progress_gen
688 ca30409e Stavros Sachtouris
689 277ca4ed Dionysis Zindros
        time.sleep(0.5)
690 8574a687 Stavros Sachtouris
        self.client.wait_server(servid, status, wait_cb=wait_cb)
691 8574a687 Stavros Sachtouris
        if withbar:
692 8574a687 Stavros Sachtouris
            wait_bar.finish()
693 3dabe5d2 Stavros Sachtouris
694 3dabe5d2 Stavros Sachtouris
    @if_not_all
695 3dabe5d2 Stavros Sachtouris
    def test_list_servers(self):
696 3dabe5d2 Stavros Sachtouris
        """Test list servers"""
697 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
698 3dabe5d2 Stavros Sachtouris
            self.flavorid,
699 3dabe5d2 Stavros Sachtouris
            self.img)
700 3dabe5d2 Stavros Sachtouris
        self.server2 = self._create_server(self.servname2,
701 3dabe5d2 Stavros Sachtouris
            self.flavorid + 1,
702 3dabe5d2 Stavros Sachtouris
            self.img)
703 3dabe5d2 Stavros Sachtouris
        self._test_list_servers()
704 3dabe5d2 Stavros Sachtouris
705 3dabe5d2 Stavros Sachtouris
    def _test_list_servers(self):
706 3dabe5d2 Stavros Sachtouris
        servers = self.client.list_servers()
707 3dabe5d2 Stavros Sachtouris
        dservers = self.client.list_servers(detail=True)
708 3dabe5d2 Stavros Sachtouris
709 3dabe5d2 Stavros Sachtouris
        """detailed and simple are same size"""
710 3dabe5d2 Stavros Sachtouris
        self.assertEqual(len(dservers), len(servers))
711 3dabe5d2 Stavros Sachtouris
        for i in range(len(servers)):
712 3dabe5d2 Stavros Sachtouris
            for field in ('created',
713 3dabe5d2 Stavros Sachtouris
            'flavorRef',
714 3dabe5d2 Stavros Sachtouris
            'hostId',
715 3dabe5d2 Stavros Sachtouris
            'imageRef',
716 3dabe5d2 Stavros Sachtouris
            'progress',
717 3dabe5d2 Stavros Sachtouris
            'status',
718 3dabe5d2 Stavros Sachtouris
            'updated'):
719 3dabe5d2 Stavros Sachtouris
                self.assertFalse(field in servers[i])
720 3dabe5d2 Stavros Sachtouris
                self.assertTrue(field in dservers[i])
721 3dabe5d2 Stavros Sachtouris
722 3dabe5d2 Stavros Sachtouris
        """detailed and simple contain same names"""
723 3dabe5d2 Stavros Sachtouris
        names = sorted(map(lambda x: x["name"], servers))
724 3dabe5d2 Stavros Sachtouris
        dnames = sorted(map(lambda x: x["name"], dservers))
725 3dabe5d2 Stavros Sachtouris
        self.assertEqual(names, dnames)
726 3dabe5d2 Stavros Sachtouris
727 3dabe5d2 Stavros Sachtouris
    @if_not_all
728 3dabe5d2 Stavros Sachtouris
    def test_create_server(self):
729 3dabe5d2 Stavros Sachtouris
        """Test create_server"""
730 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
731 3dabe5d2 Stavros Sachtouris
            self.flavorid,
732 3dabe5d2 Stavros Sachtouris
            self.img)
733 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'BUILD')
734 3dabe5d2 Stavros Sachtouris
        self._test_create_server()
735 3dabe5d2 Stavros Sachtouris
736 3dabe5d2 Stavros Sachtouris
    def _test_create_server(self):
737 3dabe5d2 Stavros Sachtouris
        self.assertEqual(self.server1["name"], self.servname1)
738 3dabe5d2 Stavros Sachtouris
        self.assertEqual(self.server1["flavorRef"], self.flavorid)
739 3dabe5d2 Stavros Sachtouris
        self.assertEqual(self.server1["imageRef"], self.img)
740 3dabe5d2 Stavros Sachtouris
        self.assertEqual(self.server1["status"], "BUILD")
741 3dabe5d2 Stavros Sachtouris
742 3dabe5d2 Stavros Sachtouris
    @if_not_all
743 3dabe5d2 Stavros Sachtouris
    def test_get_server_details(self):
744 3dabe5d2 Stavros Sachtouris
        """Test get_server_details"""
745 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
746 3dabe5d2 Stavros Sachtouris
            self.flavorid,
747 3dabe5d2 Stavros Sachtouris
            self.img)
748 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'BUILD')
749 3dabe5d2 Stavros Sachtouris
        self._test_get_server_details()
750 3dabe5d2 Stavros Sachtouris
751 3dabe5d2 Stavros Sachtouris
    def _test_get_server_details(self):
752 3dabe5d2 Stavros Sachtouris
        r = self.client.get_server_details(self.server1['id'])
753 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r["name"], self.servname1)
754 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r["flavorRef"], self.flavorid)
755 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r["imageRef"], self.img)
756 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r["status"], "ACTIVE")
757 3dabe5d2 Stavros Sachtouris
758 3dabe5d2 Stavros Sachtouris
    @if_not_all
759 3dabe5d2 Stavros Sachtouris
    def test_update_server_name(self):
760 3dabe5d2 Stavros Sachtouris
        """Test update_server_name"""
761 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
762 3dabe5d2 Stavros Sachtouris
            self.flavorid,
763 3dabe5d2 Stavros Sachtouris
            self.img)
764 3dabe5d2 Stavros Sachtouris
        self._test_update_server_name()
765 3dabe5d2 Stavros Sachtouris
766 3dabe5d2 Stavros Sachtouris
    def _test_update_server_name(self):
767 3dabe5d2 Stavros Sachtouris
        new_name = self.servname1 + '_new_name'
768 3dabe5d2 Stavros Sachtouris
        self.client.update_server_name(self.server1['id'], new_name)
769 3dabe5d2 Stavros Sachtouris
        r = self.client.get_server_details(self.server1['id'],
770 3dabe5d2 Stavros Sachtouris
         success=(200, 400))
771 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['name'], new_name)
772 3dabe5d2 Stavros Sachtouris
        changed = self.servers.pop(self.servname1)
773 3dabe5d2 Stavros Sachtouris
        changed['name'] = new_name
774 3dabe5d2 Stavros Sachtouris
        self.servers[new_name] = changed
775 3dabe5d2 Stavros Sachtouris
776 3dabe5d2 Stavros Sachtouris
    @if_not_all
777 3dabe5d2 Stavros Sachtouris
    def test_reboot_server(self):
778 3dabe5d2 Stavros Sachtouris
        """Test reboot server"""
779 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
780 3dabe5d2 Stavros Sachtouris
            self.flavorid,
781 3dabe5d2 Stavros Sachtouris
            self.img)
782 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'BUILD')
783 3dabe5d2 Stavros Sachtouris
        self.server2 = self._create_server(self.servname2,
784 3dabe5d2 Stavros Sachtouris
            self.flavorid + 1,
785 3dabe5d2 Stavros Sachtouris
            self.img)
786 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server2['id'], 'BUILD')
787 3dabe5d2 Stavros Sachtouris
        self._test_reboot_server()
788 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'REBOOT')
789 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server2['id'], 'REBOOT')
790 3dabe5d2 Stavros Sachtouris
791 3dabe5d2 Stavros Sachtouris
    def _test_reboot_server(self):
792 3dabe5d2 Stavros Sachtouris
        self.client.reboot_server(self.server1['id'])
793 3dabe5d2 Stavros Sachtouris
        self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
794 3dabe5d2 Stavros Sachtouris
        self.client.reboot_server(self.server2['id'], hard=True)
795 3dabe5d2 Stavros Sachtouris
        self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
796 3dabe5d2 Stavros Sachtouris
797 3dabe5d2 Stavros Sachtouris
    @if_not_all
798 3dabe5d2 Stavros Sachtouris
    def test_get_server_metadata(self):
799 3dabe5d2 Stavros Sachtouris
        """Test get server_metadata"""
800 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
801 3dabe5d2 Stavros Sachtouris
            self.flavorid,
802 3dabe5d2 Stavros Sachtouris
            self.img)
803 3dabe5d2 Stavros Sachtouris
        self._test_get_server_metadata()
804 3dabe5d2 Stavros Sachtouris
805 3dabe5d2 Stavros Sachtouris
    def _test_get_server_metadata(self):
806 3dabe5d2 Stavros Sachtouris
        self.client.create_server_metadata(self.server1['id'],
807 3dabe5d2 Stavros Sachtouris
            'mymeta_0',
808 3dabe5d2 Stavros Sachtouris
            'val_0')
809 3dabe5d2 Stavros Sachtouris
        r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
810 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['mymeta_0'], 'val_0')
811 3dabe5d2 Stavros Sachtouris
812 3dabe5d2 Stavros Sachtouris
    @if_not_all
813 3dabe5d2 Stavros Sachtouris
    def test_create_server_metadata(self):
814 3dabe5d2 Stavros Sachtouris
        """Test create_server_metadata"""
815 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
816 3dabe5d2 Stavros Sachtouris
            self.flavorid,
817 3dabe5d2 Stavros Sachtouris
            self.img)
818 3dabe5d2 Stavros Sachtouris
        self._test_create_server_metadata()
819 3dabe5d2 Stavros Sachtouris
820 3dabe5d2 Stavros Sachtouris
    def _test_create_server_metadata(self):
821 3dabe5d2 Stavros Sachtouris
        r1 = self.client.create_server_metadata(self.server1['id'],
822 3dabe5d2 Stavros Sachtouris
            'mymeta',
823 3dabe5d2 Stavros Sachtouris
            'mymeta val')
824 3dabe5d2 Stavros Sachtouris
        self.assertTrue('mymeta' in r1)
825 3dabe5d2 Stavros Sachtouris
        r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
826 3dabe5d2 Stavros Sachtouris
        self.assert_dicts_are_deeply_equal(r1, r2)
827 3dabe5d2 Stavros Sachtouris
828 3dabe5d2 Stavros Sachtouris
    @if_not_all
829 3dabe5d2 Stavros Sachtouris
    def test_update_server_metadata(self):
830 3dabe5d2 Stavros Sachtouris
        """Test update_server_metadata"""
831 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
832 3dabe5d2 Stavros Sachtouris
            self.flavorid,
833 3dabe5d2 Stavros Sachtouris
            self.img)
834 3dabe5d2 Stavros Sachtouris
        self._test_update_server_metadata()
835 3dabe5d2 Stavros Sachtouris
836 3dabe5d2 Stavros Sachtouris
    def _test_update_server_metadata(self):
837 3dabe5d2 Stavros Sachtouris
        r1 = self.client.create_server_metadata(self.server1['id'],
838 3dabe5d2 Stavros Sachtouris
            'mymeta3',
839 3dabe5d2 Stavros Sachtouris
            'val2')
840 3dabe5d2 Stavros Sachtouris
        self.assertTrue('mymeta3'in r1)
841 3dabe5d2 Stavros Sachtouris
        r2 = self.client.update_server_metadata(self.server1['id'],
842 3dabe5d2 Stavros Sachtouris
            mymeta3='val3')
843 3dabe5d2 Stavros Sachtouris
        self.assertTrue(r2['mymeta3'], 'val3')
844 3dabe5d2 Stavros Sachtouris
845 3dabe5d2 Stavros Sachtouris
    @if_not_all
846 3dabe5d2 Stavros Sachtouris
    def test_delete_server_metadata(self):
847 3dabe5d2 Stavros Sachtouris
        """Test delete_server_metadata"""
848 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
849 3dabe5d2 Stavros Sachtouris
            self.flavorid,
850 3dabe5d2 Stavros Sachtouris
            self.img)
851 3dabe5d2 Stavros Sachtouris
        self._test_delete_server_metadata()
852 3dabe5d2 Stavros Sachtouris
853 3dabe5d2 Stavros Sachtouris
    def _test_delete_server_metadata(self):
854 3dabe5d2 Stavros Sachtouris
        r1 = self.client.create_server_metadata(self.server1['id'],
855 3dabe5d2 Stavros Sachtouris
            'mymeta',
856 3dabe5d2 Stavros Sachtouris
            'val')
857 3dabe5d2 Stavros Sachtouris
        self.assertTrue('mymeta' in r1)
858 3dabe5d2 Stavros Sachtouris
        self.client.delete_server_metadata(self.server1['id'], 'mymeta')
859 3dabe5d2 Stavros Sachtouris
        try:
860 3dabe5d2 Stavros Sachtouris
            self.client.get_server_metadata(self.server1['id'], 'mymeta')
861 3dabe5d2 Stavros Sachtouris
            raise ClientError('Wrong Error', status=100)
862 3dabe5d2 Stavros Sachtouris
        except ClientError as err:
863 3dabe5d2 Stavros Sachtouris
            self.assertEqual(err.status, 404)
864 3dabe5d2 Stavros Sachtouris
865 3dabe5d2 Stavros Sachtouris
    @if_not_all
866 3dabe5d2 Stavros Sachtouris
    def test_list_flavors(self):
867 3dabe5d2 Stavros Sachtouris
        """Test flavors_get"""
868 3dabe5d2 Stavros Sachtouris
        self._test_list_flavors()
869 3dabe5d2 Stavros Sachtouris
870 3dabe5d2 Stavros Sachtouris
    def _test_list_flavors(self):
871 3dabe5d2 Stavros Sachtouris
        r = self.client.list_flavors()
872 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r) > 1)
873 3dabe5d2 Stavros Sachtouris
        r = self.client.list_flavors(detail=True)
874 3dabe5d2 Stavros Sachtouris
        self.assertTrue('SNF:disk_template' in r[0])
875 3dabe5d2 Stavros Sachtouris
876 3dabe5d2 Stavros Sachtouris
    @if_not_all
877 3dabe5d2 Stavros Sachtouris
    def test_get_flavor_details(self):
878 3dabe5d2 Stavros Sachtouris
        """Test test_get_flavor_details"""
879 3dabe5d2 Stavros Sachtouris
        self._test_get_flavor_details()
880 3dabe5d2 Stavros Sachtouris
881 3dabe5d2 Stavros Sachtouris
    def _test_get_flavor_details(self):
882 3dabe5d2 Stavros Sachtouris
        r = self.client.get_flavor_details(self.flavorid)
883 3dabe5d2 Stavros Sachtouris
        self.assert_dicts_are_deeply_equal(self.flavor_details, r)
884 3dabe5d2 Stavros Sachtouris
885 3dabe5d2 Stavros Sachtouris
    @if_not_all
886 3dabe5d2 Stavros Sachtouris
    def test_list_images(self):
887 3dabe5d2 Stavros Sachtouris
        """Test list_images"""
888 3dabe5d2 Stavros Sachtouris
        self._test_list_images()
889 3dabe5d2 Stavros Sachtouris
890 3dabe5d2 Stavros Sachtouris
    def _test_list_images(self):
891 3dabe5d2 Stavros Sachtouris
        r = self.client.list_images()
892 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r) > 1)
893 3dabe5d2 Stavros Sachtouris
        r = self.client.list_images(detail=True)
894 3dabe5d2 Stavros Sachtouris
        for detailed_img in r:
895 3dabe5d2 Stavros Sachtouris
            if detailed_img['id'] == self.img:
896 3dabe5d2 Stavros Sachtouris
                break
897 ca30409e Stavros Sachtouris
        self.assert_dicts_are_deeply_equal(detailed_img, self.img_details)
898 3dabe5d2 Stavros Sachtouris
899 3dabe5d2 Stavros Sachtouris
    @if_not_all
900 ca30409e Stavros Sachtouris
    def test_get_image_details(self):
901 3dabe5d2 Stavros Sachtouris
        """Test image_details"""
902 ca30409e Stavros Sachtouris
        self._test_get_image_details()
903 3dabe5d2 Stavros Sachtouris
904 3dabe5d2 Stavros Sachtouris
    def _test_get_image_details(self):
905 3dabe5d2 Stavros Sachtouris
        r = self.client.get_image_details(self.img)
906 ca30409e Stavros Sachtouris
        r.pop('updated')
907 3dabe5d2 Stavros Sachtouris
        self.assert_dicts_are_deeply_equal(r, self.img_details)
908 3dabe5d2 Stavros Sachtouris
909 3dabe5d2 Stavros Sachtouris
    @if_not_all
910 3dabe5d2 Stavros Sachtouris
    def test_get_image_metadata(self):
911 3dabe5d2 Stavros Sachtouris
        """Test get_image_metadata"""
912 3dabe5d2 Stavros Sachtouris
        self._test_get_image_metadata()
913 3dabe5d2 Stavros Sachtouris
914 3dabe5d2 Stavros Sachtouris
    def _test_get_image_metadata(self):
915 3dabe5d2 Stavros Sachtouris
        r = self.client.get_image_metadata(self.img)
916 3dabe5d2 Stavros Sachtouris
        self.assert_dicts_are_deeply_equal(
917 3dabe5d2 Stavros Sachtouris
            self.img_details['metadata']['values'], r)
918 3dabe5d2 Stavros Sachtouris
        for key, val in self.img_details['metadata']['values'].items():
919 3dabe5d2 Stavros Sachtouris
            r = self.client.get_image_metadata(self.img, key)
920 3dabe5d2 Stavros Sachtouris
            self.assertEqual(r[key], val)
921 3dabe5d2 Stavros Sachtouris
922 3dabe5d2 Stavros Sachtouris
    @if_not_all
923 3dabe5d2 Stavros Sachtouris
    def test_start_server(self):
924 3dabe5d2 Stavros Sachtouris
        """Test start_server"""
925 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
926 3dabe5d2 Stavros Sachtouris
            self.flavorid,
927 3dabe5d2 Stavros Sachtouris
            self.img)
928 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'BUILD')
929 3dabe5d2 Stavros Sachtouris
        self.client.shutdown_server(self.server1['id'])
930 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'ACTIVE')
931 3dabe5d2 Stavros Sachtouris
        self._test_start_server()
932 3dabe5d2 Stavros Sachtouris
933 3dabe5d2 Stavros Sachtouris
    def _test_start_server(self):
934 3dabe5d2 Stavros Sachtouris
        self.client.start_server(self.server1['id'])
935 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'STOPPED')
936 3dabe5d2 Stavros Sachtouris
        r = self.client.get_server_details(self.server1['id'])
937 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['status'], 'ACTIVE')
938 3dabe5d2 Stavros Sachtouris
939 3dabe5d2 Stavros Sachtouris
    @if_not_all
940 3dabe5d2 Stavros Sachtouris
    def test_shutdown_server(self):
941 3dabe5d2 Stavros Sachtouris
        """Test shutdown_server"""
942 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
943 3dabe5d2 Stavros Sachtouris
            self.flavorid,
944 3dabe5d2 Stavros Sachtouris
            self.img)
945 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'BUILD')
946 3dabe5d2 Stavros Sachtouris
        self._test_shutdown_server()
947 3dabe5d2 Stavros Sachtouris
948 3dabe5d2 Stavros Sachtouris
    def _test_shutdown_server(self):
949 3dabe5d2 Stavros Sachtouris
        self.client.shutdown_server(self.server1['id'])
950 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'ACTIVE')
951 3dabe5d2 Stavros Sachtouris
        r = self.client.get_server_details(self.server1['id'])
952 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['status'], 'STOPPED')
953 3dabe5d2 Stavros Sachtouris
954 3dabe5d2 Stavros Sachtouris
    @if_not_all
955 3dabe5d2 Stavros Sachtouris
    def test_get_server_console(self):
956 3dabe5d2 Stavros Sachtouris
        """Test get_server_console"""
957 3dabe5d2 Stavros Sachtouris
        self.server2 = self._create_server(self.servname2,
958 75c3fc42 Stavros Sachtouris
            self.flavorid + 2,
959 3dabe5d2 Stavros Sachtouris
            self.img)
960 75c3fc42 Stavros Sachtouris
        self._wait_for_status(self.server2['id'], 'BUILD')
961 3dabe5d2 Stavros Sachtouris
        self._test_get_server_console()
962 3dabe5d2 Stavros Sachtouris
963 3dabe5d2 Stavros Sachtouris
    def _test_get_server_console(self):
964 3dabe5d2 Stavros Sachtouris
        r = self.client.get_server_console(self.server2['id'])
965 3dabe5d2 Stavros Sachtouris
        self.assertTrue('host' in r)
966 3dabe5d2 Stavros Sachtouris
        self.assertTrue('password' in r)
967 3dabe5d2 Stavros Sachtouris
        self.assertTrue('port' in r)
968 3dabe5d2 Stavros Sachtouris
        self.assertTrue('type' in r)
969 3dabe5d2 Stavros Sachtouris
970 3dabe5d2 Stavros Sachtouris
    @if_not_all
971 3dabe5d2 Stavros Sachtouris
    def test_get_firewall_profile(self):
972 3dabe5d2 Stavros Sachtouris
        """Test get_firewall_profile"""
973 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
974 3dabe5d2 Stavros Sachtouris
            self.flavorid,
975 3dabe5d2 Stavros Sachtouris
            self.img)
976 3dabe5d2 Stavros Sachtouris
        self._test_get_firewall_profile()
977 3dabe5d2 Stavros Sachtouris
978 3dabe5d2 Stavros Sachtouris
    def _test_get_firewall_profile(self):
979 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'BUILD')
980 3dabe5d2 Stavros Sachtouris
        fprofile = self.client.get_firewall_profile(self.server1['id'])
981 3dabe5d2 Stavros Sachtouris
        self.assertTrue(fprofile in self.PROFILES)
982 3dabe5d2 Stavros Sachtouris
983 3dabe5d2 Stavros Sachtouris
    @if_not_all
984 3dabe5d2 Stavros Sachtouris
    def test_set_firewall_profile(self):
985 3dabe5d2 Stavros Sachtouris
        """Test set_firewall_profile"""
986 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
987 3dabe5d2 Stavros Sachtouris
            self.flavorid,
988 3dabe5d2 Stavros Sachtouris
            self.img)
989 3dabe5d2 Stavros Sachtouris
        self._test_set_firewall_profile()
990 3dabe5d2 Stavros Sachtouris
991 3dabe5d2 Stavros Sachtouris
    def _test_set_firewall_profile(self):
992 3dabe5d2 Stavros Sachtouris
993 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'BUILD')
994 be4eb3fa Stavros Sachtouris
        PROFILES = ['DISABLED', 'ENABLED', 'DISABLED', 'PROTECTED']
995 3dabe5d2 Stavros Sachtouris
        fprofile = self.client.get_firewall_profile(self.server1['id'])
996 3dabe5d2 Stavros Sachtouris
        print('')
997 277ca4ed Dionysis Zindros
        count_success = 0
998 3dabe5d2 Stavros Sachtouris
        for counter, fprofile in enumerate(PROFILES):
999 3dabe5d2 Stavros Sachtouris
            npos = counter + 1
1000 277ca4ed Dionysis Zindros
            try:
1001 277ca4ed Dionysis Zindros
                nprofile = PROFILES[npos]
1002 277ca4ed Dionysis Zindros
            except IndexError:
1003 277ca4ed Dionysis Zindros
                nprofile = PROFILES[0]
1004 3dabe5d2 Stavros Sachtouris
            print('\tprofile swap %s: %s -> %s' % (npos, fprofile, nprofile))
1005 3dabe5d2 Stavros Sachtouris
            self.client.set_firewall_profile(self.server1['id'], nprofile)
1006 277ca4ed Dionysis Zindros
            time.sleep(0.5)
1007 277ca4ed Dionysis Zindros
            self.client.reboot_server(self.server1['id'], hard=True)
1008 277ca4ed Dionysis Zindros
            time.sleep(1)
1009 277ca4ed Dionysis Zindros
            self._wait_for_status(self.server1['id'], 'REBOOT')
1010 277ca4ed Dionysis Zindros
            time.sleep(0.5)
1011 277ca4ed Dionysis Zindros
            changed = self.client.get_firewall_profile(self.server1['id'])
1012 277ca4ed Dionysis Zindros
            try:
1013 277ca4ed Dionysis Zindros
                self.assertEqual(changed, nprofile)
1014 277ca4ed Dionysis Zindros
            except AssertionError as err:
1015 277ca4ed Dionysis Zindros
                if count_success:
1016 277ca4ed Dionysis Zindros
                    print('\tFAIL in swap #%s' % npos)
1017 277ca4ed Dionysis Zindros
                    break
1018 277ca4ed Dionysis Zindros
                else:
1019 277ca4ed Dionysis Zindros
                    raise err
1020 277ca4ed Dionysis Zindros
            count_success += 1
1021 3dabe5d2 Stavros Sachtouris
1022 3dabe5d2 Stavros Sachtouris
    @if_not_all
1023 3dabe5d2 Stavros Sachtouris
    def test_get_server_stats(self):
1024 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
1025 3dabe5d2 Stavros Sachtouris
            self.flavorid,
1026 3dabe5d2 Stavros Sachtouris
            self.img)
1027 3dabe5d2 Stavros Sachtouris
        self._test_get_server_stats()
1028 3dabe5d2 Stavros Sachtouris
1029 3dabe5d2 Stavros Sachtouris
    def _test_get_server_stats(self):
1030 3dabe5d2 Stavros Sachtouris
        r = self.client.get_server_stats(self.server1['id'])
1031 3dabe5d2 Stavros Sachtouris
        for term in ('cpuBar',
1032 3dabe5d2 Stavros Sachtouris
        'cpuTimeSeries',
1033 3dabe5d2 Stavros Sachtouris
        'netBar',
1034 3dabe5d2 Stavros Sachtouris
        'netTimeSeries',
1035 3dabe5d2 Stavros Sachtouris
        'refresh'):
1036 3dabe5d2 Stavros Sachtouris
            self.assertTrue(term in r)
1037 3dabe5d2 Stavros Sachtouris
1038 3dabe5d2 Stavros Sachtouris
    @if_not_all
1039 3dabe5d2 Stavros Sachtouris
    def test_list_networks(self):
1040 3dabe5d2 Stavros Sachtouris
        """Test list_network"""
1041 3dabe5d2 Stavros Sachtouris
        self.network1 = self._create_network(self.netname1)
1042 3dabe5d2 Stavros Sachtouris
        self._wait_for_network(self.network1['id'], 'ACTIVE')
1043 3dabe5d2 Stavros Sachtouris
        self._test_list_networks()
1044 3dabe5d2 Stavros Sachtouris
1045 3dabe5d2 Stavros Sachtouris
    def _test_list_networks(self):
1046 3dabe5d2 Stavros Sachtouris
        r = self.client.list_networks()
1047 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r) > 1)
1048 3dabe5d2 Stavros Sachtouris
        ids = [net['id'] for net in r]
1049 3dabe5d2 Stavros Sachtouris
        names = [net['name'] for net in r]
1050 3dabe5d2 Stavros Sachtouris
        self.assertTrue('1' in ids)
1051 277ca4ed Dionysis Zindros
        #self.assertTrue('public' in names)
1052 3dabe5d2 Stavros Sachtouris
        self.assertTrue(self.network1['id'] in ids)
1053 3dabe5d2 Stavros Sachtouris
        self.assertTrue(self.network1['name'] in names)
1054 3dabe5d2 Stavros Sachtouris
1055 3dabe5d2 Stavros Sachtouris
        r = self.client.list_networks(detail=True)
1056 3dabe5d2 Stavros Sachtouris
        ids = [net['id'] for net in r]
1057 3dabe5d2 Stavros Sachtouris
        names = [net['name'] for net in r]
1058 3dabe5d2 Stavros Sachtouris
        for net in r:
1059 3dabe5d2 Stavros Sachtouris
            self.assertTrue(net['id'] in ids)
1060 3dabe5d2 Stavros Sachtouris
            self.assertTrue(net['name'] in names)
1061 3dabe5d2 Stavros Sachtouris
            for term in ('status', 'updated', 'created'):
1062 3dabe5d2 Stavros Sachtouris
                self.assertTrue(term in net.keys())
1063 3dabe5d2 Stavros Sachtouris
1064 3dabe5d2 Stavros Sachtouris
    @if_not_all
1065 3dabe5d2 Stavros Sachtouris
    def test_create_network(self):
1066 3dabe5d2 Stavros Sachtouris
        """Test create_network"""
1067 3dabe5d2 Stavros Sachtouris
        self.network1 = self._create_network(self.netname1)
1068 3dabe5d2 Stavros Sachtouris
        self._test_create_network()
1069 3dabe5d2 Stavros Sachtouris
1070 3dabe5d2 Stavros Sachtouris
    def _test_create_network(self):
1071 3dabe5d2 Stavros Sachtouris
        nets = self.client.list_networks(self.network1['id'])
1072 3dabe5d2 Stavros Sachtouris
        chosen = [net for net in nets if net['id'] == self.network1['id']][0]
1073 3dabe5d2 Stavros Sachtouris
        chosen.pop('updated')
1074 3dabe5d2 Stavros Sachtouris
        net1 = dict(self.network1)
1075 3dabe5d2 Stavros Sachtouris
        net1.pop('updated')
1076 3dabe5d2 Stavros Sachtouris
        self.assert_dicts_are_deeply_equal(chosen, net1)
1077 3dabe5d2 Stavros Sachtouris
1078 3dabe5d2 Stavros Sachtouris
    @if_not_all
1079 3dabe5d2 Stavros Sachtouris
    def test_connect_server(self):
1080 3dabe5d2 Stavros Sachtouris
        """Test connect_server"""
1081 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
1082 3dabe5d2 Stavros Sachtouris
            self.flavorid,
1083 3dabe5d2 Stavros Sachtouris
            self.img)
1084 3dabe5d2 Stavros Sachtouris
        self.network1 = self._create_network(self.netname1)
1085 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'BUILD')
1086 3dabe5d2 Stavros Sachtouris
        self._wait_for_network(self.network1['id'], 'ACTIVE')
1087 3dabe5d2 Stavros Sachtouris
        self._test_connect_server()
1088 3dabe5d2 Stavros Sachtouris
1089 3dabe5d2 Stavros Sachtouris
    def _test_connect_server(self):
1090 3dabe5d2 Stavros Sachtouris
        self.client.connect_server(self.server1['id'], self.network1['id'])
1091 3dabe5d2 Stavros Sachtouris
        self.assertTrue(self._wait_for_nic(self.network1['id'],
1092 3dabe5d2 Stavros Sachtouris
            self.server1['id']))
1093 3dabe5d2 Stavros Sachtouris
1094 3dabe5d2 Stavros Sachtouris
    @if_not_all
1095 3dabe5d2 Stavros Sachtouris
    def test_disconnect_server(self):
1096 3dabe5d2 Stavros Sachtouris
        """Test disconnect_server"""
1097 3dabe5d2 Stavros Sachtouris
        self.test_connect_server()
1098 3dabe5d2 Stavros Sachtouris
        self._test_disconnect_server()
1099 3dabe5d2 Stavros Sachtouris
1100 3dabe5d2 Stavros Sachtouris
    def _test_disconnect_server(self):
1101 3dabe5d2 Stavros Sachtouris
        self.client.disconnect_server(self.server1['id'], self.network1['id'])
1102 3dabe5d2 Stavros Sachtouris
        self.assertTrue(self._wait_for_nic(self.network1['id'],
1103 3dabe5d2 Stavros Sachtouris
            self.server1['id'],
1104 3dabe5d2 Stavros Sachtouris
            in_creation=False))
1105 3dabe5d2 Stavros Sachtouris
1106 3dabe5d2 Stavros Sachtouris
    @if_not_all
1107 3dabe5d2 Stavros Sachtouris
    def test_list_server_nics(self):
1108 3dabe5d2 Stavros Sachtouris
        """Test list_server_nics"""
1109 3dabe5d2 Stavros Sachtouris
        self.server1 = self._create_server(self.servname1,
1110 3dabe5d2 Stavros Sachtouris
            self.flavorid,
1111 3dabe5d2 Stavros Sachtouris
            self.img)
1112 3dabe5d2 Stavros Sachtouris
        self.network2 = self._create_network(self.netname2)
1113 3dabe5d2 Stavros Sachtouris
        self._wait_for_status(self.server1['id'], 'BUILD')
1114 3dabe5d2 Stavros Sachtouris
        self._wait_for_network(self.network2['id'], 'ACTIVE')
1115 3dabe5d2 Stavros Sachtouris
        self._test_list_server_nics()
1116 3dabe5d2 Stavros Sachtouris
1117 3dabe5d2 Stavros Sachtouris
    def _test_list_server_nics(self):
1118 3dabe5d2 Stavros Sachtouris
        r = self.client.list_server_nics(self.server1['id'])
1119 3dabe5d2 Stavros Sachtouris
        len0 = len(r)
1120 3dabe5d2 Stavros Sachtouris
1121 3dabe5d2 Stavros Sachtouris
        self.client.connect_server(self.server1['id'], self.network2['id'])
1122 3dabe5d2 Stavros Sachtouris
        self.assertTrue(self._wait_for_nic(self.network2['id'],
1123 3dabe5d2 Stavros Sachtouris
            self.server1['id']))
1124 3dabe5d2 Stavros Sachtouris
        r = self.client.list_server_nics(self.server1['id'])
1125 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r) > len0)
1126 3dabe5d2 Stavros Sachtouris
1127 3dabe5d2 Stavros Sachtouris
    @if_not_all
1128 3dabe5d2 Stavros Sachtouris
    def test_get_network_details(self):
1129 3dabe5d2 Stavros Sachtouris
        """Test get_network_details"""
1130 3dabe5d2 Stavros Sachtouris
        self.network1 = self._create_network(self.netname1)
1131 3dabe5d2 Stavros Sachtouris
        self._test_get_network_details()
1132 3dabe5d2 Stavros Sachtouris
1133 3dabe5d2 Stavros Sachtouris
    def _test_get_network_details(self):
1134 3dabe5d2 Stavros Sachtouris
        r = self.client.get_network_details(self.network1['id'])
1135 3dabe5d2 Stavros Sachtouris
        net1 = dict(self.network1)
1136 3dabe5d2 Stavros Sachtouris
        net1.pop('status')
1137 3dabe5d2 Stavros Sachtouris
        net1.pop('updated', None)
1138 3dabe5d2 Stavros Sachtouris
        net1.pop('attachments')
1139 3dabe5d2 Stavros Sachtouris
        r.pop('status')
1140 3dabe5d2 Stavros Sachtouris
        r.pop('updated', None)
1141 3dabe5d2 Stavros Sachtouris
        r.pop('attachments')
1142 3dabe5d2 Stavros Sachtouris
        self.assert_dicts_are_deeply_equal(net1, r)
1143 3dabe5d2 Stavros Sachtouris
1144 3dabe5d2 Stavros Sachtouris
    @if_not_all
1145 3dabe5d2 Stavros Sachtouris
    def test_update_network_name(self):
1146 3dabe5d2 Stavros Sachtouris
        self.network2 = self._create_network(self.netname2)
1147 3dabe5d2 Stavros Sachtouris
        self._test_update_network_name()
1148 3dabe5d2 Stavros Sachtouris
1149 3dabe5d2 Stavros Sachtouris
    def _test_update_network_name(self):
1150 3dabe5d2 Stavros Sachtouris
        updated_name = self.netname2 + '_upd'
1151 3dabe5d2 Stavros Sachtouris
        self.client.update_network_name(self.network2['id'], updated_name)
1152 3dabe5d2 Stavros Sachtouris
        wait = 3
1153 3dabe5d2 Stavros Sachtouris
        c = ['|', '/', '-', '\\']
1154 3dabe5d2 Stavros Sachtouris
        r = self.client.get_network_details(self.network2['id'])
1155 3dabe5d2 Stavros Sachtouris
        while wait < 50:
1156 3dabe5d2 Stavros Sachtouris
            if r['name'] == updated_name:
1157 3dabe5d2 Stavros Sachtouris
                break
1158 3dabe5d2 Stavros Sachtouris
            sys.stdout.write(
1159 3dabe5d2 Stavros Sachtouris
                '\twait for %s renaming (%s->%s) %ss  ' % (self.network2['id'],
1160 3dabe5d2 Stavros Sachtouris
                self.network2['name'],
1161 3dabe5d2 Stavros Sachtouris
                updated_name, wait))
1162 3dabe5d2 Stavros Sachtouris
            for i in range(4 * wait):
1163 3dabe5d2 Stavros Sachtouris
                sys.stdout.write('\b%s' % c[i % 4])
1164 3dabe5d2 Stavros Sachtouris
                sys.stdout.flush()
1165 3dabe5d2 Stavros Sachtouris
                time.sleep(0.25)
1166 3dabe5d2 Stavros Sachtouris
            print('')
1167 3dabe5d2 Stavros Sachtouris
            wait += 3
1168 3dabe5d2 Stavros Sachtouris
            r = self.client.get_network_details(self.network2['id'])
1169 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['name'], updated_name)
1170 3dabe5d2 Stavros Sachtouris
1171 3dabe5d2 Stavros Sachtouris
    """ Don't have auth to test this
1172 3dabe5d2 Stavros Sachtouris
    @if_not_all
1173 3dabe5d2 Stavros Sachtouris
    def test_delete_image(self):
1174 3dabe5d2 Stavros Sachtouris
        ""Test delete_image""
1175 3dabe5d2 Stavros Sachtouris
        self._test_delete_image()
1176 3dabe5d2 Stavros Sachtouris
    def _test_delete_image(self):
1177 3dabe5d2 Stavros Sachtouris
        images = self.client.list_images()
1178 3dabe5d2 Stavros Sachtouris
        self.client.delete_image(images[2]['id'])
1179 3dabe5d2 Stavros Sachtouris
        try:
1180 3dabe5d2 Stavros Sachtouris
            r = self.client.get_image_details(images[2]['id'], success=(400))
1181 3dabe5d2 Stavros Sachtouris
        except ClientError as err:
1182 3dabe5d2 Stavros Sachtouris
            self.assertEqual(err.status, 404)
1183 3dabe5d2 Stavros Sachtouris

1184 3dabe5d2 Stavros Sachtouris
    @if_not_all
1185 3dabe5d2 Stavros Sachtouris
    def test_create_image_metadata(self):
1186 3dabe5d2 Stavros Sachtouris
        ""Test create_image_metadata""
1187 3dabe5d2 Stavros Sachtouris
        self._test_create_image_metadata()
1188 3dabe5d2 Stavros Sachtouris
    def _test_create_image_metadata(self):
1189 3dabe5d2 Stavros Sachtouris
        r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
1190 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['mykey'], 'myval')
1191 3dabe5d2 Stavros Sachtouris

1192 3dabe5d2 Stavros Sachtouris
    @if_not_all
1193 3dabe5d2 Stavros Sachtouris
    def test_update_image_metadata(self):
1194 3dabe5d2 Stavros Sachtouris
        ""Test update_image_metadata""
1195 3dabe5d2 Stavros Sachtouris
        self._test_update_image_metadata()
1196 3dabe5d2 Stavros Sachtouris
    def _test_update_image_metadata(self):
1197 3dabe5d2 Stavros Sachtouris
        r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
1198 3dabe5d2 Stavros Sachtouris
        r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
1199 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['mykey0'], 'myval0')
1200 3dabe5d2 Stavros Sachtouris

1201 3dabe5d2 Stavros Sachtouris
    @if_not_all
1202 3dabe5d2 Stavros Sachtouris
    def test_delete_image_metadata(self):
1203 3dabe5d2 Stavros Sachtouris
        ""Test delete_image_metadata""
1204 3dabe5d2 Stavros Sachtouris
        self._test_delete_image_metadata()
1205 3dabe5d2 Stavros Sachtouris
    def _test_delete_image_metadata(self):
1206 3dabe5d2 Stavros Sachtouris
        self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
1207 3dabe5d2 Stavros Sachtouris
        self.client.delete_image_metadata(self.img, 'mykey1')
1208 3dabe5d2 Stavros Sachtouris
        r = self.client.get_image_metadata(self.img)
1209 3dabe5d2 Stavros Sachtouris
        self.assertNotEqual('mykey1' in r)
1210 3dabe5d2 Stavros Sachtouris
    """
1211 3dabe5d2 Stavros Sachtouris
1212 71286858 Stavros Sachtouris
1213 edbee9c8 Stavros Sachtouris
class testPithos(unittest.TestCase):
1214 3dabe5d2 Stavros Sachtouris
    """Set up a Pithos+ thorough test"""
1215 3dabe5d2 Stavros Sachtouris
    def setUp(self):
1216 277ca4ed Dionysis Zindros
        _init_cnf()
1217 7d91734c Stavros Sachtouris
        global cnf
1218 7d91734c Stavros Sachtouris
        url = cnf.get('store', 'url')
1219 3dabe5d2 Stavros Sachtouris
1220 3dabe5d2 Stavros Sachtouris
        global token
1221 3dabe5d2 Stavros Sachtouris
        global global_username
1222 7d91734c Stavros Sachtouris
        account = global_username
1223 3dabe5d2 Stavros Sachtouris
1224 3dabe5d2 Stavros Sachtouris
        """
1225 3dabe5d2 Stavros Sachtouris
        url='https://pithos.okeanos.io/v1'
1226 3dabe5d2 Stavros Sachtouris
        """
1227 3dabe5d2 Stavros Sachtouris
1228 3dabe5d2 Stavros Sachtouris
        """
1229 3dabe5d2 Stavros Sachtouris
        def add_handler(name, level, prefix=''):
1230 3dabe5d2 Stavros Sachtouris
            h = logging.StreamHandler()
1231 3dabe5d2 Stavros Sachtouris
            fmt = logging.Formatter(prefix + '%(message)s')
1232 3dabe5d2 Stavros Sachtouris
            h.setFormatter(fmt)
1233 3dabe5d2 Stavros Sachtouris
            logger = logging.getLogger(name)
1234 3dabe5d2 Stavros Sachtouris
            logger.addHandler(h)
1235 3dabe5d2 Stavros Sachtouris
            logger.setLevel(level)
1236 3dabe5d2 Stavros Sachtouris
        import logging
1237 3dabe5d2 Stavros Sachtouris
        sendlog = logging.getLogger('clients.send')
1238 3dabe5d2 Stavros Sachtouris
        recvlog = logging.getLogger('clients.recv')
1239 3dabe5d2 Stavros Sachtouris
        add_handler('requests', logging.INFO, prefix='* ')
1240 3dabe5d2 Stavros Sachtouris
        add_handler('clients.send', logging.INFO, prefix='> ')
1241 3dabe5d2 Stavros Sachtouris
        add_handler('clients.recv', logging.INFO, prefix='< ')
1242 3dabe5d2 Stavros Sachtouris
        """
1243 3dabe5d2 Stavros Sachtouris
1244 3dabe5d2 Stavros Sachtouris
        self.fname = None
1245 3dabe5d2 Stavros Sachtouris
        container = None
1246 3dabe5d2 Stavros Sachtouris
        self.client = pithos(url, token, account, container)
1247 3dabe5d2 Stavros Sachtouris
        self.now = time.mktime(time.gmtime())
1248 3dabe5d2 Stavros Sachtouris
        self.c1 = 'c1_' + unicode(self.now)
1249 3dabe5d2 Stavros Sachtouris
        self.c2 = 'c2_' + unicode(self.now)
1250 3dabe5d2 Stavros Sachtouris
        self.c3 = 'c3_' + unicode(self.now)
1251 3dabe5d2 Stavros Sachtouris
1252 3dabe5d2 Stavros Sachtouris
        self.client.create_container(self.c1)
1253 3dabe5d2 Stavros Sachtouris
        self.client.create_container(self.c2)
1254 3dabe5d2 Stavros Sachtouris
        self.client.create_container(self.c3)
1255 3dabe5d2 Stavros Sachtouris
        self.makeNewObject(self.c1, 'test')
1256 3dabe5d2 Stavros Sachtouris
        self.makeNewObject(self.c2, 'test')
1257 3dabe5d2 Stavros Sachtouris
        self.now_unformated = datetime.datetime.utcnow()
1258 3dabe5d2 Stavros Sachtouris
        self.makeNewObject(self.c1, 'test1')
1259 3dabe5d2 Stavros Sachtouris
        self.makeNewObject(self.c2, 'test1')
1260 3dabe5d2 Stavros Sachtouris
        """Prepare an object to be shared - also its container"""
1261 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c1
1262 3dabe5d2 Stavros Sachtouris
        self.client.object_post('test',
1263 3dabe5d2 Stavros Sachtouris
            update=True,
1264 3dabe5d2 Stavros Sachtouris
            permissions={'read': 'someUser'})
1265 3dabe5d2 Stavros Sachtouris
1266 3dabe5d2 Stavros Sachtouris
        self.makeNewObject(self.c1, 'another.test')
1267 3dabe5d2 Stavros Sachtouris
1268 3dabe5d2 Stavros Sachtouris
    def makeNewObject(self, container, obj):
1269 3dabe5d2 Stavros Sachtouris
        self.client.container = container
1270 3dabe5d2 Stavros Sachtouris
        self.client.object_put(obj,
1271 3dabe5d2 Stavros Sachtouris
            content_type='application/octet-stream',
1272 3dabe5d2 Stavros Sachtouris
            data='file %s that lives in %s' % (obj, container),
1273 3dabe5d2 Stavros Sachtouris
            metadata={'incontainer': container})
1274 3dabe5d2 Stavros Sachtouris
1275 3dabe5d2 Stavros Sachtouris
    def forceDeleteContainer(self, container):
1276 3dabe5d2 Stavros Sachtouris
        self.client.container = container
1277 3dabe5d2 Stavros Sachtouris
        try:
1278 3dabe5d2 Stavros Sachtouris
            r = self.client.list_objects()
1279 3dabe5d2 Stavros Sachtouris
        except ClientError:
1280 3dabe5d2 Stavros Sachtouris
            return
1281 3dabe5d2 Stavros Sachtouris
        for obj in r:
1282 3dabe5d2 Stavros Sachtouris
            name = obj['name']
1283 3dabe5d2 Stavros Sachtouris
            self.client.del_object(name)
1284 3dabe5d2 Stavros Sachtouris
        r = self.client.container_delete()
1285 3dabe5d2 Stavros Sachtouris
        self.container = ''
1286 3dabe5d2 Stavros Sachtouris
1287 3dabe5d2 Stavros Sachtouris
    def tearDown(self):
1288 3dabe5d2 Stavros Sachtouris
        """Destroy test cases"""
1289 3dabe5d2 Stavros Sachtouris
        if self.fname is not None:
1290 3dabe5d2 Stavros Sachtouris
            try:
1291 3dabe5d2 Stavros Sachtouris
                os.remove(self.fname)
1292 3dabe5d2 Stavros Sachtouris
            except OSError:
1293 3dabe5d2 Stavros Sachtouris
                pass
1294 3dabe5d2 Stavros Sachtouris
            self.fname = None
1295 3dabe5d2 Stavros Sachtouris
        self.forceDeleteContainer(self.c1)
1296 3dabe5d2 Stavros Sachtouris
        self.forceDeleteContainer(self.c2)
1297 3dabe5d2 Stavros Sachtouris
        try:
1298 3dabe5d2 Stavros Sachtouris
            self.forceDeleteContainer(self.c3)
1299 3dabe5d2 Stavros Sachtouris
        except ClientError:
1300 3dabe5d2 Stavros Sachtouris
            pass
1301 3dabe5d2 Stavros Sachtouris
        self.client.container = ''
1302 3dabe5d2 Stavros Sachtouris
1303 3dabe5d2 Stavros Sachtouris
    def test_000(self):
1304 3dabe5d2 Stavros Sachtouris
        """Perform a full Pithos+ kamaki support test"""
1305 3dabe5d2 Stavros Sachtouris
1306 3dabe5d2 Stavros Sachtouris
    def test_account_head(self):
1307 3dabe5d2 Stavros Sachtouris
        """Test account_HEAD"""
1308 3dabe5d2 Stavros Sachtouris
        r = self.client.account_head()
1309 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 204)
1310 3dabe5d2 Stavros Sachtouris
1311 3dabe5d2 Stavros Sachtouris
        r = self.client.account_head(until='1000000000')
1312 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 204)
1313 3dabe5d2 Stavros Sachtouris
1314 3dabe5d2 Stavros Sachtouris
        r = self.client.get_account_info(until='1000000000')
1315 3dabe5d2 Stavros Sachtouris
        datestring = unicode(r['x-account-until-timestamp'])
1316 3dabe5d2 Stavros Sachtouris
        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1317 3dabe5d2 Stavros Sachtouris
1318 3dabe5d2 Stavros Sachtouris
        r = self.client.get_account_quota()
1319 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-account-policy-quota' in r)
1320 3dabe5d2 Stavros Sachtouris
1321 3dabe5d2 Stavros Sachtouris
        r = self.client.get_account_versioning()
1322 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-account-policy-versioning' in r)
1323 3dabe5d2 Stavros Sachtouris
1324 3dabe5d2 Stavros Sachtouris
        """Check if(un)modified_since"""
1325 3dabe5d2 Stavros Sachtouris
        for format in self.client.DATE_FORMATS:
1326 3dabe5d2 Stavros Sachtouris
            now_formated = self.now_unformated.strftime(format)
1327 3dabe5d2 Stavros Sachtouris
            r1 = self.client.account_head(if_modified_since=now_formated,
1328 3dabe5d2 Stavros Sachtouris
                success=(204, 304, 412))
1329 3dabe5d2 Stavros Sachtouris
            sc1 = r1.status_code
1330 3dabe5d2 Stavros Sachtouris
            r1.release()
1331 3dabe5d2 Stavros Sachtouris
            r2 = self.client.account_head(if_unmodified_since=now_formated,
1332 3dabe5d2 Stavros Sachtouris
                success=(204, 304, 412))
1333 3dabe5d2 Stavros Sachtouris
            sc2 = r2.status_code
1334 3dabe5d2 Stavros Sachtouris
            r2.release()
1335 3dabe5d2 Stavros Sachtouris
            self.assertNotEqual(sc1, sc2)
1336 3dabe5d2 Stavros Sachtouris
1337 3dabe5d2 Stavros Sachtouris
    def test_account_get(self):
1338 3dabe5d2 Stavros Sachtouris
        """Test account_GET"""
1339 3dabe5d2 Stavros Sachtouris
        #r = self.client.account_get()
1340 3dabe5d2 Stavros Sachtouris
        #self.assertEqual(r.status_code, 200)
1341 3dabe5d2 Stavros Sachtouris
        r = self.client.list_containers()
1342 3dabe5d2 Stavros Sachtouris
        fullLen = len(r)
1343 3dabe5d2 Stavros Sachtouris
        self.assertTrue(fullLen > 2)
1344 3dabe5d2 Stavros Sachtouris
1345 3dabe5d2 Stavros Sachtouris
        r = self.client.account_get(limit=1)
1346 3dabe5d2 Stavros Sachtouris
        self.assertEqual(len(r.json), 1)
1347 3dabe5d2 Stavros Sachtouris
1348 3dabe5d2 Stavros Sachtouris
        r = self.client.account_get(marker='c2_')
1349 3dabe5d2 Stavros Sachtouris
        temp_c0 = r.json[0]['name']
1350 3dabe5d2 Stavros Sachtouris
        temp_c2 = r.json[2]['name']
1351 3dabe5d2 Stavros Sachtouris
1352 3dabe5d2 Stavros Sachtouris
        r = self.client.account_get(limit=2, marker='c2_')
1353 3dabe5d2 Stavros Sachtouris
        conames = [container['name'] for container in r.json \
1354 3dabe5d2 Stavros Sachtouris
            if container['name'].lower().startswith('c2_')]
1355 3dabe5d2 Stavros Sachtouris
        self.assertTrue(temp_c0 in conames)
1356 3dabe5d2 Stavros Sachtouris
        self.assertFalse(temp_c2 in conames)
1357 3dabe5d2 Stavros Sachtouris
1358 3dabe5d2 Stavros Sachtouris
        r = self.client.account_get(show_only_shared=True)
1359 3dabe5d2 Stavros Sachtouris
        self.assertTrue(self.c1 in [c['name'] for c in r.json])
1360 3dabe5d2 Stavros Sachtouris
1361 3dabe5d2 Stavros Sachtouris
        r = self.client.account_get(until=1342609206)
1362 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r.json) <= fullLen)
1363 3dabe5d2 Stavros Sachtouris
1364 3dabe5d2 Stavros Sachtouris
        """Check if(un)modified_since"""
1365 3dabe5d2 Stavros Sachtouris
        for format in self.client.DATE_FORMATS:
1366 3dabe5d2 Stavros Sachtouris
            now_formated = self.now_unformated.strftime(format)
1367 3dabe5d2 Stavros Sachtouris
            r1 = self.client.account_get(if_modified_since=now_formated,
1368 3dabe5d2 Stavros Sachtouris
                success=(200, 304, 412))
1369 3dabe5d2 Stavros Sachtouris
            sc1 = r1.status_code
1370 3dabe5d2 Stavros Sachtouris
            r1.release()
1371 3dabe5d2 Stavros Sachtouris
            r2 = self.client.account_get(if_unmodified_since=now_formated,
1372 3dabe5d2 Stavros Sachtouris
                success=(200, 304, 412))
1373 3dabe5d2 Stavros Sachtouris
            sc2 = r2.status_code
1374 3dabe5d2 Stavros Sachtouris
            r2.release()
1375 3dabe5d2 Stavros Sachtouris
            self.assertNotEqual(sc1, sc2)
1376 3dabe5d2 Stavros Sachtouris
1377 3dabe5d2 Stavros Sachtouris
        """Check sharing_accounts"""
1378 3dabe5d2 Stavros Sachtouris
        r = self.client.get_sharing_accounts()
1379 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r) > 0)
1380 3dabe5d2 Stavros Sachtouris
1381 3dabe5d2 Stavros Sachtouris
    def test_account_post(self):
1382 3dabe5d2 Stavros Sachtouris
        """Test account_POST"""
1383 3dabe5d2 Stavros Sachtouris
        r = self.client.account_post()
1384 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
1385 3dabe5d2 Stavros Sachtouris
        grpName = 'grp' + unicode(self.now)
1386 3dabe5d2 Stavros Sachtouris
1387 3dabe5d2 Stavros Sachtouris
        """Method set/del_account_meta and set_account_groupcall use
1388 3dabe5d2 Stavros Sachtouris
            account_post internally
1389 3dabe5d2 Stavros Sachtouris
        """
1390 3dabe5d2 Stavros Sachtouris
        self.client.set_account_group(grpName, ['u1', 'u2'])
1391 3dabe5d2 Stavros Sachtouris
        r = self.client.get_account_group()
1392 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-account-group-' + grpName], 'u1,u2')
1393 3dabe5d2 Stavros Sachtouris
        self.client.del_account_group(grpName)
1394 3dabe5d2 Stavros Sachtouris
        r = self.client.get_account_group()
1395 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-account-group-' + grpName not in r)
1396 3dabe5d2 Stavros Sachtouris
1397 3dabe5d2 Stavros Sachtouris
        mprefix = 'meta' + unicode(self.now)
1398 3dabe5d2 Stavros Sachtouris
        self.client.set_account_meta({mprefix + '1': 'v1',
1399 3dabe5d2 Stavros Sachtouris
            mprefix + '2': 'v2'})
1400 3dabe5d2 Stavros Sachtouris
        r = self.client.get_account_meta()
1401 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-account-meta-' + mprefix + '1'], 'v1')
1402 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-account-meta-' + mprefix + '2'], 'v2')
1403 3dabe5d2 Stavros Sachtouris
1404 3dabe5d2 Stavros Sachtouris
        self.client.del_account_meta(mprefix + '1')
1405 3dabe5d2 Stavros Sachtouris
        r = self.client.get_account_meta()
1406 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-account-meta-' + mprefix + '1' not in r)
1407 3dabe5d2 Stavros Sachtouris
1408 3dabe5d2 Stavros Sachtouris
        self.client.del_account_meta(mprefix + '2')
1409 3dabe5d2 Stavros Sachtouris
        r = self.client.get_account_meta()
1410 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-account-meta-' + mprefix + '2' not in r)
1411 3dabe5d2 Stavros Sachtouris
1412 3dabe5d2 Stavros Sachtouris
        """Missing testing for quota, versioning, because normally
1413 7d91734c Stavros Sachtouris
        you don't have permissions to modify those at account level
1414 3dabe5d2 Stavros Sachtouris
        """
1415 3dabe5d2 Stavros Sachtouris
1416 3dabe5d2 Stavros Sachtouris
        newquota = 1000000
1417 3dabe5d2 Stavros Sachtouris
        self.client.set_account_quota(newquota)
1418 3dabe5d2 Stavros Sachtouris
        #r = self.client.get_account_info()
1419 3dabe5d2 Stavros Sachtouris
        #print(unicode(r))
1420 3dabe5d2 Stavros Sachtouris
        #r = self.client.get_account_quota()
1421 3dabe5d2 Stavros Sachtouris
        #self.assertEqual(r['x-account-policy-quota'], newquota)
1422 3dabe5d2 Stavros Sachtouris
        self.client.set_account_versioning('auto')
1423 3dabe5d2 Stavros Sachtouris
1424 3dabe5d2 Stavros Sachtouris
    def test_container_head(self):
1425 3dabe5d2 Stavros Sachtouris
        """Test container_HEAD"""
1426 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c1
1427 3dabe5d2 Stavros Sachtouris
1428 3dabe5d2 Stavros Sachtouris
        r = self.client.container_head()
1429 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 204)
1430 3dabe5d2 Stavros Sachtouris
1431 3dabe5d2 Stavros Sachtouris
        """Check until"""
1432 3dabe5d2 Stavros Sachtouris
        r = self.client.container_head(until=1000000, success=(204, 404))
1433 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 404)
1434 3dabe5d2 Stavros Sachtouris
1435 3dabe5d2 Stavros Sachtouris
        """Check and if(un)modified_since"""
1436 3dabe5d2 Stavros Sachtouris
        for format in self.client.DATE_FORMATS:
1437 3dabe5d2 Stavros Sachtouris
            now_formated = self.now_unformated.strftime(format)
1438 3dabe5d2 Stavros Sachtouris
            r1 = self.client.container_head(if_modified_since=now_formated,
1439 3dabe5d2 Stavros Sachtouris
                success=(204, 304, 412))
1440 3dabe5d2 Stavros Sachtouris
            sc1 = r1.status_code
1441 3dabe5d2 Stavros Sachtouris
            r1.release()
1442 3dabe5d2 Stavros Sachtouris
            r2 = self.client.container_head(if_unmodified_since=now_formated,
1443 3dabe5d2 Stavros Sachtouris
                success=(204, 304, 412))
1444 3dabe5d2 Stavros Sachtouris
            sc2 = r2.status_code
1445 3dabe5d2 Stavros Sachtouris
            r2.release()
1446 3dabe5d2 Stavros Sachtouris
            self.assertNotEqual(sc1, sc2)
1447 3dabe5d2 Stavros Sachtouris
1448 3dabe5d2 Stavros Sachtouris
        """Check container object meta"""
1449 3dabe5d2 Stavros Sachtouris
        r = self.client.get_container_object_meta()
1450 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-container-object-meta'], 'Incontainer')
1451 3dabe5d2 Stavros Sachtouris
1452 3dabe5d2 Stavros Sachtouris
    def test_container_get(self):
1453 3dabe5d2 Stavros Sachtouris
        """Test container_GET"""
1454 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c1
1455 3dabe5d2 Stavros Sachtouris
1456 3dabe5d2 Stavros Sachtouris
        r = self.client.container_get()
1457 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
1458 3dabe5d2 Stavros Sachtouris
        fullLen = len(r.json)
1459 3dabe5d2 Stavros Sachtouris
1460 3dabe5d2 Stavros Sachtouris
        r = self.client.container_get(prefix='test')
1461 3dabe5d2 Stavros Sachtouris
        lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
1462 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r.json) > 1)
1463 3dabe5d2 Stavros Sachtouris
        self.assertEqual(len(r.json), len(lalobjects))
1464 3dabe5d2 Stavros Sachtouris
1465 3dabe5d2 Stavros Sachtouris
        r = self.client.container_get(limit=1)
1466 3dabe5d2 Stavros Sachtouris
        self.assertEqual(len(r.json), 1)
1467 3dabe5d2 Stavros Sachtouris
1468 3dabe5d2 Stavros Sachtouris
        r = self.client.container_get(marker='another')
1469 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r.json) > 1)
1470 3dabe5d2 Stavros Sachtouris
        neobjects = [obj for obj in r.json if obj['name'] > 'another']
1471 3dabe5d2 Stavros Sachtouris
        self.assertEqual(len(r.json), len(neobjects))
1472 3dabe5d2 Stavros Sachtouris
1473 3dabe5d2 Stavros Sachtouris
        r = self.client.container_get(prefix='another.test', delimiter='.')
1474 3dabe5d2 Stavros Sachtouris
        self.assertTrue(fullLen > len(r.json))
1475 3dabe5d2 Stavros Sachtouris
1476 3dabe5d2 Stavros Sachtouris
        r = self.client.container_get(path='/')
1477 3dabe5d2 Stavros Sachtouris
        self.assertEqual(fullLen, len(r.json))
1478 3dabe5d2 Stavros Sachtouris
1479 3dabe5d2 Stavros Sachtouris
        r = self.client.container_get(format='xml')
1480 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.text.split()[4], 'name="' + self.c1 + '">')
1481 3dabe5d2 Stavros Sachtouris
1482 3dabe5d2 Stavros Sachtouris
        r = self.client.container_get(meta=['incontainer'])
1483 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r.json) > 0)
1484 3dabe5d2 Stavros Sachtouris
1485 3dabe5d2 Stavros Sachtouris
        r = self.client.container_get(show_only_shared=True)
1486 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r.json) < fullLen)
1487 3dabe5d2 Stavros Sachtouris
1488 3dabe5d2 Stavros Sachtouris
        try:
1489 3dabe5d2 Stavros Sachtouris
            r = self.client.container_get(until=1000000000)
1490 3dabe5d2 Stavros Sachtouris
            datestring = unicode(r.headers['x-account-until-timestamp'])
1491 3dabe5d2 Stavros Sachtouris
            self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
1492 3dabe5d2 Stavros Sachtouris
1493 3dabe5d2 Stavros Sachtouris
        except ClientError:
1494 3dabe5d2 Stavros Sachtouris
1495 3dabe5d2 Stavros Sachtouris
            pass
1496 3dabe5d2 Stavros Sachtouris
1497 3dabe5d2 Stavros Sachtouris
        """Check and if un/modified_since"""
1498 3dabe5d2 Stavros Sachtouris
        for format in self.client.DATE_FORMATS:
1499 3dabe5d2 Stavros Sachtouris
            now_formated = self.now_unformated.strftime(format)
1500 3dabe5d2 Stavros Sachtouris
            r1 = self.client.container_get(if_modified_since=now_formated,
1501 3dabe5d2 Stavros Sachtouris
                success=(200, 304, 412))
1502 3dabe5d2 Stavros Sachtouris
            sc1 = r1.status_code
1503 3dabe5d2 Stavros Sachtouris
            r1.release()
1504 3dabe5d2 Stavros Sachtouris
            r2 = self.client.container_get(if_unmodified_since=now_formated,
1505 3dabe5d2 Stavros Sachtouris
                success=(200, 304, 412))
1506 3dabe5d2 Stavros Sachtouris
            sc2 = r2.status_code
1507 3dabe5d2 Stavros Sachtouris
            r2.release()
1508 3dabe5d2 Stavros Sachtouris
            self.assertNotEqual(sc1, sc2)
1509 3dabe5d2 Stavros Sachtouris
1510 3dabe5d2 Stavros Sachtouris
    def test_container_put(self):
1511 3dabe5d2 Stavros Sachtouris
        """Test container_PUT"""
1512 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c2
1513 3dabe5d2 Stavros Sachtouris
1514 3dabe5d2 Stavros Sachtouris
        r = self.client.container_put()
1515 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
1516 3dabe5d2 Stavros Sachtouris
1517 3dabe5d2 Stavros Sachtouris
        r = self.client.get_container_quota(self.client.container)
1518 3dabe5d2 Stavros Sachtouris
        cquota = r.values()[0]
1519 3dabe5d2 Stavros Sachtouris
        newquota = 2 * int(cquota)
1520 3dabe5d2 Stavros Sachtouris
1521 3dabe5d2 Stavros Sachtouris
        r = self.client.container_put(quota=newquota)
1522 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
1523 3dabe5d2 Stavros Sachtouris
1524 3dabe5d2 Stavros Sachtouris
        r = self.client.get_container_quota(self.client.container)
1525 3dabe5d2 Stavros Sachtouris
        xquota = int(r.values()[0])
1526 3dabe5d2 Stavros Sachtouris
        self.assertEqual(newquota, xquota)
1527 3dabe5d2 Stavros Sachtouris
1528 3dabe5d2 Stavros Sachtouris
        r = self.client.container_put(versioning='auto')
1529 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
1530 3dabe5d2 Stavros Sachtouris
1531 3dabe5d2 Stavros Sachtouris
        r = self.client.get_container_versioning(self.client.container)
1532 3dabe5d2 Stavros Sachtouris
        nvers = r.values()[0]
1533 3dabe5d2 Stavros Sachtouris
        self.assertEqual('auto', nvers)
1534 3dabe5d2 Stavros Sachtouris
1535 3dabe5d2 Stavros Sachtouris
        r = self.client.container_put(versioning='none')
1536 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
1537 3dabe5d2 Stavros Sachtouris
1538 3dabe5d2 Stavros Sachtouris
        r = self.client.get_container_versioning(self.client.container)
1539 3dabe5d2 Stavros Sachtouris
        nvers = r.values()[0]
1540 3dabe5d2 Stavros Sachtouris
        self.assertEqual('none', nvers)
1541 3dabe5d2 Stavros Sachtouris
1542 3dabe5d2 Stavros Sachtouris
        r = self.client.container_put(metadata={'m1': 'v1', 'm2': 'v2'})
1543 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
1544 3dabe5d2 Stavros Sachtouris
1545 3dabe5d2 Stavros Sachtouris
        r = self.client.get_container_meta(self.client.container)
1546 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-container-meta-m1' in r)
1547 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-container-meta-m1'], 'v1')
1548 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-container-meta-m2' in r)
1549 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-container-meta-m2'], 'v2')
1550 3dabe5d2 Stavros Sachtouris
1551 3dabe5d2 Stavros Sachtouris
        r = self.client.container_put(metadata={'m1': '', 'm2': 'v2a'})
1552 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
1553 3dabe5d2 Stavros Sachtouris
1554 3dabe5d2 Stavros Sachtouris
        r = self.client.get_container_meta(self.client.container)
1555 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-container-meta-m1' not in r)
1556 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-container-meta-m2' in r)
1557 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
1558 3dabe5d2 Stavros Sachtouris
1559 3dabe5d2 Stavros Sachtouris
        self.client.del_container_meta(self.client.container)
1560 3dabe5d2 Stavros Sachtouris
1561 3dabe5d2 Stavros Sachtouris
    def test_container_post(self):
1562 3dabe5d2 Stavros Sachtouris
        """Test container_POST"""
1563 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c2
1564 3dabe5d2 Stavros Sachtouris
1565 3dabe5d2 Stavros Sachtouris
        """Simple post"""
1566 3dabe5d2 Stavros Sachtouris
        r = self.client.container_post()
1567 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
1568 3dabe5d2 Stavros Sachtouris
1569 3dabe5d2 Stavros Sachtouris
        """post meta"""
1570 3dabe5d2 Stavros Sachtouris
        self.client.set_container_meta({'m1': 'v1', 'm2': 'v2'})
1571 3dabe5d2 Stavros Sachtouris
        r = self.client.get_container_meta(self.client.container)
1572 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-container-meta-m1' in r)
1573 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-container-meta-m1'], 'v1')
1574 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-container-meta-m2' in r)
1575 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-container-meta-m2'], 'v2')
1576 3dabe5d2 Stavros Sachtouris
1577 3dabe5d2 Stavros Sachtouris
        """post/2del meta"""
1578 3dabe5d2 Stavros Sachtouris
        r = self.client.del_container_meta('m1')
1579 3dabe5d2 Stavros Sachtouris
        r = self.client.set_container_meta({'m2': 'v2a'})
1580 3dabe5d2 Stavros Sachtouris
        r = self.client.get_container_meta(self.client.container)
1581 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-container-meta-m1' not in r)
1582 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-container-meta-m2' in r)
1583 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
1584 3dabe5d2 Stavros Sachtouris
1585 3dabe5d2 Stavros Sachtouris
        """check quota"""
1586 3dabe5d2 Stavros Sachtouris
        r = self.client.get_container_quota(self.client.container)
1587 3dabe5d2 Stavros Sachtouris
        cquota = r.values()[0]
1588 3dabe5d2 Stavros Sachtouris
        newquota = 2 * int(cquota)
1589 3dabe5d2 Stavros Sachtouris
        r = self.client.set_container_quota(newquota)
1590 3dabe5d2 Stavros Sachtouris
        r = self.client.get_container_quota(self.client.container)
1591 3dabe5d2 Stavros Sachtouris
        xquota = int(r.values()[0])
1592 3dabe5d2 Stavros Sachtouris
        self.assertEqual(newquota, xquota)
1593 3dabe5d2 Stavros Sachtouris
        r = self.client.set_container_quota(cquota)
1594 3dabe5d2 Stavros Sachtouris
        r = self.client.get_container_quota(self.client.container)
1595 3dabe5d2 Stavros Sachtouris
        xquota = r.values()[0]
1596 3dabe5d2 Stavros Sachtouris
        self.assertEqual(cquota, xquota)
1597 3dabe5d2 Stavros Sachtouris
1598 3dabe5d2 Stavros Sachtouris
        """Check versioning"""
1599 3dabe5d2 Stavros Sachtouris
        self.client.set_container_versioning('auto')
1600 3dabe5d2 Stavros Sachtouris
        r = self.client.get_container_versioning(self.client.container)
1601 3dabe5d2 Stavros Sachtouris
        nvers = r.values()[0]
1602 3dabe5d2 Stavros Sachtouris
        self.assertEqual('auto', nvers)
1603 3dabe5d2 Stavros Sachtouris
        self.client.set_container_versioning('none')
1604 3dabe5d2 Stavros Sachtouris
        r = self.client.get_container_versioning(self.client.container)
1605 3dabe5d2 Stavros Sachtouris
        nvers = r.values()[0]
1606 3dabe5d2 Stavros Sachtouris
        self.assertEqual('none', nvers)
1607 3dabe5d2 Stavros Sachtouris
1608 3dabe5d2 Stavros Sachtouris
        """put_block uses content_type and content_length to
1609 3dabe5d2 Stavros Sachtouris
        post blocks of data 2 container. All that in upload_object"""
1610 3dabe5d2 Stavros Sachtouris
        """Change a file at fs"""
1611 88382773 Dionysis Zindros
        self.fname = 'l100M.' + unicode(self.now)
1612 88382773 Dionysis Zindros
        self.create_large_file(1024 * 1024 * 100, self.fname)
1613 3dabe5d2 Stavros Sachtouris
        """Upload it at a directory in container"""
1614 3dabe5d2 Stavros Sachtouris
        self.client.create_directory('dir')
1615 746f8419 Dionysis Zindros
        newf = open(self.fname, 'rb')
1616 3dabe5d2 Stavros Sachtouris
        self.client.upload_object('/dir/sample.file', newf)
1617 3dabe5d2 Stavros Sachtouris
        newf.close()
1618 3dabe5d2 Stavros Sachtouris
        """Check if file has been uploaded"""
1619 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_info('/dir/sample.file')
1620 3dabe5d2 Stavros Sachtouris
        self.assertTrue(int(r['content-length']) > 100000000)
1621 3dabe5d2 Stavros Sachtouris
1622 c4993bcf Dionysis Zindros
        """What is tranfer_encoding? What should I check about it? """
1623 3dabe5d2 Stavros Sachtouris
        #TODO
1624 3dabe5d2 Stavros Sachtouris
1625 3dabe5d2 Stavros Sachtouris
        """Check update=False"""
1626 3dabe5d2 Stavros Sachtouris
        r = self.client.object_post('test',
1627 3dabe5d2 Stavros Sachtouris
            update=False,
1628 3dabe5d2 Stavros Sachtouris
            metadata={'newmeta': 'newval'})
1629 3dabe5d2 Stavros Sachtouris
1630 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_info('test')
1631 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-object-meta-newmeta' in r)
1632 3dabe5d2 Stavros Sachtouris
        self.assertFalse('x-object-meta-incontainer' in r)
1633 3dabe5d2 Stavros Sachtouris
1634 3dabe5d2 Stavros Sachtouris
        r = self.client.del_container_meta('m2')
1635 3dabe5d2 Stavros Sachtouris
1636 3dabe5d2 Stavros Sachtouris
    def test_container_delete(self):
1637 3dabe5d2 Stavros Sachtouris
        """Test container_DELETE"""
1638 3dabe5d2 Stavros Sachtouris
1639 3dabe5d2 Stavros Sachtouris
        """Fail to delete a non-empty container"""
1640 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c2
1641 3dabe5d2 Stavros Sachtouris
        r = self.client.container_delete(success=409)
1642 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 409)
1643 3dabe5d2 Stavros Sachtouris
1644 3dabe5d2 Stavros Sachtouris
        """Fail to delete c3 (empty) container"""
1645 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c3
1646 3dabe5d2 Stavros Sachtouris
        r = self.client.container_delete(until='1000000000')
1647 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 204)
1648 3dabe5d2 Stavros Sachtouris
1649 3dabe5d2 Stavros Sachtouris
        """Delete c3 (empty) container"""
1650 3dabe5d2 Stavros Sachtouris
        r = self.client.container_delete()
1651 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 204)
1652 3dabe5d2 Stavros Sachtouris
1653 3dabe5d2 Stavros Sachtouris
        """Purge container(empty a container), check versionlist"""
1654 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c1
1655 3dabe5d2 Stavros Sachtouris
        r = self.client.object_head('test', success=(200, 404))
1656 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
1657 3dabe5d2 Stavros Sachtouris
        self.client.del_container(delimiter='/')
1658 3dabe5d2 Stavros Sachtouris
        r = self.client.object_head('test', success=(200, 404))
1659 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 404)
1660 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_versionlist('test')
1661 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r) > 0)
1662 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r[0]) > 1)
1663 3dabe5d2 Stavros Sachtouris
        self.client.purge_container()
1664 3dabe5d2 Stavros Sachtouris
        self.assertRaises(ClientError,
1665 3dabe5d2 Stavros Sachtouris
            self.client.get_object_versionlist,
1666 3dabe5d2 Stavros Sachtouris
            'test')
1667 3dabe5d2 Stavros Sachtouris
1668 3dabe5d2 Stavros Sachtouris
    def test_object_head(self):
1669 3dabe5d2 Stavros Sachtouris
        """Test object_HEAD"""
1670 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c2
1671 3dabe5d2 Stavros Sachtouris
        obj = 'test'
1672 3dabe5d2 Stavros Sachtouris
1673 3dabe5d2 Stavros Sachtouris
        r = self.client.object_head(obj)
1674 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
1675 3dabe5d2 Stavros Sachtouris
        etag = r.headers['etag']
1676 3dabe5d2 Stavros Sachtouris
1677 3dabe5d2 Stavros Sachtouris
        r = self.client.object_head(obj, version=40)
1678 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.headers['x-object-version'], '40')
1679 3dabe5d2 Stavros Sachtouris
1680 3dabe5d2 Stavros Sachtouris
        r = self.client.object_head(obj, if_etag_match=etag)
1681 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
1682 3dabe5d2 Stavros Sachtouris
1683 3dabe5d2 Stavros Sachtouris
        r = self.client.object_head(obj,
1684 3dabe5d2 Stavros Sachtouris
            if_etag_not_match=etag,
1685 3dabe5d2 Stavros Sachtouris
            success=(200, 412, 304))
1686 3dabe5d2 Stavros Sachtouris
        self.assertNotEqual(r.status_code, 200)
1687 3dabe5d2 Stavros Sachtouris
1688 3dabe5d2 Stavros Sachtouris
        r = self.client.object_head(obj,
1689 3dabe5d2 Stavros Sachtouris
            version=40,
1690 3dabe5d2 Stavros Sachtouris
            if_etag_match=etag,
1691 3dabe5d2 Stavros Sachtouris
            success=412)
1692 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 412)
1693 3dabe5d2 Stavros Sachtouris
1694 3dabe5d2 Stavros Sachtouris
        """Check and if(un)modified_since"""
1695 3dabe5d2 Stavros Sachtouris
        for format in self.client.DATE_FORMATS:
1696 3dabe5d2 Stavros Sachtouris
            now_formated = self.now_unformated.strftime(format)
1697 3dabe5d2 Stavros Sachtouris
            r1 = self.client.object_head(obj, if_modified_since=now_formated,
1698 3dabe5d2 Stavros Sachtouris
                success=(200, 304, 412))
1699 3dabe5d2 Stavros Sachtouris
            sc1 = r1.status_code
1700 3dabe5d2 Stavros Sachtouris
            r1.release()
1701 3dabe5d2 Stavros Sachtouris
            r2 = self.client.object_head(obj, if_unmodified_since=now_formated,
1702 3dabe5d2 Stavros Sachtouris
                success=(200, 304, 412))
1703 3dabe5d2 Stavros Sachtouris
            sc2 = r2.status_code
1704 3dabe5d2 Stavros Sachtouris
            r2.release()
1705 3dabe5d2 Stavros Sachtouris
            self.assertNotEqual(sc1, sc2)
1706 3dabe5d2 Stavros Sachtouris
1707 3dabe5d2 Stavros Sachtouris
    def test_object_get(self):
1708 3dabe5d2 Stavros Sachtouris
        """Test object_GET"""
1709 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c1
1710 3dabe5d2 Stavros Sachtouris
        obj = 'test'
1711 3dabe5d2 Stavros Sachtouris
1712 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj)
1713 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
1714 3dabe5d2 Stavros Sachtouris
1715 3dabe5d2 Stavros Sachtouris
        osize = int(r.headers['content-length'])
1716 3dabe5d2 Stavros Sachtouris
        etag = r.headers['etag']
1717 3dabe5d2 Stavros Sachtouris
1718 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj, hashmap=True)
1719 3dabe5d2 Stavros Sachtouris
        self.assertTrue('hashes' in r.json\
1720 3dabe5d2 Stavros Sachtouris
            and 'block_hash' in r.json\
1721 3dabe5d2 Stavros Sachtouris
            and 'block_size' in r.json\
1722 3dabe5d2 Stavros Sachtouris
            and 'bytes' in r.json)
1723 3dabe5d2 Stavros Sachtouris
1724 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj, format='xml', hashmap=True)
1725 3dabe5d2 Stavros Sachtouris
        self.assertEqual(len(r.text.split('hash>')), 3)
1726 3dabe5d2 Stavros Sachtouris
1727 3dabe5d2 Stavros Sachtouris
        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
1728 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj,
1729 3dabe5d2 Stavros Sachtouris
            data_range=rangestr,
1730 3dabe5d2 Stavros Sachtouris
            success=(200, 206))
1731 3dabe5d2 Stavros Sachtouris
        partsize = int(r.headers['content-length'])
1732 3dabe5d2 Stavros Sachtouris
        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
1733 3dabe5d2 Stavros Sachtouris
1734 3dabe5d2 Stavros Sachtouris
        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
1735 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj,
1736 3dabe5d2 Stavros Sachtouris
            data_range=rangestr,
1737 3dabe5d2 Stavros Sachtouris
            if_range=True,
1738 3dabe5d2 Stavros Sachtouris
            success=(200, 206))
1739 3dabe5d2 Stavros Sachtouris
        partsize = int(r.headers['content-length'])
1740 3dabe5d2 Stavros Sachtouris
        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
1741 3dabe5d2 Stavros Sachtouris
1742 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj, if_etag_match=etag)
1743 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
1744 3dabe5d2 Stavros Sachtouris
1745 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj, if_etag_not_match=etag + 'LALALA')
1746 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
1747 3dabe5d2 Stavros Sachtouris
1748 3dabe5d2 Stavros Sachtouris
        """Check and if(un)modified_since"""
1749 3dabe5d2 Stavros Sachtouris
        for format in self.client.DATE_FORMATS:
1750 3dabe5d2 Stavros Sachtouris
            now_formated = self.now_unformated.strftime(format)
1751 3dabe5d2 Stavros Sachtouris
            r1 = self.client.object_get(obj, if_modified_since=now_formated,
1752 3dabe5d2 Stavros Sachtouris
                success=(200, 304, 412))
1753 3dabe5d2 Stavros Sachtouris
            sc1 = r1.status_code
1754 3dabe5d2 Stavros Sachtouris
            r1.release()
1755 3dabe5d2 Stavros Sachtouris
            r2 = self.client.object_get(obj,
1756 3dabe5d2 Stavros Sachtouris
                if_unmodified_since=now_formated,
1757 3dabe5d2 Stavros Sachtouris
                success=(200, 304, 412))
1758 3dabe5d2 Stavros Sachtouris
            sc2 = r2.status_code
1759 3dabe5d2 Stavros Sachtouris
            r2.release()
1760 3dabe5d2 Stavros Sachtouris
            self.assertNotEqual(sc1, sc2)
1761 3dabe5d2 Stavros Sachtouris
1762 22beceb3 Stavros Sachtouris
        """Upload an object to download"""
1763 ffada4ea Dionysis Zindros
        src_file = tempfile.NamedTemporaryFile(delete=False)
1764 ffada4ea Dionysis Zindros
        dnl_file = tempfile.NamedTemporaryFile(delete=False)
1765 6764f588 Stavros Sachtouris
1766 ffada4ea Dionysis Zindros
        src_fname = src_file.name
1767 ffada4ea Dionysis Zindros
        dnl_fname = dnl_file.name
1768 6764f588 Stavros Sachtouris
1769 ffada4ea Dionysis Zindros
        src_file.close()
1770 ffada4ea Dionysis Zindros
        dnl_file.close()
1771 6764f588 Stavros Sachtouris
1772 22beceb3 Stavros Sachtouris
        trg_fname = 'remotefile_%s' % self.now
1773 22beceb3 Stavros Sachtouris
        f_size = 59247824
1774 22beceb3 Stavros Sachtouris
        self.create_large_file(f_size, src_fname)
1775 22beceb3 Stavros Sachtouris
        src_f = open(src_fname, 'rb+')
1776 22beceb3 Stavros Sachtouris
        print('\tUploading...')
1777 22beceb3 Stavros Sachtouris
        self.client.upload_object(trg_fname, src_f)
1778 22beceb3 Stavros Sachtouris
        src_f.close()
1779 22beceb3 Stavros Sachtouris
        print('\tDownloading...')
1780 22beceb3 Stavros Sachtouris
        dnl_f = open(dnl_fname, 'wb+')
1781 22beceb3 Stavros Sachtouris
        self.client.download_object(trg_fname, dnl_f)
1782 22beceb3 Stavros Sachtouris
        dnl_f.close()
1783 22beceb3 Stavros Sachtouris
1784 22beceb3 Stavros Sachtouris
        print('\tCheck if files match...')
1785 22beceb3 Stavros Sachtouris
        src_f = open(src_fname)
1786 22beceb3 Stavros Sachtouris
        dnl_f = open(dnl_fname)
1787 22beceb3 Stavros Sachtouris
        for pos in (0, f_size / 2, f_size - 20):
1788 22beceb3 Stavros Sachtouris
            src_f.seek(pos)
1789 22beceb3 Stavros Sachtouris
            dnl_f.seek(pos)
1790 22beceb3 Stavros Sachtouris
            self.assertEqual(src_f.read(10), dnl_f.read(10))
1791 22beceb3 Stavros Sachtouris
        src_f.close()
1792 22beceb3 Stavros Sachtouris
        dnl_f.close()
1793 22beceb3 Stavros Sachtouris
1794 22beceb3 Stavros Sachtouris
        os.remove(src_fname)
1795 22beceb3 Stavros Sachtouris
        os.remove(dnl_fname)
1796 22beceb3 Stavros Sachtouris
1797 3dabe5d2 Stavros Sachtouris
    def test_object_put(self):
1798 3dabe5d2 Stavros Sachtouris
        """Test object_PUT"""
1799 3dabe5d2 Stavros Sachtouris
1800 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c2
1801 3dabe5d2 Stavros Sachtouris
        obj = 'another.test'
1802 3dabe5d2 Stavros Sachtouris
1803 850685bf Stavros Sachtouris
        self.client.create_object(obj + '.FAKE')
1804 850685bf Stavros Sachtouris
        r = self.client.get_object_info(obj + '.FAKE')
1805 850685bf Stavros Sachtouris
        self.assertEqual(r['content-type'], 'application/octet-stream')
1806 850685bf Stavros Sachtouris
1807 3dabe5d2 Stavros Sachtouris
        """create the object"""
1808 3dabe5d2 Stavros Sachtouris
        r = self.client.object_put(obj,
1809 3dabe5d2 Stavros Sachtouris
            data='a',
1810 3dabe5d2 Stavros Sachtouris
            content_type='application/octer-stream',
1811 3dabe5d2 Stavros Sachtouris
            permissions={
1812 3dabe5d2 Stavros Sachtouris
                'read': ['accX:groupA', 'u1', 'u2'],
1813 3dabe5d2 Stavros Sachtouris
                'write': ['u2', 'u3']},
1814 3dabe5d2 Stavros Sachtouris
            metadata={'key1': 'val1', 'key2': 'val2'},
1815 3dabe5d2 Stavros Sachtouris
            content_encoding='UTF-8',
1816 3dabe5d2 Stavros Sachtouris
            content_disposition='attachment; filename="fname.ext"')
1817 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
1818 3dabe5d2 Stavros Sachtouris
        etag = r.headers['etag']
1819 3dabe5d2 Stavros Sachtouris
1820 3dabe5d2 Stavros Sachtouris
        """Check content-disposition"""
1821 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_info(obj)
1822 3dabe5d2 Stavros Sachtouris
        self.assertTrue('content-disposition' in r)
1823 3dabe5d2 Stavros Sachtouris
1824 7d91734c Stavros Sachtouris
        """Check permissions"""
1825 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_sharing(obj)
1826 3dabe5d2 Stavros Sachtouris
        self.assertTrue('accx:groupa' in r['read'])
1827 3dabe5d2 Stavros Sachtouris
        self.assertTrue('u1' in r['read'])
1828 3dabe5d2 Stavros Sachtouris
        self.assertTrue('u2' in r['write'])
1829 3dabe5d2 Stavros Sachtouris
        self.assertTrue('u3' in r['write'])
1830 3dabe5d2 Stavros Sachtouris
1831 3dabe5d2 Stavros Sachtouris
        """Check metadata"""
1832 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_meta(obj)
1833 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-object-meta-key1'], 'val1')
1834 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-object-meta-key2'], 'val2')
1835 3dabe5d2 Stavros Sachtouris
1836 3dabe5d2 Stavros Sachtouris
        """Check public and if_etag_match"""
1837 3dabe5d2 Stavros Sachtouris
        r = self.client.object_put(obj, if_etag_match=etag, data='b',
1838 3dabe5d2 Stavros Sachtouris
            content_type='application/octet-stream', public=True)
1839 3dabe5d2 Stavros Sachtouris
1840 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj)
1841 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-object-public' in r.headers)
1842 3dabe5d2 Stavros Sachtouris
        vers2 = int(r.headers['x-object-version'])
1843 3dabe5d2 Stavros Sachtouris
        etag = r.headers['etag']
1844 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.text, 'b')
1845 3dabe5d2 Stavros Sachtouris
1846 3dabe5d2 Stavros Sachtouris
        """Check if_etag_not_match"""
1847 3dabe5d2 Stavros Sachtouris
        r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
1848 3dabe5d2 Stavros Sachtouris
            content_type='application/octet-stream', success=(201, 412))
1849 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 412)
1850 3dabe5d2 Stavros Sachtouris
1851 3dabe5d2 Stavros Sachtouris
        """Check content_type and content_length"""
1852 3dabe5d2 Stavros Sachtouris
        tmpdir = 'dir' + unicode(self.now)
1853 3dabe5d2 Stavros Sachtouris
        r = self.client.object_put(tmpdir,
1854 3dabe5d2 Stavros Sachtouris
            content_type='application/directory',
1855 3dabe5d2 Stavros Sachtouris
            content_length=0)
1856 3dabe5d2 Stavros Sachtouris
1857 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_info(tmpdir)
1858 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['content-type'], 'application/directory')
1859 3dabe5d2 Stavros Sachtouris
1860 3dabe5d2 Stavros Sachtouris
        """Check copy_from, content_encoding"""
1861 3dabe5d2 Stavros Sachtouris
        r = self.client.object_put('%s/%s' % (tmpdir, obj),
1862 3dabe5d2 Stavros Sachtouris
            format=None,
1863 3dabe5d2 Stavros Sachtouris
            copy_from='/%s/%s' % (self.client.container, obj),
1864 3dabe5d2 Stavros Sachtouris
            content_encoding='application/octet-stream',
1865 3dabe5d2 Stavros Sachtouris
            source_account=self.client.account,
1866 3dabe5d2 Stavros Sachtouris
            content_length=0, success=201)
1867 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
1868 3dabe5d2 Stavros Sachtouris
1869 3dabe5d2 Stavros Sachtouris
        """Test copy_object for cross-conctainer copy"""
1870 3dabe5d2 Stavros Sachtouris
        self.client.copy_object(src_container=self.c2,
1871 3dabe5d2 Stavros Sachtouris
            src_object='%s/%s' % (tmpdir, obj),
1872 3dabe5d2 Stavros Sachtouris
            dst_container=self.c1,
1873 3dabe5d2 Stavros Sachtouris
            dst_object=obj)
1874 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c1
1875 3dabe5d2 Stavros Sachtouris
        r1 = self.client.get_object_info(obj)
1876 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c2
1877 3dabe5d2 Stavros Sachtouris
        r2 = self.client.get_object_info('%s/%s' % (tmpdir, obj))
1878 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r1['x-object-hash'], r2['x-object-hash'])
1879 3dabe5d2 Stavros Sachtouris
1880 3dabe5d2 Stavros Sachtouris
        """Check cross-container copy_from, content_encoding"""
1881 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c1
1882 3dabe5d2 Stavros Sachtouris
        fromstr = '/%s/%s/%s' % (self.c2, tmpdir, obj)
1883 3dabe5d2 Stavros Sachtouris
        r = self.client.object_put(obj,
1884 3dabe5d2 Stavros Sachtouris
            format=None,
1885 3dabe5d2 Stavros Sachtouris
            copy_from=fromstr,
1886 3dabe5d2 Stavros Sachtouris
            content_encoding='application/octet-stream',
1887 3dabe5d2 Stavros Sachtouris
            source_account=self.client.account,
1888 3dabe5d2 Stavros Sachtouris
            content_length=0, success=201)
1889 3dabe5d2 Stavros Sachtouris
1890 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
1891 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_info(obj)
1892 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['etag'], etag)
1893 3dabe5d2 Stavros Sachtouris
1894 3dabe5d2 Stavros Sachtouris
        """Check source_account"""
1895 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c2
1896 3dabe5d2 Stavros Sachtouris
        fromstr = '/%s/%s' % (self.c1, obj)
1897 3dabe5d2 Stavros Sachtouris
        r = self.client.object_put(obj + 'v2',
1898 3dabe5d2 Stavros Sachtouris
            format=None,
1899 3dabe5d2 Stavros Sachtouris
            move_from=fromstr,
1900 3dabe5d2 Stavros Sachtouris
            content_encoding='application/octet-stream',
1901 3dabe5d2 Stavros Sachtouris
            source_account='nonExistendAddress@NeverLand.com',
1902 3dabe5d2 Stavros Sachtouris
            content_length=0,
1903 3dabe5d2 Stavros Sachtouris
            success=(201, 403))
1904 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 403)
1905 3dabe5d2 Stavros Sachtouris
1906 3dabe5d2 Stavros Sachtouris
        """Check cross-container move_from"""
1907 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c1
1908 3dabe5d2 Stavros Sachtouris
        r1 = self.client.get_object_info(obj)
1909 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c2
1910 3dabe5d2 Stavros Sachtouris
        self.client.move_object(src_container=self.c1,
1911 3dabe5d2 Stavros Sachtouris
            src_object=obj,
1912 3dabe5d2 Stavros Sachtouris
            dst_container=self.c2,
1913 3dabe5d2 Stavros Sachtouris
            dst_object=obj + 'v0')
1914 3dabe5d2 Stavros Sachtouris
        r0 = self.client.get_object_info(obj + 'v0')
1915 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
1916 3dabe5d2 Stavros Sachtouris
1917 3dabe5d2 Stavros Sachtouris
        """Check move_from"""
1918 3dabe5d2 Stavros Sachtouris
        r = self.client.object_put(obj + 'v1',
1919 3dabe5d2 Stavros Sachtouris
            format=None,
1920 3dabe5d2 Stavros Sachtouris
            move_from='/%s/%s' % (self.c2, obj),
1921 3dabe5d2 Stavros Sachtouris
            source_version=vers2,
1922 3dabe5d2 Stavros Sachtouris
            content_encoding='application/octet-stream',
1923 3dabe5d2 Stavros Sachtouris
            content_length=0, success=201)
1924 3dabe5d2 Stavros Sachtouris
1925 3dabe5d2 Stavros Sachtouris
        """Check manifest"""
1926 3dabe5d2 Stavros Sachtouris
        mobj = 'manifest.test'
1927 3dabe5d2 Stavros Sachtouris
        txt = ''
1928 3dabe5d2 Stavros Sachtouris
        for i in range(10):
1929 3dabe5d2 Stavros Sachtouris
            txt += '%s' % i
1930 3dabe5d2 Stavros Sachtouris
            r = self.client.object_put('%s/%s' % (mobj, i),
1931 3dabe5d2 Stavros Sachtouris
                data='%s' % i,
1932 3dabe5d2 Stavros Sachtouris
                content_length=1,
1933 3dabe5d2 Stavros Sachtouris
                success=201,
1934 3dabe5d2 Stavros Sachtouris
                content_type='application/octet-stream',
1935 3dabe5d2 Stavros Sachtouris
                content_encoding='application/octet-stream')
1936 3dabe5d2 Stavros Sachtouris
1937 3dabe5d2 Stavros Sachtouris
        r = self.client.object_put(mobj,
1938 3dabe5d2 Stavros Sachtouris
            content_length=0,
1939 3dabe5d2 Stavros Sachtouris
            content_type='application/octet-stream',
1940 3dabe5d2 Stavros Sachtouris
            manifest='%s/%s' % (self.client.container, mobj))
1941 3dabe5d2 Stavros Sachtouris
1942 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(mobj)
1943 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.text, txt)
1944 3dabe5d2 Stavros Sachtouris
1945 3dabe5d2 Stavros Sachtouris
        """Upload a local file with one request"""
1946 88382773 Dionysis Zindros
        self.fname = 'l10K.' + unicode(self.now)
1947 88382773 Dionysis Zindros
        self.create_large_file(1024 * 10, self.fname)
1948 746f8419 Dionysis Zindros
        newf = open(self.fname, 'rb')
1949 3dabe5d2 Stavros Sachtouris
        self.client.upload_object('sample.file', newf)
1950 3dabe5d2 Stavros Sachtouris
        newf.close()
1951 3dabe5d2 Stavros Sachtouris
        """Check if file has been uploaded"""
1952 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_info('sample.file')
1953 3dabe5d2 Stavros Sachtouris
        self.assertEqual(int(r['content-length']), 10260)
1954 3dabe5d2 Stavros Sachtouris
1955 3dabe5d2 Stavros Sachtouris
        """Some problems with transfer-encoding?"""
1956 3dabe5d2 Stavros Sachtouris
1957 3dabe5d2 Stavros Sachtouris
    def test_object_copy(self):
1958 3dabe5d2 Stavros Sachtouris
        """Test object_COPY"""
1959 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c2
1960 3dabe5d2 Stavros Sachtouris
        obj = 'test2'
1961 3dabe5d2 Stavros Sachtouris
1962 3dabe5d2 Stavros Sachtouris
        data = '{"key1":"val1", "key2":"val2"}'
1963 3dabe5d2 Stavros Sachtouris
        r = self.client.object_put(obj + 'orig',
1964 3dabe5d2 Stavros Sachtouris
            content_type='application/octet-stream',
1965 3dabe5d2 Stavros Sachtouris
            data=data,
1966 3dabe5d2 Stavros Sachtouris
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
1967 3dabe5d2 Stavros Sachtouris
            permissions={
1968 3dabe5d2 Stavros Sachtouris
                'read': ['accX:groupA', 'u1', 'u2'],
1969 3dabe5d2 Stavros Sachtouris
                'write': ['u2', 'u3']},
1970 3dabe5d2 Stavros Sachtouris
            content_disposition='attachment; filename="fname.ext"')
1971 3dabe5d2 Stavros Sachtouris
1972 3dabe5d2 Stavros Sachtouris
        r = self.client.object_copy(obj + 'orig',
1973 3dabe5d2 Stavros Sachtouris
            destination='/%s/%s' % (self.client.container, obj),
1974 3dabe5d2 Stavros Sachtouris
            ignore_content_type=False, content_type='application/json',
1975 3dabe5d2 Stavros Sachtouris
            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
1976 3dabe5d2 Stavros Sachtouris
            permissions={'write': ['u5', 'accX:groupB']})
1977 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
1978 3dabe5d2 Stavros Sachtouris
1979 3dabe5d2 Stavros Sachtouris
        """Check content-disposition"""
1980 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_info(obj)
1981 3dabe5d2 Stavros Sachtouris
        self.assertTrue('content-disposition' in r)
1982 3dabe5d2 Stavros Sachtouris
1983 3dabe5d2 Stavros Sachtouris
        """Check Metadata"""
1984 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_meta(obj)
1985 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1986 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1987 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1988 3dabe5d2 Stavros Sachtouris
1989 3dabe5d2 Stavros Sachtouris
        """Check permissions"""
1990 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_sharing(obj)
1991 3dabe5d2 Stavros Sachtouris
        self.assertFalse('read' in r or 'u2' in r['write'])
1992 3dabe5d2 Stavros Sachtouris
        self.assertTrue('accx:groupb' in r['write'])
1993 3dabe5d2 Stavros Sachtouris
1994 3dabe5d2 Stavros Sachtouris
        """Check destination account"""
1995 3dabe5d2 Stavros Sachtouris
        r = self.client.object_copy(obj,
1996 3dabe5d2 Stavros Sachtouris
            destination='/%s/%s' % (self.c1, obj),
1997 3dabe5d2 Stavros Sachtouris
            content_encoding='utf8',
1998 3dabe5d2 Stavros Sachtouris
            content_type='application/json',
1999 3dabe5d2 Stavros Sachtouris
            destination_account='nonExistendAddress@NeverLand.com',
2000 3dabe5d2 Stavros Sachtouris
            success=(201, 403))
2001 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 403)
2002 3dabe5d2 Stavros Sachtouris
2003 3dabe5d2 Stavros Sachtouris
        """Check destination being another container
2004 3dabe5d2 Stavros Sachtouris
        and also content_type and content encoding"""
2005 3dabe5d2 Stavros Sachtouris
        r = self.client.object_copy(obj,
2006 3dabe5d2 Stavros Sachtouris
            destination='/%s/%s' % (self.c1, obj),
2007 3dabe5d2 Stavros Sachtouris
            content_encoding='utf8',
2008 3dabe5d2 Stavros Sachtouris
            content_type='application/json')
2009 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
2010 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.headers['content-type'],
2011 3dabe5d2 Stavros Sachtouris
            'application/json; charset=UTF-8')
2012 3dabe5d2 Stavros Sachtouris
2013 3dabe5d2 Stavros Sachtouris
        """Check ignore_content_type and content_type"""
2014 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj)
2015 3dabe5d2 Stavros Sachtouris
        etag = r.headers['etag']
2016 3dabe5d2 Stavros Sachtouris
        ctype = r.headers['content-type']
2017 3dabe5d2 Stavros Sachtouris
        self.assertEqual(ctype, 'application/json')
2018 3dabe5d2 Stavros Sachtouris
2019 3dabe5d2 Stavros Sachtouris
        r = self.client.object_copy(obj + 'orig',
2020 3dabe5d2 Stavros Sachtouris
            destination='/%s/%s0' % (self.client.container, obj),
2021 3dabe5d2 Stavros Sachtouris
            ignore_content_type=True,
2022 3dabe5d2 Stavros Sachtouris
            content_type='application/json')
2023 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
2024 3dabe5d2 Stavros Sachtouris
        self.assertNotEqual(r.headers['content-type'], 'application/json')
2025 3dabe5d2 Stavros Sachtouris
2026 3dabe5d2 Stavros Sachtouris
        """Check if_etag_(not_)match"""
2027 3dabe5d2 Stavros Sachtouris
        r = self.client.object_copy(obj,
2028 3dabe5d2 Stavros Sachtouris
            destination='/%s/%s1' % (self.client.container, obj),
2029 3dabe5d2 Stavros Sachtouris
            if_etag_match=etag)
2030 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
2031 3dabe5d2 Stavros Sachtouris
2032 3dabe5d2 Stavros Sachtouris
        r = self.client.object_copy(obj,
2033 3dabe5d2 Stavros Sachtouris
            destination='/%s/%s2' % (self.client.container, obj),
2034 3dabe5d2 Stavros Sachtouris
            if_etag_not_match='lalala')
2035 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
2036 3dabe5d2 Stavros Sachtouris
        vers2 = r.headers['x-object-version']
2037 3dabe5d2 Stavros Sachtouris
2038 3dabe5d2 Stavros Sachtouris
        """Check source_version, public and format """
2039 3dabe5d2 Stavros Sachtouris
        r = self.client.object_copy(obj + '2',
2040 3dabe5d2 Stavros Sachtouris
            destination='/%s/%s3' % (self.client.container, obj),
2041 3dabe5d2 Stavros Sachtouris
            source_version=vers2,
2042 3dabe5d2 Stavros Sachtouris
            format='xml',
2043 3dabe5d2 Stavros Sachtouris
            public=True)
2044 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
2045 3dabe5d2 Stavros Sachtouris
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
2046 3dabe5d2 Stavros Sachtouris
2047 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_info(obj + '3')
2048 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-object-public' in r)
2049 3dabe5d2 Stavros Sachtouris
2050 3dabe5d2 Stavros Sachtouris
    def test_object_move(self):
2051 3dabe5d2 Stavros Sachtouris
        """Test object_MOVE"""
2052 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c2
2053 3dabe5d2 Stavros Sachtouris
        obj = 'test2'
2054 3dabe5d2 Stavros Sachtouris
2055 3dabe5d2 Stavros Sachtouris
        data = '{"key1": "val1", "key2": "val2"}'
2056 3dabe5d2 Stavros Sachtouris
        r = self.client.object_put(obj + 'orig',
2057 3dabe5d2 Stavros Sachtouris
            content_type='application/octet-stream',
2058 3dabe5d2 Stavros Sachtouris
            data=data,
2059 3dabe5d2 Stavros Sachtouris
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
2060 3dabe5d2 Stavros Sachtouris
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
2061 3dabe5d2 Stavros Sachtouris
                'write': ['u2', 'u3']})
2062 3dabe5d2 Stavros Sachtouris
2063 3dabe5d2 Stavros Sachtouris
        r = self.client.object_move(obj + 'orig',
2064 3dabe5d2 Stavros Sachtouris
            destination='/%s/%s' % (self.client.container, obj),
2065 3dabe5d2 Stavros Sachtouris
            ignore_content_type=False,
2066 3dabe5d2 Stavros Sachtouris
            content_type='application/json',
2067 3dabe5d2 Stavros Sachtouris
            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
2068 3dabe5d2 Stavros Sachtouris
            permissions={'write': ['u5', 'accX:groupB']})
2069 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
2070 3dabe5d2 Stavros Sachtouris
2071 3dabe5d2 Stavros Sachtouris
        """Check Metadata"""
2072 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_meta(obj)
2073 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
2074 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
2075 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
2076 3dabe5d2 Stavros Sachtouris
2077 7d91734c Stavros Sachtouris
        """Check permissions"""
2078 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_sharing(obj)
2079 3dabe5d2 Stavros Sachtouris
        self.assertFalse('read' in r)
2080 3dabe5d2 Stavros Sachtouris
        self.assertTrue('u5' in r['write'])
2081 3dabe5d2 Stavros Sachtouris
        self.assertTrue('accx:groupb' in r['write'])
2082 3dabe5d2 Stavros Sachtouris
2083 3dabe5d2 Stavros Sachtouris
        """Check destination account"""
2084 3dabe5d2 Stavros Sachtouris
        r = self.client.object_move(obj,
2085 3dabe5d2 Stavros Sachtouris
            destination='/%s/%s' % (self.c1, obj),
2086 3dabe5d2 Stavros Sachtouris
            content_encoding='utf8',
2087 3dabe5d2 Stavros Sachtouris
            content_type='application/json',
2088 3dabe5d2 Stavros Sachtouris
            destination_account='nonExistendAddress@NeverLand.com',
2089 3dabe5d2 Stavros Sachtouris
            success=(201, 403))
2090 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 403)
2091 3dabe5d2 Stavros Sachtouris
2092 3dabe5d2 Stavros Sachtouris
        """Check destination being another container and also
2093 3dabe5d2 Stavros Sachtouris
        content_type, content_disposition and content encoding"""
2094 3dabe5d2 Stavros Sachtouris
        r = self.client.object_move(obj,
2095 3dabe5d2 Stavros Sachtouris
            destination='/%s/%s' % (self.c1, obj),
2096 3dabe5d2 Stavros Sachtouris
            content_encoding='utf8',
2097 3dabe5d2 Stavros Sachtouris
            content_type='application/json',
2098 3dabe5d2 Stavros Sachtouris
            content_disposition='attachment; filename="fname.ext"')
2099 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
2100 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.headers['content-type'],
2101 3dabe5d2 Stavros Sachtouris
            'application/json; charset=UTF-8')
2102 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c1
2103 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_info(obj)
2104 3dabe5d2 Stavros Sachtouris
        self.assertTrue('content-disposition' in r\
2105 3dabe5d2 Stavros Sachtouris
            and 'fname.ext' in r['content-disposition'])
2106 3dabe5d2 Stavros Sachtouris
        etag = r['etag']
2107 3dabe5d2 Stavros Sachtouris
        ctype = r['content-type']
2108 3dabe5d2 Stavros Sachtouris
        self.assertEqual(ctype, 'application/json')
2109 3dabe5d2 Stavros Sachtouris
2110 3dabe5d2 Stavros Sachtouris
        """Check ignore_content_type and content_type"""
2111 3dabe5d2 Stavros Sachtouris
        r = self.client.object_move(obj,
2112 3dabe5d2 Stavros Sachtouris
            destination='/%s/%s' % (self.c2, obj),
2113 3dabe5d2 Stavros Sachtouris
            ignore_content_type=True,
2114 3dabe5d2 Stavros Sachtouris
            content_type='application/json')
2115 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
2116 3dabe5d2 Stavros Sachtouris
        self.assertNotEqual(r.headers['content-type'], 'application/json')
2117 3dabe5d2 Stavros Sachtouris
2118 3dabe5d2 Stavros Sachtouris
        """Check if_etag_(not_)match"""
2119 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c2
2120 3dabe5d2 Stavros Sachtouris
        r = self.client.object_move(obj,
2121 3dabe5d2 Stavros Sachtouris
            destination='/%s/%s0' % (self.client.container, obj),
2122 3dabe5d2 Stavros Sachtouris
            if_etag_match=etag)
2123 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
2124 3dabe5d2 Stavros Sachtouris
2125 3dabe5d2 Stavros Sachtouris
        r = self.client.object_move(obj + '0',
2126 3dabe5d2 Stavros Sachtouris
            destination='/%s/%s1' % (self.client.container, obj),
2127 3dabe5d2 Stavros Sachtouris
            if_etag_not_match='lalala')
2128 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
2129 3dabe5d2 Stavros Sachtouris
2130 3dabe5d2 Stavros Sachtouris
        """Check public and format """
2131 3dabe5d2 Stavros Sachtouris
        r = self.client.object_move(obj + '1',
2132 3dabe5d2 Stavros Sachtouris
            destination='/%s/%s2' % (self.client.container, obj),
2133 3dabe5d2 Stavros Sachtouris
            format='xml', public=True)
2134 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
2135 3dabe5d2 Stavros Sachtouris
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
2136 3dabe5d2 Stavros Sachtouris
2137 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_info(obj + '2')
2138 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-object-public' in r)
2139 3dabe5d2 Stavros Sachtouris
2140 3dabe5d2 Stavros Sachtouris
    def test_object_post(self):
2141 3dabe5d2 Stavros Sachtouris
        """Test object_POST"""
2142 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c2
2143 3dabe5d2 Stavros Sachtouris
        obj = 'test2'
2144 3dabe5d2 Stavros Sachtouris
        """create a filesystem file"""
2145 3dabe5d2 Stavros Sachtouris
        self.fname = obj
2146 3dabe5d2 Stavros Sachtouris
        newf = open(self.fname, 'w')
2147 3dabe5d2 Stavros Sachtouris
        newf.writelines(['ello!\n',
2148 3dabe5d2 Stavros Sachtouris
            'This is a test line\n',
2149 3dabe5d2 Stavros Sachtouris
            'inside a test file\n'])
2150 3dabe5d2 Stavros Sachtouris
        newf.close()
2151 3dabe5d2 Stavros Sachtouris
        """create a file on container"""
2152 3dabe5d2 Stavros Sachtouris
        r = self.client.object_put(obj,
2153 3dabe5d2 Stavros Sachtouris
            content_type='application/octet-stream',
2154 3dabe5d2 Stavros Sachtouris
            data='H',
2155 3dabe5d2 Stavros Sachtouris
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
2156 3dabe5d2 Stavros Sachtouris
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
2157 3dabe5d2 Stavros Sachtouris
                'write': ['u2', 'u3']})
2158 3dabe5d2 Stavros Sachtouris
2159 3dabe5d2 Stavros Sachtouris
        """Append tests update, content_range, content_type, content_length"""
2160 3dabe5d2 Stavros Sachtouris
        newf = open(obj, 'r')
2161 3dabe5d2 Stavros Sachtouris
        self.client.append_object(obj, newf)
2162 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj)
2163 3dabe5d2 Stavros Sachtouris
        self.assertTrue(r.text.startswith('Hello!'))
2164 3dabe5d2 Stavros Sachtouris
2165 3dabe5d2 Stavros Sachtouris
        """Overwrite tests update,
2166 3dabe5d2 Stavros Sachtouris
            content_type, content_length, content_range
2167 3dabe5d2 Stavros Sachtouris
        """
2168 3dabe5d2 Stavros Sachtouris
        newf.seek(0)
2169 3dabe5d2 Stavros Sachtouris
        r = self.client.overwrite_object(obj, 0, 10, newf)
2170 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj)
2171 3dabe5d2 Stavros Sachtouris
        self.assertTrue(r.text.startswith('ello!'))
2172 3dabe5d2 Stavros Sachtouris
        newf.close()
2173 3dabe5d2 Stavros Sachtouris
2174 3dabe5d2 Stavros Sachtouris
        """Truncate tests update,
2175 3dabe5d2 Stavros Sachtouris
            content_range, content_type, object_bytes and source_object"""
2176 3dabe5d2 Stavros Sachtouris
        r = self.client.truncate_object(obj, 5)
2177 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj)
2178 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.text, 'ello!')
2179 3dabe5d2 Stavros Sachtouris
2180 3dabe5d2 Stavros Sachtouris
        """Check metadata"""
2181 3dabe5d2 Stavros Sachtouris
        self.client.set_object_meta(obj, {'mkey2': 'mval2a', 'mkey3': 'mval3'})
2182 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_meta(obj)
2183 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
2184 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
2185 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
2186 4375e020 Stavros Sachtouris
        self.client.del_object_meta(obj, 'mkey1')
2187 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_meta(obj)
2188 3dabe5d2 Stavros Sachtouris
        self.assertFalse('x-object-meta-mkey1' in r)
2189 3dabe5d2 Stavros Sachtouris
2190 7d91734c Stavros Sachtouris
        """Check permissions"""
2191 3dabe5d2 Stavros Sachtouris
        self.client.set_object_sharing(obj,
2192 3dabe5d2 Stavros Sachtouris
            read_permition=['u4', 'u5'], write_permition=['u4'])
2193 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_sharing(obj)
2194 3dabe5d2 Stavros Sachtouris
        self.assertTrue('read' in r)
2195 3dabe5d2 Stavros Sachtouris
        self.assertTrue('u5' in r['read'])
2196 3dabe5d2 Stavros Sachtouris
        self.assertTrue('write' in r)
2197 3dabe5d2 Stavros Sachtouris
        self.assertTrue('u4' in r['write'])
2198 3dabe5d2 Stavros Sachtouris
        self.client.del_object_sharing(obj)
2199 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_sharing(obj)
2200 3dabe5d2 Stavros Sachtouris
        self.assertTrue(len(r) == 0)
2201 3dabe5d2 Stavros Sachtouris
2202 3dabe5d2 Stavros Sachtouris
        """Check publish"""
2203 3dabe5d2 Stavros Sachtouris
        self.client.publish_object(obj)
2204 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_info(obj)
2205 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-object-public' in r)
2206 3dabe5d2 Stavros Sachtouris
        self.client.unpublish_object(obj)
2207 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_info(obj)
2208 3dabe5d2 Stavros Sachtouris
        self.assertFalse('x-object-public' in r)
2209 3dabe5d2 Stavros Sachtouris
2210 3dabe5d2 Stavros Sachtouris
        """Check if_etag_(not)match"""
2211 3dabe5d2 Stavros Sachtouris
        etag = r['etag']
2212 7d91734c Stavros Sachtouris
        """
2213 7d91734c Stavros Sachtouris
        r = self.client.object_post(obj,
2214 7d91734c Stavros Sachtouris
            update=True,
2215 7d91734c Stavros Sachtouris
            public=True,
2216 7d91734c Stavros Sachtouris
            if_etag_not_match=etag,
2217 7d91734c Stavros Sachtouris
            success=(412, 202, 204))
2218 7d91734c Stavros Sachtouris
        self.assertEqual(r.status_code, 412)
2219 7d91734c Stavros Sachtouris
        """
2220 3dabe5d2 Stavros Sachtouris
2221 3dabe5d2 Stavros Sachtouris
        r = self.client.object_post(obj, update=True, public=True,
2222 3dabe5d2 Stavros Sachtouris
            if_etag_match=etag, content_encoding='application/json')
2223 3dabe5d2 Stavros Sachtouris
2224 3dabe5d2 Stavros Sachtouris
        r = self.client.get_object_info(obj)
2225 3dabe5d2 Stavros Sachtouris
        helloVersion = r['x-object-version']
2226 3dabe5d2 Stavros Sachtouris
        self.assertTrue('x-object-public' in r)
2227 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r['content-encoding'], 'application/json')
2228 3dabe5d2 Stavros Sachtouris
2229 3dabe5d2 Stavros Sachtouris
        """Check source_version and source_account and content_disposition"""
2230 3dabe5d2 Stavros Sachtouris
        r = self.client.object_post(obj,
2231 3dabe5d2 Stavros Sachtouris
            update=True,
2232 3dabe5d2 Stavros Sachtouris
            content_type='application/octet-srteam',
2233 3dabe5d2 Stavros Sachtouris
            content_length=5,
2234 3dabe5d2 Stavros Sachtouris
            content_range='bytes 1-5/*',
2235 3dabe5d2 Stavros Sachtouris
            source_object='/%s/%s' % (self.c2, obj),
2236 3dabe5d2 Stavros Sachtouris
            source_account='thisAccountWillNeverExist@adminland.com',
2237 3dabe5d2 Stavros Sachtouris
            source_version=helloVersion,
2238 3dabe5d2 Stavros Sachtouris
            data='12345',
2239 3dabe5d2 Stavros Sachtouris
            success=(403, 202, 204))
2240 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 403)
2241 3dabe5d2 Stavros Sachtouris
2242 3dabe5d2 Stavros Sachtouris
        r = self.client.object_post(obj,
2243 3dabe5d2 Stavros Sachtouris
            update=True,
2244 3dabe5d2 Stavros Sachtouris
            content_type='application/octet-srteam',
2245 3dabe5d2 Stavros Sachtouris
            content_length=5,
2246 3dabe5d2 Stavros Sachtouris
            content_range='bytes 1-5/*',
2247 3dabe5d2 Stavros Sachtouris
            source_object='/%s/%s' % (self.c2, obj),
2248 3dabe5d2 Stavros Sachtouris
            source_account=self.client.account,
2249 3dabe5d2 Stavros Sachtouris
            source_version=helloVersion,
2250 3dabe5d2 Stavros Sachtouris
            data='12345',
2251 3dabe5d2 Stavros Sachtouris
            content_disposition='attachment; filename="fname.ext"')
2252 3dabe5d2 Stavros Sachtouris
2253 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj)
2254 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.text, 'eello!')
2255 3dabe5d2 Stavros Sachtouris
        self.assertTrue('content-disposition' in r.headers\
2256 3dabe5d2 Stavros Sachtouris
            and 'fname.ext' in r.headers['content-disposition'])
2257 3dabe5d2 Stavros Sachtouris
2258 3dabe5d2 Stavros Sachtouris
        """Check manifest"""
2259 3dabe5d2 Stavros Sachtouris
        mobj = 'manifest.test'
2260 3dabe5d2 Stavros Sachtouris
        txt = ''
2261 3dabe5d2 Stavros Sachtouris
        for i in range(10):
2262 3dabe5d2 Stavros Sachtouris
            txt += '%s' % i
2263 3dabe5d2 Stavros Sachtouris
            r = self.client.object_put('%s/%s' % (mobj, i),
2264 3dabe5d2 Stavros Sachtouris
            data='%s' % i,
2265 3dabe5d2 Stavros Sachtouris
            content_length=1,
2266 3dabe5d2 Stavros Sachtouris
            success=201,
2267 3dabe5d2 Stavros Sachtouris
            content_encoding='application/octet-stream',
2268 3dabe5d2 Stavros Sachtouris
            content_type='application/octet-stream')
2269 3dabe5d2 Stavros Sachtouris
2270 3dabe5d2 Stavros Sachtouris
        self.client.create_object_by_manifestation(mobj,
2271 3dabe5d2 Stavros Sachtouris
            content_type='application/octet-stream')
2272 3dabe5d2 Stavros Sachtouris
2273 3dabe5d2 Stavros Sachtouris
        r = self.client.object_post(mobj,
2274 3dabe5d2 Stavros Sachtouris
            manifest='%s/%s' % (self.client.container, mobj))
2275 3dabe5d2 Stavros Sachtouris
2276 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(mobj)
2277 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.text, txt)
2278 3dabe5d2 Stavros Sachtouris
2279 3dabe5d2 Stavros Sachtouris
        """We need to check transfer_encoding """
2280 3dabe5d2 Stavros Sachtouris
2281 3dabe5d2 Stavros Sachtouris
    def test_object_delete(self):
2282 3dabe5d2 Stavros Sachtouris
        """Test object_DELETE"""
2283 3dabe5d2 Stavros Sachtouris
        self.client.container = self.c2
2284 3dabe5d2 Stavros Sachtouris
        obj = 'test2'
2285 3dabe5d2 Stavros Sachtouris
        """create a file on container"""
2286 3dabe5d2 Stavros Sachtouris
        r = self.client.object_put(obj,
2287 3dabe5d2 Stavros Sachtouris
            content_type='application/octet-stream',
2288 3dabe5d2 Stavros Sachtouris
            data='H',
2289 3dabe5d2 Stavros Sachtouris
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
2290 3dabe5d2 Stavros Sachtouris
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
2291 3dabe5d2 Stavros Sachtouris
                'write': ['u2', 'u3']})
2292 3dabe5d2 Stavros Sachtouris
2293 3dabe5d2 Stavros Sachtouris
        """Check with false until"""
2294 3dabe5d2 Stavros Sachtouris
        r = self.client.object_delete(obj, until=1000000)
2295 3dabe5d2 Stavros Sachtouris
2296 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj, success=(200, 404))
2297 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
2298 3dabe5d2 Stavros Sachtouris
2299 3dabe5d2 Stavros Sachtouris
        """Check normal case"""
2300 3dabe5d2 Stavros Sachtouris
        r = self.client.object_delete(obj)
2301 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 204)
2302 3dabe5d2 Stavros Sachtouris
2303 3dabe5d2 Stavros Sachtouris
        r = self.client.object_get(obj, success=(200, 404))
2304 3dabe5d2 Stavros Sachtouris
        self.assertEqual(r.status_code, 404)
2305 3dabe5d2 Stavros Sachtouris
2306 3dabe5d2 Stavros Sachtouris
    def create_large_file(self, size, name):
2307 3dabe5d2 Stavros Sachtouris
        """Create a large file at fs"""
2308 3dabe5d2 Stavros Sachtouris
        self.fname = name
2309 3dabe5d2 Stavros Sachtouris
        f = open(self.fname, 'w')
2310 7d91734c Stavros Sachtouris
        sys.stdout.write(
2311 7d91734c Stavros Sachtouris
            ' create random file %s of size %s      ' % (name, size))
2312 647e6771 Dionysis Zindros
        for hobyte_id in xrange(size / 8):
2313 4fdbb165 Dionysis Zindros
            random_bytes = os.urandom(8)
2314 4fdbb165 Dionysis Zindros
            f.write(random_bytes)
2315 3dabe5d2 Stavros Sachtouris
            if 0 == (hobyte_id * 800) % size:
2316 3dabe5d2 Stavros Sachtouris
                f.write('\n')
2317 19699c46 Stavros Sachtouris
                f.flush()
2318 3dabe5d2 Stavros Sachtouris
                prs = (hobyte_id * 800) // size
2319 e0aac6a6 Stavros Sachtouris
                sys.stdout.write('\b\b')
2320 3dabe5d2 Stavros Sachtouris
                if prs > 10:
2321 3dabe5d2 Stavros Sachtouris
                    sys.stdout.write('\b')
2322 e0aac6a6 Stavros Sachtouris
                sys.stdout.write('%s%%' % prs)
2323 3dabe5d2 Stavros Sachtouris
                sys.stdout.flush()
2324 e0aac6a6 Stavros Sachtouris
        print('\b\b\b100%')
2325 19699c46 Stavros Sachtouris
        f.flush()
2326 3dabe5d2 Stavros Sachtouris
        f.close()
2327 3dabe5d2 Stavros Sachtouris
        """"""
2328 3dabe5d2 Stavros Sachtouris
2329 b08af3e6 Stavros Sachtouris
2330 1bb4d14d Stavros Sachtouris
def init_parser():
2331 3dabe5d2 Stavros Sachtouris
    parser = ArgumentParser(add_help=False)
2332 3dabe5d2 Stavros Sachtouris
    parser.add_argument('-h', '--help',
2333 3dabe5d2 Stavros Sachtouris
        dest='help',
2334 3dabe5d2 Stavros Sachtouris
        action='store_true',
2335 3dabe5d2 Stavros Sachtouris
        default=False,
2336 3dabe5d2 Stavros Sachtouris
        help="Show this help message and exit")
2337 3dabe5d2 Stavros Sachtouris
    return parser
2338 15618e89 Stavros Sachtouris
2339 3dabe5d2 Stavros Sachtouris
2340 75c3fc42 Stavros Sachtouris
def main(argv):
2341 3dabe5d2 Stavros Sachtouris
2342 75c3fc42 Stavros Sachtouris
    suiteFew = unittest.TestSuite()
2343 3dabe5d2 Stavros Sachtouris
    if len(argv) == 0 or argv[0] == 'pithos':
2344 3dabe5d2 Stavros Sachtouris
        if len(argv) == 1:
2345 3dabe5d2 Stavros Sachtouris
            suiteFew.addTest(unittest.makeSuite(testPithos))
2346 3dabe5d2 Stavros Sachtouris
        else:
2347 3dabe5d2 Stavros Sachtouris
            suiteFew.addTest(testPithos('test_' + argv[1]))
2348 3dabe5d2 Stavros Sachtouris
    if len(argv) == 0 or argv[0] == 'cyclades':
2349 3dabe5d2 Stavros Sachtouris
        if len(argv) == 1:
2350 3dabe5d2 Stavros Sachtouris
            #suiteFew.addTest(unittest.makeSuite(testCyclades))
2351 3dabe5d2 Stavros Sachtouris
            suiteFew.addTest(testCyclades('test_000'))
2352 3dabe5d2 Stavros Sachtouris
        else:
2353 3dabe5d2 Stavros Sachtouris
            suiteFew.addTest(testCyclades('test_' + argv[1]))
2354 3dabe5d2 Stavros Sachtouris
    if len(argv) == 0 or argv[0] == 'image':
2355 3dabe5d2 Stavros Sachtouris
        if len(argv) == 1:
2356 3dabe5d2 Stavros Sachtouris
            suiteFew.addTest(unittest.makeSuite(testImage))
2357 3dabe5d2 Stavros Sachtouris
        else:
2358 3dabe5d2 Stavros Sachtouris
            suiteFew.addTest(testImage('test_' + argv[1]))
2359 3dabe5d2 Stavros Sachtouris
    if len(argv) == 0 or argv[0] == 'astakos':
2360 3dabe5d2 Stavros Sachtouris
        if len(argv) == 1:
2361 3dabe5d2 Stavros Sachtouris
            suiteFew.addTest(unittest.makeSuite(testAstakos))
2362 3dabe5d2 Stavros Sachtouris
        else:
2363 3dabe5d2 Stavros Sachtouris
            suiteFew.addTest(testAstakos('test_' + argv[1]))
2364 3dabe5d2 Stavros Sachtouris
2365 3dabe5d2 Stavros Sachtouris
    unittest.TextTestRunner(verbosity=2).run(suiteFew)
2366 75c3fc42 Stavros Sachtouris
2367 75c3fc42 Stavros Sachtouris
if __name__ == '__main__':
2368 75c3fc42 Stavros Sachtouris
    parser = init_parser()
2369 75c3fc42 Stavros Sachtouris
    args, argv = parser.parse_known_args()
2370 75c3fc42 Stavros Sachtouris
    if len(argv) > 2 or getattr(args, 'help') or len(argv) < 1:
2371 75c3fc42 Stavros Sachtouris
        raise Exception('\tusage: tests.py <group> [command]')
2372 75c3fc42 Stavros Sachtouris
    main(argv)