3 # Copyright (c) 2018 Orange and others.
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
11 Shaker_ wraps around popular system network testing tools like iperf, iperf3
12 and netperf (with help of flent). Shaker is able to deploy OpenStack instances
13 and networks in different topologies. Shaker scenario specifies the deployment
14 and list of tests to execute.
16 .. _Shaker: http://pyshaker.readthedocs.io/en/latest/
24 from functest.core import singlevm
27 class Shaker(singlevm.SingleVm2):
28 """Run shaker full+perf l2 and l3"""
29 # pylint: disable=too-many-instance-attributes
31 __logger = logging.getLogger(__name__)
33 filename = '/home/opnfv/functest/images/shaker-image.qcow2'
39 ssh_connect_loops = 12
40 create_server_timeout = 300
41 shaker_timeout = '3600'
43 def __init__(self, **kwargs):
44 super(Shaker, self).__init__(**kwargs)
48 super(Shaker, self).prepare()
49 self.cloud.create_security_group_rule(
50 self.sec.id, port_range_min=self.port, port_range_max=self.port,
51 protocol='tcp', direction='ingress')
57 - 1 on operation error
60 endpoint = self.get_public_auth_url(self.orig_cloud)
61 self.__logger.debug("keystone endpoint: %s", endpoint)
62 if self.orig_cloud.get_role("admin"):
64 elif self.orig_cloud.get_role("Admin"):
67 raise Exception("Cannot detect neither admin nor Admin")
68 self.orig_cloud.grant_role(
69 role_name, user=self.project.user.id,
70 project=self.project.project.id,
71 domain=self.project.domain.id)
72 if not self.orig_cloud.get_role("heat_stack_owner"):
73 self.role = self.orig_cloud.create_role("heat_stack_owner")
74 self.orig_cloud.grant_role(
75 "heat_stack_owner", user=self.project.user.id,
76 project=self.project.project.id,
77 domain=self.project.domain.id)
78 scpc = scp.SCPClient(self.ssh.get_transport())
79 scpc.put('/home/opnfv/functest/conf/env_file', remote_path='~/')
80 if os.environ.get('OS_CACERT'):
81 scpc.put(os.environ.get('OS_CACERT'), remote_path='~/os_cacert')
82 (_, stdout, stderr) = self.ssh.exec_command(
83 'source ~/env_file && '
84 'export OS_INTERFACE=public && '
85 'export OS_AUTH_URL={} && '
86 'export OS_USERNAME={} && '
87 'export OS_PROJECT_NAME={} && '
88 'export OS_PROJECT_ID={} && '
89 'unset OS_TENANT_NAME && '
90 'unset OS_TENANT_ID && '
91 'export OS_PASSWORD={} && '
94 'timeout {} shaker --image-name {} --flavor-name {} '
95 '--server-endpoint {}:9000 --scenario '
97 'openstack/full_l3_east_west,'
98 'openstack/full_l3_north_south,'
99 'openstack/perf_l3_north_south '
100 '--report report.html --output report.json'.format(
101 endpoint, self.project.user.name, self.project.project.name,
102 self.project.project.id, self.project.password,
103 'export OS_CACERT=~/os_cacert && ' if os.environ.get(
104 'OS_CACERT') else '',
105 self.shaker_timeout, self.image.name, self.flavor.name,
106 self.fip.floating_ip_address))
107 self.__logger.info("output:\n%s", stdout.read())
108 self.__logger.info("error:\n%s", stderr.read())
109 if not os.path.exists(self.res_dir):
110 os.makedirs(self.res_dir)
112 scpc.get('report.json', self.res_dir)
113 scpc.get('report.html', self.res_dir)
114 except scp.SCPException:
115 self.__logger.exception("cannot get report files")
117 return stdout.channel.recv_exit_status()
120 super(Shaker, self).clean()
122 self.orig_cloud.delete_role(self.role.id)