argus-alm 0.14.2__py3-none-any.whl → 0.15.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.
Files changed (118) hide show
  1. argus/_version.py +21 -0
  2. argus/backend/.gitkeep +0 -0
  3. argus/backend/__init__.py +0 -0
  4. argus/backend/cli.py +57 -0
  5. argus/backend/controller/__init__.py +0 -0
  6. argus/backend/controller/admin.py +20 -0
  7. argus/backend/controller/admin_api.py +355 -0
  8. argus/backend/controller/api.py +589 -0
  9. argus/backend/controller/auth.py +67 -0
  10. argus/backend/controller/client_api.py +109 -0
  11. argus/backend/controller/main.py +316 -0
  12. argus/backend/controller/notification_api.py +72 -0
  13. argus/backend/controller/notifications.py +13 -0
  14. argus/backend/controller/planner_api.py +194 -0
  15. argus/backend/controller/team.py +129 -0
  16. argus/backend/controller/team_ui.py +19 -0
  17. argus/backend/controller/testrun_api.py +513 -0
  18. argus/backend/controller/view_api.py +188 -0
  19. argus/backend/controller/views_widgets/__init__.py +0 -0
  20. argus/backend/controller/views_widgets/graphed_stats.py +54 -0
  21. argus/backend/controller/views_widgets/graphs.py +68 -0
  22. argus/backend/controller/views_widgets/highlights.py +135 -0
  23. argus/backend/controller/views_widgets/nemesis_stats.py +26 -0
  24. argus/backend/controller/views_widgets/summary.py +43 -0
  25. argus/backend/db.py +98 -0
  26. argus/backend/error_handlers.py +41 -0
  27. argus/backend/events/event_processors.py +34 -0
  28. argus/backend/models/__init__.py +0 -0
  29. argus/backend/models/argus_ai.py +24 -0
  30. argus/backend/models/github_issue.py +60 -0
  31. argus/backend/models/plan.py +24 -0
  32. argus/backend/models/result.py +187 -0
  33. argus/backend/models/runtime_store.py +58 -0
  34. argus/backend/models/view_widgets.py +25 -0
  35. argus/backend/models/web.py +403 -0
  36. argus/backend/plugins/__init__.py +0 -0
  37. argus/backend/plugins/core.py +248 -0
  38. argus/backend/plugins/driver_matrix_tests/controller.py +66 -0
  39. argus/backend/plugins/driver_matrix_tests/model.py +429 -0
  40. argus/backend/plugins/driver_matrix_tests/plugin.py +21 -0
  41. argus/backend/plugins/driver_matrix_tests/raw_types.py +62 -0
  42. argus/backend/plugins/driver_matrix_tests/service.py +61 -0
  43. argus/backend/plugins/driver_matrix_tests/udt.py +42 -0
  44. argus/backend/plugins/generic/model.py +86 -0
  45. argus/backend/plugins/generic/plugin.py +15 -0
  46. argus/backend/plugins/generic/types.py +14 -0
  47. argus/backend/plugins/loader.py +39 -0
  48. argus/backend/plugins/sct/controller.py +224 -0
  49. argus/backend/plugins/sct/plugin.py +37 -0
  50. argus/backend/plugins/sct/resource_setup.py +177 -0
  51. argus/backend/plugins/sct/service.py +682 -0
  52. argus/backend/plugins/sct/testrun.py +288 -0
  53. argus/backend/plugins/sct/udt.py +100 -0
  54. argus/backend/plugins/sirenada/model.py +118 -0
  55. argus/backend/plugins/sirenada/plugin.py +16 -0
  56. argus/backend/service/admin.py +26 -0
  57. argus/backend/service/argus_service.py +696 -0
  58. argus/backend/service/build_system_monitor.py +185 -0
  59. argus/backend/service/client_service.py +127 -0
  60. argus/backend/service/event_service.py +18 -0
  61. argus/backend/service/github_service.py +233 -0
  62. argus/backend/service/jenkins_service.py +269 -0
  63. argus/backend/service/notification_manager.py +159 -0
  64. argus/backend/service/planner_service.py +608 -0
  65. argus/backend/service/release_manager.py +229 -0
  66. argus/backend/service/results_service.py +690 -0
  67. argus/backend/service/stats.py +610 -0
  68. argus/backend/service/team_manager_service.py +82 -0
  69. argus/backend/service/test_lookup.py +172 -0
  70. argus/backend/service/testrun.py +489 -0
  71. argus/backend/service/user.py +308 -0
  72. argus/backend/service/views.py +219 -0
  73. argus/backend/service/views_widgets/__init__.py +0 -0
  74. argus/backend/service/views_widgets/graphed_stats.py +180 -0
  75. argus/backend/service/views_widgets/highlights.py +374 -0
  76. argus/backend/service/views_widgets/nemesis_stats.py +34 -0
  77. argus/backend/template_filters.py +27 -0
  78. argus/backend/tests/__init__.py +0 -0
  79. argus/backend/tests/client_service/__init__.py +0 -0
  80. argus/backend/tests/client_service/test_submit_results.py +79 -0
  81. argus/backend/tests/conftest.py +180 -0
  82. argus/backend/tests/results_service/__init__.py +0 -0
  83. argus/backend/tests/results_service/test_best_results.py +178 -0
  84. argus/backend/tests/results_service/test_cell.py +65 -0
  85. argus/backend/tests/results_service/test_chartjs_additional_functions.py +259 -0
  86. argus/backend/tests/results_service/test_create_chartjs.py +220 -0
  87. argus/backend/tests/results_service/test_result_metadata.py +100 -0
  88. argus/backend/tests/results_service/test_results_service.py +203 -0
  89. argus/backend/tests/results_service/test_validation_rules.py +213 -0
  90. argus/backend/tests/view_widgets/__init__.py +0 -0
  91. argus/backend/tests/view_widgets/test_highlights_api.py +532 -0
  92. argus/backend/util/common.py +65 -0
  93. argus/backend/util/config.py +38 -0
  94. argus/backend/util/encoders.py +56 -0
  95. argus/backend/util/logsetup.py +80 -0
  96. argus/backend/util/module_loaders.py +30 -0
  97. argus/backend/util/send_email.py +91 -0
  98. argus/client/base.py +1 -3
  99. argus/client/driver_matrix_tests/cli.py +17 -8
  100. argus/client/generic/cli.py +4 -2
  101. argus/client/generic/client.py +1 -0
  102. argus/client/generic_result.py +48 -9
  103. argus/client/sct/client.py +1 -3
  104. argus/client/sirenada/client.py +4 -1
  105. argus/client/tests/__init__.py +0 -0
  106. argus/client/tests/conftest.py +19 -0
  107. argus/client/tests/test_package.py +45 -0
  108. argus/client/tests/test_results.py +224 -0
  109. argus/common/sct_types.py +3 -0
  110. argus/common/sirenada_types.py +1 -1
  111. {argus_alm-0.14.2.dist-info → argus_alm-0.15.2.dist-info}/METADATA +43 -19
  112. argus_alm-0.15.2.dist-info/RECORD +122 -0
  113. {argus_alm-0.14.2.dist-info → argus_alm-0.15.2.dist-info}/WHEEL +2 -1
  114. argus_alm-0.15.2.dist-info/entry_points.txt +3 -0
  115. argus_alm-0.15.2.dist-info/top_level.txt +1 -0
  116. argus_alm-0.14.2.dist-info/RECORD +0 -20
  117. argus_alm-0.14.2.dist-info/entry_points.txt +0 -4
  118. {argus_alm-0.14.2.dist-info → argus_alm-0.15.2.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,229 @@
1
+ import logging
2
+ from typing import TypedDict
3
+ from uuid import UUID
4
+ from argus.backend.db import ScyllaCluster
5
+ from argus.backend.plugins.sct.testrun import SCTTestRun
6
+ from argus.backend.models.web import ArgusRelease, ArgusGroup, ArgusTest
7
+
8
+ LOGGER = logging.getLogger(__name__)
9
+
10
+
11
+ class ReleaseManagerException(Exception):
12
+ pass
13
+
14
+
15
+ class ReleaseEditPayload(TypedDict):
16
+ id: str
17
+ pretty_name: str
18
+ description: str
19
+ valid_version_regex: str | None
20
+ enabled: bool
21
+ perpetual: bool
22
+ dormant: bool
23
+
24
+
25
+ class ReleaseManagerService:
26
+ def __init__(self) -> None:
27
+ self.session = ScyllaCluster.get_session()
28
+ self.database = ScyllaCluster.get()
29
+ self.runs_by_build_id_stmt = self.database.prepare(
30
+ "SELECT id, test_id, group_id, release_id, build_id, start_time "
31
+ f"FROM {SCTTestRun.table_name()} WHERE build_id = ?"
32
+ )
33
+ self.update_run_stmt = self.database.prepare(
34
+ f"UPDATE {SCTTestRun.table_name()} SET test_id = ?, group_id = ?, release_id = ? "
35
+ "WHERE build_id = ? AND start_time = ?"
36
+ )
37
+
38
+ def get_releases(self) -> list[ArgusRelease]:
39
+ return list(ArgusRelease.all())
40
+
41
+ def get_groups(self, release_id: UUID) -> list[ArgusGroup]:
42
+ return list(ArgusGroup.filter(release_id=release_id).all())
43
+
44
+ def get_tests(self, group_id: UUID) -> list[ArgusTest]:
45
+ return list(ArgusTest.filter(group_id=group_id).all())
46
+
47
+ def toggle_test_enabled(self, test_id: UUID, new_state: bool) -> bool:
48
+ test: ArgusTest = ArgusTest.get(id=test_id)
49
+ test.enabled = new_state
50
+ test.save()
51
+
52
+ return test
53
+
54
+ def toggle_group_enabled(self, group_id: UUID, new_state: bool) -> bool:
55
+ test: ArgusGroup = ArgusGroup.get(id=group_id)
56
+ test.enabled = new_state
57
+ test.save()
58
+
59
+ return test
60
+
61
+ def create_release(self, release_name: str, pretty_name: str, perpetual: bool) -> ArgusRelease:
62
+ try:
63
+ release = ArgusRelease.get(name=release_name)
64
+ except ArgusRelease.DoesNotExist:
65
+ release = ArgusRelease()
66
+ release.name = release_name
67
+ release.pretty_name = pretty_name
68
+ release.perpetual = perpetual
69
+
70
+ release.save()
71
+ else:
72
+ raise ReleaseManagerException(
73
+ f"Release {release_name} already exists!", release_name)
74
+
75
+ return release
76
+
77
+ def create_group(self, group_name: str, pretty_name: str, build_system_id: str,
78
+ release_id: str) -> ArgusGroup:
79
+ release = ArgusRelease.get(id=UUID(release_id))
80
+
81
+ new_group = ArgusGroup()
82
+ new_group.name = group_name
83
+ new_group.pretty_name = pretty_name
84
+ new_group.release_id = release.id
85
+ new_group.build_system_id = build_system_id
86
+ new_group.save()
87
+
88
+ return new_group
89
+
90
+ def create_test(self, test_name, pretty_name, build_id, build_url, group_id, release_id, plugin_name) -> ArgusTest:
91
+ release = ArgusRelease.get(id=UUID(release_id))
92
+ group = ArgusGroup.get(id=UUID(group_id))
93
+
94
+ new_test = ArgusTest()
95
+ new_test.name = test_name
96
+ new_test.pretty_name = pretty_name
97
+ new_test.build_system_id = build_id
98
+ new_test.release_id = release.id
99
+ new_test.group_id = group.id
100
+ new_test.plugin_name = plugin_name
101
+ new_test.build_system_url = build_url
102
+ new_test.validate_build_system_id()
103
+ new_test.save()
104
+ self.move_test_runs(new_test)
105
+ return new_test
106
+
107
+ def delete_group(self, group_id: str, delete_tests: bool = True, new_group_id: str = "") -> bool:
108
+ group_to_delete = ArgusGroup.get(id=UUID(group_id))
109
+
110
+ tests_to_change = ArgusTest.filter(
111
+ group_id=group_to_delete.id)
112
+ if delete_tests:
113
+ for test in tests_to_change.all():
114
+ test.delete()
115
+ else:
116
+ new_group = ArgusGroup.get(id=UUID(new_group_id))
117
+ for test in tests_to_change.all():
118
+ test.group_id = new_group.id
119
+ test.save()
120
+
121
+ group_to_delete.delete()
122
+
123
+ return True
124
+
125
+ def delete_test(self, test_id: str) -> bool:
126
+ test_to_delete = ArgusTest.get(id=test_id)
127
+ test_to_delete.delete()
128
+
129
+ return True
130
+
131
+ def update_group(self, group_id: str, name: str, pretty_name: str, enabled: bool, build_system_id: str) -> bool:
132
+ group = ArgusGroup.get(id=UUID(group_id))
133
+
134
+ group.name = name
135
+ group.build_system_id = build_system_id
136
+ group.pretty_name = pretty_name
137
+ group.enabled = enabled
138
+
139
+ group.save()
140
+
141
+ return True
142
+
143
+ def update_test(self, test_id: str, name: str, pretty_name: str, plugin_name: str,
144
+ enabled: bool, build_system_id: str, build_system_url: str, group_id) -> bool:
145
+ test: ArgusTest = ArgusTest.get(id=UUID(test_id))
146
+ group = ArgusGroup.get(id=UUID(group_id))
147
+
148
+ test.name = name
149
+ test.pretty_name = pretty_name
150
+ test.plugin_name = plugin_name
151
+ test.enabled = enabled
152
+ test.build_system_id = build_system_id
153
+ test.build_system_url = build_system_url
154
+ if test.group_id != group.id:
155
+ test.group_id = group.id
156
+ LOGGER.info("Relocating old test runs into a new group")
157
+
158
+ test.validate_build_system_id()
159
+ test.save()
160
+ self.move_test_runs(test)
161
+ return True
162
+
163
+ def set_release_state(self, release_id: str, state: bool) -> bool:
164
+ release = ArgusRelease.get(id=UUID(release_id))
165
+ release.enabled = state
166
+ release.save()
167
+
168
+ return True
169
+
170
+ def set_release_dormancy(self, release_id: str, dormant: bool) -> bool:
171
+ release = ArgusRelease.get(id=UUID(release_id))
172
+ release.dormant = dormant
173
+ release.save()
174
+
175
+ return True
176
+
177
+ def set_release_perpetuality(self, release_id: str, perpetual: bool) -> bool:
178
+ release = ArgusRelease.get(id=UUID(release_id))
179
+ release.perpetual = perpetual
180
+ release.save()
181
+
182
+ return True
183
+
184
+ def edit_release(self, payload: ReleaseEditPayload) -> bool:
185
+
186
+ release: ArgusRelease = ArgusRelease.get(id=payload["id"])
187
+ release.pretty_name = payload["pretty_name"]
188
+ release.perpetual = payload["perpetual"]
189
+ release.enabled = payload["enabled"]
190
+ release.dormant = payload["dormant"]
191
+ release.description = payload["description"]
192
+ release.valid_version_regex = payload["valid_version_regex"]
193
+
194
+ release.save()
195
+ return True
196
+
197
+ def delete_release(self, release_id: str) -> bool:
198
+
199
+ release: ArgusRelease = ArgusRelease.get(id=release_id)
200
+
201
+ release_groups = ArgusGroup.filter(release_id=release.id)
202
+ release_tests = ArgusTest.filter(release_id=release.id)
203
+
204
+ for entity in [*release_groups.all(), *release_tests.all()]:
205
+ entity.delete()
206
+
207
+ release.delete()
208
+ return True
209
+
210
+ def batch_move_tests(self, new_group_id: str, tests: list[str]) -> bool:
211
+ group = ArgusGroup.get(id=UUID(new_group_id))
212
+
213
+ tests: list[ArgusTest] = [ArgusTest.get(id=UUID(test_id)) for test_id in tests]
214
+
215
+ for test in tests:
216
+ test.group_id = group.id
217
+ test.save()
218
+ self.move_test_runs(test)
219
+
220
+ return True
221
+
222
+ def move_test_runs(self, test: ArgusTest) -> None:
223
+ run_rows = self.session.execute(self.runs_by_build_id_stmt, parameters=(
224
+ test.build_system_id,), execution_profile="read_fast")
225
+ for run in run_rows:
226
+ run["test_id"] = test.id
227
+ run["group_id"] = test.group_id
228
+ run["release_id"] = test.release_id
229
+ self.session.execute(self.update_run_stmt, parameters=run)