diff --git a/powerapi/cli/tools.py b/powerapi/cli/tools.py index 4c3dd276..166293ba 100644 --- a/powerapi/cli/tools.py +++ b/powerapi/cli/tools.py @@ -38,7 +38,7 @@ from powerapi.cli.parser import BadValueException, MissingValueException from powerapi.cli.parser import BadTypeException, BadContextException from powerapi.cli.parser import UnknowArgException -from powerapi.report_model import HWPCModel, PowerModel, FormulaModel +from powerapi.report_model import HWPCModel, PowerModel, FormulaModel, ControlModel from powerapi.database import MongoDB, CsvDB, InfluxDB, OpenTSDB from powerapi.puller import PullerActor from powerapi.pusher import PusherActor @@ -209,6 +209,7 @@ def __init__(self, component_group_name): 'HWPCReport': HWPCModel(), 'PowerReport': PowerModel(), 'FormulaReport': FormulaModel(), + 'ControlReport': ControlModel(), } self.db_factory = { diff --git a/powerapi/report/__init__.py b/powerapi/report/__init__.py index c534eec1..99bb4883 100644 --- a/powerapi/report/__init__.py +++ b/powerapi/report/__init__.py @@ -31,3 +31,4 @@ from powerapi.report.power_report import PowerReport from powerapi.report.formula_report import FormulaReport from powerapi.report.hwpc_report import * +from powerapi.report.control_report import ControlReport \ No newline at end of file diff --git a/powerapi/report/control_report.py b/powerapi/report/control_report.py new file mode 100644 index 00000000..7b8f075a --- /dev/null +++ b/powerapi/report/control_report.py @@ -0,0 +1,67 @@ +# Copyright (c) 2018, INRIA +# Copyright (c) 2018, University of Lille +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from __future__ import annotations + +from datetime import datetime +from typing import Dict, List + +from powerapi.report import Report + + +class ControlReport(Report): + """ + EventReport stores information about an event. + This is useful to control external tools via a producer/consumer job queue. + """ + + def __init__(self, timestamp: datetime, sensor: str, target: str, action: str, parameters: List): + """ + Initialize a Control Event report using the given parameters. + :param timestamp: Report timestamp + :param sensor: Sensor name + :param target: Target name + :param action: Action name + :param parameters: Parameter values + """ + Report.__init__(self, timestamp, sensor, target) + self.action = action + self.parameters = parameters + + def __repr__(self) -> str: + return 'ControlReport(%s, %s, %s, %s, %s)' % (self.timestamp, self.sensor, self.target, self.action, self.parameters) + + @staticmethod + def deserialize(data: Dict) -> ControlReport: + """ + Generate a report using the given data. + :param data: Dictionary containing the report attributes + :return: The Formula report initialized with the given data + """ + return ControlReport(data['timestamp'], data['sensor'], data['target'], data['action'], data['parameters']) diff --git a/powerapi/report_model/__init__.py b/powerapi/report_model/__init__.py index 0ae1446b..0e0245f6 100644 --- a/powerapi/report_model/__init__.py +++ b/powerapi/report_model/__init__.py @@ -32,3 +32,4 @@ from powerapi.report_model.hwpc_model import HWPCModel from powerapi.report_model.power_model import PowerModel from powerapi.report_model.formula_model import FormulaModel +from powerapi.report_model.control_model import ControlModel \ No newline at end of file diff --git a/powerapi/report_model/control_model.py b/powerapi/report_model/control_model.py new file mode 100644 index 00000000..650206e4 --- /dev/null +++ b/powerapi/report_model/control_model.py @@ -0,0 +1,62 @@ +# Copyright (c) 2018, INRIA +# Copyright (c) 2018, University of Lille +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from typing import Dict + +from powerapi.report import Report, ControlReport + + +class ControlModel: + """ + ReportModel class. + + It define all the function that need to be override if we want + to format the raw data read in different kind of database. + """ + + def get_type(self) -> type: + """ + Return the type of report + """ + return ControlReport + + def from_mongodb(self, json: Dict) -> Dict: + """ + Get the mongodb report + """ + # Re arrange the json before return it by removing '_id' field + json.pop('_id', None) + + return json + + def to_mongodb(self, serialized_report: Report) -> Dict: + """ + Return raw data from serialized report + """ + return serialized_report