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))
|