blob: 97e43821b94ed79981335887c577fbc6eb5f9fb7 [file] [log] [blame]
David Kranz779c7f82012-05-01 16:50:32 -04001# Copyright 2011 Quanta Research Cambridge, Inc.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
Matthew Treinish8d6836b2012-12-10 10:07:56 -050015import random
16import telnetlib
17import time
David Kranz779c7f82012-05-01 16:50:32 -040018
David Kranz779c7f82012-05-01 16:50:32 -040019import pending_action
Matthew Treinish8d6836b2012-12-10 10:07:56 -050020import test_case
David Kranz779c7f82012-05-01 16:50:32 -040021
22
23class TestChangeFloatingIp(test_case.StressTestCase):
24 """Add or remove a floating ip from a vm."""
25
26 def __init__(self):
27 super(TestChangeFloatingIp, self).__init__()
28 self.server_ids = None
29
30 def run(self, manager, state, *pargs, **kwargs):
Zhongyue Luoe471d6e2012-09-17 17:02:43 +080031 if self.server_ids is None:
David Kranz779c7f82012-05-01 16:50:32 -040032 vms = state.get_instances()
33 self.server_ids = [k for k, v in vms.iteritems()]
34 floating_ip = random.choice(state.get_floating_ips())
35 if floating_ip.change_pending:
36 return None
37 floating_ip.change_pending = True
38 timeout = int(kwargs.get('timeout', 60))
Zhongyue Luoa1343de2013-01-04 16:21:35 +080039 cli = manager.floating_ips_client
Zhongyue Luoe471d6e2012-09-17 17:02:43 +080040 if floating_ip.server_id is None:
David Kranz779c7f82012-05-01 16:50:32 -040041 server = random.choice(self.server_ids)
42 address = floating_ip.address
43 self._logger.info('Adding %s to server %s' % (address, server))
Zhongyue Luoa1343de2013-01-04 16:21:35 +080044 resp, body = cli.associate_floating_ip_to_server(address,
45 server)
David Kranz779c7f82012-05-01 16:50:32 -040046 if resp.status != 202:
47 raise Exception("response: %s body: %s" % (resp, body))
48 floating_ip.server_id = server
49 return VerifyChangeFloatingIp(manager, floating_ip,
50 timeout, add=True)
51 else:
52 server = floating_ip.server_id
53 address = floating_ip.address
54 self._logger.info('Removing %s from server %s' % (address, server))
Zhongyue Luoa1343de2013-01-04 16:21:35 +080055 resp, body = cli.disassociate_floating_ip_from_server(address,
56 server)
David Kranz779c7f82012-05-01 16:50:32 -040057 if resp.status != 202:
58 raise Exception("response: %s body: %s" % (resp, body))
59 return VerifyChangeFloatingIp(manager, floating_ip,
60 timeout, add=False)
61
62
63class VerifyChangeFloatingIp(pending_action.PendingAction):
Sean Daguef237ccb2013-01-04 15:19:14 -050064 """Verify that floating ip was changed."""
David Kranz779c7f82012-05-01 16:50:32 -040065 def __init__(self, manager, floating_ip, timeout, add=None):
66 super(VerifyChangeFloatingIp, self).__init__(manager, timeout=timeout)
67 self.floating_ip = floating_ip
68 self.add = add
69
70 def retry(self):
71 """
72 Check to see that we can contact the server at its new address.
73 """
74 try:
75 conn = telnetlib.Telnet(self.floating_ip.address, 22, timeout=0.5)
76 conn.close()
77 if self.add:
78 self._logger.info('%s added [%.1f secs elapsed]' %
Zhongyue Luo79d8d362012-09-25 13:49:27 +080079 (self.floating_ip.address, self.elapsed()))
David Kranz779c7f82012-05-01 16:50:32 -040080 self.floating_ip.change_pending = False
81 return True
Matthew Treinish8d6836b2012-12-10 10:07:56 -050082 except Exception:
David Kranz779c7f82012-05-01 16:50:32 -040083 if not self.add:
84 self._logger.info('%s removed [%.1f secs elapsed]' %
Zhongyue Luo79d8d362012-09-25 13:49:27 +080085 (self.floating_ip.address, self.elapsed()))
David Kranz779c7f82012-05-01 16:50:32 -040086 self.floating_ip.change_pending = False
87 self.floating_ip.server_id = None
88 return True
89 return False