diff --git a/.ruff.toml b/.ruff.toml index 4cde4fd0..06845b96 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -16,7 +16,6 @@ select = [ ignore = [ "E501", # line too long - "UP006", # non-pep585-annotation "UP007", # non-pep604-annotation-union "UP015", # redundant-open-modes "UP031", # printf-string-formatting diff --git a/src/powerapi/cli/config_validator.py b/src/powerapi/cli/config_validator.py index 6282aab9..64ab147e 100644 --- a/src/powerapi/cli/config_validator.py +++ b/src/powerapi/cli/config_validator.py @@ -30,8 +30,6 @@ import logging import os -from typing import Dict - from powerapi.exception import MissingArgumentException, NotAllowedArgumentValueException, FileDoesNotExistException, \ UnexistingActorException @@ -42,7 +40,7 @@ class ConfigValidator: """ @staticmethod - def validate(config: Dict): + def validate(config: dict): """ Validate powerapi config and initialize missing default values """ @@ -101,7 +99,7 @@ def validate(config: Dict): ConfigValidator._validate_input(config) @staticmethod - def _validate_input(config: Dict): + def _validate_input(config: dict): """ Check that csv input type has files that exist """ @@ -118,7 +116,7 @@ def _validate_input(config: Dict): raise FileDoesNotExistException(file_name=file_name) @staticmethod - def _validate_binding(config: Dict): + def _validate_binding(config: dict): """ Check that defined bindings use existing actors defined by the configuration """ diff --git a/src/powerapi/cli/generator.py b/src/powerapi/cli/generator.py index ad998255..6f238dfc 100644 --- a/src/powerapi/cli/generator.py +++ b/src/powerapi/cli/generator.py @@ -30,7 +30,7 @@ import logging import os import sys -from typing import Dict, Type, Callable +from typing import Callable from powerapi.actor import Actor from powerapi.database import MongoDB, CsvDB, OpenTSDB, SocketDB, PrometheusDB, VirtioFSDB, FileDB @@ -93,7 +93,7 @@ class Generator: def __init__(self, component_group_name): self.component_group_name = component_group_name - def generate(self, main_config: dict) -> Dict[str, Type[Actor]]: + def generate(self, main_config: dict) -> dict[str, type[Actor]]: """ Generate an actor class and actor start message from config dict """ @@ -115,7 +115,7 @@ def generate(self, main_config: dict) -> Dict[str, Type[Actor]]: return actors - def _gen_actor(self, component_config: dict, main_config: dict, component_name: str) -> Type[Actor]: + def _gen_actor(self, component_config: dict, main_config: dict, component_name: str) -> type[Actor]: raise NotImplementedError() @@ -213,7 +213,7 @@ def remove_db_factory(self, database_name: str): raise DatabaseNameDoesNotExist(database_name) del self.db_factory[database_name] - def add_report_class(self, model_name: str, report_class: Type[Report]): + def add_report_class(self, model_name: str, report_class: type[Report]): """ add a report class to generator """ @@ -287,7 +287,7 @@ class ProcessorGenerator(Generator): Generator that initialises the processor from config """ - def __init__(self, component_group_name: str, processor_factory: Dict[str, Callable[[Dict], ProcessorActor]] = None): + def __init__(self, component_group_name: str, processor_factory: dict[str, Callable[[dict], ProcessorActor]] = None): Generator.__init__(self, component_group_name) self.processor_factory = processor_factory @@ -331,7 +331,7 @@ def __init__(self): super().__init__('pre-processor', self._get_default_processor_factories()) @staticmethod - def _k8s_pre_processor_factory(processor_config: Dict) -> K8sPreProcessorActor: + def _k8s_pre_processor_factory(processor_config: dict) -> K8sPreProcessorActor: """ Kubernetes pre-processor actor factory. :param processor_config: Pre-Processor configuration @@ -345,7 +345,7 @@ def _k8s_pre_processor_factory(processor_config: Dict) -> K8sPreProcessorActor: level_logger = logging.DEBUG if processor_config[GENERAL_CONF_VERBOSE_KEY] else logging.INFO return K8sPreProcessorActor(name, [], target_actors_name, api_mode, api_host, api_key, level_logger) - def _get_default_processor_factories(self) -> Dict[str, Callable[[Dict], ProcessorActor]]: + def _get_default_processor_factories(self) -> dict[str, Callable[[dict], ProcessorActor]]: """ Return the default pre-processors factory. """ @@ -363,5 +363,5 @@ def __init__(self): ProcessorGenerator.__init__(self, 'post-processor', self._get_default_processor_factories()) @staticmethod - def _get_default_processor_factories() -> Dict[str, Callable[[Dict], ProcessorActor]]: + def _get_default_processor_factories() -> dict[str, Callable[[dict], ProcessorActor]]: return {} diff --git a/src/powerapi/database/csvdb.py b/src/powerapi/database/csvdb.py index bc150e20..8c2613ab 100644 --- a/src/powerapi/database/csvdb.py +++ b/src/powerapi/database/csvdb.py @@ -26,13 +26,13 @@ # 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. + import csv import os -from typing import List, Type -from powerapi.report.report import Report, CSV_HEADER_COMMON from powerapi.database.base_db import BaseDB, IterDB from powerapi.exception import PowerAPIException +from powerapi.report.report import Report, CSV_HEADER_COMMON from powerapi.utils import utils # Array of field that will not be considered as a group @@ -192,7 +192,7 @@ class CsvDB(BaseDB): a CsvDB instance can be define by its current path """ - def __init__(self, report_type: Type[Report], tags: List[str], current_path="/tmp/csvdbtest", files=[]): + def __init__(self, report_type: type[Report], tags: list[str], current_path="/tmp/csvdbtest", files=[]): """ :param current_path: Current path where read/write files """ @@ -294,7 +294,7 @@ def save(self, report: Report): for row in values: writer.writerow(row) - def save_many(self, reports: List[Report]): + def save_many(self, reports: list[Report]): """ Allow to save a batch of report diff --git a/src/powerapi/database/file_db.py b/src/powerapi/database/file_db.py index 45121c0f..b78d1930 100644 --- a/src/powerapi/database/file_db.py +++ b/src/powerapi/database/file_db.py @@ -27,11 +27,11 @@ # 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 datetime import datetime +import json import logging -from typing import List, Type import os -import json +from datetime import datetime + from powerapi.database.base_db import BaseDB, DBError, IterDB from powerapi.report import Report @@ -93,7 +93,7 @@ class FileDB(BaseDB): Allow to handle a FileDB database in reading or writing. """ - def __init__(self, report_type: Type[Report], filename: str): + def __init__(self, report_type: type[Report], filename: str): """ :param report_type: Type of the report handled by this database :param filename: Name of the file containing the report @@ -142,7 +142,7 @@ def save(self, report: Report): with open(self.filename, 'w', encoding='utf-8') as file_object: file_object.write(str(final_dict)) - def save_many(self, reports: List[Report]): + def save_many(self, reports: list[Report]): """ Allow to save a batch of data diff --git a/src/powerapi/database/influxdb2.py b/src/powerapi/database/influxdb2.py index ee319ab3..ff70f1f8 100644 --- a/src/powerapi/database/influxdb2.py +++ b/src/powerapi/database/influxdb2.py @@ -28,7 +28,6 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import logging -from typing import List, Type from urllib.parse import urlparse try: from influxdb_client import InfluxDBClient, WriteOptions @@ -54,7 +53,7 @@ class InfluxDB2(BaseDB): Allow to handle a InfluxDB database in reading or writing. """ - def __init__(self, report_type: Type[Report], url: str, org: str, bucket_name: str, token: str, tags: List[str], + def __init__(self, report_type: type[Report], url: str, org: str, bucket_name: str, token: str, tags: list[str], port=None): """ :param report_type: Type of the report handled by this database @@ -140,7 +139,7 @@ def save(self, report: Report): """ self.save_many([report]) - def save_many(self, reports: List[Report]): + def save_many(self, reports: list[Report]): """ Save a batch of data diff --git a/src/powerapi/database/mongodb.py b/src/powerapi/database/mongodb.py index 4fec65f3..b8734235 100644 --- a/src/powerapi/database/mongodb.py +++ b/src/powerapi/database/mongodb.py @@ -26,6 +26,7 @@ # 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. + import logging try: import pymongo @@ -33,7 +34,6 @@ except ImportError: logging.getLogger().info("PyMongo is not installed.") -from typing import List, Type from powerapi.database.base_db import BaseDB, DBError, IterDB from powerapi.report import Report @@ -93,7 +93,7 @@ class MongoDB(BaseDB): Allow to handle a MongoDB database in reading or writing. """ - def __init__(self, report_type: Type[Report], uri: str, db_name: str, collection_name: str): + def __init__(self, report_type: type[Report], uri: str, db_name: str, collection_name: str): """ :param report_type: Type of the report handled by this database :param uri: URI of the MongoDB server @@ -164,7 +164,7 @@ def save(self, report: Report): """ self.collection.insert_one(self.report_type.to_mongodb(report)) - def save_many(self, reports: List[Report]): + def save_many(self, reports: list[Report]): """ Allow to save a batch of data diff --git a/src/powerapi/database/opentsdb.py b/src/powerapi/database/opentsdb.py index e4f353cc..21da66c5 100644 --- a/src/powerapi/database/opentsdb.py +++ b/src/powerapi/database/opentsdb.py @@ -26,14 +26,13 @@ # 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. + import logging try: from opentsdb import TSDBClient except ImportError: logging.getLogger().info("opentsdb-py is not installed.") -from typing import List, Type - from powerapi.report import PowerReport, Report from .base_db import BaseDB, DBError @@ -51,7 +50,7 @@ class OpenTSDB(BaseDB): Allow to handle an OpenTSDB database to save PowerReport. """ - def __init__(self, report_type: Type[Report], host: str, port, metric_name: str): + def __init__(self, report_type: type[Report], host: str, port, metric_name: str): """ :param host: host of the OpenTSDB server :param port: port of the OpenTSDB server @@ -105,7 +104,7 @@ def save(self, report: PowerReport): self.client.send(self.metric_name, report.power, timestamp=int(report.timestamp.timestamp()), host=report.target) - def save_many(self, reports: List[Report]): + def save_many(self, reports: list[Report]): """ Save a batch of data diff --git a/src/powerapi/database/prometheus_db.py b/src/powerapi/database/prometheus_db.py index 23c2ba7a..16e9fb2e 100644 --- a/src/powerapi/database/prometheus_db.py +++ b/src/powerapi/database/prometheus_db.py @@ -28,7 +28,6 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import logging -from typing import List, Type try: from prometheus_client import start_http_server, Gauge @@ -55,8 +54,8 @@ class BasePrometheusDB(BaseDB): Base class to expose data to prometheus instance """ - def __init__(self, report_type: Type[Report], port: int, metric_name: str, - tags: List[str], metric_description: str = DEFAULT_METRIC_DESCRIPTION, address: str = DEFAULT_ADDRESS): + def __init__(self, report_type: type[Report], port: int, metric_name: str, + tags: list[str], metric_description: str = DEFAULT_METRIC_DESCRIPTION, address: str = DEFAULT_ADDRESS): BaseDB.__init__(self, report_type) self.address = address self.port = port @@ -85,8 +84,8 @@ class PrometheusDB(BasePrometheusDB): It can only be used with a pusher actor """ - def __init__(self, report_type: Type[Report], port: int, address: str, metric_name: str, metric_description: str, - tags: List[str]): + def __init__(self, report_type: type[Report], port: int, address: str, metric_name: str, metric_description: str, + tags: list[str]): """ :param address: address that exposes the metric :param port: port used to expose the metric @@ -176,7 +175,7 @@ def save(self, report: Report): self._expose_data(key, measure) - def save_many(self, reports: List[Report]): + def save_many(self, reports: list[Report]): """ Save a batch of data diff --git a/src/powerapi/database/socket_db.py b/src/powerapi/database/socket_db.py index 825fd3a1..dfb99157 100644 --- a/src/powerapi/database/socket_db.py +++ b/src/powerapi/database/socket_db.py @@ -32,7 +32,7 @@ from queue import SimpleQueue, Empty from socketserver import ThreadingMixIn, TCPServer, StreamRequestHandler from threading import Thread -from typing import Type, Iterator +from typing import Iterator from powerapi.database.base_db import IterDB, BaseDB from powerapi.report import Report @@ -135,7 +135,7 @@ class SocketDB(BaseDB): Database implementation that exposes a TCP socket the clients can connect to. """ - def __init__(self, report_type: Type[Report], host: str, port: int): + def __init__(self, report_type: type[Report], host: str, port: int): """ :param report_type: The type of report to create :param host: The host address to listen on diff --git a/src/powerapi/database/virtiofs_db.py b/src/powerapi/database/virtiofs_db.py index f6c4a953..9fa485ea 100644 --- a/src/powerapi/database/virtiofs_db.py +++ b/src/powerapi/database/virtiofs_db.py @@ -27,10 +27,8 @@ # 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. -import re import os - -from typing import List, Type +import re from powerapi.report import Report from .base_db import BaseDB, DBError @@ -52,7 +50,7 @@ class VirtioFSDB(BaseDB): A regular expression must be given by the VM manager to extract vm name from target name. VM name is used to find directory that contains the output file. """ - def __init__(self, report_type: Type[Report], vm_name_regexp: str, root_directory_name: str, + def __init__(self, report_type: type[Report], vm_name_regexp: str, root_directory_name: str, vm_directory_name_prefix: str = '', vm_directory_name_suffix: str = ''): """ :param vm_name_regexp: regexp used to extract vm name from report. The regexp must match the name of the target @@ -97,6 +95,6 @@ def save(self, report: Report): with open(vm_filename_path + vm_filename, 'w', encoding='utf-8') as vm_file: vm_file.write(str(power)) - def save_many(self, reports: List[Report]): + def save_many(self, reports: list[Report]): for report in reports: self.save(report) diff --git a/src/powerapi/dispatch_rule/dispatch_rule.py b/src/powerapi/dispatch_rule/dispatch_rule.py index ad16f526..92f9c204 100644 --- a/src/powerapi/dispatch_rule/dispatch_rule.py +++ b/src/powerapi/dispatch_rule/dispatch_rule.py @@ -27,14 +27,14 @@ # 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 Optional, List +from typing import Optional class DispatchRule: """ Group by rule """ - def __init__(self, primary: bool = False, fields: Optional[List[str]] = None): + def __init__(self, primary: bool = False, fields: Optional[list[str]] = None): self.is_primary = primary self.fields = fields diff --git a/src/powerapi/dispatch_rule/hwpc_dispatch_rule.py b/src/powerapi/dispatch_rule/hwpc_dispatch_rule.py index df1408be..45d572ed 100644 --- a/src/powerapi/dispatch_rule/hwpc_dispatch_rule.py +++ b/src/powerapi/dispatch_rule/hwpc_dispatch_rule.py @@ -28,7 +28,6 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. from enum import IntEnum -from typing import List from .dispatch_rule import DispatchRule @@ -57,7 +56,7 @@ def __init__(self, depth: HWPCDepthLevel, primary: bool = False): self.depth = depth @staticmethod - def _get_fields_by_depth(depth: HWPCDepthLevel) -> List[str]: + def _get_fields_by_depth(depth: HWPCDepthLevel) -> list[str]: if depth == HWPCDepthLevel.TARGET: return ['target'] diff --git a/src/powerapi/dispatch_rule/power_dispatch_rule.py b/src/powerapi/dispatch_rule/power_dispatch_rule.py index 2b8d7a65..77b395c7 100644 --- a/src/powerapi/dispatch_rule/power_dispatch_rule.py +++ b/src/powerapi/dispatch_rule/power_dispatch_rule.py @@ -27,11 +27,9 @@ # 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 Tuple, List from enum import IntEnum from powerapi.report import PowerReport - from .dispatch_rule import DispatchRule @@ -46,7 +44,7 @@ class PowerDepthLevel(IntEnum): CORE = 2 -def extract_id_from_report(report: PowerReport, depth: PowerDepthLevel) -> Tuple: +def extract_id_from_report(report: PowerReport, depth: PowerDepthLevel) -> tuple: """ :return: a report id generated from the report and the given depth """ @@ -75,7 +73,7 @@ def __init__(self, depth: PowerDepthLevel, primary: bool = False): self.depth = depth @staticmethod - def _get_fields_by_depth(depth: PowerDepthLevel) -> List[str]: + def _get_fields_by_depth(depth: PowerDepthLevel) -> list[str]: if depth == PowerDepthLevel.TARGET: return ['target'] diff --git a/src/powerapi/dispatch_rule/procfs_dispatch_rule.py b/src/powerapi/dispatch_rule/procfs_dispatch_rule.py index 14975de3..6c8586c9 100644 --- a/src/powerapi/dispatch_rule/procfs_dispatch_rule.py +++ b/src/powerapi/dispatch_rule/procfs_dispatch_rule.py @@ -27,11 +27,9 @@ # 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 Tuple, List from enum import IntEnum from powerapi.report import ProcfsReport - from .dispatch_rule import DispatchRule @@ -44,7 +42,7 @@ class ProcfsDepthLevel(IntEnum): SENSOR = 0 -def extract_id_from_report(report: ProcfsReport, depth: ProcfsDepthLevel) -> Tuple: +def extract_id_from_report(report: ProcfsReport, depth: ProcfsDepthLevel) -> tuple: """ :return: a report id generated from the report and the given depth """ @@ -67,7 +65,7 @@ def __init__(self, depth: ProcfsDepthLevel, primary: bool = False): self.depth = depth @staticmethod - def _get_fields_by_depth(depth: ProcfsDepthLevel) -> List[str]: + def _get_fields_by_depth(depth: ProcfsDepthLevel) -> list[str]: if depth == ProcfsDepthLevel.TARGET: return ['target'] diff --git a/src/powerapi/formula/abstract_cpu_dram_formula.py b/src/powerapi/formula/abstract_cpu_dram_formula.py index f84e9203..8c99d1f0 100644 --- a/src/powerapi/formula/abstract_cpu_dram_formula.py +++ b/src/powerapi/formula/abstract_cpu_dram_formula.py @@ -28,7 +28,7 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import logging -from typing import Dict, Any +from typing import Any from powerapi.actor import Actor from powerapi.formula.formula_actor import FormulaActor, FormulaState @@ -40,7 +40,7 @@ class AbstractCpuDramFormulaState(FormulaState): Formula values with configurable sleeping time for dummy formula """ - def __init__(self, actor: Actor, pushers: Dict[str, Actor], metadata: Dict[str, Any], socket: str, core: str): + def __init__(self, actor: Actor, pushers: dict[str, Actor], metadata: dict[str, Any], socket: str, core: str): FormulaState.__init__(self, actor, pushers, metadata) self.socket = socket self.core = core @@ -52,7 +52,7 @@ class AbstractCpuDramFormula(FormulaActor): It can be launched to handle data from a specific part of a cpu (whole cpu, a socket or a core) """ - def __init__(self, name, pushers: Dict[str, PusherActor], socket: str, core: str, level_logger=logging.WARNING, + def __init__(self, name, pushers: dict[str, PusherActor], socket: str, core: str, level_logger=logging.WARNING, timeout=None): FormulaActor.__init__(self, name, pushers, level_logger, timeout) self.state = AbstractCpuDramFormulaState(self, pushers, self.formula_metadata, socket, core) diff --git a/src/powerapi/formula/formula_actor.py b/src/powerapi/formula/formula_actor.py index 2ef824af..7db3b58d 100644 --- a/src/powerapi/formula/formula_actor.py +++ b/src/powerapi/formula/formula_actor.py @@ -30,8 +30,6 @@ import logging import re -from typing import Dict - from powerapi.actor import Actor, State from powerapi.pusher import PusherActor @@ -55,7 +53,7 @@ class FormulaActor(Actor): Abstract actor class used to implement formula actor that compute power consumption of a device from Reports """ - def __init__(self, name, pushers: Dict[str, PusherActor], level_logger=logging.WARNING, timeout=None): + def __init__(self, name, pushers: dict[str, PusherActor], level_logger=logging.WARNING, timeout=None): """ Initialize a new Formula actor. :param name: Actor name diff --git a/src/powerapi/processor/pre/k8s/metadata_cache_manager.py b/src/powerapi/processor/pre/k8s/metadata_cache_manager.py index e169ec86..6dcf5b3b 100644 --- a/src/powerapi/processor/pre/k8s/metadata_cache_manager.py +++ b/src/powerapi/processor/pre/k8s/metadata_cache_manager.py @@ -29,7 +29,7 @@ from dataclasses import dataclass from multiprocessing import Manager -from typing import Dict, Optional +from typing import Optional ADDED_EVENT = 'ADDED' DELETED_EVENT = 'DELETED' @@ -57,7 +57,7 @@ def __init__(self, manager: Manager): """ :param manager: Manager of the shared metadata cache """ - self.metadata_cache: Dict[str, K8sContainerMetadata] = manager.dict() + self.metadata_cache: dict[str, K8sContainerMetadata] = manager.dict() def update_container_metadata(self, event: str, container_metadata: K8sContainerMetadata): """ diff --git a/src/powerapi/processor/pre/k8s/monitor_agent.py b/src/powerapi/processor/pre/k8s/monitor_agent.py index b2266f3b..2e5918d4 100644 --- a/src/powerapi/processor/pre/k8s/monitor_agent.py +++ b/src/powerapi/processor/pre/k8s/monitor_agent.py @@ -31,7 +31,7 @@ import sys from multiprocessing import Process from signal import signal, SIGTERM, SIGINT -from typing import Dict, Optional, List +from typing import Optional from kubernetes import client, config, watch from kubernetes.client import V1Pod, V1PodList, V1ContainerStatus @@ -159,7 +159,7 @@ def run(self): self.watch_list_pod_for_all_namespaces(resource_id) @staticmethod - def get_containers_id_name_from_statuses(container_statuses: List[V1ContainerStatus]) -> Dict[str, str]: + def get_containers_id_name_from_statuses(container_statuses: list[V1ContainerStatus]) -> dict[str, str]: """ Extract containers ID and name from the statuses. :param container_statuses: List of container statuses @@ -170,7 +170,7 @@ def get_containers_id_name_from_statuses(container_statuses: List[V1ContainerSta for container_status in container_statuses or [] if container_status.container_id is not None } - def build_metadata_cache_entries_from_pod(self, pod: V1Pod) -> List[K8sContainerMetadata]: + def build_metadata_cache_entries_from_pod(self, pod: V1Pod) -> list[K8sContainerMetadata]: """ Build and return metadata cache entries from a Kubernetes pod object. :param pod: Kubernetes pod diff --git a/src/powerapi/report/control_report.py b/src/powerapi/report/control_report.py index 984bad45..e697cb18 100644 --- a/src/powerapi/report/control_report.py +++ b/src/powerapi/report/control_report.py @@ -30,7 +30,7 @@ from __future__ import annotations from datetime import datetime -from typing import Dict, List, Any +from typing import Any from .report import Report @@ -41,7 +41,7 @@ class ControlReport(Report): 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, metadata: Dict[str, Any] = {}): + def __init__(self, timestamp: datetime, sensor: str, target: str, action: str, parameters: list, metadata: dict[str, Any] = {}): """ Initialize a Control Event report using the given parameters. :param timestamp: Report timestamp @@ -64,7 +64,7 @@ def __eq__(self, other: Any) -> bool: return super().__eq__(other) and self.action == other.action and self.parameters == other.parameters @staticmethod - def from_json(data: Dict) -> ControlReport: + def from_json(data: dict) -> ControlReport: """ :return: a dictionary, that can be converted into json format, from a given ControlReport """ @@ -72,14 +72,14 @@ def from_json(data: Dict) -> ControlReport: return ControlReport(data['timestamp'], data['sensor'], data['target'], data['action'], data['parameters'], metadata) @staticmethod - def from_mongodb(data: Dict) -> ControlReport: + def from_mongodb(data: dict) -> ControlReport: """ :return: a ControlReport from a dictionary pulled from mongodb """ return ControlReport.from_json(data) @staticmethod - def to_mongodb(report: ControlReport) -> Dict: + def to_mongodb(report: ControlReport) -> dict: """ :return: a dictionary, that can be stored into a mongodb, from a given ControlReport """ diff --git a/src/powerapi/report/formula_report.py b/src/powerapi/report/formula_report.py index bb19ab8a..958b4e66 100644 --- a/src/powerapi/report/formula_report.py +++ b/src/powerapi/report/formula_report.py @@ -31,7 +31,7 @@ import json from datetime import datetime -from typing import Dict, Any, List +from typing import Any from powerapi.report.report import Report, CSV_HEADER_COMMON @@ -44,7 +44,7 @@ class FormulaReport(Report): This is useful to gather information about a running formula in order to debug or compute statistics. """ - def __init__(self, timestamp: datetime, sensor: str, target: str, metadata: Dict[str, Any]): + def __init__(self, timestamp: datetime, sensor: str, target: str, metadata: dict[str, Any]): """ Initialize a Formula report using the given parameters. :param timestamp: Report timestamp @@ -58,7 +58,7 @@ def __repr__(self) -> str: return f'FormulaReport({self.timestamp}, {self.sensor}, {self.target}, {self.metadata})' @staticmethod - def to_csv_lines(report: FormulaReport, **_) -> (List[str], Dict[str, Any]): + def to_csv_lines(report: FormulaReport, **_) -> (list[str], dict[str, Any]): """ Convert a Formula report into a csv line. :param report: Formula report that will be converted @@ -75,7 +75,7 @@ def to_csv_lines(report: FormulaReport, **_) -> (List[str], Dict[str, Any]): return CSV_HEADER_FORMULA_REPORT, {'FormulaReport': [line]} @staticmethod - def to_mongodb(report: FormulaReport) -> Dict[str, Any]: + def to_mongodb(report: FormulaReport) -> dict[str, Any]: """ Convert a Formula report into a json document that can be stored into mongodb. :return: a dictionary, that can be stored into a mongodb @@ -83,7 +83,7 @@ def to_mongodb(report: FormulaReport) -> Dict[str, Any]: return FormulaReport.to_json(report) @staticmethod - def to_influxdb(report: FormulaReport, **_) -> Dict[str, Any]: + def to_influxdb(report: FormulaReport, **_) -> dict[str, Any]: """ Convert a Formula report into a dict that can be stored into influxdb. param report: Formula report that will be converted diff --git a/src/powerapi/report/hwpc_report.py b/src/powerapi/report/hwpc_report.py index 2b728502..2a542fb2 100644 --- a/src/powerapi/report/hwpc_report.py +++ b/src/powerapi/report/hwpc_report.py @@ -30,7 +30,7 @@ from __future__ import annotations from datetime import datetime -from typing import Dict, Any +from typing import Any from powerapi.report.report import Report, BadInputData, CSV_HEADER_COMMON, CsvLines, SENSOR_KEY, TARGET_KEY, \ TIMESTAMP_KEY, METADATA_KEY, GROUPS_KEY @@ -69,8 +69,8 @@ class HWPCReport(Report): } """ - def __init__(self, timestamp: datetime, sensor: str, target: str, groups: Dict[str, Dict], - metadata: Dict[str, Any] = {}): + def __init__(self, timestamp: datetime, sensor: str, target: str, groups: dict[str, dict], + metadata: dict[str, Any] = {}): """ Initialize an HWPC report using the given parameters. :param datetime timestamp: Timestamp of the report @@ -94,7 +94,7 @@ def __eq__(self, other) -> bool: return super().__eq__(other) and self.groups == other.groups @staticmethod - def from_json(data: Dict) -> HWPCReport: + def from_json(data: dict) -> HWPCReport: """ Generate a report using the given data. :param data: Dictionary containing the report attributes @@ -112,18 +112,18 @@ def from_json(data: Dict) -> HWPCReport: raise BadInputData(f'Unexpected field value in input document: {exn.args}', data) from exn @staticmethod - def to_json(report: HWPCReport) -> Dict: + def to_json(report: HWPCReport) -> dict: return report.__dict__ @staticmethod - def from_mongodb(data: Dict) -> HWPCReport: + def from_mongodb(data: dict) -> HWPCReport: """ :return: a HWPCReport from a dictionary pulled from mongodb """ return HWPCReport.from_json(data) @staticmethod - def to_mongodb(report: HWPCReport) -> Dict: + def to_mongodb(report: HWPCReport) -> dict: """ :return: a dictionary, that can be stored into a mongodb, from a given HWPCReport """ diff --git a/src/powerapi/report/power_report.py b/src/powerapi/report/power_report.py index 4db14f0d..f1f2a16b 100644 --- a/src/powerapi/report/power_report.py +++ b/src/powerapi/report/power_report.py @@ -30,7 +30,7 @@ from __future__ import annotations from datetime import datetime -from typing import Dict, Any, List, Tuple +from typing import Any from powerapi.report.report import Report, CSV_HEADER_COMMON, BadInputData, CsvLines @@ -42,7 +42,7 @@ class PowerReport(Report): PowerReport stores the power estimation information. """ - def __init__(self, timestamp: datetime, sensor: str, target: str, power: float, metadata: Dict[str, Any] = {}): + def __init__(self, timestamp: datetime, sensor: str, target: str, power: float, metadata: dict[str, Any] = {}): """ Initialize a Power report using the given parameters. :param datetime timestamp: Report timestamp @@ -66,7 +66,7 @@ def __eq__(self, other) -> bool: return super().__eq__(other) and self.power == other.power @staticmethod - def from_json(data: Dict) -> Report: + def from_json(data: dict) -> Report: """ Generate a report using the given data. :param data: Dictionary containing the report attributes @@ -111,7 +111,7 @@ def from_csv_lines(lines: CsvLines) -> PowerReport: raise BadInputData(exn.args[0], row) from exn @staticmethod - def to_csv_lines(report: PowerReport, tags: List[str]) -> CsvLines: + def to_csv_lines(report: PowerReport, tags: list[str]) -> CsvLines: """ convert a power report into csv lines :param report: Report that will be converted into csv lines @@ -141,7 +141,7 @@ def to_csv_lines(report: PowerReport, tags: List[str]) -> CsvLines: return CSV_HEADER_POWER, final_dict @staticmethod - def to_virtiofs_db(report: PowerReport) -> Tuple[str, str]: + def to_virtiofs_db(report: PowerReport) -> tuple[str, str]: """ return a tuple containing the power value and the name of the file to store the value. """ @@ -194,14 +194,14 @@ def to_prometheus(report: PowerReport, tags: None | list[str]) -> dict[str, Any] } @staticmethod - def to_mongodb(report: PowerReport) -> Dict: + def to_mongodb(report: PowerReport) -> dict: """ :return: a dictionary, that can be stored into a mongodb, from a given PowerReport """ return PowerReport.to_json(report) @staticmethod - def from_mongodb(data: Dict) -> Report: + def from_mongodb(data: dict) -> Report: """ :return: a PowerReport from a dictionary pulled from mongodb """ diff --git a/src/powerapi/report/procfs_report.py b/src/powerapi/report/procfs_report.py index 90980724..4a5338e0 100644 --- a/src/powerapi/report/procfs_report.py +++ b/src/powerapi/report/procfs_report.py @@ -31,7 +31,7 @@ from datetime import datetime -from typing import Dict, Any +from typing import Any from powerapi.report.report import Report, BadInputData, CSV_HEADER_COMMON, CsvLines @@ -53,7 +53,7 @@ class ProcfsReport(Report): """ - def __init__(self, timestamp: datetime, sensor: str, target: str, usage: Dict, global_cpu_usage: float, metadata: Dict[str, Any] = {}): + def __init__(self, timestamp: datetime, sensor: str, target: str, usage: dict, global_cpu_usage: float, metadata: dict[str, Any] = {}): """ Initialize an Procfs report using the given parameters. :param datetime timestamp: Timestamp of the report @@ -78,7 +78,7 @@ def __eq__(self, other) -> bool: return super().__eq__(other) and self.usage == other.usage and self.global_cpu_usage == other.global_cpu_usage @staticmethod - def from_json(data: Dict) -> ProcfsReport: + def from_json(data: dict) -> ProcfsReport: """ Generate a report using the given data. :param data: Dictionary containing the report attributes @@ -94,16 +94,16 @@ def from_json(data: Dict) -> ProcfsReport: raise BadInputData(exn.args[0], data) from exn @staticmethod - def to_json(report: ProcfsReport) -> Dict: + def to_json(report: ProcfsReport) -> dict: return report.__dict__ @staticmethod - def from_mongodb(data: Dict) -> ProcfsReport: + def from_mongodb(data: dict) -> ProcfsReport: """ Extract a PorcfsReport fropm a mongo DB""" return ProcfsReport.from_json(data) @staticmethod - def to_mongodb(report: ProcfsReport) -> Dict: + def to_mongodb(report: ProcfsReport) -> dict: """ Export a ProcfsReport to a mongo DB""" return ProcfsReport.to_json(report) diff --git a/src/powerapi/report/report.py b/src/powerapi/report/report.py index 4b2d43d0..cf2ca87e 100644 --- a/src/powerapi/report/report.py +++ b/src/powerapi/report/report.py @@ -31,7 +31,7 @@ from collections import Counter from datetime import datetime -from typing import Dict, NewType, Tuple, List, Any, Iterable +from typing import NewType, Any, Iterable from zlib import crc32 from powerapi.exception import PowerAPIExceptionWithMessage, PowerAPIException @@ -44,7 +44,7 @@ GROUPS_KEY = 'groups' CSV_HEADER_COMMON = [TIMESTAMP_KEY, SENSOR_KEY, TARGET_KEY] -CsvLines = NewType('CsvLines', Tuple[List[str], Dict[str, str]]) +CsvLines = NewType('CsvLines', tuple[list[str], dict[str, str]]) TAGS_NAME_TRANSLATION_TABLE = str.maketrans('.-/', '___') @@ -71,7 +71,7 @@ class Report(Message): Report abtract class. """ - def __init__(self, timestamp: datetime, sensor: str, target: str, metadata: Dict[str, Any] = {}): + def __init__(self, timestamp: datetime, sensor: str, target: str, metadata: dict[str, Any] = {}): """ Initialize a report using the given parameters. :param datetime timestamp: Timestamp @@ -101,7 +101,7 @@ def __eq__(self, other): self.metadata == other.metadata) @staticmethod - def to_json(report: Report) -> Dict: + def to_json(report: Report) -> dict: """ :return: a json dictionary, that can be converted into json format, from a given Report """ diff --git a/tests/unit/processor/conftest.py b/tests/unit/processor/conftest.py index 4f67e2fd..cd83bf11 100644 --- a/tests/unit/processor/conftest.py +++ b/tests/unit/processor/conftest.py @@ -27,7 +27,7 @@ # 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 Any, Dict +from typing import Any from unittest.mock import Mock import pytest @@ -46,7 +46,7 @@ class FakeMetadata: Fake metadata class related to an event """ - def __init__(self, name: str, namespace: str, labels: Dict[str, str]): + def __init__(self, name: str, namespace: str, labels: dict[str, str]): self.name = name self.namespace = namespace self.labels = labels diff --git a/tests/unit/processor/pre/k8s/test_monitor_agent.py b/tests/unit/processor/pre/k8s/test_monitor_agent.py index 09df438e..5db42bbb 100644 --- a/tests/unit/processor/pre/k8s/test_monitor_agent.py +++ b/tests/unit/processor/pre/k8s/test_monitor_agent.py @@ -27,8 +27,6 @@ # 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 List - from kubernetes.client import V1Pod, V1ContainerStatus, Configuration, V1ObjectMeta, V1PodStatus @@ -50,7 +48,7 @@ def generate_container_status(container_id, container_name) -> V1ContainerStatus return status -def generate_pod(pod_name, pod_namespace, pod_labels, container_statuses: List[V1ContainerStatus]) -> V1Pod: +def generate_pod(pod_name, pod_namespace, pod_labels, container_statuses: list[V1ContainerStatus]) -> V1Pod: """ Generate an initialized POD object. """ diff --git a/tests/utils/formula/dummy/dummy_formula_actor.py b/tests/utils/formula/dummy/dummy_formula_actor.py index 74783416..62c2e060 100644 --- a/tests/utils/formula/dummy/dummy_formula_actor.py +++ b/tests/utils/formula/dummy/dummy_formula_actor.py @@ -28,16 +28,14 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import logging -from typing import Dict, Any +from typing import Any from powerapi.actor import Actor - -from powerapi.handler import StartHandler -from powerapi.report import Report -from powerapi.message import PoisonPillMessage, StartMessage - from powerapi.formula.abstract_cpu_dram_formula import AbstractCpuDramFormula, AbstractCpuDramFormulaState from powerapi.formula.handlers import FormulaPoisonPillMessageHandler +from powerapi.handler import StartHandler +from powerapi.message import PoisonPillMessage, StartMessage +from powerapi.report import Report from tests.utils.formula.dummy.dummy_handlers import ReportHandler @@ -46,7 +44,7 @@ class DummyFormulaState(AbstractCpuDramFormulaState): Formula values with configurable sleeping time for dummy formula """ - def __init__(self, actor: Actor, pushers: Dict[str, Actor], metadata: Dict[str, Any], socket: str, core: str, + def __init__(self, actor: Actor, pushers: dict[str, Actor], metadata: dict[str, Any], socket: str, core: str, sleep_time: int): AbstractCpuDramFormulaState.__init__(self, actor, pushers, metadata, socket, core) self.sleep_time = sleep_time diff --git a/tests/utils/report/hwpc.py b/tests/utils/report/hwpc.py index ad3b0169..1be6d9c2 100644 --- a/tests/utils/report/hwpc.py +++ b/tests/utils/report/hwpc.py @@ -26,14 +26,14 @@ # 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. + import json -from typing import Dict, List import tests.utils.report as parent_module from powerapi.report import HWPCReport -def extract_rapl_reports_with_2_sockets(number_of_reports: int) -> List[Dict]: +def extract_rapl_reports_with_2_sockets(number_of_reports: int) -> list[dict]: """ Extract the number_of_reports first reports of the file hwpc_rapl_2_socket.json This file contain hwpc reports with only RAPL_PKG events, recorded on a two socket host @@ -45,7 +45,7 @@ def extract_rapl_reports_with_2_sockets(number_of_reports: int) -> List[Dict]: return reports['reports'][:number_of_reports] -def extract_all_events_reports_with_2_sockets(number_of_reports: int) -> List[Dict]: +def extract_all_events_reports_with_2_sockets(number_of_reports: int) -> list[dict]: """ Extract the number_of_reports first reports of the file hwpc_rapl_2_socket.json This file contain hwpc reports , recorded on a two socket host, with events : @@ -65,7 +65,7 @@ def extract_all_events_reports_with_2_sockets(number_of_reports: int) -> List[Di return reports['reports'][:number_of_reports] -def gen_HWPCReports(number_of_reports: int) -> List[HWPCReport]: +def gen_HWPCReports(number_of_reports: int) -> list[HWPCReport]: """ generate number_of_reports HWPCReport extracted from the file hwpc.json :return: a list of HWPCReport