Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/firecracker
Path: blob/main/tests/framework/stats/metadata.py
1956 views
1
# Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
# SPDX-License-Identifier: Apache-2.0
3
"""Module for common statistic tests metadata providers."""
4
5
from abc import ABC, abstractmethod
6
from typing import Dict
7
8
from .criteria import CriteriaFactory
9
from .function import FunctionFactory
10
from .types import MeasurementDef, StatisticDef
11
from .baseline import Provider as BaselineProvider
12
13
14
# pylint: disable=R0903
15
class Provider(ABC):
16
"""Backend for test metadata retrieval.
17
18
Metadata consists from measurements and statistics definitions.
19
"""
20
21
def __init__(self, baseline_provider: BaselineProvider):
22
"""Initialize the metadata provider."""
23
self._baseline_provider = baseline_provider
24
25
@property
26
@abstractmethod
27
def measurements(self) -> Dict[str, MeasurementDef]:
28
"""Return measurement dictionary."""
29
30
@property
31
def baseline_provider(self) -> BaselineProvider:
32
"""Return the baseline provider."""
33
return self._baseline_provider
34
35
36
# pylint: disable=R0903
37
class DictProvider(Provider):
38
"""Backend for test metadata retrieval."""
39
40
UNIT_KEY = "unit"
41
STATISTICS_KEY = "statistics"
42
43
def __init__(self,
44
measurements: dict,
45
baseline_provider: BaselineProvider):
46
"""
47
Initialize metadata provider.
48
49
The provider expects to receive measurements following the below
50
schema:
51
```
52
"measurements": {
53
"$id": "MEASUREMENTS_SCHEMA"
54
"type": "object",
55
"definitions": "definitions": {
56
"Criteria": {
57
"type": "string",
58
"description": "Comparison criteria class name. They are
59
implemented in the `statistics.criteria` module."
60
}
61
"Function": {
62
"type": "string",
63
"description": "Statistic functions class name. They are
64
implemented in the `statistics.function` module."
65
}
66
"StatisticDef": {
67
{
68
"type": "object",
69
"description": "Exhaustive statistic definition."
70
"properties": {
71
"name": { "type": "string" },
72
"function": {
73
"type": "string"
74
"$ref": "#/definitions/Function"
75
},
76
"criteria": {
77
"type": "string"
78
"$ref" "#/definitions/Criteria"
79
}
80
},
81
"required": ["function"]
82
}
83
}
84
},
85
"properties": {
86
"key": {
87
"type": "string",
88
"description": "Measurement name."
89
},
90
"value": {
91
"type": "object",
92
"properties": {
93
"unit": "string",
94
"statistics": {
95
"type": "object",
96
"properties": {
97
"key": {
98
"type": "string",
99
"description": "Statistic name."
100
},
101
"value": {
102
"type": "object",
103
"$ref": "#/definitions/StatisticDef"
104
}
105
}
106
}
107
},
108
"required": ["unit"]
109
}
110
}
111
}
112
```
113
"""
114
super().__init__(baseline_provider)
115
116
self._measurements = dict()
117
for ms_name in measurements:
118
assert DictProvider.UNIT_KEY in measurements[ms_name], \
119
f"'{DictProvider.UNIT_KEY}' field is required for '" \
120
f"{ms_name}' measurement definition."
121
assert DictProvider.STATISTICS_KEY in measurements[ms_name], \
122
f"'{DictProvider.STATISTICS_KEY}' field is required for '" \
123
f"{ms_name}' measurement definition."
124
125
unit = measurements[ms_name][DictProvider.UNIT_KEY]
126
st_defs = measurements[ms_name][DictProvider.STATISTICS_KEY]
127
128
st_list = list()
129
for st_def in st_defs:
130
# Mandatory.
131
func_cls_name = st_def.get("function")
132
assert func_cls_name, f"Error in '{ms_name}' " \
133
"measurement definition: " \
134
"'function' field is required for " \
135
"measurement statistics definitions."
136
137
func_cls = FunctionFactory.get(func_cls_name)
138
assert func_cls_name, f"Error in '{ms_name}' " \
139
"measurement definition: " \
140
f"'{func_cls_name}' is not a valid " \
141
f"statistic function."
142
143
name = st_def.get("name")
144
func = func_cls()
145
if name:
146
func = func_cls(name)
147
148
criteria = None
149
criteria_cls_name = st_def.get("criteria")
150
baseline = baseline_provider.get(ms_name, func.name)
151
if criteria_cls_name and baseline:
152
criteria_cls = CriteriaFactory.get(criteria_cls_name)
153
assert criteria_cls, f"{criteria_cls_name} is not a " \
154
f"valid criteria."
155
criteria = criteria_cls(baseline)
156
157
st_list.append(StatisticDef(func, criteria))
158
159
self._measurements[ms_name] = MeasurementDef(ms_name, unit,
160
st_list)
161
162
@property
163
def measurements(self):
164
"""Return measurement dictionary."""
165
return self._measurements
166
167