From d404c71c11358dfd63b7c6dbaf9bf9f5b225266b Mon Sep 17 00:00:00 2001
From: Christoph Alt <christoph.alt@fau.de>
Date: Mon, 19 Sep 2022 16:59:25 +0200
Subject: [PATCH] added util to read the job infos

---
 cbutil/__init__.py     |  1 +
 cbutil/data_points.py  |  5 +++--
 cbutil/get_job_info.py | 44 ++++++++++++++++++++++++++++++++++++++++++
 cbutil/util.py         |  9 +++++++--
 setup.py               |  1 +
 5 files changed, 56 insertions(+), 4 deletions(-)
 create mode 100644 cbutil/get_job_info.py

diff --git a/cbutil/__init__.py b/cbutil/__init__.py
index b5641b2..b0700ed 100644
--- a/cbutil/__init__.py
+++ b/cbutil/__init__.py
@@ -3,3 +3,4 @@ from .processing_functions import mesa_pd_text
 from .postprocessing import *
 from .util import read_file_line_wise, time_conversion
 from .data_points import DataPoint, data_point_factory
+from .get_job_info import get_url_from_env, get_job_datapoints
diff --git a/cbutil/data_points.py b/cbutil/data_points.py
index bac11df..b85f504 100644
--- a/cbutil/data_points.py
+++ b/cbutil/data_points.py
@@ -1,6 +1,7 @@
-from dataclasses import dataclass, asdict
-from .util import time_conversion
 import logging
+from dataclasses import asdict, dataclass
+
+from .util import time_conversion
 
 logger = logging.getLogger(__file__)
 
diff --git a/cbutil/get_job_info.py b/cbutil/get_job_info.py
new file mode 100644
index 0000000..36e6a1c
--- /dev/null
+++ b/cbutil/get_job_info.py
@@ -0,0 +1,44 @@
+import logging
+import os
+import dotenv
+
+import requests
+
+from cbutil.data_points import DataPoint, data_point_factory
+
+logger = logging.getLogger(__file__)
+
+
+def load_from_env(env_path=".env"):
+    if os.path.exists(env_path):
+        dotenv.load_dotenv(env_path)
+    return os.environ["CI_API_V4_URL"], os.environ["CI_PROJECT_ID"], os.environ["CI_PIPELINE_ID"]
+
+
+def get_url_from_env() -> str:
+    base_url, project_id, pipeline_id = load_from_env()
+    logging.info(f'Loaded from env {base_url} {project_id}{pipeline_id}')
+    return get_api_url_pipelines(base_url, project_id, pipeline_id)
+
+
+def get_api_url_pipelines(base_url: str, project_id: int, pipeline_id: int):
+    return f"{base_url}/projects/{project_id}/pipelines/{pipeline_id}/jobs"
+
+
+def get_job_info(url: str):
+    jobs = requests.get(url)
+    for job in jobs.json():
+        yield job
+
+
+def create_job_datapoint(job: dict) -> DataPoint:
+    return data_point_factory(job,
+                              time_key='finished_at',
+                              measurement_name="JOB_INFOS",
+                              field_keys=['duration', 'queued_duration'],
+                              tag_keys=['id', 'name'])
+
+
+def get_job_datapoints(url):
+    for job in get_job_info(url):
+        yield create_job_datapoint(job)
diff --git a/cbutil/util.py b/cbutil/util.py
index da74b41..fa9ce1c 100644
--- a/cbutil/util.py
+++ b/cbutil/util.py
@@ -56,10 +56,15 @@ def file_time_to_sec(file_path) -> int:
     return int(os.path.getmtime(file_path))
 
 
-def time_conversion(time_stamp, *, pattern="%Y-%m-%d %H:%M:%S"):
+def time_conversion(time_stamp, *, pattern="%Y-%m-%d %H:%M:%S%z"):
     try:
         return int(time_stamp)
     except ValueError as e:
         logger.exception(e)
+    try:
+        dt = datetime.strptime(time_stamp, pattern)
+    except ValueError as e:
+        logger.exception(e)
+        dt = datetime.fromisoformat(time_stamp)
 
-    return int(datetime.strptime(time_stamp, pattern).timestamp())
+    return int(dt.timestamp())
diff --git a/setup.py b/setup.py
index 6340112..653668b 100644
--- a/setup.py
+++ b/setup.py
@@ -14,6 +14,7 @@ setup(name="cb-util",
           "influxdb",
           "gitpython",
           "grafanalib",
+          "requests",
       ],
       setup_requires=['pytest-runner'],
       tests_require=['pytest']
-- 
GitLab