aboutsummaryrefslogtreecommitdiffstats
path: root/qtip/base/benchmark.py
blob: b38e60165f98add3c6219dd03e565230c398318e (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
##############################################################################
# Copyright (c) 2016 ZTE Corp and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################

from itertools import chain
from os import listdir
from os import path
import yaml


class Property(object):
    # list
    NAME = 'name'
    CONTENT = 'content'
    ABSPATH = 'abspath'
    # content
    TITLE = 'title'
    DESCRIPTION = 'description'
    # spec
    ALGORITHM = 'algorithm'
    SECTIONS = 'sections'
    WEIGHT = 'weight'
    METRICS = 'metrics'
    SPEC = 'spec'
    WORKLOADS = 'workloads'
    # plan
    INFO = 'info'
    FACILITY = 'facility'
    ENGINEER = 'engineer'
    SUITES = 'suites'
    # suite
    QPI_SPEC = 'QPI_spec'
    CONDITION = 'condition'
    CASES = 'cases'
    # case
    METRIC_SPEC = 'metric_spec'
    CONFIG = 'config'


class QtipError(Exception):
    pass


class Algorithm(object):
    ARITHMETIC_MEAN = 'arithmetic mean'
    WEIGHTED_ARITHMETIC_MEAN = 'weighted arithmetic mean'
    GEOMETRIC_MEAN = 'geometric mean'
    WEIGHTED_GEOMETRIC_MEAN = 'weighted geometric mean'


ROOT_DIR = 'benchmarks'


class Benchmark(object):
    """Abstract class of QTIP benchmarks"""
    DEFAULT_DIR = '.'
    _paths = [path.join(path.dirname(__file__), path.pardir, path.pardir,
                        ROOT_DIR)]

    def __init__(self, name, paths=None):
        self._file = name
        self._abspath = self._find(name, paths)
        self.name = path.splitext(name)[0]

    def _find(self, name, paths):
        """find a benchmark in searching paths"""
        paths = self._paths if paths is None else paths
        name = path.join(self.DEFAULT_DIR, name)
        for p in paths:
            abspath = path.join(p, name)
            if path.exists(abspath):
                return abspath
        raise QtipError("'{}' not found in paths: {}".format(name, paths))

    @classmethod
    def list_all(cls, paths=None):
        """list all available benchmarks"""
        paths = cls._paths if paths is None else paths
        names = chain.from_iterable([listdir(path.join(p, cls.DEFAULT_DIR))
                                     for p in paths])
        for name in names:
            item = cls(name, paths=paths)
            yield {
                Property.NAME: name,
                Property.ABSPATH: item._abspath,
                Property.CONTENT: item.content()}

    def content(self):
        """description of benchmark"""
        return yaml.safe_load(file(self._abspath))