argus-alm 0.12.10__py3-none-any.whl → 0.13.1__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.
- argus/client/base.py +1 -1
- argus/client/driver_matrix_tests/cli.py +2 -2
- argus/client/driver_matrix_tests/client.py +1 -1
- argus/client/generic/cli.py +22 -2
- argus/client/generic/client.py +22 -0
- argus/client/generic_result.py +3 -3
- argus/client/sct/client.py +5 -4
- argus/client/sirenada/client.py +1 -1
- {argus_alm-0.12.10.dist-info → argus_alm-0.13.1.dist-info}/METADATA +2 -4
- argus_alm-0.13.1.dist-info/RECORD +20 -0
- argus/backend/.gitkeep +0 -0
- argus/backend/cli.py +0 -41
- argus/backend/controller/__init__.py +0 -0
- argus/backend/controller/admin.py +0 -20
- argus/backend/controller/admin_api.py +0 -354
- argus/backend/controller/api.py +0 -529
- argus/backend/controller/auth.py +0 -67
- argus/backend/controller/client_api.py +0 -108
- argus/backend/controller/main.py +0 -274
- argus/backend/controller/notification_api.py +0 -72
- argus/backend/controller/notifications.py +0 -13
- argus/backend/controller/team.py +0 -126
- argus/backend/controller/team_ui.py +0 -18
- argus/backend/controller/testrun_api.py +0 -482
- argus/backend/controller/view_api.py +0 -162
- argus/backend/db.py +0 -100
- argus/backend/error_handlers.py +0 -21
- argus/backend/events/event_processors.py +0 -34
- argus/backend/models/__init__.py +0 -0
- argus/backend/models/result.py +0 -138
- argus/backend/models/web.py +0 -389
- argus/backend/plugins/__init__.py +0 -0
- argus/backend/plugins/core.py +0 -225
- argus/backend/plugins/driver_matrix_tests/controller.py +0 -63
- argus/backend/plugins/driver_matrix_tests/model.py +0 -421
- argus/backend/plugins/driver_matrix_tests/plugin.py +0 -22
- argus/backend/plugins/driver_matrix_tests/raw_types.py +0 -62
- argus/backend/plugins/driver_matrix_tests/service.py +0 -60
- argus/backend/plugins/driver_matrix_tests/udt.py +0 -42
- argus/backend/plugins/generic/model.py +0 -79
- argus/backend/plugins/generic/plugin.py +0 -16
- argus/backend/plugins/generic/types.py +0 -13
- argus/backend/plugins/loader.py +0 -40
- argus/backend/plugins/sct/controller.py +0 -185
- argus/backend/plugins/sct/plugin.py +0 -38
- argus/backend/plugins/sct/resource_setup.py +0 -178
- argus/backend/plugins/sct/service.py +0 -491
- argus/backend/plugins/sct/testrun.py +0 -272
- argus/backend/plugins/sct/udt.py +0 -101
- argus/backend/plugins/sirenada/model.py +0 -113
- argus/backend/plugins/sirenada/plugin.py +0 -17
- argus/backend/service/admin.py +0 -27
- argus/backend/service/argus_service.py +0 -688
- argus/backend/service/build_system_monitor.py +0 -188
- argus/backend/service/client_service.py +0 -122
- argus/backend/service/event_service.py +0 -18
- argus/backend/service/jenkins_service.py +0 -240
- argus/backend/service/notification_manager.py +0 -150
- argus/backend/service/release_manager.py +0 -230
- argus/backend/service/results_service.py +0 -317
- argus/backend/service/stats.py +0 -540
- argus/backend/service/team_manager_service.py +0 -83
- argus/backend/service/testrun.py +0 -559
- argus/backend/service/user.py +0 -307
- argus/backend/service/views.py +0 -258
- argus/backend/template_filters.py +0 -27
- argus/backend/tests/__init__.py +0 -0
- argus/backend/tests/argus_web.test.yaml +0 -39
- argus/backend/tests/conftest.py +0 -44
- argus/backend/tests/results_service/__init__.py +0 -0
- argus/backend/tests/results_service/test_best_results.py +0 -70
- argus/backend/util/common.py +0 -65
- argus/backend/util/config.py +0 -38
- argus/backend/util/encoders.py +0 -41
- argus/backend/util/logsetup.py +0 -81
- argus/backend/util/module_loaders.py +0 -30
- argus/backend/util/send_email.py +0 -91
- argus/client/generic_result_old.py +0 -143
- argus/db/.gitkeep +0 -0
- argus/db/argus_json.py +0 -14
- argus/db/cloud_types.py +0 -125
- argus/db/config.py +0 -135
- argus/db/db_types.py +0 -139
- argus/db/interface.py +0 -370
- argus/db/testrun.py +0 -740
- argus/db/utils.py +0 -15
- argus_alm-0.12.10.dist-info/RECORD +0 -96
- /argus/{backend → common}/__init__.py +0 -0
- /argus/{backend/util → common}/enums.py +0 -0
- /argus/{backend/plugins/sct/types.py → common/sct_types.py} +0 -0
- /argus/{backend/plugins/sirenada/types.py → common/sirenada_types.py} +0 -0
- {argus_alm-0.12.10.dist-info → argus_alm-0.13.1.dist-info}/LICENSE +0 -0
- {argus_alm-0.12.10.dist-info → argus_alm-0.13.1.dist-info}/WHEEL +0 -0
- {argus_alm-0.12.10.dist-info → argus_alm-0.13.1.dist-info}/entry_points.txt +0 -0
argus/backend/controller/api.py
DELETED
|
@@ -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
|
-
}
|
argus/backend/controller/auth.py
DELETED
|
@@ -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)
|