aboutsummaryrefslogtreecommitdiffstats
path: root/functest/opnfv_tests/openstack/shaker/shaker.py
diff options
context:
space:
mode:
Diffstat (limited to 'functest/opnfv_tests/openstack/shaker/shaker.py')
-rw-r--r--functest/opnfv_tests/openstack/shaker/shaker.py147
1 files changed, 147 insertions, 0 deletions
diff --git a/functest/opnfv_tests/openstack/shaker/shaker.py b/functest/opnfv_tests/openstack/shaker/shaker.py
new file mode 100644
index 000000000..275cc3077
--- /dev/null
+++ b/functest/opnfv_tests/openstack/shaker/shaker.py
@@ -0,0 +1,147 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2018 Orange and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+"""
+Shaker_ wraps around popular system network testing tools like iperf, iperf3
+and netperf (with help of flent). Shaker is able to deploy OpenStack instances
+and networks in different topologies. Shaker scenario specifies the deployment
+and list of tests to execute.
+
+.. _Shaker: http://pyshaker.readthedocs.io/en/latest/
+"""
+
+import logging
+import os
+
+import json
+import scp
+
+from functest.core import singlevm
+from functest.utils import env
+
+
+class Shaker(singlevm.SingleVm2):
+ """Run shaker full+perf l2 and l3"""
+ # pylint: disable=too-many-instance-attributes
+
+ __logger = logging.getLogger(__name__)
+
+ filename = '/home/opnfv/functest/images/shaker-image-1.3.4+stretch.qcow2'
+ flavor_ram = 512
+ flavor_vcpus = 1
+ flavor_disk = 3
+ username = 'debian'
+ port = 9000
+ ssh_connect_loops = 12
+ create_server_timeout = 300
+ check_console_loop = 12
+ shaker_timeout = '3600'
+ quota_instances = -1
+ quota_cores = -1
+ check_console_loop = 12
+
+ def __init__(self, **kwargs):
+ super().__init__(**kwargs)
+ self.role = None
+
+ def check_requirements(self):
+ if self.count_hypervisors() < 2:
+ self.__logger.warning("Shaker requires at least 2 hypervisors")
+ self.is_skipped = True
+ self.project.clean()
+
+ def prepare(self):
+ super().prepare()
+ self.cloud.create_security_group_rule(
+ self.sec.id, port_range_min=self.port, port_range_max=self.port,
+ protocol='tcp', direction='ingress')
+
+ def execute(self):
+ """
+ Returns:
+ - 0 if success
+ - 1 on operation error
+ """
+ assert self.ssh
+ endpoint = self.get_public_auth_url(self.orig_cloud)
+ self.__logger.debug("keystone endpoint: %s", endpoint)
+ if self.orig_cloud.get_role("admin"):
+ role_name = "admin"
+ elif self.orig_cloud.get_role("Admin"):
+ role_name = "Admin"
+ else:
+ raise Exception("Cannot detect neither admin nor Admin")
+ self.orig_cloud.grant_role(
+ role_name, user=self.project.user.id,
+ project=self.project.project.id,
+ domain=self.project.domain.id)
+ if not self.orig_cloud.get_role("heat_stack_owner"):
+ self.role = self.orig_cloud.create_role("heat_stack_owner")
+ self.orig_cloud.grant_role(
+ "heat_stack_owner", user=self.project.user.id,
+ project=self.project.project.id,
+ domain=self.project.domain.id)
+ self.orig_cloud.set_compute_quotas(
+ self.project.project.name,
+ instances=self.quota_instances,
+ cores=self.quota_cores)
+ scpc = scp.SCPClient(self.ssh.get_transport())
+ scpc.put('/home/opnfv/functest/conf/env_file', remote_path='~/')
+ if os.environ.get('OS_CACERT'):
+ scpc.put(os.environ.get('OS_CACERT'), remote_path='~/os_cacert')
+ opt = 'export OS_CACERT=~/os_cacert && ' if os.environ.get(
+ 'OS_CACERT') else ''
+ (_, stdout, stderr) = self.ssh.exec_command(
+ 'source ~/env_file && '
+ 'export OS_INTERFACE=public && '
+ f'export OS_AUTH_URL={endpoint} && '
+ f'export OS_USERNAME={self.project.user.name} && '
+ f'export OS_PROJECT_NAME={self.project.project.name} && '
+ f'export OS_PROJECT_ID={self.project.project.id} && '
+ 'unset OS_TENANT_NAME && '
+ 'unset OS_TENANT_ID && '
+ 'unset OS_ENDPOINT_TYPE && '
+ f'export OS_PASSWORD="{self.project.password}" && '
+ f'{opt}'
+ 'env && '
+ f'timeout {self.shaker_timeout} shaker --debug '
+ f'--image-name {self.image.name} --flavor-name {self.flavor.name} '
+ f'--server-endpoint {self.fip.floating_ip_address}:9000 '
+ f'--external-net {self.ext_net.id} '
+ f"--dns-nameservers {env.get('NAMESERVER')} "
+ '--scenario openstack/full_l2,'
+ 'openstack/full_l3_east_west,'
+ 'openstack/full_l3_north_south,'
+ 'openstack/perf_l3_north_south '
+ '--report report.html --output report.json')
+ self.__logger.info("output:\n%s", stdout.read().decode("utf-8"))
+ self.__logger.info("error:\n%s", stderr.read().decode("utf-8"))
+ if not os.path.exists(self.res_dir):
+ os.makedirs(self.res_dir)
+ try:
+ scpc.get('report.json', self.res_dir)
+ scpc.get('report.html', self.res_dir)
+ except scp.SCPException:
+ self.__logger.exception("cannot get report files")
+ return 1
+ with open(
+ os.path.join(self.res_dir, 'report.json'),
+ encoding='utf-8') as json_file:
+ data = json.load(json_file)
+ for value in data["records"].values():
+ if value["status"] != "ok":
+ self.__logger.error(
+ "%s failed\n%s", value["scenario"], value["stderr"])
+ return 1
+ return stdout.channel.recv_exit_status()
+
+ def clean(self):
+ super().clean()
+ if self.role:
+ self.orig_cloud.delete_role(self.role.id)