squad 1.95__py3-none-any.whl → 1.96.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.
Potentially problematic release.
This version of squad might be problematic. Click here for more details.
- squad/ci/backend/tuxsuite.py +32 -11
- squad/ci/management/commands/testfetch.py +8 -1
- squad/core/models.py +56 -30
- squad/jinja2.py +1 -1
- squad/version.py +1 -1
- {squad-1.95.dist-info → squad-1.96.1.dist-info}/METADATA +1 -2
- {squad-1.95.dist-info → squad-1.96.1.dist-info}/RECORD +11 -11
- {squad-1.95.dist-info → squad-1.96.1.dist-info}/WHEEL +0 -0
- {squad-1.95.dist-info → squad-1.96.1.dist-info}/entry_points.txt +0 -0
- {squad-1.95.dist-info → squad-1.96.1.dist-info}/licenses/COPYING +0 -0
- {squad-1.95.dist-info → squad-1.96.1.dist-info}/top_level.txt +0 -0
squad/ci/backend/tuxsuite.py
CHANGED
@@ -392,9 +392,12 @@ class Backend(BaseBackend):
|
|
392
392
|
if 'unknown' == results['results']['boot']:
|
393
393
|
return None
|
394
394
|
|
395
|
-
# Retrieve
|
395
|
+
# Retrieve plain text log
|
396
396
|
logs = self.fetch_url(job_url + '/', 'logs?format=txt').text
|
397
|
-
|
397
|
+
|
398
|
+
# Retrieve YAML log
|
399
|
+
log_structured = self.fetch_url(results["download_url"], 'lava-logs.yaml').text
|
400
|
+
log_data = yaml.safe_load(log_structured)
|
398
401
|
|
399
402
|
attachment_list = ["reproducer", "tux_plan.yaml"]
|
400
403
|
attachments = {}
|
@@ -410,26 +413,44 @@ class Backend(BaseBackend):
|
|
410
413
|
boot_test_name = 'boot/' + (metadata.get('build_name') or 'boot')
|
411
414
|
tests[boot_test_name] = {'result': results['results']['boot']}
|
412
415
|
|
416
|
+
lava_signal = re.compile("^<LAVA_SIGNAL_")
|
417
|
+
|
418
|
+
def filter_log(line):
|
419
|
+
return type(line["msg"]) is str \
|
420
|
+
and line["lvl"] == "target" \
|
421
|
+
and not lava_signal.match(line["msg"])
|
422
|
+
|
413
423
|
# Really fetch test results
|
414
424
|
tests_results = self.fetch_url(job_url + '/', 'results').json()
|
415
425
|
if tests_results.get('error', None) is None:
|
416
426
|
for suite, suite_tests in tests_results.items():
|
417
|
-
if suite == 'lava':
|
418
|
-
continue
|
419
|
-
|
420
427
|
suite_name = re.sub(r'^[0-9]+_', '', suite)
|
421
428
|
for name, test_data in suite_tests.items():
|
422
429
|
test_name = f'{suite_name}/{name}'
|
423
|
-
result = test_data
|
430
|
+
result = test_data.get('result')
|
431
|
+
if not result:
|
432
|
+
continue
|
424
433
|
if "starttc" in test_data:
|
425
|
-
|
434
|
+
try:
|
435
|
+
# LAVA data counts from 1, we count from 0
|
436
|
+
starttc = int(test_data["starttc"]) - 1
|
437
|
+
except ValueError:
|
438
|
+
continue
|
426
439
|
if "endtc" in test_data:
|
427
|
-
|
428
|
-
|
429
|
-
|
440
|
+
try:
|
441
|
+
# no -1 as the second index of the slice needs to be
|
442
|
+
# greater than the first to get at least one item.
|
443
|
+
endtc = int(test_data["endtc"])
|
444
|
+
except ValueError:
|
445
|
+
endtc = starttc + 2
|
430
446
|
else:
|
431
447
|
endtc = starttc + 2
|
432
|
-
|
448
|
+
log_lines = [
|
449
|
+
line["msg"].replace("\x00", "")
|
450
|
+
for line in log_data[starttc:endtc]
|
451
|
+
if filter_log(line)
|
452
|
+
]
|
453
|
+
log_snippet = "\n".join(log_lines)
|
433
454
|
else:
|
434
455
|
log_snippet = None
|
435
456
|
tests[test_name] = {"result": result, "log": log_snippet}
|
@@ -31,17 +31,24 @@ class Command(BaseCommand):
|
|
31
31
|
type=str,
|
32
32
|
help='Project to fetch the data into (Format: foo/bar)',
|
33
33
|
)
|
34
|
+
parser.add_argument(
|
35
|
+
'BUILD',
|
36
|
+
type=str,
|
37
|
+
nargs="?",
|
38
|
+
help='Build to fetch the data into',
|
39
|
+
)
|
34
40
|
|
35
41
|
def handle(self, *args, **options):
|
36
42
|
backend_name = options.get("BACKEND")
|
37
43
|
job_id = options.get("JOBID")
|
38
44
|
group_slug, project_slug = options.get("PROJECT").split('/')
|
45
|
+
_build = options.get("BUILD") or str(time.time())
|
39
46
|
|
40
47
|
backend = Backend.objects.get(name=backend_name)
|
41
48
|
|
42
49
|
group, _ = Group.objects.get_or_create(slug=group_slug)
|
43
50
|
project, _ = group.projects.get_or_create(slug=project_slug)
|
44
|
-
build = project.builds.
|
51
|
+
build, _ = project.builds.get_or_create(version=_build)
|
45
52
|
|
46
53
|
testjob = backend.test_jobs.create(target=project, job_id=job_id, target_build=build)
|
47
54
|
|
squad/core/models.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
import json
|
2
2
|
import yaml
|
3
3
|
import logging
|
4
|
-
from collections import
|
4
|
+
from collections import Counter, defaultdict
|
5
5
|
from hashlib import sha1
|
6
6
|
from itertools import groupby
|
7
7
|
import re
|
@@ -676,36 +676,62 @@ class Build(models.Model):
|
|
676
676
|
|
677
677
|
@property
|
678
678
|
def test_suites_by_environment(self):
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
679
|
+
"""
|
680
|
+
Return a sorted dictionary like
|
681
|
+
{
|
682
|
+
"env1": [
|
683
|
+
("suite1", {"fail": 0, "pass": 0, "skip": 0, "xfail": 0}),
|
684
|
+
("suite2", {"fail": 0, "pass": 0, "skip": 0, "xfail": 0}),
|
685
|
+
...
|
686
|
+
],
|
687
|
+
"env2": [
|
688
|
+
("suite1", {"fail": 0, "pass": 0, "skip": 0, "xfail": 0}),
|
689
|
+
("suite2", {"fail": 0, "pass": 0, "skip": 0, "xfail": 0}),
|
690
|
+
...
|
691
|
+
],
|
692
|
+
...
|
693
|
+
}
|
694
|
+
|
695
|
+
Sorted by env slug, and then by suite slug
|
696
|
+
"""
|
697
|
+
|
698
|
+
tmp_results = defaultdict(
|
699
|
+
lambda: defaultdict(
|
700
|
+
lambda: {
|
701
|
+
"fail": 0,
|
702
|
+
"pass": 0,
|
703
|
+
"skip": 0,
|
704
|
+
"xfail": 0,
|
705
|
+
}
|
706
|
+
)
|
683
707
|
)
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
708
|
+
|
709
|
+
statuses = Status.objects.filter(
|
710
|
+
test_run__build=self,
|
711
|
+
suite__isnull=False
|
712
|
+
).prefetch_related(
|
713
|
+
'test_run__environment',
|
714
|
+
'suite',
|
715
|
+
).order_by(
|
716
|
+
'test_run__environment__slug',
|
717
|
+
'suite__slug',
|
718
|
+
)
|
719
|
+
|
720
|
+
for status in statuses:
|
721
|
+
env = status.test_run.environment
|
722
|
+
suite = status.suite
|
723
|
+
|
724
|
+
tmp_results[env][suite]['fail'] += status.tests_fail
|
725
|
+
tmp_results[env][suite]['pass'] += status.tests_pass
|
726
|
+
tmp_results[env][suite]['skip'] += status.tests_skip
|
727
|
+
tmp_results[env][suite]['xfail'] += status.tests_xfail
|
728
|
+
|
729
|
+
results = defaultdict(list)
|
730
|
+
for env, suites in tmp_results.items():
|
731
|
+
for suite, status in suites.items():
|
732
|
+
results[env].append((suite, status))
|
733
|
+
|
734
|
+
return results
|
709
735
|
|
710
736
|
def test_jobs_summary(self, per_environment=False):
|
711
737
|
testjobs = self.test_jobs.only('environment', 'job_status', 'target_build').order_by('environment')
|
squad/jinja2.py
CHANGED
squad/version.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = '1.
|
1
|
+
__version__ = '1.96.1'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: squad
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.96.1
|
4
4
|
Summary: Software Quality Dashboard
|
5
5
|
Home-page: https://gitlab.com/Linaro/squad/squad
|
6
6
|
Author: Antonio Terceiro
|
@@ -11,7 +11,6 @@ License-File: COPYING
|
|
11
11
|
Requires-Dist: aiohttp
|
12
12
|
Requires-Dist: celery
|
13
13
|
Requires-Dist: cryptography
|
14
|
-
Requires-Dist: coreapi
|
15
14
|
Requires-Dist: django_crispy_forms==1.14.0
|
16
15
|
Requires-Dist: Django<5,>=3
|
17
16
|
Requires-Dist: django-allauth
|
@@ -4,13 +4,13 @@ squad/celery.py,sha256=JyflXsOPFcQ0ltX9f4DtPi-zcBV9Hmi74SdPur3dkdY,1919
|
|
4
4
|
squad/compat.py,sha256=VhgZ8fwMu-FT7vZMOqEuLussVTTzPm68uIL37UHmSmk,1409
|
5
5
|
squad/container_settings.py,sha256=bac_j_ibZY5hEaasRhNyliq9sfsP6ks4RzGIyHskXW4,1209
|
6
6
|
squad/http.py,sha256=KuIKtpf3yOvf5fwc0T2MR0ul1l4AKxq3b0CLdk6KBhM,3667
|
7
|
-
squad/jinja2.py,sha256=
|
7
|
+
squad/jinja2.py,sha256=Uv33jwWKhru5Z3vGVl5hxjyRZNHSdy9kMb8tyjFqzTU,2549
|
8
8
|
squad/mail.py,sha256=xH5wuIpD7u1fTN9vNOcbzByojleaffsKwp-9i3BeOD0,390
|
9
9
|
squad/manage.py,sha256=Z-LXT67p0R-IzwJ9fLIAacEZmU0VUjqDOSg7j2ZSxJ4,1437
|
10
10
|
squad/settings.py,sha256=sLSts3qmUgXmpLmzhOBrTmFcSuBRMugo0hDY0uw4z3A,14792
|
11
11
|
squad/socialaccount.py,sha256=vySqPwQ3qVVpahuJ-Snln8K--yzRL3bw4Nx27AsB39A,789
|
12
12
|
squad/urls.py,sha256=JiEfVW8YlzLPE52c2aHzdn5kVVKK4o22w8h5KOA6QhQ,2776
|
13
|
-
squad/version.py,sha256=
|
13
|
+
squad/version.py,sha256=EM3neo5Jmib77mEZj8psBMuUtUBD4DJ7qRXROfPOFBw,23
|
14
14
|
squad/wsgi.py,sha256=SF8T0cQ0OPVyuYjO5YXBIQzvSXQHV0M2BTmd4gP1rPs,387
|
15
15
|
squad/api/__init__.py,sha256=CJiVakfAlHVN5mIFRVQYZQfuNUhUgWVbsdYTME4tq7U,1349
|
16
16
|
squad/api/apps.py,sha256=Trk72p-iV1uGn0o5mdJn5HARUoHGbfgO49jwXvpkmdQ,141
|
@@ -33,12 +33,12 @@ squad/ci/backend/__init__.py,sha256=yhpotXT9F4IdAOXvGQ3-17eOHAFwoaqf9SnMX17ab30,
|
|
33
33
|
squad/ci/backend/fake.py,sha256=MTsxGZuihJOd39X8ysJhiYp4A0R46lyhdkjoTgFm6a8,2435
|
34
34
|
squad/ci/backend/lava.py,sha256=Atb2AgV5OSejtN1LyE7xONTFvJCdDoh9vK9RO_P7L2g,34077
|
35
35
|
squad/ci/backend/null.py,sha256=oZx3OofUKSuLOYS_GZkteGaD6JOEEkdknVmi4_cxDOQ,5645
|
36
|
-
squad/ci/backend/tuxsuite.py,sha256=
|
36
|
+
squad/ci/backend/tuxsuite.py,sha256=roWaCHDenmyD0094jgTXhxXyZDtafNVQ9IXStcBxenc,20894
|
37
37
|
squad/ci/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
38
38
|
squad/ci/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
39
39
|
squad/ci/management/commands/create_tuxsuite_boot_tests.py,sha256=JvjNusebLX71eyz9d-kaeCyekYSpzc1eXoeIqWK9ygo,4045
|
40
40
|
squad/ci/management/commands/listen.py,sha256=3o0IZPeUz3D3Pd-yL-yJdYkRmSgm6mhzB8qUCt6oejU,4683
|
41
|
-
squad/ci/management/commands/testfetch.py,sha256=
|
41
|
+
squad/ci/management/commands/testfetch.py,sha256=pPFO74X5KCJMGr3OYt9bqijDQd_MAHRmc-bS3imMzwM,1875
|
42
42
|
squad/ci/migrations/0001_initial.py,sha256=oIcEE32zdiuQkCyyily6VKnRVH8e03cYmvcxlo0iELg,2098
|
43
43
|
squad/ci/migrations/0002_auto_20170406_1252.py,sha256=rLGNiNaV737vCVKtEOWTzdH4vkVlBdwfhYkkRdD7xps,633
|
44
44
|
squad/ci/migrations/0003_backend_name.py,sha256=8erX-jJFSA-l9eefrWt4_sE7Qb3pVPDNjJJSqg_Mofk,512
|
@@ -82,7 +82,7 @@ squad/core/comparison.py,sha256=LR3-Unv0CTmakFCDzF_h8fm2peTJzkv79mQWNau1iwI,2442
|
|
82
82
|
squad/core/data.py,sha256=2zw56v7iYRTUc7wlhuUNgwIIMmK2w84hi-amR9J7EPU,2236
|
83
83
|
squad/core/failures.py,sha256=X6lJVghM2fOrd-RfuHeLlezW2pt7owDZ8eX-Kn_Qrt0,918
|
84
84
|
squad/core/history.py,sha256=QRSIoDOw6R6vUWMtsPMknsHGM7FaCAeuCYqASCayHTk,3541
|
85
|
-
squad/core/models.py,sha256=
|
85
|
+
squad/core/models.py,sha256=I0j8jWte1WZDoAbAwLQKVNpssfhcN4AJuWDN2409kVo,61969
|
86
86
|
squad/core/notification.py,sha256=rOpO6F63w7_5l9gQgWBBEk-MFBjp7x_hVzoVIVyDze0,10030
|
87
87
|
squad/core/plugins.py,sha256=FLgyoXXKnPBYEf2MgHup9M017rHuADHivLhgzmx_cJE,6354
|
88
88
|
squad/core/queries.py,sha256=78fhIJZWXIlDryewYAt96beK1VJad66Ufu8cg3dHh4w,7698
|
@@ -436,9 +436,9 @@ squad/run/__main__.py,sha256=DOl8JOi4Yg7DdtwnUeGqtYBJ6P2k-D2psAEuYOjWr8w,66
|
|
436
436
|
squad/run/listener.py,sha256=jBeOQhPGb4EdIREB1QsCzYuumsfJ-TqJPd3nR-0m59g,200
|
437
437
|
squad/run/scheduler.py,sha256=CDJG3q5C0GuQuxwlMOfWTSSJpDdwbR6rzpbJfuA0xuw,277
|
438
438
|
squad/run/worker.py,sha256=jtML0h5qKDuSbpJ6_rpWP4MT_rsGA7a24AhwGxBquzk,594
|
439
|
-
squad-1.
|
440
|
-
squad-1.
|
441
|
-
squad-1.
|
442
|
-
squad-1.
|
443
|
-
squad-1.
|
444
|
-
squad-1.
|
439
|
+
squad-1.96.1.dist-info/licenses/COPYING,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
|
440
|
+
squad-1.96.1.dist-info/METADATA,sha256=3yQ4R0HGTu3BvUf7uJnt94G-qX-h58tcKzBH0PvHW9U,1515
|
441
|
+
squad-1.96.1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
442
|
+
squad-1.96.1.dist-info/entry_points.txt,sha256=apCDQydHZtvqV334ql6NhTJUAJeZRdtAm0TVcbbAi5Q,194
|
443
|
+
squad-1.96.1.dist-info/top_level.txt,sha256=_x9uqE1XppiiytmVTl_qNgpnXus6Gsef69HqfliE7WI,6
|
444
|
+
squad-1.96.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|