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