Files
cpu_governor_auto_adjust/config.py
T
2024-12-07 16:26:42 +01:00

68 lines
2.1 KiB
Python

import logging
from pathlib import Path
from lxml import etree
from functools import cached_property
from arguments import ArgumentsParser
from typing import NamedTuple, Optional
class TriggerTuple(NamedTuple):
name: str
interval_in_seconds: int
class MissingConfig(Exception):
pass
class Config:
def __init__(self, basepath: Path) -> None:
self.basepath = basepath
self.config = ArgumentsParser().parser.config
@cached_property
def root(self) -> etree.ElementTree:
return etree.parse(self.basepath / self.config)
@cached_property
def app_root(self) -> etree.Element:
return self.root.xpath('/cpuGovernorAutoAdjust').pop()
@cached_property
def loglevel(self) -> str:
value = self.app_root.xpath('logLevel').pop().text.upper()
_loglevels = ", ".join(logging.getLevelNamesMapping().keys())
if value not in logging.getLevelNamesMapping().keys():
raise ValueError(
"logLevel can only contain one of these values: "
f"{_loglevels}"
)
return value
@cached_property
def testmode(self) -> bool:
value = self.app_root.xpath('testMode').pop().text.lower()
if value not in ['true', 'false']:
raise ValueError("testMode can only be 'true' or 'false")
return True if value == 'true' else False
@cached_property
def triggertuples(self) -> list[TriggerTuple]:
ret_val = []
_triggers = self.app_root.xpath('triggers/trigger')
for trigger in _triggers:
name = trigger.xpath('name').pop().text
interval_in_seconds = trigger.xpath('intervalInSeconds').pop().text
ret_val.append(
TriggerTuple(
name=name,
interval_in_seconds=interval_in_seconds
)
)
return ret_val
def get_trigger_by_name(self, name: str) -> Optional[TriggerTuple]:
_all_trigger_tuples = self.triggertuples.copy()
return next((t for t in _all_trigger_tuples if t.name == name), None)