blob: d387ce123d441695b16455998b779f88a781d772 [file] [log] [blame]
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +02001import logging
Ievgeniia Zadorozhna97dfde42022-06-17 20:05:09 +03002import sys
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +02003import time
4
5import pytest
6from texttable import Texttable
7
8import utils
9from utils import os_client
10from utils import ssh
11
12
13logger = logging.getLogger(__name__)
14
15
16def test_vm2vm(openstack_clients, pair, os_resources, record_property):
17 """
18 Simplified Performance Tests VM to VM test in different topologies
19 1. Create 4 VMs admin project
20 2. Associate floating IPs to the VMs
21 3. Connect to each VM via SSH and install iperf3
22 4. Measure VM to VM on same node via Private IP, 1 thread
23 5. Measure VM to VM on different HW nodes via Private IP, 1 thread
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +030024 6. Measure VM to VM on different HW nodes via Private IP, multiple threads
25 (10 by default)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020026 7. Measure VM to VM on different HW nodes via Floating IP, 1 thread
27 8. Measure VM to VM on different HW nodes, each VM is in separate network,
28 the networks are connected using Router via Private IP, 1 thread
29 9. Draw the table with all pairs and results
30 """
31 os_actions = os_client.OSCliActions(openstack_clients)
32 config = utils.get_configuration()
33 timeout = int(config.get('nova_timeout', 30))
34 iperf_time = int(config.get('iperf_time', 60))
35 private_key = os_resources['keypair'].private_key
36 ssh_timeout = int(config.get('ssh_timeout', 500))
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +030037 threads = int(config.get('multiple_threads_number', 10))
Ievgeniia Zadorozhna90aa8022022-08-11 18:00:23 +030038 iperf_utility = config.get('multiple_threads_iperf_utility', 'iperf3')
39 utils.check_iperf_utility(iperf_utility)
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +030040 result_table = Texttable(max_width=120)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020041
42 try:
43 zone1 = [service.zone for service in
44 openstack_clients.compute.services.list() if
45 service.host == pair[0]]
46 zone2 = [service.zone for service in
47 openstack_clients.compute.services.list()
48 if service.host == pair[1]]
49
50 # create 4 VMs
51 logger.info("Creating 4 VMs...")
52 vm1 = os_actions.create_basic_server(
53 os_resources['image_id'], os_resources['flavor_id'],
54 os_resources['net1'], '{0}:{1}'.format(zone1[0], pair[0]),
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +030055 [os_resources['sec_group']['name']], os_resources['keypair'].name)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020056 logger.info("Created VM {}.".format(vm1.id))
57
58 vm2 = os_actions.create_basic_server(
59 os_resources['image_id'], os_resources['flavor_id'],
60 os_resources['net1'], '{0}:{1}'.format(zone1[0], pair[0]),
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +030061 [os_resources['sec_group']['name']], os_resources['keypair'].name)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020062 logger.info("Created VM {}.".format(vm2.id))
63
64 vm3 = os_actions.create_basic_server(
65 os_resources['image_id'], os_resources['flavor_id'],
66 os_resources['net1'], '{0}:{1}'.format(zone2[0], pair[1]),
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +030067 [os_resources['sec_group']['name']], os_resources['keypair'].name)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020068 logger.info("Created VM {}.".format(vm3.id))
69
70 vm4 = os_actions.create_basic_server(
71 os_resources['image_id'], os_resources['flavor_id'],
72 os_resources['net2'], '{0}:{1}'.format(zone2[0], pair[1]),
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +030073 [os_resources['sec_group']['name']], os_resources['keypair'].name)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020074 logger.info("Created VM {}.".format(vm4.id))
75
76 vm_info = []
77 vms = []
78 vms.extend([vm1, vm2, vm3, vm4])
79 fips = []
80 time.sleep(5)
81
82 # Associate FIPs and check VMs are Active
83 logger.info("Creating Floating IPs and associating them...")
84 for i in range(4):
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +030085 fip = os_actions.create_floating_ip(os_resources['ext_net']['id'])
86 fips.append(fip['id'])
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020087 os_actions.check_vm_is_active(vms[i].id, timeout=timeout)
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +030088 vms[i].add_floating_ip(fip['floating_ip_address'])
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020089 private_address = vms[i].addresses[
90 list(vms[i].addresses.keys())[0]][0]['addr']
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +030091 vm_info.append({'vm': vms[i], 'fip': fip['floating_ip_address'],
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020092 'private_address': private_address})
93 # Check VMs are reachable and prepare iperf3
94 transport1 = ssh.SSHTransport(vm_info[0]['fip'], 'ubuntu',
95 password='dd', private_key=private_key)
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +030096 logger.info("Checking VMs are reachable via SSH, getting MTU...")
97 mtus = []
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020098 for i in range(4):
99 if transport1.check_vm_is_reachable_ssh(
100 floating_ip=vm_info[i]['fip'], timeout=ssh_timeout):
101 ssh.prepare_iperf(vm_info[i]['fip'], private_key=private_key)
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300102 mtus.append(transport1.get_mtu_from_vm(
103 vm_info[i]['fip'], private_key=private_key))
104 logger.info("MTU at networks: {}, {}".format(os_resources['net1']['mtu'],
105 os_resources['net2']['mtu']))
106 logger.info("MTU at VMs: {}".format(", ".join(mtus)))
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200107
108 # Prepare the result table and run iperf3
109 table_rows = []
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300110 table_rows.append(['Test Case', 'Host 1', 'Host 2',
111 'MTU at VMs', 'Result'])
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200112 # Do iperf3 measurement #1
113 logger.info("Doing 'VM to VM in same tenant on same node via Private "
114 "IP, 1 thread' measurement...")
115 result1 = transport1.exec_command(
116 'iperf3 -c {} -t {} | grep sender | tail -n 1'.format(
117 vm_info[1]['private_address'], iperf_time))
118 res1 = (b" ".join(result1.split()[-4:-2:])).decode('utf-8')
119 logger.info("Result #1 is {}".format(res1))
120 table_rows.append(['VM to VM in same tenant on same node via '
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +0300121 'Private IP, 1 thread; iperf3',
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200122 "{}".format(pair[0]),
123 "{}".format(pair[0]),
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300124 "{}, {}".format(mtus[0], mtus[1]),
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200125 "{}".format(res1)])
126
127 # Do iperf3 measurement #2
128 logger.info("Doing 'VM to VM in same tenant on different HW nodes "
129 "via Private IP, 1 thread' measurement...")
130 result2 = transport1.exec_command(
131 'iperf3 -c {} -t {} | grep sender | tail -n 1'.format(
132 vm_info[2]['private_address'], iperf_time))
133 res2 = (b" ".join(result2.split()[-4:-2:])).decode('utf-8')
134 logger.info("Result #2 is {}".format(res2))
135 table_rows.append(['VM to VM in same tenant on different HW nodes '
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +0300136 'via Private IP, 1 thread; iperf3',
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200137 "{}".format(pair[0]),
138 "{}".format(pair[1]),
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300139 "{}, {}".format(mtus[0], mtus[2]),
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200140 "{}".format(res2)])
141
142 # Do iperf3 measurement #3
143 logger.info("Doing 'VM to VM in same tenant on different HW nodes "
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +0300144 "via Private IP, {} threads' measurement..."
145 "".format(threads))
Ievgeniia Zadorozhna90aa8022022-08-11 18:00:23 +0300146 if iperf_utility == "iperf3":
147 result3 = transport1.exec_command(
148 '{} -c {} -P {} -t {} | grep sender | tail -n 1'
149 ''.format(iperf_utility, vm_info[2]['private_address'],
150 threads, iperf_time))
151 res3 = (b" ".join(result3.split()[-4:-2:])).decode('utf-8')
152 else:
153 iperf_utility = "iperf"
154 result3 = transport1.exec_command(
155 '{} -c {} -P {} -t {} | tail -n 1'.format(iperf_utility,
156 vm_info[2]['private_address'], threads, iperf_time))
157 res3 = (b" ".join(result3.split()[-2::])).decode('utf-8')
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200158 logger.info("Result #3 is {}".format(res3))
159 table_rows.append(['VM to VM in same tenant on different HW nodes '
Ievgeniia Zadorozhna90aa8022022-08-11 18:00:23 +0300160 'via Private IP, {} threads; {}'
161 ''.format(threads, iperf_utility),
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200162 "{}".format(pair[0]),
163 "{}".format(pair[1]),
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300164 "{}, {}".format(mtus[0], mtus[2]),
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200165 "{}".format(res3)])
166
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +0300167 # Do iperf (v2) measurement #4
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200168 logger.info("Doing 'VM to VM in same tenant via Floating IP and VMs "
169 "are on different nodes, 1 thread' measurement...")
170 result4 = transport1.exec_command(
171 'iperf3 -c {} -t {} | grep sender | tail -n 1'.format(
172 vm_info[2]['fip'], iperf_time))
173 res4 = (b" ".join(result4.split()[-4:-2:])).decode('utf-8')
174 logger.info("Result #4 is {}".format(res4))
175 table_rows.append(['VM to VM in same tenant via Floating IP and VMs '
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +0300176 'are on different nodes, 1 thread; iperf3',
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200177 "{}".format(pair[0]),
178 "{}".format(pair[1]),
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300179 "{}, {}".format(mtus[0], mtus[2]),
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200180 "{}".format(res4)])
181
182 # Do iperf3 measurement #5
183 logger.info("Doing 'VM to VM in same tenant, different HW nodes and "
184 "each VM is connected to separate network which are "
185 " connected using Router via Private IP, 1 thread' "
186 "measurement...")
187 result5 = transport1.exec_command(
188 'iperf3 -c {} -t {} | grep sender | tail -n 1'.format(
189 vm_info[3]['private_address'], iperf_time))
190 res5 = (b" ".join(result5.split()[-4:-2:])).decode('utf-8')
191 logger.info("Result #5 is {}".format(res5))
192 table_rows.append(['VM to VM in same tenant, different HW nodes and '
193 'each VM is connected to separate network which are'
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +0300194 ' connected using Router via Private IP, 1 thread; '
195 'iperf3',
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200196 "{}".format(pair[0]),
197 "{}".format(pair[1]),
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300198 "{}, {}".format(mtus[0], mtus[3]),
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200199 "{}".format(res5)])
200
201 logger.info("Drawing the table with iperf results...")
202 result_table.add_rows(table_rows)
Ievgeniia Zadorozhna97dfde42022-06-17 20:05:09 +0300203 sys.stdout.write('\n{}\n'.format(result_table.draw()))
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200204
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200205 logger.info("Removing VMs and FIPs...")
206 for vm in vms:
207 openstack_clients.compute.servers.delete(vm)
Ievgeniia Zadorozhna97dfde42022-06-17 20:05:09 +0300208 logger.info("Removing FIPs...")
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200209 for fip in fips:
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +0300210 os_actions.delete_floating_ip(fip)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200211 except Exception as e:
Ievgeniia Zadorozhna97dfde42022-06-17 20:05:09 +0300212 sys.stdout.write("\n{}".format(e))
213 sys.stdout.write("\nSomething went wrong\n")
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200214 if 'vms' in locals():
215 logger.info("Removing VMs...")
216 for vm in vms:
217 openstack_clients.compute.servers.delete(vm)
218 if 'fips' in locals():
219 logger.info("Removing FIPs...")
220 for fip in fips:
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +0300221 os_actions.delete_floating_ip(fip)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200222 else:
Ievgeniia Zadorozhna97dfde42022-06-17 20:05:09 +0300223 sys.stdout.write("\nSkipping cleaning, VMs were not created")
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200224 pytest.fail("Something went wrong")