From: Ondrej Lichtner <olichtne(a)redhat.com>
Adding a new base class to introduce a common hierarchy for measurement
results. For now it just defines common initialization and a single
property which is a back reference to the BaseMeasurement instance that
created the results object.
Updated all the related *MeasurementResults classes.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
.../Perf/Measurements/BaseCPUMeasurement.py | 20 +++++++++----------
.../Perf/Measurements/BaseFlowMeasurement.py | 19 +++++++++---------
.../Perf/Measurements/BaseMeasurement.py | 9 +++++++++
.../Perf/Measurements/IperfFlowMeasurement.py | 4 +++-
.../Perf/Measurements/StatCPUMeasurement.py | 2 +-
.../Perf/Measurements/TRexFlowMeasurement.py | 2 +-
6 files changed, 34 insertions(+), 22 deletions(-)
diff --git a/lnst/RecipeCommon/Perf/Measurements/BaseCPUMeasurement.py
b/lnst/RecipeCommon/Perf/Measurements/BaseCPUMeasurement.py
index fc47091..cd19b18 100644
--- a/lnst/RecipeCommon/Perf/Measurements/BaseCPUMeasurement.py
+++ b/lnst/RecipeCommon/Perf/Measurements/BaseCPUMeasurement.py
@@ -1,10 +1,12 @@
import signal
from lnst.RecipeCommon.Perf.Measurements.MeasurementError import MeasurementError
from lnst.RecipeCommon.Perf.Measurements.BaseMeasurement import BaseMeasurement
+from lnst.RecipeCommon.Perf.Measurements.BaseMeasurement import BaseMeasurementResults
from lnst.RecipeCommon.Perf.Results import SequentialPerfResult
-class CPUMeasurementResults(object):
- def __init__(self, host, cpu):
+class CPUMeasurementResults(BaseMeasurementResults):
+ def __init__(self, measurement, host, cpu):
+ super(CPUMeasurementResults, self).__init__(measurement)
self._host = host
self._cpu = cpu
@@ -21,8 +23,8 @@ class CPUMeasurementResults(object):
raise NotImplementedError()
class AggregatedCPUMeasurementResults(CPUMeasurementResults):
- def __init__(self, host, cpu):
- super(AggregatedCPUMeasurementResults, self).__init__(host, cpu)
+ def __init__(self, measurement, host, cpu):
+ super(AggregatedCPUMeasurementResults, self).__init__(measurement, host, cpu)
self._individual_results = []
@property
@@ -45,13 +47,12 @@ class AggregatedCPUMeasurementResults(CPUMeasurementResults):
raise MeasurementError("Adding incorrect results.")
class BaseCPUMeasurement(BaseMeasurement):
- @classmethod
- def aggregate_results(cls, old, new):
+ def aggregate_results(self, old, new):
aggregated = []
if old is None:
old = [None] * len(new)
for old_measurements, new_measurements in zip(old, new):
- aggregated.append(cls._aggregate_hostcpu_results(
+ aggregated.append(self._aggregate_hostcpu_results(
old_measurements, new_measurements))
return aggregated
@@ -89,13 +90,12 @@ class BaseCPUMeasurement(BaseMeasurement):
recipe.add_result(True, "\n".join(desc), data=cpu_data)
- @classmethod
- def _aggregate_hostcpu_results(cls, old, new):
+ def _aggregate_hostcpu_results(self, old, new):
if (old is not None and
(old.host is not new.host or old.cpu != new.cpu)):
raise MeasurementError("Aggregating incompatible CPU Results")
- new_result = AggregatedCPUMeasurementResults(new.host, new.cpu)
+ new_result = AggregatedCPUMeasurementResults(self, new.host, new.cpu)
new_result.add_results(old)
new_result.add_results(new)
return new_result
diff --git a/lnst/RecipeCommon/Perf/Measurements/BaseFlowMeasurement.py
b/lnst/RecipeCommon/Perf/Measurements/BaseFlowMeasurement.py
index aba0e02..c4448b7 100644
--- a/lnst/RecipeCommon/Perf/Measurements/BaseFlowMeasurement.py
+++ b/lnst/RecipeCommon/Perf/Measurements/BaseFlowMeasurement.py
@@ -1,6 +1,7 @@
import signal
from lnst.RecipeCommon.Perf.Measurements.MeasurementError import MeasurementError
from lnst.RecipeCommon.Perf.Measurements.BaseMeasurement import BaseMeasurement
+from lnst.RecipeCommon.Perf.Measurements.BaseMeasurement import BaseMeasurementResults
from lnst.RecipeCommon.Perf.Results import SequentialPerfResult
class Flow(object):
@@ -75,8 +76,9 @@ class NetworkFlowTest(object):
def client_job(self):
return self._client_job
-class FlowMeasurementResults(object):
- def __init__(self, flow):
+class FlowMeasurementResults(BaseMeasurementResults):
+ def __init__(self, measurement, flow):
+ super(FlowMeasurementResults, self).__init__(measurement)
self._flow = flow
self._generator_results = None
self._generator_cpu_stats = None
@@ -120,7 +122,8 @@ class FlowMeasurementResults(object):
self._receiver_cpu_stats = value
class AggregatedFlowMeasurementResults(FlowMeasurementResults):
- def __init__(self, flow):
+ def __init__(self, measurement, flow):
+ super(FlowMeasurementResults, self).__init__(measurement)
self._flow = flow
self._generator_results = SequentialPerfResult()
self._generator_cpu_stats = SequentialPerfResult()
@@ -190,21 +193,19 @@ class BaseFlowMeasurement(BaseMeasurement):
receiver_flow_data=receiver,
receiver_cpu_data=receiver_cpu))
- @classmethod
- def aggregate_results(cls, old, new):
+ def aggregate_results(self, old, new):
aggregated = []
if old is None:
old = [None] * len(new)
for old_flow, new_flow in zip(old, new):
- aggregated.append(cls._aggregate_flows(old_flow, new_flow))
+ aggregated.append(self._aggregate_flows(old_flow, new_flow))
return aggregated
- @classmethod
- def _aggregate_flows(cls, old_flow, new_flow):
+ def _aggregate_flows(self, old_flow, new_flow):
if old_flow is not None and old_flow.flow is not new_flow.flow:
raise MeasurementError("Aggregating incompatible Flows")
- new_result = AggregatedFlowMeasurementResults(new_flow.flow)
+ new_result = AggregatedFlowMeasurementResults(measurement=self,
flow=new_flow.flow)
new_result.add_results(old_flow)
new_result.add_results(new_flow)
diff --git a/lnst/RecipeCommon/Perf/Measurements/BaseMeasurement.py
b/lnst/RecipeCommon/Perf/Measurements/BaseMeasurement.py
index 782ffa5..5c51b9a 100644
--- a/lnst/RecipeCommon/Perf/Measurements/BaseMeasurement.py
+++ b/lnst/RecipeCommon/Perf/Measurements/BaseMeasurement.py
@@ -22,3 +22,12 @@ class BaseMeasurement(object):
@classmethod
def aggregate_results(first, second):
raise NotImplementedError()
+
+
+class BaseMeasurementResults(object):
+ def __init__(self, measurement):
+ self._measurement = measurement
+
+ @property
+ def measurement(self):
+ return self._measurement
diff --git a/lnst/RecipeCommon/Perf/Measurements/IperfFlowMeasurement.py
b/lnst/RecipeCommon/Perf/Measurements/IperfFlowMeasurement.py
index 8ffd815..d3c02ec 100644
--- a/lnst/RecipeCommon/Perf/Measurements/IperfFlowMeasurement.py
+++ b/lnst/RecipeCommon/Perf/Measurements/IperfFlowMeasurement.py
@@ -55,7 +55,9 @@ class IperfFlowMeasurement(BaseFlowMeasurement):
results = []
for test_flow in test_flows:
- flow_results = FlowMeasurementResults(test_flow.flow)
+ flow_results = FlowMeasurementResults(
+ measurement=self,
+ flow=test_flow.flow)
flow_results.generator_results = self._parse_job_streams(
test_flow.client_job)
flow_results.generator_cpu_stats = self._parse_job_cpu(
diff --git a/lnst/RecipeCommon/Perf/Measurements/StatCPUMeasurement.py
b/lnst/RecipeCommon/Perf/Measurements/StatCPUMeasurement.py
index 5aa316f..e21ac43 100644
--- a/lnst/RecipeCommon/Perf/Measurements/StatCPUMeasurement.py
+++ b/lnst/RecipeCommon/Perf/Measurements/StatCPUMeasurement.py
@@ -66,7 +66,7 @@ class StatCPUMeasurement(BaseCPUMeasurement):
for cpu, cpu_intervals in parsed_sample.items():
if cpu not in job_results:
- job_results[cpu] = StatCPUMeasurementResults(host, cpu)
+ job_results[cpu] = StatCPUMeasurementResults(self, host, cpu)
cpu_results = job_results[cpu]
cpu_results.update_intervals(cpu_intervals)
diff --git a/lnst/RecipeCommon/Perf/Measurements/TRexFlowMeasurement.py
b/lnst/RecipeCommon/Perf/Measurements/TRexFlowMeasurement.py
index f47ec67..3c973ca 100644
--- a/lnst/RecipeCommon/Perf/Measurements/TRexFlowMeasurement.py
+++ b/lnst/RecipeCommon/Perf/Measurements/TRexFlowMeasurement.py
@@ -104,7 +104,7 @@ class TRexFlowMeasurement(BaseFlowMeasurement):
return result
def _parse_results_by_port(self, job, port, flow):
- results = FlowMeasurementResults(flow)
+ results = FlowMeasurementResults(measurement=self, flow=flow)
results.generator_results = SequentialPerfResult()
results.generator_cpu_stats = SequentialPerfResult()
--
2.21.0