argus-alm 0.12.9__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 (93) 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/generic_result.py +3 -2
  6. argus/client/sct/client.py +3 -3
  7. argus/client/sirenada/client.py +1 -1
  8. {argus_alm-0.12.9.dist-info → argus_alm-0.13.0.dist-info}/METADATA +2 -4
  9. argus_alm-0.13.0.dist-info/RECORD +20 -0
  10. argus/backend/.gitkeep +0 -0
  11. argus/backend/cli.py +0 -41
  12. argus/backend/controller/__init__.py +0 -0
  13. argus/backend/controller/admin.py +0 -20
  14. argus/backend/controller/admin_api.py +0 -354
  15. argus/backend/controller/api.py +0 -529
  16. argus/backend/controller/auth.py +0 -67
  17. argus/backend/controller/client_api.py +0 -108
  18. argus/backend/controller/main.py +0 -274
  19. argus/backend/controller/notification_api.py +0 -72
  20. argus/backend/controller/notifications.py +0 -13
  21. argus/backend/controller/team.py +0 -126
  22. argus/backend/controller/team_ui.py +0 -18
  23. argus/backend/controller/testrun_api.py +0 -482
  24. argus/backend/controller/view_api.py +0 -162
  25. argus/backend/db.py +0 -100
  26. argus/backend/error_handlers.py +0 -21
  27. argus/backend/events/event_processors.py +0 -34
  28. argus/backend/models/__init__.py +0 -0
  29. argus/backend/models/result.py +0 -138
  30. argus/backend/models/web.py +0 -389
  31. argus/backend/plugins/__init__.py +0 -0
  32. argus/backend/plugins/core.py +0 -225
  33. argus/backend/plugins/driver_matrix_tests/controller.py +0 -63
  34. argus/backend/plugins/driver_matrix_tests/model.py +0 -421
  35. argus/backend/plugins/driver_matrix_tests/plugin.py +0 -22
  36. argus/backend/plugins/driver_matrix_tests/raw_types.py +0 -62
  37. argus/backend/plugins/driver_matrix_tests/service.py +0 -60
  38. argus/backend/plugins/driver_matrix_tests/udt.py +0 -42
  39. argus/backend/plugins/generic/model.py +0 -79
  40. argus/backend/plugins/generic/plugin.py +0 -16
  41. argus/backend/plugins/generic/types.py +0 -13
  42. argus/backend/plugins/loader.py +0 -40
  43. argus/backend/plugins/sct/controller.py +0 -185
  44. argus/backend/plugins/sct/plugin.py +0 -38
  45. argus/backend/plugins/sct/resource_setup.py +0 -178
  46. argus/backend/plugins/sct/service.py +0 -491
  47. argus/backend/plugins/sct/testrun.py +0 -272
  48. argus/backend/plugins/sct/udt.py +0 -101
  49. argus/backend/plugins/sirenada/model.py +0 -113
  50. argus/backend/plugins/sirenada/plugin.py +0 -17
  51. argus/backend/service/admin.py +0 -27
  52. argus/backend/service/argus_service.py +0 -688
  53. argus/backend/service/build_system_monitor.py +0 -188
  54. argus/backend/service/client_service.py +0 -122
  55. argus/backend/service/event_service.py +0 -18
  56. argus/backend/service/jenkins_service.py +0 -240
  57. argus/backend/service/notification_manager.py +0 -150
  58. argus/backend/service/release_manager.py +0 -230
  59. argus/backend/service/results_service.py +0 -317
  60. argus/backend/service/stats.py +0 -540
  61. argus/backend/service/team_manager_service.py +0 -83
  62. argus/backend/service/testrun.py +0 -559
  63. argus/backend/service/user.py +0 -307
  64. argus/backend/service/views.py +0 -258
  65. argus/backend/template_filters.py +0 -27
  66. argus/backend/tests/__init__.py +0 -0
  67. argus/backend/tests/argus_web.test.yaml +0 -39
  68. argus/backend/tests/conftest.py +0 -44
  69. argus/backend/tests/results_service/__init__.py +0 -0
  70. argus/backend/tests/results_service/test_best_results.py +0 -70
  71. argus/backend/util/common.py +0 -65
  72. argus/backend/util/config.py +0 -38
  73. argus/backend/util/encoders.py +0 -41
  74. argus/backend/util/logsetup.py +0 -81
  75. argus/backend/util/module_loaders.py +0 -30
  76. argus/backend/util/send_email.py +0 -91
  77. argus/client/generic_result_old.py +0 -143
  78. argus/db/.gitkeep +0 -0
  79. argus/db/argus_json.py +0 -14
  80. argus/db/cloud_types.py +0 -125
  81. argus/db/config.py +0 -135
  82. argus/db/db_types.py +0 -139
  83. argus/db/interface.py +0 -370
  84. argus/db/testrun.py +0 -740
  85. argus/db/utils.py +0 -15
  86. argus_alm-0.12.9.dist-info/RECORD +0 -96
  87. /argus/{backend → common}/__init__.py +0 -0
  88. /argus/{backend/util → common}/enums.py +0 -0
  89. /argus/{backend/plugins/sct/types.py → common/sct_types.py} +0 -0
  90. /argus/{backend/plugins/sirenada/types.py → common/sirenada_types.py} +0 -0
  91. {argus_alm-0.12.9.dist-info → argus_alm-0.13.0.dist-info}/LICENSE +0 -0
  92. {argus_alm-0.12.9.dist-info → argus_alm-0.13.0.dist-info}/WHEEL +0 -0
  93. {argus_alm-0.12.9.dist-info → argus_alm-0.13.0.dist-info}/entry_points.txt +0 -0
