argus-alm 0.12.0b1__py3-none-any.whl → 0.12.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,6 +6,7 @@ from flask import (
6
6
  )
7
7
 
8
8
  from argus.backend.error_handlers import handle_api_exception
9
+ from argus.backend.service.jenkins_service import JenkinsService
9
10
  from argus.backend.service.testrun import TestRunService
10
11
  from argus.backend.service.user import api_login_required
11
12
  from argus.backend.util.common import get_payload
@@ -285,3 +286,54 @@ def ignore_jobs():
285
286
  "affectedJobs": result
286
287
  }
287
288
  }
289
+
290
+
291
+ @bp.route("/jenkins/params", methods=["POST"])
292
+ @api_login_required
293
+ def get_jenkins_job_params():
294
+
295
+ payload = get_payload(request)
296
+ service = JenkinsService()
297
+
298
+ result = service.retrieve_job_parameters(build_id=payload["buildId"], build_number=payload["buildNumber"])
299
+
300
+ return {
301
+ "status": "ok",
302
+ "response": {
303
+ "parameters": result
304
+ }
305
+ }
306
+
307
+
308
+ @bp.route("/jenkins/build", methods=["POST"])
309
+ @api_login_required
310
+ def build_jenkins_job():
311
+
312
+ payload = get_payload(request)
313
+ service = JenkinsService()
314
+
315
+ result = service.build_job(build_id=payload["buildId"], params=payload["parameters"])
316
+
317
+ return {
318
+ "status": "ok",
319
+ "response": {
320
+ "queueItem": result
321
+ }
322
+ }
323
+
324
+
325
+ @bp.route("/jenkins/queue_info")
326
+ @api_login_required
327
+ def get_queue_info():
328
+ queue_item = request.args.get("queueItem")
329
+ if not queue_item:
330
+ raise Exception("No queueItem provided")
331
+ service = JenkinsService()
332
+ result = service.get_queue_info(int(queue_item))
333
+
334
+ return {
335
+ "status": "ok",
336
+ "response": {
337
+ "queueItem": result
338
+ }
339
+ }
@@ -38,6 +38,7 @@ class PluginModelBase(Model):
38
38
  heartbeat = columns.Integer(default=lambda: int(time()))
39
39
  end_time = columns.DateTime(default=lambda: datetime.utcfromtimestamp(0))
40
40
  build_job_url = columns.Text()
41
+ product_version = columns.Text(index=True)
41
42
 
42
43
  # Test Logs Collection
43
44
  logs = columns.List(value_type=columns.Tuple(columns.Text(), columns.Text()))
@@ -180,6 +181,9 @@ class PluginModelBase(Model):
180
181
  def submit_product_version(self, version: str):
181
182
  raise NotImplementedError()
182
183
 
184
+ def set_product_version(self, version: str):
185
+ self.product_version = version
186
+
183
187
  def submit_logs(self, logs: list[dict]):
184
188
  raise NotImplementedError()
185
189
 
@@ -38,6 +38,7 @@ class GenericRun(PluginModelBase):
38
38
 
39
39
  def submit_product_version(self, version: str):
40
40
  self.scylla_version = version
41
+ self.set_product_version(version)
41
42
 
42
43
  @classmethod
43
44
  def load_test_run(cls, run_id: UUID) -> 'GenericRun':
