argus-alm 0.12.5__tar.gz → 0.12.8__tar.gz

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.
Files changed (94) hide show
  1. {argus_alm-0.12.5 → argus_alm-0.12.8}/PKG-INFO +1 -1
  2. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/controller/admin_api.py +67 -2
  3. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/controller/api.py +18 -1
  4. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/controller/auth.py +15 -13
  5. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/controller/client_api.py +10 -5
  6. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/controller/main.py +1 -0
  7. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/controller/testrun_api.py +2 -1
  8. argus_alm-0.12.8/argus/backend/models/result.py +75 -0
  9. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/core.py +3 -3
  10. argus_alm-0.12.8/argus/backend/plugins/driver_matrix_tests/controller.py +63 -0
  11. argus_alm-0.12.8/argus/backend/plugins/driver_matrix_tests/model.py +421 -0
  12. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/driver_matrix_tests/raw_types.py +27 -0
  13. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/driver_matrix_tests/service.py +18 -0
  14. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/driver_matrix_tests/udt.py +14 -13
  15. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/sct/testrun.py +9 -3
  16. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/service/argus_service.py +15 -5
  17. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/service/build_system_monitor.py +3 -3
  18. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/service/client_service.py +22 -4
  19. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/service/jenkins_service.py +3 -1
  20. argus_alm-0.12.8/argus/backend/service/results_service.py +201 -0
  21. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/service/testrun.py +2 -19
  22. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/service/user.py +61 -4
  23. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/service/views.py +3 -3
  24. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/util/config.py +3 -1
  25. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/util/encoders.py +17 -0
  26. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/client/base.py +18 -1
  27. argus_alm-0.12.8/argus/client/driver_matrix_tests/cli.py +110 -0
  28. argus_alm-0.12.8/argus/client/driver_matrix_tests/client.py +79 -0
  29. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/client/generic_result.py +10 -5
  30. {argus_alm-0.12.5 → argus_alm-0.12.8}/pyproject.toml +10 -9
  31. argus_alm-0.12.5/argus/backend/models/result.py +0 -41
  32. argus_alm-0.12.5/argus/backend/plugins/driver_matrix_tests/controller.py +0 -24
  33. argus_alm-0.12.5/argus/backend/plugins/driver_matrix_tests/model.py +0 -175
  34. argus_alm-0.12.5/argus/client/driver_matrix_tests/client.py +0 -216
  35. {argus_alm-0.12.5 → argus_alm-0.12.8}/LICENSE +0 -0
  36. {argus_alm-0.12.5 → argus_alm-0.12.8}/README.md +0 -0
  37. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/__init__.py +0 -0
  38. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/.gitkeep +0 -0
  39. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/__init__.py +0 -0
  40. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/cli.py +0 -0
  41. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/controller/__init__.py +0 -0
  42. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/controller/admin.py +0 -0
  43. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/controller/notification_api.py +0 -0
  44. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/controller/notifications.py +0 -0
  45. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/controller/team.py +0 -0
  46. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/controller/team_ui.py +0 -0
  47. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/controller/view_api.py +0 -0
  48. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/db.py +0 -0
  49. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/error_handlers.py +0 -0
  50. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/events/event_processors.py +0 -0
  51. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/models/__init__.py +0 -0
  52. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/models/web.py +0 -0
  53. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/__init__.py +0 -0
  54. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/driver_matrix_tests/plugin.py +0 -0
  55. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/generic/model.py +0 -0
  56. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/generic/plugin.py +0 -0
  57. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/generic/types.py +0 -0
  58. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/loader.py +0 -0
  59. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/sct/controller.py +0 -0
  60. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/sct/plugin.py +0 -0
  61. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/sct/resource_setup.py +0 -0
  62. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/sct/service.py +0 -0
  63. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/sct/types.py +0 -0
  64. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/sct/udt.py +0 -0
  65. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/sirenada/model.py +0 -0
  66. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/sirenada/plugin.py +0 -0
  67. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/plugins/sirenada/types.py +0 -0
  68. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/service/admin.py +0 -0
  69. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/service/event_service.py +0 -0
  70. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/service/notification_manager.py +0 -0
  71. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/service/release_manager.py +0 -0
  72. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/service/stats.py +0 -0
  73. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/service/team_manager_service.py +0 -0
  74. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/template_filters.py +0 -0
  75. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/util/common.py +0 -0
  76. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/util/enums.py +0 -0
  77. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/util/logsetup.py +0 -0
  78. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/util/module_loaders.py +0 -0
  79. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/backend/util/send_email.py +0 -0
  80. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/client/__init__.py +0 -0
  81. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/client/generic/cli.py +0 -0
  82. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/client/generic/client.py +0 -0
  83. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/client/generic_result_old.py +0 -0
  84. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/client/sct/client.py +0 -0
  85. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/client/sct/types.py +0 -0
  86. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/client/sirenada/client.py +0 -0
  87. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/db/.gitkeep +0 -0
  88. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/db/argus_json.py +0 -0
  89. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/db/cloud_types.py +0 -0
  90. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/db/config.py +0 -0
  91. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/db/db_types.py +0 -0
  92. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/db/interface.py +0 -0
  93. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/db/testrun.py +0 -0
  94. {argus_alm-0.12.5 → argus_alm-0.12.8}/argus/db/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: argus-alm
