This commit is contained in:
+13
-51
@@ -1,12 +1,13 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
from re import A
|
from re import A
|
||||||
|
from tkinter.constants import E
|
||||||
|
|
||||||
import yaml
|
import yaml
|
||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
from playbook.models import ActModel, PlaybookModel, StepModel, timed_run
|
from playbook.models import ActModel, PlaybookModel, StepModel, timed_run
|
||||||
from playbook.logging_models import PlaybookLog, Status, StepLogModel
|
from playbook.logging_models import PlaybookLog, Status, StepLogModel, log_file_name
|
||||||
from playbook.action_registry import ActionFn, ActionRegistry
|
from playbook.action_registry import ActionFn, ActionRegistry
|
||||||
|
|
||||||
|
|
||||||
@@ -21,49 +22,6 @@ class StepIF(ABC):
|
|||||||
""" Return a mapping of action roles (pre, play, post) to function names. """
|
""" Return a mapping of action roles (pre, play, post) to function names. """
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# def log_file_name(self, start_date_ns: int) -> str:
|
|
||||||
# """ Format to ISO 8601. """
|
|
||||||
# seconds = start_date_ns // 1_000_000_000
|
|
||||||
# ms = (start_date_ns % 1_000_000_000) // 1_000_000
|
|
||||||
#
|
|
||||||
# dt = datetime.fromtimestamp(seconds, tz=timezone.utc).astimezone()
|
|
||||||
#
|
|
||||||
# return dt.strftime(f"{self.name}_%Y-%m-%d_%H-%M-%S.{ms:03d}.log")
|
|
||||||
#
|
|
||||||
# def _write_log(self, log: StepLogModel):
|
|
||||||
# try:
|
|
||||||
# with open(log.log_file_path, "w") as file:
|
|
||||||
# json.dump(asdict(log), file)
|
|
||||||
# except Exception as e:
|
|
||||||
# raise PlaybookError(f"failed to create log file {e}") from e
|
|
||||||
# return ""
|
|
||||||
#
|
|
||||||
# def _play_act(self) -> StepLogModel:
|
|
||||||
# playLog: StepLogModel = StepLogModel(
|
|
||||||
# step_name=self.name,
|
|
||||||
# status=Status.GOOD,
|
|
||||||
# duration_sec=0,
|
|
||||||
# msg="",
|
|
||||||
# error=[],
|
|
||||||
# substeps=[],
|
|
||||||
# )
|
|
||||||
#
|
|
||||||
# for a in self._acts:
|
|
||||||
# log: StepLogModel = self._play_steps(self._acts[a])
|
|
||||||
#
|
|
||||||
# if log.failed:
|
|
||||||
# playLog.error.append({
|
|
||||||
# "status": "failed",
|
|
||||||
# "output": f"failed in step: {log.step_name}"
|
|
||||||
# })
|
|
||||||
# playLog.status = Status.BAD
|
|
||||||
# break
|
|
||||||
#
|
|
||||||
# if playLog.status == Status.GOOD:
|
|
||||||
# playLog.msg = "success"
|
|
||||||
#
|
|
||||||
# return playLog
|
|
||||||
|
|
||||||
|
|
||||||
class PlaybookYAMLParser():
|
class PlaybookYAMLParser():
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -173,16 +131,20 @@ class Playbook():
|
|||||||
def from_yaml(cls, fp: str) -> Playbook:
|
def from_yaml(cls, fp: str) -> Playbook:
|
||||||
return PlaybookYAMLParser.from_yaml(fp)
|
return PlaybookYAMLParser.from_yaml(fp)
|
||||||
|
|
||||||
|
def _write_log(self, log: PlaybookLog):
|
||||||
|
try:
|
||||||
|
with open(log.log_file_path, "w") as file:
|
||||||
|
_ = file.write(log.model_dump_json())
|
||||||
|
except Exception as e:
|
||||||
|
raise Exception(f"failed to create log file {e}") from e
|
||||||
|
return ""
|
||||||
|
|
||||||
def view_playbook(self) -> str:
|
def view_playbook(self) -> str:
|
||||||
return self.model.model_dump_json()
|
return self.model.model_dump_json()
|
||||||
|
|
||||||
def run_play(self) -> PlaybookLog:
|
def run_play(self) -> PlaybookLog:
|
||||||
log: PlaybookLog = self.model.run()
|
log: PlaybookLog = self.model.run()
|
||||||
|
log.log_file_path = self.model.log_dir + \
|
||||||
# if self.model.log_dir != "":
|
log_file_name(self.model.playbook_name, log.timing.start_date_timestamp)
|
||||||
# log.log_file_path = os.path.join(
|
self._write_log(log)
|
||||||
# self.model.log_dir, self.log_file_name(log.start_date_timestamp)
|
|
||||||
# )
|
|
||||||
# self._write_log(log)
|
|
||||||
|
|
||||||
return log
|
return log
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
from enum import StrEnum
|
from enum import StrEnum
|
||||||
from dataclasses import field
|
from dataclasses import field
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
from datetime import datetime, timezone
|
||||||
|
|
||||||
|
|
||||||
class Status(StrEnum):
|
class Status(StrEnum):
|
||||||
@@ -53,7 +54,7 @@ class PlaybookLog(BaseLog):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def ok(cls, name: str, logs: list[ActLog], msg: str = "success") -> PlaybookLog:
|
def ok(cls, name: str, logs: list[ActLog], msg: str = "success") -> PlaybookLog:
|
||||||
return cls(name=name, status=Status.GOOD, summary=msg, act_logs=logs)
|
return cls(name=name, status=Status.GOOD, summary=msg, act_logs=logs)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def fail(cls, name: str, logs: list[ActLog], err: list[str]) -> PlaybookLog:
|
def fail(cls, name: str, logs: list[ActLog], err: list[str]) -> PlaybookLog:
|
||||||
return cls(name=name, status=Status.BAD, errors=err, act_logs=logs)
|
return cls(name=name, status=Status.BAD, errors=err, act_logs=logs)
|
||||||
@@ -76,6 +77,16 @@ class StepLogModel(BaseLog):
|
|||||||
return cls(name=name, status=Status.GOOD, msg=msg, pipe_ctx=pipe_ctx,
|
return cls(name=name, status=Status.GOOD, msg=msg, pipe_ctx=pipe_ctx,
|
||||||
substeps_logs=substeps)
|
substeps_logs=substeps)
|
||||||
|
|
||||||
@ classmethod
|
@classmethod
|
||||||
def fail(cls, name: str, err: str) -> StepLogModel:
|
def fail(cls, name: str, err: str) -> StepLogModel:
|
||||||
return cls(name=name, status=Status.BAD, error=err)
|
return cls(name=name, status=Status.BAD, error=err)
|
||||||
|
|
||||||
|
|
||||||
|
def log_file_name(name: str, start_date_ns: int) -> str:
|
||||||
|
""" Format to ISO 8601. """
|
||||||
|
seconds = start_date_ns // 1_000_000_000
|
||||||
|
ms = (start_date_ns % 1_000_000_000) // 1_000_000
|
||||||
|
|
||||||
|
dt = datetime.fromtimestamp(seconds, tz=timezone.utc).astimezone()
|
||||||
|
|
||||||
|
return dt.strftime(f"{name}_%Y-%m-%d_%H-%M-%S.{ms:03d}.log")
|
||||||
|
|||||||
Reference in New Issue
Block a user