@@ -0,0 +1,63 @@
1
+ from typing import Any, TypedDict
2
+ import xml.etree.ElementTree as ET
3
+ import jenkins
4
+ import logging
5
+
6
+ from flask import current_app, g
7
+
8
+ LOGGER = logging.getLogger(__name__)
9
+
10
+
11
+ class Parameter(TypedDict):
12
+ _class: str
13
+ name: str
14
+ description: str
15
+ value: Any
16
+
17
+
18
+ class JenkinsService:
19
+ RESERVED_PARAMETER_NAME = "requested_by_user"
20
+
21
+ def __init__(self) -> None:
22
+ self._jenkins = jenkins.Jenkins(url=current_app.config["JENKINS_URL"],
23
+ username=current_app.config["JENKINS_USER"],
24
+ password=current_app.config["JENKINS_API_TOKEN"])
25
+
26
+ def retrieve_job_parameters(self, build_id: str, build_number: int) -> list[Parameter]:
27
+ job_info = self._jenkins.get_build_info(name=build_id, number=build_number)
28
+ raw_config = self._jenkins.get_job_config(name=build_id)
29
+ config = ET.fromstring(raw_config)
30
+ parameter_defs = config.find("*//parameterDefinitions")
31
+ if parameter_defs:
32
+ descriptions = {
33
+ define.findtext("name"): f"{define.findtext('description', '')}" + f" (default: <span class=\"fw-bold\">{define.findtext('defaultValue')}</span>)" if define.findtext('defaultValue') else ""
34
+ for define in parameter_defs.iterfind("hudson.model.StringParameterDefinition")
35
+ }
36
+ else:
37
+ descriptions = {}
38
+ params = next(a for a in job_info["actions"] if a.get("_class", "#NONE") == "hudson.model.ParametersAction")["parameters"]
39
+ params = [param for param in params if param["name"] != self.RESERVED_PARAMETER_NAME]
40
+ for idx, param in enumerate(params):
41
+ params[idx]["description"] = descriptions.get(param["name"], "")
42
+
43
+ return params
44
+
45
+ def build_job(self, build_id: str, params: dict, user_override: str = None):
46
+ queue_number = self._jenkins.build_job(build_id, {
47
+ **params,
48
+ self.RESERVED_PARAMETER_NAME: g.user.username if not user_override else user_override
49
+ })
50
+ return queue_number
51
+
52
+ def get_queue_info(self, queue_item: int):
53
+ build_info = self._jenkins.get_queue_item(queue_item)
54
+ LOGGER.info("%s", build_info)
55
+ executable = build_info.get("executable")
56
+ if executable:
57
+ return executable
58
+ else:
59
+ return {
60
+ "why": build_info["why"],
61
+ "inQueueSince": build_info["inQueueSince"],
62
+ "taskUrl": build_info["task"]["url"],
63
+ }
@@ -33,6 +33,7 @@ class TestRunStatRow(TypedDict):
33
33
  class ComparableTestStatus:
