Add xrally_kubernetes_full
[functest-kubernetes.git] / functest_kubernetes / rally / rally_kubernetes.py
1 #!/usr/bin/env python
2
3 """Run workloads via Rally against Kubernetes platform
4
5 xrally/kubernetes_ provides xRally plugins for Kubernetes platform.
6
7 .. _xrally/kubernetes: https://github.com/xrally/xrally-kubernetes/
8 """
9
10 import logging
11 import os
12 import time
13
14 from jinja2 import Template
15 import pkg_resources
16 from rally import api
17 from rally import exceptions
18 from rally.common import yamlutils as yaml
19 import rally.common.logging
20 from rally.env import env_mgr
21
22 from xtesting.core import testcase
23
24
25 class RallyKubernetes(testcase.TestCase):
26     """Run tasks for checking basic functionality of Kubernetes cluster"""
27
28     __logger = logging.getLogger(__name__)
29
30     concurrency = 1
31     times = 1
32     namespaces_count = 1
33
34     def __init__(self, **kwargs):
35         super(RallyKubernetes, self).__init__(**kwargs)
36         self.dir_results = "/home/opnfv/functest/results"
37         self.res_dir = os.path.join(self.dir_results, self.case_name)
38
39     def run(self, **kwargs):
40         self.start_time = time.time()
41         if not os.path.exists(self.res_dir):
42             os.makedirs(self.res_dir)
43         rapi = api.API()
44         api.CONF.set_default("use_stderr", False)
45         api.CONF.set_default('log_dir', self.res_dir)
46         api.CONF.set_default('log_file', 'rally.log')
47         rally.common.logging.setup("rally")
48         spec = env_mgr.EnvManager.create_spec_from_sys_environ()["spec"]
49         try:
50             env_mgr.EnvManager.get('my-kubernetes').delete(force=True)
51         except exceptions.DBRecordNotFound:
52             pass
53         env = env_mgr.EnvManager.create('my-kubernetes', spec)
54         result = env.check_health()
55         self.__logger.debug("check health %s: %s", 'my-kubernetes', result)
56         if not result['existing@kubernetes']['available']:
57             self.__logger.error(
58                 "Cannot check env heath: %s",
59                 result['existing@kubernetes']['message'])
60             return
61         with open(pkg_resources.resource_filename(
62                 'functest_kubernetes', 'rally/all-in-one.yaml')) as file:
63             template = Template(file.read())
64         task = yaml.safe_load(template.render(
65             concurrency=kwargs.get("concurrency", self.concurrency),
66             times=kwargs.get("times", self.times),
67             namespaces_count=kwargs.get(
68                 "namespaces_count", self.namespaces_count)))
69         rapi.task.validate(deployment='my-kubernetes', config=task)
70         task_instance = rapi.task.create(deployment='my-kubernetes')
71         rapi.task.start(
72             deployment='my-kubernetes', config=task,
73             task=task_instance["uuid"])
74         self.details = rapi.task.get(task_instance["uuid"], detailed=True)
75         self.__logger.debug("details: %s", self.details)
76         if self.details['pass_sla']:
77             self.result = 100
78         result = rapi.task.export(
79             [task_instance["uuid"]], "html",
80             output_dest=os.path.join(
81                 self.res_dir, "{}.html".format(self.case_name)))
82         if "files" in result:
83             for path in result["files"]:
84                 with open(path, "w+") as output:
85                     output.write(result["files"][path])
86         result = rapi.task.export(
87             [task_instance["uuid"]], "junit-xml",
88             output_dest=os.path.join(
89                 self.res_dir, "{}.xml".format(self.case_name)))
90         if "files" in result:
91             for path in result["files"]:
92                 with open(path, "w+") as output:
93                     output.write(result["files"][path])
94         self.stop_time = time.time()