Revision 3eaf0ec5 snf-tools/synnefo_tools/burnin/cyclades_common.py

b/snf-tools/synnefo_tools/burnin/cyclades_common.py
52 52
# Too many public methods. pylint: disable-msg=R0904
53 53
class CycladesTests(BurninTests):
54 54
    """Extends the BurninTests class for Cyclades"""
55
    def _ry_until_timeout_expires(self, opmsg, check_fun):
55
    def _try_until_timeout_expires(self, opmsg, check_fun):
56 56
        """Try to perform an action until timeout expires"""
57 57
        assert callable(check_fun), "Not a function"
58 58

  
......
95 95
            self.info("Getting simple list of servers")
96 96
        return self.clients.cyclades.list_servers(detail=detail)
97 97

  
98
    def _get_server_details(self, server):
98
    def _get_list_of_networks(self, detail=False):
99
        """Get (detailed) list of networks"""
100
        if detail:
101
            self.info("Getting detailed list of networks")
102
        else:
103
            self.info("Getting simple list of networks")
104
        return self.clients.cyclades.list_networks(detail=detail)
105

  
106
    def _get_server_details(self, server, quiet=False):
99 107
        """Get details for a server"""
100
        self.info("Getting details for server %s with id %s",
101
                  server['name'], server['id'])
108
        if not quiet:
109
            self.info("Getting details for server %s with id %s",
110
                      server['name'], server['id'])
102 111
        return self.clients.cyclades.get_server_details(server['id'])
103 112

  
104
    def _create_server(self, name, image, flavor, personality):
113
    def _create_server(self, image, flavor, personality=None):
105 114
        """Create a new server"""
106
        self.info("Creating a server with name %s", name)
115
        servername = "%s for %s" % (self.run_id, image['name'])
116
        self.info("Creating a server with name %s", servername)
107 117
        self.info("Using image %s with id %s", image['name'], image['id'])
108 118
        self.info("Using flavor %s with id %s", flavor['name'], flavor['id'])
109 119
        server = self.clients.cyclades.create_server(
110
            name, flavor['id'], image['id'], personality=personality)
120
            servername, flavor['id'], image['id'], personality=personality)
111 121

  
112 122
        self.info("Server id: %s", server['id'])
113 123
        self.info("Server password: %s", server['adminPass'])
114 124

  
115
        self.assertEqual(server['name'], name)
125
        self.assertEqual(server['name'], servername)
116 126
        self.assertEqual(server['flavor']['id'], flavor['id'])
117 127
        self.assertEqual(server['image']['id'], image['id'])
118 128
        self.assertEqual(server['status'], "BUILD")
......
144 154
        self.info("User's login name: %s", ret_user)
145 155
        return ret_user
146 156

  
147
    def _insist_on_server_transition(self, server, curr_status, new_status):
148
        """Insist on server transiting from curr_status to new_status"""
157
    def _insist_on_server_transition(self, server, curr_statuses, new_status):
158
        """Insist on server transiting from curr_statuses to new_status"""
149 159
        def check_fun():
150 160
            """Check server status"""
151
            srv = self.clients.cyclades.get_server_details(server['id'])
152
            if srv['status'] == curr_status:
161
            srv = self._get_server_details(server, quiet=True)
162
            if srv['status'] in curr_statuses:
153 163
                raise Retry()
154 164
            elif srv['status'] == new_status:
155 165
                return
156 166
            else:
157
                msg = "Server %s went to unexpected status %s"
158
                self.error(msg, server['name'], srv['status'])
159
                self.fail(msg % (server['name'], srv['status']))
160
        opmsg = "Waiting for server %s to transit from %s to %s"
161
        self.info(opmsg, server['name'], curr_status, new_status)
162
        opmsg = opmsg % (server['name'], curr_status, new_status)
167
                msg = "Server \"%s\" with id %s went to unexpected status %s"
168
                self.error(msg, server['name'], server['id'], srv['status'])
169
                self.fail(msg % (server['name'], server['id'], srv['status']))
170
        opmsg = "Waiting for server \"%s\" to become %s"
171
        self.info(opmsg, server['name'], new_status)
172
        opmsg = opmsg % (server['name'], new_status)
173
        self._try_until_timeout_expires(opmsg, check_fun)
174

  
175
    def _insist_on_network_transition(self, network,
176
                                      curr_statuses, new_status):
