Loading ansible/tests/unit/test_feature_consolidation.py +6 −0 Changes for ansible/tests/unit/test_feature_consolidation.py: 6 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -49,3 +49,9 @@ def test_failed_or_mixed_reports_never_qualify_the_candidate(tmp_path,fault): report=consolidate(tmp_path,tmp_path/'out',source='a'*40,pipeline='http://ci/pipeline/1') assert not report['selected_acceptance_passed'] and report['problems'] assert (tmp_path/'out/feature-matrix.md').is_file() def test_local_consolidation_also_refuses_different_test_revisions(tmp_path): inputs(tmp_path,fault='source') report=consolidate(tmp_path,tmp_path/'out') assert not report['selected_acceptance_passed'] and not report['same_candidate'] ci/merge_feature_reports.py +5 −2 Changes for ci/merge_feature_reports.py: 5 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ import argparse from copy import deepcopy import json import os import re from pathlib import Path VARIANTS = {'container':'terminated', 'helm':'helm-terminated', 'network':'network'} Loading @@ -22,6 +23,8 @@ def consolidate(directory, output, *, source=None, pipeline=None): reports[variant]=report if report.get('checkpoint')!=checkpoint: problems.append(f'{variant}: unexpected selected scenario') if not re.fullmatch(r'[0-9a-f]{40}',report.get('ansible_source') or ''): problems.append(f'{variant}: missing test source identity') if source and report.get('ansible_source')!=source: problems.append(f'{variant}: report belongs to another test source') if pipeline and report.get('pipeline_url')!=pipeline: Loading @@ -34,7 +37,7 @@ def consolidate(directory, output, *, source=None, pipeline=None): heads=selection.get('source_heads') if not heads: problems.append(f'{variant}: missing resolved artifact provenance') identities.append((heads,report.get('images'),report.get('chart_revision'),selection.get('sdk'))) identities.append((report.get('ansible_source'),heads,report.get('images'),report.get('chart_revision'),selection.get('sdk'))) same_candidate=len(reports)==len(VARIANTS) and all(identity==identities[0] for identity in identities) if not same_candidate: problems.append('Reports do not establish one common artifact candidate') Loading @@ -53,7 +56,7 @@ def consolidate(directory, output, *, source=None, pipeline=None): transaction_passed=report.get('candidate_run_passed',False)) rows.append(row) network=reports.get('network',{}) result={'schema_version':1,'ansible_source':source,'pipeline_url':pipeline, result={'schema_version':1,'ansible_source':source or reports.get('container',{}).get('ansible_source'),'pipeline_url':pipeline, 'same_candidate':same_candidate,'selected_acceptance_passed':not problems, 'problems':problems,'features':rows, 'variants':{key:{field:report.get(field) for field in ( Loading Loading
ansible/tests/unit/test_feature_consolidation.py +6 −0 Changes for ansible/tests/unit/test_feature_consolidation.py: 6 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -49,3 +49,9 @@ def test_failed_or_mixed_reports_never_qualify_the_candidate(tmp_path,fault): report=consolidate(tmp_path,tmp_path/'out',source='a'*40,pipeline='http://ci/pipeline/1') assert not report['selected_acceptance_passed'] and report['problems'] assert (tmp_path/'out/feature-matrix.md').is_file() def test_local_consolidation_also_refuses_different_test_revisions(tmp_path): inputs(tmp_path,fault='source') report=consolidate(tmp_path,tmp_path/'out') assert not report['selected_acceptance_passed'] and not report['same_candidate']
ci/merge_feature_reports.py +5 −2 Changes for ci/merge_feature_reports.py: 5 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ import argparse from copy import deepcopy import json import os import re from pathlib import Path VARIANTS = {'container':'terminated', 'helm':'helm-terminated', 'network':'network'} Loading @@ -22,6 +23,8 @@ def consolidate(directory, output, *, source=None, pipeline=None): reports[variant]=report if report.get('checkpoint')!=checkpoint: problems.append(f'{variant}: unexpected selected scenario') if not re.fullmatch(r'[0-9a-f]{40}',report.get('ansible_source') or ''): problems.append(f'{variant}: missing test source identity') if source and report.get('ansible_source')!=source: problems.append(f'{variant}: report belongs to another test source') if pipeline and report.get('pipeline_url')!=pipeline: Loading @@ -34,7 +37,7 @@ def consolidate(directory, output, *, source=None, pipeline=None): heads=selection.get('source_heads') if not heads: problems.append(f'{variant}: missing resolved artifact provenance') identities.append((heads,report.get('images'),report.get('chart_revision'),selection.get('sdk'))) identities.append((report.get('ansible_source'),heads,report.get('images'),report.get('chart_revision'),selection.get('sdk'))) same_candidate=len(reports)==len(VARIANTS) and all(identity==identities[0] for identity in identities) if not same_candidate: problems.append('Reports do not establish one common artifact candidate') Loading @@ -53,7 +56,7 @@ def consolidate(directory, output, *, source=None, pipeline=None): transaction_passed=report.get('candidate_run_passed',False)) rows.append(row) network=reports.get('network',{}) result={'schema_version':1,'ansible_source':source,'pipeline_url':pipeline, result={'schema_version':1,'ansible_source':source or reports.get('container',{}).get('ansible_source'),'pipeline_url':pipeline, 'same_candidate':same_candidate,'selected_acceptance_passed':not problems, 'problems':problems,'features':rows, 'variants':{key:{field:report.get(field) for field in ( Loading