3
- Version: 0.12.5
3
+ Version: 0.12.8
4
4
  Summary: Argus
5
5
  Home-page: https://github.com/scylladb/argus
6
6
  License: Apache-2.0
@@ -7,8 +7,8 @@ from flask import (
7
7
  )
8
8
  from argus.backend.error_handlers import handle_api_exception
9
9
  from argus.backend.service.release_manager import ReleaseEditPayload, ReleaseManagerService
10
- from argus.backend.service.user import api_login_required, check_roles
11
- from argus.backend.models.web import UserRoles
10
+ from argus.backend.service.user import UserService, api_login_required, check_roles
11
+ from argus.backend.models.web import User, UserRoles
12
12
 
13
13
  bp = Blueprint('admin_api', __name__, url_prefix='/api/v1')
14
14
  LOGGER = logging.getLogger(__name__)
@@ -287,3 +287,68 @@ def quick_toggle_group_enabled():
287
287
  "status": "ok",
288
288
  "response": res
289
289
  }
290
+
291
+
292
+ @bp.route("/users", methods=["GET"])
293
+ @check_roles(UserRoles.Admin)
294
+ @api_login_required
295
+ def user_info():
296
+ result = UserService().get_users_privileged()
297
+
298
+ return {
299
+ "status": "ok",
300
+ "response": result
301
+ }
302
+
303
+
304
+ @bp.route("/user/<string:user_id>/email/set", methods=["POST"])
305
+ @check_roles(UserRoles.Admin)
306
+ @api_login_required
307
+ def user_change_email(user_id: str):
308
+ payload = get_payload(request)
309
+
310
+ user = User.get(id=user_id)
311
+ result = UserService().update_email(user=user, new_email=payload["newEmail"])
312
+
313
+ return {
314
+ "status": "ok",
315
+ "response": result
316
+ }
317
+
318
+
319
+ @bp.route("/user/<string:user_id>/delete", methods=["POST"])
320
+ @check_roles(UserRoles.Admin)
321
+ @api_login_required
322
+ def user_delete(user_id: str):
323
+ result = UserService().delete_user(user_id=user_id)
324
+
325
+ return {
326
+ "status": "ok",
327
+ "response": result
328
+ }
329
+
330
+
331
+ @bp.route("/user/<string:user_id>/password/set", methods=["POST"])
332
+ @check_roles(UserRoles.Admin)
333
+ @api_login_required
334
+ def user_change_password(user_id: str):
335
+ payload = get_payload(request)
336
+
337
+ user = User.get(id=user_id)
338
+ result = UserService().update_password(user=user, old_password="", new_password=payload["newPassword"], force=True)
339
+
340
+ return {
341
+ "status": "ok",
342
+ "response": result
343
+ }
344
+
345
+ @bp.route("/user/<string:user_id>/admin/toggle", methods=["POST"])
346
+ @check_roles(UserRoles.Admin)
347
+ @api_login_required
348
+ def user_toggle_admin(user_id: str):
349
+ result = UserService().toggle_admin(user_id=user_id)
350
+
351
+ return {
352
+ "status": "ok",
353
+ "response": result
354
+ }
@@ -4,7 +4,7 @@ import requests
4
4
  from flask import (
5
5
  Blueprint,
6
6
  g,
7
- request
7
+ request, Response
8
8
  )
9
9
  from flask.json import jsonify
10
10
  from argus.backend.error_handlers import handle_api_exception
@@ -14,6 +14,7 @@ from argus.backend.controller.testrun_api import bp as testrun_bp
14
14
  from argus.backend.controller.team import bp as team_bp
15
15
  from argus.backend.controller.view_api import bp as view_bp
16
16
  from argus.backend.service.argus_service import ArgusService, ScheduleUpdateRequest