177
        """Insist on network transiting from curr_statuses to new_status"""
178
        def check_fun():
179
            """Check network status"""
180
            ntw = self.clients.cyclades.get_network_details(network['id'])
181
            if ntw['status'] in curr_statuses:
182
                raise Retry()
183
            elif ntw['status'] == new_status:
184
                return
185
            else:
186
                msg = "Network %s with id %s went to unexpected status %s"
187
                self.error(msg, network['name'], network['id'], ntw['status'])
188
                self.fail(msg %
189
                          (network['name'], network['id'], ntw['status']))
190
        opmsg = "Waiting for network \"%s\" to become %s"
191
        self.info(opmsg, network['name'], new_status)
192
        opmsg = opmsg % (network['name'], new_status)
193
        self._try_until_timeout_expires(opmsg, check_fun)
194

  
195
    def _insist_on_network_connection(self, server, network, disconnect=False):
196
        """Insist that the server has connected to the network"""
197
        def check_fun():
198
            """Check network connection"""
199
            dsrv = self._get_server_details(server, quiet=True)
200
            nets = [s['network_id'] for s in dsrv['attachments']]
201
            if not disconnect and network['id'] not in nets:
202
                raise Retry()
203
            if disconnect and network['id'] in nets:
204
                raise Retry()
205
        if disconnect:
206
            opmsg = \
207
                "Waiting for server \"%s\" to disconnect from network \"%s\""
208
        else:
209
            opmsg = "Waiting for server \"%s\" to connect to network \"%s\""
210
        self.info(opmsg, server['name'], network['name'])
211
        opmsg = opmsg % (server['name'], network['name'])
163 212
        self._try_until_timeout_expires(opmsg, check_fun)
164 213

  
165 214
    def _insist_on_tcp_connection(self, family, host, port):
......
192 241
        opmsg = opmsg % (familystr.get(family, "Unknown"), host, port)
193 242
        return self._try_until_timeout_expires(opmsg, check_fun)
194 243

  
195
    def _get_ip(self, server, version=4):
196
        """Get the public IP of a server from the detailed server info"""
244
    def _get_ip(self, server, version=4, network=None):
245
        """Get the IP of a server from the detailed server info
246

  
247
        If network not given then get the public IP. Else the ip
248
        attached to that network
249

  
250
        """
197 251
        assert version in (4, 6)
198 252

  
199 253
        nics = server['attachments']
200
        public_addrs = None
254
        addrs = None
201 255
        for nic in nics:
202 256
            net_id = nic['network_id']
203
            if self.clients.cyclades.get_network_details(net_id)['public']:
204
                public_addrs = nic['ipv' + str(version)]
257
            if network is None:
258
                if self.clients.cyclades.get_network_details(net_id)['public']:
259
                    addrs = nic['ipv' + str(version)]
260
                    break
261
            else:
262
                if net_id == network['id']:
263
                    addrs = nic['ipv%s' % version]
264
                    break
205 265

  
206
        self.assertIsNotNone(public_addrs)
207
        msg = "Server's public IPv%s is %s"
208
        self.info(msg, version, public_addrs)
209
        return public_addrs
266
        self.assertIsNotNone(addrs, "Can not get IP from server attachments")
267
        if network is None:
268
            msg = "Server's public IPv%s is %s"
269
            self.info(msg, version, addrs)
270
        else:
271
            msg = "Server's IPv%s attached to network \"%s\" is %s"
272
            self.info(msg, version, network['id'], addrs)
273
        return addrs
210 274

  
211 275
    def _insist_on_ping(self, ip_addr, version=4):
212 276
        """Test server responds to a single IPv4 of IPv6 ping"""
......
284 348
            remote_content = base64.b64encode(ftmp.read())
285 349
            self.assertEqual(content, remote_content)
286 350

  
351
    def _disconnect_from_network(self, server, network):
352
        """Disconnect server from network"""
353
        nid = None
354
        for nic in server['attachments']:
355
            if nic['network_id'] == network['id']:
356
                nid = nic['id']
357
                break
358
        self.assertIsNotNone(nid, "Could not find network card")
359
        self.clients.cyclades.disconnect_server(server['id'], nid)
360

  
287 361

  
288 362
class Retry(Exception):
289 363
    """Retry the action

Also available in: Unified diff