argus-alm 0.12.3__py3-none-any.whl → 0.12.4b1__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 (31) hide show
  1. argus/backend/controller/admin_api.py +26 -0
  2. argus/backend/controller/api.py +26 -1
  3. argus/backend/controller/main.py +21 -0
  4. argus/backend/controller/testrun_api.py +16 -0
  5. argus/backend/controller/view_api.py +162 -0
  6. argus/backend/models/web.py +16 -0
  7. argus/backend/plugins/core.py +25 -10
  8. argus/backend/plugins/driver_matrix_tests/controller.py +39 -0
  9. argus/backend/plugins/driver_matrix_tests/model.py +251 -3
  10. argus/backend/plugins/driver_matrix_tests/raw_types.py +27 -0
  11. argus/backend/plugins/driver_matrix_tests/service.py +18 -0
  12. argus/backend/plugins/driver_matrix_tests/udt.py +14 -13
  13. argus/backend/plugins/generic/model.py +5 -2
  14. argus/backend/plugins/sct/service.py +13 -1
  15. argus/backend/service/argus_service.py +116 -20
  16. argus/backend/service/build_system_monitor.py +37 -7
  17. argus/backend/service/jenkins_service.py +2 -1
  18. argus/backend/service/release_manager.py +14 -0
  19. argus/backend/service/stats.py +147 -11
  20. argus/backend/service/testrun.py +44 -5
  21. argus/backend/service/views.py +258 -0
  22. argus/backend/template_filters.py +7 -0
  23. argus/backend/util/common.py +14 -2
  24. argus/client/driver_matrix_tests/cli.py +110 -0
  25. argus/client/driver_matrix_tests/client.py +56 -193
  26. argus_alm-0.12.4b1.dist-info/METADATA +129 -0
  27. {argus_alm-0.12.3.dist-info → argus_alm-0.12.4b1.dist-info}/RECORD +30 -27
  28. {argus_alm-0.12.3.dist-info → argus_alm-0.12.4b1.dist-info}/entry_points.txt +1 -0
  29. argus_alm-0.12.3.dist-info/METADATA +0 -207
  30. {argus_alm-0.12.3.dist-info → argus_alm-0.12.4b1.dist-info}/LICENSE +0 -0
  31. {argus_alm-0.12.3.dist-info → argus_alm-0.12.4b1.dist-info}/WHEEL +0 -0
@@ -1,216 +1,79 @@
1
- from functools import reduce
2
- from datetime import datetime
3
- from typing import TypedDict, Literal
4
- import re
5
- import logging
6
1
  from uuid import UUID
7
- from pathlib import Path
8
- from pprint import pformat
9
- from glob import glob
10
- from xml.etree import ElementTree
11
-
12
2
  from argus.backend.util.enums import TestStatus
13
3
  from argus.client.base import ArgusClient
14
- from argus.backend.plugins.driver_matrix_tests.raw_types import RawMatrixTestResult, RawMatrixTestCase
15
-
16
-
17
- LOGGER = logging.getLogger(__name__)
18
-
19
- TestTypeType = Literal['java', 'cpp', 'python', 'gocql']
20
-
21
- class AdaptedXUnitData(TypedDict):
22
- timestamp: str
23
-
24
-
25
- def python_driver_matrix_adapter(xml: ElementTree.ElementTree) -> AdaptedXUnitData:
26
- testsuites = list(xml.getroot().iter("testsuite"))
27
-
28
- return {
29
- "timestamp": testsuites[0].attrib.get("timestamp"),
30
- }
31
-
32
-
33
- def java_driver_matrix_adapter(xml: ElementTree.ElementTree) -> AdaptedXUnitData:
34
- testsuites = xml.getroot()
35
- ts_now = datetime.utcnow().timestamp()
36
- try:
37
- time_taken = float(testsuites.attrib.get("time"))
38
- except ValueError:
39
- time_taken = 0.0
40
-
41
- timestamp = datetime.utcfromtimestamp(ts_now - time_taken).isoformat()
42
-
43
- return {
44
- "timestamp": timestamp,
45
- }
46
-
47
-
48
- def cpp_driver_matrix_adapter(xml: ElementTree.ElementTree) -> AdaptedXUnitData:
49
- testsuites = xml.getroot()
50
-
51
- return {
52
- "timestamp": testsuites.attrib.get("timestamp"),
53
- }
54
-
55
-
56
- def gocql_driver_matrix_adapter(xml: ElementTree.ElementTree) -> AdaptedXUnitData:
57
- testsuites = list(xml.getroot().iter("testsuite"))
58
-
59
- return {
60
- "timestamp": testsuites[0].attrib.get("timestamp"),
61
- }
62
-
63
-
64
- def generic_adapter(xml: ElementTree.ElementTree) -> AdaptedXUnitData:
65
- return {
66
- "timestamp": datetime.utcnow().isoformat()
67
- }
68
4
 
