Skip to content
Snippets Groups Projects
Commit aede9bb1 authored by Ryunosuke O'Neil's avatar Ryunosuke O'Neil :globe_with_meridians:
Browse files

Attempts to serialise the SQLAlchemy models into json suitable for API calls

parent fa32dec5
No related tags found
1 merge request!77WIP: Attempts to convert the SQLAlchemy models into json suitable for API routes
Pipeline #2819769 failed
...@@ -236,6 +236,40 @@ class Job(Base): ...@@ -236,6 +236,40 @@ class Job(Base):
def keep_output(self): def keep_output(self):
return not self.children return not self.children
@property
def serialise(self):
obj_dict = {
col: getattr(self, col)
for col in [
"id",
"name",
"application_name",
"application_version",
"input_data",
"output",
"options",
"n_test_events",
"inform",
"turbo",
"root_in_tes",
"wg",
"automatically_configure",
"simulation",
"luminosity",
"data_type",
"input_type",
"dddb_tag",
"conddb_tag",
"completion_percentage",
"parent_job_id",
"production_id",
"step_id",
]
}
obj_dict["priority"] = self.priority.name
obj_dict["latest_test"] = self.tests[-1].serialise
return obj_dict
class InputDataset(ABC): class InputDataset(ABC):
known_keys = set() known_keys = set()
......
...@@ -51,3 +51,10 @@ class Pipeline(Base): ...@@ -51,3 +51,10 @@ class Pipeline(Base):
@property @property
def job(self): def job(self):
return GitLabJob.loads(self.gitlab_job_dump) return GitLabJob.loads(self.gitlab_job_dump)
@property
def serialise(self):
return {
"gitlab_job_id": self.gitlab_job_id,
"productions": [p.serialise for p in self.productions],
}
...@@ -198,6 +198,18 @@ class Production(Base): ...@@ -198,6 +198,18 @@ class Production(Base):
return job return job
raise KeyError(f"Failed to find job in {self.name} with name {name}") raise KeyError(f"Failed to find job in {self.name} with name {name}")
@property
def serialise(self):
return {
"id": self.id,
"name": self.name,
"comment": self.comment,
"yaml": self.yaml,
"rendered_yaml": self.rendered_yaml,
"pipeline_id": self.pipeline_id,
"jobs": [j.serialise for j in self.jobs],
}
@property @property
def svg(self): def svg(self):
try: try:
......
...@@ -172,3 +172,21 @@ class Test(Base): ...@@ -172,3 +172,21 @@ class Test(Base):
@property @property
def finished(self): def finished(self):
return self.status in [TestStatusEnum.SUCCESS, TestStatusEnum.FAILED] return self.status in [TestStatusEnum.SUCCESS, TestStatusEnum.FAILED]
@property
def serialise(self):
obj_dict = {
col: getattr(self, col)
for col in [
"id",
"events_requested"
"events_processed"
"run_time"
"cpu_norm"
"n_log_warning"
"n_log_error"
"n_log_fatal",
]
}
obj_dict["status"] = self.status.name
return obj_dict
...@@ -21,7 +21,7 @@ from LbAPCommon.validators import explain_log ...@@ -21,7 +21,7 @@ from LbAPCommon.validators import explain_log
from LbAnalysisProductions import templates from LbAnalysisProductions import templates
from LbAnalysisProductions.celery import bk_query_info, lookup_lfns from LbAnalysisProductions.celery import bk_query_info, lookup_lfns
from LbAnalysisProductions.models import Pipeline, Production from LbAnalysisProductions.models import Pipeline, Production, Job
from LbAnalysisProductions.settings import settings from LbAnalysisProductions.settings import settings
from . import utils from . import utils
...@@ -53,7 +53,7 @@ def index(): ...@@ -53,7 +53,7 @@ def index():
@bp.route("/api/pipelines") @bp.route("/api/pipelines")
def api_index(): def api_pipeline_index():
"""Returns JSON containing the latest pipelines "pipeline_id: prod1,prod2".""" """Returns JSON containing the latest pipelines "pipeline_id: prod1,prod2"."""
results = ( results = (
get_db() get_db()
...@@ -70,6 +70,42 @@ def api_index(): ...@@ -70,6 +70,42 @@ def api_index():
return jsonify(pipelines) return jsonify(pipelines)
@bp.route("/api/pipelines/<int:pipeline_id>")
def api_pipeline_summary(pipeline_id):
"""Returns JSON containing the pipeline with the specified ID"""
pipeline = get_db().query(Pipeline).get(pipeline_id)
if pipeline is None:
json_abort(404, "Pipeline not found")
return jsonify(pipeline.serialise)
@bp.route("/api/pipelines/<int:pipeline_id>/<production_name>/<job_name>")
def api_pipeline_job(pipeline_id, production_name, job_name):
"""
Returns JSON containing the job with the specified pipeline, job name
(and associated latest test attempt)
"""
production = (
get_db()
.query(Production)
.filter_by(pipeline_id=pipeline_id, name=production_name)
.first()
)
if production is None:
json_abort(404, "Production not found")
job = (
get_db()
.query(Job)
.filter_by(production_id=production.id, name=job_name)
.first()
)
if job is None:
json_abort(404, "Job not found")
return jsonify(job.serialise)
@bp.route("/dynamic/<int:pipeline_id>/<path:production_name>/raw.yaml") @bp.route("/dynamic/<int:pipeline_id>/<path:production_name>/raw.yaml")
def dynamic_raw_yaml(pipeline_id, production_name): def dynamic_raw_yaml(pipeline_id, production_name):
production = ( production = (
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment