Revision 3dabe5d2 kamaki/clients/tests.py

b/kamaki/clients/tests.py
5 5
# conditions are met:
6 6
#
7 7
#   1. Redistributions of source code must retain the above
8
#	  copyright notice, this list of conditions and the following
9
#	  disclaimer.
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10 10
#
11 11
#   2. Redistributions in binary form must reproduce the above
12
#	  copyright notice, this list of conditions and the following
13
#	  disclaimer in the documentation and/or other materials
14
#	  provided with the distribution.
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15 15
#
16 16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
......
31 31
# interpreted as representing official policies, either expressed
32 32
# or implied, of GRNET S.A.
33 33

  
34
import gevent.monkey #Monkey-patch everything for gevent early on
34
import gevent.monkey
35
# Monkey-patch everything for gevent early on
35 36
gevent.monkey.patch_all()
36 37

  
37 38
from argparse import ArgumentParser
38 39
import unittest
39
import time, datetime, os, sys
40
from shutil import copyfile
40
import time
41
import datetime
42
import os
43
import sys
41 44

  
42 45
from kamaki.clients import ClientError
43 46
from kamaki.clients.pithos import PithosClient as pithos
......
47 50

  
48 51
TEST_ALL = False
49 52

  
50
global_username='XXXXXXXX'
51
token='XXXXXXXX=='
53
global_username = 'saxtouri'
54
token = 'Kn+G9dfmlPLR2WFnhfBOow=='
55

  
52 56

  
53 57
class testAstakos(unittest.TestCase):
54
	def setUp(self):
55
		url='https://accounts.okeanos.grnet.gr'
56
		global token
57
		self.client = astakos(url, token)
58
	def tearDown(self):
59
		pass
60
	def test_authenticate(self):
61
		r = self.client.authenticate()
62
		for term in ('username',
63
			'auth_token_expires',
64
			'auth_token',
65
			'auth_token_created', 
66
			'groups',
67
			'uniq',
68
			'has_credits',
69
			'has_signed_terms'):
70
			self.assertTrue(r.has_key(term))
58
    def setUp(self):
59
        url = 'https://accounts.okeanos.grnet.gr'
60
        global token
61
        self.client = astakos(url, token)
62

  
63
    def tearDown(self):
64
        pass
65

  
66
    def test_authenticate(self):
67
        r = self.client.authenticate()
68
        for term in ('username',
69
            'auth_token_expires',
70
            'auth_token',
71
            'auth_token_created',
72
            'groups',
73
            'uniq',
74
            'has_credits',
75
            'has_signed_terms'):
76
            self.assertTrue(term in r)
77

  
71 78

  
72 79
class testImage(unittest.TestCase):
73
	def setUp(self):
74
		cyclades_url = 'https://cyclades.okeanos.grnet.gr/api/v1.1'
75
		url = 'https://cyclades.okeanos.grnet.gr/plankton'
76
		global token
77
		self.token = token
78
		self.imgid = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
79
		self.now = time.mktime(time.gmtime())
80
		self.imgname = 'img_%s'%self.now
81
		global global_username
82
		self.imglocation = 'pithos://%s@grnet.gr/pithos/my.img'%global_username
83
		self.client = image(url, self.token)
84
		self.cyclades = cyclades(cyclades_url, self.token)
85
		self._imglist={}
86

  
87
	def _prepare_img(self):
88
		global global_username
89
		imglocalpath = '/home/%s/src/kamaki-settings/files/centos.diskdump'%global_username
90
		f = open(imglocalpath, 'rb')
91
		pithcli = pithos('https://pithos.okeanos.grnet.gr/v1',
92
			self.token,
93
			global_username,
94
			'pithos')
95
		pithcli.upload_object('my.img', f)
96
		f.close()
97

  
98
		self.client.register(self.imgname, self.imglocation, params=dict(is_public=True))
99
		img = self._get_img_by_name(self.imgname)
100
		self._imglist[self.imgname]=img
101

  
102
	def tearDown(self):
103
		for img in self._imglist.values():
104
			self.cyclades.delete_image(img['id'])
105

  
106
	def _get_img_by_name(self, name):
107
		r = self.cyclades.list_images()
108
		for img in r:
109
			if img['name'] == name:
110
				return img
111
		return None
112

  
113
	def assert_dicts_are_deeply_equal(self, d1, d2):
114
		for k,v in d1.items():
115
			self.assertTrue(d2.has_key(k))
116
			if isinstance(v, dict):
117
				self.assert_dicts_are_deeply_equal(v, d2[k])
118
			else:
119
				self.assertEqual(unicode(v), unicode(d2[k]))	
120

  
121
	def test_list_public(self):
122
		"""Test list_public"""
123
		r = self.client.list_public()
124
		r0 = self.client.list_public(order='-')
125
		self.assertTrue(len(r)>0)
126
		for img in r:
127
			for term in ('status',
128
				'name', 
129
				'container_format', 
130
				'disk_format', 
131
				'id', 
132
				'size'):
133
				self.assertTrue(img.has_key(term))
134
		self.assertTrue(len(r), len(r0))
135
		r0.reverse()
136
		for i, img in enumerate(r):
137
			self.assert_dicts_are_deeply_equal(img, r0[i])
138
		r1 = self.client.list_public(detail=True)
139
		for img in r1:
140
			for term in ('status',
141
				'name',
142
				'checksum',
143
				'created_at',
144
				'disk_format',
145
				'updated_at',
146
				'id',
147
				'location',
148
				'container_format',
149
				'owner',
150
				'is_public',
151
				'deleted_at',
152
				'properties',
153
				'size'):
154
				self.assertTrue(img.has_key(term))
155
				for interm in ('kernel',
156
					'osfamily',
157
					'users',
158
					'gui',
159
					'sortorder',
160
					'os',
161
					'root_partition',
162
					'description'):
163
					self.assertTrue(img['properties'].has_key(interm))
164
		size_max = 1000000000
165
		r2 = self.client.list_public(filters=dict(size_max=size_max))
166
		self.assertTrue(len(r2) <= len(r))
167
		for img in r2:
168
			self.assertTrue(int(img['size'])<=size_max)
169

  
170
	def test_get_meta(self):
171
		"""Test get_meta"""
172
		r= self.client.get_meta(self.imgid)
173
		self.assertEqual(r['id'], self.imgid)
174
		for term in ('status',
175
			'name',
176
			'checksum',
177
			'updated-at',
178
			'created-at',
179
			'deleted-at',
180
			'location',
181
			'is-public',
182
			'owner',
183
			'disk-format',
184
			'size',
185
			'container-format'):
186
			self.assertTrue(r.has_key(term))
187
			for interm in ('kernel',
188
				'osfamily',
189
				'users',
190
				'partition-table',
191
				'gui', 'sortorder',
192
				'root-partition',
193
				'os',
194
				'description'):
195
				self.assertTrue(r['properties'].has_key(interm))
196

  
197
	def test_register(self):
198
		"""Test register"""
199
		self._prepare_img()
200
		self.assertTrue(len(self._imglist)>0)
201
		for img in self._imglist.values():
202
			self.assertTrue(img != None)
203

  
204
	def test_set_members(self):
205
		"""Test set_members"""
206
		self._prepare_img()
207
		members=['%s@fake.net'%self.now]
208
		for img in self._imglist.values():
209
			self.client.set_members(img['id'], members)
210
			r = self.client.list_members(img['id'])
211
			self.assertEqual(r[0]['member_id'], members[0])
212

  
213
	def test_list_members(self):
214
		"""Test list_members"""
215
		self.test_set_members()
216

  
217
	def test_remove_members(self):
218
		"""Test remove_members - NO CHECK"""
219
		return
220
		self._prepare_img()
221
		members=['%s@fake.net'%self.now, '%s_v2@fake.net'%self.now]
222
		for img in self._imglist.values():
223
			self.client.set_members(img['id'], members)
224
			r = self.client.list_members(img['id'])
225
			self.assertTrue(len(r)>1)
226
			self.client.remove_member(img['id'], members[0])
227
			r0 = self.client.list_members(img['id'])
228
			self.assertEqual(len(r), 1+len(r0))
229
			self.assertEqual(r0[0]['member_id'], members[1])
230

  
231
	def test_list_shared(self):
232
		"""Test list_shared - NOT CHECKED"""
233
		#No way to test this, if I dont have member images
234
		pass
80
    def setUp(self):
81
        cyclades_url = 'https://cyclades.okeanos.grnet.gr/api/v1.1'
82
        url = 'https://cyclades.okeanos.grnet.gr/plankton'
83
        global token
84
        self.token = token
85
        self.imgid = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
86
        self.now = time.mktime(time.gmtime())
87
        self.imgname = 'img_%s' % self.now
88
        global global_username
89
        self.imglocation = 'pithos://%s@grnet.gr/pithos/my.img'\
90
        % global_username
91
        self.client = image(url, self.token)
92
        self.cyclades = cyclades(cyclades_url, self.token)
93
        self._imglist = {}
94

  
95
    def _prepare_img(self):
96
        global global_username
97
        username = '%s@grnet.gr' % global_username
98
        imglocalpath = '/home/%s/src/kamaki-settings/files/centos.diskdump'\
99
        % global_username
100
        f = open(imglocalpath, 'rb')
101
        pithcli = pithos('https://pithos.okeanos.grnet.gr/v1',
102
            self.token,
103
            username,
104
            'pithos')
105
        pithcli.upload_object('my.img', f)
106
        f.close()
107

  
108
        self.client.register(self.imgname,
109
            self.imglocation,
110
            params=dict(is_public=True))
111
        img = self._get_img_by_name(self.imgname)
112
        self._imglist[self.imgname] = img
113

  
114
    def tearDown(self):
115
        for img in self._imglist.values():
116
            self.cyclades.delete_image(img['id'])
117

  
118
    def _get_img_by_name(self, name):
119
        r = self.cyclades.list_images()
120
        for img in r:
121
            if img['name'] == name:
122
                return img
123
        return None
124

  
125
    def assert_dicts_are_deeply_equal(self, d1, d2):
126
        for k, v in d1.items():
127
            self.assertTrue(k in d2)
128
            if isinstance(v, dict):
129
                self.assert_dicts_are_deeply_equal(v, d2[k])
130
            else:
131
                self.assertEqual(unicode(v), unicode(d2[k]))
132

  
133
    def test_list_public(self):
134
        """Test list_public"""
135
        r = self.client.list_public()
136
        r0 = self.client.list_public(order='-')
137
        self.assertTrue(len(r) > 0)
138
        for img in r:
139
            for term in ('status',
140
                'name',
141
                'container_format',
142
                'disk_format',
143
                'id',
144
                'size'):
145
                self.assertTrue(term in img)
146
        self.assertTrue(len(r), len(r0))
147
        r0.reverse()
148
        for i, img in enumerate(r):
149
            self.assert_dicts_are_deeply_equal(img, r0[i])
150
        r1 = self.client.list_public(detail=True)
151
        for img in r1:
152
            for term in ('status',
153
                'name',
154
                'checksum',
155
                'created_at',
156
                'disk_format',
157
                'updated_at',
158
                'id',
159
                'location',
160
                'container_format',
161
                'owner',
162
                'is_public',
163
                'deleted_at',
164
                'properties',
165
                'size'):
166
                self.assertTrue(term in img)
167
                for interm in ('kernel',
168
                    'osfamily',
169
                    'users',
170
                    'gui',
171
                    'sortorder',
172
                    'os',
173
                    'root_partition',
174
                    'description'):
175
                    self.assertTrue(interm in img['properties'])
176
        size_max = 1000000000
177
        r2 = self.client.list_public(filters=dict(size_max=size_max))
178
        self.assertTrue(len(r2) <= len(r))
179
        for img in r2:
180
            self.assertTrue(int(img['size']) <= size_max)
181

  
182
    def test_get_meta(self):
183
        """Test get_meta"""
184
        r = self.client.get_meta(self.imgid)
185
        self.assertEqual(r['id'], self.imgid)
186
        for term in ('status',
187
            'name',
188
            'checksum',
189
            'updated-at',
190
            'created-at',
191
            'deleted-at',
192
            'location',
193
            'is-public',
194
            'owner',
195
            'disk-format',
196
            'size',
197
            'container-format'):
198
            self.assertTrue(term in r)
199
            for interm in ('kernel',
200
                'osfamily',
201
                'users',
202
                'partition-table',
203
                'gui', 'sortorder',
204
                'root-partition',
205
                'os',
206
                'description'):
207
                self.assertTrue(interm in r['properties'])
208

  
209
    def test_register(self):
210
        """Test register"""
211
        self._prepare_img()
212
        self.assertTrue(len(self._imglist) > 0)
213
        for img in self._imglist.values():
214
            self.assertTrue(img != None)
215

  
216
    def test_set_members(self):
217
        """Test set_members"""
218
        self._prepare_img()
219
        members = ['%s@fake.net' % self.now]
220
        for img in self._imglist.values():
221
            self.client.set_members(img['id'], members)
222
            r = self.client.list_members(img['id'])
223
            self.assertEqual(r[0]['member_id'], members[0])
224

  
225
    def test_list_members(self):
226
        """Test list_members"""
227
        self.test_set_members()
228

  
229
    def test_remove_members(self):
230
        """Test remove_members - NO CHECK"""
231
        return
232
        self._prepare_img()
233
        members = ['%s@fake.net' % self.now, '%s_v2@fake.net' % self.now]
234
        for img in self._imglist.values():
235
            self.client.set_members(img['id'], members)
236
            r = self.client.list_members(img['id'])
237
            self.assertTrue(len(r) > 1)
238
            self.client.remove_member(img['id'], members[0])
239
            r0 = self.client.list_members(img['id'])
240
            self.assertEqual(len(r), 1 + len(r0))
241
            self.assertEqual(r0[0]['member_id'], members[1])
