Allow overriding default storage protocol
[functest.git] / functest / opnfv_tests / openstack / shaker / shaker.py
1 #!/usr/bin/env python
2
3 # Copyright (c) 2018 Orange and others.
4 #
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
9
10 """
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.
15
16 .. _Shaker: http://pyshaker.readthedocs.io/en/latest/
17 """
18
19 import logging
20 import os
21
22 import scp
23
24 from functest.core import singlevm
25
26
27 class Shaker(singlevm.SingleVm2):
28     """Run shaker full+perf l2 and l3"""
29     # pylint: disable=too-many-instance-attributes
30
31     __logger = logging.getLogger(__name__)
32
33     filename = '/home/opnfv/functest/images/shaker-image.qcow2'
34     flavor_ram = 512
35     flavor_vcpus = 1
36     flavor_disk = 3
37     username = 'ubuntu'
38     port = 9000
39     ssh_connect_loops = 12
40     create_server_timeout = 300
41     shaker_timeout = '3600'
42
43     def __init__(self, **kwargs):
44         super(Shaker, self).__init__(**kwargs)
45         self.role = None
46
47     def prepare(self):
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')
52
53     def execute(self):
54         """
55         Returns:
56             - 0 if success
57             - 1 on operation error
58         """
59         assert self.ssh
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"):
63             role_name = "admin"
64         elif self.orig_cloud.get_role("Admin"):
65             role_name = "Admin"
66         else:
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             'unset OS_ENDPOINT_TYPE && '
92             'export OS_PASSWORD={} && '
93             '{}'
94             'env && '
95             'timeout {} shaker --image-name {} --flavor-name {} '
96             '--server-endpoint {}:9000 --scenario '
97             'openstack/full_l2,'
98             'openstack/full_l3_east_west,'
99             'openstack/full_l3_north_south,'
100             'openstack/perf_l3_north_south '
101             '--report report.html --output report.json'.format(
102                 endpoint, self.project.user.name, self.project.project.name,
103                 self.project.project.id, self.project.password,
104                 'export OS_CACERT=~/os_cacert && ' if os.environ.get(
105                     'OS_CACERT') else '',
106                 self.shaker_timeout, self.image.name, self.flavor.name,
107                 self.fip.floating_ip_address))
108         self.__logger.info("output:\n%s", stdout.read())
109         self.__logger.info("error:\n%s", stderr.read())
110         if not os.path.exists(self.res_dir):
111             os.makedirs(self.res_dir)
112         try:
113             scpc.get('report.json', self.res_dir)
114             scpc.get('report.html', self.res_dir)
115         except scp.SCPException:
116             self.__logger.exception("cannot get report files")
117             return 1
118         return stdout.channel.recv_exit_status()
119
120     def clean(self):
121         super(Shaker, self).clean()
122         if self.role:
123             self.orig_cloud.delete_role(self.role.id)