3 # Copyright 2016 RIFT.IO Inc
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
9 # http://www.apache.org/licenses/LICENSE-2.0
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.
28 import rift
.auto
.descriptor
29 import rift
.auto
.session
30 import rift
.mano
.examples
.ping_pong_nsd
as ping_pong_example
33 class PackageError(Exception):
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"""
40 if not request
.config
.option
.multidisk
:
43 iso_img
, qcow2_img
= [os
.path
.basename(image
) for image
in descriptor_images
]
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],
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],
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)
61 @pytest.fixture(scope
='session')
62 def ping_pong_install_dir():
63 '''Fixture containing the location of ping_pong installation
65 install_dir
= os
.path
.join(
66 os
.environ
["RIFT_ROOT"],
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
76 ping_pong_install_dir - location of ping_pong installation
78 ping_pkg_file
= os
.path
.join(
79 ping_pong_install_dir
,
80 "ping_vnfd_with_image.tar.gz",
82 if not os
.path
.exists(ping_pkg_file
):
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
93 ping_pong_install_dir - location of ping_pong installation
95 pong_pkg_file
= os
.path
.join(
96 ping_pong_install_dir
,
97 "pong_vnfd_with_image.tar.gz",
99 if not os
.path
.exists(pong_pkg_file
):
100 raise_package_error()
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
110 ping_pong_install_dir - location of ping_pong installation
112 ping_pong_pkg_file
= os
.path
.join(
113 ping_pong_install_dir
,
114 "ping_pong_nsd.tar.gz",
116 if not os
.path
.exists(ping_pong_pkg_file
):
117 raise_package_error()
119 return ping_pong_pkg_file
121 @pytest.fixture(scope
='session')
123 ''' Fixture containing a list of directories where images can be found
125 rift_build
= os
.environ
['RIFT_BUILD']
126 rift_root
= os
.environ
['RIFT_ROOT']
130 "modules/core/mano/src/core_mano-build/examples/",
131 "ping_pong_ns/ping_vnfd_with_image/images"
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))
145 @pytest.fixture(scope
='session')
146 def image_paths(image_dirs
):
147 ''' Fixture containing a mapping of image names to their path images
150 image_dirs - a list of directories where images are located
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
})
159 @pytest.fixture(scope
='session')
160 def path_ping_image(image_paths
):
161 ''' Fixture containing the location of the ping image
164 image_paths - mapping of images to their paths
166 return image_paths
["Fedora-x86_64-20-20131211.1-sda-ping.qcow2"]
168 @pytest.fixture(scope
='session')
169 def path_pong_image(image_paths
):
170 ''' Fixture containing the location of the pong image
173 image_paths - mapping of images to their paths
175 return image_paths
["Fedora-x86_64-20-20131211.1-sda-pong.qcow2"]
177 @pytest.fixture(scope
='session')
178 def rsyslog_userdata(rsyslog_host
, rsyslog_port
):
179 ''' Fixture providing rsyslog user data
181 rsyslog_host - host of the rsyslog process
182 rsyslog_port - port of the rsyslog process
184 if rsyslog_host
and rsyslog_port
:
187 - "$ActionForwardDefaultTemplate RSYSLOG_ForwardFormat"
188 - "*.* @{host}:{port}"
196 @pytest.fixture(scope
='session')
197 def descriptors_pingpong_vnf_input_params():
198 return ping_pong_example
.generate_ping_pong_descriptors(
200 nsd_name
='pp_input_nsd',
201 vnfd_input_params
=True,
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
)
208 @pytest.fixture(scope
='session')
209 def ping_script_userdata():
210 userdata
= '''#cloud-config
212 chpasswd: { expire: False }
215 - [ systemctl, daemon-reload ]
216 - [ systemctl, enable, {{ CI-script-init-data }}.service ]
217 - [ systemctl, start, --no-block, {{ CI-script-init-data }}.service ]
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
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(
237 nsd_name
='pp_script_nsd',
238 script_input_params
=True,
239 ping_userdata
=ping_script_userdata
,
240 pong_userdata
=pong_script_userdata
,
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
)
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
):
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
261 if not port_security
:
262 self
.port_security
= None # Not to disable port security if its not specific to --port-security feature.
264 def generate_descriptors(self
):
265 '''Return a new set of ping and pong descriptors
268 with
open(path
, mode
='rb') as fd
:
270 for buf
in iter(functools
.partial(fd
.read
, 4096), b
''):
272 return md5
.hexdigest()
274 ping_md5sum
= md5sum(self
.path_ping_image
)
275 pong_md5sum
= md5sum(self
.path_pong_image
)
277 descriptors
= ping_pong_example
.generate_ping_pong_descriptors(
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
,
290 primitive_test
=self
.service_primitive
,
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
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
)
301 @pytest.fixture(scope
='session')
302 def ping_pong_records(ping_pong_factory
):
303 '''Fixture returns the default set of ping_pong descriptors
305 return ping_pong_factory
.generate_descriptors()
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.
314 Tuple: file path for ping vnfd, pong vnfd and ping_pong_nsd
316 ping_vnfd
, pong_vnfd
, ping_pong_nsd
= ping_pong_records
318 tmpdir
= tempfile
.mkdtemp()
319 rift_build
= os
.environ
['RIFT_BUILD']
320 MANO_DIR
= os
.path
.join(
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")
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
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')
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
))
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
)
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')
354 for dir_name
in [ping_vnfd
.name
, pong_vnfd
.name
, ping_pong_nsd
.name
]:
356 "{rift_install}/usr/rift/toolchain/cmake/bin/generate_descriptor_pkg.sh".format(rift_install
=os
.environ
['RIFT_INSTALL']),
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
)))
364 def haproxy_descriptors():
365 """HAProxy descriptors."""
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")
376 def l2portchain_descriptors():
377 """L2 port chaining packages"""
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")
390 def metadata_vdud_cfgfile_descriptors():
391 """Metadata-vdud feature related packages"""
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")
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()
419 @pytest.fixture(scope
='session')
420 def descriptor_images(request
):
421 def haproxy_images():
422 """HAProxy 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")
431 def l2portchain_images():
432 """HAProxy images."""
433 images
= [os
.path
.join(os
.getenv('RIFT_ROOT'), "images/ubuntu_trusty_1404.qcow2")]
436 def multidisk_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"),
443 def metadata_vdud_cfgfile_images():
444 """Metadata-vdud feature related 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")
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()