242

  
243
    def test_list_shared(self):
244
        """Test list_shared - NOT CHECKED"""
245
        #No way to test this, if I dont have member images
246
        pass
247

  
235 248

  
236 249
class testCyclades(unittest.TestCase):
237
	"""Set up a Cyclades thorough test"""
238
	def setUp(self):
239
		"""okeanos"""
240
		url='https://cyclades.okeanos.grnet.gr/api/v1.1'
241
		global token
242
		global global_username
243
		account='%s@grnet.gr'%global_username
244
		self.img = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
245
		self.img_details= {
246
			u'status': u'ACTIVE',
247
			u'updated': u'2012-10-16T09:04:17+00:00',
248
			u'name': u'Debian Base',
249
			u'created': u'2012-10-16T09:03:12+00:00',
250
			u'progress': 100,
251
			u'id': 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf',
252
			u'metadata': {
253
				u'values': {
254
					u'kernel': u'2.6.32',
255
					u'osfamily': u'linux', 
256
					u'users': u'root', 
257
					u'gui': u'No GUI', 
258
					u'sortorder': u'1', 
259
					u'os': u'debian', 
260
					u'root_partition': u'1', 
261
					u'description': u'Debian 6.0.6 (Squeeze) Base System',
262
					u'partition_table': u'msdos'}
263
				}
264
			}
265
		self.flavor_details =  {u'name': u'C1R1024D20',
266
			u'ram': 1024,
267
			u'id': 1,
268
			u'SNF:disk_template': u'drbd',
269
			u'disk': 20,
270
			u'cpu': 1}
271
		self.PROFILES=('ENABLED', 'DISABLED', 'PROTECTED')
272

  
273
		"""okeanos.io"""
274
		#url = 'https://cyclades.okeanos.io/api/v1.1'
275
		#global token
276
		#account='%s@grnet.gr'%global_username
277
		#self.img = '43cc8497-61c3-4c46-ae8d-3e33861f8527'
278
		#self.img_details= {
279
		#	u'status': u'ACTIVE',
280
		#	u'updated': u'2012-08-21T12:57:39+00:00',
281
		#	u'name': u'Debian Base',
282
		#	u'created': u'2012-08-21T12:56:53+00:00',
283
		#	u'progress': 100,
284
		#	u'id': u'43cc8497-61c3-4c46-ae8d-3e33861f8527',
285
		#	u'metadata': {
286
		#		u'values': {
287
		#			u'kernel': u'2.6.32',
288
		#			u'osfamily': u'linux', 
289
		#			u'users': u'root', 
290
		#			u'gui': u'No GUI', 
291
		#			u'sortorder': u'1', 
292
		#			u'os': u'debian', 
293
		#			u'root_partition': 
294
		#			u'1', u'description': 
295
		#			u'Debian Squeeze Base System'}
296
		#		}
297
		#	}
298
		#flavorid = 1
299

  
300
		self.servers = {}
301
		self.now = time.mktime(time.gmtime())
302
		self.servname1 = 'serv'+unicode(self.now)
303
		self.servname2 = self.servname1+'_v2'
304
		self.flavorid = 1
305
		#servers have to be created at the begining...
306
		self.networks={}
307
		self.netname1 = 'net'+unicode(self.now)
308
		self.netname2 = 'net'+unicode(self.now)+'_v2'
309

  
310
		self.client = cyclades(url, token)
311
		pass
312

  
313
	def tearDown(self):
314
		"""Destoy servers used in testing"""
315
		print
316
		for netid in self.networks.keys():
317
			self._delete_network(netid)
318
		if 0 >= len(self.servers):
319
			return
320
		there_are_servers_running = True
321
		deleted_servers = {}
322
		waitime = 0
323
		print('-> Found %s servers to delete'%len(self.servers))
324
		while there_are_servers_running:
325
			there_are_servers_running = False
326
			if waitime > 0:
327
				c = ['|','/','-','\\']
328
				suffix = ''
329
				sys.stdout.write('\t. . . wait %s seconds: '%waitime)
330
				for i in range(4*waitime):
331
					oldlen = len(suffix)
332
					suffix = '%ss %s'%(i/4, c[i%4])
333
					sys.stdout.write(oldlen*'\b'+suffix)
334
					sys.stdout.flush()
335
					time.sleep(0.25)
336
				oldlen = len(': '+suffix)
337
				print(oldlen*'\b'+oldlen*' ')
338
				sys.stdout.flush()
339
			waitime += 3
340
			dservers = self.client.list_servers(detail=True)
341
			for server in dservers:
342
				if server['name'] in self.servers.keys():
343
					there_are_servers_running = True
344
					sys.stdout.write('\t%s status:%s '%(server['name'], server['status']))
345
					if server['status'] == 'BUILD':
346
						print('\twait...')
347
					else:
348
						print('\tDELETE %s'%server['name'])
349
						self._delete_server(server['id'])
350
						self.servers.pop(server['name'])
351
						deleted_servers[server['name']] = 0
352
						waitime =0 
353
				elif server['name'] in deleted_servers.keys():
354
					there_are_servers_running = True
355
					sys.stdout.write('\t%s status:%s '%(server['name'], server['status']))
356
					retries = deleted_servers[server['name']]
357
					if retries > 10:
358
						print('\tretry DELETE %s'%server['name'])
359
						self._delete_server(server['id'])
360
						retries = 0
361
						waitime = 0
362
					else:
363
						print('\tnot deleted yet ...')
364
					deleted_servers[server['name']] = retries + 1
365

  
366
	def _create_server(self, servername, flavorid, imageid, personality=None):
367
		server = self.client.create_server(servername, flavorid, imageid, personality)
368
		self.servers[servername] = server
369
		return server
370

  
371
	def _delete_server(self, servid):
372
		self.client.delete_server(servid)
373

  
374
	def _create_network(self, netname, **kwargs):
375
		net = self.client.create_network(netname, **kwargs)
376
		self.networks[net['id']] = net
377
		return net
378

  
379
	def _delete_network(self, netid):
380
		sys.stdout.write('\tDelete network %s '%netid)
381
		self.client.disconnect_network_nics(netid)
382
		wait = 3
383
		while True:
384
			try:
385
				self.client.delete_network(netid)
386
				print('\n\tSUCCESFULL COMMIT delete network %s'%netid)
387
				break
388
			except ClientError as err:
389
				self.assertEqual(err.status, 421)
390
				r = self.client.get_network_details(netid)
391
				time.sleep(wait)
392
				wait += 3
393
				sys.stdout.write('.')
394

  
395
	def if_not_all(foo):
396
		global TEST_ALL
397
		if TEST_ALL:
398
			return None
399
		return foo
400

  
401
	def assert_dicts_are_deeply_equal(self, d1, d2):
402
		for k,v in d1.items():
403
			self.assertTrue(d2.has_key(k))
404
			if isinstance(v, dict):
405
				self.assert_dicts_are_deeply_equal(v, d2[k])
406
			else:
407
				self.assertEqual(unicode(v), unicode(d2[k]))
