update from RIFT as of 696b75d2fe9fb046261b08c616f1bcf6c0b54a9b second try
[osm/SO.git] / rwlaunchpad / ra / pytest / ns / conftest.py
1
2 #
3 # Copyright 2016 RIFT.IO Inc
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16 #
17
18 import functools
19 import hashlib
20 import pytest
21 import os
22 import tempfile
23 import shutil
24 import subprocess
25 import random
26
27 import gi
28 import rift.auto.descriptor
29 import rift.auto.session
30 import rift.mano.examples.ping_pong_nsd as ping_pong_example
31 import rift.vcs.vcs
32
33 class PackageError(Exception):
34 pass
35
36 @pytest.fixture(scope='session', autouse=True)
37 def multidisk_testdata(request, descriptor_images, path_ping_image, path_pong_image):
38 """fixture which returns test data related to multidisk test"""
39
40 if not request.config.option.multidisk:
41 return None
42
43 iso_img, qcow2_img = [os.path.basename(image) for image in descriptor_images]
44
45 ping_ = {'vda': ['disk', 'virtio', 5, os.path.basename(path_ping_image), 0],
46 'sda': ['cdrom', 'scsi', 5, iso_img, 1],
47 'hda': ['disk', 'ide', 5, None, None],
48 }
49
50 pong_ = {'vda': ['disk', 'virtio', 5, os.path.basename(path_pong_image), 0],
51 'hda': ['cdrom', 'ide', 5, iso_img, 1],
52 'hdb': ['disk', 'ide', 5, qcow2_img, 2],
53 }
54 return ping_, pong_
55
56 @pytest.fixture(scope='session')
57 def port_sequencing_intf_positions():
58 """fixture which returns a list of ordered positions for pong interfaces related to port sequencing test"""
59 return random.sample(range(1, 2**32-1), 3)
60
61 @pytest.fixture(scope='session')
62 def ping_pong_install_dir():
63 '''Fixture containing the location of ping_pong installation
64 '''
65 install_dir = os.path.join(
66 os.environ["RIFT_ROOT"],
67 "images"
68 )
69 return install_dir
70
71 @pytest.fixture(scope='session')
72 def ping_vnfd_package_file(ping_pong_install_dir):
73 '''Fixture containing the location of the ping vnfd package
74
75 Arguments:
76 ping_pong_install_dir - location of ping_pong installation
77 '''
78 ping_pkg_file = os.path.join(
79 ping_pong_install_dir,
80 "ping_vnfd_with_image.tar.gz",
81 )
82 if not os.path.exists(ping_pkg_file):
83 raise_package_error()
84
85 return ping_pkg_file
86
87
88 @pytest.fixture(scope='session')
89 def pong_vnfd_package_file(ping_pong_install_dir):
90 '''Fixture containing the location of the pong vnfd package
91
92 Arguments:
93 ping_pong_install_dir - location of ping_pong installation
94 '''
95 pong_pkg_file = os.path.join(
96 ping_pong_install_dir,
97 "pong_vnfd_with_image.tar.gz",
98 )
99 if not os.path.exists(pong_pkg_file):
100 raise_package_error()
101
102 return pong_pkg_file
103
104
105 @pytest.fixture(scope='session')
106 def ping_pong_nsd_package_file(ping_pong_install_dir):
107 '''Fixture containing the location of the ping_pong_nsd package
108
109 Arguments:
110 ping_pong_install_dir - location of ping_pong installation
111 '''
112 ping_pong_pkg_file = os.path.join(
113 ping_pong_install_dir,
114 "ping_pong_nsd.tar.gz",
115 )
116 if not os.path.exists(ping_pong_pkg_file):
117 raise_package_error()
118
119 return ping_pong_pkg_file
120
121 @pytest.fixture(scope='session')
122 def image_dirs():
123 ''' Fixture containing a list of directories where images can be found
124 '''
125 rift_build = os.environ['RIFT_BUILD']
126 rift_root = os.environ['RIFT_ROOT']
127 image_dirs = [
128 os.path.join(
129 rift_build,
130 "modules/core/mano/src/core_mano-build/examples/",
131 "ping_pong_ns/ping_vnfd_with_image/images"
132 ),
133 os.path.join(
134 rift_root,
135 "images"
136 )
137 ]
138 return image_dirs
139
140 @pytest.fixture(scope='session')
141 def random_image_name(image_dirs):
142 """Fixture which returns a random image name"""
143 return 'image_systemtest_{}.qcow2'.format(random.randint(100, 9999))
144
145 @pytest.fixture(scope='session')
146 def image_paths(image_dirs):
147 ''' Fixture containing a mapping of image names to their path images
148
149 Arguments:
150 image_dirs - a list of directories where images are located
151 '''
152 image_paths = {}
153 for image_dir in image_dirs:
154 if os.path.exists(image_dir):
155 names = os.listdir(image_dir)
156 image_paths.update({name:os.path.join(image_dir, name) for name in names})
157 return image_paths
158
159 @pytest.fixture(scope='session')
160 def path_ping_image(image_paths):
161 ''' Fixture containing the location of the ping image
162
163 Arguments:
164 image_paths - mapping of images to their paths
165 '''
166 return image_paths["Fedora-x86_64-20-20131211.1-sda-ping.qcow2"]
167
168 @pytest.fixture(scope='session')
169 def path_pong_image(image_paths):
170 ''' Fixture containing the location of the pong image
171
172 Arguments:
173 image_paths - mapping of images to their paths
174 '''
175 return image_paths["Fedora-x86_64-20-20131211.1-sda-pong.qcow2"]
176
177 @pytest.fixture(scope='session')
178 def rsyslog_userdata(rsyslog_host, rsyslog_port):
179 ''' Fixture providing rsyslog user data
180 Arguments:
181 rsyslog_host - host of the rsyslog process
182 rsyslog_port - port of the rsyslog process
183 '''
184 if rsyslog_host and rsyslog_port:
185 return '''
186 rsyslog:
187 - "$ActionForwardDefaultTemplate RSYSLOG_ForwardFormat"
188 - "*.* @{host}:{port}"
189 '''.format(
190 host=rsyslog_host,
191 port=rsyslog_port,
192 )
193
194 return None
195
196 @pytest.fixture(scope='session')
197 def descriptors_pingpong_vnf_input_params():
198 return ping_pong_example.generate_ping_pong_descriptors(
199 pingcount=1,
200 nsd_name='pp_input_nsd',
201 vnfd_input_params=True,
202 )
203
204 @pytest.fixture(scope='session')
205 def packages_pingpong_vnf_input_params(descriptors_pingpong_vnf_input_params):
206 return rift.auto.descriptor.generate_descriptor_packages(descriptors_pingpong_vnf_input_params)
207
208 @pytest.fixture(scope='session')
209 def ping_script_userdata():
210 userdata = '''#cloud-config
211 password: fedora
212 chpasswd: { expire: False }
213 ssh_pwauth: True
214 runcmd:
215 - [ systemctl, daemon-reload ]
216 - [ systemctl, enable, {{ CI-script-init-data }}.service ]
217 - [ systemctl, start, --no-block, {{ CI-script-init-data }}.service ]
218 - [ ifup, eth1 ]
219 '''
220 return userdata
221
222 @pytest.fixture(scope='session')
223 def pong_script_userdata():
224 userdata = '''#!/bin/bash
225 sed 's/^.*PasswordAuthentication.*$/PasswordAuthentication yes/' < /etc/ssh/sshd_config > /etc/ssh/sshd_config
226 systemctl daemon-reload
227 systemctl enable {{ CI-script-init-data }}.service
228 systemctl start --no-block {{ CI-script-init-data }}.service
229 ifup eth1
230 '''
231 return userdata
232
233 @pytest.fixture(scope='session')
234 def descriptors_pingpong_script_input_params(ping_script_userdata, pong_script_userdata):
235 return ping_pong_example.generate_ping_pong_descriptors(
236 pingcount=1,
237 nsd_name='pp_script_nsd',
238 script_input_params=True,
239 ping_userdata=ping_script_userdata,
240 pong_userdata=pong_script_userdata,
241 )
242
243 @pytest.fixture(scope='session')
244 def packages_pingpong_script_input_params(descriptors_pingpong_script_input_params):
245 return rift.auto.descriptor.generate_descriptor_packages(descriptors_pingpong_script_input_params)
246
247 class PingPongFactory:
248 def __init__(self, path_ping_image, path_pong_image, static_ip, vnf_dependencies, rsyslog_userdata, port_security, metadata_vdud, multidisk, ipv6, port_sequencing, service_primitive):
249
250 self.path_ping_image = path_ping_image
251 self.path_pong_image = path_pong_image
252 self.rsyslog_userdata = rsyslog_userdata
253 self.static_ip = static_ip
254 self.service_primitive = service_primitive
255 self.use_vca_conf = vnf_dependencies
256 self.port_security = port_security
257 self.port_sequencing = port_sequencing
258 self.metadata_vdud = metadata_vdud
259 self.multidisk = multidisk
260 self.ipv6 = ipv6
261 if not port_security:
262 self.port_security = None # Not to disable port security if its not specific to --port-security feature.
263
264 def generate_descriptors(self):
265 '''Return a new set of ping and pong descriptors
266 '''
267 def md5sum(path):
268 with open(path, mode='rb') as fd:
269 md5 = hashlib.md5()
270 for buf in iter(functools.partial(fd.read, 4096), b''):
271 md5.update(buf)
272 return md5.hexdigest()
273
274 ping_md5sum = md5sum(self.path_ping_image)
275 pong_md5sum = md5sum(self.path_pong_image)
276
277 descriptors = ping_pong_example.generate_ping_pong_descriptors(
278 pingcount=1,
279 ping_md5sum=ping_md5sum,
280 pong_md5sum=pong_md5sum,
281 ex_ping_userdata=self.rsyslog_userdata,
282 ex_pong_userdata=self.rsyslog_userdata,
283 use_static_ip=self.static_ip,
284 port_security=self.port_security,
285 explicit_port_seq=self.port_sequencing,
286 metadata_vdud=self.metadata_vdud,
287 use_vca_conf=self.use_vca_conf,
288 multidisk=self.multidisk,
289 use_ipv6=self.ipv6,
290 primitive_test=self.service_primitive,
291 )
292
293 return descriptors
294
295 @pytest.fixture(scope='session')
296 def ping_pong_factory(path_ping_image, path_pong_image, static_ip, vnf_dependencies, rsyslog_userdata, port_security, metadata_vdud, multidisk_testdata, ipv6, port_sequencing, service_primitive):
297 '''Fixture returns a factory capable of generating ping and pong descriptors
298 '''
299 return PingPongFactory(path_ping_image, path_pong_image, static_ip, vnf_dependencies, rsyslog_userdata, port_security, metadata_vdud, multidisk_testdata, ipv6, port_sequencing, service_primitive)
300
301 @pytest.fixture(scope='session')
302 def ping_pong_records(ping_pong_factory):
303 '''Fixture returns the default set of ping_pong descriptors
304 '''
305 return ping_pong_factory.generate_descriptors()
306
307
308 @pytest.fixture(scope='session')
309 def descriptors(request, ping_pong_records, random_image_name):
310 def pingpong_descriptors(with_images=True):
311 """Generated the VNFDs & NSD files for pingpong NS.
312
313 Returns:
314 Tuple: file path for ping vnfd, pong vnfd and ping_pong_nsd
315 """
316 ping_vnfd, pong_vnfd, ping_pong_nsd = ping_pong_records
317
318 tmpdir = tempfile.mkdtemp()
319 rift_build = os.environ['RIFT_BUILD']
320 MANO_DIR = os.path.join(
321 rift_build,
322 "modules/core/mano/src/core_mano-build/examples/ping_pong_ns")
323 ping_img = os.path.join(MANO_DIR, "ping_vnfd_with_image/images/Fedora-x86_64-20-20131211.1-sda-ping.qcow2")
324 pong_img = os.path.join(MANO_DIR, "pong_vnfd_with_image/images/Fedora-x86_64-20-20131211.1-sda-pong.qcow2")
325
326 """ grab cached copies of these files if not found. They may not exist
327 because our git submodule dependency mgmt
328 will not populate these because they live in .build, not .install
329 """
330 if not os.path.exists(ping_img):
331 ping_img = os.path.join(
332 os.environ['RIFT_ROOT'],
333 'images/Fedora-x86_64-20-20131211.1-sda-ping.qcow2')
334 pong_img = os.path.join(
335 os.environ['RIFT_ROOT'],
336 'images/Fedora-x86_64-20-20131211.1-sda-pong.qcow2')
337
338 for descriptor in [ping_vnfd, pong_vnfd, ping_pong_nsd]:
339 descriptor.write_to_file(output_format='yaml', outdir=tmpdir)
340 ping_img_path = os.path.join(tmpdir, "{}/images/".format(ping_vnfd.name))
341 pong_img_path = os.path.join(tmpdir, "{}/images/".format(pong_vnfd.name))
342
343 if with_images:
344 os.makedirs(ping_img_path)
345 os.makedirs(pong_img_path)
346 shutil.copy(ping_img, ping_img_path)
347 shutil.copy(pong_img, pong_img_path)
348
349 if request.config.option.upload_images_multiple_accounts:
350 with open(os.path.join(ping_img_path, random_image_name), 'wb') as image_bin_file:
351 image_bin_file.seek(1024*1024*512) # image file of size 512 MB
352 image_bin_file.write(b'0')
353
354 for dir_name in [ping_vnfd.name, pong_vnfd.name, ping_pong_nsd.name]:
355 subprocess.call([
356 "{rift_install}/usr/rift/toolchain/cmake/bin/generate_descriptor_pkg.sh".format(rift_install=os.environ['RIFT_INSTALL']),
357 tmpdir,
358 dir_name])
359
360 return (os.path.join(tmpdir, "{}.tar.gz".format(ping_vnfd.name)),
361 os.path.join(tmpdir, "{}.tar.gz".format(pong_vnfd.name)),
362 os.path.join(tmpdir, "{}.tar.gz".format(ping_pong_nsd.name)))
363
364 def haproxy_descriptors():
365 """HAProxy descriptors."""
366 files = [
367 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/http_client/http_client_vnfd.tar.gz"),
368 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/httpd/httpd_vnfd.tar.gz"),
369 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/haproxy/haproxy_vnfd.tar.gz"),
370 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/waf/waf_vnfd.tar.gz"),
371 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/haproxy_waf_httpd_nsd/haproxy_waf_httpd_nsd.tar.gz")
372 ]
373
374 return files
375
376 def l2portchain_descriptors():
377 """L2 port chaining packages"""
378 files = [
379 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/vnffg_demo_nsd/vnffg_l2portchain_dpi_vnfd.tar.gz"),
380 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/vnffg_demo_nsd/vnffg_l2portchain_firewall_vnfd.tar.gz"),
381 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/vnffg_demo_nsd/vnffg_l2portchain_nat_vnfd.tar.gz"),
382 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/vnffg_demo_nsd/vnffg_l2portchain_pgw_vnfd.tar.gz"),
383 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/vnffg_demo_nsd/vnffg_l2portchain_router_vnfd.tar.gz"),
384 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/vnffg_demo_nsd/vnffg_l2portchain_sff_vnfd.tar.gz"),
385 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/vnffg_demo_nsd/vnffg_l2portchain_demo_nsd.tar.gz")
386 ]
387
388 return files
389
390 def metadata_vdud_cfgfile_descriptors():
391 """Metadata-vdud feature related packages"""
392 files = [
393 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/cfgfile/cirros_cfgfile_vnfd.tar.gz"),
394 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/cfgfile/fedora_cfgfile_vnfd.tar.gz"),
395 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/cfgfile/ubuntu_cfgfile_vnfd.tar.gz"),
396 os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/cfgfile/cfgfile_nsd.tar.gz")
397 ]
398
399 return files
400
401 if request.config.option.vnf_onboard_delete:
402 return haproxy_descriptors() + l2portchain_descriptors() + list(pingpong_descriptors())
403 if request.config.option.multiple_ns_instantiate:
404 return haproxy_descriptors() + metadata_vdud_cfgfile_descriptors() + list(pingpong_descriptors())
405 if request.config.option.l2_port_chaining:
406 return l2portchain_descriptors()
407 if request.config.option.metadata_vdud_cfgfile:
408 return metadata_vdud_cfgfile_descriptors()
409 if request.config.option.network_service == "pingpong":
410 return pingpong_descriptors()
411 elif request.config.option.ha_multiple_failovers:
412 return {'pingpong': pingpong_descriptors(), 'haproxy': haproxy_descriptors(), 'vdud_cfgfile': metadata_vdud_cfgfile_descriptors()}
413 elif request.config.option.network_service == "pingpong_noimg":
414 return pingpong_descriptors(with_images=False)
415 elif request.config.option.network_service == "haproxy":
416 return haproxy_descriptors()
417
418
419 @pytest.fixture(scope='session')
420 def descriptor_images(request):
421 def haproxy_images():
422 """HAProxy images."""
423 images = [
424 os.path.join(os.getenv('RIFT_ROOT'), "images/haproxy-v03.qcow2"),
425 os.path.join(os.getenv('RIFT_ROOT'), "images/web-app-firewall-v02.qcow2"),
426 os.path.join(os.getenv('RIFT_ROOT'), "images/web-server-v02.qcow2")
427 ]
428
429 return images
430
431 def l2portchain_images():
432 """HAProxy images."""
433 images = [os.path.join(os.getenv('RIFT_ROOT'), "images/ubuntu_trusty_1404.qcow2")]
434 return images
435
436 def multidisk_images():
437 images = [
438 os.path.join(os.getenv('RIFT_ROOT'), 'images/ubuntu-16.04-mini-64.iso'),
439 os.path.join(os.getenv('RIFT_ROOT'), "images/ubuntu_trusty_1404.qcow2"),
440 ]
441 return images
442
443 def metadata_vdud_cfgfile_images():
444 """Metadata-vdud feature related images."""
445 images = [
446 os.path.join(os.getenv('RIFT_ROOT'), "images/cirros-0.3.4-x86_64-disk.img"),
447 os.path.join(os.getenv('RIFT_ROOT'), "images/Fedora-x86_64-20-20131211.1-sda.qcow2"),
448 os.path.join(os.getenv('RIFT_ROOT'), "images/UbuntuXenial")
449 ]
450
451 return images
452
453 if request.config.option.l2_port_chaining:
454 return l2portchain_images()
455 if request.config.option.multidisk:
456 return multidisk_images()
457 if request.config.option.metadata_vdud_cfgfile:
458 return metadata_vdud_cfgfile_images()
459 if request.config.option.network_service == "haproxy":
460 return haproxy_images()
461 if request.config.option.multiple_ns_instantiate:
462 return haproxy_images() + metadata_vdud_cfgfile_images()
463
464 return []