blob: 839080ddd18d52b92261ee221c923ff613e5349e [file] [log] [blame]
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +02001import os
2import pytest
3import utils
4import random
5import time
6import logging
7
Ievgeniia Zadorozhna9664b422023-03-28 21:09:46 +03008from utils import helpers
Ievgeniia Zadorozhnaa080ec02023-12-05 02:08:52 +01009from utils.k8s_client import K8SClientManager
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020010from utils import os_client
11
12
13logger = logging.getLogger(__name__)
14
Ievgeniia Zadorozhnaa080ec02023-12-05 02:08:52 +010015nodes = utils.get_pairs()
16hw_nodes = utils.get_hw_pairs()
17
18
19@pytest.fixture(scope='session', params=list(nodes.values()),
20 ids=list(nodes.keys()))
21def pair(request):
22 return request.param
23
24
25@pytest.fixture(scope='session', params=list(hw_nodes.values()),
26 ids=list(hw_nodes.keys()))
27def hw_pair(request):
28 return request.param
29
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020030
31@pytest.fixture(scope='session')
32def openstack_clients():
33 return os_client.OfficialClientManager(
34 username=os.environ['OS_USERNAME'],
35 password=os.environ['OS_PASSWORD'],
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +030036 project_name=os.environ['OS_PROJECT_NAME'],
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020037 auth_url=os.environ['OS_AUTH_URL'],
Ievgeniia Zadorozhna21517712024-07-30 14:14:08 +020038 endpoint_type=os.environ["OS_ENDPOINT_TYPE"],
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020039 cert=False,
40 domain=os.environ['OS_PROJECT_DOMAIN_NAME'],
Ievgeniia Zadorozhna68d64952024-08-22 18:15:45 +020041 interface=os.environ["OS_ENDPOINT_TYPE"],
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +030042 )
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020043
44
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020045@pytest.fixture(scope='session')
46def os_resources(openstack_clients):
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +030047 logger.info("Setting up resources in admin project...")
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020048 os_actions = os_client.OSCliActions(openstack_clients)
49 os_resource = {}
50 config = utils.get_configuration()
Ievgeniia Zadorozhna5ed74e22022-07-26 16:56:23 +030051 image_name = config.get('image_name', 'cvp.ubuntu.2004')
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020052 flavor_name = config.get('flavor_name', 'spt-test')
53 flavor_ram = config.get('flavor_ram', 1536)
54 flavor_vcpus = config.get('flavor_vcpus', 1)
55 flavor_disk = config.get('flavor_disk', 3)
Ievgeniia Zadorozhna074f1232025-07-16 16:29:03 +020056 add_hw_vif_multiqueue_enabled_to_image = config.get('add_hw_vif_multiqueue_enabled_to_image', "true")
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020057
58 os_images_list = [image.id for image in
59 openstack_clients.image.images.list(
60 filters={'name': image_name})]
61
62 if os_images_list.__len__() == 0:
63 pytest.skip("No images with name {}. This name can be redefined "
64 "with 'image_name' env var ".format(image_name))
Ievgeniia Zadorozhna074f1232025-07-16 16:29:03 +020065
66 if add_hw_vif_multiqueue_enabled_to_image.lower() == "true":
67 logger.info("Adding hw_vif_multiqueue_enabled=true property to image...")
68 openstack_clients.image.images.update(os_images_list[0],
69 hw_vif_multiqueue_enabled = "true")
70
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020071 os_resource['image_id'] = str(os_images_list[0])
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +030072 flavor_id = os_actions.get_flavor_id_by_name(flavor_name)
73 if flavor_id is None:
74 flavor_is_created = True
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020075 os_resource['flavor_id'] = os_actions.create_flavor(
76 flavor_name, flavor_ram, flavor_vcpus, flavor_disk).id
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020077 else:
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +030078 flavor_is_created = False
79 logger.info("Flavor {} already exists".format(flavor_name))
80 os_resource['flavor_id'] = flavor_id
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020081
82 os_resource['sec_group'] = os_actions.create_sec_group()
83 os_resource['keypair'] = openstack_clients.compute.keypairs.create(
84 '{}-{}'.format('spt-key', random.randrange(100, 999))
85 )
86 os_resource['net1'] = os_actions.create_network_resources()
87 os_resource['ext_net'] = os_actions.get_external_network()
Ievgeniia Zadorozhnaf210baa2025-03-28 00:04:45 +010088 if not os_resource['ext_net']:
89 pytest.skip("External network not found, skipping tests. Please set "
90 "the existing floating network at the 'external_network' "
91 "option in the global_config.yaml file.")
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +030092 adm_project = os_actions.get_project_by_name("admin")
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020093 os_resource['router'] = os_actions.create_router(
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +030094 os_resource['ext_net'], adm_project.id)
95 os_resource['net2'] = os_actions.create_network(adm_project.id)
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020096 os_resource['subnet2'] = os_actions.create_subnet(
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +030097 os_resource['net2'], adm_project.id, '10.2.7.0/24')
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +020098 for subnet in openstack_clients.network.list_subnets()['subnets']:
99 if subnet['network_id'] == os_resource['net1']['id']:
100 os_resource['subnet1'] = subnet['id']
101
102 openstack_clients.network.add_interface_router(
Ievgeniia Zadorozhnac67b86b2023-02-02 18:09:12 +0300103 os_resource['router']['id'], {'subnet_id': os_resource['subnet1']})
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200104 openstack_clients.network.add_interface_router(
105 os_resource['router']['id'],
106 {'subnet_id': os_resource['subnet2']['id']})
107 yield os_resource
108
109 # cleanup created resources
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +0300110 logger.info("Deleting routers, networks, SG, key pair, flavor in {}..."
111 "".format(adm_project.name))
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200112 openstack_clients.network.remove_interface_router(
113 os_resource['router']['id'], {'subnet_id': os_resource['subnet1']})
114 openstack_clients.network.remove_interface_router(
115 os_resource['router']['id'],
116 {'subnet_id': os_resource['subnet2']['id']})
117 openstack_clients.network.remove_gateway_router(
118 os_resource['router']['id'])
119 time.sleep(5)
120 openstack_clients.network.delete_router(os_resource['router']['id'])
Ievgeniia Zadorozhnac67b86b2023-02-02 18:09:12 +0300121 time.sleep(10) # extended to 10 since fails at TF sometimes
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200122 openstack_clients.network.delete_network(os_resource['net1']['id'])
123 openstack_clients.network.delete_network(os_resource['net2']['id'])
124
Ievgeniia Zadorozhna2c6469d2022-08-10 17:21:10 +0300125 openstack_clients.network.delete_security_group(
126 os_resource['sec_group']['id'])
Ievgeniia Zadorozhna84023022021-12-30 13:00:41 +0200127 openstack_clients.compute.keypairs.delete(os_resource['keypair'].name)
128 if flavor_is_created:
129 openstack_clients.compute.flavors.delete(os_resource['flavor_id'])
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +0300130
131
132@pytest.fixture(scope='session')
133def openstack_alt_clients(openstack_clients):
134 # create alt project with regular admin user
135 tmp_os_actions = os_client.OSCliActions(openstack_clients)
136 alt_project = tmp_os_actions.create_project()
Ievgeniia Zadorozhna670e7ff2023-03-29 00:22:22 +0300137 tmp_os_actions.add_roles_to_user_in_project(
138 alt_project.id, username=os.environ['OS_USERNAME'],
139 domain=os.environ['OS_PROJECT_DOMAIN_NAME']
140 )
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +0300141 # create a client using alt project with admin user in it
142 return os_client.OfficialClientManager(
143 username=os.environ['OS_USERNAME'],
144 password=os.environ['OS_PASSWORD'],
145 project_name=alt_project.name,
146 auth_url=os.environ['OS_AUTH_URL'],
147 cert=False,
148 domain=os.environ['OS_PROJECT_DOMAIN_NAME'],
Ievgeniia Zadorozhna68d64952024-08-22 18:15:45 +0200149 endpoint_type=os.environ['OS_ENDPOINT_TYPE'],
150 interface=os.environ['OS_ENDPOINT_TYPE']
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +0300151 )
152
153
154@pytest.fixture(scope='session')
155def os_resources_alt_project(openstack_alt_clients):
156 logger.info("Setting up resources in the project {}..."
157 "".format(openstack_alt_clients.project_name))
158 alt_os_actions = os_client.OSCliActions(openstack_alt_clients)
159 os_resource_alt_project = {}
160 config = utils.get_configuration()
161 image_name = config.get('image_name', 'Ubuntu-18.04')
162 flavor_name = config.get('flavor_name', 'spt-test')
163 flavor_ram = config.get('flavor_ram', 1536)
164 flavor_vcpus = config.get('flavor_vcpus', 1)
165 flavor_disk = config.get('flavor_disk', 3)
Ievgeniia Zadorozhna074f1232025-07-16 16:29:03 +0200166 add_hw_vif_multiqueue_enabled_to_image = config.get('add_hw_vif_multiqueue_enabled_to_image', "true")
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +0300167 os_images_list = [image.id for image in
168 openstack_alt_clients.image.images.list(
169 filters={'name': image_name})]
170
171 if os_images_list.__len__() == 0:
172 pytest.skip("No images with name {}. This name can be redefined "
173 "with 'image_name' env var ".format(image_name))
Ievgeniia Zadorozhna074f1232025-07-16 16:29:03 +0200174 if add_hw_vif_multiqueue_enabled_to_image.lower() == "true":
175 logger.info("Adding hw_vif_multiqueue_enabled=true property to image...")
176 openstack_alt_clients.image.images.update(os_images_list[0],
177 hw_vif_multiqueue_enabled = "true")
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +0300178 os_resource_alt_project['image_id'] = str(os_images_list[0])
179
180 flavor_id = alt_os_actions.get_flavor_id_by_name(flavor_name)
181 if flavor_id is None:
182 flavor_is_created = True
183 os_resource_alt_project['flavor_id'] = alt_os_actions.create_flavor(
184 flavor_name, flavor_ram, flavor_vcpus, flavor_disk).id
185 else:
186 flavor_is_created = False
187 logger.info("Flavor {} already exists".format(flavor_name))
188 os_resource_alt_project['flavor_id'] = flavor_id
189
190 os_resource_alt_project['sec_group'] = alt_os_actions.create_sec_group()
191
192 alt_project = alt_os_actions.get_project_by_name(
193 openstack_alt_clients.project_name)
194 os_resource_alt_project['net1'] = alt_os_actions.create_network_resources(
195 project=alt_project.name, cidr='10.3.7.0/24')
196 os_resource_alt_project['ext_net'] = alt_os_actions.get_external_network()
Ievgeniia Zadorozhnaf210baa2025-03-28 00:04:45 +0100197 if not os_resource_alt_project['ext_net']:
198 pytest.skip("External network not found, skipping tests. Please set "
199 "the existing floating network at the 'external_network' "
200 "option in the global_config.yaml file.")
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +0300201
202 os_resource_alt_project['router'] = alt_os_actions.create_router(
203 os_resource_alt_project['ext_net'], alt_project.id)
204
205 os_resource_alt_project['subnet1'] = \
206 openstack_alt_clients.network.show_network(
207 os_resource_alt_project['net1']['id'])['network']['subnets'][0]
208 openstack_alt_clients.network.add_interface_router(
209 os_resource_alt_project['router']['id'],
210 {'subnet_id': os_resource_alt_project['subnet1']})
211 yield os_resource_alt_project
212
213 # cleanup created resources
214 logger.info("Deleting routers, networks, SG, flavor in {} "
215 "project...".format(alt_project.name))
216
217 openstack_alt_clients.network.remove_interface_router(
218 os_resource_alt_project['router']['id'],
219 {'subnet_id': os_resource_alt_project['subnet1']})
220 openstack_alt_clients.network.remove_gateway_router(
221 os_resource_alt_project['router']['id'])
222 time.sleep(5)
223 openstack_alt_clients.network.delete_router(
224 os_resource_alt_project['router']['id'])
225 time.sleep(5)
226 openstack_alt_clients.network.delete_network(
227 os_resource_alt_project['net1']['id'])
228
229 openstack_alt_clients.network.delete_security_group(
230 os_resource_alt_project['sec_group']['id'])
231 if flavor_is_created:
232 openstack_alt_clients.compute.flavors.delete(
233 os_resource_alt_project['flavor_id'])
Ievgeniia Zadorozhnaf22827b2022-07-20 13:30:32 +0300234
235 if alt_os_actions.is_project_empty(alt_project.id):
236 openstack_alt_clients.auth.projects.delete(alt_project.id)
237 logger.info("Deleted project {}".format(alt_project.name))
238 else:
239 logger.info("Project {} is not empty, skip deleting".format(
240 alt_project.name))
Ievgeniia Zadorozhna9664b422023-03-28 21:09:46 +0300241
242
Ievgeniia Zadorozhnaa080ec02023-12-05 02:08:52 +0100243@pytest.fixture(scope='module')
244def k8s_v1_client():
245 config = utils.get_configuration()
246 logger.info("Getting the K8S config path from the global_config.yaml file.")
247 k8s_config_path = config.get('mos_kubeconfig_path') or ""
248 k8s_manager = K8SClientManager(k8s_config_path=k8s_config_path)
249 return k8s_manager.k8s_v1
250
251
Ievgeniia Zadorozhna9664b422023-03-28 21:09:46 +0300252@pytest.fixture(scope="session")
253def html_report():
254 yield
255 helpers.convert_csvs_to_single_html_report()