408

  
409
	def test_000(self):
410
		"Prepare a full Cyclades test scenario"
411
		global TEST_ALL
412
		TEST_ALL = True
413

  
414
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
415
		self.server2 = self._create_server(self.servname2, self.flavorid+2, self.img)
416

  
417
		print('testing')
418
		sys.stdout.write(' test create server')
419
		self._test_create_server()
420
		print('...ok')
421

  
422
		sys.stdout.write(' test list servers')
423
		self._test_list_servers()
424
		print('...ok')
425

  
426
		print('- wait for test servers to build')
427
		self._wait_for_status(self.server1['id'], 'BUILD')
428
		self._wait_for_status(self.server2['id'], 'BUILD')
429
		print('- ok')
430

  
431
		sys.stdout.write(' test get server details')
432
		self._test_get_server_details()
433
		print('...ok')
434

  
435
		sys.stdout.write(' test get image details')
436
		self._test_get_image_details()
437
		print('...ok')
438

  
439
		sys.stdout.write(' test update_server_name')
440
		self._test_update_server_name()
441
		print('...ok')
442

  
443

  
444
		sys.stdout.write(' test reboot_server')
445
		self._test_reboot_server()
446
		print('...ok')
447

  
448
		print('- wait for test servers to boot')
449
		self._wait_for_status(self.server1['id'], 'REBOOT')
450
		self._wait_for_status(self.server2['id'], 'REBOOT')
451
		print('- ok')
452

  
453
		sys.stdout.write(' test create_server_metadata')
454
		self._test_create_server_metadata()
455
		print('...ok')
456

  
457
		sys.stdout.write(' test get_server_metadata')
458
		self._test_get_server_metadata()
459
		print('...ok')
460

  
461
		sys.stdout.write(' test update_server_metadata')
462
		self._test_update_server_metadata()
463
		print('...ok')
464

  
465
		sys.stdout.write(' test delete_server_metadata')
466
		self._test_delete_server_metadata()
467
		print('...ok')
468

  
469
		sys.stdout.write(' test list_flavors')
470
		self._test_list_flavors()
471
		print('...ok')
472

  
473
		sys.stdout.write(' test get_flavor_details')
474
		self._test_get_flavor_details()
475
		print('...ok')
476

  
477
		sys.stdout.write(' test list_images')
478
		self._test_list_images()
479
		print('...ok')
480

  
481
		sys.stdout.write(' test get_image_details')
482
		self._test_get_image_details()
483
		print('...ok')
484

  
485
		sys.stdout.write(' test get_image_metadata')
486
		self._test_get_image_metadata()
487
		print('...ok')
488

  
489
		sys.stdout.write(' test shutdown_server')
490
		self._test_shutdown_server()
491
		print('...ok')
492

  
493
		sys.stdout.write(' test start_server')
494
		self._test_start_server()
495
		print('...ok')
496

  
497
		sys.stdout.write(' test get_server_console')
498
		self._test_get_server_console()	
499
		print('...ok')
500

  
501
		sys.stdout.write(' test get_firewall_profile')
502
		self._test_get_firewall_profile()	
503
		print('...ok')
504

  
505
		sys.stdout.write(' test set_firewall_profile')
506
		self._test_set_firewall_profile()	
507
		print('...ok')
508

  
509
		sys.stdout.write(' test get_server_stats')
510
		self._test_get_server_stats()	
511
		print('...ok')
512

  
513
		self.network1 = self._create_network(self.netname1)
514

  
515
		sys.stdout.write(' test create_network')
516
		self._test_create_network()	
517
		print('...ok')
518

  
519
		print('- wait for netowork to be activated')
520
		self._wait_for_network(self.network1['id'], 'ACTIVE')
521
		print('- ok')
522

  
523
		sys.stdout.write(' test connect_server')
524
		self._test_connect_server()	
525
		print('...ok')
526

  
527
		sys.stdout.write(' test disconnect_server')
528
		self._test_disconnect_server()	
529
		print('...ok')
530

  
531
		self.network2 = self._create_network(self.netname2)
532
		print('- wait for netowork to be activated')
533
		self._wait_for_network(self.network2['id'], 'ACTIVE')
534
		print('- ok')
535

  
536
		sys.stdout.write(' test list_server_nics')
537
		self._test_list_server_nics()	
538
		print('...ok')
539

  
540
		sys.stdout.write(' test list_networks')
541
		self._test_list_networks()	
542
		print('...ok')
543

  
544
		sys.stdout.write(' test get_network_details')
545
		self._test_get_network_details()	
546
		print('...ok')
547

  
548
		sys.stdout.write(' test update_network_name')
549
		self._test_update_network_name()	
550
		print('...ok')
551

  
552
		"""Don't have auth for these:
553
		sys.stdout.write(' test delete_image')
554
		self._test_delete_image()
555
		print('...ok')
556
		sys.stdout.write(' test create_image_metadata')
557
		self._test_create_image_metadata()
558
		print('...ok')
559
		sys.stdout.write(' test update_image_metadata')
560
		self._test_update_image_metadata()
561
		print('...ok')
562
		sys.stdout.write(' test delete_image_metadata')
563
		self._test_delete_image_metadata()
564
		print('...ok')
565
		"""
566

  
567
	def _wait_for_network(self, netid, status):
568
		wait = 3
569
		limit = 50
570
		c=['|','/','-','\\']
571
		sys.stdout.write('\t- make net %s %s  '%(netid, status))
572
		while wait < limit:
573
			r = self.client.get_network_details(netid)
574
			if r['status'] == status:
575
				print('\tOK')
576
				return True
577
			sys.stdout.write('\tit is now %s, wait %ss  '%(r['status'], wait))
578
			for i in range(wait*4):
579
				sys.stdout.write('\b%s'%c[i%4])
580
				sys.stdout.flush()
581
				time.sleep(0.25)
582
			print('\b ')
583
			wait += 3
584
		return False
585

  
586
	def _wait_for_nic(self, netid, servid, in_creation=True):
587
		self._wait_for_network(netid, 'ACTIVE')
588
		c=['|','/','-','\\']
589
		limit = 50
590
		wait=3
591
		largetry = 0
592
		while wait < limit:
593
			nics = self.client.list_server_nics(servid)
594
			for net in nics:
595
				found_nic = net['network_id'] == netid
596
				if (in_creation and found_nic) or not (in_creation or found_nic):
597
					return True
598
			dis = '' if in_creation else 'dis'
599
			sys.stdout.write('\twait nic %s to %sconnect to %s: %ss  '%(netid, dis, servid, wait))
600
			for i in range(wait*4):
601
				sys.stdout.write('\b%s'%c[i%4])
602
				sys.stdout.flush()
603
				time.sleep(0.25)
604
			print('\b ')
605
			wait += 3
606
			if wait >= limit and largetry < 3:
607
				wait = 3
608
				largetry += 1
609
		return False
610

  
611
	def _has_status(self, servid, status):
612
		r = self.client.get_server_details(servid)
613
		return r['status'] == status
