blob: 0a89f1ed39432f9c1ef32348d774afbe37d708a9 [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')
Ievgeniia Zadorozhnac67b86b2023-02-02 18:09:12 +030039 custom_mtu = config.get('custom_mtu') or 'default'
Ievgeniia Zadorozhna90aa8022022-08-11 18:00:23 +030040 utils.check_iperf_utility(iperf_utility)
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +030041 result_table = Texttable(max_width=120)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020042
43 try:
44 zone1 = [service.zone for service in
45 openstack_clients.compute.services.list() if
46 service.host == pair[0]]
47 zone2 = [service.zone for service in
48 openstack_clients.compute.services.list()
49 if service.host == pair[1]]
50
51 # create 4 VMs
52 logger.info("Creating 4 VMs...")
53 vm1 = os_actions.create_basic_server(
54 os_resources['image_id'], os_resources['flavor_id'],
55 os_resources['net1'], '{0}:{1}'.format(zone1[0], pair[0]),
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +030056 [os_resources['sec_group']['name']], os_resources['keypair'].name)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020057 logger.info("Created VM {}.".format(vm1.id))
58
59 vm2 = os_actions.create_basic_server(
60 os_resources['image_id'], os_resources['flavor_id'],
61 os_resources['net1'], '{0}:{1}'.format(zone1[0], pair[0]),
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +030062 [os_resources['sec_group']['name']], os_resources['keypair'].name)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020063 logger.info("Created VM {}.".format(vm2.id))
64
65 vm3 = os_actions.create_basic_server(
66 os_resources['image_id'], os_resources['flavor_id'],
67 os_resources['net1'], '{0}:{1}'.format(zone2[0], pair[1]),
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +030068 [os_resources['sec_group']['name']], os_resources['keypair'].name)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020069 logger.info("Created VM {}.".format(vm3.id))
70
71 vm4 = os_actions.create_basic_server(
72 os_resources['image_id'], os_resources['flavor_id'],
73 os_resources['net2'], '{0}:{1}'.format(zone2[0], pair[1]),
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +030074 [os_resources['sec_group']['name']], os_resources['keypair'].name)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020075 logger.info("Created VM {}.".format(vm4.id))
76
77 vm_info = []
78 vms = []
79 vms.extend([vm1, vm2, vm3, vm4])
80 fips = []
81 time.sleep(5)
82
83 # Associate FIPs and check VMs are Active
84 logger.info("Creating Floating IPs and associating them...")
85 for i in range(4):
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +030086 fip = os_actions.create_floating_ip(os_resources['ext_net']['id'])
87 fips.append(fip['id'])
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020088 os_actions.check_vm_is_active(vms[i].id, timeout=timeout)
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +030089 vms[i].add_floating_ip(fip['floating_ip_address'])
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020090 private_address = vms[i].addresses[
91 list(vms[i].addresses.keys())[0]][0]['addr']
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +030092 vm_info.append({'vm': vms[i], 'fip': fip['floating_ip_address'],
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020093 'private_address': private_address})
Ievgeniia Zadorozhnac67b86b2023-02-02 18:09:12 +030094 # Set custom MTU if required
95 if os_actions.is_cloud_tf() and (custom_mtu != "default"):
96 logger.info("Setting up custom MTU at network ports...")
97 for vm in vms:
98 os_actions.update_network_port_with_custom_mtu(vm.id,
99 custom_mtu)
100
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200101 # Check VMs are reachable and prepare iperf3
102 transport1 = ssh.SSHTransport(vm_info[0]['fip'], 'ubuntu',
103 password='dd', private_key=private_key)
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300104 logger.info("Checking VMs are reachable via SSH, getting MTU...")
105 mtus = []
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200106 for i in range(4):
107 if transport1.check_vm_is_reachable_ssh(
108 floating_ip=vm_info[i]['fip'], timeout=ssh_timeout):
109 ssh.prepare_iperf(vm_info[i]['fip'], private_key=private_key)
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300110 mtus.append(transport1.get_mtu_from_vm(
111 vm_info[i]['fip'], private_key=private_key))
Ievgeniia Zadorozhnac67b86b2023-02-02 18:09:12 +0300112 logger.info("MTU at networks: {}, {}".format(
113 os_resources['net1']['mtu'], os_resources['net2']['mtu']))
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300114 logger.info("MTU at VMs: {}".format(", ".join(mtus)))
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200115
116 # Prepare the result table and run iperf3
Ievgeniia Zadorozhnac67b86b2023-02-02 18:09:12 +0300117 table_rows = [[
118 'Test Case', 'Host 1', 'Host 2', 'MTU at VMs', 'Result'
119 ]]
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200120 # Do iperf3 measurement #1
121 logger.info("Doing 'VM to VM in same tenant on same node via Private "
122 "IP, 1 thread' measurement...")
123 result1 = transport1.exec_command(
124 'iperf3 -c {} -t {} | grep sender | tail -n 1'.format(
125 vm_info[1]['private_address'], iperf_time))
126 res1 = (b" ".join(result1.split()[-4:-2:])).decode('utf-8')
127 logger.info("Result #1 is {}".format(res1))
128 table_rows.append(['VM to VM in same tenant on same node via '
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +0300129 'Private IP, 1 thread; iperf3',
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200130 "{}".format(pair[0]),
131 "{}".format(pair[0]),
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300132 "{}, {}".format(mtus[0], mtus[1]),
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200133 "{}".format(res1)])
134
135 # Do iperf3 measurement #2
136 logger.info("Doing 'VM to VM in same tenant on different HW nodes "
137 "via Private IP, 1 thread' measurement...")
138 result2 = transport1.exec_command(
139 'iperf3 -c {} -t {} | grep sender | tail -n 1'.format(
140 vm_info[2]['private_address'], iperf_time))
141 res2 = (b" ".join(result2.split()[-4:-2:])).decode('utf-8')
142 logger.info("Result #2 is {}".format(res2))
143 table_rows.append(['VM to VM in same tenant on different HW nodes '
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +0300144 'via Private IP, 1 thread; iperf3',
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200145 "{}".format(pair[0]),
146 "{}".format(pair[1]),
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300147 "{}, {}".format(mtus[0], mtus[2]),
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200148 "{}".format(res2)])
149
150 # Do iperf3 measurement #3
151 logger.info("Doing 'VM to VM in same tenant on different HW nodes "
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +0300152 "via Private IP, {} threads' measurement..."
153 "".format(threads))
Ievgeniia Zadorozhna90aa8022022-08-11 18:00:23 +0300154 if iperf_utility == "iperf3":
155 result3 = transport1.exec_command(
156 '{} -c {} -P {} -t {} | grep sender | tail -n 1'
157 ''.format(iperf_utility, vm_info[2]['private_address'],
158 threads, iperf_time))
159 res3 = (b" ".join(result3.split()[-4:-2:])).decode('utf-8')
160 else:
161 iperf_utility = "iperf"
162 result3 = transport1.exec_command(
Ievgeniia Zadorozhnac67b86b2023-02-02 18:09:12 +0300163 '{} -c {} -P {} -t {} | tail -n 1'.format(
164 iperf_utility, vm_info[2]['private_address'],
165 threads, iperf_time))
Ievgeniia Zadorozhna90aa8022022-08-11 18:00:23 +0300166 res3 = (b" ".join(result3.split()[-2::])).decode('utf-8')
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200167 logger.info("Result #3 is {}".format(res3))
168 table_rows.append(['VM to VM in same tenant on different HW nodes '
Ievgeniia Zadorozhna90aa8022022-08-11 18:00:23 +0300169 'via Private IP, {} threads; {}'
170 ''.format(threads, iperf_utility),
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200171 "{}".format(pair[0]),
172 "{}".format(pair[1]),
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300173 "{}, {}".format(mtus[0], mtus[2]),
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200174 "{}".format(res3)])
175
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +0300176 # Do iperf (v2) measurement #4
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200177 logger.info("Doing 'VM to VM in same tenant via Floating IP and VMs "
178 "are on different nodes, 1 thread' measurement...")
179 result4 = transport1.exec_command(
180 'iperf3 -c {} -t {} | grep sender | tail -n 1'.format(
181 vm_info[2]['fip'], iperf_time))
182 res4 = (b" ".join(result4.split()[-4:-2:])).decode('utf-8')
183 logger.info("Result #4 is {}".format(res4))
184 table_rows.append(['VM to VM in same tenant via Floating IP and VMs '
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +0300185 'are on different nodes, 1 thread; iperf3',
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200186 "{}".format(pair[0]),
187 "{}".format(pair[1]),
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300188 "{}, {}".format(mtus[0], mtus[2]),
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200189 "{}".format(res4)])
190
191 # Do iperf3 measurement #5
192 logger.info("Doing 'VM to VM in same tenant, different HW nodes and "
193 "each VM is connected to separate network which are "
194 " connected using Router via Private IP, 1 thread' "
195 "measurement...")
196 result5 = transport1.exec_command(
197 'iperf3 -c {} -t {} | grep sender | tail -n 1'.format(
198 vm_info[3]['private_address'], iperf_time))
199 res5 = (b" ".join(result5.split()[-4:-2:])).decode('utf-8')
200 logger.info("Result #5 is {}".format(res5))
201 table_rows.append(['VM to VM in same tenant, different HW nodes and '
202 'each VM is connected to separate network which are'
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +0300203 ' connected using Router via Private IP, 1 thread; '
204 'iperf3',
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200205 "{}".format(pair[0]),
206 "{}".format(pair[1]),
Ievgeniia Zadorozhna0facf3c2022-06-16 16:19:09 +0300207 "{}, {}".format(mtus[0], mtus[3]),
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200208 "{}".format(res5)])
209
210 logger.info("Drawing the table with iperf results...")
211 result_table.add_rows(table_rows)
Ievgeniia Zadorozhna97dfde42022-06-17 20:05:09 +0300212 sys.stdout.write('\n{}\n'.format(result_table.draw()))
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200213
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200214 logger.info("Removing VMs and FIPs...")
215 for vm in vms:
216 openstack_clients.compute.servers.delete(vm)
Ievgeniia Zadorozhna97dfde42022-06-17 20:05:09 +0300217 logger.info("Removing FIPs...")
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200218 for fip in fips:
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +0300219 os_actions.delete_floating_ip(fip)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200220 except Exception as e:
Ievgeniia Zadorozhna97dfde42022-06-17 20:05:09 +0300221 sys.stdout.write("\n{}".format(e))
222 sys.stdout.write("\nSomething went wrong\n")
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200223 if 'vms' in locals():
224 logger.info("Removing VMs...")
225 for vm in vms:
226 openstack_clients.compute.servers.delete(vm)
227 if 'fips' in locals():
228 logger.info("Removing FIPs...")
229 for fip in fips:
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +0300230 os_actions.delete_floating_ip(fip)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200231 else:
Ievgeniia Zadorozhna97dfde42022-06-17 20:05:09 +0300232 sys.stdout.write("\nSkipping cleaning, VMs were not created")
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200233 pytest.fail("Something went wrong")