argus-alm 0.12.10__py3-none-any.whl → 0.13.0__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.
Files changed (92) hide show
  1. argus/client/base.py +1 -1
  2. argus/client/driver_matrix_tests/cli.py +2 -2
  3. argus/client/driver_matrix_tests/client.py +1 -1
  4. argus/client/generic/cli.py +2 -2
  5. argus/client/sct/client.py +3 -3
  6. argus/client/sirenada/client.py +1 -1
  7. {argus_alm-0.12.10.dist-info → argus_alm-0.13.0.dist-info}/METADATA +2 -4
  8. argus_alm-0.13.0.dist-info/RECORD +20 -0
  9. argus/backend/.gitkeep +0 -0
  10. argus/backend/cli.py +0 -41
  11. argus/backend/controller/__init__.py +0 -0
  12. argus/backend/controller/admin.py +0 -20
  13. argus/backend/controller/admin_api.py +0 -354
  14. argus/backend/controller/api.py +0 -529
  15. argus/backend/controller/auth.py +0 -67
  16. argus/backend/controller/client_api.py +0 -108
  17. argus/backend/controller/main.py +0 -274
  18. argus/backend/controller/notification_api.py +0 -72
  19. argus/backend/controller/notifications.py +0 -13
  20. argus/backend/controller/team.py +0 -126
  21. argus/backend/controller/team_ui.py +0 -18
  22. argus/backend/controller/testrun_api.py +0 -482
  23. argus/backend/controller/view_api.py +0 -162
  24. argus/backend/db.py +0 -100
  25. argus/backend/error_handlers.py +0 -21
  26. argus/backend/events/event_processors.py +0 -34
  27. argus/backend/models/__init__.py +0 -0
  28. argus/backend/models/result.py +0 -138
  29. argus/backend/models/web.py +0 -389
  30. argus/backend/plugins/__init__.py +0 -0
  31. argus/backend/plugins/core.py +0 -225
  32. argus/backend/plugins/driver_matrix_tests/controller.py +0 -63
  33. argus/backend/plugins/driver_matrix_tests/model.py +0 -421
  34. argus/backend/plugins/driver_matrix_tests/plugin.py +0 -22
  35. argus/backend/plugins/driver_matrix_tests/raw_types.py +0 -62
  36. argus/backend/plugins/driver_matrix_tests/service.py +0 -60
  37. argus/backend/plugins/driver_matrix_tests/udt.py +0 -42
  38. argus/backend/plugins/generic/model.py +0 -79
  39. argus/backend/plugins/generic/plugin.py +0 -16
  40. argus/backend/plugins/generic/types.py +0 -13
  41. argus/backend/plugins/loader.py +0 -40
  42. argus/backend/plugins/sct/controller.py +0 -185
  43. argus/backend/plugins/sct/plugin.py +0 -38
  44. argus/backend/plugins/sct/resource_setup.py +0 -178
  45. argus/backend/plugins/sct/service.py +0 -491
  46. argus/backend/plugins/sct/testrun.py +0 -272
  47. argus/backend/plugins/sct/udt.py +0 -101
  48. argus/backend/plugins/sirenada/model.py +0 -113
  49. argus/backend/plugins/sirenada/plugin.py +0 -17
  50. argus/backend/service/admin.py +0 -27
  51. argus/backend/service/argus_service.py +0 -688
  52. argus/backend/service/build_system_monitor.py +0 -188
  53. argus/backend/service/client_service.py +0 -122
  54. argus/backend/service/event_service.py +0 -18
  55. argus/backend/service/jenkins_service.py +0 -240
  56. argus/backend/service/notification_manager.py +0 -150
  57. argus/backend/service/release_manager.py +0 -230
  58. argus/backend/service/results_service.py +0 -317
  59. argus/backend/service/stats.py +0 -540
  60. argus/backend/service/team_manager_service.py +0 -83
  61. argus/backend/service/testrun.py +0 -559
  62. argus/backend/service/user.py +0 -307
  63. argus/backend/service/views.py +0 -258
  64. argus/backend/template_filters.py +0 -27
  65. argus/backend/tests/__init__.py +0 -0
  66. argus/backend/tests/argus_web.test.yaml +0 -39
  67. argus/backend/tests/conftest.py +0 -44
  68. argus/backend/tests/results_service/__init__.py +0 -0
  69. argus/backend/tests/results_service/test_best_results.py +0 -70
  70. argus/backend/util/common.py +0 -65
  71. argus/backend/util/config.py +0 -38
  72. argus/backend/util/encoders.py +0 -41
  73. argus/backend/util/logsetup.py +0 -81
  74. argus/backend/util/module_loaders.py +0 -30
  75. argus/backend/util/send_email.py +0 -91
  76. argus/client/generic_result_old.py +0 -143
  77. argus/db/.gitkeep +0 -0
  78. argus/db/argus_json.py +0 -14
  79. argus/db/cloud_types.py +0 -125
  80. argus/db/config.py +0 -135
  81. argus/db/db_types.py +0 -139
  82. argus/db/interface.py +0 -370
  83. argus/db/testrun.py +0 -740
  84. argus/db/utils.py +0 -15
  85. argus_alm-0.12.10.dist-info/RECORD +0 -96
  86. /argus/{backend → common}/__init__.py +0 -0
  87. /argus/{backend/util → common}/enums.py +0 -0
  88. /argus/{backend/plugins/sct/types.py → common/sct_types.py} +0 -0
  89. /argus/{backend/plugins/sirenada/types.py → common/sirenada_types.py} +0 -0
  90. {argus_alm-0.12.10.dist-info → argus_alm-0.13.0.dist-info}/LICENSE +0 -0
  91. {argus_alm-0.12.10.dist-info → argus_alm-0.13.0.dist-info}/WHEEL +0 -0
  92. {argus_alm-0.12.10.dist-info → argus_alm-0.13.0.dist-info}/entry_points.txt +0 -0
@@ -1,529 +0,0 @@
1
- import logging
2
- from uuid import UUID
3
- import requests
4
- from flask import (
5
- Blueprint,
6
- g,
7
- request, Response
8
- )
9
- from flask.json import jsonify
10
- from argus.backend.error_handlers import handle_api_exception
11
- from argus.backend.controller.notification_api import bp as notifications_bp
12
- from argus.backend.controller.client_api import bp as client_bp
13
- from argus.backend.controller.testrun_api import bp as testrun_bp
14
- from argus.backend.controller.team import bp as team_bp
15
- from argus.backend.controller.view_api import bp as view_bp
16
- from argus.backend.service.argus_service import ArgusService, ScheduleUpdateRequest
17
- from argus.backend.service.results_service import ResultsService
18
- from argus.backend.service.user import UserService, api_login_required
19
- from argus.backend.service.stats import ReleaseStatsCollector
20
- from argus.backend.models.web import ArgusRelease, ArgusGroup, ArgusTest, User, UserOauthToken
21
- from argus.backend.util.common import get_payload
22
-
23
- bp = Blueprint('api', __name__, url_prefix='/api/v1')
24
- bp.register_blueprint(notifications_bp)
25
- bp.register_blueprint(client_bp)
26
- bp.register_blueprint(testrun_bp)
27
- bp.register_blueprint(team_bp)
28
- bp.register_blueprint(view_bp)
29
- bp.register_error_handler(Exception, handle_api_exception)
30
- LOGGER = logging.getLogger(__name__)
31
-
32
-
33
- @bp.route("/version")
34
- def app_version():
35
- service = ArgusService()
36
- argus_version = service.get_version()
37
- return jsonify({
38
- "status": "ok",
39
- "response": {
40
- "commit_id": argus_version
41
- }
42
- })
43
-
44
-
45
- @bp.route("/profile/github/token")
46
- @api_login_required
47
- def get_github_oauth_token():
48
- user_tokens = UserOauthToken.filter(user_id=g.user.id).all()
49
- token = None
50
- for tok in user_tokens:
51
- if tok.kind == "github":
52
- token = tok.token
53
- break
54
- if not token:
55
- raise Exception("Github token not found")
56
-
57
- res = jsonify({
58
- "status": "ok",
59
- "response": token
60
- })
61
- res.cache_control.max_age = 300
62
-
63
- return res
64
-
65
-
66
- @bp.route("/releases")
67
- @api_login_required
68
- def releases():
69
- service = ArgusService()
70
- force_all = request.args.get("all", False)
71
- all_releases = service.get_releases()
72
- response = jsonify({
73
- "status": "ok",
74
- "response": [dict(d.items()) for d in all_releases if d.enabled or force_all]
75
- })
76
-
77
- response.cache_control.max_age = 60
78
- return response
79
-
80
-
81
- @bp.route("/release/activity", methods=["GET"])
82
- @api_login_required
83
- def release_activity():
84
- release_name = request.args.get("releaseName")
85
- if not release_name:
86
- raise Exception("Release name not specified in the request")
87
- service = ArgusService()
88
- activity_data = service.fetch_release_activity(release_name)
89
-
90
- return jsonify({
91
- "status": "ok",
92
- "response": activity_data
93
- })
94
-
95
-
96
- @bp.route("/release/planner/data", methods=["GET"])
97
- @api_login_required
98
- def release_planner_data():
99
-
100
- release_id = request.args.get("releaseId")
101
- if not release_id:
102
- raise Exception("Release Id not specified")
103
- service = ArgusService()
104
- planner_data = service.get_planner_data(release_id)
105
- return jsonify({
106
- "status": "ok",
107
- "response": planner_data
108
- })
109
-
110
-
111
- @bp.route("/release/<string:release_id>/versions")
112
- @api_login_required
113
- def release_versions(release_id: str):
114
- release_id = UUID(release_id)
115
- service = ArgusService()
116
- distinct_versions = service.get_distinct_release_versions(release_id=release_id)
117
-
118
- return jsonify({
119
- "status": "ok",
120
- "response": distinct_versions
121
- })
122
-
123
-
124
- @bp.route("/release/planner/comment/get/test")
125
- def get_planner_comment_by_test():
126
- test_id = request.args.get("id")
127
- if not test_id:
128
- raise Exception("TestId was not specified")
129
- service = ArgusService()
130
- planner_comments_by_test = service.get_planner_comment_by_test(UUID(test_id))
131
-
132
- response = jsonify({
133
- "status": "ok",
134
- "response": planner_comments_by_test
135
- })
136
- response.cache_control.max_age = 60
137
- return response
138
-
139
-
140
- @bp.route("/release/schedules/comment/update", methods=["POST"])
141
- @api_login_required
142
- def release_schedules_comment_update():
143
- if not request.is_json:
144
- raise Exception(
145
- "Content-Type mismatch, expected application/json, got:", request.content_type)
146
- request_payload = request.get_json()
147
- service = ArgusService()
148
- comment_update_result = service.update_schedule_comment(request_payload)
149
-
150
- return jsonify({
151
- "status": "ok",
152
- "response": comment_update_result
153
- })
154
-
155
-
156
- @bp.route("/release/schedules", methods=["GET"])
157
- @api_login_required
158
- def release_schedules():
159
- release = request.args.get("releaseId")
160
- if not release:
161
- raise Exception("No releaseId provided")
162
- service = ArgusService()
163
- release_schedules_data = service.get_schedules_for_release(release)
164
-
165
- return jsonify({
166
- "status": "ok",
167
- "response": release_schedules_data
168
- })
169
-
170
-
171
- @bp.route("/release/schedules/assignee/update", methods=["POST"])
172
- @api_login_required
173
- def release_schedules_assignee_update():
174
- if not request.is_json:
175
- raise Exception(
176
- "Content-Type mismatch, expected application/json, got:", request.content_type)
177
- request_payload = request.get_json()
178
- service = ArgusService()
179
- assignee_update_status = service.update_schedule_assignees(request_payload)
180
-
181
- return jsonify({
182
- "status": "ok",
183
- "response": assignee_update_status
184
- })
185
-
186
-
187
- @bp.route("/release/assignees/groups", methods=["GET"])
188
- @api_login_required
189
- def group_assignees():
190
- release_id = request.args.get("releaseId")
191
- if not release_id:
192
- raise Exception("Missing releaseId")
193
- service = ArgusService()
194
- group_assignees_list = service.get_groups_assignees(release_id)
195
-
196
- return jsonify({
197
- "status": "ok",
198
- "response": group_assignees_list
199
- })
200
-
201
-
202
- @bp.route("/release/assignees/tests", methods=["GET"])
203
- @api_login_required
204
- def tests_assignees():
205
- group_id = request.args.get("groupId")
206
- if not group_id:
207
- raise Exception("Missing groupId")
208
- service = ArgusService()
209
- tests_assignees_list = service.get_tests_assignees(group_id)
210
-
211
- return jsonify({
212
- "status": "ok",
213
- "response": tests_assignees_list
214
- })
215
-
216
-
217
- @bp.route("/release/schedules/submit", methods=["POST"])
218
- @api_login_required
219
- def release_schedules_submit():
220
- if not request.is_json:
221
- raise Exception(
222
- "Content-Type mismatch, expected application/json, got:", request.content_type)
223
- payload = request.get_json()
224
- service = ArgusService()
225
- schedule_submit_result = service.submit_new_schedule(
226
- release=payload["releaseId"],
227
- start_time=payload["start"],
228
- end_time=payload["end"],
229
- tests=payload["tests"],
230
- groups=payload["groups"],
231
- assignees=payload["assignees"],
232
- tag=payload["tag"],
233
- comments=payload.get("comments"),
234
- group_ids=payload.get("groupIds"),
235
- )
236
-
237
- return jsonify({
238
- "status": "ok",
239
- "response": schedule_submit_result
240
- })
241
-
242
-
243
- @bp.route("/release/schedules/delete", methods=["POST"])
244
- @api_login_required
245
- def release_schedules_delete():
246
- if not request.is_json:
247
- raise Exception(
248
- "Content-Type mismatch, expected application/json, got:", request.content_type)
249
- request_payload = request.get_json()
250
- service = ArgusService()
251
- schedule_delete_result = service.delete_schedule(request_payload)
252
-
253
- return jsonify({
254
- "status": "ok",
255
- "response": schedule_delete_result
256
- })
257
-
258
-
259
- @bp.route("/release/schedules/update", methods=["POST"])
260
- @api_login_required
261
- def release_schedule_update():
262
- payload = get_payload(request)
263
- req = ScheduleUpdateRequest(**payload)
264
- service = ArgusService()
265
- update_result = service.update_schedule(
266
- release_id=req.release_id,
267
- schedule_id=req.schedule_id,
268
- old_tests=req.old_tests,
269
- new_tests=req.new_tests,
270
- comments=req.comments,
271
- assignee=req.assignee
272
- )
273
-
274
- return jsonify({
275
- "status": "ok",
276
- "response": update_result
277
- })
278
-
279
-
280
- @bp.route("/groups", methods=["GET"])
281
- @api_login_required
282
- def argus_groups():
283
- release_id = request.args.get("releaseId")
284
- if not release_id:
285
- raise Exception("No releaseId provided")
286
-
287
- force_all = request.args.get("all", False)
288
- service = ArgusService()
289
- groups = service.get_groups(UUID(release_id))
290
- result_groups = [dict(g.items()) for g in groups if g.enabled or force_all]
291
-
292
- response = jsonify({
293
- "status": "ok",
294
- "response": result_groups
295
- })
296
- response.cache_control.max_age = 60
297
- return response
298
-
299
-
300
- @bp.route("/tests", methods=["GET"])
301
- @api_login_required
302
- def argus_tests():
303
- group_id = request.args.get("groupId")
304
- if not group_id:
305
- raise Exception("No groupId provided")
306
- force_all = request.args.get("all", False)
307
- service = ArgusService()
308
- tests = service.get_tests(group_id=group_id)
309
- result_tests = [dict(t.items()) for t in tests if t.enabled or force_all]
310
-
311
- response = jsonify({
312
- "status": "ok",
313
- "response": result_tests
314
- })
315
- response.cache_control.max_age = 60
316
- return response
317
-
318
-
319
- @bp.route("/release/<string:release_id>/details", methods=["GET"])
320
- @api_login_required
321
- def get_release_details(release_id: str):
322
- release = ArgusRelease.get(id=UUID(release_id))
323
- response = jsonify({
324
- "status": "ok",
325
- "response": release,
326
- })
327
- response.cache_control.max_age = 60
328
- return response
329
-
330
-
331
- @bp.route("/group/<string:group_id>/details", methods=["GET"])
332
- @api_login_required
333
- def get_group_details(group_id: str):
334
- group = ArgusGroup.get(id=UUID(group_id))
335
- response = jsonify({
336
- "status": "ok",
337
- "response": group,
338
- })
339
- response.cache_control.max_age = 60
340
- return response
341
-
342
-
343
- @bp.route("/test/<string:test_id>/details", methods=["GET"])
344
- @api_login_required
345
- def get_test_details(test_id: str):
346
- test = ArgusTest.get(id=UUID(test_id))
347
- response = jsonify({
348
- "status": "ok",
349
- "response": test
350
- })
351
- response.cache_control.max_age = 60
352
- return response
353
-
354
-
355
- @bp.route("/test/<string:test_id>/set_plugin", methods=["POST"])
356
- @api_login_required
357
- def set_test_plugin(test_id: str):
358
- payload = get_payload(request)
359
-
360
- current_user: User = g.user
361
- test: ArgusTest = ArgusTest.get(id=UUID(test_id))
362
- test.plugin_name = payload["plugin_name"]
363
- test.save()
364
-
365
- return {
366
- "status": "ok",
367
- "response": test
368
- }
369
-
370
-
371
- @bp.route("/test-info", methods=["GET"])
372
- @api_login_required
373
- def test_info():
374
- test_id = request.args.get("testId")
375
- if not test_id:
376
- raise Exception("No testId provided")
377
- service = ArgusService()
378
- info = service.get_test_info(test_id=UUID(test_id))
379
-
380
- return {
381
- "status": "ok",
382
- "response": info
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
- }
401
-
402
- @bp.route("/test_run/comment/get", methods=["GET"]) # TODO: remove
403
- @api_login_required
404
- def get_test_run_comment():
405
- comment_id = request.args.get("commentId")
406
- if not comment_id:
407
- raise Exception("commentId wasn't specified in the request")
408
- service = ArgusService()
409
- comment = service.get_comment(comment_id=UUID(comment_id))
410
- return jsonify({
411
- "status": "ok",
412
- "response": comment if comment else False
413
- })
414
-
415
-
416
- @bp.route("/users", methods=["GET"])
417
- @api_login_required
418
- def user_info():
419
- result = UserService().get_users()
420
-
421
- return jsonify({
422
- "status": "ok",
423
- "response": result
424
- })
425
-
426
-
427
- @bp.route("/release/stats/v2", methods=["GET"])
428
- @api_login_required
429
- def release_stats_v2():
430
- request.query_string.decode(encoding="UTF-8")
431
- release = request.args.get("release")
432
- limited = bool(int(request.args.get("limited")))
433
- version = request.args.get("productVersion", None)
434
- include_no_version = bool(int(request.args.get("includeNoVersion", True)))
435
- force = bool(int(request.args.get("force")))
436
- stats = ReleaseStatsCollector(
437
- release_name=release, release_version=version).collect(limited=limited, force=force, include_no_version=include_no_version)
438
-
439
- res = jsonify({
440
- "status": "ok",
441
- "response": stats
442
- })
443
- res.cache_control.max_age = 300
444
- return res
445
-
446
-
447
- @bp.route("/test_runs/poll", methods=["GET"])
448
- @api_login_required
449
- def test_runs_poll():
450
- limit = request.args.get("limit")
451
- if not limit:
452
- limit = 10
453
- else:
454
- limit = int(limit)
455
- test_id = UUID(request.args.get('testId'))
456
- additional_runs = [UUID(run) for run in request.args.getlist('additionalRuns[]')]
457
- service = ArgusService()
458
- runs = service.poll_test_runs(test_id=test_id, additional_runs=additional_runs, limit=limit)
459
-
460
- return jsonify({
461
- "status": "ok",
462
- "response": runs
463
- })
464
-
465
-
466
- @bp.route("/test_run/poll", methods=["GET"])
467
- @api_login_required
468
- def test_run_poll_single():
469
- runs = request.args.get("runs", "")
470
- runs = [UUID(r) for r in runs.split(",") if r]
471
- service = ArgusService()
472
- test_runs = service.poll_test_runs_single(runs=runs)
473
-
474
- return jsonify({
475
- "status": "ok",
476
- "response": test_runs
477
- })
478
-
479
-
480
- @bp.route("/release/create", methods=["POST"])
481
- @api_login_required
482
- def release_create():
483
- if not request.is_json:
484
- raise Exception(
485
- "Content-Type mismatch, expected application/json, got:", request.content_type)
486
- request_payload = request.get_json()
487
- service = ArgusService()
488
- result = service.create_release(request_payload)
489
-
490
- return jsonify({
491
- "status": "ok",
492
- "response": result
493
- })
494
-
495
-
496
- @bp.route("/artifact/resolveSize")
497
- @api_login_required
498
- def resolve_artifact_size():
499
- link = request.args.get("l")
500
- if not link:
501
- raise Exception("No link provided")
502
-
503
- res = requests.head(link)
504
-
505
- if res.status_code != 200:
506
- raise Exception("Error requesting resource")
507
-
508
- length = res.headers.get("Content-Length")
509
- if length:
510
- length = int(length)
511
-
512
- return {
513
- "status": "ok",
514
- "response": {
515
- "artifactSize": length,
516
- }
517
- }
518
-
519
-
520
- @bp.route("/user/jobs")
521
- @api_login_required
522
- def user_jobs():
523
- service = ArgusService()
524
- result = list(service.get_jobs_for_user(user=g.user))
525
-
526
- return {
527
- "status": "ok",
528
- "response": result
529
- }
@@ -1,67 +0,0 @@
1
- import os
2
- import hashlib
3
- from flask import (
4
- Blueprint, flash, g, redirect, render_template, request, session, url_for, current_app
5
- )
6
- from werkzeug.security import check_password_hash
7
- from argus.backend.models.web import User
8
- from argus.backend.service.user import UserService, UserServiceException, load_logged_in_user, login_required
9
-
10
- bp = Blueprint('auth', __name__, url_prefix='/auth')
11
-
12
-
13
- @bp.route('/register', methods=('GET', 'POST'))
14
- def register():
15
- return redirect(url_for("auth.login"))
16
-
17
-
18
- @bp.route('/login', methods=('GET', 'POST'))
19
- def login():
20
- token = hashlib.sha256((os.urandom(64))).hexdigest()
21
- session["csrf_token"] = token
22
-
23
- if request.method == 'POST':
24
- try:
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"]
29
-
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")
37
-
38
- session.clear()
39
- session["user_id"] = str(user.id)
40
- session["csrf_token"] = token
41
- except UserServiceException as exc:
42
- flash(next(iter(exc.args), "No message"), category="error")
43
-
44
- return redirect(url_for('main.home'))
45
-
46
- return render_template('auth/login.html.j2',
47
- csrf_token=token,
48
- github_cid=current_app.config.get("GITHUB_CLIENT_ID", "NO_CLIENT_ID"),
49
- github_scopes=current_app.config.get("GITHUB_SCOPES", "user:email read:user read:org repo")
50
- )
51
-
52
-
53
- @bp.route("/profile/api/token/generate", methods=("POST",))
54
- @login_required
55
- def generate_api_token():
56
- new_token = UserService().generate_token(g.user)
57
- session["token_generated"] = new_token
58
- return redirect(url_for('main.profile'))
59
-
60
-
61
- @bp.route('/logout', methods=("POST",))
62
- def logout():
63
- session.clear()
64
- return redirect(url_for('auth.login'))
65
-
66
-
67
- bp.before_app_request(load_logged_in_user)
@@ -1,108 +0,0 @@
1
- from flask import Blueprint, request
2
-
3
- from argus.backend.error_handlers import handle_api_exception
4
- from argus.backend.service.user import api_login_required
5
- from argus.backend.service.client_service import ClientService
6
- from argus.backend.util.common import get_payload
7
- from argus.backend.plugins.loader import AVAILABLE_PLUGINS
8
-
9
- bp = Blueprint("client_api", __name__, url_prefix="/client")
10
- bp.register_error_handler(Exception, handle_api_exception)
11
- for plugin in AVAILABLE_PLUGINS.values():
12
- if plugin.controller:
13
- bp.register_blueprint(plugin.controller)
14
-
15
-
16
- @bp.route("/testrun/<string:run_type>/submit", methods=["POST"])
17
- @api_login_required
18
- def submit_run(run_type: str):
19
- payload = get_payload(request)
20
- result = ClientService().submit_run(run_type=run_type, request_data=payload)
21
- return {
22
- "status": "ok",
23
- "response": result
24
- }
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
-
35
-
36
- @bp.route("/testrun/<string:run_type>/<string:run_id>/heartbeat", methods=["POST"])
37
- @api_login_required
38
- def run_heartbeat(run_type: str, run_id: str):
39
- result = ClientService().heartbeat(run_type=run_type, run_id=run_id)
40
- return {
41
- "status": "ok",
42
- "response": result
43
- }
44
-
45
-
46
- @bp.route("/testrun/<string:run_type>/<string:run_id>/get_status")
47
- @api_login_required
48
- def run_get_status(run_type: str, run_id: str):
49
- result = ClientService().get_run_status(run_type=run_type, run_id=run_id)
50
- return {
51
- "status": "ok",
52
- "response": result
53
- }
54
-
55
-
56
- @bp.route("/testrun/<string:run_type>/<string:run_id>/set_status", methods=["POST"])
57
- @api_login_required
58
- def run_set_status(run_type: str, run_id: str):
59
- payload = get_payload(request)
60
- result = ClientService().update_run_status(run_type=run_type, run_id=run_id, new_status=payload["new_status"])
61
- return {
62
- "status": "ok",
63
- "response": result
64
- }
65
-
66
-
67
- @bp.route("/testrun/<string:run_type>/<string:run_id>/update_product_version", methods=["POST"])
68
- @api_login_required
69
- def run_update_product_version(run_type: str, run_id: str):
70
- payload = get_payload(request)
71
- result = ClientService().submit_product_version(
72
- run_type=run_type, run_id=run_id, version=payload["product_version"])
73
- return {
74
- "status": "ok",
75
- "response": result
76
- }
77
-
78
-
79
- @bp.route("/testrun/<string:run_type>/<string:run_id>/logs/submit", methods=["POST"])
80
- @api_login_required
81
- def run_submit_logs(run_type: str, run_id: str):
82
- payload = get_payload(request)
83
- result = ClientService().submit_logs(run_type=run_type, run_id=run_id, logs=payload["logs"])
84
- return {
85
- "status": "ok",
86
- "response": result
87
- }
88
-
89
-
90
- @bp.route("/testrun/<string:run_type>/<string:run_id>/finalize", methods=["POST"])
91
- @api_login_required
92
- def run_finalize(run_type: str, run_id: str):
93
- try:
94
- payload = get_payload(request)
95
- except Exception:
96
- payload = None
97
- result = ClientService().finish_run(run_type=run_type, run_id=run_id, payload=payload)
98
- return {
99
- "status": "ok",
100
- "response": result
101
- }
102
-
103
-
104
- @bp.route("/testrun/<string:run_type>/<string:run_id>/submit_results", methods=["POST"])
105
- @api_login_required
106
- def submit_results(run_type: str, run_id: str):
107
- payload = get_payload(request)
108
- return ClientService().submit_results(run_type=run_type, run_id=run_id, results=payload)