614
	def _wait_for_status(self, servid, status):
615
		wait = 0
616
		c=['|','/','-','\\']
617
		while self._has_status(servid, status):
618
			if wait:
619
				sys.stdout.write('\tServer %s in %s. Wait %ss  '%(servid, status, wait))
620
				for i in range(4*wait):
621
					sys.stdout.write('\b%s'%c[i%4])
622
					sys.stdout.flush()
623
					time.sleep(0.25)
624
				print('\b ')
625
			wait = (wait + 3) if wait<60 else 0
626

  
627
	@if_not_all
628
	def test_list_servers(self):
629
		"""Test list servers"""
630
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
631
		self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
632
		self._test_list_servers()
633

  
634
	def _test_list_servers(self):
635
		servers = self.client.list_servers()
636
		dservers = self.client.list_servers(detail=True)
637

  
638
		"""detailed and simple are same size"""
639
		self.assertEqual(len(dservers), len(servers))
640
		for i in range(len(servers)):
641
			for field in ['created', 'flavorRef', 'hostId', 'imageRef', 'progress',
642
				'status', 'updated']:
643
				self.assertFalse(servers[i].has_key(field))
644
				self.assertTrue(dservers[i].has_key(field))
645

  
646
		"""detailed and simple contain same names"""
647
		names = sorted(map(lambda x: x["name"], servers))
648
		dnames = sorted(map(lambda x: x["name"], dservers))
649
		self.assertEqual(names, dnames)
650

  
651
	@if_not_all
652
	def test_create_server(self):
653
		"""Test create_server"""
654
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
655
		self._wait_for_status(self.server1['id'], 'BUILD')
656
		self._test_create_server()
657

  
658
	def _test_create_server(self):
659
		self.assertEqual(self.server1["name"], self.servname1)
660
		self.assertEqual(self.server1["flavorRef"], self.flavorid)
661
		self.assertEqual(self.server1["imageRef"], self.img)
662
		self.assertEqual(self.server1["status"], "BUILD")
663

  
664
	@if_not_all
665
	def test_get_server_details(self):
666
		"""Test get_server_details"""
667
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
668
		self._wait_for_status(self.server1['id'], 'BUILD')
669
		self._test_get_server_details()
670

  
671
	def _test_get_server_details(self):
672
		r = self.client.get_server_details(self.server1['id'])
673
		self.assertEqual(r["name"], self.servname1)
674
		self.assertEqual(r["flavorRef"], self.flavorid)
675
		self.assertEqual(r["imageRef"], self.img)
676
		self.assertEqual(r["status"], "ACTIVE")
677

  
678
	@if_not_all
679
	def test_get_image_details(self):
680
		"""Test get_image_details"""
681
		self._test_get_image_details()
682

  
683
	def _test_get_image_details(self):
684
		r = self.client.get_image_details(self.img)
685
		d = self.img_details
686
		self.assert_dicts_are_deeply_equal(r, d)
687

  
688
	@if_not_all
689
	def test_update_server_name(self):
690
		"""Test update_server_name"""
691
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
692
		self._test_update_server_name()
693

  
694
	def _test_update_server_name(self):
695
		new_name = self.servname1+'_new_name'
696
		self.client.update_server_name(self.server1['id'], new_name)
697
		r = self.client.get_server_details(self.server1['id'], success=(200, 400))
698
		self.assertEqual(r['name'], new_name)
699
		changed = self.servers.pop(self.servname1)
700
		changed['name'] = new_name
701
		self.servers[new_name] = changed
702

  
703
	@if_not_all
704
	def test_reboot_server(self):
705
		"""Test reboot server"""
706
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
707
		self._wait_for_status(self.server1['id'], 'BUILD')
708
		self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
709
		self._wait_for_status(self.server2['id'], 'BUILD')
710
		self._test_reboot_server()
711
		self._wait_for_status(self.server1['id'], 'REBOOT')
712
		self._wait_for_status(self.server2['id'], 'REBOOT')
713

  
714
	def _test_reboot_server(self):
715
		self.client.reboot_server(self.server1['id'])
716
		self.assertTrue(self._has_status(self.server1['id'], 'REBOOT'))
717
		self.client.reboot_server(self.server2['id'], hard=True)
718
		self.assertTrue(self._has_status(self.server2['id'], 'REBOOT'))
719

  
720
	@if_not_all
721
	def test_get_server_metadata(self):
722
		"""Test get server_metadata"""
723
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
724
		self._test_get_server_metadata()
725
	def _test_get_server_metadata(self):
726
		self.client.create_server_metadata(self.server1['id'], 'mymeta_0', 'val_0')
727
		r = self.client.get_server_metadata(self.server1['id'], 'mymeta_0')
728
		self.assertEqual(r['mymeta_0'], 'val_0')
729

  
730
	@if_not_all
731
	def test_create_server_metadata(self):
732
		"""Test create_server_metadata"""
733
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
734
		self._test_create_server_metadata()
735

  
736
	def _test_create_server_metadata(self):
737
		r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'mymeta val')
738
		self.assertTrue(r1.has_key('mymeta'))
739
		r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
740
		self.assert_dicts_are_deeply_equal(r1, r2)
741

  
742
	@if_not_all
743
	def test_update_server_metadata(self):
744
		"""Test update_server_metadata"""
745
		self.server1=self._create_server(self.servname1, self.flavorid, self.img)
746
		self._test_update_server_metadata()
747

  
748
	def _test_update_server_metadata(self):
749
		r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta3', 'val2')
750
		self.assertTrue(r1.has_key('mymeta3'))
751
		r2 = self.client.update_server_metadata(self.server1['id'], mymeta3='val3')
752
		self.assertTrue(r2['mymeta3'], 'val3')
753

  
754
	@if_not_all
755
	def test_delete_server_metadata(self):
756
		"""Test delete_server_metadata"""
757
		self.server1=self._create_server(self.servname1, self.flavorid, self.img)
758
		self._test_delete_server_metadata()
759

  
760
	def _test_delete_server_metadata(self):
761
		r1 = self.client.create_server_metadata(self.server1['id'], 'mymeta', 'val')
762
		self.assertTrue(r1.has_key('mymeta'))
763
		self.client.delete_server_metadata(self.server1['id'], 'mymeta')
764
		try:
765
			r2 = self.client.get_server_metadata(self.server1['id'], 'mymeta')
766
			raise ClientError('Wrong Error', status=100)
767
		except ClientError as err:
768
			self.assertEqual(err.status, 404)
769

  
770
	@if_not_all
771
	def test_list_flavors(self):
772
		"""Test flavors_get"""
773
		self._test_list_flavors()
774

  
775
	def _test_list_flavors(self):
776
		r = self.client.list_flavors()
777
		self.assertTrue(len(r) > 1)
778
		r = self.client.list_flavors(detail=True)
779
		self.assertTrue(r[0].has_key('SNF:disk_template'))
780

  
781
	@if_not_all
782
	def test_get_flavor_details(self):
783
		"""Test test_get_flavor_details"""