17
+ from argus.backend.service.results_service import ResultsService
17
18
  from argus.backend.service.user import UserService, api_login_required
18
19
  from argus.backend.service.stats import ReleaseStatsCollector
19
20
  from argus.backend.models.web import ArgusRelease, ArgusGroup, ArgusTest, User, UserOauthToken
@@ -381,6 +382,22 @@ def test_info():
381
382
  "response": info
382
383
  }
383
384
 
385
+ @bp.route("/test-results", methods=["GET", "HEAD"])
386
+ @api_login_required
387
+ def test_results():
388
+ test_id = request.args.get("testId")
389
+ if not test_id:
390
+ raise Exception("No testId provided")
391
+ service = ResultsService()
392
+ if request.method == 'HEAD':
393
+ exists = service.is_results_exist(test_id=UUID(test_id))
394
+ return Response(status=200 if exists else 404)
395
+ graphs, ticks = service.get_test_graphs(test_id=UUID(test_id))
396
+
397
+ return {
398
+ "status": "ok",
399
+ "response": {"graphs": graphs, "ticks": ticks}
400
+ }
384
401
 
385
402
  @bp.route("/test_run/comment/get", methods=["GET"]) # TODO: remove
386
403
  @api_login_required
@@ -5,7 +5,7 @@ from flask import (
5
5
  )
6
6
  from werkzeug.security import check_password_hash
7
7
  from argus.backend.models.web import User
8
- from argus.backend.service.user import UserService, load_logged_in_user, login_required
8
+ from argus.backend.service.user import UserService, UserServiceException, load_logged_in_user, login_required
9
9
 
10
10
  bp = Blueprint('auth', __name__, url_prefix='/auth')
11
11
 
@@ -21,24 +21,26 @@ def login():
21
21
  session["csrf_token"] = token
22
22
 
23
23
  if request.method == 'POST':
24
- username = request.form["username"]
25
- password = request.form["password"]
26
- error = None
27
24
  try:
28
- user = User.get(username=username)
29
- except User.DoesNotExist:
30
- user = None
25
+ if "password" not in current_app.config.get("LOGIN_METHODS", []):
26
+ raise UserServiceException("Password Login is disabled")
27
+ username = request.form["username"]
28
+ password = request.form["password"]
31
29
 
32
- if not user:
33
- error = "User not found"
34
- elif not check_password_hash(user.password, password):
35
- error = "Incorrect Password"
30
+ try:
31
+ user: User = User.get(username=username)
32
+ except User.DoesNotExist:
33
+ raise UserServiceException("User not found")
34
+
35
+ if not check_password_hash(user.password, password):
36
+ raise UserServiceException("Incorrect Password")
36
37
 
37
- if not error:
38
38
  session.clear()
39
39
  session["user_id"] = str(user.id)
40
40
  session["csrf_token"] = token
41
- flash(error, category="error")
41
+ except UserServiceException as exc:
42
+ flash(next(iter(exc.args), "No message"), category="error")
43
+
42
44
  return redirect(url_for('main.home'))
43
45
 
44
46
  return render_template('auth/login.html.j2',
@@ -23,6 +23,15 @@ def submit_run(run_type: str):
23
23
  "response": result
24
24
  }
25
25
 
26
+ @bp.route("/testrun/<string:run_type>/<string:run_id>/get", methods=["GET"])
27
+ @api_login_required
28
+ def get_run(run_type: str, run_id: str):
29
+ result = ClientService().get_run(run_type=run_type, run_id=run_id)
30
+ return {
31
+ "status": "ok",
32
+ "response": result
33
+ }
34
+
26
35
 
27
36
  @bp.route("/testrun/<string:run_type>/<string:run_id>/heartbeat", methods=["POST"])
28
37
  @api_login_required
@@ -96,8 +105,4 @@ def run_finalize(run_type: str, run_id: str):
96
105
  @api_login_required
97
106
  def submit_results(run_type: str, run_id: str):
98
107
  payload = get_payload(request)
99
- result = ClientService().submit_results(run_type=run_type, run_id=run_id, results=payload)
100
- return {
101
- "status": "ok",
102
- "response": result
103
- }
108
+ return ClientService().submit_results(run_type=run_type, run_id=run_id, results=payload)
@@ -152,6 +152,7 @@ def profile_oauth_github_callback():
152
152
  try:
153
153
  first_run_info = service.github_callback(req_code)
154
154
  except Exception as exc: # pylint: disable=broad-except
155
+ LOGGER.error("An error occured in callback", exc_info=True)
155
156
  flash(message=exc.args[0], category="error")
