import os
from datetime import datetime
from celery.app.base import Celery
from atk.db.db_tools import DatabasePool
from atk.db.models import CaseResult
from atk.common.output_manager import OutputManager
from atk.common.utils import chmod_output_path
DB_DIR = OutputManager.get_dir_by_env("db")
DB_NAME = os.path.join(DB_DIR, f"celerydb.sqlite3")
RESULT_NAME = os.path.join(DB_DIR, f"result.sqlite3")
ATK_NAME = os.path.join(DB_DIR, f"atk.sqlite3")
ALL_DB = [DB_NAME, RESULT_NAME, ATK_NAME]
app = Celery("atk", broker=f"sqla+sqlite:///{DB_NAME}?timeout=30")
app.conf.update(
task_serializer="json",
accept_content=["json"],
result_backend=f"db+sqlite:///{RESULT_NAME}?timeout=30",
result_expires=3600,
task_reject_on_worker_lost=True,
task_acks_late=True,
worker_log_color=False,
broker_connection_retry_on_startup=True,
worker_hijack_root_logger=False,
worker_redirect_stdouts=False,
task_track_started=True,
include=["atk.tasks.celery_tasks"],
)
db_pool = DatabasePool(db_url=f"sqlite:///{ATK_NAME}")
with db_pool as db:
r = CaseResult()
db.add(r)
db.delete(r)
db.execute("PRAGMA journal_mode=WAL;")
with DatabasePool(db_url=f"sqlite:///{DB_NAME}") as db:
db.execute("PRAGMA journal_mode=WAL;")
with DatabasePool(db_url=f"sqlite:///{RESULT_NAME}") as db:
db.execute("PRAGMA journal_mode=WAL;")
chmod_output_path(DB_DIR)
def clear_db_all_table(db_name):
from sqlalchemy import create_engine, MetaData
engine = create_engine(f"sqlite:///{db_name}")
metadata = MetaData()
metadata.reflect(bind=engine)
metadata.drop_all(bind=engine)
metadata.create_all(bind=engine)
def clear_celery_db():
clear_db_all_table(DB_NAME)
clear_db_all_table(RESULT_NAME)
def get_base_time():
if not hasattr(app.conf, "GLOBAL_BASE_TIME"):
data_utc = datetime.utcnow()
timestamp = data_utc.timestamp()
base_time = datetime.utcfromtimestamp(timestamp)
app.conf.update(GLOBAL_BASE_TIME=base_time)
return app.conf.GLOBAL_BASE_TIME