784
		self._test_get_flavor_details()
785

  
786
	def _test_get_flavor_details(self):
787
		r = self.client.get_flavor_details(self.flavorid)
788
		self.assert_dicts_are_deeply_equal(self.flavor_details, r)
789

  
790
	@if_not_all
791
	def test_list_images(self):
792
		"""Test list_images"""
793
		self._test_list_images()
794

  
795
	def _test_list_images(self):
796
		r = self.client.list_images()
797
		self.assertTrue(len(r) > 1)
798
		r = self.client.list_images(detail=True)
799
		for detailed_img in r:
800
			if detailed_img['id'] == self.img:
801
				break
802
		self.assert_dicts_are_deeply_equal(r[1], self.img_details)
803

  
804
	@if_not_all
805
	def test_image_details(self):
806
		"""Test image_details"""
807
		self._test_get_image_details
808

  
809
	def _test_get_image_details(self):
810
		r = self.client.get_image_details(self.img)
811
		self.assert_dicts_are_deeply_equal(r, self.img_details)
812

  
813
	@if_not_all
814
	def test_get_image_metadata(self):
815
		"""Test get_image_metadata"""
816
		self._test_get_image_metadata()
817

  
818
	def _test_get_image_metadata(self):
819
		r = self.client.get_image_metadata(self.img)
820
		self.assert_dicts_are_deeply_equal(self.img_details['metadata']['values'], r)
821
		for key,val in self.img_details['metadata']['values'].items():
822
			r = self.client.get_image_metadata(self.img, key)
823
			self.assertEqual(r[key], val)
824

  
825
	@if_not_all
826
	def test_start_server(self):
827
		"""Test start_server"""
828
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
829
		self._wait_for_status(self.server1['id'], 'BUILD')
830
		self.client.shutdown_server(self.server1['id'])
831
		self._wait_for_status(self.server1['id'], 'ACTIVE')
832
		self._test_start_server()
833

  
834
	def _test_start_server(self):
835
		self.client.start_server(self.server1['id'])
836
		self._wait_for_status(self.server1['id'], 'STOPPED')
837
		r = self.client.get_server_details(self.server1['id'])
838
		self.assertEqual(r['status'], 'ACTIVE')
839

  
840
	@if_not_all
841
	def test_shutdown_server(self):
842
		"""Test shutdown_server"""
843
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
844
		self._wait_for_status(self.server1['id'], 'BUILD')
845
		self._test_shutdown_server()
846

  
847
	def _test_shutdown_server(self):
848
		self.client.shutdown_server(self.server1['id'])
849
		self._wait_for_status(self.server1['id'], 'ACTIVE')
850
		r = self.client.get_server_details(self.server1['id'])
851
		self.assertEqual(r['status'], 'STOPPED')
852

  
853
	@if_not_all
854
	def test_get_server_console(self):
855
		"""Test get_server_console"""
856
		self.server2 = self._create_server(self.servname2, self.flavorid+1, self.img)
857
		self._test_get_server_console()
858

  
859
	def _test_get_server_console(self):
860
		self._wait_for_status(self.server2['id'], 'BUILD')
861
		r = self.client.get_server_console(self.server2['id'])
862
		self.assertTrue(r.has_key('host'))
863
		self.assertTrue(r.has_key('password'))
864
		self.assertTrue(r.has_key('port'))
865
		self.assertTrue(r.has_key('type'))
866

  
867
	@if_not_all
868
	def test_get_firewall_profile(self):
869
		"""Test get_firewall_profile"""
870
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
871
		self._test_get_firewall_profile()
872

  
873
	def _test_get_firewall_profile(self):
874
		self._wait_for_status(self.server1['id'], 'BUILD')
875
		fprofile = self.client.get_firewall_profile(self.server1['id'])
876
		self.assertTrue(fprofile in self.PROFILES)
877

  
878
	@if_not_all
879
	def test_set_firewall_profile(self):
880
		"""Test set_firewall_profile"""
881
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
882
		self._test_set_firewall_profile()
883

  
884
	def _test_set_firewall_profile(self):
885

  
886
		self._wait_for_status(self.server1['id'], 'BUILD')
887
		PROFILES=['DISABLED', 'ENABLED', 'DISABLED', 'PROTECTED']
888
		fprofile = self.client.get_firewall_profile(self.server1['id'])
889
		print('')
890
		for counter, fprofile in enumerate(PROFILES):
891
			start=fprofile
892
			npos = counter + 1
893
			nprofile = PROFILES[npos] if npos<len(PROFILES) else PROFILES[0]
894
			print('\tprofile swap %s: %s -> %s'%(npos, fprofile, nprofile))
895
			self.client.set_firewall_profile(self.server1['id'], nprofile)
896
			wait = 3
897
			c=['|','/','-','\\']
898
			while fprofile != nprofile:
899
				if wait%10 == 0:
900
					self.client.set_firewall_profile(self.server1['id'], nprofile)
901
				self.assertEqual(fprofile, start)
902
				sys.stdout.write('\t   profile is %s, wait %ss  '%(fprofile, wait))
903
				for i in range(4*wait):
904
					sys.stdout.write('\b%s'%c[i%4])
905
					sys.stdout.flush()
906
					time.sleep(0.25)
907
				wait += 3
908
				print('\b ')
909
				fprofile = self.client.get_firewall_profile(self.server1['id'])
910

  
911
	@if_not_all
912
	def test_get_server_stats(self):
913
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
914
		self._test_get_server_stats()
915

  
916
	def _test_get_server_stats(self):
917
		r = self.client.get_server_stats(self.server1['id'])
918
		for term in ('cpuBar', 'cpuTimeSeries', 'netBar', 'netTimeSeries', 'refresh'):
919
			self.assertTrue(r.has_key(term))
920

  
921
	@if_not_all
922
	def test_list_networks(self):
923
		"""Test list_network"""
924
		self.network1 = self._create_network(self.netname1)
925
		self._wait_for_network(self.network1['id'], 'ACTIVE')
926
		self._test_list_networks()
927

  
928
	def _test_list_networks(self):
929
		r = self.client.list_networks()
930
		self.assertTrue(len(r)>1)
931
		ids = [net['id'] for net in r]
932
		names = [net['name'] for net in r]
933
		self.assertTrue('1' in ids)
934
		self.assertTrue('public' in names)
935
		self.assertTrue(self.network1['id'] in ids)
936
		self.assertTrue(self.network1['name'] in names)
937

  
938
		r = self.client.list_networks(detail=True)
939
		ids = [net['id'] for net in r]
940
		names = [net['name'] for net in r]
941
		for net in r:
942
			self.assertTrue(net['id'] in ids)
943
			self.assertTrue(net['name'] in names)
944
			for term in ('status', 'updated', 'created'):
945
				self.assertTrue(term in net.keys())
946

  
947
	@if_not_all
948
	def test_create_network(self):
949
		"""Test create_network"""
950
		self.network1 = self._create_network(self.netname1)
951
		self._test_create_network()
952

  
953
	def _test_create_network(self):