69
5
 
70
6
  class ArgusDriverMatrixClient(ArgusClient):
71
7
  test_type = "driver-matrix-tests"
72
- schema_version: None = "v1"
8
+ schema_version: None = "v2"
73
9
 
74
- TEST_ADAPTERS = {
75
- "java": java_driver_matrix_adapter,
76
- "cpp": cpp_driver_matrix_adapter,
77
- "python": python_driver_matrix_adapter,
78
- "gocql": gocql_driver_matrix_adapter,
79
- }
10
+ class Routes(ArgusClient.Routes):
11
+ SUBMIT_DRIVER_RESULT = "/driver_matrix/result/submit"
12
+ SUBMIT_DRIVER_FAILURE = "/driver_matrix/result/fail"
13
+ SUBMIT_ENV = "/driver_matrix/env/submit"
80
14
 
81
15
  def __init__(self, run_id: UUID, auth_token: str, base_url: str, api_version="v1") -> None:
82
16
  super().__init__(auth_token, base_url, api_version)
83
17
  self.run_id = run_id
84
18
 
85
- def parse_build_environment(self, env_path: str) -> dict[str, str]:
86
- with open(Path(env_path), mode="rt", encoding="utf-8") as env_file:
87
- raw_env = env_file.read()
88
-
89
- result = {}
90
- for line in raw_env.split("\n"):
91
- if not line:
92
- continue
93
- LOGGER.debug("ENV: %s", line)
94
- key, val = line.split(": ")
95
- result[key] = val.strip()
96
-
97
- return result
98
-
99
- def get_test_cases(self, cases: list[ElementTree.Element]) -> list[RawMatrixTestCase]:
100
- raw_cases = []
101
- for case in cases:
102
- children = list(case.findall("./*"))
103
- if len(children) > 0:
104
- status = children[0].tag
105
- message = f"{children[0].attrib.get('message', 'no-message')} ({children[0].attrib.get('type', 'no-type')})"
106
- else:
107
- status = "passed"
108
- message = ""
109
-
110
- raw_cases.append({
111
- "name": case.attrib["name"],
112
- "status": status,
113
- "time": float(case.attrib.get("time", 0.0)),
114
- "classname": case.attrib.get("classname", ""),
115
- "message": message,
116
- })
117
-
118
- return raw_cases
119
-
120
- def get_driver_info(self, xml_name: str, test_type: TestTypeType) -> dict[str, str]:
121
- if test_type == "cpp":
122
- filename_re = r"TEST-(?P<driver_name>[\w]*)-(?P<version>[\d\.]*)\.xml"
123
- else:
124
- filename_re = r"(?P<name>[\w]*)\.(?P<driver_name>[\w]*)\.(?P<proto>v\d)\.(?P<version>[\d\.]*)\.xml"
125
-
126
- match = re.match(filename_re, xml_name)
127
-
128
- return match.groupdict() if match else {}
129
-
130
- def get_passed_count(self, suite_attribs: dict[str, str]) -> int:
131
- if (pass_count := suite_attribs.get("passed")):
132
- return int(pass_count)
133
- total = int(suite_attribs.get("tests", 0))
134
- errors = int(suite_attribs.get("errors", 0))
135
- skipped = int(suite_attribs.get("skipped", 0))
136
- failures = int(suite_attribs.get("failures", 0))
137
-
138
- return total - errors - skipped - failures
139
-
140
- def parse_result_xml(self, xml_path: Path, test_type: TestTypeType) -> RawMatrixTestResult:
141
- with xml_path.open(mode="rt", encoding="utf-8") as xml_file:
142
- xml = ElementTree.parse(source=xml_file)
143
- LOGGER.info("%s", pformat(xml))
144
- testsuites = xml.getroot()
145
- adapted_data = self.TEST_ADAPTERS.get(test_type, generic_adapter)(xml)
146
-
147
- driver_info = self.get_driver_info(xml_path.name, test_type)
148
- test_collection = {
149
- "timestamp": adapted_data["timestamp"],
150
- "name": xml_path.stem,
151
- "driver_name": driver_info.get("driver_name"),
152
- "tests": 0,
153
- "failures": 0,
154
- "errors": 0,
155
- "disabled": 0,
156
- "skipped": 0,
157
- "passed": 0,
158
- "time": 0.0,
159
- }
160
- all_suites = []
161
- for suite in testsuites.iter("testsuite"):
162
- raw_suite = {
163
- "name": suite.attrib["name"],
164
- "tests": int(suite.attrib.get("tests", 0)),
165
- "failures": int(suite.attrib.get("failures", 0)),
166
- "disabled": int(0),
167
- "passed": self.get_passed_count(suite.attrib),
168
- "skipped": int(suite.attrib.get("skipped", 0)),
169
- "errors": int(suite.attrib.get("errors", 0)),
170
- "time": float(suite.attrib["time"]),
171
- "cases": self.get_test_cases(list(suite.iter("testcase")))
172
- }
173
- all_suites.append(raw_suite)
174
- test_collection["tests"] += raw_suite["tests"]
175
- test_collection["failures"] += raw_suite["failures"]
176
- test_collection["errors"] += raw_suite["errors"]
177
- test_collection["disabled"] += raw_suite["disabled"]
178
- test_collection["skipped"] += raw_suite["skipped"]
179
- test_collection["passed"] += raw_suite["passed"]
180
- test_collection["time"] += raw_suite["time"]
181
-
182
- return {
183
- **test_collection,
184
- "suites": all_suites
185
- }
186
-
187
- def get_results(self, result_path: str, test_type: TestTypeType) -> list[RawMatrixTestResult]:
188
- xmls = glob(f"{result_path}/**/*.xml", recursive=True)
189
- LOGGER.info("Will use following XMLs: %s", pformat(xmls))
190
- results = []
191
- for xml in xmls:
192
- result = self.parse_result_xml(Path(xml), test_type)
193
- results.append(result)
194
- return results
195
-
196
- def submit(self, build_id: str, build_url: str, env_path: str, result_path: str, test_type: TestTypeType):
197
- env = self.parse_build_environment(env_path)
198
- results = self.get_results(result_path, test_type)
199
-
200
- self.submit_driver_matrix_run(job_name=build_id, job_url=build_url, test_environment=env, results=results)
201
-
202
- def submit_driver_matrix_run(self, job_name: str, job_url: str,
203
- results: list[RawMatrixTestResult], test_environment: dict[str, str]) -> None:
19
+ def submit_driver_matrix_run(self, job_name: str, job_url: str) -> None:
204
20
  response = super().submit_run(run_type=self.test_type, run_body={
205
21
  "run_id": str(self.run_id),
206
22
  "job_name": job_name,
207
- "job_url": job_url,
208
- "test_environment": test_environment,
209
- "matrix_results": results
23
+ "job_url": job_url
210
24
  })