156
157
  return redirect(url_for("main.error", type=403))
157
158
  if first_run_info:
@@ -8,6 +8,7 @@ from flask import (
8
8
  from argus.backend.error_handlers import handle_api_exception
9
9
  from argus.backend.models.web import ArgusTest
10
10
  from argus.backend.service.jenkins_service import JenkinsService
11
+ from argus.backend.service.results_service import ResultsService
11
12
  from argus.backend.service.testrun import TestRunService
12
13
  from argus.backend.service.user import api_login_required
13
14
  from argus.backend.util.common import get_payload
@@ -67,7 +68,7 @@ def test_run_activity(run_id: str):
67
68
  @bp.route("/run/<string:test_id>/<string:run_id>/fetch_results", methods=["GET"])
68
69
  @api_login_required
69
70
  def fetch_results(test_id: str, run_id: str):
70
- tables = TestRunService().fetch_results(test_id=UUID(test_id), run_id=UUID(run_id))
71
+ tables = ResultsService().get_run_results(test_id=UUID(test_id), run_id=UUID(run_id))
71
72
  return {
72
73
  "status": "ok",
73
74
  "tables": tables
@@ -0,0 +1,75 @@
1
+ from cassandra.cqlengine import columns
2
+ from cassandra.cqlengine.models import Model
3
+ from cassandra.cqlengine.usertype import UserType
4
+
5
+ class BestResult(UserType):
6
+ date = columns.DateTime()
7
+ value = columns.Double()
8
+ run_id = columns.UUID()
9
+
10
+ class ValidationRules(UserType):
11
+ higher_is_better = columns.Boolean()
12
+ margin_percent = columns.Double()
13
+ margin_value = columns.Double()
14
+ limit = columns.Double()
15
+
16
+ class ColumnMetadata(UserType):
17
+ name = columns.Ascii()
18
+ unit = columns.Text()
19
+ type = columns.Ascii()
20
+
21
+
22
+ class ArgusGenericResultMetadata(Model):
23
+ __table_name__ = "generic_result_metadata_v1"
24
+ test_id = columns.UUID(partition_key=True)
25
+ name = columns.Text(required=True, primary_key=True)
26
+ description = columns.Text()
27
+ columns_meta = columns.List(value_type=columns.UserDefinedType(ColumnMetadata))
28
+ validation_rules = columns.Map(key_type=columns.Ascii(), value_type=columns.List(value_type=columns.UserDefinedType(ValidationRules)))
29
+ best_results = columns.Map(key_type=columns.Ascii(), value_type=columns.UserDefinedType(BestResult))
30
+ rows_meta = columns.List(value_type=columns.Ascii())
31
+
32
+ def __init__(self, **kwargs):
33
+ kwargs["columns_meta"] = [ColumnMetadata(**col) for col in kwargs.pop('columns_meta', [])]
34
+ kwargs["best_results"] = {k: [BestResult(**z) for z in v] for k, v in kwargs.pop('best_results', {}).items()}
35
+ kwargs["validation_rules"] = {k: ValidationRules(**v) for k, v in kwargs.pop('validation_rules', {}).items()}
36
+ super().__init__(**kwargs)
37
+
38
+ def update_if_changed(self, new_data: dict) -> None:
39
+ """
40
+ Updates table metadata if changed column/description or new rows were added.
41
+ See that rows can only be added, not removed once was sent.
42
+ Columns may be removed, but data in results table persists.
43
+ """
44
+ updated = False
45
+ for field, value in new_data.items():
46
+ if field == "columns_meta":
47
+ value = [ColumnMetadata(**col) for col in value]
48
+ elif field == "rows_meta":
49
+ added_rows = []
50
+ for row in value:
51
+ if row not in self.rows_meta:
52
+ added_rows.append(row)
53
+ value = self.rows_meta + added_rows
54
+ elif field == "best_results":
55
+ value = {k: [BestResult(**z) for z in v] for k, v in value.items()}
56
+ elif field == "validation_rules":
57
+ value = {k: ValidationRules(**v) for k, v in value.items()}
58
+ if getattr(self, field) != value:
59
+ setattr(self, field, value)
60
+ updated = True
61
+
62
+ if updated:
63
+ self.save()
64
+
65
+ class ArgusGenericResultData(Model):
66
+ __table_name__ = "generic_result_data_v1"
67
+ test_id = columns.UUID(partition_key=True)
68
+ name = columns.Text(partition_key=True)
69
+ run_id = columns.UUID(primary_key=True)
70
+ column = columns.Ascii(primary_key=True, index=True)
71
+ row = columns.Ascii(primary_key=True, index=True)
72
+ sut_timestamp = columns.DateTime() # for sorting
73
+ value = columns.Double()
74
+ value_text = columns.Text()
75
+ status = columns.Ascii()
@@ -30,7 +30,7 @@ class PluginModelBase(Model):
30
30
  _plugin_name = "unknown"
31
31
  # Metadata
32
32
  build_id = columns.Text(required=True, partition_key=True)
33
- start_time = columns.DateTime(required=True, primary_key=True, clustering_order="DESC", default=datetime.now, custom_index=True)
33
+ start_time = columns.DateTime(required=True, primary_key=True, clustering_order="DESC", default=datetime.utcnow, custom_index=True)
34
34
  id = columns.UUID(index=True, required=True)
35
35
  release_id = columns.UUID(index=True)
36
36
  group_id = columns.UUID(index=True)
@@ -110,11 +110,11 @@ class PluginModelBase(Model):
110
110
  return assignees_uuids[0] if len(assignees_uuids) > 0 else None
111
111
 
112
112
  @classmethod
113
- def get_jobs_assigned_to_user(cls, user: User):
113
+ def get_jobs_assigned_to_user(cls, user_id: str | UUID):
114
114
  cluster = ScyllaCluster.get()
115
115
  query = cluster.prepare("SELECT build_id, start_time, release_id, group_id, assignee, "
116
116
  f"test_id, id, status, investigation_status, build_job_url, scylla_version FROM {cls.table_name()} WHERE assignee = ?")
117
- rows = cluster.session.execute(query=query, parameters=(user.id,))
117
+ rows = cluster.session.execute(query=query, parameters=(user_id,))
118
118
 
119
119
  return list(rows)
120
120
 
@@ -0,0 +1,63 @@
1
+ from flask import Blueprint, request
2
+
3
+ from argus.backend.error_handlers import handle_api_exception
4
+ from argus.backend.plugins.driver_matrix_tests.raw_types import DriverMatrixSubmitEnvRequest, DriverMatrixSubmitFailureRequest, DriverMatrixSubmitResultRequest
5
+ from argus.backend.service.user import api_login_required
6
+ from argus.backend.plugins.driver_matrix_tests.service import DriverMatrixService
7
+ from argus.backend.util.common import get_payload
8
+
9
+ bp = Blueprint("driver_matrix_api", __name__, url_prefix="/driver_matrix")
10
+ bp.register_error_handler(Exception, handle_api_exception)
11
+
12
+
13
+ @bp.route("/test_report", methods=["GET"])
14
+ @api_login_required
15
+ def driver_matrix_test_report():
16
+
17
+ build_id = request.args.get("buildId")
18
+ if not build_id:
19
+ raise Exception("No build id provided")
20
+
21
+
22
+ result = DriverMatrixService().tested_versions_report(build_id=build_id)
23
+ return {
24
+ "status": "ok",
25
+ "response": result
26
+ }
27
+
28
+ @bp.route("/result/submit", methods=["POST"])
29
+ @api_login_required
30
+ def submit_result():
31
+ payload = get_payload(request)
32
+ request_data = DriverMatrixSubmitResultRequest(**payload)
33
+
34
+ result = DriverMatrixService().submit_driver_result(driver_name=request_data.driver_name, driver_type=request_data.driver_type, run_id=request_data.run_id, raw_xml=request_data.raw_xml)
35
+ return {
36
+ "status": "ok",
37
+ "response": result
38
+ }
39
+
40
+
41
+ @bp.route("/result/fail", methods=["POST"])
42
+ @api_login_required
43
+ def submit_failure():
44
+ payload = get_payload(request)
45
+ request_data = DriverMatrixSubmitFailureRequest(**payload)
46
+
47
+ result = DriverMatrixService().submit_driver_failure(driver_name=request_data.driver_name, driver_type=request_data.driver_type, run_id=request_data.run_id, failure_reason=request_data.failure_reason)
48
+ return {
49
+ "status": "ok",
50
+ "response": result
51
+ }
52
+
53
+ @bp.route("/env/submit", methods=["POST"])
54
+ @api_login_required
55
+ def submit_env():
56
+ payload = get_payload(request)
57
+ request_data = DriverMatrixSubmitEnvRequest(**payload)
58
+
59
+ result = DriverMatrixService().submit_env_info(run_id=request_data.run_id, raw_env=request_data.raw_env)
60
+ return {
61
+ "status": "ok",
62
+ "response": result
63
+ }