954
		nets = self.client.list_networks(self.network1['id'])
955
		chosen = [net for net in nets if net['id'] == self.network1['id']][0]
956
		chosen.pop('updated')
957
		net1 = dict(self.network1)
958
		net1.pop('updated')
959
		self.assert_dicts_are_deeply_equal(chosen, net1)
960

  
961
	@if_not_all
962
	def test_connect_server(self):
963
		"""Test connect_server"""
964
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
965
		self.network1 = self._create_network(self.netname1)
966
		self._wait_for_status(self.server1['id'], 'BUILD')
967
		self._wait_for_network(self.network1['id'], 'ACTIVE')
968
		self._test_connect_server()
969

  
970
	def _test_connect_server(self):
971
		self.client.connect_server(self.server1['id'], self.network1['id'])
972
		self.assertTrue(self._wait_for_nic(self.network1['id'], self.server1['id']))
973

  
974
	@if_not_all
975
	def test_disconnect_server(self):
976
		"""Test disconnect_server"""
977
		self.test_connect_server()
978
		self._test_disconnect_server()
979

  
980
	def _test_disconnect_server(self):
981
		self.client.disconnect_server(self.server1['id'], self.network1['id'])
982
		self.assertTrue(self._wait_for_nic(self.network1['id'], self.server1['id'],
983
			in_creation=False))
984

  
985

  
986
	@if_not_all
987
	def test_list_server_nics(self):
988
		"""Test list_server_nics"""
989
		self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
990
		self.network2 = self._create_network(self.netname2)
991
		self._wait_for_status(self.server1['id'], 'BUILD')
992
		self._wait_for_network(self.network2['id'], 'ACTIVE')
993
		self._test_list_server_nics()
994

  
995
	def _test_list_server_nics(self):
996
		r = self.client.list_server_nics(self.server1['id'])
997
		len0 = len(r)
998
		self.assertTrue(len0>0)
999
		self.assertTrue('1' in [net['network_id'] for net in r])
1000

  
1001
		self.client.connect_server(self.server1['id'], self.network2['id'])
1002
		self.assertTrue(self._wait_for_nic(self.network2['id'], self.server1['id']))
1003
		r = self.client.list_server_nics(self.server1['id'])
1004
		self.assertTrue(len(r)>len0)
1005

  
1006
	@if_not_all
1007
	def test_get_network_details(self):
1008
		"""Test get_network_details"""
1009
		self.network1 = self._create_network(self.netname1)
1010
		self._test_get_network_details()
1011

  
1012
	def _test_get_network_details(self):
1013
		r = self.client.get_network_details(self.network1['id'])
1014
		net1 = dict(self.network1)
1015
		net1.pop('status')
1016
		net1.pop('updated', None)
1017
		net1.pop('attachments')
1018
		r.pop('status')
1019
		r.pop('updated', None)
1020
		r.pop('attachments')
1021
		self.assert_dicts_are_deeply_equal(net1, r)
1022

  
1023
	@if_not_all
1024
	def test_update_network_name(self):
1025
		self.network2 = self._create_network(self.netname2)
1026
		self._test_update_network_name()
1027

  
1028
	def _test_update_network_name(self):
1029
		updated_name = self.netname2+'_upd'
1030
		self.client.update_network_name(self.network2['id'], updated_name)
1031
		wait = 3
1032
		c=['|','/','-','\\']
1033
		r = self.client.get_network_details(self.network2['id'])
1034
		while wait < 50:
1035
			if r['name'] == updated_name:
1036
				break
1037
			sys.stdout.write('\twait for %s renaming (%s->%s) %ss  '%(self.network2['id'],
1038
				self.network2['name'], updated_name, wait))
1039
			for i in range(4*wait):
1040
				sys.stdout.write('\b%s'%c[i%4])
1041
				sys.stdout.flush()
1042
				time.sleep(0.25)
1043
			print('')
1044
			wait += 3
1045
			r = self.client.get_network_details(self.network2['id'])
1046
		self.assertEqual(r['name'], updated_name)
1047

  
1048
	""" Don't have auth to test this
1049
	@if_not_all
1050
	def test_delete_image(self):
1051
		""Test delete_image""
1052
		self._test_delete_image()
1053
	def _test_delete_image(self):
1054
		images = self.client.list_images()
1055
		self.client.delete_image(images[2]['id'])
1056
		try:
1057
			r = self.client.get_image_details(images[2]['id'], success=(400))
1058
		except ClientError as err:
1059
			self.assertEqual(err.status, 404)
1060

  
1061
	@if_not_all
1062
	def test_create_image_metadata(self):
1063
		""Test create_image_metadata""
1064
		self._test_create_image_metadata()
1065
	def _test_create_image_metadata(self):
1066
		r = self.client.create_image_metadata(self.img, 'mykey', 'myval')
1067
		self.assertEqual(r['mykey'], 'myval')
1068

  
1069
	@if_not_all
1070
	def test_update_image_metadata(self):
1071
		""Test update_image_metadata""
1072
		self._test_update_image_metadata()
1073
	def _test_update_image_metadata(self):
1074
		r = self.client.create_image_metadata(self.img, 'mykey0', 'myval')
1075
		r = self.client.update_image_metadata(self.img, 'mykey0', 'myval0')
1076
		self.assertEqual(r['mykey0'], 'myval0')
1077

  
1078
	@if_not_all
1079
	def test_delete_image_metadata(self):
1080
		""Test delete_image_metadata""
1081
		self._test_delete_image_metadata()
1082
	def _test_delete_image_metadata(self):
1083
		self.client.create_image_metadata(self.img, 'mykey1', 'myval1')
1084
		self.client.delete_image_metadata(self.img, 'mykey1')
1085
		r = self.client.get_image_metadata(self.img)
1086
		self.assertNotEqual(r.has_key('mykey1'))
1087
	"""
250
    """Set up a Cyclades thorough test"""
251
    def setUp(self):
252
        """okeanos"""
253
        url = 'https://cyclades.okeanos.grnet.gr/api/v1.1'
254
        global token
255
        global global_username
256
        #account = '%s@grnet.gr' % global_username
257
        self.img = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
258
        self.img_details = {
259
            u'status': u'ACTIVE',
260
            u'updated': u'2012-10-16T09:04:17+00:00',
261
            u'name': u'Debian Base',
262
            u'created': u'2012-10-16T09:03:12+00:00',
263
            u'progress': 100,
264
            u'id': 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf',
265
            u'metadata': {
266
                u'values': {
267
                    u'kernel': u'2.6.32',
268
                    u'osfamily': u'linux',
269
                    u'users': u'root',
270
                    u'gui': u'No GUI',
271
                    u'sortorder': u'1',
272
                    u'os': u'debian',
273
                    u'root_partition': u'1',
274
                    u'description': u'Debian 6.0.6 (Squeeze) Base System',
275
                    u'partition_table': u'msdos'}
276
                }
277
            }