@@ -1,272 +0,0 @@
1
- from enum import Enum
2
- import logging
3
- from datetime import datetime, timezone
4
- from dataclasses import dataclass, field
5
- from typing import Optional
6
- from uuid import UUID
7
-
8
- from cassandra.cqlengine import columns
9
- from cassandra.cqlengine.models import _DoesNotExist, Model
10
- from argus.backend.db import ScyllaCluster
11
- from argus.backend.models.web import ArgusRelease
12
- from argus.backend.plugins.core import PluginModelBase
13
- from argus.backend.plugins.sct.resource_setup import ResourceSetup
14
- from argus.backend.plugins.sct.udt import (
15
- CloudInstanceDetails,
16
- CloudResource,
17
- CloudSetupDetails,
18
- EventsBySeverity,
19
- NemesisRunInfo,
20
- PackageVersion,
21
- PerformanceHDRHistogram
22
- )
23
-
24
- LOGGER = logging.getLogger(__name__)
25
- SCT_REGION_PROPERTY_MAP = {
26
- "aws": "region_name",
27
- "aws-siren": "region_name",
28
- "k8s-eks": "region_name",
29
- "gce": "gce_datacenter",
30
- "gce-siren": "gce_datacenter",
31
- "k8s-gke": "gce_datacenter",
32
- "azure": "azure_region_name",
33
- "default": "region_name",
34
- }
35
-
36
-
37
- class SubtestType(str, Enum):
38
- GEMINI = "gemini"
39
- PERFORMANCE = "performance"
40
-
41
-
42
- @dataclass(init=True, repr=True, frozen=True)
43
- class SCTTestRunSubmissionRequest():
44
- schema_version: str
45
- run_id: str
46
- job_name: str
47
- job_url: str
48
- started_by: str
49
- commit_id: str
50
- sct_config: dict | None
51
- origin_url: Optional[str] = field(default=None)
52
- branch_name: Optional[str] = field(default=None)
53
- runner_public_ip: Optional[str] = field(default=None)
54
- runner_private_ip: Optional[str] = field(default=None)
55
-
56
-
57
- class SCTTestRun(PluginModelBase):
58
- __table_name__ = "sct_test_run"
59
- _plugin_name = "scylla-cluster-tests"
60
-
61
- # Test Details
62
- test_name = columns.Text()
63
- stress_duration = columns.Float()
64
- scm_revision_id = columns.Text()
65
- branch_name = columns.Text()
66
- origin_url = columns.Text()
67
- started_by = columns.Text()
68
- config_files = columns.List(value_type=columns.Text())
69
- packages = columns.List(value_type=columns.UserDefinedType(user_type=PackageVersion))
70
- scylla_version = columns.Text()
71
- yaml_test_duration = columns.Integer()
72
-
73
- # Test Preset Resources
74
- sct_runner_host = columns.UserDefinedType(user_type=CloudInstanceDetails)
75
- region_name = columns.List(value_type=columns.Text())
76
- cloud_setup = columns.UserDefinedType(user_type=CloudSetupDetails)
77
-
78
- # Test Runtime Resources
79
- allocated_resources = columns.List(value_type=columns.UserDefinedType(user_type=CloudResource))
80
-
81
- # Test Results
82
- events = columns.List(value_type=columns.UserDefinedType(user_type=EventsBySeverity))
83
- nemesis_data = columns.List(value_type=columns.UserDefinedType(user_type=NemesisRunInfo))
84
- screenshots = columns.List(value_type=columns.Text())
85
-
86
- # Subtest
87
- subtest_name = columns.Text()
88
-
89
- # Gemini-related fields
90
- oracle_nodes_count = columns.Integer()
91
- oracle_node_ami_id = columns.Text()
92
- oracle_node_instance_type = columns.Text()
93
- oracle_node_scylla_version = columns.Text()
94
- gemini_command = columns.Text()
95
- gemini_version = columns.Text()
96
- gemini_status = columns.Text()
97
- gemini_seed = columns.Text()
98
- gemini_write_ops = columns.Integer()
99
- gemini_write_errors = columns.Integer()
100
- gemini_read_ops = columns.Integer()
101
- gemini_read_errors = columns.Integer()
102
-
103
- # Performance fields
104
- perf_op_rate_average = columns.Double()
105
- perf_op_rate_total = columns.Double()
106
- perf_avg_latency_99th = columns.Double()
107
- perf_avg_latency_mean = columns.Double()
108
- perf_total_errors = columns.Double()
109
- stress_cmd = columns.Text()
110
-
111
- histograms = columns.List(value_type=columns.Map(key_type=columns.Text(), value_type=columns.UserDefinedType(user_type=PerformanceHDRHistogram)))
112
- test_method = columns.Ascii()
113
-
114
- @classmethod
115
- def _stats_query(cls) -> str:
116
- return ("SELECT id, test_id, group_id, release_id, status, start_time, build_job_url, build_id, "
117
- f"assignee, end_time, investigation_status, heartbeat, scylla_version FROM {cls.table_name()} WHERE build_id IN ? PER PARTITION LIMIT 15")
118
-
119
- @classmethod
120
- def load_test_run(cls, run_id: UUID) -> 'SCTTestRun':
121
- return cls.get(id=run_id)
122
-
123
- @classmethod
124
- def submit_run(cls, request_data: dict) -> 'SCTTestRun':
125
- req = SCTTestRunSubmissionRequest(**request_data)
126
- return cls.from_sct_config(req=req)
127
-
128
- @classmethod
129
- def get_distinct_product_versions(cls, release: ArgusRelease) -> list[str]:
130
- cluster = ScyllaCluster.get()
131
- statement = cluster.prepare(f"SELECT scylla_version FROM {cls.table_name()} WHERE release_id = ?")
132
- rows = cluster.session.execute(query=statement, parameters=(release.id,))
133
- unique_versions = {r["scylla_version"] for r in rows if r["scylla_version"]}
134
-
135
- return sorted(list(unique_versions), reverse=True)
136
-
137
- @classmethod
138
- def get_version_data_for_release(cls, release_name: str):
139
- cluster = ScyllaCluster.get()
140
- release = ArgusRelease.get(name=release_name)
141
- query = cluster.prepare(f"SELECT scylla_version, packages, status FROM {cls.table_name()} WHERE release_id = ?")
142
- rows = cluster.session.execute(query=query, parameters=(release.id,))
143
-
144
- return list(rows)
145
-
146
- @classmethod
147
- def get_perf_results_for_test_name(cls, build_id: str, start_time: float, test_name: str):
148
- cluster = ScyllaCluster.get()
149
- query = cluster.prepare(f"SELECT build_id, packages, scylla_version, test_name, perf_op_rate_average, perf_op_rate_total, "
150
- "perf_avg_latency_99th, perf_avg_latency_mean, perf_total_errors, id, start_time, build_job_url"
151
- f" FROM {cls.table_name()} WHERE build_id = ? AND start_time < ? AND test_name = ? ALLOW FILTERING")
152
- rows = cluster.session.execute(query=query, parameters=(build_id, start_time, test_name))
153
-
154
- return list(rows)
155
-
156
- @classmethod
157
- def init_sct_run(cls, req: SCTTestRunSubmissionRequest):
158
- run = cls()
159
- run.build_id = req.job_name
160
- run.assign_categories()
161
- try:
162
- run.assignee = run.get_scheduled_assignee()
163
- except _DoesNotExist:
164
- run.assignee = None
165
- run.start_time = datetime.utcnow()
166
- run.id = UUID(req.run_id) # pylint: disable=invalid-name
167
- run.scm_revision_id = req.commit_id
168
- if req.origin_url:
169
- run.origin_url = req.origin_url
170
- run.branch_name = req.branch_name
171
- run.started_by = req.started_by
172
- run.build_job_url = req.job_url
173
-
174
- return run
175
-
176
- @classmethod
177
- def from_sct_config(cls, req: SCTTestRunSubmissionRequest):
178
- try:
179
- run = cls.get(id=req.run_id)
180
- except cls.DoesNotExist:
181
- run = cls.init_sct_run(req)
182
- run.save()
183
-
184
- if req.sct_config:
185
- backend = req.sct_config.get("cluster_backend")
186
- if duration_override := req.sct_config.get("stress_duration"):
187
- run.stress_duration = float(duration_override)
188
- region_key = SCT_REGION_PROPERTY_MAP.get(backend, SCT_REGION_PROPERTY_MAP["default"])
189
- raw_regions = req.sct_config.get(region_key) or "undefined_region"
190
- regions = raw_regions.split() if isinstance(raw_regions, str) else raw_regions
191
- primary_region = regions[0]
192
- if req.runner_public_ip: # NOTE: Legacy support, not needed otherwise
193
- run.sct_runner_host = CloudInstanceDetails(
194
- public_ip=req.runner_public_ip,
195
- private_ip=req.runner_private_ip,
196
- provider=backend,
197
- region=primary_region,
198
- )
199
- run.cloud_setup = ResourceSetup.get_resource_setup(backend=backend, sct_config=req.sct_config)
200
-
201
- run.config_files = req.sct_config.get("config_files")
202
- run.region_name = regions
203
- run.test_method = req.sct_config.get("test_method")
204
- run.save()
205
-
206
- return run
207
-
208
- def get_resources(self) -> list[CloudResource]:
209
- return self.allocated_resources
210
-
211
- def get_nemeses(self) -> list[NemesisRunInfo]:
212
- return self.nemesis_data
213
-
214
- def get_events(self) -> list[EventsBySeverity]:
215
- return self.events
216
-
217
- def submit_product_version(self, version: str):
218
- self.scylla_version = version
219
-
220
- def finish_run(self, payload: dict = None):
221
- self.end_time = datetime.utcnow()
222
-
223
- def submit_logs(self, logs: list[dict]):
224
- for log in logs:
225
- self.logs.append((log["log_name"], log["log_link"]))
226
-
227
- def add_screenshot(self, screenshot_link: str):
228
- self.screenshots.append(screenshot_link)
229
-
230
- def add_nemesis(self, nemesis: NemesisRunInfo):
231
- self.nemesis_data.append(nemesis)
232
-
233
- def _add_new_event_type(self, event: EventsBySeverity):
234
- self.events.append(event)
235
-
236
- def _collect_event_message(self, event: EventsBySeverity, message: str):
237
- if len(event.last_events) >= 100:
238
- event.last_events = event.last_events[1:]
239
-
240
- event.event_amount += 1
241
- event.last_events.append(message)
242
-
243
- def add_event(self, event_severity: str, event_message: str):
244
- try:
245
- event = next(filter(lambda v: v.severity ==
246
- event_severity, self.events))
247
- except StopIteration:
248
- event = EventsBySeverity(
249
- severity=event_severity, event_amount=0, last_events=[])
250
- self._add_new_event_type(event)
251
-
252
- self._collect_event_message(event, event_message)
253
-
254
- def sut_timestamp(self) -> float:
255
- """converts scylla-server date to timestamp and adds revision in subseconds precision to diffirentiate
256
- scylla versions from the same day. It's not perfect, but we don't know exact version time."""
257
- try:
258
- scylla_package_upgraded = [package for package in self.packages if package.name == "scylla-server-upgraded"][0]
259
- except IndexError:
260
- scylla_package_upgraded = None
261
- try:
262
- scylla_package = [package for package in self.packages if package.name == "scylla-server"][0]
263
- except IndexError:
264
- raise ValueError("Scylla package not found in packages - cannot determine SUT timestamp")
265
- return (datetime.strptime(scylla_package.date, '%Y%m%d').replace(tzinfo=timezone.utc).timestamp()
266
- + int(scylla_package.revision_id, 16) % 1000000 / 1000000)
267
-
268
-
269
- class SCTJunitReports(Model):
270
- test_id = columns.UUID(primary_key=True, partition_key=True, required=True)
271
- file_name = columns.Text(primary_key=True, required=True)
272
- report = columns.Text(required=True)
@@ -1,101 +0,0 @@
1
- from time import time
2
- from cassandra.cqlengine.usertype import UserType
3
- from cassandra.cqlengine import columns
4
-
5
- from argus.backend.util.enums import ResourceState
6
-
7
-
8
- class PackageVersion(UserType):
9
- __type_name__ = "PackageVersion_v2"
10
- name = columns.Text()
11
- version = columns.Text()
12
- date = columns.Text()
13
- revision_id = columns.Text()
14
- build_id = columns.Text()
15
-
16
-
17
- def __eq__(self, other):
18
- if isinstance(other, PackageVersion):
19
- return all(getattr(self, a) == getattr(other, a) for a in ["name", "version", "date", "revision_id", "build_id"])
20
- return super().__eq__(other)
21
-
22
-
23
- class CloudInstanceDetails(UserType):
24
- __type_name__ = "CloudInstanceDetails_v3"
25
- provider = columns.Text()
26
- region = columns.Text()
27
- public_ip = columns.Text()
28
- private_ip = columns.Text()
29
- dc_name = columns.Text()
30
- rack_name = columns.Text()
31
- creation_time = columns.Integer(default=lambda: int(time()))
32
- termination_time = columns.Integer(default=lambda: 0)
33
- termination_reason = columns.Text(default=lambda: "")
34
- shards_amount = columns.Integer(default=lambda: 0)
35
-
36
-
37
- class CloudNodesInfo(UserType):
38
- __type_name__ = "CloudNodesInfo"
39
- image_id = columns.Text()
40
- instance_type = columns.Text()
41
- node_amount = columns.Integer()
42
- post_behaviour = columns.Text()
43
-
44
-
45
- class CloudSetupDetails(UserType):
46
- __type_name__ = "CloudSetupDetails"
47
- db_node = columns.UserDefinedType(user_type=CloudNodesInfo)
48
- loader_node = columns.UserDefinedType(user_type=CloudNodesInfo)
49
- monitor_node = columns.UserDefinedType(user_type=CloudNodesInfo)
50
- backend = columns.Text()
51
-
52
-
53
- class CloudResource(UserType):
54
- __type_name__ = "CloudResource_v3"
55
- name = columns.Text()
56
- state = columns.Text(default=lambda: ResourceState.RUNNING)
57
- resource_type = columns.Text()
58
- instance_info = columns.UserDefinedType(user_type=CloudInstanceDetails)
59
-
60
- def get_instance_info(self) -> CloudInstanceDetails:
61
- return self.instance_info
62
-
63
-
64
- class EventsBySeverity(UserType):
65
- __type_name__ = "EventsBySeverity"
66
- severity = columns.Text()
67
- event_amount = columns.Integer()
68
- last_events = columns.List(value_type=columns.Text())
69
-
70
-
71
- class NodeDescription(UserType):
72
- __type_name__ = "NodeDescription"
73
- name = columns.Text()
74
- ip = columns.Text()
75
- shards = columns.Integer()
76
-
77
-
78
- class NemesisRunInfo(UserType):
79
- __type_name__ = "NemesisRunInfo"
80
-
81
- class_name = columns.Text()
82
- name = columns.Text()
83
- duration = columns.Integer()
84
- target_node = columns.UserDefinedType(user_type=NodeDescription)
85
- status = columns.Text()
86
- start_time = columns.Integer()
87
- end_time = columns.Integer()
88
- stack_trace = columns.Text()
89
-
90
-
91
- class PerformanceHDRHistogram(UserType):
92
- start_time = columns.Integer()
93
- percentile_90 = columns.Float()
94
- percentile_50 = columns.Float()
95
- percentile_99_999 = columns.Float()
96
- percentile_95 = columns.Float()
97
- end_time = columns.Float()
98
- percentile_99_99 = columns.Float()
99
- percentile_99 = columns.Float()
100
- stddev = columns.Float()
101
- percentile_99_9 = columns.Float()
@@ -1,113 +0,0 @@
1
- from datetime import datetime
2
- from uuid import UUID, uuid4
3
- from cassandra.cqlengine import columns
4
- from cassandra.cqlengine.usertype import UserType
5
- from cassandra.cqlengine.models import Model
6
- from argus.backend.db import ScyllaCluster
7
- from argus.backend.models.web import ArgusRelease
8
- from argus.backend.plugins.core import PluginModelBase
9
- from argus.backend.plugins.sirenada.types import RawSirenadaRequest, SirenadaPluginException
10
- from argus.backend.util.enums import TestStatus
11
-
12
-
13
- class SirenadaTest(UserType):
14
- test_name = columns.Text()
15
- class_name = columns.Text()
16
- file_name = columns.Text()
17
- browser_type = columns.Text()
18
- cluster_type = columns.Text()
19
- status = columns.Text()
20
- duration = columns.Float()
21
- message = columns.Text()
22
- start_time = columns.DateTime()
23
- stack_trace = columns.Text()
24
- screenshot_file = columns.Text()
25
- s3_folder_id = columns.Text()
26
- requests_file = columns.Text()
27
- sirenada_test_id = columns.Text()
28
- sirenada_user = columns.Text()
29
- sirenada_password = columns.Text()
30
-
31
-
32
-
33
- class SirenadaRun(PluginModelBase):
34
- _plugin_name = "sirenada"
35
- __table_name__ = "sirenada_run"
36
- logs = columns.Map(key_type=columns.Text(), value_type=columns.Text())
37
- # TODO: Legacy field name, should be renamed to product_version and abstracted
38
- scylla_version = columns.Text()
39
- region = columns.Text()
40
- sirenada_test_ids = columns.List(value_type=columns.Text())
41
- s3_folder_ids = columns.List(value_type=columns.Tuple(columns.Text(), columns.Text()))
42
- browsers = columns.List(value_type=columns.Text())
43
- clusters = columns.List(value_type=columns.Text())
44
- sct_test_id = columns.UUID()
45
- results = columns.List(value_type=columns.UserDefinedType(user_type=SirenadaTest))
46
-
47
- @classmethod
48
- def _stats_query(cls) -> str:
49
- return ("SELECT id, test_id, group_id, release_id, status, start_time, build_job_url, build_id, "
50
- f"assignee, end_time, investigation_status, heartbeat, scylla_version FROM {cls.table_name()} WHERE build_id IN ? PER PARTITION LIMIT 15")
51
-
52
- @classmethod
53
- def get_distinct_product_versions(cls, release: ArgusRelease, cluster: ScyllaCluster = None) -> list[str]:
54
- if not cluster:
55
- cluster = ScyllaCluster.get()
56
- statement = cluster.prepare(f"SELECT scylla_version FROM {cls.table_name()} WHERE release_id = ?")
57
- rows = cluster.session.execute(query=statement, parameters=(release.id,))
58
- unique_versions = {r["scylla_version"] for r in rows if r["scylla_version"]}
59
-
60
- return sorted(list(unique_versions), reverse=True)
61
-
62
- def submit_product_version(self, version: str):
63
- self.scylla_version = version
64
-
65
- def submit_logs(self, logs: dict[str, str]):
66
- raise SirenadaPluginException("Log submission is not supported for Sirenada")
67
-
68
- def finish_run(self, payload: dict = None):
69
- raise SirenadaPluginException("Sirenada runs do not need finalization")
70
-
71
- @classmethod
72
- def load_test_run(cls, run_id: UUID) -> 'SirenadaRun':
73
- return cls.get(id=run_id)
74
-
75
- @classmethod
76
- def submit_run(cls, request_data: RawSirenadaRequest) -> 'SirenadaRun':
77
- try:
78
- run = cls.get(id=UUID(request_data["run_id"]))
79
- except cls.DoesNotExist:
80
- run = cls()
81
- run.id = request_data["run_id"] # FIXME: Validate pls
82
- run.build_id = request_data["build_id"]
83
- run.start_time = datetime.utcnow()
84
- run.assign_categories()
85
- run.build_job_url = request_data["build_job_url"]
86
- run.region = request_data["region"]
87
- run.status = TestStatus.PASSED.value
88
- try:
89
- run.assignee = run.get_scheduled_assignee()
90
- except Model.DoesNotExist:
91
- run.assignee = None
92
-
93
- for raw_case in request_data["results"]:
94
- case = SirenadaTest(**raw_case)
95
- if case.status in ["failed", "error"] and run.status not in [TestStatus.FAILED.value, TestStatus.ABORTED.value]:
96
- run.status = TestStatus.FAILED.value
97
- run.results.append(case)
98
-
99
- if case.sirenada_test_id not in run.sirenada_test_ids:
100
- run.sirenada_test_ids.append(case.sirenada_test_id)
101
-
102
- if case.browser_type not in run.browsers:
103
- run.browsers.append(case.browser_type)
104
-
105
- if case.cluster_type not in run.clusters:
106
- run.clusters.append(case.cluster_type)
107
-
108
- if (case.s3_folder_id, case.sirenada_test_id) not in run.s3_folder_ids and case.s3_folder_id:
109
- run.s3_folder_ids.append((case.s3_folder_id, case.sirenada_test_id))
110
-
111
- run.save()
112
-
113
- return run
@@ -1,17 +0,0 @@
1
- from flask import Blueprint
2
-
3
- from argus.backend.plugins.core import PluginInfoBase, PluginModelBase
4
- from argus.backend.plugins.sirenada.model import SirenadaRun, SirenadaTest
5
-
6
-
7
- class PluginInfo(PluginInfoBase):
8
- # pylint: disable=too-few-public-methods
9
- name: str = "sirenada"
10
- model: PluginModelBase = SirenadaRun
11
- controller: Blueprint = None
12
- all_models = [
13
- SirenadaRun
14
- ]
15
- all_types = [
16
- SirenadaTest
17
- ]
@@ -1,27 +0,0 @@
1
-
2
- from flask import g, current_app, session
3
-
4
- from argus.backend.db import ScyllaCluster
5
- from argus.backend.models.web import (
6
- ArgusGithubIssue,
7
- ArgusRelease,
8
- ArgusGroup,
9
- ArgusTest,
10
- ArgusSchedule,
11
- ArgusScheduleAssignee,
12
- ArgusScheduleGroup,
13
- ArgusScheduleTest,
14
- ArgusTestRunComment,
15
- ArgusEvent,
16
- ArgusEventTypes,
17
- ReleasePlannerComment,
18
- User,
19
- UserOauthToken,
20
- WebFileStorage,
21
- )
22
-
23
-
24
- class AdminService:
25
- def __init__(self, database_session=None):
26
- self.session = database_session if database_session else ScyllaCluster.get_session()
27
- self.database = ScyllaCluster.get()