211
25
 
212
26
  self.check_response(response)
213
27
 
28
+ def submit_driver_result(self, driver_name: str, driver_type: str, raw_junit_data: bytes):
29
+ """
30
+ Submit results of a single driver run
31
+ """
32
+ response = self.post(
33
+ endpoint=self.Routes.SUBMIT_DRIVER_RESULT,
34
+ location_params={},
35
+ body={
36
+ **self.generic_body,
37
+ "run_id": str(self.run_id),
38
+ "driver_name": driver_name,
39
+ "driver_type": driver_type,
40
+ "raw_xml": str(raw_junit_data, encoding="utf-8"),
41
+ }
42
+ )
43
+ self.check_response(response)
44
+
45
+ def submit_driver_failure(self, driver_name: str, driver_type: str, failure_reason: str):
46
+ """
47
+ Submit a failure to run of a specific driver test
48
+ """
49
+ response = self.post(
50
+ endpoint=self.Routes.SUBMIT_DRIVER_FAILURE,
51
+ location_params={},
52
+ body={
53
+ **self.generic_body,
54
+ "run_id": str(self.run_id),
55
+ "driver_name": driver_name,
56
+ "driver_type": driver_type,
57
+ "failure_reason": failure_reason,
58
+ }
59
+ )
60
+ self.check_response(response)
61
+
62
+ def submit_env(self, env_info: str):
63
+ """
64
+ Submit env-info file (Build-00.txt)
65
+ """
66
+ response = self.post(
67
+ endpoint=self.Routes.SUBMIT_ENV,
68
+ location_params={},
69
+ body={
70
+ **self.generic_body,
71
+ "run_id": str(self.run_id),
72
+ "raw_env": env_info,
73
+ }
74
+ )
75
+ self.check_response(response)
76
+
214
77
  def set_matrix_status(self, status: TestStatus):