278
        self.flavor_details = {u'name': u'C1R1024D20',
279
            u'ram': 1024,
280
            u'id': 1,
281
            u'SNF:disk_template': u'drbd',
282
            u'disk': 20,
283
            u'cpu': 1}
284
        self.PROFILES = ('ENABLED', 'DISABLED', 'PROTECTED')
285

  
286
        """okeanos.io"""
287
        #url = 'https://cyclades.okeanos.io/api/v1.1'
288
        #global token
289
        #account='%s@grnet.gr'%global_username
290
        #self.img = '43cc8497-61c3-4c46-ae8d-3e33861f8527'
291
        #self.img_details= {
292
        #    u'status': u'ACTIVE',
293
        #    u'updated': u'2012-08-21T12:57:39+00:00',
294
        #    u'name': u'Debian Base',
295
        #    u'created': u'2012-08-21T12:56:53+00:00',
296
        #    u'progress': 100,
297
        #    u'id': u'43cc8497-61c3-4c46-ae8d-3e33861f8527',
298
        #    u'metadata': {
299
        #        u'values': {
300
        #            u'kernel': u'2.6.32',
301
        #            u'osfamily': u'linux',
302
        #            u'users': u'root',
303
        #            u'gui': u'No GUI',
304
        #            u'sortorder': u'1',
305
        #            u'os': u'debian',
306
        #            u'root_partition':
307
        #            u'1', u'description':
308
        #            u'Debian Squeeze Base System'}
309
        #        }
310
        #    }
311
        #flavorid = 1
312

  
313
        self.servers = {}
314
        self.now = time.mktime(time.gmtime())
315
        self.servname1 = 'serv' + unicode(self.now)
316
        self.servname2 = self.servname1 + '_v2'
317
        self.flavorid = 1
318
        #servers have to be created at the begining...
319
        self.networks = {}
320
        self.netname1 = 'net' + unicode(self.now)
321
        self.netname2 = 'net' + unicode(self.now) + '_v2'
322

  
323
        self.client = cyclades(url, token)
324
        pass
325

  
326
    def tearDown(self):
327
        """Destoy servers used in testing"""
328
        print
329
        for netid in self.networks.keys():
330
            self._delete_network(netid)
331
        if 0 >= len(self.servers):
332
            return
333
        there_are_servers_running = True
334
        deleted_servers = {}
335
        waitime = 0
336
        print('-> Found %s servers to delete' % len(self.servers))
337
        while there_are_servers_running:
338
            there_are_servers_running = False
339
            if waitime > 0:
340
                c = ['|', '/', '-', '\\']
341
                suffix = ''
342
                sys.stdout.write('\t. . . wait %s seconds: ' % waitime)
343
                for i in range(4 * waitime):
344
                    oldlen = len(suffix)
345
                    suffix = '%ss %s' % (i / 4, c[i % 4])
346
                    sys.stdout.write(oldlen * '\b' + suffix)
347
                    sys.stdout.flush()
348
                    time.sleep(0.25)
349
                oldlen = len(': ' + suffix)
350
                print(oldlen * '\b' + oldlen * ' ')
351
                sys.stdout.flush()
352
            waitime += 3
353
            dservers = self.client.list_servers(detail=True)
354
            for server in dservers:
355
                if server['name'] in self.servers.keys():
356
                    there_are_servers_running = True
357
                    sys.stdout.write('\t%s status:%s '\
358
                        % (server['name'], server['status']))
359
                    if server['status'] == 'BUILD':
360
                        print('\twait...')
361
                    else:
362
                        print('\tDELETE %s' % server['name'])
363
                        self._delete_server(server['id'])
364
                        self.servers.pop(server['name'])
365
                        deleted_servers[server['name']] = 0
366
                        waitime = 0
367
                elif server['name'] in deleted_servers.keys():
368
                    there_are_servers_running = True
369
                    sys.stdout.write('\t%s status:%s '\
370
                        % (server['name'], server['status']))
371
                    retries = deleted_servers[server['name']]
372
                    if retries > 10:
373
                        print('\tretry DELETE %s'\
374
                            % server['name'])
375
                        self._delete_server(server['id'])
376
                        retries = 0
377
                        waitime = 0
378
                    else:
379
                        print('\tnot deleted yet ...')
380
                    deleted_servers[server['name']] = retries + 1
381

  
382
    def _create_server(self, servername, flavorid, imageid, personality=None):
383
        server = self.client.create_server(servername,
384
            flavorid,
385
            imageid,
386
            personality)
387
        self.servers[servername] = server
388
        return server
389

  
390
    def _delete_server(self, servid):
391
        self.client.delete_server(servid)
392

  
393
    def _create_network(self, netname, **kwargs):
394
        net = self.client.create_network(netname, **kwargs)
395
        self.networks[net['id']] = net
396
        return net
397

  
398
    def _delete_network(self, netid):
399
        sys.stdout.write('\tDelete network %s ' % netid)
400
        self.client.disconnect_network_nics(netid)
401
        wait = 3
402
        while True:
403
            try:
404
                self.client.delete_network(netid)
405
                print('\n\tSUCCESFULL COMMIT delete network %s' % netid)
406
                break
407
            except ClientError as err:
408
                self.assertEqual(err.status, 421)
409
                time.sleep(wait)
410
                wait += 3
411
                sys.stdout.write('.')
412

  
413
    def if_not_all(foo):
414
        global TEST_ALL
415
        if TEST_ALL:
416
            return None
417
        return foo
418

  
419
    def assert_dicts_are_deeply_equal(self, d1, d2):
420
        for k, v in d1.items():
421
            self.assertTrue(k in d2)
422
            if isinstance(v, dict):
423
                self.assert_dicts_are_deeply_equal(v, d2[k])
424
            else:
425
                self.assertEqual(unicode(v), unicode(d2[k]))
426

  
427
    def test_000(self):
428
        "Prepare a full Cyclades test scenario"
429
        global TEST_ALL
430
        TEST_ALL = True
431

  
432
        self.server1 = self._create_server(self.servname1,
433
            self.flavorid,
434
            self.img)
435
        self.server2 = self._create_server(self.servname2,
436
            self.flavorid + 2,
437
            self.img)
438

  
439
        print('testing')
440
        sys.stdout.write(' test create server')
441
        self._test_create_server()
442
        print('...ok')
443

  
444
        sys.stdout.write(' test list servers')
445
        self._test_list_servers()
446
        print('...ok')
447

  
448
        print('- wait for test servers to build')
449
        self._wait_for_status(self.server1['id'], 'BUILD')
450
        self._wait_for_status(self.server2['id'], 'BUILD')
451
        print('- ok')
452

  
453
        sys.stdout.write(' test get server details')
454
        self._test_get_server_details()
455
        print('...ok')
456

  
457
        sys.stdout.write(' test get image details')
458
        self._test_get_image_details()
459
        print('...ok')
460

  
461
        sys.stdout.write(' test update_server_name')
462
        self._test_update_server_name()
463
        print('...ok')
464

  
465
        sys.stdout.write(' test reboot_server')
466
        self._test_reboot_server()
467
        print('...ok')
468

  
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff