aboutsummaryrefslogtreecommitdiffstats
path: root/yardstick/vTC/apexlake/experimental_framework/api.py
blob: 1851f1b09fa4c6ee4d4f30822b67514f123faeea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# Copyright (c) 2015 Intel Research and Development Ireland Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import experimental_framework.benchmarking_unit as b_unit
from experimental_framework import heat_template_generation, common


class FrameworkApi(object):

    @staticmethod
    def init():
        """
        Initializes the Framework

        :return: None
        """
        common.init(api=True)

    # @staticmethod
    # def get_available_test_cases():
    #     """
    #     Returns a list of available test cases.
    #     This list include eventual modules developed by the user, if any.
    #     Each test case is returned as a string that represents the full name
    #     of the test case and that can be used to get more information
    #     calling get_test_case_features(test_case_name)
    #
    #     :return: list of strings
    #     """
    #     return b_unit.BenchmarkingUnit.get_available_test_cases()

    @staticmethod
    def get_test_case_features(test_case):
        """
        Returns a list of features (description, requested parameters,
        allowed values, etc.) for a specified test case.

        :param test_case: name of the test case (string)
                          The string represents the test case and can be
                          obtained  calling  "get_available_test_cases()"
                          method.

        :return: dict() containing the features of the test case
        """
        if not isinstance(test_case, str):
            raise ValueError('The provided test_case parameter has to be '
                             'a string')
        benchmark = b_unit.BenchmarkingUnit.get_required_benchmarks(
            [test_case])[0]
        return benchmark.get_features()

    @staticmethod
    def execute_framework(
            test_cases,
            iterations,
            heat_template,
            heat_template_parameters,
            deployment_configuration,
            openstack_credentials
    ):
        """
        Executes the framework according the inputs

        :param test_cases: Test cases to be ran on the workload
                            (dict() of dict())

                            Example:
                            test_case = dict()
                            test_case['name'] = 'module.Class'
                            test_case['params'] = dict()
                            test_case['params']['throughput'] = '1'
                            test_case['params']['vlan_sender'] = '1007'
                            test_case['params']['vlan_receiver'] = '1006'
                            test_cases = [test_case]

        :param iterations: Number of cycles to be executed (int)

        :param heat_template: (string) File name of the heat template of the
                            workload to be deployed. It contains the
                            parameters to be evaluated in the form of
                            #parameter_name. (See heat_templates/vTC.yaml as
                            example).

        :param heat_template_parameters: (dict) Parameters to be provided
                            as input to the heat template.
                            See http://docs.openstack.org/developer/heat/
                            template_guide/hot_guide.html - section
                            "Template input parameters" for further info.

        :param deployment_configuration: ( dict[string] = list(strings) ) )
                            Dictionary of parameters representing the
                            deployment configuration of the workload
                            The key is a string corresponding to the name of
                            the parameter, the value is a list of strings
                            representing the value to be assumed by a specific
                            param.
                            The parameters are user defined: they have to
                            correspond to the place holders (#parameter_name)
                            specified in the heat template.

        :return: dict() Containing results
        """
        common.init(api=True)

        # Input Validation
        common.InputValidation.validate_os_credentials(openstack_credentials)
        credentials = openstack_credentials

        msg = 'The provided heat_template does not exist'
        template = "{}{}".format(common.get_template_dir(), heat_template)
        common.InputValidation.validate_file_exist(template, msg)

        msg = 'The provided iterations variable must be an integer value'
        common.InputValidation.validate_integer(iterations, msg)

        msg = 'The provided heat_template_parameters variable must be a ' \
              'dictionary'
        common.InputValidation.validate_dictionary(heat_template_parameters,
                                                   msg)
        log_msg = "Generation of all the heat templates " \
                  "required by the experiment"
        common.LOG.info(log_msg)
        heat_template_generation.generates_templates(heat_template,
                                                     deployment_configuration)
        benchmarking_unit = \
            b_unit.BenchmarkingUnit(
                heat_template, credentials, heat_template_parameters,
                iterations, test_cases)
        try:
            common.LOG.info("Benchmarking Unit initialization")
            benchmarking_unit.initialize()
            common.LOG.info("Benchmarking Unit Running")
            results = benchmarking_unit.run_benchmarks()
        finally:
            common.LOG.info("Benchmarking Unit Finalization")
            benchmarking_unit.finalize()
        return results