34
34
  PRIORITY_MAP = {
35
35
  TestStatus.FAILED: 10,
36
+ TestStatus.TEST_ERROR: 10,
36
37
  TestStatus.ABORTED: 9,
37
38
  TestStatus.RUNNING: 8,
38
39
  TestStatus.CREATED: 7,
@@ -110,8 +110,8 @@ class ArgusDriverMatrixClient(ArgusClient):
110
110
  raw_cases.append({
111
111
  "name": case.attrib["name"],
112
112
  "status": status,
113
- "time": float(case.attrib["time"]),
114
- "classname": case.attrib["classname"],
113
+ "time": float(case.attrib.get("time", 0.0)),
114
+ "classname": case.attrib.get("classname", ""),
115
115
  "message": message,
116
116
  })
117
117
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: argus-alm
3
- Version: 0.12.0b1
3
+ Version: 0.12.2
4
4
  Summary: Argus
5
5
  Home-page: https://github.com/scylladb/argus
6
6
  License: Apache-2.0
@@ -13,21 +13,21 @@ argus/backend/controller/notification_api.py,sha256=wz7V4nE6Mxclpq78P8gNnCyeQ7xA
13
13
  argus/backend/controller/notifications.py,sha256=zMSJln72BGU6Q_nQvJesMnuvJ57Ucbov4M2ZI-37Bxo,290
14
14
  argus/backend/controller/team.py,sha256=G6LdIBaYgfG0Qr4RhNQ53MZVdh4wcuotsIIpFwhTJ3w,3101
15
15
  argus/backend/controller/team_ui.py,sha256=B7N1_Kzl6Rac8BV3FbKj55pGAS_dht47rYhAi94PC8A,589
16
- argus/backend/controller/testrun_api.py,sha256=9XUPnnZb942V0Y_cY0ESKVugWui7qrrO1ec6WJW2y2U,7872
16
+ argus/backend/controller/testrun_api.py,sha256=JhSzstTWkcYPiMKQikeWaYjTPSlvNyHHRany11TQUGo,9070
17
17
  argus/backend/db.py,sha256=bBiraYD05Qex28yZHjSP1bRlcMsc6oTYGt792zXmaHo,4101
18
18
  argus/backend/error_handlers.py,sha256=IEjz7Vzfldv1PTOeHrpRWmRsgBrHtAW0PXHUJZDovAE,480
19
19
  argus/backend/events/event_processors.py,sha256=bsmBayiXvlGn3aqiT2z9WgwnVBRtn2cRqkgn4pLodck,1291
20
20
  argus/backend/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  argus/backend/models/web.py,sha256=dUWQQaw5TivSCOuGQqAxIH9yVraGXX7sayNBloIS3n8,12206
22
22
  argus/backend/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- argus/backend/plugins/core.py,sha256=KPUCDDp4uNyJ2c4SeNIdEkmEHbsEXOr-Qt-rmhtmrNw,7468
23
+ argus/backend/plugins/core.py,sha256=Tit-JlybrFCSsqoKjp_BFmtaxRk_AiocGOKqMfBovj4,7604
24
24
  argus/backend/plugins/driver_matrix_tests/controller.py,sha256=9Q6QCripzM528SGsQnYupM6k7HW7hUzkNyjJFiXXfEw,739
25
25
  argus/backend/plugins/driver_matrix_tests/model.py,sha256=Ay_Q6EAF4CwAW0fejdia4zyKcZOc943eZWT5nWIefYM,6822
26
26
  argus/backend/plugins/driver_matrix_tests/plugin.py,sha256=72ESU7s8C6ovVMfJTlYwtaokdvRp_HJF1_czm1UMhKg,745
27
27
  argus/backend/plugins/driver_matrix_tests/raw_types.py,sha256=A108HCnv5q0RHfNRhUJrTpRy3fG7sPxr9Sk4gfsbooU,600
28
28
  argus/backend/plugins/driver_matrix_tests/service.py,sha256=dxb8VGTJLIyVqVrZ4RtzCXgnmS2qg2RAGhcp_SARt9I,1737
29
29
  argus/backend/plugins/driver_matrix_tests/udt.py,sha256=6lydzF3AQHm3GR5bKEDu1xLPYsLaBL3o-wu9NpabbqA,1134
30
- argus/backend/plugins/generic/model.py,sha256=6K8IEc65EpPYj9nL3ETn25mogOx3xfwq4-ZsuMSVkns,3054
30
+ argus/backend/plugins/generic/model.py,sha256=y5-eJRxMm8L2zDRVXcG-ZK7mrslZ5rGPTv-ihXFt9Yc,3096
31
31
  argus/backend/plugins/generic/plugin.py,sha256=5URbQVUCizrk-KZqb6I0P_8nLUekjYh-Js7ZLKVoBAA,407
32
32
  argus/backend/plugins/generic/types.py,sha256=jlZUcQ7r153ziyl3ZJmix7AzL2G1aX9N_z-4Kw9trWc,267
33
33
  argus/backend/plugins/loader.py,sha256=0MmGNBVle51tIyH7lA7Lz2L8PcGKGub9vyFuwnLm840,1320
@@ -46,9 +46,10 @@ argus/backend/service/argus_service.py,sha256=o415BalaQ-FP5CDSjeypiXJ4ejaVVXqive
46
46
  argus/backend/service/build_system_monitor.py,sha256=_Bxugk4CCh2z-I-i74QMPe7M8j0dmBMDri2dd3WGVew,7328
47
47
  argus/backend/service/client_service.py,sha256=CS5esppd9s-SgUYE-HVLkfz-MrN8zxPouf9e4VlPV_M,2326
48
48
  argus/backend/service/event_service.py,sha256=iYeqxN2QCYTjYB1WPPv4BEFLXG0Oz3TvskkaK4v9pVY,654
49
+ argus/backend/service/jenkins_service.py,sha256=BnUvVi1iUvvD99lnscs-kxPGA9LExxNUsgwfO-46tq8,2518
49
50
  argus/backend/service/notification_manager.py,sha256=h00Ej_-hH9H7pq0wah_1TH8dnpPyPNsgVJNO1rwJi7o,7011
50
51
  argus/backend/service/release_manager.py,sha256=DymV5OI53ClRdc4p7jlCGT6xPqrjIxHjs8EDiyWffqQ,7362
51
- argus/backend/service/stats.py,sha256=BDzMb-DKUMyoJ7KAMHaphwTLRQywSMWV5a4hTOFDGLg,15132
52
+ argus/backend/service/stats.py,sha256=4WEtd5gdzT-dzOjD1NUHdBfVurxnwXcawjseu-kqxHw,15167
52
53
  argus/backend/service/team_manager_service.py,sha256=zY5dvy3ffvQbJuXBvlWKE5dS5LQ3ss6tkFE-cwFZsdw,3010
53
54
  argus/backend/service/testrun.py,sha256=ggjTcWjyvsPXSSv_v80rrp3bHaqCOjcxYEewXrW9AXg,19706
54
55
  argus/backend/service/user.py,sha256=N3t43rgKMnSsPXU5R9bigEEGbPjYrc6MsJtof3z7kDE,9027
@@ -62,7 +63,7 @@ argus/backend/util/module_loaders.py,sha256=AcIlX-VRmUQ2THFKT8DLefLSE62Eub2hCxIo
62
63
  argus/backend/util/send_email.py,sha256=Bb2Hta7WlBCvDKga0_WPFWgxWJEfKpectOGypgf9xzo,3217
63
64
  argus/client/__init__.py,sha256=bO9_j5_jK5kvTHR46KEZ0Y-p0li7CBW8QSd-K5Ez4vA,42
64
65
  argus/client/base.py,sha256=-R-BINTolY06lUQLOLGlsWzza4fBdtLBW-4V3NT64vg,6755
65
- argus/client/driver_matrix_tests/client.py,sha256=3LIS2hwZ3wVKtQDEMiQGBsIoIcpKi29chheF_yRM704,7800
66
+ argus/client/driver_matrix_tests/client.py,sha256=ekuTkEZbcVqhg6DAC6PvGuC9bXuu4DSOjk96vcLzmuQ,7817
66
67
  argus/client/generic/cli.py,sha256=IJkgEZ5VOAeqp5SlLM13Y5m8e34Cqnyz8WkfeKoN7so,2208
67
68
  argus/client/generic/client.py,sha256=l4PDjDy65Mm2OI9ZLSnyd8_2i4Ei1Pp9yRt3bRX8s2Y,1114
68
69
  argus/client/sct/client.py,sha256=0xRIeYtjTFGfDS03klSTFie3uxrQqB51xkeOW223MiQ,10204
@@ -76,8 +77,8 @@ argus/db/db_types.py,sha256=iLbmrUaDzrBw0kDCnvW0FSZ9-kNc3uQY-fsbIPymV4E,3612
76
77
  argus/db/interface.py,sha256=HroyA1Yijz5cXLdYbxorHCEu0GH9VeMMqB36IHTlcew,17146
77
78
  argus/db/testrun.py,sha256=0YG7FIH5FLQeNlYULxC6rhhyru2rziSMe3qKtYzTBnc,26014
78
79
  argus/db/utils.py,sha256=YAWsuLjUScSgKgdaL5aF4Sgr13gqH29Mb5cLctX4V_w,337
79
- argus_alm-0.12.0b1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
80
- argus_alm-0.12.0b1.dist-info/METADATA,sha256=EjbPFZDp6fqyReBEv7ThWlQcmWcLzFdkFFc5ZkE5MyE,6864
81
- argus_alm-0.12.0b1.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
82
- argus_alm-0.12.0b1.dist-info/entry_points.txt,sha256=zEqrAK95P8AAhKbwO4lgrQzKBWqCzHH9zlUPCaCVHoQ,69
83
- argus_alm-0.12.0b1.dist-info/RECORD,,
80
+ argus_alm-0.12.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
81
+ argus_alm-0.12.2.dist-info/METADATA,sha256=RCkJF9S0qfgVoZYNzby251ebAl13rN_5Mzk64Ng_XaQ,6862
82
+ argus_alm-0.12.2.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
83
+ argus_alm-0.12.2.dist-info/entry_points.txt,sha256=zEqrAK95P8AAhKbwO4lgrQzKBWqCzHH9zlUPCaCVHoQ,69
84
+ argus_alm-0.12.2.dist-info/RECORD,,