mirror of
https://framagit.org/framasoft/framaspace/argos.git
synced 2025-04-28 18:02:41 +02:00
- Start implementing some tests using pytest - Packaged using pyproject.toml - Implemented SSL checks using httpx - Checks can now run partially on the server, to access the configuration and determine the severity of the error if any - Used black to format all the files - Added an utility to convert strings like "3d" and "3w" to days - The internal representation of SSL thresholds is now a list of tuples - Models were lacking some relationship between Tasks and Results
70 lines
2 KiB
Python
70 lines
2 KiB
Python
from typing import List, Literal
|
|
from sqlalchemy import (
|
|
Boolean,
|
|
Column,
|
|
ForeignKey,
|
|
Integer,
|
|
String,
|
|
JSON,
|
|
DateTime,
|
|
Enum,
|
|
)
|
|
from sqlalchemy.orm import relationship, Mapped, mapped_column, DeclarativeBase
|
|
from sqlalchemy_utils import ChoiceType
|
|
from sqlalchemy.orm import mapped_column, relationship
|
|
|
|
from datetime import datetime
|
|
|
|
from argos.schemas import WebsiteCheck
|
|
from argos.checks import get_check_by_name
|
|
|
|
|
|
class Base(DeclarativeBase):
|
|
type_annotation_map = {List[WebsiteCheck]: JSON, dict: JSON}
|
|
|
|
|
|
class Task(Base):
|
|
"""
|
|
There is one task per check.
|
|
|
|
It contains all information needed to run the jobs on the workers.
|
|
Workers will return information in the result table.
|
|
"""
|
|
|
|
__tablename__ = "tasks"
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
|
|
# Info needed to run the task
|
|
url: Mapped[str] = mapped_column()
|
|
domain: Mapped[str] = mapped_column()
|
|
check: Mapped[str] = mapped_column()
|
|
expected: Mapped[str] = mapped_column()
|
|
|
|
# Orchestration-related
|
|
selected_by: Mapped[str] = mapped_column(nullable=True)
|
|
selected_at: Mapped[datetime] = mapped_column(nullable=True)
|
|
|
|
results: Mapped[List["Result"]] = relationship(back_populates="task")
|
|
|
|
def __str__(self):
|
|
return f"DB Task {self.url} - {self.check} - {self.expected}"
|
|
|
|
def get_check(self):
|
|
"""Returns a check instance for this specific task"""
|
|
return get_check_by_name(self.check)
|
|
|
|
|
|
class Result(Base):
|
|
__tablename__ = "results"
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
task_id: Mapped[int] = mapped_column(ForeignKey("tasks.id"))
|
|
task: Mapped["Task"] = relationship(back_populates="results")
|
|
|
|
submitted_at: Mapped[datetime] = mapped_column()
|
|
status: Mapped[Literal["success", "failure", "error", "on-check"]] = mapped_column(
|
|
Enum("success", "failure", "error", "on-check")
|
|
)
|
|
context: Mapped[dict] = mapped_column()
|
|
|
|
def __str__(self):
|
|
return f"DB Result {self.id} - {self.status} - {self.context}"
|