X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=functest%2Fopnfv_tests%2Fopenstack%2Fshaker%2Fshaker.py;h=57e033e8e5d9bab5287a5cd28be4ee459c382389;hb=14268b0e9f73a057c16f1a3ea0be0246dedaf4db;hp=88cbe3514e81df49f482a9c62dbde98c39c57760;hpb=eb864cc183005479e4fd00d3b849034fcab5bffc;p=functest.git diff --git a/functest/opnfv_tests/openstack/shaker/shaker.py b/functest/opnfv_tests/openstack/shaker/shaker.py index 88cbe3514..57e033e8e 100644 --- a/functest/opnfv_tests/openstack/shaker/shaker.py +++ b/functest/opnfv_tests/openstack/shaker/shaker.py @@ -19,32 +19,45 @@ and list of tests to execute. 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.qcow2' + filename = '/home/opnfv/functest/images/shaker-image-1.3.0+stretch.qcow2' flavor_ram = 512 flavor_vcpus = 1 flavor_disk = 3 - username = 'ubuntu' + username = 'debian' port = 9000 + ssh_connect_loops = 12 + create_server_timeout = 300 + shaker_timeout = '3600' + quota_instances = -1 + quota_cores = -1 + check_console_loop = 12 - def create_sg_rules(self): - """ - It adds one security group rule allowing ingress 9000/tcp + def __init__(self, **kwargs): + super(Shaker, self).__init__(**kwargs) + self.role = None - Raises: Exception on error. - """ - assert self.orig_cloud - super(Shaker, self).create_sg_rules() - self.orig_cloud.create_security_group_rule( + 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(Shaker, self).prepare() + self.cloud.create_security_group_rule( self.sec.id, port_range_min=self.port, port_range_max=self.port, protocol='tcp', direction='ingress') @@ -55,18 +68,61 @@ class Shaker(singlevm.SingleVm2): - 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', '~/') + 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') (_, stdout, stderr) = self.ssh.exec_command( - 'source ~/env_file && export OS_INTERFACE=public &&' - 'shaker --server-endpoint {}:9000 --scenario ' - 'openstack/full_l2,openstack/full_l3_east_west,' - 'openstack/full_l3_north_south,openstack/perf_l2,' - 'openstack/perf_l3_east_west,openstack/perf_l3_north_south ' - '--report report.html --output report.json ; echo $?'.format( - self.sshvm.public_v4)) - self.__logger.info("output:\n%s", stdout.read()) - self.__logger.info("error:\n%s", stderr.read()) + 'source ~/env_file && ' + 'export OS_INTERFACE=public && ' + 'export OS_AUTH_URL={} && ' + 'export OS_USERNAME={} && ' + 'export OS_PROJECT_NAME={} && ' + 'export OS_PROJECT_ID={} && ' + 'unset OS_TENANT_NAME && ' + 'unset OS_TENANT_ID && ' + 'unset OS_ENDPOINT_TYPE && ' + 'export OS_PASSWORD="{}" && ' + '{}' + 'env && ' + 'timeout {} shaker --debug --image-name {} --flavor-name {} ' + '--server-endpoint {}:9000 --external-net {} --dns-nameservers {} ' + '--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'.format( + endpoint, self.project.user.name, self.project.project.name, + self.project.project.id, self.project.password, + 'export OS_CACERT=~/os_cacert && ' if os.environ.get( + 'OS_CACERT') else '', + self.shaker_timeout, self.image.name, self.flavor.name, + self.fip.floating_ip_address, self.ext_net.id, + env.get('NAMESERVER'))) + 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: @@ -75,4 +131,16 @@ class Shaker(singlevm.SingleVm2): except scp.SCPException: self.__logger.exception("cannot get report files") return 1 + with open(os.path.join(self.res_dir, 'report.json')) 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(Shaker, self).clean() + if self.role: + self.orig_cloud.delete_role(self.role.id)