Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests / cyclades.py @ 02846a75

History | View | Annotate | Download (7.5 kB)

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

    
34
import time
35
from progress.bar import ShadyBar
36

    
37
from kamaki.clients import tests, ClientError
38
from kamaki.clients.cyclades import CycladesClient
39

    
40

    
41
class Cyclades(tests.Generic):
42
    """Set up a Cyclades thorough test"""
43
    def setUp(self):
44

    
45
        """okeanos"""
46
        self.img = 'b2dffe52-64a4-48c3-8a4c-8214cc3165cf'
47
        self.img_details = {
48
            u'status': u'ACTIVE',
49
            u'updated': u'2012-11-19T13:52:16+00:00',
50
            u'name': u'Debian Base',
51
            u'created': u'2012-10-16T09:03:12+00:00',
52
            u'progress': 100,
53
            u'id': self.img,
54
            u'metadata': {
55
                u'values': {
56
                    u'kernel': u'2.6.32',
57
                    u'osfamily': u'linux',
58
                    u'users': u'root',
59
                    u'gui': u'No GUI',
60
                    u'sortorder': u'1',
61
                    u'os': u'debian',
62
                    u'root_partition': u'1',
63
                    u'description': u'Debian 6.0.6 (Squeeze) Base System'}
64
                }
65
            }
66
        self.flavor_details = {u'name': u'C1R1024D20',
67
            u'ram': 1024,
68
            u'id': 1,
69
            u'SNF:disk_template': u'drbd',
70
            u'disk': 20,
71
            u'cpu': 1}
72
        self.PROFILES = ('ENABLED', 'DISABLED', 'PROTECTED')
73

    
74
        self.servers = {}
75
        self.now = time.mktime(time.gmtime())
76
        self.servname1 = 'serv' + unicode(self.now)
77
        self.servname2 = self.servname1 + '_v2'
78
        self.servname1 += '_v1'
79
        self.flavorid = 1
80
        #servers have to be created at the begining...
81
        self.networks = {}
82
        self.netname1 = 'net' + unicode(self.now)
83
        self.netname2 = 'net' + unicode(self.now) + '_v2'
84

    
85
        self.client = CycladesClient(self['compute', 'url'], self['token'])
86
        pass
87

    
88
    def tearDown(self):
89
        """Destoy servers used in testing"""
90
        self.do_with_progress_bar(
91
            self._delete_network,
92
            'Delete %s networks' % len(self.networks),
93
            self.networks.keys())
94
        server_list = [server['id'] for server in self.servers.values()]
95
        self.do_with_progress_bar(
96
            self._delete_server,
97
            'Delete %s servers %s' % (len(server_list), server_list),
98
            server_list)
99

    
100
    def _create_server(self, servername, flavorid, imageid, personality=None):
101
        server = self.client.create_server(servername,
102
            flavorid,
103
            imageid,
104
            personality)
105
        self.servers[servername] = server
106
        return server
107

    
108
    def _delete_server(self, servid):
109
        try:
110
            current_state = self.client.get_server_details(servid)
111
            current_state = current_state['status']
112
            if current_state == 'DELETED':
113
                return
114
        except:
115
            return
116
        self._wait_for_status(servid, current_state)
117
        self.client.delete_server(servid)
118

    
119
    def _create_network(self, netname, **kwargs):
120
        net = self.client.create_network(netname, **kwargs)
121
        self.networks[net['id']] = net
122
        return net
123

    
124
    def _delete_network(self, netid):
125
        print('Disconnect nics of network %s' % netid)
126
        self.client.disconnect_network_nics(netid)
127

    
128
        def netwait(self, wait):
129
            try:
130
                self.client.delete_network(netid)
131
            except ClientError:
132
                time.sleep(wait)
133
        self.do_with_progress_bar(
134
            netwait,
135
            'Delete network %s' % netid,
136
            self._waits[:5])
137

    
138
    def _wait_for_network(self, netid, status):
139

    
140
        def netwait(self, wait):
141
            r = self.client.get_network_details(netid)
142
            if r['status'] == status:
143
                return
144
            time.sleep(wait)
145
        self.do_with_progress_bar(
146
            netwait,
147
            'Wait network %s to reach status %s' % (netid, status),
148
            self._waits[:5])
149

    
150
    def _wait_for_nic(self, netid, servid, in_creation=True):
151
        self._wait_for_network(netid, 'ACTIVE')
152

    
153
        def nicwait(self, wait):
154
            nics = self.client.list_server_nics(servid)
155
            for net in nics:
156
                found_nic = net['network_id'] == netid
157
                if (in_creation and found_nic)\
158
                or not (in_creation or found_nic):
159
                    return
160
            time.sleep(wait)
161
        self.do_with_progress_bar(
162
            nicwait,
163
            'Wait nic-%s-%s to %sconnect' % (
164
                netid,
165
                servid,
166
                '' if in_creation else 'dis'),
167
            self._waits[:5])
168

    
169
    def _has_status(self, servid, status):
170
        r = self.client.get_server_details(servid)
171
        return r['status'] == status
172

    
173
    def _wait_for_status(self, servid, status):
174
        (wait_bar, wait_cb) = self._safe_progress_bar(
175
            'Server %s in %s' % (servid, status))
176
        self.client.wait_server(servid, status, wait_cb=wait_cb)
177
        self._safe_progress_bar_finish(wait_bar)
178

    
179
    def test_list_servers(self):
180
        """Test list servers"""
181
        self.server1 = self._create_server(
182
            self.servname1,
183
            self.flavorid,
184
            self.img)
185
        return
186
        self.server2 = self._create_server(
187
            self.servname2,
188
            self.flavorid + 2,
189
            self.img)
190
        self._test_list_servers()
191

    
192
    def _test_list_servers(self):
193
        servers = self.client.list_servers()
194
        dservers = self.client.list_servers(detail=True)
195

    
196
        """detailed and simple are same size"""
197
        self.assertEqual(len(dservers), len(servers))
198
        for i in range(len(servers)):
199
            for field in ('created',
200
            'flavorRef',
201
            'hostId',
202
            'imageRef',
203
            'progress',
204
            'status',
205
            'updated'):
206
                self.assertFalse(field in servers[i])
207
                self.assertTrue(field in dservers[i])
208

    
209
        """detailed and simple contain same names"""
210
        names = sorted(map(lambda x: x["name"], servers))
211
        dnames = sorted(map(lambda x: x["name"], dservers))
212
        self.assertEqual(names, dnames)