215
78
  response = super().set_status(run_type=self.test_type, run_id=self.run_id, new_status=status)
216
79
  self.check_response(response)
@@ -0,0 +1,129 @@
1
+ Metadata-Version: 2.1
2
+ Name: argus-alm
3
+ Version: 0.12.4b1
4
+ Summary: Argus
5
+ Home-page: https://github.com/scylladb/argus
6
+ License: Apache-2.0
7
+ Author: Alexey Kartashov
8
+ Author-email: alexey.kartashov@scylladb.com
9
+ Requires-Python: >=3.10,<4.0
10
+ Classifier: License :: OSI Approved :: Apache Software License
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.10
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Requires-Dist: click (>=8.1.3,<9.0.0)
16
+ Requires-Dist: requests (>=2.26.0,<3.0.0)
17
+ Project-URL: Repository, https://github.com/scylladb/argus
18
+ Description-Content-Type: text/markdown
19
+
20
+ # Argus
21
+
22
+ ## Description
23
+
24
+ Argus is a test tracking system intended to provide observability into automated test pipelines which use long-running resources. It allows observation of a test status, its events and its allocated resources. It also allows easy comparison between particular runs of a specific test.
25
+
26
+ ## Installation notes
27
+
28
+ ### Development
29
+
30
+ For development setup instructions, see [dev-setup.md](./docs/dev-setup.md).
31
+
32
+ ### Prerequisites
33
+
34
+ - Python >=3.10.0 (system-wide or pyenv)
35
+
36
+ - NodeJS >=16 (with npm)
37
+
38
+ - Yarn (can be installed globally with `npm -g install yarn`)
39
+
40
+ - nginx
41
+
42
+ - poetry >=1.2.0b1
43
+
44
+ ### From source
45
+
46
+ #### Production
47
+
48
+ Perform the following steps:
49
+
50
+ Create a user that will be used by uwsgi:
51
+
52
+ ```bash
53
+ useradd -m -s /bin/bash argus
54
+ sudo -iu argus
55
+ ```
56
+
57
+ (Optional) Install pyenv and create a virtualenv for this user:
58
+
59
+ ```bash
60
+ pyenv install 3.10.0
61
+ pyenv virtualenv argus
62
+ pyenv activate argus
63
+ ```
64
+
65
+ Clone the project into a directory somewhere where user has full write permissions
66
+
67
+ ```bash
68
+ git clone https://github.com/scylladb/argus ~/app
69
+ cd ~/app
70
+ ```
71
+
72
+ Install project dependencies:
73
+
74
+ ```bash
75
+ poetry install --with default,dev,web-backend,docker-image
76
+ yarn install
77
+ ```
78
+
79
+ Compile frontend files from `/frontend` into `/public/dist`
80
+
81
+ ```bash
82
+ yarn webpack
83
+ ```
84
+
85
+ Create a `argus.local.yaml` configuration file (used to configure database connection) and a `argus_web.yaml` (used for webapp secrets) in your application install directory.
86
+
87
+ ```bash
88
+ cp argus_web.example.yaml argus_web.yaml
89
+ cp argus.yaml argus.local.yaml
90
+ ```
91
+
92
+ Open `argus.local.yaml` and add the database connection information (contact_points, user, password and keyspace name).
93
+
94
+ Open `argus_web.yaml` and change the `SECRET_KEY` value to something secure, like a sha512 digest of random bytes. Fill out GITHUB_* variables with their respective values.
95
+
96
+ Copy nginx configuration file from `docs/configs/argus.nginx.conf` to nginx virtual hosts directory:
97
+
98
+ Ubuntu:
99
+
100
+ ```bash
101
+ sudo cp docs/configs/argus.nginx.conf /etc/nginx/sites-available/argus
102
+ sudo ln -s /etc/nginx/sites-enabled/argus /etc/nginx/sites-available/argus
103
+ ```
104
+
105
+ RHEL/Centos/Alma/Fedora:
106
+
107
+ ```bash
108
+ sudo cp docs/configs/argus.nginx.conf /etc/nginx/conf.d/argus.conf
109
+ ```
110
+
111
+ Adjust the webhost settings in that file as necessary, particularly `listen` and `server_name` directives.
112
+
113
+ Copy systemd service file from `docs/config/argus.service` to `/etc/systemd/system` directory:
114
+
115
+ ```bash
116
+ sudo cp docs/config/argus.service /etc/systemd/system
117
+ ```
118
+
119
+ Open it and adjust the path to the `start_argus.sh` script in the `ExecStart=` directive and the user/group, then reload systemd daemon configuration and enable (and optionally start) the service.
120
+
121
+ WARNING: `start_argus.sh` assumes pyenv is installed into `~/.pyenv`
122
+
123
+ ```bash
124
+ sudo systemctl daemon-reload
125
+ sudo systemctl enable --now argus.service
126
+ ```
127
+
128
+
129
+
@@ -4,37 +4,38 @@ argus/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  argus/backend/cli.py,sha256=fWSS1m0mhQeCwfH58Qfs4Cicxc95IKi9vwmQn3SUYs0,1346
5
5
  argus/backend/controller/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  argus/backend/controller/admin.py,sha256=2z29RX7ZQO_VTklSKH9RrEj-Ag2SsvyOaIzWDKr0ahQ,575
7
- argus/backend/controller/admin_api.py,sha256=9CkewYmnqKJpSKoXyKDMxuMziyAWQ1lRD3dMSh5R3PI,6249
8
- argus/backend/controller/api.py,sha256=_hLJcO__jFMB4kFonkwVgUkYdLLQTSvCrCLQKKrvgr8,13450
7
+ argus/backend/controller/admin_api.py,sha256=I2eQbU5f5rlQeL7eI4t9mRoxM3SJ5O-6fqLsHf0wcEU,6975
8
+ argus/backend/controller/api.py,sha256=HvjpR4ug5NXiTdBlrFTBeq57YQ5Vl_jca-IT35sAuas,14203
9
9
  argus/backend/controller/auth.py,sha256=nwF_5uZLxPOCLm2ljLyw2OxGur6fmPM7WAAoGJLI_kk,2030
10
10
  argus/backend/controller/client_api.py,sha256=SM6HRlnoguxkPrqHzm42b5JsoQ2b8-1hTtfLWe832hc,3007
11
- argus/backend/controller/main.py,sha256=XQLwGPXm0MlDIq-Bb84xYiiksmbE0oSjDAwMdDd14BE,8296
11
+ argus/backend/controller/main.py,sha256=gYA0pqUBlLhpedkOetUX0V82qfe489frOEHPEtM-iHQ,8992
12
12
  argus/backend/controller/notification_api.py,sha256=wz7V4nE6Mxclpq78P8gNnCyeQ7xA9BBJjZ-dPhLLd2I,1964
13
13
  argus/backend/controller/notifications.py,sha256=zMSJln72BGU6Q_nQvJesMnuvJ57Ucbov4M2ZI-37Bxo,290
14
14
  argus/backend/controller/team.py,sha256=G6LdIBaYgfG0Qr4RhNQ53MZVdh4wcuotsIIpFwhTJ3w,3101
15
15
  argus/backend/controller/team_ui.py,sha256=B7N1_Kzl6Rac8BV3FbKj55pGAS_dht47rYhAi94PC8A,589
16
- argus/backend/controller/testrun_api.py,sha256=5VWJnYlPuh3GQyDsKqE0b1zw7rFGlGTg16BHCsiYnB4,11883
16
+ argus/backend/controller/testrun_api.py,sha256=92VI_FngMxr9SpKMhlEdSzambvbL4dpMtfx26Z3_Eso,12264
17
+ argus/backend/controller/view_api.py,sha256=rI7LwcS7keK37nYx76D9StFV_rLHcNkHan8OhFgBrhM,4106
17
18
  argus/backend/db.py,sha256=bBiraYD05Qex28yZHjSP1bRlcMsc6oTYGt792zXmaHo,4101
18
19
  argus/backend/error_handlers.py,sha256=IEjz7Vzfldv1PTOeHrpRWmRsgBrHtAW0PXHUJZDovAE,480
19
20
  argus/backend/events/event_processors.py,sha256=bsmBayiXvlGn3aqiT2z9WgwnVBRtn2cRqkgn4pLodck,1291
20
21
  argus/backend/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
- argus/backend/models/web.py,sha256=dUWQQaw5TivSCOuGQqAxIH9yVraGXX7sayNBloIS3n8,12206
22
+ argus/backend/models/web.py,sha256=nl9sCOaPT53UKcZwguQB1DVm523Scgw7d2Rs4xaC9x4,12943
22
23
  argus/backend/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- argus/backend/plugins/core.py,sha256=fZG24qysFyOfjBPAdEIHb0UXIQYI3szJZvldqBTBIC0,7910
24
- argus/backend/plugins/driver_matrix_tests/controller.py,sha256=9Q6QCripzM528SGsQnYupM6k7HW7hUzkNyjJFiXXfEw,739
25
- argus/backend/plugins/driver_matrix_tests/model.py,sha256=Qto0_TQec-ZDJzAsn28P3fEWfHloMtsNSRUS3bJ4ZJ0,6844
24
+ argus/backend/plugins/core.py,sha256=kMp2zrEcgAZP0D4yw_dzY5uD8DcC19CoZ_E7urH0f0k,8608
25
+ argus/backend/plugins/driver_matrix_tests/controller.py,sha256=GdPpProzsVXQw8A4h2IS8inUPdr_Q4IN93i6ocOThS8,2213
26
+ argus/backend/plugins/driver_matrix_tests/model.py,sha256=Wqot8rOYqroYV7cn60ltlarnuIuYrL2qyrk13NwLeT4,15419
26
27
  argus/backend/plugins/driver_matrix_tests/plugin.py,sha256=72ESU7s8C6ovVMfJTlYwtaokdvRp_HJF1_czm1UMhKg,745
27
- argus/backend/plugins/driver_matrix_tests/raw_types.py,sha256=A108HCnv5q0RHfNRhUJrTpRy3fG7sPxr9Sk4gfsbooU,600
28
- argus/backend/plugins/driver_matrix_tests/service.py,sha256=dxb8VGTJLIyVqVrZ4RtzCXgnmS2qg2RAGhcp_SARt9I,1737
29
- argus/backend/plugins/driver_matrix_tests/udt.py,sha256=6lydzF3AQHm3GR5bKEDu1xLPYsLaBL3o-wu9NpabbqA,1134
30
- argus/backend/plugins/generic/model.py,sha256=mX-IgBCxvWj_S_v_b2L4uitHGPR1apCz993uL4bnRD4,3118
28
+ argus/backend/plugins/driver_matrix_tests/raw_types.py,sha256=KwbwsvS52RzOZb7_PT7kkYkChNzRH-MpKoO_eeZNDIk,1153
29
+ argus/backend/plugins/driver_matrix_tests/service.py,sha256=98m6IyPsbenq0O-EtGaW0tiQVuM2yGX41xNCO3icmnc,2524
30
+ argus/backend/plugins/driver_matrix_tests/udt.py,sha256=WRtnJU1dZcLXZJQgfU0mgjNzK_DyVhNgLTzr-aXX8K8,1394
31
+ argus/backend/plugins/generic/model.py,sha256=QLVO7QhGr38Hz0VO-BlDYF7LhRX7Pl049vw4W_VMT8o,3302
31
32
  argus/backend/plugins/generic/plugin.py,sha256=5URbQVUCizrk-KZqb6I0P_8nLUekjYh-Js7ZLKVoBAA,407
32
33
  argus/backend/plugins/generic/types.py,sha256=jlZUcQ7r153ziyl3ZJmix7AzL2G1aX9N_z-4Kw9trWc,267
33
34
  argus/backend/plugins/loader.py,sha256=6PUrMjXKoCSDazMRkUHt8qxpniRhuqhY8Tof8lzeunk,1390
34
35
  argus/backend/plugins/sct/controller.py,sha256=NF11JLoUJ13whghlxRrVex9rLMgFtlkczUAAKAM9vYg,5738
35
36
  argus/backend/plugins/sct/plugin.py,sha256=_sOMcXLoFfeG9jwj_t48C4IFvY87juK8ApR6tfSw6q4,1007
36
37
  argus/backend/plugins/sct/resource_setup.py,sha256=hwfAOu-oKOH42tjtzJhiqwq_MtUE9_HevoFyql8JKqY,10120
37
- argus/backend/plugins/sct/service.py,sha256=e7zuvSMvUSl8pos8VG17TK_1BrRM4Ld2QHzJwOdBTQY,21379
38
+ argus/backend/plugins/sct/service.py,sha256=ygAL85BkyyovJ1xHktlCQJdJS8CrerJZ_Tbr3EXqsg4,22021
38
39
  argus/backend/plugins/sct/testrun.py,sha256=NopC3Gnzf2m65S_E4DedAlgnbFvyaMQH5aLJip6ZPrE,9660
39
40
  argus/backend/plugins/sct/types.py,sha256=Gw1y4iqYguqNqTh_GopLDFho8vuGaOGuK7fjaHYhAOQ,1326
40
41
  argus/backend/plugins/sct/udt.py,sha256=V_x8_yw8rV7Q_QRBYayqtTNsPdZvjzOxWpRhXP1XAzs,3119
@@ -42,19 +43,20 @@ argus/backend/plugins/sirenada/model.py,sha256=KVnI75BacuBryc5lR_Aai-mEOs7CB9xxh
42
43
  argus/backend/plugins/sirenada/plugin.py,sha256=AlQAakwy3u-OqAqqK3RonUR5oDm-JoiwBUDUF3YEVP4,447
43
44
  argus/backend/plugins/sirenada/types.py,sha256=Gm3XMK9YJoozVaeM9XE7n8iRxA6PKBrS23Mo2vJfdLs,697
44
45
  argus/backend/service/admin.py,sha256=_VnWl3CkZBOAie_pPbd9sbXZUpBf2SApyNoFZLfB_QI,637
45
- argus/backend/service/argus_service.py,sha256=t6pkjFOnIWoos_5TnrntwpzgNg6vQYVa_NgWHFIGcM8,24515
46
- argus/backend/service/build_system_monitor.py,sha256=_Bxugk4CCh2z-I-i74QMPe7M8j0dmBMDri2dd3WGVew,7328
46
+ argus/backend/service/argus_service.py,sha256=d1NrCQmcE_1NmkV761dheBL43Vk0n-oP0S4IZtQzJUQ,28832
47
+ argus/backend/service/build_system_monitor.py,sha256=E8Ro1HBMfktxqcCHLPuXwzohkdgrls7pYro-VSG_CMs,8248
47
48
  argus/backend/service/client_service.py,sha256=CS5esppd9s-SgUYE-HVLkfz-MrN8zxPouf9e4VlPV_M,2326
48
49
  argus/backend/service/event_service.py,sha256=iYeqxN2QCYTjYB1WPPv4BEFLXG0Oz3TvskkaK4v9pVY,654
49
- argus/backend/service/jenkins_service.py,sha256=gAEPGHm-HaazHHyVXK5d7uG24oe5t9XlnDjPre-qzWg,9656
50
+ argus/backend/service/jenkins_service.py,sha256=PKmu44kAEWl-Dw7f8gXkKhwRkV4yWy-B4CmFxv7c6-8,9685
50
51
  argus/backend/service/notification_manager.py,sha256=h00Ej_-hH9H7pq0wah_1TH8dnpPyPNsgVJNO1rwJi7o,7011
51
- argus/backend/service/release_manager.py,sha256=DymV5OI53ClRdc4p7jlCGT6xPqrjIxHjs8EDiyWffqQ,7362
52
- argus/backend/service/stats.py,sha256=Vdm24PtMxFQFTaP1dDJZ9nsrcSLYrTIFi8Ju_-zuSrY,16308
52
+ argus/backend/service/release_manager.py,sha256=d1J6llBb4aKgFPrsPTPYpV9NnGx772jeORZjs-ojYGE,7771
53
+ argus/backend/service/stats.py,sha256=-V94A8EUlQBvwG53oJTL4U1EzR4vciEF7Niu-efTL6Y,22713
53
54
  argus/backend/service/team_manager_service.py,sha256=zY5dvy3ffvQbJuXBvlWKE5dS5LQ3ss6tkFE-cwFZsdw,3010
54
- argus/backend/service/testrun.py,sha256=ggjTcWjyvsPXSSv_v80rrp3bHaqCOjcxYEewXrW9AXg,19706
55
+ argus/backend/service/testrun.py,sha256=ZM0D38IQpbrmia1GlCfLK02ZLwp_pbpUuQPN8BwibAw,21432
55
56
  argus/backend/service/user.py,sha256=N3t43rgKMnSsPXU5R9bigEEGbPjYrc6MsJtof3z7kDE,9027
56
- argus/backend/template_filters.py,sha256=hD8eDyBYp-X6JVoyQhM-TWYv3MuyorAv0Emz728iGcU,523
57
- argus/backend/util/common.py,sha256=fmE9cKnJ1CX_Cz4Mw1d_M-T-jwPh8DkKr_fLAx8LY9M,1458
57
+ argus/backend/service/views.py,sha256=amkyOQgHSP3YEDqiFHAhOiNzNCLk2sLkruTB2_IagDQ,11244
58
+ argus/backend/template_filters.py,sha256=04PHl0DiN4PBHQ82HMAmTfww09fGMXcYy-I5BU_b1s4,682
59
+ argus/backend/util/common.py,sha256=vLMit9ZBBN8S4-dw32LIhjtaEOX_5hwWneHILS_SNBg,1723
58
60
  argus/backend/util/config.py,sha256=Sm0LCRkabYaSUkXNPglyjMr45GCDBNXqJLkmB_s51f0,860
59
61
  argus/backend/util/encoders.py,sha256=VxOnUanHP9FjcaobYupV-pZ3Udzrrrq7zZcbNpVXaKM,646
60
62
  argus/backend/util/enums.py,sha256=EhTQrgedlEz5sDYJ1gFnE2eC2nc1neQCRgzOgssQvWY,749
@@ -63,7 +65,8 @@ argus/backend/util/module_loaders.py,sha256=AcIlX-VRmUQ2THFKT8DLefLSE62Eub2hCxIo
63
65
  argus/backend/util/send_email.py,sha256=Bb2Hta7WlBCvDKga0_WPFWgxWJEfKpectOGypgf9xzo,3217
64
66
  argus/client/__init__.py,sha256=bO9_j5_jK5kvTHR46KEZ0Y-p0li7CBW8QSd-K5Ez4vA,42
65
67
  argus/client/base.py,sha256=-R-BINTolY06lUQLOLGlsWzza4fBdtLBW-4V3NT64vg,6755
66
- argus/client/driver_matrix_tests/client.py,sha256=ekuTkEZbcVqhg6DAC6PvGuC9bXuu4DSOjk96vcLzmuQ,7817
68
+ argus/client/driver_matrix_tests/cli.py,sha256=YOhXL6yS2jBJoiSmVfwWKAosvrad7jIwTvC7XXtRj-8,6321
69
+ argus/client/driver_matrix_tests/client.py,sha256=UPryBku2rg6IV2wKKDkclXHnH3r6EYwWdds65wLC-KU,2748
67
70
  argus/client/generic/cli.py,sha256=IJkgEZ5VOAeqp5SlLM13Y5m8e34Cqnyz8WkfeKoN7so,2208
68
71
  argus/client/generic/client.py,sha256=l4PDjDy65Mm2OI9ZLSnyd8_2i4Ei1Pp9yRt3bRX8s2Y,1114
69
72
  argus/client/sct/client.py,sha256=DtRA0Ra3ycUcedDYfZZW1jER0nc8vdYHaY6DT0te4x0,11341
@@ -77,8 +80,8 @@ argus/db/db_types.py,sha256=iLbmrUaDzrBw0kDCnvW0FSZ9-kNc3uQY-fsbIPymV4E,3612
77
80
  argus/db/interface.py,sha256=HroyA1Yijz5cXLdYbxorHCEu0GH9VeMMqB36IHTlcew,17146
78
81
  argus/db/testrun.py,sha256=0YG7FIH5FLQeNlYULxC6rhhyru2rziSMe3qKtYzTBnc,26014
79
82
  argus/db/utils.py,sha256=YAWsuLjUScSgKgdaL5aF4Sgr13gqH29Mb5cLctX4V_w,337
80
- argus_alm-0.12.3.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
81
- argus_alm-0.12.3.dist-info/METADATA,sha256=Y7opbIMG2m_jRxQyZkmPePpz5BxDIokPbgSxf2AOH7M,6913
82
- argus_alm-0.12.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
83
- argus_alm-0.12.3.dist-info/entry_points.txt,sha256=zEqrAK95P8AAhKbwO4lgrQzKBWqCzHH9zlUPCaCVHoQ,69
84
- argus_alm-0.12.3.dist-info/RECORD,,
83
+ argus_alm-0.12.4b1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
84
+ argus_alm-0.12.4b1.dist-info/METADATA,sha256=8--mwnEtPjOCF5SIHNZLfk7YtoLKsyBJfoSq75nJo2I,3510
85
+ argus_alm-0.12.4b1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
86
+ argus_alm-0.12.4b1.dist-info/entry_points.txt,sha256=pcYW8nxZuDaymxE8tn86K0dq8eEodUdiS0sSvwEQ_zU,137
87
+ argus_alm-0.12.4b1.dist-info/RECORD,,
@@ -1,3 +1,4 @@
1
1
  [console_scripts]
2
2
  argus-client-generic=argus.client.generic.cli:cli
3
+ argus-driver-matrix-client=argus.client.driver_matrix_tests.cli:cli
3
4