10453 lines
491 KiB
Python
10453 lines
491 KiB
Python
import os
|
|
import hashlib
|
|
import json
|
|
from contextlib import ExitStack
|
|
from datetime import datetime, timedelta, timezone
|
|
from pathlib import Path
|
|
import socket
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
import threading
|
|
import time
|
|
import unittest
|
|
import uuid
|
|
from types import SimpleNamespace
|
|
from unittest import mock
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
APP_DIR = ROOT / 'app'
|
|
PG_BIN = Path(os.environ['TRUF_TEST_PG_BIN']) if os.environ.get(
|
|
'TRUF_TEST_PG_BIN'
|
|
) else ROOT / 'runtime' / 'postgres' / 'pgsql' / 'bin'
|
|
PG_INITDB = PG_BIN / ('initdb.exe' if os.name == 'nt' else 'initdb')
|
|
PG_CTL = PG_BIN / ('pg_ctl.exe' if os.name == 'nt' else 'pg_ctl')
|
|
sys.path.insert(0, str(APP_DIR))
|
|
|
|
from jsonl_projector import JsonlProjector
|
|
from keycheckers.gemini import geminiKeycheck
|
|
from keycheckers.openai import Keycheck as openaiKeycheck
|
|
from migrate_runtime_safety import (
|
|
_canonical_json_sha256,
|
|
apply_cold_target_queue_reactivation,
|
|
apply_stale_target_queue_cold,
|
|
backfill_normalized_raw_results,
|
|
plan_cold_target_queue_reactivation,
|
|
plan_stale_target_queue_cold,
|
|
recover_stale_result_pipeline,
|
|
rebuild_jsonl_projections,
|
|
review_pipeline_quarantine_manifest,
|
|
)
|
|
from console_runner import reserve_v2_admission_with_recovery, validate_v2_capacity_model
|
|
import console_runner
|
|
import dashboard
|
|
import docker_depth_experiment as depth
|
|
from docker_depth_report import build_docker_depth_report
|
|
from process_identity import current_process_identity
|
|
from result_bundle import (
|
|
FORMAT_VERSION, BundleReservation, ResultBundleReader, ResultBundleWriter,
|
|
)
|
|
from result_ingester import ResultIngester
|
|
import result_ingester
|
|
from runtime_security import atomic_write_private_json, ensure_private_directory, harden_private_file
|
|
from scanner import acquire_scan_slot, scan_config, stage_result_bundle
|
|
import scanner
|
|
import scanner_db
|
|
import worker_contracts
|
|
from scan_execution import (
|
|
PACKAGE_DETECTOR_POLICY, PROTOCOL_VERSION, QueueDispositionPolicy,
|
|
remote_execution_identity,
|
|
)
|
|
from scanner_db import (
|
|
DOCKER_ADAPTIVE_SHADOW_SELECTION_METRIC_KEYS,
|
|
DiscoveryPausedError,
|
|
DockerFindingAttributionLimitError,
|
|
DiscoveryRetryLeaseError,
|
|
HAS_CLAIMABLE_TARGETS_V2_SQL,
|
|
PIPELINE_MIGRATION_VERSIONS,
|
|
PIPELINE_SCHEMA_SQL,
|
|
PipelineCapacityUnavailable,
|
|
REMOTE_ASSIGNMENT_CAPACITY_MIGRATION,
|
|
RuntimeControlRevisionConflictError,
|
|
RuntimeSafetySchemaError,
|
|
ScanEventConflictError,
|
|
ScannerDB,
|
|
canonical_docker_layer_plan_bytes,
|
|
canonical_git_scan_plan_bytes,
|
|
docker_layer_coverage_policy_sha256,
|
|
docker_layer_execution_policy_sha256,
|
|
docker_layer_selection_policy_sha256,
|
|
migrate_runtime_safety_schema,
|
|
)
|
|
|
|
|
|
@unittest.skipUnless(PG_INITDB.is_file(), 'bundled PostgreSQL is unavailable')
|
|
class PipelinePostgresIntegrationTests(unittest.TestCase):
|
|
def setUp(self):
|
|
self.temp = tempfile.TemporaryDirectory()
|
|
self.root = Path(self.temp.name)
|
|
self.data = self.root / 'data'
|
|
self.log = self.root / 'postgres.log'
|
|
self.bundle_root = self.root / 'bundles'
|
|
self.results = self.root / 'results'
|
|
self.keychecks = self.root / 'keychecks'
|
|
for path in (self.root, self.bundle_root, self.results, self.keychecks):
|
|
ensure_private_directory(str(path), reject_reparse=True)
|
|
with socket.socket() as listener:
|
|
listener.bind(('127.0.0.1', 0))
|
|
self.port = listener.getsockname()[1]
|
|
flags = subprocess.CREATE_NO_WINDOW if os.name == 'nt' else 0
|
|
subprocess.run(
|
|
[
|
|
str(PG_INITDB), '-D', str(self.data),
|
|
'--username=postgres', '--auth=trust', '--encoding=UTF8',
|
|
'--no-locale', '--no-sync',
|
|
],
|
|
check=True,
|
|
stdin=subprocess.DEVNULL,
|
|
stdout=subprocess.DEVNULL,
|
|
stderr=subprocess.DEVNULL,
|
|
creationflags=flags,
|
|
timeout=60,
|
|
)
|
|
postgres_options = f'-p {self.port} -h 127.0.0.1'
|
|
if os.name != 'nt':
|
|
postgres_options += f' -k {self.root}'
|
|
subprocess.run(
|
|
[
|
|
str(PG_CTL), '-D', str(self.data), '-l', str(self.log),
|
|
'-o', postgres_options, '-w', 'start',
|
|
],
|
|
check=True,
|
|
stdin=subprocess.DEVNULL,
|
|
stdout=subprocess.DEVNULL,
|
|
stderr=subprocess.DEVNULL,
|
|
creationflags=flags,
|
|
timeout=60,
|
|
)
|
|
self.dsn = f'postgresql://postgres@127.0.0.1:{self.port}/postgres'
|
|
import psycopg
|
|
|
|
with psycopg.connect(self.dsn, autocommit=True) as raw:
|
|
raw.execute('REVOKE CREATE ON SCHEMA public FROM PUBLIC')
|
|
|
|
@staticmethod
|
|
def _arm_delayed_commit(database, commit_number):
|
|
entered = threading.Event()
|
|
release = threading.Event()
|
|
real_commit = database.conn.commit
|
|
calls = {'count': 0}
|
|
|
|
def delayed_commit():
|
|
calls['count'] += 1
|
|
if calls['count'] == commit_number:
|
|
entered.set()
|
|
if not release.wait(10):
|
|
raise RuntimeError('timed out waiting to release PostgreSQL commit')
|
|
return real_commit()
|
|
|
|
database.conn.commit = delayed_commit
|
|
return entered, release
|
|
|
|
@staticmethod
|
|
def _remote_execution_snapshot():
|
|
scan_kwargs = {
|
|
'timeout_sec': 30.0,
|
|
'trufflehog_config': PACKAGE_DETECTOR_POLICY,
|
|
}
|
|
execution_limits = {
|
|
'candidate_max_items': 1,
|
|
'candidate_max_bytes': 1024,
|
|
}
|
|
scan_policy = {
|
|
'drop_detectors': [],
|
|
'strict_git_provider_token_filter': True,
|
|
'trufflehog_stdout_max_mb': 32,
|
|
'trufflehog_stderr_max_mb': 8,
|
|
'result_bundle_max_event_bytes': 1024 * 1024,
|
|
'trufflehog_max_findings_per_target': 20000,
|
|
'trufflehog_job_memory_limit_bytes': 0,
|
|
'trufflehog_windows_job_cpu_weight': 0,
|
|
'trufflehog_windows_memory_priority': 0,
|
|
'trufflehog_diagnostic_max_lines': 2000,
|
|
'trufflehog_diagnostic_max_line_chars': 8192,
|
|
'trufflehog_diagnostic_max_line_bytes': 8192,
|
|
'trufflehog_diagnostic_max_errors': 200,
|
|
'trufflehog_diagnostic_max_warnings': 200,
|
|
'trufflehog_diagnostic_max_unclassified': 20,
|
|
}
|
|
effective, execution = remote_execution_identity(
|
|
'github', scan_kwargs, scan_kwargs, QueueDispositionPolicy(),
|
|
execution_limits, scan_policy,
|
|
)
|
|
return effective, {
|
|
'schema': 1,
|
|
'compatibility': {
|
|
'protocol_version': PROTOCOL_VERSION,
|
|
'bundle_format_version': FORMAT_VERSION,
|
|
'platform_tag': 'windows-x86_64',
|
|
'code_manifest_sha256': 'd' * 64,
|
|
'effective_config_sha256': effective,
|
|
'detector_policy_sha256': 'e' * 64,
|
|
},
|
|
'execution': execution,
|
|
'planning': {
|
|
'kind': 'exact_git_v1',
|
|
'git_baseline_depth': 100,
|
|
'git_ref_resolution_attempts': 2,
|
|
'git_ref_resolution_timeout_sec': 10.0,
|
|
'git_ref_resolution_max_bytes': 1 << 20,
|
|
},
|
|
'credential_ref': {'source': 'github', 'auth_entry': 'primary'},
|
|
}
|
|
|
|
def tearDown(self):
|
|
flags = subprocess.CREATE_NO_WINDOW if os.name == 'nt' else 0
|
|
try:
|
|
subprocess.run(
|
|
[str(PG_CTL), '-D', str(self.data), '-m', 'fast', '-w', 'stop'],
|
|
check=False,
|
|
stdin=subprocess.DEVNULL,
|
|
stdout=subprocess.DEVNULL,
|
|
stderr=subprocess.DEVNULL,
|
|
creationflags=flags,
|
|
timeout=60,
|
|
)
|
|
finally:
|
|
self.temp.cleanup()
|
|
|
|
def _docker_attribution_db(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
now = scanner_db.utc_now_iso()
|
|
db.conn.execute(
|
|
'''INSERT INTO pipeline_leases(
|
|
worker_name, generation, lease_token, supervisor_instance_id,
|
|
state, lease_expires_at, updated_at
|
|
) VALUES ('result_ingester', 1, 'attribution-ingester',
|
|
'attribution-supervisor', 'ready',
|
|
'2999-01-01T00:00:00+00:00', ?)
|
|
ON CONFLICT(worker_name) DO UPDATE SET
|
|
supervisor_instance_id = excluded.supervisor_instance_id,
|
|
state = excluded.state,
|
|
lease_expires_at = excluded.lease_expires_at,
|
|
updated_at = excluded.updated_at''',
|
|
(now,),
|
|
)
|
|
db.conn.commit()
|
|
return db
|
|
|
|
def _prepare_docker_attribution_bundle(
|
|
self, db, label, layers, findings, *, experiment_bound=True,
|
|
):
|
|
safe_label = label.replace('_', '-').lower()
|
|
repository = f'owner/{safe_label}'
|
|
manifest_digest = 'sha256:' + hashlib.sha256(
|
|
f'manifest:{label}'.encode('ascii')
|
|
).hexdigest()
|
|
target = f'{repository}@{manifest_digest}'
|
|
self.assertEqual(
|
|
db.enqueue_targets('dockerhub', 'docker', safe_label, [target]), 1,
|
|
)
|
|
identity = hashlib.sha256(label.encode('ascii')).hexdigest()
|
|
claim = db.reserve_and_claim_target(
|
|
'dockerhub', 'docker', current_process_identity(),
|
|
'attribution-supervisor', 4 * 1024 * 1024, 4 * 1024 * 1024,
|
|
10, 1024 * 1024,
|
|
capacity_limits={
|
|
'bundle_items': 100, 'bundle_bytes': 128 * 1024 * 1024,
|
|
'projection_items': 100, 'projection_bytes': 128 * 1024 * 1024,
|
|
'keycheck_items': 100, 'keycheck_bytes': 128 * 1024 * 1024,
|
|
},
|
|
reservation_token=f'attribution-{safe_label}',
|
|
bundle_id=hashlib.sha256(f'bundle:{label}'.encode('ascii')).hexdigest()[:32],
|
|
scan_event_id=hashlib.sha256(f'event:{label}'.encode('ascii')).hexdigest()[:32],
|
|
)
|
|
self.assertIsNotNone(claim)
|
|
reservation = db.conn.execute(
|
|
'SELECT * FROM result_reservations WHERE id = ?',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
binding_id = None
|
|
manifest_id = None
|
|
target_id = None
|
|
if experiment_bound:
|
|
experiment = db.conn.execute(
|
|
'''INSERT INTO docker_depth_experiments(
|
|
experiment_key, source, state, config_sha256,
|
|
ordered_queries_sha256, selector_version, selector_sha256,
|
|
provenance_policy_sha256, query_count,
|
|
repositories_per_query, images_per_repository, target_limit,
|
|
target_count, created_at, updated_at, activated_at
|
|
) VALUES (?, 'dockerhub', 'active', ?, ?, 'selector-v1', ?, ?,
|
|
1, 1, 1, 1, 1, ?, ?, ?) RETURNING id''',
|
|
(
|
|
f'attribution-{safe_label}', identity, identity, identity, identity,
|
|
reservation['created_at'], reservation['created_at'],
|
|
reservation['created_at'],
|
|
),
|
|
).fetchone()
|
|
graph_sha256 = depth.canonical_docker_layer_graph_hash(tuple(layers))
|
|
manifest = db.conn.execute(
|
|
'''INSERT INTO docker_image_manifests(
|
|
target_queue_id, source, repository, manifest_digest,
|
|
manifest_media_type, graph_sha256, manifest_size_bytes,
|
|
layer_count, resolved_at, created_at
|
|
) VALUES (?, 'dockerhub', ?, ?,
|
|
'application/vnd.oci.image.manifest.v1+json', ?, 1,
|
|
?, ?, ?) RETURNING id''',
|
|
(
|
|
claim['queue_id'], repository, manifest_digest, graph_sha256,
|
|
len(layers), reservation['created_at'], reservation['created_at'],
|
|
),
|
|
).fetchone()
|
|
manifest_id = int(manifest['id'])
|
|
media_type = 'application/vnd.oci.image.layer.v1.tar+gzip'
|
|
for position, digest in enumerate(layers, 1):
|
|
db.conn.execute(
|
|
'''INSERT INTO docker_manifest_layers(
|
|
manifest_id, position_from_base, position_from_top,
|
|
layer_digest, media_type, layer_size_bytes,
|
|
descriptor_sha256, created_at
|
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)''',
|
|
(
|
|
manifest_id, position, len(layers) - position + 1,
|
|
digest, media_type, position,
|
|
depth.canonical_docker_descriptor_hash(
|
|
digest, media_type, position,
|
|
),
|
|
reservation['created_at'],
|
|
),
|
|
)
|
|
target_row = db.conn.execute(
|
|
'''INSERT INTO docker_depth_experiment_targets(
|
|
experiment_id, target_queue_id, manifest_id,
|
|
counter_ordinal, state, dispatch_wave, dispatch_order,
|
|
reservation_count, created_at, updated_at
|
|
) VALUES (?, ?, ?, 1, 'reserved', 1, 1, 1, ?, ?)
|
|
RETURNING id''',
|
|
(
|
|
experiment['id'], claim['queue_id'], manifest_id,
|
|
reservation['created_at'], reservation['created_at'],
|
|
),
|
|
).fetchone()
|
|
target_id = int(target_row['id'])
|
|
binding = db.conn.execute(
|
|
'''INSERT INTO docker_depth_experiment_scan_bindings(
|
|
experiment_target_id, reservation_id, attempt, state,
|
|
bound_at, created_at
|
|
) VALUES (?, ?, 1, 'reserved', ?, ?) RETURNING id''',
|
|
(
|
|
target_id, claim['reservation_id'], reservation['created_at'],
|
|
reservation['created_at'],
|
|
),
|
|
).fetchone()
|
|
binding_id = int(binding['id'])
|
|
db.conn.commit()
|
|
|
|
if callable(findings):
|
|
findings = findings(manifest_digest, tuple(layers))
|
|
prepared_findings = []
|
|
for position, finding in enumerate(findings, 1):
|
|
finding = dict(finding)
|
|
finding.setdefault(
|
|
'finding_uid',
|
|
hashlib.sha256(f'{label}:finding:{position}'.encode('ascii')).hexdigest(),
|
|
)
|
|
prepared_findings.append(finding)
|
|
staged = stage_result_bundle(
|
|
{
|
|
'scan_event_id': claim['scan_event_id'],
|
|
'target': claim['target'],
|
|
'scan_type': 'docker',
|
|
'timestamp': '2026-09-10T00:00:00+00:00',
|
|
'scan_started_at': '2026-09-10T00:00:00+00:00',
|
|
'duration_sec': 1.0,
|
|
'findings': prepared_findings,
|
|
'errors': [],
|
|
},
|
|
claim, str(self.bundle_root), {},
|
|
{'queue_status': 'done', 'queue_error': None, 'available_after': None},
|
|
candidate_max_items=10, candidate_max_bytes=1024 * 1024,
|
|
)
|
|
self.assertTrue(db.mark_result_bundle_ready(
|
|
claim['reservation_id'], {
|
|
'bundle_id': staged.bundle_id,
|
|
'scan_event_id': staged.scan_event_id,
|
|
'scan_event_hash': staged.scan_event_hash,
|
|
'relative_path': staged.relative_path,
|
|
'actual_bytes': staged.actual_bytes,
|
|
'frame_count': staged.frame_count,
|
|
'finding_count': staged.finding_count,
|
|
'error_count': staged.error_count,
|
|
'candidate_count': staged.candidate_count,
|
|
},
|
|
))
|
|
reservation = db.conn.execute(
|
|
'SELECT * FROM result_reservations WHERE id = ?',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
bundle = db.conn.execute(
|
|
'SELECT * FROM result_bundles WHERE reservation_id = ?',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
path = self.bundle_root.joinpath(*staged.relative_path.split('/'))
|
|
return {
|
|
'binding_id': binding_id,
|
|
'bundle': dict(bundle),
|
|
'claim': claim,
|
|
'manifest_digest': manifest_digest,
|
|
'manifest_id': manifest_id,
|
|
'path': path,
|
|
'reservation': dict(reservation),
|
|
'target': target,
|
|
'target_id': target_id,
|
|
}
|
|
|
|
@staticmethod
|
|
def _ingest_docker_attribution_bundle(db, prepared):
|
|
return db.ingest_result_bundle(
|
|
ResultBundleReader(str(prepared['path'])),
|
|
prepared['reservation'], prepared['bundle'],
|
|
)
|
|
|
|
def test_docker_finding_normal_layer_digest_is_attributed_exactly(self):
|
|
db = self._docker_attribution_db()
|
|
try:
|
|
layer_digest = 'sha256:' + ('1' * 64)
|
|
prepared = self._prepare_docker_attribution_bundle(
|
|
db, 'normal-layer', (layer_digest,), ({
|
|
'DetectorName': 'FixtureNormal',
|
|
'SourceMetadata': {
|
|
'Data': {'Docker': {'layer': layer_digest, 'file': '/fixture'}},
|
|
},
|
|
},),
|
|
)
|
|
|
|
outcome = self._ingest_docker_attribution_bundle(db, prepared)
|
|
|
|
rows = db.conn.execute(
|
|
'''SELECT attribution_state, reported_layer_digest,
|
|
unattributed_reason, position_from_base,
|
|
position_from_top
|
|
FROM docker_finding_layer_attributions
|
|
WHERE scan_binding_id = ? ORDER BY id''',
|
|
(prepared['binding_id'],),
|
|
).fetchall()
|
|
db.conn.commit()
|
|
self.assertFalse(outcome['duplicate'])
|
|
self.assertEqual(
|
|
[(
|
|
row['attribution_state'], row['reported_layer_digest'],
|
|
row['unattributed_reason'], row['position_from_base'],
|
|
row['position_from_top'],
|
|
) for row in rows],
|
|
[('exact', layer_digest, None, 1, 1)],
|
|
)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_finding_duplicate_digest_keeps_every_manifest_position(self):
|
|
db = self._docker_attribution_db()
|
|
try:
|
|
layer_digest = 'sha256:' + ('2' * 64)
|
|
middle_digest = 'sha256:' + ('3' * 64)
|
|
prepared = self._prepare_docker_attribution_bundle(
|
|
db, 'duplicate-layer',
|
|
(layer_digest, middle_digest, layer_digest),
|
|
({
|
|
'DetectorName': 'FixtureDuplicate',
|
|
'SourceMetadata': {'Data': {'Docker': {'layer': layer_digest}}},
|
|
},),
|
|
)
|
|
|
|
outcome = self._ingest_docker_attribution_bundle(db, prepared)
|
|
|
|
rows = db.conn.execute(
|
|
'''SELECT a.attribution_state, a.reported_layer_digest,
|
|
a.position_from_base, a.position_from_top,
|
|
layer.manifest_id, target.manifest_id AS bound_manifest_id,
|
|
queue.target
|
|
FROM docker_finding_layer_attributions a
|
|
JOIN docker_manifest_layers layer ON layer.id = a.manifest_layer_id
|
|
JOIN docker_depth_experiment_scan_bindings binding
|
|
ON binding.id = a.scan_binding_id
|
|
JOIN docker_depth_experiment_targets target
|
|
ON target.id = binding.experiment_target_id
|
|
JOIN target_queue queue ON queue.id = target.target_queue_id
|
|
WHERE a.scan_binding_id = ?
|
|
ORDER BY a.position_from_base''',
|
|
(prepared['binding_id'],),
|
|
).fetchall()
|
|
db.conn.commit()
|
|
self.assertEqual(len(rows), 2)
|
|
self.assertEqual(
|
|
[
|
|
(
|
|
row['attribution_state'], row['reported_layer_digest'],
|
|
row['position_from_base'], row['position_from_top'],
|
|
row['manifest_id'], row['bound_manifest_id'], row['target'],
|
|
)
|
|
for row in rows
|
|
],
|
|
[
|
|
('exact', layer_digest, 1, 3, prepared['manifest_id'],
|
|
prepared['manifest_id'], prepared['target']),
|
|
('exact', layer_digest, 3, 1, prepared['manifest_id'],
|
|
prepared['manifest_id'], prepared['target']),
|
|
],
|
|
)
|
|
self.assertFalse(outcome['duplicate'])
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_attribution_fanout_at_limit_keeps_all_positions(self):
|
|
db = self._docker_attribution_db()
|
|
try:
|
|
layer_digest = 'sha256:' + ('2' * 64)
|
|
prepared = self._prepare_docker_attribution_bundle(
|
|
db, 'fanout-at-limit', (layer_digest, layer_digest), ({
|
|
'DetectorName': 'FixtureFanoutBound',
|
|
'SourceMetadata': {'Data': {'Docker': {'layer': layer_digest}}},
|
|
},),
|
|
)
|
|
|
|
with mock.patch.object(
|
|
scanner_db, 'DOCKER_DEPTH_MAX_ATTRIBUTION_ROWS_PER_BUNDLE', 2,
|
|
):
|
|
outcome = self._ingest_docker_attribution_bundle(db, prepared)
|
|
|
|
self.assertFalse(outcome['duplicate'])
|
|
self.assertEqual(db.conn.execute(
|
|
'''SELECT COUNT(*) AS count
|
|
FROM docker_finding_layer_attributions
|
|
WHERE scan_binding_id = ?''',
|
|
(prepared['binding_id'],),
|
|
).fetchone()['count'], 2)
|
|
db.conn.commit()
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_attribution_fanout_over_limit_rolls_back_whole_bundle(self):
|
|
db = self._docker_attribution_db()
|
|
try:
|
|
layer_digest = 'sha256:' + ('3' * 64)
|
|
prepared = self._prepare_docker_attribution_bundle(
|
|
db, 'fanout-over-limit', (layer_digest, layer_digest), (
|
|
{
|
|
'DetectorName': 'FixtureFanoutOne',
|
|
'SourceMetadata': {
|
|
'Data': {'Docker': {'layer': layer_digest}},
|
|
},
|
|
},
|
|
{
|
|
'DetectorName': 'FixtureFanoutTwo',
|
|
'SourceMetadata': {
|
|
'Data': {'Docker': {'layer': layer_digest}},
|
|
},
|
|
},
|
|
),
|
|
)
|
|
|
|
with mock.patch.object(
|
|
scanner_db, 'DOCKER_DEPTH_MAX_ATTRIBUTION_ROWS_PER_BUNDLE', 3,
|
|
), self.assertRaises(DockerFindingAttributionLimitError):
|
|
self._ingest_docker_attribution_bundle(db, prepared)
|
|
|
|
state = db.conn.execute(
|
|
'''SELECT reservation.state AS reservation_state,
|
|
bundle.state AS bundle_state,
|
|
(SELECT COUNT(*) FROM target_scans
|
|
WHERE result_reservation_id = reservation.id) AS scans,
|
|
(SELECT COUNT(*) FROM findings) AS findings,
|
|
(SELECT COUNT(*)
|
|
FROM docker_finding_layer_attributions) AS attributions
|
|
FROM result_reservations reservation
|
|
JOIN result_bundles bundle
|
|
ON bundle.reservation_id = reservation.id
|
|
WHERE reservation.id = ?''',
|
|
(prepared['claim']['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
tuple(state[name] for name in (
|
|
'reservation_state', 'bundle_state', 'scans', 'findings',
|
|
'attributions',
|
|
)),
|
|
('ready', 'ready', 0, 0, 0),
|
|
)
|
|
ingester = ResultIngester(
|
|
db, str(self.bundle_root), 'attribution-supervisor',
|
|
)
|
|
ingester.lease = {
|
|
'generation': 1, 'lease_token': 'attribution-ingester',
|
|
}
|
|
with mock.patch.object(
|
|
scanner_db, 'DOCKER_DEPTH_MAX_ATTRIBUTION_ROWS_PER_BUNDLE', 3,
|
|
):
|
|
self.assertTrue(ingester.process_one())
|
|
quarantined = db.conn.execute(
|
|
'''SELECT reservation.state AS reservation_state,
|
|
binding.state AS binding_state,
|
|
target.state AS target_state,
|
|
quarantine.reason_code
|
|
FROM result_reservations reservation
|
|
JOIN docker_depth_experiment_scan_bindings binding
|
|
ON binding.reservation_id = reservation.id
|
|
JOIN docker_depth_experiment_targets target
|
|
ON target.id = binding.experiment_target_id
|
|
JOIN pipeline_quarantine quarantine
|
|
ON quarantine.reservation_id = reservation.id
|
|
WHERE reservation.id = ?''',
|
|
(prepared['claim']['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
tuple(quarantined[name] for name in (
|
|
'reservation_state', 'binding_state', 'target_state',
|
|
'reason_code',
|
|
)),
|
|
(
|
|
'quarantined', 'quarantined', 'quarantined',
|
|
'docker_attribution_limit_exceeded',
|
|
),
|
|
)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_content_fallback_uses_blob_and_bound_manifest_only(self):
|
|
db = self._docker_attribution_db()
|
|
try:
|
|
first_digest = 'sha256:' + ('4' * 64)
|
|
layer_digest = 'sha256:' + ('5' * 64)
|
|
|
|
def findings(manifest_digest, _layers):
|
|
return ({
|
|
'DetectorName': 'FixtureFallback',
|
|
'SourceMetadata': {'Data': {'DockerContent': {
|
|
'manifest_digest': manifest_digest,
|
|
'blob_digest': layer_digest,
|
|
'descriptor_kind': 'layer',
|
|
'positions': [99],
|
|
}}},
|
|
},)
|
|
|
|
prepared = self._prepare_docker_attribution_bundle(
|
|
db, 'docker-content', (first_digest, layer_digest), findings,
|
|
)
|
|
self._ingest_docker_attribution_bundle(db, prepared)
|
|
|
|
row = db.conn.execute(
|
|
'''SELECT attribution_state, reported_layer_digest,
|
|
position_from_base, position_from_top,
|
|
unattributed_reason
|
|
FROM docker_finding_layer_attributions
|
|
WHERE scan_binding_id = ?''',
|
|
(prepared['binding_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
row['attribution_state'], row['reported_layer_digest'],
|
|
row['position_from_base'], row['position_from_top'],
|
|
row['unattributed_reason'],
|
|
),
|
|
('exact', layer_digest, 2, 1, None),
|
|
)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_finding_invalid_evidence_is_explicitly_unattributed(self):
|
|
db = self._docker_attribution_db()
|
|
try:
|
|
layer_digest = 'sha256:' + ('6' * 64)
|
|
absent_digest = 'sha256:' + ('7' * 64)
|
|
other_manifest = 'sha256:' + ('8' * 64)
|
|
|
|
def findings(manifest_digest, _layers):
|
|
return (
|
|
{'DetectorName': 'FixtureAbsent'},
|
|
{
|
|
'DetectorName': 'FixtureMalformed',
|
|
'SourceMetadata': {
|
|
'Data': {'Docker': {'layer': 'sha256:' + ('A' * 64)}},
|
|
},
|
|
},
|
|
{
|
|
'DetectorName': 'FixtureNotInManifest',
|
|
'SourceMetadata': {
|
|
'Data': {'Docker': {'layer': absent_digest}},
|
|
},
|
|
},
|
|
{
|
|
'DetectorName': 'FixtureManifestMismatch',
|
|
'SourceMetadata': {'Data': {'DockerContent': {
|
|
'manifest_digest': other_manifest,
|
|
'blob_digest': layer_digest,
|
|
'descriptor_kind': 'layer',
|
|
}}},
|
|
},
|
|
{
|
|
'DetectorName': 'FixtureMalformedFallback',
|
|
'SourceMetadata': {'Data': {'DockerContent': {
|
|
'manifest_digest': manifest_digest,
|
|
'blob_digest': 'not-a-digest',
|
|
'descriptor_kind': 'layer',
|
|
}}},
|
|
},
|
|
)
|
|
|
|
prepared = self._prepare_docker_attribution_bundle(
|
|
db, 'unattributed', (layer_digest,), findings,
|
|
)
|
|
self._ingest_docker_attribution_bundle(db, prepared)
|
|
|
|
rows = db.conn.execute(
|
|
'''SELECT finding.detector_name, attribution.attribution_state,
|
|
attribution.unattributed_reason,
|
|
attribution.reported_layer_digest,
|
|
attribution.manifest_layer_id
|
|
FROM docker_finding_layer_attributions attribution
|
|
JOIN findings finding ON finding.id = attribution.finding_id
|
|
WHERE attribution.scan_binding_id = ?
|
|
ORDER BY finding.detector_name''',
|
|
(prepared['binding_id'],),
|
|
).fetchall()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
{
|
|
row['detector_name']: (
|
|
row['attribution_state'], row['unattributed_reason'],
|
|
row['reported_layer_digest'], row['manifest_layer_id'],
|
|
)
|
|
for row in rows
|
|
},
|
|
{
|
|
'FixtureAbsent': ('unattributed', 'digest_absent', None, None),
|
|
'FixtureMalformed': ('unattributed', 'digest_invalid', None, None),
|
|
'FixtureNotInManifest': (
|
|
'unattributed', 'digest_not_in_manifest', None, None,
|
|
),
|
|
'FixtureManifestMismatch': (
|
|
'unattributed', 'manifest_mismatch', None, None,
|
|
),
|
|
'FixtureMalformedFallback': (
|
|
'unattributed', 'digest_invalid', None, None,
|
|
),
|
|
},
|
|
)
|
|
self.assertEqual(len(rows), 5)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_finding_unbound_and_stale_reservations_are_not_attributed(self):
|
|
db = self._docker_attribution_db()
|
|
try:
|
|
layer_digest = 'sha256:' + ('9' * 64)
|
|
finding = ({
|
|
'DetectorName': 'FixtureUnbound',
|
|
'SourceMetadata': {'Data': {'Docker': {'layer': layer_digest}}},
|
|
},)
|
|
unbound = self._prepare_docker_attribution_bundle(
|
|
db, 'unbound', (layer_digest,), finding, experiment_bound=False,
|
|
)
|
|
self._ingest_docker_attribution_bundle(db, unbound)
|
|
self.assertEqual(db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM docker_finding_layer_attributions'
|
|
).fetchone()['count'], 0)
|
|
db.conn.commit()
|
|
|
|
stale = self._prepare_docker_attribution_bundle(
|
|
db, 'stale', (layer_digest,), finding,
|
|
)
|
|
current_generation_pass = db.conn.execute(
|
|
'''UPDATE docker_depth_experiment_targets
|
|
SET reservation_count = 2 WHERE id = ?''',
|
|
(stale['target_id'],),
|
|
)
|
|
db.conn.commit()
|
|
with self.assertRaisesRegex(
|
|
ScanEventConflictError, 'exact reservation target identity'):
|
|
self._ingest_docker_attribution_bundle(db, stale)
|
|
state = db.conn.execute(
|
|
'''SELECT reservation.state AS reservation_state,
|
|
bundle.state AS bundle_state,
|
|
(SELECT COUNT(*) FROM target_scans
|
|
WHERE result_reservation_id = reservation.id) AS scan_count,
|
|
(SELECT COUNT(*) FROM docker_finding_layer_attributions
|
|
WHERE scan_binding_id = ?) AS attribution_count
|
|
FROM result_reservations reservation
|
|
JOIN result_bundles bundle
|
|
ON bundle.reservation_id = reservation.id
|
|
WHERE reservation.id = ?''',
|
|
(stale['binding_id'], stale['claim']['reservation_id']),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
state['reservation_state'], state['bundle_state'],
|
|
state['scan_count'], state['attribution_count'],
|
|
),
|
|
('ready', 'ready', 0, 0),
|
|
)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_ingestion_rejects_cross_reservation_bundle_target_without_leaking_it(self):
|
|
db = self._docker_attribution_db()
|
|
try:
|
|
prepared = self._prepare_docker_attribution_bundle(
|
|
db, 'cross-reservation-content',
|
|
('sha256:' + ('9' * 64),), (),
|
|
)
|
|
prepared['path'].unlink()
|
|
cross_target = 'owner/private-cross-reservation@sha256:' + ('8' * 64)
|
|
cross_secret = 'SECRET_CROSS_RESERVATION_SENTINEL'
|
|
with ResultBundleWriter.open(
|
|
str(self.bundle_root), BundleReservation.from_mapping(prepared['claim']),
|
|
) as writer:
|
|
writer.write_finding({
|
|
'DetectorName': 'FixtureCrossReservation',
|
|
'Raw': cross_secret,
|
|
'finding_uid': '7' * 64,
|
|
})
|
|
commit = writer.finish({
|
|
'reservation_id': prepared['claim']['reservation_id'],
|
|
'queue_id': prepared['claim']['queue_id'],
|
|
'bundle_id': prepared['claim']['bundle_id'],
|
|
'scan_event_id': prepared['claim']['scan_event_id'],
|
|
'source': 'dockerhub', 'platform': 'docker',
|
|
'query': prepared['claim']['query'],
|
|
'target': cross_target,
|
|
'normalized_target': cross_target,
|
|
'scan_type': 'docker', 'status': 'found',
|
|
'timestamp': '2026-09-10T00:00:00+00:00',
|
|
'queue_status': 'done',
|
|
})
|
|
db.conn.execute(
|
|
'''UPDATE result_bundles
|
|
SET scan_event_hash = ?, actual_bytes = ?, frame_count = ?,
|
|
finding_count = ?, error_count = ?, candidate_count = ?
|
|
WHERE reservation_id = ?''',
|
|
(
|
|
commit.scan_event_hash, commit.actual_bytes, commit.frame_count,
|
|
commit.finding_count, commit.error_count,
|
|
commit.candidate_count, prepared['claim']['reservation_id'],
|
|
),
|
|
)
|
|
bundle = dict(db.conn.execute(
|
|
'SELECT * FROM result_bundles WHERE reservation_id = ?',
|
|
(prepared['claim']['reservation_id'],),
|
|
).fetchone())
|
|
db.conn.commit()
|
|
|
|
with self.assertRaisesRegex(ValueError, 'scan identity') as raised:
|
|
db.ingest_result_bundle(
|
|
ResultBundleReader(str(prepared['path'])),
|
|
prepared['reservation'], bundle,
|
|
)
|
|
|
|
self.assertNotIn(cross_target, str(raised.exception))
|
|
self.assertNotIn(cross_secret, str(raised.exception))
|
|
state = db.conn.execute(
|
|
'''SELECT reservation.state AS reservation_state,
|
|
bundle.state AS bundle_state,
|
|
(SELECT COUNT(*) FROM target_scans) AS scans,
|
|
(SELECT COUNT(*) FROM findings) AS findings
|
|
FROM result_reservations reservation
|
|
JOIN result_bundles bundle
|
|
ON bundle.reservation_id = reservation.id
|
|
WHERE reservation.id = ?''',
|
|
(prepared['claim']['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
tuple(state[name] for name in (
|
|
'reservation_state', 'bundle_state', 'scans', 'findings',
|
|
)),
|
|
('ready', 'ready', 0, 0),
|
|
)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_finding_attribution_replay_and_concurrent_ingestion_are_idempotent(self):
|
|
db = self._docker_attribution_db()
|
|
try:
|
|
layer_digest = 'sha256:' + ('a' * 64)
|
|
prepared = self._prepare_docker_attribution_bundle(
|
|
db, 'concurrent-replay', (layer_digest,), ({
|
|
'DetectorName': 'FixtureReplay',
|
|
'SourceMetadata': {'Data': {'Docker': {'layer': layer_digest}}},
|
|
},),
|
|
)
|
|
barrier = threading.Barrier(2)
|
|
outcomes = []
|
|
errors = []
|
|
|
|
def ingest():
|
|
thread_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
barrier.wait(timeout=10)
|
|
outcomes.append(self._ingest_docker_attribution_bundle(
|
|
thread_db, prepared,
|
|
))
|
|
except Exception as exc:
|
|
errors.append(exc)
|
|
finally:
|
|
thread_db.close()
|
|
|
|
threads = [threading.Thread(target=ingest) for _ in range(2)]
|
|
for thread in threads:
|
|
thread.start()
|
|
for thread in threads:
|
|
thread.join(timeout=15)
|
|
self.assertTrue(all(not thread.is_alive() for thread in threads))
|
|
self.assertFalse(errors, errors)
|
|
self.assertEqual(
|
|
sorted(outcome['duplicate'] for outcome in outcomes),
|
|
[False, True],
|
|
)
|
|
replay = self._ingest_docker_attribution_bundle(db, prepared)
|
|
self.assertTrue(replay['duplicate'])
|
|
counts = db.conn.execute(
|
|
'''SELECT
|
|
(SELECT COUNT(*) FROM target_scans
|
|
WHERE result_reservation_id = ?) AS scans,
|
|
(SELECT COUNT(*) FROM findings
|
|
WHERE target_scan_id = ?) AS findings,
|
|
(SELECT COUNT(*) FROM docker_finding_layer_attributions
|
|
WHERE scan_binding_id = ?) AS attributions''',
|
|
(
|
|
prepared['claim']['reservation_id'], replay['target_scan_id'],
|
|
prepared['binding_id'],
|
|
),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
(counts['scans'], counts['findings'], counts['attributions']),
|
|
(1, 1, 1),
|
|
)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_finding_attribution_failure_rolls_back_result_bundle(self):
|
|
import psycopg
|
|
|
|
db = self._docker_attribution_db()
|
|
try:
|
|
layer_digest = 'sha256:' + ('b' * 64)
|
|
prepared = self._prepare_docker_attribution_bundle(
|
|
db, 'attribution-rollback', (layer_digest,), ({
|
|
'DetectorName': 'FixtureRollback',
|
|
'SourceMetadata': {'Data': {'Docker': {'layer': layer_digest}}},
|
|
},),
|
|
)
|
|
db.conn.execute(
|
|
'''CREATE FUNCTION fail_finding_layer_attribution() RETURNS trigger
|
|
LANGUAGE plpgsql AS $$
|
|
BEGIN RAISE EXCEPTION 'synthetic attribution rollback'; END $$'''
|
|
)
|
|
db.conn.execute(
|
|
'''CREATE TRIGGER fail_finding_layer_attribution
|
|
BEFORE INSERT ON docker_finding_layer_attributions
|
|
FOR EACH ROW EXECUTE FUNCTION fail_finding_layer_attribution()'''
|
|
)
|
|
db.conn.commit()
|
|
|
|
with self.assertRaises(psycopg.errors.RaiseException):
|
|
self._ingest_docker_attribution_bundle(db, prepared)
|
|
|
|
state = db.conn.execute(
|
|
'''SELECT reservation.state AS reservation_state,
|
|
bundle.state AS bundle_state,
|
|
queue.status AS queue_state,
|
|
(SELECT COUNT(*) FROM target_scans
|
|
WHERE result_reservation_id = reservation.id) AS scans,
|
|
(SELECT COUNT(*) FROM findings) AS findings,
|
|
(SELECT COUNT(*) FROM docker_finding_layer_attributions)
|
|
AS attributions
|
|
FROM result_reservations reservation
|
|
JOIN result_bundles bundle
|
|
ON bundle.reservation_id = reservation.id
|
|
JOIN target_queue queue ON queue.id = reservation.queue_id
|
|
WHERE reservation.id = ?''',
|
|
(prepared['claim']['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
state['reservation_state'], state['bundle_state'],
|
|
state['queue_state'], state['scans'], state['findings'],
|
|
state['attributions'],
|
|
),
|
|
('ready', 'ready', 'in_progress', 0, 0, 0),
|
|
)
|
|
|
|
db.conn.execute(
|
|
'DROP TRIGGER fail_finding_layer_attribution '
|
|
'ON docker_finding_layer_attributions'
|
|
)
|
|
db.conn.execute('DROP FUNCTION fail_finding_layer_attribution()')
|
|
db.conn.commit()
|
|
outcome = self._ingest_docker_attribution_bundle(db, prepared)
|
|
self.assertFalse(outcome['duplicate'])
|
|
self.assertEqual(db.conn.execute(
|
|
'''SELECT COUNT(*) AS count
|
|
FROM docker_finding_layer_attributions
|
|
WHERE scan_binding_id = ?''',
|
|
(prepared['binding_id'],),
|
|
).fetchone()['count'], 1)
|
|
db.conn.commit()
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_depth_report_leaves_postgres_connection_idle(self):
|
|
import psycopg
|
|
|
|
db = self._docker_attribution_db()
|
|
try:
|
|
prepared = self._prepare_docker_attribution_bundle(
|
|
db, 'report-transaction-state',
|
|
('sha256:' + ('c' * 64),), (),
|
|
)
|
|
|
|
experiment_id = db.conn.execute(
|
|
'''SELECT experiment_id
|
|
FROM docker_depth_experiment_targets WHERE id = ?''',
|
|
(prepared['target_id'],),
|
|
).fetchone()['experiment_id']
|
|
db.conn.commit()
|
|
report = build_docker_depth_report(
|
|
db.conn, experiment_id=experiment_id,
|
|
)
|
|
|
|
self.assertEqual(
|
|
db.conn._conn.info.transaction_status,
|
|
psycopg.pq.TransactionStatus.IDLE,
|
|
)
|
|
self.assertTrue(report['snapshot']['read_only'])
|
|
self.assertEqual(
|
|
report['snapshot']['consistency'], 'repeatable_read',
|
|
)
|
|
self.assertEqual(report['physical']['totals']['target_count'], 1)
|
|
self.assertEqual(report['physical']['totals']['targets_with_scans'], 0)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_depth_schema_constraints_and_fk_actions_fail_closed(self):
|
|
import psycopg
|
|
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
for table, name in scanner_db.DOCKER_DEPTH_SCHEMA_AUTHORITY_CHECKS:
|
|
db.conn.execute(
|
|
f'ALTER TABLE {scanner_db._quoted_pg_name(table)} '
|
|
f'DROP CONSTRAINT {scanner_db._quoted_pg_name(name)}'
|
|
)
|
|
db.conn.execute(
|
|
'DELETE FROM runtime_schema_migrations WHERE version = ?',
|
|
(scanner_db.DOCKER_DEPTH_SCHEMA_SELECTOR_AUTHORITY_MIGRATION,),
|
|
)
|
|
db.conn.commit()
|
|
self.assertFalse(db.runtime_safety_schema_available())
|
|
migrate_runtime_safety_schema(db)
|
|
migrate_runtime_safety_schema(db)
|
|
marker = db.conn.execute(
|
|
'''SELECT COUNT(*) AS count, MIN(code_sha256) AS code_sha256
|
|
FROM runtime_schema_migrations WHERE version = ?''',
|
|
(scanner_db.DOCKER_DEPTH_SCHEMA_SELECTOR_AUTHORITY_MIGRATION,),
|
|
).fetchone()
|
|
self.assertEqual(marker['count'], 1)
|
|
self.assertEqual(
|
|
marker['code_sha256'],
|
|
hashlib.sha256(PIPELINE_SCHEMA_SQL.encode('utf-8')).hexdigest(),
|
|
)
|
|
self.assertTrue(db.runtime_safety_schema_available(), db.last_error)
|
|
generation_policy = '8' * 64
|
|
generation_queries = '9' * 64
|
|
self.assertFalse(db.dockerhub_discovery_generation_complete(
|
|
'dockerhub', depth.DOCKER_DEPTH_COLLECTION_GENERATION,
|
|
generation_queries, 61, generation_policy,
|
|
))
|
|
generation_now = scanner_db.utc_now_iso()
|
|
db.conn.execute(
|
|
'''INSERT INTO docker_discovery_passes(
|
|
pass_token, source, pass_kind, collection_generation,
|
|
policy_sha256, ordered_queries_sha256,
|
|
expected_query_count, completed_query_count, state,
|
|
started_at, completed_at, created_at, updated_at
|
|
) VALUES ('pg-legacy-generation', 'dockerhub', 'deep', 'legacy',
|
|
?, ?, 61, 61, 'complete', ?, ?, ?, ?)''',
|
|
(
|
|
generation_policy, generation_queries, generation_now,
|
|
generation_now, generation_now, generation_now,
|
|
),
|
|
)
|
|
db.conn.commit()
|
|
self.assertFalse(db.dockerhub_discovery_generation_complete(
|
|
'dockerhub', depth.DOCKER_DEPTH_COLLECTION_GENERATION,
|
|
generation_queries, 61, generation_policy,
|
|
))
|
|
current_generation_pass = db.conn.execute(
|
|
'''INSERT INTO docker_discovery_passes(
|
|
pass_token, source, pass_kind, collection_generation,
|
|
policy_sha256, ordered_queries_sha256,
|
|
expected_query_count, completed_query_count, state,
|
|
started_at, completed_at, created_at, updated_at
|
|
) VALUES ('pg-current-generation', 'dockerhub', 'deep', ?,
|
|
?, ?, 61, 61, 'complete', ?, ?, ?, ?)
|
|
RETURNING id''',
|
|
(
|
|
depth.DOCKER_DEPTH_COLLECTION_GENERATION,
|
|
generation_policy, generation_queries, generation_now,
|
|
generation_now, generation_now, generation_now,
|
|
),
|
|
).fetchone()
|
|
db.conn.execute(
|
|
'''INSERT INTO docker_discovery_pages(
|
|
pass_id, query, query_ordinal, page_number, result_count,
|
|
total_count, admitted_count, query_complete, admission_kind,
|
|
page_sha256, observed_at, created_at
|
|
) SELECT ?, 'generation-' || ordinal, ordinal, 1, 0, 0, 0, 1,
|
|
'main', lpad(to_hex(ordinal + 1), 64, '0'), ?, ?
|
|
FROM generate_series(0, 60) AS ordinal''',
|
|
(current_generation_pass['id'], generation_now, generation_now),
|
|
)
|
|
db.conn.commit()
|
|
self.assertTrue(db.dockerhub_discovery_generation_complete(
|
|
'dockerhub', depth.DOCKER_DEPTH_COLLECTION_GENERATION,
|
|
generation_queries, 61, generation_policy,
|
|
))
|
|
for table, expected_constraints in (
|
|
scanner_db.DOCKER_DEPTH_EXPERIMENT_CHECK_SPECS.items()
|
|
):
|
|
constraints = db.conn.table_check_constraints(table)
|
|
for name, expression in expected_constraints.items():
|
|
self.assertIn(name, constraints)
|
|
self.assertTrue(constraints[name]['valid'])
|
|
self.assertEqual(
|
|
scanner_db._normalized_check_expression(
|
|
constraints[name]['expression'],
|
|
),
|
|
scanner_db._normalized_check_expression(expression),
|
|
)
|
|
|
|
foreign_key_tables = set(scanner_db.DOCKER_DEPTH_EXPERIMENT_TABLES) | {
|
|
'discovery_retry_queue', 'target_queue_policy_events',
|
|
}
|
|
for foreign_key_table in foreign_key_tables:
|
|
foreign_keys = db.conn.table_foreign_keys(foreign_key_table)
|
|
for columns, referenced_table, referenced_columns in (
|
|
scanner_db.REQUIRED_FOREIGN_KEYS.get(foreign_key_table, ())
|
|
):
|
|
matches = [
|
|
foreign_key for foreign_key in foreign_keys.values()
|
|
if tuple(foreign_key['columns']) == columns
|
|
and foreign_key['referenced_table'] == referenced_table
|
|
and tuple(foreign_key['referenced_columns']) == referenced_columns
|
|
]
|
|
self.assertEqual(len(matches), 1)
|
|
self.assertEqual(
|
|
(matches[0]['update_action'], matches[0]['delete_action']),
|
|
scanner_db._required_foreign_key_actions(
|
|
foreign_key_table, columns,
|
|
),
|
|
)
|
|
|
|
now = datetime.now(timezone.utc).isoformat(timespec='seconds')
|
|
with self.assertRaises(psycopg.errors.CheckViolation):
|
|
db.conn.execute(
|
|
'''INSERT INTO docker_depth_experiments(
|
|
experiment_key, source, config_sha256,
|
|
ordered_queries_sha256, selector_version,
|
|
selector_sha256, provenance_policy_sha256,
|
|
query_count, repositories_per_query,
|
|
images_per_repository, target_limit, created_at, updated_at
|
|
) VALUES ('invalid-hash', 'dockerhub', ?, ?, 'selector-v1',
|
|
?, ?, 1, 1, 1, 1, ?, ?)''',
|
|
('g' * 64, 'a' * 64, 'b' * 64, 'c' * 64, now, now),
|
|
)
|
|
db.conn.rollback()
|
|
|
|
with self.assertRaises(psycopg.errors.CheckViolation):
|
|
db.conn.execute(
|
|
'''INSERT INTO discovery_retry_queue(
|
|
work_key, source, query, policy_sha256, pass_kind,
|
|
work_kind, page_start, page_end, next_page, status,
|
|
attempts, created_at, updated_at
|
|
) VALUES (?, 'dockerhub', 'pg-check-query', ?, 'ordinary',
|
|
'page', 1, 1, 1, 'pending', 0, ?, ?)''',
|
|
('a' * 64, 'A' * 64, now, now),
|
|
)
|
|
db.conn.rollback()
|
|
|
|
db.enqueue_targets(
|
|
'dockerhub', 'docker', 'pg-policy-query', ['owner/pg-policy'],
|
|
)
|
|
queue = db.conn.execute(
|
|
'''SELECT id, updated_at FROM target_queue
|
|
WHERE source = 'dockerhub' AND normalized_target = 'owner/pg-policy' ''',
|
|
).fetchone()
|
|
policy_experiment = db.conn.execute(
|
|
'''INSERT INTO docker_depth_experiments(
|
|
experiment_key, source, config_sha256,
|
|
ordered_queries_sha256, selector_version, selector_sha256,
|
|
provenance_policy_sha256, query_count,
|
|
repositories_per_query, images_per_repository, target_limit,
|
|
created_at, updated_at
|
|
) VALUES ('pg-policy-check', 'dockerhub', ?, ?, 'selector-v1',
|
|
?, ?, 1, 1, 1, 1, ?, ?) RETURNING id''',
|
|
('1' * 64, '2' * 64, '3' * 64, '4' * 64, now, now),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
invalid_policy_events = (
|
|
(
|
|
"'cold', 'deferred', 'cold', "
|
|
"'dockerhub', 'docker', 'pg-policy-query', "
|
|
"'docker_depth_experiment_hold', NULL",
|
|
'5' * 64,
|
|
),
|
|
(
|
|
"'reactivate', 'cold', 'pending', "
|
|
"'dockerhub', 'docker', 'pg-policy-query', "
|
|
"'reviewed_policy_reactivation', NULL",
|
|
'6' * 64,
|
|
),
|
|
(
|
|
"'cold', 'deferred', 'cold', "
|
|
"'dockerhub', 'docker', 'pg-policy-query', "
|
|
"'docker_depth_experiment_hold', ?",
|
|
'A' * 64,
|
|
),
|
|
)
|
|
for values_sql, config_sha256 in invalid_policy_events:
|
|
with self.subTest(policy_values=values_sql), self.assertRaises(
|
|
psycopg.errors.CheckViolation
|
|
):
|
|
params = [queue['id']]
|
|
if values_sql.endswith('?'):
|
|
params.append(policy_experiment['id'])
|
|
params.extend((
|
|
config_sha256, '7' * 64, '8' * 64, '9' * 64,
|
|
queue['updated_at'], now,
|
|
))
|
|
db.conn.execute(
|
|
f'''INSERT INTO target_queue_policy_events(
|
|
queue_id, action, prior_status, next_status,
|
|
source, platform, query, reason_code, experiment_id,
|
|
config_sha256, policy_sha256, manifest_sha256,
|
|
review_audit_sha256, prior_updated_at, created_at
|
|
) VALUES (?, {values_sql}, ?, ?, ?, ?, ?, ?)''',
|
|
tuple(params),
|
|
)
|
|
db.conn.rollback()
|
|
|
|
table = 'docker_depth_experiments'
|
|
dropped_name = 'docker_depth_experiments_capacity_check'
|
|
db.conn.execute(
|
|
f'ALTER TABLE {table} DROP CONSTRAINT {dropped_name}'
|
|
)
|
|
self.assertFalse(db.runtime_safety_schema_available(commit=False))
|
|
self.assertIn(dropped_name, db.last_error)
|
|
with self.assertRaisesRegex(RuntimeSafetySchemaError, 'noncanonical check constraint'):
|
|
migrate_runtime_safety_schema(db)
|
|
self.assertTrue(db.runtime_safety_schema_available(), db.last_error)
|
|
|
|
malformed_name = 'docker_depth_experiments_identity_check'
|
|
db.conn.execute(
|
|
f'ALTER TABLE {table} DROP CONSTRAINT {malformed_name}'
|
|
)
|
|
db.conn.execute(
|
|
f'''ALTER TABLE {table} ADD CONSTRAINT {malformed_name}
|
|
CHECK (length(config_sha256) = 64)'''
|
|
)
|
|
self.assertFalse(db.runtime_safety_schema_available(commit=False))
|
|
self.assertIn(malformed_name, db.last_error)
|
|
with self.assertRaisesRegex(RuntimeSafetySchemaError, 'noncanonical check constraint'):
|
|
migrate_runtime_safety_schema(db)
|
|
self.assertTrue(db.runtime_safety_schema_available(), db.last_error)
|
|
|
|
unvalidated_name = 'docker_depth_experiments_fence_check'
|
|
unvalidated_expression = scanner_db.DOCKER_DEPTH_EXPERIMENT_CHECK_SPECS[
|
|
table
|
|
][unvalidated_name]
|
|
db.conn.execute(
|
|
f'ALTER TABLE {table} DROP CONSTRAINT {unvalidated_name}'
|
|
)
|
|
db.conn.execute(
|
|
f'''ALTER TABLE {table} ADD CONSTRAINT {unvalidated_name}
|
|
CHECK ({unvalidated_expression}) NOT VALID'''
|
|
)
|
|
self.assertFalse(db.runtime_safety_schema_available(commit=False))
|
|
self.assertIn(unvalidated_name, db.last_error)
|
|
with self.assertRaisesRegex(RuntimeSafetySchemaError, 'noncanonical check constraint'):
|
|
migrate_runtime_safety_schema(db)
|
|
self.assertTrue(db.runtime_safety_schema_available(), db.last_error)
|
|
|
|
for malformed_table, malformed_check in (
|
|
('discovery_retry_queue', 'discovery_retry_queue_lifecycle_check'),
|
|
(
|
|
'target_queue_policy_events',
|
|
'target_queue_policy_events_transition_check',
|
|
),
|
|
):
|
|
with self.subTest(
|
|
malformed_table=malformed_table,
|
|
malformed_check=malformed_check,
|
|
):
|
|
db.conn.execute(
|
|
f'ALTER TABLE {scanner_db._quoted_pg_name(malformed_table)} '
|
|
f'DROP CONSTRAINT {scanner_db._quoted_pg_name(malformed_check)}'
|
|
)
|
|
db.conn.execute(
|
|
f'ALTER TABLE {scanner_db._quoted_pg_name(malformed_table)} '
|
|
f'ADD CONSTRAINT {scanner_db._quoted_pg_name(malformed_check)} '
|
|
'CHECK (1 = 1)'
|
|
)
|
|
self.assertFalse(
|
|
db.runtime_safety_schema_available(commit=False)
|
|
)
|
|
self.assertIn(malformed_check, db.last_error)
|
|
with self.assertRaisesRegex(
|
|
RuntimeSafetySchemaError, 'noncanonical check constraint',
|
|
):
|
|
migrate_runtime_safety_schema(db)
|
|
self.assertTrue(
|
|
db.runtime_safety_schema_available(), db.last_error,
|
|
)
|
|
|
|
binding_table = 'docker_depth_experiment_scan_bindings'
|
|
foreign_keys = db.conn.table_foreign_keys(binding_table)
|
|
foreign_key_name = next(
|
|
name for name, foreign_key in foreign_keys.items()
|
|
if foreign_key['columns'] == ['experiment_target_id']
|
|
)
|
|
db.conn.execute(
|
|
f'ALTER TABLE {binding_table} DROP CONSTRAINT '
|
|
f'{scanner_db._quoted_pg_name(foreign_key_name)}'
|
|
)
|
|
db.conn.execute(
|
|
f'''ALTER TABLE {binding_table}
|
|
ADD CONSTRAINT {scanner_db._quoted_pg_name(foreign_key_name)}
|
|
FOREIGN KEY (experiment_target_id)
|
|
REFERENCES public.docker_depth_experiment_targets(id)
|
|
ON UPDATE NO ACTION ON DELETE CASCADE'''
|
|
)
|
|
self.assertFalse(db.runtime_safety_schema_available(commit=False))
|
|
self.assertIn('actions ON UPDATE NO ACTION ON DELETE NO ACTION', db.last_error)
|
|
with self.assertRaisesRegex(RuntimeSafetySchemaError, 'foreign key actions'):
|
|
migrate_runtime_safety_schema(db)
|
|
self.assertTrue(db.runtime_safety_schema_available(), db.last_error)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_depth_scarcity_cohort_migration_backfills_existing_queries(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
now = scanner_db.utc_now_iso()
|
|
digest = '7' * 64
|
|
experiment_id = db.conn.execute(
|
|
'''INSERT INTO docker_depth_experiments(
|
|
experiment_key, source, state, config_sha256,
|
|
ordered_queries_sha256, selector_version, selector_sha256,
|
|
provenance_policy_sha256, query_count,
|
|
repositories_per_query, images_per_repository, target_limit,
|
|
created_at, updated_at
|
|
) VALUES ('scarcity-migration', 'dockerhub', 'held', ?, ?,
|
|
'selector-v1', ?, ?, 1, 10, 10, 1200, ?, ?)
|
|
RETURNING id''',
|
|
(digest, digest, digest, digest, now, now),
|
|
).fetchone()['id']
|
|
db.conn.execute(
|
|
'''INSERT INTO docker_depth_experiment_queries(
|
|
experiment_id, source, query_ordinal, query, query_sha256,
|
|
required_repository_count, selected_repository_count,
|
|
created_at
|
|
) VALUES (?, 'dockerhub', 0, 'scarcity-query', ?, 7, 7, ?)''',
|
|
(experiment_id, digest, now),
|
|
)
|
|
db.conn.execute(
|
|
'DELETE FROM runtime_schema_migrations WHERE version = ?',
|
|
(scanner_db.DOCKER_DEPTH_SCARCITY_COHORT_MIGRATION,),
|
|
)
|
|
db.conn.execute(
|
|
'''ALTER TABLE docker_depth_experiment_queries
|
|
DROP COLUMN selected_repository_count'''
|
|
)
|
|
db.conn.commit()
|
|
|
|
self.assertFalse(db.runtime_safety_schema_available())
|
|
migrate_runtime_safety_schema(db)
|
|
migrate_runtime_safety_schema(db)
|
|
|
|
row = db.conn.execute(
|
|
'''SELECT required_repository_count, selected_repository_count
|
|
FROM docker_depth_experiment_queries
|
|
WHERE experiment_id = ? AND query_ordinal = 0''',
|
|
(experiment_id,),
|
|
).fetchone()
|
|
self.assertEqual(
|
|
(row['required_repository_count'], row['selected_repository_count']),
|
|
(7, 7),
|
|
)
|
|
self.assertIn(
|
|
'docker_depth_experiment_queries_selection_check',
|
|
db.conn.table_check_constraints('docker_depth_experiment_queries'),
|
|
)
|
|
marker = db.conn.execute(
|
|
'''SELECT COUNT(*) AS count
|
|
FROM runtime_schema_migrations WHERE version = ?''',
|
|
(scanner_db.DOCKER_DEPTH_SCARCITY_COHORT_MIGRATION,),
|
|
).fetchone()
|
|
self.assertEqual(marker['count'], 1)
|
|
self.assertTrue(db.runtime_safety_schema_available(), db.last_error)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_depth_hold_query_index_migration_is_additive(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.conn.execute('DROP INDEX idx_target_scans_queue_id')
|
|
db.conn.execute(
|
|
'DELETE FROM runtime_schema_migrations WHERE version = ?',
|
|
(scanner_db.DOCKER_DEPTH_HOLD_QUERY_INDEX_MIGRATION,),
|
|
)
|
|
db.conn.commit()
|
|
|
|
self.assertFalse(db.runtime_safety_schema_available())
|
|
migrate_runtime_safety_schema(db)
|
|
migrate_runtime_safety_schema(db)
|
|
index = db.conn.table_indexes('target_scans')[
|
|
'idx_target_scans_queue_id'
|
|
]
|
|
self.assertEqual(index['columns'], ['queue_id'])
|
|
marker = db.conn.execute(
|
|
'''SELECT COUNT(*) AS count
|
|
FROM runtime_schema_migrations WHERE version = ?''',
|
|
(scanner_db.DOCKER_DEPTH_HOLD_QUERY_INDEX_MIGRATION,),
|
|
).fetchone()
|
|
self.assertEqual(marker['count'], 1)
|
|
self.assertTrue(db.runtime_safety_schema_available(), db.last_error)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_discovery_retry_migration_concurrent_claim_reclaim_and_fencing(self):
|
|
setup_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
retry_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(setup_db, initialize_base=True)
|
|
self.assertTrue(setup_db.runtime_safety_schema_available(), setup_db.last_error)
|
|
self.assertEqual(
|
|
set(setup_db.conn.table_columns('discovery_retry_queue')),
|
|
set(scanner_db.DISCOVERY_RETRY_QUEUE_COLUMN_SPECS),
|
|
)
|
|
indexes = setup_db.conn.table_indexes('discovery_retry_queue')
|
|
self.assertTrue(indexes['uq_discovery_retry_queue_work_key']['unique'])
|
|
self.assertEqual(
|
|
indexes['idx_discovery_retry_queue_due']['columns'],
|
|
['source', 'available_after', 'id'],
|
|
)
|
|
marker = setup_db.conn.execute(
|
|
'SELECT version FROM runtime_schema_migrations WHERE version = ?',
|
|
(PIPELINE_MIGRATION_VERSIONS[-1],),
|
|
).fetchone()
|
|
self.assertIsNotNone(marker)
|
|
|
|
policy = 'c' * 64
|
|
enqueued = setup_db.enqueue_discovery_retry(
|
|
'dockerhub', 'integration-query', policy, 'ordinary', 'page', 2, 2,
|
|
error_category='network',
|
|
)
|
|
coalesced = setup_db.enqueue_discovery_retry(
|
|
'dockerhub', 'integration-query', policy, 'ordinary', 'page', 2, 2,
|
|
error_category='auth_unavailable',
|
|
)
|
|
self.assertEqual(coalesced['id'], enqueued['id'])
|
|
self.assertEqual(coalesced['inserted_count'], 0)
|
|
self.assertEqual(coalesced['coalesced_count'], 1)
|
|
barrier = threading.Barrier(2)
|
|
claims = []
|
|
failures = []
|
|
claim_lock = threading.Lock()
|
|
|
|
def claim(owner):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
barrier.wait(10)
|
|
result = db.claim_discovery_retries(
|
|
'dockerhub', {'integration-query': policy}, owner,
|
|
limit=1, lease_seconds=60,
|
|
)
|
|
with claim_lock:
|
|
claims.extend(result)
|
|
except Exception as exc:
|
|
with claim_lock:
|
|
failures.append(exc)
|
|
finally:
|
|
db.close()
|
|
|
|
workers = [
|
|
threading.Thread(target=claim, args=(f'owner-{index}',))
|
|
for index in range(2)
|
|
]
|
|
for worker in workers:
|
|
worker.start()
|
|
for worker in workers:
|
|
worker.join(15)
|
|
self.assertFalse(failures)
|
|
self.assertEqual(len(claims), 1)
|
|
first_claim = claims[0]
|
|
self.assertEqual(first_claim['id'], enqueued['id'])
|
|
renewed = setup_db.renew_discovery_retry_lease(
|
|
first_claim['id'], first_claim['lease_owner'],
|
|
first_claim['lease_token'], lease_seconds=120,
|
|
)
|
|
self.assertEqual(renewed['status'], 'leased')
|
|
self.assertGreater(
|
|
renewed['lease_expires_at'], first_claim['lease_expires_at'],
|
|
)
|
|
|
|
setup_db.conn.execute(
|
|
"UPDATE discovery_retry_queue SET lease_expires_at = '2000-01-01T00:00:00+00:00' WHERE id = ?",
|
|
(enqueued['id'],),
|
|
)
|
|
setup_db.conn.commit()
|
|
reclaimed = retry_db.claim_discovery_retries(
|
|
'dockerhub', {'integration-query': policy}, 'reclaimer',
|
|
limit=1, lease_seconds=60,
|
|
)[0]
|
|
self.assertEqual(reclaimed['attempts'], 2)
|
|
self.assertNotEqual(reclaimed['lease_token'], first_claim['lease_token'])
|
|
with self.assertRaises(DiscoveryRetryLeaseError):
|
|
setup_db.finish_discovery_retry(
|
|
first_claim['id'], first_claim['lease_owner'], first_claim['lease_token'],
|
|
)
|
|
|
|
deferred = retry_db.update_discovery_retry(
|
|
reclaimed['id'], reclaimed['lease_owner'], reclaimed['lease_token'],
|
|
'remote_transient',
|
|
)
|
|
self.assertEqual(deferred['attempts'], 2)
|
|
retry_db.conn.execute(
|
|
'UPDATE discovery_retry_queue SET available_after = NULL WHERE id = ?',
|
|
(enqueued['id'],),
|
|
)
|
|
retry_db.conn.commit()
|
|
final_claim = retry_db.claim_discovery_retries(
|
|
'dockerhub', {'integration-query': policy}, 'finisher',
|
|
limit=1, lease_seconds=60,
|
|
)[0]
|
|
admitted = retry_db.persist_dockerhub_discovery_page(
|
|
'dockerhub', 'integration-query',
|
|
[{'repo_name': 'fixture/postgres-retry'}],
|
|
final_claim['id'], final_claim['lease_owner'], final_claim['lease_token'],
|
|
complete=True,
|
|
)
|
|
self.assertEqual(admitted['inserted_count'], 1)
|
|
self.assertEqual(admitted['retry_completed_count'], 1)
|
|
self.assertIsNone(retry_db.conn.execute(
|
|
'SELECT id FROM discovery_retry_queue WHERE id = ?', (enqueued['id'],),
|
|
).fetchone())
|
|
|
|
stale = retry_db.enqueue_discovery_retry(
|
|
'dockerhub', 'removed-query', policy, 'deep', 'query',
|
|
)
|
|
self.assertEqual(
|
|
retry_db.claim_discovery_retries(
|
|
'dockerhub', {'integration-query': policy}, 'holder',
|
|
limit=1, lease_seconds=60,
|
|
),
|
|
[],
|
|
)
|
|
held = retry_db.conn.execute(
|
|
'''SELECT status, last_error_category FROM discovery_retry_queue
|
|
WHERE id = ?''',
|
|
(stale['id'],),
|
|
).fetchone()
|
|
self.assertEqual(
|
|
(held['status'], held['last_error_category']),
|
|
('held', 'query_removed'),
|
|
)
|
|
finally:
|
|
retry_db.close()
|
|
setup_db.close()
|
|
|
|
def test_exact_git_plan_binding_and_coverage_are_fenced(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(ingester_db, initialize_base=True)
|
|
ingester_db.record_final_cutover({'test': self.id()})
|
|
run_id = source_db.start_run('integration', selected_source='github')
|
|
cycle_id = source_db.start_source_cycle(
|
|
run_id, 'github', 'github', 'integration', 'fixture',
|
|
)
|
|
target = 'https://github.com/example/repo.git'
|
|
self.assertEqual(
|
|
source_db.enqueue_targets('github', 'github', 'fixture', [target]),
|
|
1,
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor',
|
|
).start()
|
|
limits = {
|
|
'bundle_items': 10, 'bundle_bytes': 64 * 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 64 * 1024 * 1024,
|
|
'keycheck_items': 20, 'keycheck_bytes': 16 * 1024 * 1024,
|
|
}
|
|
producer = current_process_identity()
|
|
head_a = 'a' * 40
|
|
head_b = 'b' * 40
|
|
|
|
def resolution(head):
|
|
return {
|
|
'provider': 'github',
|
|
'repo_url': target,
|
|
'repo_path': 'example/repo',
|
|
'branch': 'main',
|
|
'ref': 'refs/heads/main',
|
|
'head_sha': head,
|
|
'ref_source': 'provider_default',
|
|
}
|
|
|
|
def claim(index):
|
|
return source_db.reserve_and_claim_target(
|
|
'github', 'github', producer,
|
|
'integration-supervisor', 4 * 1024 * 1024, 4 * 1024 * 1024,
|
|
10, 1024 * 1024, run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits=limits,
|
|
reservation_token=f'exact-git-reservation-{index}',
|
|
bundle_id=f'{index:x}' * 32,
|
|
scan_event_id=f'{index + 8:x}' * 32,
|
|
)
|
|
|
|
def ingest(claimed, plan, execution_mode, continuity_reset=False):
|
|
plan_sha256 = hashlib.sha256(canonical_git_scan_plan_bytes(plan)).hexdigest()
|
|
exact_scope = {
|
|
key: plan.get(key)
|
|
for key in (
|
|
'provider', 'ref', 'head_sha', 'base_sha', 'mode',
|
|
'baseline_depth', 'ref_source',
|
|
)
|
|
}
|
|
result = {
|
|
'scan_event_id': claimed['scan_event_id'],
|
|
'target': claimed['target'],
|
|
'scan_type': 'github',
|
|
'timestamp': '2026-08-28T00:00:00+00:00',
|
|
'scan_started_at': '2026-08-28T00:00:00+00:00',
|
|
'duration_sec': 1.0,
|
|
'findings': [],
|
|
'errors': [],
|
|
'git_scan_plan': plan,
|
|
'git_scan_execution': {
|
|
'mode': execution_mode,
|
|
'pinned': True,
|
|
'success': True,
|
|
'continuity_reset': continuity_reset,
|
|
'plan_sha256': plan_sha256,
|
|
},
|
|
'scan_meta': {'exact_git_scope': exact_scope},
|
|
}
|
|
staged = stage_result_bundle(
|
|
result, claimed, str(self.bundle_root), {},
|
|
{'queue_status': 'done', 'queue_error': None, 'available_after': None},
|
|
candidate_max_items=10, candidate_max_bytes=1024 * 1024,
|
|
)
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
claimed['reservation_id'], {
|
|
'bundle_id': staged.bundle_id,
|
|
'scan_event_id': staged.scan_event_id,
|
|
'scan_event_hash': staged.scan_event_hash,
|
|
'relative_path': staged.relative_path,
|
|
'actual_bytes': staged.actual_bytes,
|
|
'frame_count': staged.frame_count,
|
|
'finding_count': staged.finding_count,
|
|
'error_count': staged.error_count,
|
|
'candidate_count': staged.candidate_count,
|
|
},
|
|
))
|
|
self.assertTrue(ingester.process_one())
|
|
row = source_db.conn.execute(
|
|
'''SELECT q.covered_ref, q.covered_head, c.metadata_json
|
|
FROM target_queue q
|
|
JOIN scan_result_compat c ON c.target_scan_id = q.target_scan_id
|
|
WHERE q.id = ?''',
|
|
(claimed['queue_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
return row, json.loads(row['metadata_json'])
|
|
|
|
first = claim(1)
|
|
self.assertIsNotNone(first)
|
|
baseline = source_db.bind_git_scan_plan(
|
|
first['reservation_id'], first['claim_lease_token'], resolution(head_a), 100,
|
|
)
|
|
self.assertEqual(baseline['mode'], 'baseline')
|
|
self.assertEqual(
|
|
source_db.bind_git_scan_plan(
|
|
first['reservation_id'], first['claim_lease_token'], resolution(head_a), 100,
|
|
),
|
|
baseline,
|
|
)
|
|
with self.assertRaises(ScanEventConflictError):
|
|
source_db.bind_git_scan_plan(
|
|
first['reservation_id'], first['claim_lease_token'], resolution(head_b), 100,
|
|
)
|
|
observed_during_scan = source_db.observe_discovered_targets(
|
|
'github', 'github', 'fixture', [{
|
|
'target': target,
|
|
'remote_modified_at': '2099-01-01T00:00:00+00:00',
|
|
}], rescan_limit=1,
|
|
)
|
|
self.assertEqual(observed_during_scan['queued_updated_count'], 0)
|
|
first_row, first_metadata = ingest(first, baseline, 'baseline')
|
|
self.assertEqual(
|
|
(first_row['covered_ref'], first_row['covered_head']),
|
|
('refs/heads/main', head_a),
|
|
)
|
|
self.assertEqual(first_metadata['git_scan_plan'], baseline)
|
|
self.assertEqual(first_metadata['scan_meta']['exact_git_scope']['head_sha'], head_a)
|
|
observed_after_scan = source_db.observe_discovered_targets(
|
|
'github', 'github', 'fixture', [{
|
|
'target': target,
|
|
'remote_modified_at': '2099-01-01T00:00:00+00:00',
|
|
}], rescan_limit=1,
|
|
)
|
|
self.assertEqual(observed_after_scan['queued_updated_count'], 1)
|
|
second = claim(2)
|
|
delta = source_db.bind_git_scan_plan(
|
|
second['reservation_id'], second['claim_lease_token'], resolution(head_b), 100,
|
|
)
|
|
self.assertEqual((delta['mode'], delta['base_sha']), ('delta', head_a))
|
|
second_row, _second_metadata = ingest(second, delta, 'delta')
|
|
self.assertEqual(
|
|
(second_row['covered_ref'], second_row['covered_head']),
|
|
('refs/heads/main', head_b),
|
|
)
|
|
|
|
source_db.enqueue_targets(
|
|
'github', 'github', 'fixture', [target], requeue_done=True,
|
|
)
|
|
third = claim(3)
|
|
noop = source_db.bind_git_scan_plan(
|
|
third['reservation_id'], third['claim_lease_token'], resolution(head_b), 100,
|
|
)
|
|
self.assertEqual((noop['mode'], noop['base_sha']), ('noop', head_b))
|
|
third_row, _third_metadata = ingest(third, noop, 'noop')
|
|
self.assertEqual(third_row['covered_head'], head_b)
|
|
|
|
source_db.enqueue_targets(
|
|
'github', 'github', 'fixture', [target], requeue_done=True,
|
|
)
|
|
fourth = claim(4)
|
|
failed_plan = source_db.bind_git_scan_plan(
|
|
fourth['reservation_id'], fourth['claim_lease_token'], resolution('c' * 40), 100,
|
|
)
|
|
self.assertEqual((failed_plan['mode'], failed_plan['base_sha']), ('delta', head_b))
|
|
from result_bundle import ensure_bundle_reservation_paths
|
|
|
|
ensure_bundle_reservation_paths(str(self.bundle_root), fourth)
|
|
self.assertTrue(console_runner.refund_v2_claim_after_no_handoff(
|
|
source_db, str(self.bundle_root), fourth, producer.as_dict(),
|
|
'injected exact Git worker failure',
|
|
))
|
|
refunded = source_db.conn.execute(
|
|
'''SELECT r.state, q.status, q.covered_ref, q.covered_head
|
|
FROM result_reservations r JOIN target_queue q ON q.id = r.queue_id
|
|
WHERE r.id = ?''',
|
|
(fourth['reservation_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
(refunded['state'], refunded['status'], refunded['covered_ref'], refunded['covered_head']),
|
|
('refunded', 'pending', 'refs/heads/main', head_b),
|
|
)
|
|
with self.assertRaises(ScanEventConflictError):
|
|
source_db.bind_git_scan_plan(
|
|
fourth['reservation_id'], fourth['claim_lease_token'], resolution('c' * 40), 100,
|
|
)
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
source_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_docker_layer_migration_is_atomic_and_adds_existing_reservation_columns(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
with mock.patch.object(
|
|
db,
|
|
'require_runtime_safety_schema',
|
|
side_effect=RuntimeSafetySchemaError('injected final validation failure'),
|
|
) as validate:
|
|
with self.assertRaisesRegex(RuntimeSafetySchemaError, 'injected final validation'):
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
validate.assert_called_once_with(commit=False)
|
|
self.assertFalse(db.conn.table_exists('runtime_schema_migrations'))
|
|
self.assertFalse(db.conn.table_exists('docker_content_blobs'))
|
|
db.conn.commit()
|
|
|
|
self.assertTrue(migrate_runtime_safety_schema(db, initialize_base=True))
|
|
db.conn.execute(
|
|
'ALTER TABLE result_reservations DROP COLUMN docker_layer_plan_json'
|
|
)
|
|
db.conn.execute(
|
|
'ALTER TABLE result_reservations DROP COLUMN docker_layer_plan_sha256'
|
|
)
|
|
db.conn.execute(
|
|
'ALTER TABLE docker_image_blob_coverage DROP COLUMN selection_policy_sha256'
|
|
)
|
|
db.conn.execute(
|
|
'''ALTER TABLE pipeline_quarantine
|
|
DROP CONSTRAINT pipeline_quarantine_review_status_check'''
|
|
)
|
|
db.conn.execute(
|
|
'''ALTER TABLE pipeline_quarantine
|
|
ADD CONSTRAINT pipeline_quarantine_review_status_check
|
|
CHECK (review_status IN (
|
|
'pending','approved_retry','discarded','resolved'
|
|
))'''
|
|
)
|
|
db.conn.execute(
|
|
'DELETE FROM runtime_schema_migrations WHERE version = ?',
|
|
(PIPELINE_MIGRATION_VERSIONS[-1],),
|
|
)
|
|
db.conn.commit()
|
|
|
|
self.assertTrue(migrate_runtime_safety_schema(db))
|
|
columns = db.conn.table_columns('result_reservations')
|
|
self.assertTrue({
|
|
'docker_layer_plan_json', 'docker_layer_plan_sha256',
|
|
}.issubset(columns))
|
|
self.assertIn(
|
|
'selection_policy_sha256',
|
|
db.conn.table_columns('docker_image_blob_coverage'),
|
|
)
|
|
self.assertIn(
|
|
'idx_docker_image_blob_coverage_selection',
|
|
db.conn.table_indexes('docker_image_blob_coverage'),
|
|
)
|
|
self.assertIn(
|
|
'idx_docker_adaptive_shadow_reports_gate',
|
|
db.conn.table_indexes('docker_adaptive_shadow_reports'),
|
|
)
|
|
review_constraint = db.conn.execute(
|
|
'''SELECT pg_catalog.pg_get_constraintdef(con.oid, true) AS definition
|
|
FROM pg_catalog.pg_constraint con
|
|
JOIN pg_catalog.pg_class tbl ON tbl.oid = con.conrelid
|
|
JOIN pg_catalog.pg_namespace n ON n.oid = tbl.relnamespace
|
|
WHERE con.contype = 'c' AND n.nspname = ?
|
|
AND tbl.relname = 'pipeline_quarantine'
|
|
AND con.conname = 'pipeline_quarantine_review_status_check' ''',
|
|
(db.conn.application_schema,),
|
|
).fetchone()
|
|
self.assertIn('approved_rescan', review_constraint['definition'])
|
|
self.assertIsNotNone(db.conn.execute(
|
|
'SELECT version FROM runtime_schema_migrations WHERE version = ?',
|
|
(PIPELINE_MIGRATION_VERSIONS[-1],),
|
|
).fetchone())
|
|
marker = db.conn.execute(
|
|
'''SELECT code_sha256 FROM runtime_schema_migrations
|
|
WHERE version = '20260902_14_adaptive_docker_payload_scanning' '''
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
marker['code_sha256'],
|
|
hashlib.sha256(PIPELINE_SCHEMA_SQL.encode('utf-8')).hexdigest(),
|
|
)
|
|
self.assertTrue(db.require_runtime_safety_schema())
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_adaptive_selector_backfill_requires_quiescence_and_rolls_back(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.record_final_cutover({'test': self.id()})
|
|
run_id = db.start_run('integration', selected_source='dockerhub')
|
|
cycle_id = db.start_source_cycle(
|
|
run_id, 'dockerhub', 'docker', 'integration', 'selector-backfill',
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor',
|
|
).start()
|
|
producer = current_process_identity()
|
|
manifest = 'sha256:' + ('a' * 64)
|
|
target = f'example/selector-backfill@{manifest}'
|
|
self.assertEqual(
|
|
db.enqueue_targets('dockerhub', 'docker', 'integration', [target]), 1,
|
|
)
|
|
claimed = db.reserve_and_claim_target(
|
|
'dockerhub', 'docker', producer, 'integration-supervisor',
|
|
4 * 1024 * 1024, 4 * 1024 * 1024, 4, 1024 * 1024,
|
|
run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits={
|
|
'bundle_items': 20,
|
|
'bundle_bytes': 128 * 1024 * 1024,
|
|
'projection_items': 20,
|
|
'projection_bytes': 128 * 1024 * 1024,
|
|
'keycheck_items': 20,
|
|
'keycheck_bytes': 32 * 1024 * 1024,
|
|
},
|
|
reservation_token='docker-selector-backfill-reservation',
|
|
bundle_id='a' * 64,
|
|
scan_event_id='b' * 64,
|
|
)
|
|
self.assertIsNotNone(claimed)
|
|
limits = {
|
|
'config_max_bytes': 1024 * 1024,
|
|
'layer_max_bytes': 8 * 1024 * 1024,
|
|
'image_max_bytes': 16 * 1024 * 1024,
|
|
'max_layers': 4,
|
|
'archive_max_size_bytes': 8 * 1024 * 1024,
|
|
'archive_max_depth': 4,
|
|
'archive_timeout_sec': 30,
|
|
'blob_timeout_sec': 600,
|
|
'filesystem_concurrency': 2,
|
|
'blob_max_attempts': 3,
|
|
}
|
|
plan = db.bind_docker_layer_plan(
|
|
claimed['reservation_id'], claimed['claim_lease_token'],
|
|
{
|
|
'version': 1,
|
|
'image': target,
|
|
'repository': 'example/selector-backfill',
|
|
'manifest_digest': manifest,
|
|
'platform_os': 'linux',
|
|
'platform_arch': 'amd64',
|
|
'manifest_media_type': 'application/vnd.oci.image.manifest.v1+json',
|
|
'config': {
|
|
'digest': 'sha256:' + ('c' * 64),
|
|
'size': 4096,
|
|
'media_type': 'application/vnd.oci.image.config.v1+json',
|
|
},
|
|
'layers': [],
|
|
},
|
|
limits,
|
|
'd' * 64,
|
|
blob_lease_seconds=60,
|
|
)
|
|
db.conn.execute(
|
|
'DELETE FROM runtime_schema_migrations WHERE version = ?',
|
|
('20260902_14_adaptive_docker_payload_scanning',),
|
|
)
|
|
db.conn.commit()
|
|
with self.assertRaisesRegex(RuntimeSafetySchemaError, 'requires stopped, reconciled'):
|
|
migrate_runtime_safety_schema(db)
|
|
self.assertIsNone(db.conn.execute(
|
|
'SELECT version FROM runtime_schema_migrations WHERE version = ?',
|
|
('20260902_14_adaptive_docker_payload_scanning',),
|
|
).fetchone())
|
|
db.conn.execute(
|
|
'''INSERT INTO runtime_schema_migrations(version, applied_at, code_sha256)
|
|
VALUES (?, ?, ?)''',
|
|
(
|
|
'20260902_14_adaptive_docker_payload_scanning',
|
|
datetime.now(timezone.utc).isoformat(timespec='seconds'),
|
|
hashlib.sha256(PIPELINE_SCHEMA_SQL.encode('utf-8')).hexdigest(),
|
|
),
|
|
)
|
|
db.conn.commit()
|
|
self.assertTrue(db.refund_uncommitted_reservation(
|
|
claimed['reservation_id'], producer.as_dict(),
|
|
'selector backfill fixture is quiescent',
|
|
partial_absence_confirmed=True,
|
|
))
|
|
self.assertTrue(ingester.stop())
|
|
ingester = None
|
|
|
|
db.conn.execute(
|
|
'''UPDATE docker_image_blob_coverage SET selection_policy_sha256 = ''
|
|
WHERE reservation_id = ?''',
|
|
(claimed['reservation_id'],),
|
|
)
|
|
db.conn.execute(
|
|
'DELETE FROM runtime_schema_migrations WHERE version = ?',
|
|
('20260902_14_adaptive_docker_payload_scanning',),
|
|
)
|
|
db.conn.commit()
|
|
self.assertTrue(migrate_runtime_safety_schema(db))
|
|
backfilled = db.conn.execute(
|
|
'''SELECT selection_policy_sha256 FROM docker_image_blob_coverage
|
|
WHERE reservation_id = ?''',
|
|
(claimed['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(backfilled['selection_policy_sha256'], plan['selection_policy_sha256'])
|
|
|
|
db.conn.execute(
|
|
'''UPDATE docker_image_blob_coverage SET selection_policy_sha256 = ''
|
|
WHERE reservation_id = ?''',
|
|
(claimed['reservation_id'],),
|
|
)
|
|
db.conn.execute(
|
|
"UPDATE result_reservations SET docker_layer_plan_json = '{}' WHERE id = ?",
|
|
(claimed['reservation_id'],),
|
|
)
|
|
db.conn.execute(
|
|
'DELETE FROM runtime_schema_migrations WHERE version = ?',
|
|
('20260902_14_adaptive_docker_payload_scanning',),
|
|
)
|
|
db.conn.commit()
|
|
with self.assertRaises(RuntimeSafetySchemaError):
|
|
migrate_runtime_safety_schema(db)
|
|
rolled_back = db.conn.execute(
|
|
'''SELECT coverage.selection_policy_sha256,
|
|
reservation.docker_layer_plan_json
|
|
FROM docker_image_blob_coverage coverage
|
|
JOIN result_reservations reservation
|
|
ON reservation.id = coverage.reservation_id
|
|
WHERE coverage.reservation_id = ?''',
|
|
(claimed['reservation_id'],),
|
|
).fetchone()
|
|
marker = db.conn.execute(
|
|
'SELECT version FROM runtime_schema_migrations WHERE version = ?',
|
|
('20260902_14_adaptive_docker_payload_scanning',),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
(rolled_back['selection_policy_sha256'], rolled_back['docker_layer_plan_json']),
|
|
('', '{}'),
|
|
)
|
|
self.assertIsNone(marker)
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
db.close()
|
|
ingester_db.close()
|
|
|
|
def test_offline_result_pipeline_recovery_converges_before_marker14(self):
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
projector_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(source_db, initialize_base=True)
|
|
source_db.record_final_cutover({'test': self.id()})
|
|
run_id = source_db.start_run('integration', selected_source='github')
|
|
cycle_id = source_db.start_source_cycle(
|
|
run_id, 'github', 'github', 'integration', 'offline-recovery',
|
|
)
|
|
self.assertEqual(source_db.enqueue_targets(
|
|
'github', 'github', 'offline-recovery', [
|
|
'https://example.invalid/ready',
|
|
'https://example.invalid/abandoned',
|
|
'https://example.invalid/late-ready',
|
|
],
|
|
), 3)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'stale-supervisor', lease_seconds=60,
|
|
).start()
|
|
limits = {
|
|
'bundle_items': 10, 'bundle_bytes': 64 * 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 64 * 1024 * 1024,
|
|
'keycheck_items': 30, 'keycheck_bytes': 16 * 1024 * 1024,
|
|
}
|
|
producer = current_process_identity()
|
|
ready = source_db.reserve_and_claim_target(
|
|
'github', 'github', producer, 'stale-supervisor',
|
|
4 * 1024 * 1024, 4 * 1024 * 1024, 10, 1024 * 1024,
|
|
run_id=run_id, cycle_id=cycle_id, capacity_limits=limits,
|
|
reservation_token='offline-ready-reservation',
|
|
bundle_id='a' * 32, scan_event_id='b' * 32,
|
|
)
|
|
abandoned = source_db.reserve_and_claim_target(
|
|
'github', 'github', producer, 'stale-supervisor',
|
|
4 * 1024 * 1024, 4 * 1024 * 1024, 10, 1024 * 1024,
|
|
run_id=run_id, cycle_id=cycle_id, capacity_limits=limits,
|
|
reservation_token='offline-abandoned-reservation',
|
|
bundle_id='c' * 32, scan_event_id='d' * 32,
|
|
)
|
|
late_ready = source_db.reserve_and_claim_target(
|
|
'github', 'github', producer, 'stale-supervisor',
|
|
4 * 1024 * 1024, 4 * 1024 * 1024, 10, 1024 * 1024,
|
|
run_id=run_id, cycle_id=cycle_id, capacity_limits=limits,
|
|
reservation_token='offline-late-ready-reservation',
|
|
bundle_id='1' * 32, scan_event_id='2' * 32,
|
|
)
|
|
self.assertIsNotNone(ready)
|
|
self.assertIsNotNone(abandoned)
|
|
self.assertIsNotNone(late_ready)
|
|
self.assertNotEqual(ready['reservation_id'], abandoned['reservation_id'])
|
|
staged = stage_result_bundle(
|
|
{
|
|
'scan_event_id': ready['scan_event_id'], 'target': ready['target'],
|
|
'scan_type': 'github', 'timestamp': '2026-09-02T00:00:00+00:00',
|
|
'findings': [{
|
|
'DetectorName': 'OpenAI', 'Raw': 'sk-offline-recovery-fixture',
|
|
'finding_uid': 'e' * 64, 'Verified': False,
|
|
}],
|
|
'errors': [],
|
|
},
|
|
ready, str(self.bundle_root), {}, {'queue_status': 'done'},
|
|
candidate_max_items=10, candidate_max_bytes=1024 * 1024,
|
|
)
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
ready['reservation_id'], {
|
|
'bundle_id': staged.bundle_id, 'scan_event_id': staged.scan_event_id,
|
|
'scan_event_hash': staged.scan_event_hash,
|
|
'relative_path': staged.relative_path, 'actual_bytes': staged.actual_bytes,
|
|
'frame_count': staged.frame_count, 'finding_count': staged.finding_count,
|
|
'error_count': staged.error_count, 'candidate_count': staged.candidate_count,
|
|
},
|
|
))
|
|
late_staged = stage_result_bundle(
|
|
{
|
|
'scan_event_id': late_ready['scan_event_id'],
|
|
'target': late_ready['target'], 'scan_type': 'github',
|
|
'timestamp': '2026-09-02T00:00:00+00:00',
|
|
'findings': [], 'errors': ['late ready fixture'],
|
|
},
|
|
late_ready, str(self.bundle_root), {}, {'queue_status': 'done'},
|
|
candidate_max_items=10, candidate_max_bytes=1024 * 1024,
|
|
)
|
|
expired_at = '2000-01-01T00:00:00+00:00'
|
|
source_db.conn.execute(
|
|
'UPDATE result_reservations SET producer_lease_expires_at = ? WHERE id = ?',
|
|
(expired_at, late_ready['reservation_id']),
|
|
)
|
|
source_db.conn.execute(
|
|
'UPDATE target_queue SET lease_expires_at = ? WHERE id = ?',
|
|
(expired_at, late_ready['queue_id']),
|
|
)
|
|
source_db.conn.commit()
|
|
late_metadata = ResultBundleReader(
|
|
str(self.bundle_root / late_staged.relative_path)
|
|
).validate()
|
|
late_values = late_metadata.as_dict()
|
|
late_values['relative_path'] = late_staged.relative_path
|
|
self.assertFalse(source_db.mark_result_bundle_ready(
|
|
late_ready['reservation_id'], late_values,
|
|
))
|
|
self.assertFalse(source_db.recover_expired_result_bundle_ready(
|
|
late_ready['reservation_id'], late_values,
|
|
))
|
|
|
|
projector_lease = projector_db.acquire_pipeline_lease(
|
|
'jsonl_projector', 'stale-supervisor', producer,
|
|
lease_seconds=60, initial_state='ready',
|
|
)
|
|
self.assertIsNotNone(projector_lease)
|
|
ingester_db.close()
|
|
projector_db.close()
|
|
ingester = None
|
|
|
|
source_db.conn.execute(
|
|
'DELETE FROM runtime_schema_migrations WHERE version = ?',
|
|
('20260902_14_adaptive_docker_payload_scanning',),
|
|
)
|
|
source_db.conn.execute(
|
|
'ALTER TABLE keycheck_candidates DROP COLUMN routed_service'
|
|
)
|
|
source_db.conn.commit()
|
|
with ExitStack() as patches:
|
|
patches.enter_context(mock.patch.object(
|
|
result_ingester, 'exact_process_identity_state', return_value='dead',
|
|
))
|
|
patches.enter_context(mock.patch.object(
|
|
scanner_db, 'exact_process_identity_state', return_value='dead',
|
|
))
|
|
report = recover_stale_result_pipeline(
|
|
source_db, {
|
|
'global': {
|
|
'result_bundle_dir': str(self.bundle_root),
|
|
'pipeline_quarantine_max_items': 100,
|
|
'pipeline_quarantine_max_bytes': 64 * 1024 * 1024,
|
|
},
|
|
'supervisor': {'result_ingester': {'lease_seconds': 60}},
|
|
},
|
|
max_rows=10, max_seconds=30,
|
|
)
|
|
self.assertEqual(report['processed_bundles'], 2)
|
|
remaining = source_db.conn.execute(
|
|
'''SELECT state, last_error_code, last_error_detail FROM result_reservations
|
|
WHERE state IN ('scanning','ready','ingesting','db_committed')
|
|
ORDER BY id'''
|
|
).fetchall()
|
|
source_db.conn.commit()
|
|
self.assertTrue(report['quiescent'], {
|
|
'report': report,
|
|
'remaining': [
|
|
(row['state'], row['last_error_code'], row['last_error_detail'])
|
|
for row in remaining
|
|
],
|
|
})
|
|
self.assertEqual(report['final'], {
|
|
'worker_leases': 0, 'result_reservations': 0,
|
|
'queue_leases': 0, 'blob_leases': 0,
|
|
})
|
|
states = source_db.conn.execute(
|
|
'SELECT state FROM result_reservations ORDER BY id'
|
|
).fetchall()
|
|
queue = source_db.conn.execute(
|
|
'''SELECT status, current_result_reservation_id
|
|
FROM target_queue ORDER BY id'''
|
|
).fetchall()
|
|
candidate = source_db.conn.execute(
|
|
'SELECT service FROM keycheck_candidates'
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
[row['state'] for row in states],
|
|
['acknowledged', 'refunded', 'acknowledged'],
|
|
)
|
|
self.assertEqual([row['status'] for row in queue], ['done', 'pending', 'done'])
|
|
self.assertTrue(all(row['current_result_reservation_id'] is None for row in queue))
|
|
self.assertEqual(candidate['service'], 'openai')
|
|
|
|
self.assertTrue(migrate_runtime_safety_schema(source_db))
|
|
migrated = source_db.conn.execute(
|
|
'SELECT routed_service FROM keycheck_candidates'
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(migrated['routed_service'], '')
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
source_db.close()
|
|
ingester_db.close()
|
|
projector_db.close()
|
|
|
|
def test_docker_adaptive_shadow_gate_is_aggregate_fresh_and_fenced(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.record_final_cutover({'test': self.id()})
|
|
run_id = db.start_run('integration', selected_source='dockerhub')
|
|
cycle_id = db.start_source_cycle(
|
|
run_id, 'dockerhub', 'docker', 'integration', 'adaptive-shadow',
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor',
|
|
).start()
|
|
target = 'example/adaptive-shadow@sha256:' + ('a' * 64)
|
|
self.assertEqual(
|
|
db.enqueue_targets('dockerhub', 'docker', 'integration', [target]), 1,
|
|
)
|
|
claimed = db.reserve_and_claim_target(
|
|
'dockerhub', 'docker', current_process_identity(),
|
|
'integration-supervisor', 4 * 1024 * 1024, 4 * 1024 * 1024,
|
|
4, 1024 * 1024, run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits={
|
|
'bundle_items': 20,
|
|
'bundle_bytes': 128 * 1024 * 1024,
|
|
'projection_items': 20,
|
|
'projection_bytes': 128 * 1024 * 1024,
|
|
'keycheck_items': 20,
|
|
'keycheck_bytes': 32 * 1024 * 1024,
|
|
},
|
|
reservation_token='docker-adaptive-shadow-reservation',
|
|
bundle_id='1' * 64, scan_event_id='2' * 64,
|
|
)
|
|
self.assertIsNotNone(claimed)
|
|
policies = {
|
|
'scan_policy_sha256': '3' * 64,
|
|
'execution_policy_sha256': '4' * 64,
|
|
'selection_policy_sha256': '5' * 64,
|
|
}
|
|
missing = db.docker_adaptive_gate_report(
|
|
claimed['reservation_id'], claimed['claim_lease_token'],
|
|
**policies,
|
|
)
|
|
self.assertEqual((missing['passed'], missing['reason']), (False, 'missing'))
|
|
|
|
report = db.start_docker_adaptive_shadow_report(
|
|
**policies, cohort_size=50, lease_owner='integration-shadow',
|
|
)
|
|
with self.assertRaises(ScanEventConflictError):
|
|
db.start_docker_adaptive_shadow_report(
|
|
**policies, cohort_size=50, lease_owner='integration-shadow-two',
|
|
)
|
|
with self.assertRaises(ScanEventConflictError):
|
|
db.checkpoint_docker_adaptive_shadow_report(
|
|
report['report_token'], report['lease_owner'], 'stale-lease-token',
|
|
)
|
|
for expected_checkpoint in range(1, 101):
|
|
checkpoint = db.checkpoint_docker_adaptive_shadow_report(
|
|
report['report_token'], report['lease_owner'], report['lease_token'],
|
|
)
|
|
self.assertEqual(checkpoint['sink_checkpoint_count'], expected_checkpoint)
|
|
selection_metrics = {
|
|
name: 0 for name in DOCKER_ADAPTIVE_SHADOW_SELECTION_METRIC_KEYS
|
|
}
|
|
selection_metrics['omitted_layer_too_large'] = 12
|
|
selection_metrics['adaptive_checkpoints'] = 50
|
|
with self.assertRaises(ValueError):
|
|
db.finish_docker_adaptive_shadow_report(
|
|
report['report_token'], report['lease_owner'], report['lease_token'],
|
|
completed_pairs=50, omitted_descriptor_count=12,
|
|
selection_metrics={
|
|
**selection_metrics, 'omitted_layer_too_large': 11,
|
|
},
|
|
)
|
|
completed = db.finish_docker_adaptive_shadow_report(
|
|
report['report_token'], report['lease_owner'], report['lease_token'],
|
|
completed_pairs=50,
|
|
full_routed_count=100,
|
|
adaptive_routed_count=90,
|
|
routed_intersection_count=86,
|
|
full_detector_count=80,
|
|
adaptive_detector_count=70,
|
|
detector_intersection_count=65,
|
|
full_slot_ms=100000,
|
|
adaptive_slot_ms=40000,
|
|
omitted_descriptor_count=12,
|
|
failure_count=0,
|
|
privacy_violation_count=0,
|
|
safety_regression_count=0,
|
|
selection_metrics=selection_metrics,
|
|
routed_recall_ppm=1,
|
|
slot_ratio_ppm=1,
|
|
)
|
|
self.assertTrue(completed['passed'])
|
|
self.assertEqual(
|
|
(completed['routed_recall_ppm'], completed['slot_ratio_ppm']),
|
|
(860000, 400000),
|
|
)
|
|
passed = db.docker_adaptive_gate_report(
|
|
claimed['reservation_id'], claimed['claim_lease_token'],
|
|
**policies,
|
|
)
|
|
self.assertEqual((passed['passed'], passed['reason']), (True, 'passed'))
|
|
self.assertEqual(passed['report_id'], report['id'])
|
|
|
|
stale_at = (
|
|
datetime.now(timezone.utc) - timedelta(days=8)
|
|
).isoformat(timespec='seconds')
|
|
db.conn.execute(
|
|
'''UPDATE docker_adaptive_shadow_reports SET completed_at = ?
|
|
WHERE id = ?''',
|
|
(stale_at, report['id']),
|
|
)
|
|
db.conn.commit()
|
|
stale = db.docker_adaptive_gate_report(
|
|
claimed['reservation_id'], claimed['claim_lease_token'],
|
|
**policies,
|
|
)
|
|
self.assertEqual((stale['passed'], stale['reason']), (False, 'stale'))
|
|
db.conn.execute(
|
|
'''UPDATE docker_adaptive_shadow_reports SET completed_at = ?
|
|
WHERE id = ?''',
|
|
(datetime.now(timezone.utc).isoformat(timespec='seconds'), report['id']),
|
|
)
|
|
db.conn.commit()
|
|
|
|
failed_threshold = db.start_docker_adaptive_shadow_report(
|
|
**policies, cohort_size=50, lease_owner='integration-shadow-two',
|
|
)
|
|
for _ in range(100):
|
|
db.checkpoint_docker_adaptive_shadow_report(
|
|
failed_threshold['report_token'], failed_threshold['lease_owner'],
|
|
failed_threshold['lease_token'],
|
|
)
|
|
failed_result = db.finish_docker_adaptive_shadow_report(
|
|
failed_threshold['report_token'], failed_threshold['lease_owner'],
|
|
failed_threshold['lease_token'], completed_pairs=50,
|
|
full_routed_count=100, adaptive_routed_count=100,
|
|
routed_intersection_count=84, full_detector_count=1,
|
|
adaptive_detector_count=1, detector_intersection_count=1,
|
|
full_slot_ms=100000, adaptive_slot_ms=10000,
|
|
omitted_descriptor_count=0, failure_count=0,
|
|
privacy_violation_count=0, safety_regression_count=0,
|
|
selection_metrics={
|
|
name: 0 for name in DOCKER_ADAPTIVE_SHADOW_SELECTION_METRIC_KEYS
|
|
},
|
|
)
|
|
self.assertFalse(failed_result['passed'])
|
|
latest = db.docker_adaptive_gate_report(
|
|
claimed['reservation_id'], claimed['claim_lease_token'],
|
|
**policies,
|
|
)
|
|
self.assertEqual((latest['passed'], latest['reason']), (False, 'thresholds'))
|
|
with self.assertRaises(ScanEventConflictError):
|
|
db.docker_adaptive_gate_report(
|
|
claimed['reservation_id'], 'stale-claim-token', **policies,
|
|
)
|
|
|
|
report_columns = db.conn.table_columns('docker_adaptive_shadow_reports')
|
|
self.assertTrue({
|
|
'target', 'normalized_target', 'secret', 'provider_key_hash',
|
|
'detector_secret_hash', 'finding_id', 'reservation_id',
|
|
}.isdisjoint(report_columns))
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
db.close()
|
|
ingester_db.close()
|
|
|
|
def test_docker_layer_policy_reclaim_and_quarantine_are_exactly_fenced(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(ingester_db, initialize_base=True)
|
|
ingester_db.record_final_cutover({'test': self.id()})
|
|
run_id = source_db.start_run('integration', selected_source='dockerhub')
|
|
cycle_id = source_db.start_source_cycle(
|
|
run_id, 'dockerhub', 'docker', 'integration', 'fixture',
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor',
|
|
).start()
|
|
producer = current_process_identity()
|
|
capacity_limits = {
|
|
'bundle_items': 20, 'bundle_bytes': 128 * 1024 * 1024,
|
|
'projection_items': 20, 'projection_bytes': 128 * 1024 * 1024,
|
|
'keycheck_items': 20, 'keycheck_bytes': 32 * 1024 * 1024,
|
|
}
|
|
layer_limits = {
|
|
'config_max_bytes': 1024 * 1024,
|
|
'layer_max_bytes': 8 * 1024 * 1024,
|
|
'image_max_bytes': 16 * 1024 * 1024,
|
|
'max_layers': 4,
|
|
'archive_max_size_bytes': 8 * 1024 * 1024,
|
|
'archive_max_depth': 4,
|
|
'archive_timeout_sec': 30,
|
|
'blob_timeout_sec': 600,
|
|
'filesystem_concurrency': 2,
|
|
'blob_max_attempts': 3,
|
|
}
|
|
content_digest = 'sha256:' + ('f' * 64)
|
|
|
|
def target(index):
|
|
return f'example/layer-db-{index}@sha256:{index:064x}'
|
|
|
|
def resolution(index, size=4096):
|
|
image = target(index)
|
|
return {
|
|
'version': 1,
|
|
'image': image,
|
|
'repository': f'example/layer-db-{index}',
|
|
'manifest_digest': image.rsplit('@', 1)[1],
|
|
'platform_os': 'linux',
|
|
'platform_arch': 'amd64',
|
|
'manifest_media_type': 'application/vnd.oci.image.manifest.v1+json',
|
|
'config': {
|
|
'digest': content_digest,
|
|
'size': size,
|
|
'media_type': (
|
|
'application/vnd.docker.container.image.v1+json'
|
|
if index == 2
|
|
else 'application/vnd.oci.image.config.v1+json'
|
|
),
|
|
},
|
|
'layers': [],
|
|
}
|
|
|
|
def claim(index):
|
|
self.assertEqual(
|
|
source_db.enqueue_targets(
|
|
'dockerhub', 'docker', 'integration', [target(index)],
|
|
),
|
|
1,
|
|
)
|
|
claimed = source_db.reserve_and_claim_target(
|
|
'dockerhub', 'docker', producer, 'integration-supervisor',
|
|
4 * 1024 * 1024, 4 * 1024 * 1024, 4, 1024 * 1024,
|
|
run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits=capacity_limits,
|
|
reservation_token=f'docker-layer-db-reservation-{index}',
|
|
bundle_id=f'{index:064x}',
|
|
scan_event_id=f'{index + 100:064x}',
|
|
claim_order='newest',
|
|
)
|
|
self.assertIsNotNone(claimed)
|
|
return claimed
|
|
|
|
def ready_metadata(staged):
|
|
return {
|
|
'bundle_id': staged.bundle_id,
|
|
'scan_event_id': staged.scan_event_id,
|
|
'scan_event_hash': staged.scan_event_hash,
|
|
'relative_path': staged.relative_path,
|
|
'actual_bytes': staged.actual_bytes,
|
|
'frame_count': staged.frame_count,
|
|
'finding_count': staged.finding_count,
|
|
'error_count': staged.error_count,
|
|
'candidate_count': staged.candidate_count,
|
|
}
|
|
|
|
first = claim(1)
|
|
second = claim(2)
|
|
plans = {}
|
|
failures = []
|
|
barrier = threading.Barrier(2)
|
|
|
|
def bind_concurrently(claimed, index):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
barrier.wait(timeout=10)
|
|
plans[claimed['reservation_id']] = db.bind_docker_layer_plan(
|
|
claimed['reservation_id'], claimed['claim_lease_token'],
|
|
resolution(index), layer_limits, '1' * 64,
|
|
blob_lease_seconds=60,
|
|
)
|
|
except Exception as exc:
|
|
failures.append(exc)
|
|
finally:
|
|
db.close()
|
|
|
|
threads = [
|
|
threading.Thread(target=bind_concurrently, args=(first, 1)),
|
|
threading.Thread(target=bind_concurrently, args=(second, 2)),
|
|
]
|
|
for thread in threads:
|
|
thread.start()
|
|
for thread in threads:
|
|
thread.join(timeout=30)
|
|
self.assertTrue(all(not thread.is_alive() for thread in threads))
|
|
self.assertEqual(failures, [])
|
|
states = {
|
|
claimed['reservation_id']: plans[claimed['reservation_id']]['descriptors'][0]['coverage_state']
|
|
for claimed in (first, second)
|
|
}
|
|
self.assertEqual(sorted(states.values()), ['leased', 'shared_pending'])
|
|
owner = first if states[first['reservation_id']] == 'leased' else second
|
|
owner_index = 1 if owner is first else 2
|
|
shared = second if owner is first else first
|
|
owner_plan = plans[owner['reservation_id']]
|
|
shared_plan = plans[shared['reservation_id']]
|
|
shared_plan_sha256 = hashlib.sha256(
|
|
canonical_docker_layer_plan_bytes(shared_plan)
|
|
).hexdigest()
|
|
shared_timestamp = datetime.now(timezone.utc).isoformat(timespec='seconds')
|
|
shared_staged = stage_result_bundle(
|
|
{
|
|
'scan_event_id': shared['scan_event_id'],
|
|
'target': shared['target'],
|
|
'scan_type': 'docker',
|
|
'timestamp': shared_timestamp,
|
|
'scan_started_at': shared_timestamp,
|
|
'duration_sec': 0.1,
|
|
'findings': [],
|
|
'errors': ['shared content remains pending'],
|
|
'retryable': True,
|
|
'docker_layer_plan': shared_plan,
|
|
'docker_layer_execution': {
|
|
'version': 1, 'plan_sha256': shared_plan_sha256, 'blobs': [],
|
|
},
|
|
},
|
|
shared,
|
|
str(self.bundle_root),
|
|
{},
|
|
{
|
|
'queue_status': 'deferred',
|
|
'queue_error': 'shared content remains pending',
|
|
'available_after': (
|
|
datetime.now(timezone.utc) + timedelta(minutes=5)
|
|
).isoformat(timespec='seconds'),
|
|
'reset_attempts': True,
|
|
},
|
|
candidate_max_items=4,
|
|
candidate_max_bytes=1024 * 1024,
|
|
)
|
|
policy_one = docker_layer_coverage_policy_sha256('1' * 64, layer_limits)
|
|
blob = source_db.conn.execute(
|
|
'''SELECT * FROM docker_content_blobs
|
|
WHERE digest = ? AND coverage_policy_sha256 = ?''',
|
|
(content_digest, policy_one),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual((blob['state'], blob['attempts']), ('leased', 1))
|
|
self.assertGreaterEqual(
|
|
(datetime.fromisoformat(blob['lease_expires_at']) - datetime.now(timezone.utc)).total_seconds(),
|
|
850,
|
|
)
|
|
|
|
with self.assertRaisesRegex(ScanEventConflictError, 'replay conflicts'):
|
|
source_db.bind_docker_layer_plan(
|
|
owner['reservation_id'], owner['claim_lease_token'],
|
|
resolution(owner_index, size=8192), layer_limits, '1' * 64,
|
|
)
|
|
|
|
short_expiry = (
|
|
datetime.now(timezone.utc) + timedelta(seconds=30)
|
|
).isoformat(timespec='seconds')
|
|
source_db.conn.execute(
|
|
'''UPDATE docker_content_blobs SET lease_expires_at = ?
|
|
WHERE digest = ? AND coverage_policy_sha256 = ?''',
|
|
(short_expiry, content_digest, policy_one),
|
|
)
|
|
source_db.conn.commit()
|
|
self.assertTrue(source_db.renew_result_claim(
|
|
owner['reservation_id'], owner['claim_lease_token'], lease_seconds=60,
|
|
))
|
|
renewed = source_db.conn.execute(
|
|
'''SELECT lease_expires_at FROM docker_content_blobs
|
|
WHERE digest = ? AND coverage_policy_sha256 = ?''',
|
|
(content_digest, policy_one),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertGreater(
|
|
datetime.fromisoformat(renewed['lease_expires_at']),
|
|
datetime.fromisoformat(short_expiry),
|
|
)
|
|
|
|
expired = (
|
|
datetime.now(timezone.utc) - timedelta(minutes=5)
|
|
).isoformat(timespec='seconds')
|
|
source_db.conn.execute(
|
|
'''UPDATE docker_content_blobs SET lease_expires_at = ?
|
|
WHERE digest = ? AND coverage_policy_sha256 = ?''',
|
|
(expired, content_digest, policy_one),
|
|
)
|
|
source_db.conn.commit()
|
|
third = claim(3)
|
|
third_plan = source_db.bind_docker_layer_plan(
|
|
third['reservation_id'], third['claim_lease_token'],
|
|
resolution(3), layer_limits, '1' * 64, blob_lease_seconds=60,
|
|
)
|
|
self.assertEqual(third_plan['descriptors'][0]['coverage_state'], 'leased')
|
|
self.assertTrue(source_db.refund_uncommitted_reservation(
|
|
owner['reservation_id'], producer.as_dict(), 'old owner stopped after reclaim',
|
|
partial_absence_confirmed=True,
|
|
))
|
|
current_owner = source_db.conn.execute(
|
|
'''SELECT lease_reservation_id, lease_token FROM docker_content_blobs
|
|
WHERE digest = ? AND coverage_policy_sha256 = ?''',
|
|
(content_digest, policy_one),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(current_owner['lease_reservation_id'], third['reservation_id'])
|
|
self.assertEqual(
|
|
current_owner['lease_token'], third_plan['descriptors'][0]['lease_token'],
|
|
)
|
|
with self.assertRaisesRegex(ScanEventConflictError, 'not exactly quarantineable'):
|
|
source_db.quarantine_result_bundle(
|
|
owner['reservation_id'], 'stale_owner', 'must not quarantine reclaimed work',
|
|
physical_confirmed=True,
|
|
)
|
|
|
|
plan_sha256 = hashlib.sha256(
|
|
canonical_docker_layer_plan_bytes(third_plan)
|
|
).hexdigest()
|
|
execution = {
|
|
'version': 1,
|
|
'plan_sha256': plan_sha256,
|
|
'blobs': [{
|
|
'digest': content_digest,
|
|
'lease_token': third_plan['descriptors'][0]['lease_token'],
|
|
'status': 'covered',
|
|
'verified_bytes': 4096,
|
|
'transfer_bytes': 4096,
|
|
'transfer_duration_ms': 10,
|
|
'scan_duration_ms': 10,
|
|
'finding_count': 0,
|
|
'error_code': None,
|
|
}],
|
|
}
|
|
timestamp = datetime.now(timezone.utc).isoformat(timespec='seconds')
|
|
staged = stage_result_bundle(
|
|
{
|
|
'scan_event_id': third['scan_event_id'],
|
|
'target': third['target'],
|
|
'scan_type': 'docker',
|
|
'timestamp': timestamp,
|
|
'scan_started_at': timestamp,
|
|
'duration_sec': 0.1,
|
|
'findings': [],
|
|
'errors': [],
|
|
'docker_layer_plan': third_plan,
|
|
'docker_layer_execution': execution,
|
|
},
|
|
third,
|
|
str(self.bundle_root),
|
|
{},
|
|
{
|
|
'queue_status': 'done', 'queue_error': None,
|
|
'available_after': None, 'reset_attempts': False,
|
|
},
|
|
candidate_max_items=4,
|
|
candidate_max_bytes=1024 * 1024,
|
|
)
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
third['reservation_id'], ready_metadata(staged),
|
|
))
|
|
self.assertTrue(ingester.process_one())
|
|
covered_one = source_db.conn.execute(
|
|
'''SELECT state, attempts, covered_policy_sha256
|
|
FROM docker_content_blobs
|
|
WHERE digest = ? AND coverage_policy_sha256 = ?''',
|
|
(content_digest, policy_one),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
(covered_one['state'], covered_one['attempts'], covered_one['covered_policy_sha256']),
|
|
('covered', 2, policy_one),
|
|
)
|
|
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
shared['reservation_id'], ready_metadata(shared_staged),
|
|
))
|
|
self.assertTrue(ingester.process_one())
|
|
reconciled_shared = source_db.conn.execute(
|
|
'''SELECT r.state AS reservation_state, q.status AS queue_status,
|
|
q.current_result_reservation_id, c.coverage_state,
|
|
(SELECT COUNT(*) FROM pipeline_quarantine pq
|
|
WHERE pq.reservation_id = r.id) AS quarantine_count
|
|
FROM result_reservations r
|
|
JOIN target_queue q ON q.id = r.queue_id
|
|
JOIN docker_image_blob_coverage c ON c.reservation_id = r.id
|
|
WHERE r.id = ?''',
|
|
(shared['reservation_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
reconciled_shared['reservation_state'],
|
|
reconciled_shared['queue_status'],
|
|
reconciled_shared['current_result_reservation_id'],
|
|
reconciled_shared['coverage_state'],
|
|
reconciled_shared['quarantine_count'],
|
|
),
|
|
('acknowledged', 'deferred', None, 'covered', 0),
|
|
)
|
|
|
|
adaptive_alias = claim(40)
|
|
adaptive_alias_plan = source_db.bind_docker_layer_plan(
|
|
adaptive_alias['reservation_id'], adaptive_alias['claim_lease_token'],
|
|
resolution(40), layer_limits, '1' * 64, blob_lease_seconds=60,
|
|
payload_classes=[], checkpoint={'max_blobs': 2, 'max_bytes': 8192},
|
|
)
|
|
self.assertEqual(adaptive_alias_plan['version'], 2)
|
|
self.assertEqual(
|
|
(
|
|
adaptive_alias_plan['descriptors'][0]['coverage_state'],
|
|
adaptive_alias_plan['descriptors'][0]['selection_reason'],
|
|
),
|
|
('covered', 'already_covered'),
|
|
)
|
|
adaptive_alias_sha256 = hashlib.sha256(
|
|
canonical_docker_layer_plan_bytes(adaptive_alias_plan)
|
|
).hexdigest()
|
|
alias_staged = stage_result_bundle(
|
|
{
|
|
'scan_event_id': adaptive_alias['scan_event_id'],
|
|
'target': adaptive_alias['target'],
|
|
'scan_type': 'docker',
|
|
'timestamp': timestamp,
|
|
'scan_started_at': timestamp,
|
|
'duration_sec': 0.1,
|
|
'findings': [],
|
|
'errors': [],
|
|
'docker_layer_plan': adaptive_alias_plan,
|
|
'docker_layer_execution': {
|
|
'version': 2,
|
|
'plan_sha256': adaptive_alias_sha256,
|
|
'blobs': [],
|
|
},
|
|
},
|
|
adaptive_alias,
|
|
str(self.bundle_root),
|
|
{},
|
|
{
|
|
'queue_status': 'done', 'queue_error': None,
|
|
'available_after': None, 'reset_attempts': False,
|
|
},
|
|
candidate_max_items=4,
|
|
candidate_max_bytes=1024 * 1024,
|
|
)
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
adaptive_alias['reservation_id'], ready_metadata(alias_staged),
|
|
))
|
|
self.assertTrue(ingester.process_one())
|
|
adaptive_policy = docker_layer_execution_policy_sha256(
|
|
'1' * 64, layer_limits,
|
|
)
|
|
aliased = source_db.conn.execute(
|
|
'''SELECT state, attempts, covered_reservation_id,
|
|
covered_scan_event_id, covered_policy_sha256
|
|
FROM docker_content_blobs
|
|
WHERE digest = ? AND coverage_policy_sha256 = ?''',
|
|
(content_digest, adaptive_policy),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
aliased['state'], aliased['attempts'],
|
|
aliased['covered_reservation_id'], aliased['covered_scan_event_id'],
|
|
aliased['covered_policy_sha256'],
|
|
),
|
|
(
|
|
'covered', 0, third['reservation_id'], third['scan_event_id'],
|
|
adaptive_policy,
|
|
),
|
|
)
|
|
|
|
incompatible_limits = dict(layer_limits)
|
|
incompatible_limits['archive_timeout_sec'] = 31
|
|
incompatible = claim(41)
|
|
incompatible_plan = source_db.bind_docker_layer_plan(
|
|
incompatible['reservation_id'], incompatible['claim_lease_token'],
|
|
resolution(41), incompatible_limits, '1' * 64, blob_lease_seconds=60,
|
|
payload_classes=[], checkpoint={'max_blobs': 2, 'max_bytes': 8192},
|
|
)
|
|
incompatible_policy = docker_layer_execution_policy_sha256(
|
|
'1' * 64, incompatible_limits,
|
|
)
|
|
self.assertNotEqual(incompatible_policy, adaptive_policy)
|
|
self.assertEqual(
|
|
incompatible_plan['descriptors'][0]['coverage_state'], 'leased',
|
|
)
|
|
incompatible_blob = source_db.conn.execute(
|
|
'''SELECT state, attempts, covered_reservation_id
|
|
FROM docker_content_blobs
|
|
WHERE digest = ? AND coverage_policy_sha256 = ?''',
|
|
(content_digest, incompatible_policy),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
incompatible_blob['state'], incompatible_blob['attempts'],
|
|
incompatible_blob['covered_reservation_id'],
|
|
),
|
|
('leased', 1, None),
|
|
)
|
|
self.assertTrue(source_db.refund_uncommitted_reservation(
|
|
incompatible['reservation_id'], producer.as_dict(),
|
|
'incompatible adaptive policy test cleanup',
|
|
partial_absence_confirmed=True,
|
|
))
|
|
|
|
fourth = claim(4)
|
|
fourth_plan = source_db.bind_docker_layer_plan(
|
|
fourth['reservation_id'], fourth['claim_lease_token'],
|
|
resolution(4), layer_limits, '2' * 64, blob_lease_seconds=60,
|
|
)
|
|
policy_two = docker_layer_coverage_policy_sha256('2' * 64, layer_limits)
|
|
self.assertNotEqual(policy_one, policy_two)
|
|
policy_rows = source_db.conn.execute(
|
|
'''SELECT coverage_policy_sha256, state, attempts
|
|
FROM docker_content_blobs WHERE digest = ?
|
|
ORDER BY coverage_policy_sha256''',
|
|
(content_digest,),
|
|
).fetchall()
|
|
source_db.conn.commit()
|
|
by_policy = {row['coverage_policy_sha256']: row for row in policy_rows}
|
|
self.assertEqual(
|
|
(by_policy[policy_one]['state'], by_policy[policy_one]['attempts']),
|
|
('covered', 2),
|
|
)
|
|
self.assertEqual(
|
|
(by_policy[policy_two]['state'], by_policy[policy_two]['attempts']),
|
|
('leased', 1),
|
|
)
|
|
|
|
fifth = claim(5)
|
|
fifth_plan = source_db.bind_docker_layer_plan(
|
|
fifth['reservation_id'], fifth['claim_lease_token'],
|
|
resolution(5), layer_limits, '2' * 64, blob_lease_seconds=60,
|
|
)
|
|
self.assertEqual(fifth_plan['descriptors'][0]['coverage_state'], 'shared_pending')
|
|
|
|
source_db.conn.execute(
|
|
'UPDATE result_reservations SET producer_lease_expires_at = ? WHERE id = ?',
|
|
(expired, fourth['reservation_id']),
|
|
)
|
|
source_db.conn.execute(
|
|
'UPDATE target_queue SET lease_expires_at = ? WHERE id = ?',
|
|
(expired, fourth['queue_id']),
|
|
)
|
|
source_db.conn.commit()
|
|
self.assertFalse(source_db.mark_result_bundle_ready(
|
|
fourth['reservation_id'], {
|
|
'bundle_id': fourth['bundle_id'],
|
|
'scan_event_id': fourth['scan_event_id'],
|
|
'scan_event_hash': 'e' * 64,
|
|
'relative_path': fourth['ready_relative_path'],
|
|
'actual_bytes': 1,
|
|
'frame_count': 1,
|
|
'finding_count': 0,
|
|
'error_count': 0,
|
|
'candidate_count': 0,
|
|
},
|
|
))
|
|
unsubmitted = source_db.conn.execute(
|
|
'''SELECT state, lease_reservation_id FROM docker_content_blobs
|
|
WHERE digest = ? AND coverage_policy_sha256 = ?''',
|
|
(content_digest, policy_two),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
(unsubmitted['state'], unsubmitted['lease_reservation_id']),
|
|
('leased', fourth['reservation_id']),
|
|
)
|
|
|
|
fifth_sha256 = hashlib.sha256(
|
|
canonical_docker_layer_plan_bytes(fifth_plan)
|
|
).hexdigest()
|
|
staged_retry = stage_result_bundle(
|
|
{
|
|
'scan_event_id': fifth['scan_event_id'],
|
|
'target': fifth['target'],
|
|
'scan_type': 'docker',
|
|
'timestamp': timestamp,
|
|
'scan_started_at': timestamp,
|
|
'duration_sec': 0.1,
|
|
'findings': [],
|
|
'errors': ['shared content remains pending'],
|
|
'retryable': True,
|
|
'docker_layer_plan': fifth_plan,
|
|
'docker_layer_execution': {
|
|
'version': 1, 'plan_sha256': fifth_sha256, 'blobs': [],
|
|
},
|
|
},
|
|
fifth,
|
|
str(self.bundle_root),
|
|
{},
|
|
{
|
|
'queue_status': 'done',
|
|
'queue_error': 'shared content remains pending',
|
|
'available_after': None,
|
|
'reset_attempts': False,
|
|
},
|
|
candidate_max_items=4,
|
|
candidate_max_bytes=1024 * 1024,
|
|
)
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
fifth['reservation_id'], ready_metadata(staged_retry),
|
|
))
|
|
self.assertTrue(ingester.process_one())
|
|
quarantined = source_db.conn.execute(
|
|
'''SELECT * FROM pipeline_quarantine
|
|
WHERE subsystem = 'result_ingester' AND object_type = 'result_bundle'
|
|
AND reservation_id = ? AND review_status = 'pending' ''',
|
|
(fifth['reservation_id'],),
|
|
).fetchone()
|
|
reservation_state = source_db.conn.execute(
|
|
'SELECT state FROM result_reservations WHERE id = ?',
|
|
(fifth['reservation_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertIsNotNone(quarantined)
|
|
self.assertEqual(
|
|
quarantined['reason_code'], 'docker_coverage_disposition_conflict',
|
|
)
|
|
self.assertEqual(reservation_state['state'], 'quarantined')
|
|
capacity_before = source_db.pipeline_capacity_snapshot()
|
|
replayed = source_db.quarantine_result_bundle(
|
|
fifth['reservation_id'], quarantined['reason_code'],
|
|
quarantined['reason_detail'] or '', quarantined['source_relative_path'] or '',
|
|
payload_sha256=quarantined['payload_sha256'] or '',
|
|
byte_count=quarantined['byte_count'], physical_confirmed=True,
|
|
)
|
|
self.assertEqual(replayed, quarantined['id'])
|
|
with self.assertRaisesRegex(ScanEventConflictError, 'conflicts with existing evidence'):
|
|
source_db.quarantine_result_bundle(
|
|
fifth['reservation_id'], quarantined['reason_code'],
|
|
(quarantined['reason_detail'] or '') + ' changed',
|
|
quarantined['source_relative_path'] or '',
|
|
payload_sha256=quarantined['payload_sha256'] or '',
|
|
byte_count=quarantined['byte_count'], physical_confirmed=True,
|
|
)
|
|
capacity_after = source_db.pipeline_capacity_snapshot()
|
|
capacity_keys = (
|
|
'bundle_items', 'bundle_bytes', 'projection_items', 'projection_bytes',
|
|
'keycheck_items', 'keycheck_bytes', 'quarantine_items', 'quarantine_bytes',
|
|
)
|
|
self.assertEqual(
|
|
tuple(capacity_before[key] for key in capacity_keys),
|
|
tuple(capacity_after[key] for key in capacity_keys),
|
|
)
|
|
quarantine_path = self.bundle_root.joinpath(
|
|
*str(quarantined['source_relative_path']).split('/')
|
|
)
|
|
self.assertTrue(quarantine_path.exists())
|
|
rescan_manifest = self.root / 'docker-bundle-rescan-review.json'
|
|
atomic_write_private_json(str(rescan_manifest), {
|
|
'type': 'truf-pipeline-quarantine-review-v1',
|
|
'entries': [{
|
|
'id': quarantined['id'],
|
|
'reason_code': quarantined['reason_code'],
|
|
'payload_sha256': quarantined['payload_sha256'],
|
|
'action': 'rescan',
|
|
}],
|
|
})
|
|
review_pipeline_quarantine_manifest(
|
|
source_db, str(rescan_manifest), max_rows=1,
|
|
config={'global': {
|
|
'results_dir': str(self.results),
|
|
'result_bundle_dir': str(self.bundle_root),
|
|
}},
|
|
)
|
|
reviewed = source_db.conn.execute(
|
|
'''SELECT q.status, q.attempts, q.current_result_reservation_id,
|
|
q.claim_event_id, r.state AS reservation_state,
|
|
pq.review_status
|
|
FROM result_reservations r
|
|
JOIN target_queue q ON q.id = r.queue_id
|
|
JOIN pipeline_quarantine pq ON pq.reservation_id = r.id
|
|
WHERE r.id = ?''',
|
|
(fifth['reservation_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
reviewed['status'], reviewed['attempts'],
|
|
reviewed['current_result_reservation_id'], reviewed['claim_event_id'],
|
|
reviewed['reservation_state'], reviewed['review_status'],
|
|
),
|
|
('pending', 0, None, None, 'quarantined', 'approved_rescan'),
|
|
)
|
|
self.assertFalse(quarantine_path.exists())
|
|
capacity_rescanned = source_db.pipeline_capacity_snapshot()
|
|
self.assertEqual(
|
|
capacity_rescanned['quarantine_items'],
|
|
capacity_after['quarantine_items'] - int(quarantined['capacity_items']),
|
|
)
|
|
self.assertEqual(
|
|
capacity_rescanned['quarantine_bytes'],
|
|
capacity_after['quarantine_bytes'] - int(quarantined['capacity_bytes']),
|
|
)
|
|
still_owned = source_db.conn.execute(
|
|
'''SELECT state, lease_reservation_id FROM docker_content_blobs
|
|
WHERE digest = ? AND coverage_policy_sha256 = ?''',
|
|
(content_digest, policy_two),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
(still_owned['state'], still_owned['lease_reservation_id']),
|
|
('leased', fourth['reservation_id']),
|
|
)
|
|
self.assertNotEqual(shared['reservation_id'], owner['reservation_id'])
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
source_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_docker_layer_checkpoints_resume_without_rescanning_covered_blobs(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(ingester_db, initialize_base=True)
|
|
ingester_db.record_final_cutover({'test': self.id()})
|
|
run_id = source_db.start_run('integration', selected_source='dockerhub')
|
|
cycle_id = source_db.start_source_cycle(
|
|
run_id, 'dockerhub', 'docker', 'integration', 'checkpoint-resume',
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor',
|
|
).start()
|
|
producer = current_process_identity()
|
|
capacity_limits = {
|
|
'bundle_items': 20, 'bundle_bytes': 128 * 1024 * 1024,
|
|
'projection_items': 20, 'projection_bytes': 128 * 1024 * 1024,
|
|
'keycheck_items': 20, 'keycheck_bytes': 32 * 1024 * 1024,
|
|
}
|
|
limits = {
|
|
'config_max_bytes': 1024 * 1024,
|
|
'layer_max_bytes': 8 * 1024 * 1024,
|
|
'image_max_bytes': 16 * 1024 * 1024,
|
|
'max_layers': 2,
|
|
'archive_max_size_bytes': 8 * 1024 * 1024,
|
|
'archive_max_depth': 4,
|
|
'archive_timeout_sec': 30,
|
|
'blob_timeout_sec': 600,
|
|
'filesystem_concurrency': 2,
|
|
'blob_max_attempts': 3,
|
|
}
|
|
manifest = 'sha256:' + ('a' * 64)
|
|
config_digest = 'sha256:' + ('b' * 64)
|
|
base_digest = 'sha256:' + ('c' * 64)
|
|
middle_digest = 'sha256:' + ('e' * 64)
|
|
top_digest = 'sha256:' + ('d' * 64)
|
|
target = f'example/checkpoint-resume@{manifest}'
|
|
resolution = {
|
|
'version': 1,
|
|
'image': target,
|
|
'repository': 'example/checkpoint-resume',
|
|
'manifest_digest': manifest,
|
|
'platform_os': 'linux',
|
|
'platform_arch': 'amd64',
|
|
'manifest_media_type': 'application/vnd.oci.image.manifest.v1+json',
|
|
'config': {
|
|
'digest': config_digest, 'size': 1024,
|
|
'media_type': 'application/vnd.oci.image.config.v1+json',
|
|
},
|
|
'layers': [
|
|
{
|
|
'digest': base_digest, 'size': 2048,
|
|
'media_type': 'application/vnd.oci.image.layer.v1.tar+gzip',
|
|
},
|
|
{
|
|
'digest': middle_digest, 'size': 3072,
|
|
'media_type': 'application/vnd.oci.image.layer.v1.tar+gzip',
|
|
},
|
|
{
|
|
'digest': top_digest, 'size': 4096,
|
|
'media_type': 'application/vnd.oci.image.layer.v1.tar+gzip',
|
|
},
|
|
],
|
|
}
|
|
self.assertEqual(
|
|
source_db.enqueue_targets('dockerhub', 'docker', 'integration', [target]), 1,
|
|
)
|
|
|
|
def reserve(sequence):
|
|
return source_db.reserve_and_claim_target(
|
|
'dockerhub', 'docker', producer, 'integration-supervisor',
|
|
4 * 1024 * 1024, 4 * 1024 * 1024, 4, 1024 * 1024,
|
|
run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits=capacity_limits,
|
|
reservation_token=f'docker-checkpoint-{sequence}',
|
|
bundle_id=f'{sequence + 1000:064x}',
|
|
scan_event_id=f'{sequence + 2000:064x}',
|
|
claim_order='newest',
|
|
)
|
|
|
|
def stage_checkpoint(claimed, plan, done):
|
|
leased = [
|
|
item for item in plan['descriptors']
|
|
if item['coverage_state'] == 'leased'
|
|
]
|
|
self.assertEqual(len(leased), 1)
|
|
descriptor = leased[0]
|
|
plan_sha256 = hashlib.sha256(
|
|
canonical_docker_layer_plan_bytes(plan)
|
|
).hexdigest()
|
|
timestamp = datetime.now(timezone.utc).isoformat(timespec='seconds')
|
|
result = {
|
|
'scan_event_id': claimed['scan_event_id'],
|
|
'target': claimed['target'],
|
|
'scan_type': 'docker',
|
|
'timestamp': timestamp,
|
|
'scan_started_at': timestamp,
|
|
'duration_sec': 0.1,
|
|
'findings': [],
|
|
'errors': [] if done else ['next durable content checkpoint'],
|
|
'retryable': not done,
|
|
'docker_layer_plan': plan,
|
|
'docker_layer_execution': {
|
|
'version': 1,
|
|
'plan_sha256': plan_sha256,
|
|
'blobs': [{
|
|
'digest': descriptor['digest'],
|
|
'lease_token': descriptor['lease_token'],
|
|
'status': 'covered',
|
|
'verified_bytes': descriptor['size'],
|
|
'transfer_bytes': descriptor['size'],
|
|
'transfer_duration_ms': 10,
|
|
'scan_duration_ms': 10,
|
|
'finding_count': 0,
|
|
'error_code': None,
|
|
}],
|
|
},
|
|
}
|
|
available_after = None
|
|
if not done:
|
|
available_after = (
|
|
datetime.now(timezone.utc) + timedelta(minutes=1)
|
|
).isoformat(timespec='seconds')
|
|
staged = stage_result_bundle(
|
|
result,
|
|
claimed,
|
|
str(self.bundle_root),
|
|
{},
|
|
{
|
|
'queue_status': 'done' if done else 'deferred',
|
|
'queue_error': None if done else 'next durable content checkpoint',
|
|
'available_after': available_after,
|
|
'reset_attempts': not done,
|
|
},
|
|
candidate_max_items=4,
|
|
candidate_max_bytes=1024 * 1024,
|
|
)
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
claimed['reservation_id'], {
|
|
'bundle_id': staged.bundle_id,
|
|
'scan_event_id': staged.scan_event_id,
|
|
'scan_event_hash': staged.scan_event_hash,
|
|
'relative_path': staged.relative_path,
|
|
'actual_bytes': staged.actual_bytes,
|
|
'frame_count': staged.frame_count,
|
|
'finding_count': staged.finding_count,
|
|
'error_count': staged.error_count,
|
|
'candidate_count': staged.candidate_count,
|
|
},
|
|
))
|
|
self.assertTrue(ingester.process_one())
|
|
reservation_state = source_db.conn.execute(
|
|
'''SELECT state, last_error_code, last_error_detail
|
|
FROM result_reservations WHERE id = ?''',
|
|
(claimed['reservation_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
reservation_state['state'], 'acknowledged',
|
|
(reservation_state['last_error_code'], reservation_state['last_error_detail']),
|
|
)
|
|
return descriptor['position']
|
|
|
|
initial_claim = reserve(0)
|
|
self.assertIsNotNone(initial_claim)
|
|
self.assertFalse(source_db.docker_layer_timeout_canary_eligible(
|
|
initial_claim['reservation_id'], initial_claim['claim_lease_token'],
|
|
))
|
|
timeout_at = datetime.now(timezone.utc).isoformat(timespec='seconds')
|
|
timeout_result = {
|
|
'scan_event_id': initial_claim['scan_event_id'],
|
|
'target': initial_claim['target'],
|
|
'scan_type': 'docker',
|
|
'timestamp': timeout_at,
|
|
'scan_started_at': timeout_at,
|
|
'duration_sec': 600.0,
|
|
'findings': [],
|
|
'errors': ['Docker full-image command reached its deadline'],
|
|
'error_class': 'timeout',
|
|
'retryable': True,
|
|
'scan_meta': {'command_timed_out': True},
|
|
}
|
|
timeout_staged = stage_result_bundle(
|
|
timeout_result, initial_claim, str(self.bundle_root), {},
|
|
{
|
|
'queue_status': 'deferred',
|
|
'queue_error': 'Docker full-image command reached its deadline',
|
|
'available_after': (
|
|
datetime.now(timezone.utc) + timedelta(hours=6)
|
|
).isoformat(timespec='seconds'),
|
|
'reset_attempts': False,
|
|
},
|
|
candidate_max_items=4,
|
|
candidate_max_bytes=1024 * 1024,
|
|
)
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
initial_claim['reservation_id'], {
|
|
'bundle_id': timeout_staged.bundle_id,
|
|
'scan_event_id': timeout_staged.scan_event_id,
|
|
'scan_event_hash': timeout_staged.scan_event_hash,
|
|
'relative_path': timeout_staged.relative_path,
|
|
'actual_bytes': timeout_staged.actual_bytes,
|
|
'frame_count': timeout_staged.frame_count,
|
|
'finding_count': timeout_staged.finding_count,
|
|
'error_count': timeout_staged.error_count,
|
|
'candidate_count': timeout_staged.candidate_count,
|
|
},
|
|
))
|
|
self.assertTrue(ingester.process_one())
|
|
source_db.conn.execute(
|
|
'''UPDATE target_queue SET available_after = ?
|
|
WHERE source = 'dockerhub' AND normalized_target = ?''',
|
|
('2000-01-01T00:00:00+00:00', target),
|
|
)
|
|
source_db.conn.commit()
|
|
|
|
leased_positions = []
|
|
final_reservation_id = None
|
|
for sequence, expected_position in enumerate((0, 3, 2), 1):
|
|
if sequence > 1:
|
|
source_db.conn.execute(
|
|
'''UPDATE target_queue SET available_after = ?
|
|
WHERE source = 'dockerhub' AND normalized_target = ?''',
|
|
('2000-01-01T00:00:00+00:00', target),
|
|
)
|
|
source_db.conn.commit()
|
|
claimed = reserve(sequence)
|
|
self.assertIsNotNone(claimed)
|
|
self.assertTrue(source_db.docker_layer_timeout_canary_eligible(
|
|
claimed['reservation_id'], claimed['claim_lease_token'],
|
|
))
|
|
plan = source_db.bind_docker_layer_plan(
|
|
claimed['reservation_id'], claimed['claim_lease_token'],
|
|
resolution, limits, '1' * 64, blob_lease_seconds=60,
|
|
)
|
|
self.assertEqual(
|
|
[
|
|
item['position'] for item in plan['descriptors']
|
|
if item['coverage_state'] == 'leased'
|
|
],
|
|
[expected_position],
|
|
)
|
|
expected_states = {
|
|
1: ['leased', 'skipped', 'selected', 'selected'],
|
|
2: ['covered', 'skipped', 'selected', 'leased'],
|
|
3: ['covered', 'skipped', 'leased', 'covered'],
|
|
}
|
|
self.assertEqual(
|
|
[item['coverage_state'] for item in plan['descriptors']],
|
|
expected_states[sequence],
|
|
)
|
|
leased_positions.append(stage_checkpoint(
|
|
claimed, plan, done=sequence == 3,
|
|
))
|
|
final_reservation_id = claimed['reservation_id']
|
|
|
|
self.assertEqual(leased_positions, [0, 3, 2])
|
|
policy = docker_layer_coverage_policy_sha256('1' * 64, limits)
|
|
blob_rows = source_db.conn.execute(
|
|
'''SELECT digest, state, attempts FROM docker_content_blobs
|
|
WHERE coverage_policy_sha256 = ? ORDER BY digest''',
|
|
(policy,),
|
|
).fetchall()
|
|
coverage_rows = source_db.conn.execute(
|
|
'''SELECT position, coverage_state FROM docker_image_blob_coverage
|
|
WHERE manifest_digest = ? AND coverage_policy_sha256 = ?
|
|
AND reservation_id = ?
|
|
ORDER BY position''',
|
|
(manifest, policy, final_reservation_id),
|
|
).fetchall()
|
|
queue_row = source_db.conn.execute(
|
|
'''SELECT status, attempts FROM target_queue
|
|
WHERE source = 'dockerhub' AND normalized_target = ?''',
|
|
(target,),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
[(row['digest'], row['state'], row['attempts']) for row in blob_rows],
|
|
sorted([
|
|
(config_digest, 'covered', 1),
|
|
(base_digest, 'pending', 0),
|
|
(middle_digest, 'covered', 1),
|
|
(top_digest, 'covered', 1),
|
|
]),
|
|
)
|
|
self.assertEqual(
|
|
[(row['position'], row['coverage_state']) for row in coverage_rows],
|
|
[(0, 'covered'), (1, 'skipped'), (2, 'covered'), (3, 'covered')],
|
|
)
|
|
self.assertEqual((queue_row['status'], queue_row['attempts']), ('done', 1))
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
source_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_docker_adaptive_checkpoints_are_frozen_bounded_and_independent(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(ingester_db, initialize_base=True)
|
|
ingester_db.record_final_cutover({'test': self.id()})
|
|
run_id = source_db.start_run('integration', selected_source='dockerhub')
|
|
cycle_id = source_db.start_source_cycle(
|
|
run_id, 'dockerhub', 'docker', 'integration', 'adaptive-checkpoint',
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor',
|
|
).start()
|
|
producer = current_process_identity()
|
|
capacity_limits = {
|
|
'bundle_items': 20, 'bundle_bytes': 128 * 1024 * 1024,
|
|
'projection_items': 20, 'projection_bytes': 128 * 1024 * 1024,
|
|
'keycheck_items': 20, 'keycheck_bytes': 32 * 1024 * 1024,
|
|
}
|
|
limits = {
|
|
'config_max_bytes': 1024 * 1024,
|
|
'layer_max_bytes': 8 * 1024 * 1024,
|
|
'image_max_bytes': 8000,
|
|
'max_layers': 2,
|
|
'archive_max_size_bytes': 8 * 1024 * 1024,
|
|
'archive_max_depth': 4,
|
|
'archive_timeout_sec': 30,
|
|
'blob_timeout_sec': 600,
|
|
'filesystem_concurrency': 2,
|
|
'blob_max_attempts': 3,
|
|
}
|
|
checkpoint = {'max_blobs': 2, 'max_bytes': 5000}
|
|
manifest = 'sha256:' + ('1' * 64)
|
|
digests = {
|
|
'config': 'sha256:' + ('2' * 64),
|
|
'bulk': 'sha256:' + ('3' * 64),
|
|
'copy': 'sha256:' + ('4' * 64),
|
|
'package': 'sha256:' + ('5' * 64),
|
|
'app': 'sha256:' + ('6' * 64),
|
|
}
|
|
target = f'example/adaptive-checkpoint@{manifest}'
|
|
resolution = {
|
|
'version': 1,
|
|
'image': target,
|
|
'repository': 'example/adaptive-checkpoint',
|
|
'manifest_digest': manifest,
|
|
'platform_os': 'linux',
|
|
'platform_arch': 'amd64',
|
|
'manifest_media_type': 'application/vnd.oci.image.manifest.v1+json',
|
|
'config': {
|
|
'digest': digests['config'], 'size': 1024,
|
|
'media_type': 'application/vnd.oci.image.config.v1+json',
|
|
},
|
|
'layers': [
|
|
{
|
|
'digest': digests['bulk'], 'size': 2000,
|
|
'media_type': 'application/vnd.oci.image.layer.v1.tar+gzip',
|
|
},
|
|
{
|
|
'digest': digests['copy'], 'size': 3000,
|
|
'media_type': 'application/vnd.oci.image.layer.v1.tar+gzip',
|
|
},
|
|
{
|
|
'digest': digests['package'], 'size': 4000,
|
|
'media_type': 'application/vnd.oci.image.layer.v1.tar+gzip',
|
|
},
|
|
{
|
|
'digest': digests['app'], 'size': 5000,
|
|
'media_type': 'application/vnd.oci.image.layer.v1.tar+gzip',
|
|
},
|
|
],
|
|
}
|
|
payload_classes = [
|
|
'bulk_data', 'copy_add', 'package_run', 'app_config_run',
|
|
]
|
|
self.assertEqual(
|
|
source_db.enqueue_targets('dockerhub', 'docker', 'integration', [target]), 1,
|
|
)
|
|
|
|
def reserve(sequence):
|
|
return source_db.reserve_and_claim_target(
|
|
'dockerhub', 'docker', producer, 'integration-supervisor',
|
|
4 * 1024 * 1024, 4 * 1024 * 1024, 4, 1024 * 1024,
|
|
run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits=capacity_limits,
|
|
reservation_token=f'docker-adaptive-checkpoint-{sequence}',
|
|
bundle_id=f'{sequence + 3000:064x}',
|
|
scan_event_id=f'{sequence + 4000:064x}',
|
|
claim_order='newest',
|
|
)
|
|
|
|
def bind(claimed):
|
|
return source_db.bind_docker_layer_plan(
|
|
claimed['reservation_id'], claimed['claim_lease_token'],
|
|
resolution, limits, '7' * 64, blob_lease_seconds=60,
|
|
payload_classes=payload_classes, checkpoint=checkpoint,
|
|
)
|
|
|
|
def stage(claimed, plan, outcomes, *, done, reset_attempts):
|
|
leased = {
|
|
descriptor['digest']: descriptor
|
|
for descriptor in plan['descriptors']
|
|
if descriptor['coverage_state'] == 'leased'
|
|
}
|
|
self.assertEqual(set(outcomes), set(leased))
|
|
plan_sha256 = hashlib.sha256(
|
|
canonical_docker_layer_plan_bytes(plan)
|
|
).hexdigest()
|
|
records = []
|
|
for digest, status in outcomes.items():
|
|
descriptor = leased[digest]
|
|
records.append({
|
|
'digest': digest,
|
|
'lease_token': descriptor['lease_token'],
|
|
'status': status,
|
|
'verified_bytes': descriptor['size'] if status == 'covered' else 0,
|
|
'transfer_bytes': descriptor['size'],
|
|
'transfer_duration_ms': 10,
|
|
'scan_duration_ms': 10,
|
|
'finding_count': 0,
|
|
'error_code': None if status == 'covered' else 'scanner_retry',
|
|
})
|
|
timestamp = datetime.now(timezone.utc).isoformat(timespec='seconds')
|
|
available_after = None
|
|
if not done:
|
|
available_after = (
|
|
datetime.now(timezone.utc) + timedelta(minutes=1)
|
|
).isoformat(timespec='seconds')
|
|
staged = stage_result_bundle(
|
|
{
|
|
'scan_event_id': claimed['scan_event_id'],
|
|
'target': claimed['target'],
|
|
'scan_type': 'docker',
|
|
'timestamp': timestamp,
|
|
'scan_started_at': timestamp,
|
|
'duration_sec': 0.1,
|
|
'findings': [],
|
|
'errors': [] if done else ['next adaptive content checkpoint'],
|
|
'retryable': not done,
|
|
'docker_layer_plan': plan,
|
|
'docker_layer_execution': {
|
|
'version': 2,
|
|
'plan_sha256': plan_sha256,
|
|
'blobs': records,
|
|
},
|
|
},
|
|
claimed,
|
|
str(self.bundle_root),
|
|
{},
|
|
{
|
|
'queue_status': 'done' if done else 'deferred',
|
|
'queue_error': None if done else 'next adaptive content checkpoint',
|
|
'available_after': available_after,
|
|
'reset_attempts': reset_attempts,
|
|
},
|
|
candidate_max_items=4,
|
|
candidate_max_bytes=1024 * 1024,
|
|
)
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
claimed['reservation_id'], {
|
|
'bundle_id': staged.bundle_id,
|
|
'scan_event_id': staged.scan_event_id,
|
|
'scan_event_hash': staged.scan_event_hash,
|
|
'relative_path': staged.relative_path,
|
|
'actual_bytes': staged.actual_bytes,
|
|
'frame_count': staged.frame_count,
|
|
'finding_count': staged.finding_count,
|
|
'error_count': staged.error_count,
|
|
'candidate_count': staged.candidate_count,
|
|
},
|
|
))
|
|
self.assertTrue(ingester.process_one())
|
|
|
|
plans = []
|
|
first = reserve(1)
|
|
self.assertIsNotNone(first)
|
|
first_plan = bind(first)
|
|
plans.append(first_plan)
|
|
self.assertEqual(first_plan['version'], 2)
|
|
self.assertEqual(
|
|
[
|
|
descriptor['digest'] for descriptor in first_plan['descriptors']
|
|
if descriptor['coverage_state'] == 'leased'
|
|
],
|
|
[digests['config'], digests['copy']],
|
|
)
|
|
stage(
|
|
first,
|
|
first_plan,
|
|
{digests['config']: 'covered', digests['copy']: 'retryable_failed'},
|
|
done=False,
|
|
reset_attempts=False,
|
|
)
|
|
source_db.conn.execute(
|
|
'''UPDATE target_queue SET available_after = ?
|
|
WHERE source = 'dockerhub' AND normalized_target = ?''',
|
|
('2000-01-01T00:00:00+00:00', target),
|
|
)
|
|
source_db.conn.execute(
|
|
'''UPDATE docker_content_blobs SET available_after = ?
|
|
WHERE digest = ? AND coverage_policy_sha256 = ?''',
|
|
(
|
|
'2000-01-01T00:00:00+00:00', digests['copy'],
|
|
first_plan['execution_policy_sha256'],
|
|
),
|
|
)
|
|
source_db.conn.commit()
|
|
|
|
second = reserve(2)
|
|
self.assertIsNotNone(second)
|
|
second_plan = bind(second)
|
|
plans.append(second_plan)
|
|
self.assertEqual(
|
|
[
|
|
descriptor['digest'] for descriptor in second_plan['descriptors']
|
|
if descriptor['coverage_state'] == 'leased'
|
|
],
|
|
[digests['copy']],
|
|
)
|
|
self.assertEqual(second_plan['descriptors'][0]['coverage_state'], 'covered')
|
|
stage(
|
|
second, second_plan, {digests['copy']: 'covered'},
|
|
done=False, reset_attempts=True,
|
|
)
|
|
source_db.conn.execute(
|
|
'''UPDATE target_queue SET available_after = ?
|
|
WHERE source = 'dockerhub' AND normalized_target = ?''',
|
|
('2000-01-01T00:00:00+00:00', target),
|
|
)
|
|
source_db.conn.commit()
|
|
|
|
third = reserve(3)
|
|
self.assertIsNotNone(third)
|
|
third_plan = bind(third)
|
|
plans.append(third_plan)
|
|
self.assertEqual(
|
|
[
|
|
descriptor['digest'] for descriptor in third_plan['descriptors']
|
|
if descriptor['coverage_state'] == 'leased'
|
|
],
|
|
[digests['app']],
|
|
)
|
|
stage(
|
|
third, third_plan, {digests['app']: 'covered'},
|
|
done=True, reset_attempts=False,
|
|
)
|
|
|
|
expected_selection = [
|
|
(True, 'config_selected'),
|
|
(False, 'layer_limit_exhausted'),
|
|
(True, 'selected_copy_add'),
|
|
(False, 'layer_limit_exhausted'),
|
|
(True, 'selected_app_config_run'),
|
|
]
|
|
self.assertTrue(all(
|
|
[
|
|
(descriptor['selected'], descriptor['selection_reason'])
|
|
for descriptor in plan['descriptors']
|
|
] == expected_selection
|
|
for plan in plans
|
|
))
|
|
self.assertEqual(len({plan['selection_policy_sha256'] for plan in plans}), 1)
|
|
policy = third_plan['execution_policy_sha256']
|
|
blob_rows = source_db.conn.execute(
|
|
'''SELECT digest, state, attempts FROM docker_content_blobs
|
|
WHERE coverage_policy_sha256 = ? ORDER BY digest''',
|
|
(policy,),
|
|
).fetchall()
|
|
coverage_rows = source_db.conn.execute(
|
|
'''SELECT position, selected, selection_reason, coverage_state,
|
|
selection_policy_sha256
|
|
FROM docker_image_blob_coverage
|
|
WHERE reservation_id = ? ORDER BY position''',
|
|
(third['reservation_id'],),
|
|
).fetchall()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
[(row['digest'], row['state'], row['attempts']) for row in blob_rows],
|
|
sorted([
|
|
(digests['config'], 'covered', 1),
|
|
(digests['bulk'], 'pending', 0),
|
|
(digests['copy'], 'covered', 2),
|
|
(digests['package'], 'pending', 0),
|
|
(digests['app'], 'covered', 1),
|
|
]),
|
|
)
|
|
self.assertEqual(
|
|
[
|
|
(
|
|
row['position'], bool(row['selected']), row['selection_reason'],
|
|
row['coverage_state'], row['selection_policy_sha256'],
|
|
)
|
|
for row in coverage_rows
|
|
],
|
|
[
|
|
(0, True, 'config_selected', 'covered', third_plan['selection_policy_sha256']),
|
|
(1, False, 'layer_limit_exhausted', 'skipped', third_plan['selection_policy_sha256']),
|
|
(2, True, 'selected_copy_add', 'covered', third_plan['selection_policy_sha256']),
|
|
(3, False, 'layer_limit_exhausted', 'skipped', third_plan['selection_policy_sha256']),
|
|
(4, True, 'selected_app_config_run', 'covered', third_plan['selection_policy_sha256']),
|
|
],
|
|
)
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
source_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_reviewed_docker_depth_cohort_postgres_apply_is_atomic_and_idempotent(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.record_final_cutover({'test': self.id()})
|
|
queries = tuple(f'pg-operator-query-{index:02d}' for index in range(61))
|
|
config = {
|
|
'global': {
|
|
'database_url': self.dsn,
|
|
'sync_file_queues': False,
|
|
},
|
|
'sources': {'dockerhub': {
|
|
'mode': 'search',
|
|
'require_digest': True,
|
|
'queries': list(queries),
|
|
'pages': 30,
|
|
'per_page': 100,
|
|
'docker_platform_candidate_tags': 20,
|
|
'docker_images_per_repository': 3,
|
|
'docker_depth_experiment': {
|
|
'experiment_key': 'pg-reviewed-cohort-v1',
|
|
'enabled': False,
|
|
'queries': list(queries),
|
|
'repositories_per_query': 10,
|
|
'shallow_images_per_repository': 1,
|
|
'deep_repositories_per_query': 1,
|
|
'deep_images_per_repository': 10,
|
|
'target_limit': 1200,
|
|
'selector_version': depth.DOCKER_DEPTH_SELECTOR_VERSION,
|
|
},
|
|
}},
|
|
}
|
|
experiment = depth.validate_docker_depth_config(config).experiment
|
|
policy_sha256 = 'b' * 64
|
|
now = scanner_db.utc_now_iso()
|
|
discovery_pass = db.conn.execute(
|
|
'''INSERT INTO docker_discovery_passes(
|
|
pass_token, source, pass_kind, policy_sha256,
|
|
ordered_queries_sha256, expected_query_count,
|
|
completed_query_count, state, started_at, completed_at,
|
|
created_at, updated_at
|
|
) VALUES ('pg-reviewed-cohort-pass', 'dockerhub', 'deep', ?, ?,
|
|
61, 61, 'complete', ?, ?, ?, ?) RETURNING id''',
|
|
(policy_sha256, experiment.ordered_query_hash, now, now, now, now),
|
|
).fetchone()
|
|
for query_ordinal, query in enumerate(queries):
|
|
selected_count = 9 if query_ordinal == 0 else (
|
|
0 if query_ordinal == 1 else 10
|
|
)
|
|
page = db.conn.execute(
|
|
'''INSERT INTO docker_discovery_pages(
|
|
pass_id, query, query_ordinal, page_number, result_count,
|
|
admitted_count, query_complete, admission_kind, page_sha256,
|
|
observed_at, created_at
|
|
) VALUES (?, ?, ?, 1, ?, ?, 1, 'main', ?, ?, ?)
|
|
RETURNING id''',
|
|
(
|
|
discovery_pass['id'], query, query_ordinal,
|
|
selected_count, selected_count,
|
|
f'{query_ordinal + 1:064x}', now, now,
|
|
),
|
|
).fetchone()
|
|
for rank in range(1, selected_count + 1):
|
|
repository = f'owner/pg-operator-q{query_ordinal:02d}-r{rank:02d}'
|
|
queue = db.conn.execute(
|
|
'''INSERT INTO target_queue(
|
|
source, platform, query, target, normalized_target,
|
|
status, resolver_state, created_at, updated_at
|
|
) VALUES ('dockerhub', 'docker', ?, ?, ?, 'deferred',
|
|
'pending', ?, ?) RETURNING id''',
|
|
(query, repository, repository, now, now),
|
|
).fetchone()
|
|
db.conn.execute(
|
|
'''INSERT INTO docker_repository_query_provenance(
|
|
source, query, repository_queue_id, provenance_kind,
|
|
first_observed_at, last_observed_at, first_search_rank,
|
|
best_search_rank, last_search_rank, first_page_id,
|
|
last_page_id, first_policy_sha256, last_policy_sha256,
|
|
observation_count, fresh_observation_count,
|
|
fresh_complete_observation_count, fresh_coverage_eligible,
|
|
created_at, updated_at
|
|
) VALUES ('dockerhub', ?, ?, 'fresh_page', ?, ?, ?, ?, ?, ?, ?, ?, ?,
|
|
1, 1, 1, 1, ?, ?)''',
|
|
(
|
|
query, queue['id'], now, now, rank, rank, rank,
|
|
page['id'], page['id'], policy_sha256, policy_sha256,
|
|
now, now,
|
|
),
|
|
)
|
|
db.conn.execute(
|
|
'''INSERT INTO docker_repository_query_observations(
|
|
page_id, repository_queue_id, source, query,
|
|
search_rank, observed_at
|
|
) VALUES (?, ?, 'dockerhub', ?, ?, ?)''',
|
|
(page['id'], queue['id'], query, rank, now),
|
|
)
|
|
db.conn.commit()
|
|
|
|
manifest, manifest_sha256 = depth.generate_docker_depth_cohort_manifest(
|
|
db, experiment, policy_sha256,
|
|
)
|
|
self.assertEqual(db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM docker_depth_experiments'
|
|
).fetchone()['count'], 0)
|
|
stale_queue_id = manifest['plan']['queries'][0]['repositories'][0][
|
|
'repository_queue_id'
|
|
]
|
|
db.conn.execute(
|
|
"UPDATE target_queue SET status = 'cold' WHERE id = ?",
|
|
(stale_queue_id,),
|
|
)
|
|
db.conn.commit()
|
|
with self.assertRaisesRegex(
|
|
RuntimeError, 'cohort selection drifted after review'):
|
|
depth.apply_docker_depth_cohort_manifest(
|
|
db, experiment, policy_sha256, manifest, manifest_sha256,
|
|
)
|
|
self.assertEqual(db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM docker_depth_experiments'
|
|
).fetchone()['count'], 0)
|
|
db.conn.execute(
|
|
"UPDATE target_queue SET status = 'deferred' WHERE id = ?",
|
|
(stale_queue_id,),
|
|
)
|
|
db.conn.commit()
|
|
|
|
applied = depth.apply_docker_depth_cohort_manifest(
|
|
db, experiment, policy_sha256, manifest, manifest_sha256,
|
|
)
|
|
replayed = depth.apply_docker_depth_cohort_manifest(
|
|
db, experiment, policy_sha256, manifest, manifest_sha256,
|
|
)
|
|
self.assertTrue(applied['planned'])
|
|
self.assertFalse(replayed['planned'])
|
|
self.assertEqual(applied['plan_sha256'], replayed['plan_sha256'])
|
|
counts = db.conn.execute(
|
|
'''SELECT
|
|
(SELECT COUNT(*) FROM docker_depth_experiment_queries) AS queries,
|
|
(SELECT COUNT(*) FROM docker_depth_experiment_repositories) AS repositories'''
|
|
).fetchone()
|
|
self.assertEqual((counts['queries'], counts['repositories']), (61, 599))
|
|
selected_counts = db.conn.execute(
|
|
'''SELECT query_ordinal, required_repository_count,
|
|
selected_repository_count
|
|
FROM docker_depth_experiment_queries
|
|
WHERE query_ordinal IN (0, 1)
|
|
ORDER BY query_ordinal'''
|
|
).fetchall()
|
|
self.assertEqual(
|
|
[
|
|
(
|
|
row['query_ordinal'], row['required_repository_count'],
|
|
row['selected_repository_count'],
|
|
)
|
|
for row in selected_counts
|
|
],
|
|
[(0, 10, 9), (1, 10, 0)],
|
|
)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_depth_resolver_claim_and_shared_completion_are_atomic(self):
|
|
setup_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(setup_db, initialize_base=True)
|
|
setup_db.record_final_cutover({'test': self.id()})
|
|
queries = tuple(f'pg-resolver-query-{index:02d}' for index in range(61))
|
|
config = {
|
|
'global': {
|
|
'database_url': self.dsn,
|
|
'sync_file_queues': False,
|
|
},
|
|
'sources': {'dockerhub': {
|
|
'mode': 'search',
|
|
'require_digest': True,
|
|
'queries': list(queries),
|
|
'pages': 30,
|
|
'per_page': 100,
|
|
'docker_platform_candidate_tags': 20,
|
|
'docker_images_per_repository': 3,
|
|
'docker_depth_experiment': {
|
|
'experiment_key': 'pg-resolver-test-v1',
|
|
'enabled': True,
|
|
'queries': list(queries),
|
|
'repositories_per_query': 10,
|
|
'shallow_images_per_repository': 1,
|
|
'deep_repositories_per_query': 1,
|
|
'deep_images_per_repository': 10,
|
|
'target_limit': 1200,
|
|
'selector_version': depth.DOCKER_DEPTH_SELECTOR_VERSION,
|
|
},
|
|
}},
|
|
}
|
|
experiment_config = depth.validate_docker_depth_config(config).experiment
|
|
policy_sha256 = 'b' * 64
|
|
authority = depth.docker_depth_resolver_authority(
|
|
experiment_config, policy_sha256,
|
|
)
|
|
now = scanner_db.utc_now_iso()
|
|
experiment = setup_db.conn.execute(
|
|
'''INSERT INTO docker_depth_experiments(
|
|
experiment_key, source, state, config_sha256,
|
|
ordered_queries_sha256, selector_version, selector_sha256,
|
|
provenance_policy_sha256, query_count, repositories_per_query,
|
|
images_per_repository, target_limit, plan_sha256,
|
|
hold_manifest_sha256, created_at, updated_at
|
|
) VALUES (?, 'dockerhub', 'resolving', ?, ?, ?, ?, ?, 61, 10, 10,
|
|
1200, ?, ?, ?, ?) RETURNING id''',
|
|
(
|
|
experiment_config.experiment_key, experiment_config.config_hash,
|
|
experiment_config.ordered_query_hash,
|
|
experiment_config.selector_version,
|
|
experiment_config.selector_hash, policy_sha256,
|
|
'c' * 64, 'd' * 64, now, now,
|
|
),
|
|
).fetchone()
|
|
discovery_pass = setup_db.conn.execute(
|
|
'''INSERT INTO docker_discovery_passes(
|
|
experiment_id, pass_token, source, pass_kind, policy_sha256,
|
|
ordered_queries_sha256, expected_query_count,
|
|
completed_query_count, state, started_at, completed_at,
|
|
created_at, updated_at
|
|
) VALUES (?, 'pg-resolver-pass-token', 'dockerhub', 'deep', ?, ?,
|
|
61, 61, 'complete', ?, ?, ?, ?) RETURNING id''',
|
|
(
|
|
experiment['id'], policy_sha256,
|
|
experiment_config.ordered_query_hash, now, now, now, now,
|
|
),
|
|
).fetchone()
|
|
queue_by_repository = {}
|
|
for query_ordinal, query in enumerate(queries):
|
|
setup_db.conn.execute(
|
|
'''INSERT INTO docker_depth_experiment_queries(
|
|
experiment_id, source, query_ordinal, query, query_sha256,
|
|
required_repository_count, selected_repository_count, created_at
|
|
) VALUES (?, 'dockerhub', ?, ?, ?, 10, 10, ?)''',
|
|
(
|
|
experiment['id'], query_ordinal, query,
|
|
depth._canonical_sha256(query), now,
|
|
),
|
|
)
|
|
page = setup_db.conn.execute(
|
|
'''INSERT INTO docker_discovery_pages(
|
|
pass_id, query, query_ordinal, page_number, result_count,
|
|
admitted_count, query_complete, admission_kind, page_sha256,
|
|
observed_at, created_at
|
|
) VALUES (?, ?, ?, 1, 10, 10, 1, 'main', ?, ?, ?)
|
|
RETURNING id''',
|
|
(
|
|
discovery_pass['id'], query, query_ordinal,
|
|
f'{query_ordinal + 1:064x}', now, now,
|
|
),
|
|
).fetchone()
|
|
for repository_rank in range(1, 11):
|
|
repository = (
|
|
'owner/pg-shared'
|
|
if repository_rank == 1 and query_ordinal in (0, 1)
|
|
else f'owner/pg-q{query_ordinal:02d}-r{repository_rank:02d}'
|
|
)
|
|
queue_id = queue_by_repository.get(repository)
|
|
if queue_id is None:
|
|
queue_id = setup_db.conn.execute(
|
|
'''INSERT INTO target_queue(
|
|
source, platform, query, target, normalized_target,
|
|
status, resolver_state, created_at, updated_at
|
|
) VALUES ('dockerhub', 'docker', ?, ?, ?, 'deferred',
|
|
'pending', ?, ?) RETURNING id''',
|
|
(query, repository, repository, now, now),
|
|
).fetchone()['id']
|
|
queue_by_repository[repository] = queue_id
|
|
setup_db.conn.execute(
|
|
'''INSERT INTO docker_repository_query_provenance(
|
|
source, query, repository_queue_id, provenance_kind,
|
|
first_observed_at, last_observed_at, first_search_rank,
|
|
best_search_rank, last_search_rank, first_page_id,
|
|
last_page_id, first_policy_sha256, last_policy_sha256,
|
|
observation_count, fresh_observation_count,
|
|
fresh_complete_observation_count, fresh_coverage_eligible,
|
|
created_at, updated_at
|
|
) VALUES ('dockerhub', ?, ?, 'fresh_page', ?, ?, ?, ?, ?, ?, ?, ?, ?,
|
|
1, 1, 1, 1, ?, ?)''',
|
|
(
|
|
query, queue_id, now, now, repository_rank,
|
|
repository_rank, repository_rank, page['id'], page['id'],
|
|
policy_sha256, policy_sha256, now, now,
|
|
),
|
|
)
|
|
setup_db.conn.execute(
|
|
'''INSERT INTO docker_repository_query_observations(
|
|
page_id, repository_queue_id, source, query,
|
|
search_rank, observed_at
|
|
) VALUES (?, ?, 'dockerhub', ?, ?, ?)''',
|
|
(page['id'], queue_id, query, repository_rank, now),
|
|
)
|
|
setup_db.conn.execute(
|
|
'''INSERT INTO docker_depth_experiment_repositories(
|
|
experiment_id, query_ordinal, source, query,
|
|
repository_queue_id, eligibility_page_id,
|
|
repository_rank, planned_is_deep_probe, is_deep_probe,
|
|
work_state, created_at, updated_at
|
|
) VALUES (?, ?, 'dockerhub', ?, ?, ?, ?, ?, ?, 'pending', ?, ?)''',
|
|
(
|
|
experiment['id'], query_ordinal, query, queue_id,
|
|
page['id'], repository_rank, int(repository_rank == 1),
|
|
int(repository_rank == 1), now, now,
|
|
),
|
|
)
|
|
stored_experiment = setup_db.conn.execute(
|
|
'SELECT * FROM docker_depth_experiments WHERE id = ?',
|
|
(experiment['id'],),
|
|
).fetchone()
|
|
plan_sha256 = depth.canonical_docker_depth_plan_hash(
|
|
depth._stored_cohort_plan(setup_db.conn, stored_experiment, authority)
|
|
)
|
|
setup_db.conn.execute(
|
|
'UPDATE docker_depth_experiments SET plan_sha256 = ? WHERE id = ?',
|
|
(plan_sha256, experiment['id']),
|
|
)
|
|
setup_db.conn.commit()
|
|
|
|
barrier = threading.Barrier(2)
|
|
claims = []
|
|
claim_errors = []
|
|
|
|
def claim():
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
barrier.wait(timeout=10)
|
|
rows = db.claim_docker_depth_experiment_resolutions(
|
|
'dockerhub', 1, 'pg-resolver-owner', authority=authority,
|
|
final_cutover=True,
|
|
)
|
|
claims.extend(rows)
|
|
except Exception as exc:
|
|
claim_errors.append(exc)
|
|
finally:
|
|
db.close()
|
|
|
|
threads = [threading.Thread(target=claim) for _ in range(2)]
|
|
for thread in threads:
|
|
thread.start()
|
|
for thread in threads:
|
|
thread.join(timeout=15)
|
|
self.assertFalse(claim_errors)
|
|
self.assertEqual(
|
|
sorted((row['repository_rank'], row['query_ordinal']) for row in claims),
|
|
[(1, 0), (1, 1)],
|
|
)
|
|
renewed = setup_db.renew_docker_depth_experiment_resolution(
|
|
'dockerhub', claims[0]['id'], claims[0]['resolver_generation'],
|
|
claims[0]['resolver_token'], resolver_owner=claims[0]['resolver_owner'],
|
|
lease_seconds=600, authority=authority, final_cutover=True,
|
|
)
|
|
stale_renewal = setup_db.renew_docker_depth_experiment_resolution(
|
|
'dockerhub', claims[0]['id'], claims[0]['resolver_generation'],
|
|
claims[0]['resolver_token'] + '-stale',
|
|
resolver_owner=claims[0]['resolver_owner'], lease_seconds=600,
|
|
authority=authority, final_cutover=True,
|
|
)
|
|
self.assertTrue(renewed['renewed'])
|
|
self.assertEqual(
|
|
stale_renewal, {'status': 'stale', 'renewed': False},
|
|
)
|
|
|
|
layer_digest = 'sha256:' + ('1' * 64)
|
|
manifest_digest = 'sha256:' + ('2' * 64)
|
|
candidate = {
|
|
'target': f'owner/pg-shared@{manifest_digest}',
|
|
'repository': 'owner/pg-shared',
|
|
'manifest_digest': manifest_digest,
|
|
'manifest_media_type': 'application/vnd.oci.image.manifest.v1+json',
|
|
'manifest_size_bytes': 4096,
|
|
'config_digest': 'sha256:' + ('3' * 64),
|
|
'layers': (layer_digest, 'sha256:' + ('4' * 64), layer_digest),
|
|
'layer_descriptors': (
|
|
{'digest': layer_digest, 'media_type': 'application/vnd.oci.image.layer.v1.tar+gzip', 'size': 10},
|
|
{'digest': 'sha256:' + ('4' * 64), 'media_type': 'application/vnd.oci.image.layer.v1.tar+gzip', 'size': 20},
|
|
{'digest': layer_digest, 'media_type': 'application/vnd.oci.image.layer.v1.tar+gzip', 'size': 10},
|
|
),
|
|
'updated_at': 1,
|
|
'source_index': 0,
|
|
}
|
|
selected = scanner.select_docker_layer_graphs([candidate], 1)
|
|
selected = tuple(
|
|
scanner._docker_depth_selection_evidence(record, 1)
|
|
for record in selected
|
|
)
|
|
outcome = scanner.DockerTagResolutionOutcome(
|
|
tags=tuple(record['target'] for record in selected),
|
|
status='ok', remote_attempted=True,
|
|
selection_records=selected,
|
|
selector_version=depth.DOCKER_DEPTH_SELECTOR_VERSION,
|
|
selector_hash=depth.canonical_selector_hash(
|
|
depth.DOCKER_DEPTH_SELECTOR_VERSION
|
|
),
|
|
candidate_distinct_graph_count=1,
|
|
fresh_graph_evidence=True, cache_bypassed=True,
|
|
)
|
|
completion_barrier = threading.Barrier(3)
|
|
completions = []
|
|
page_results = []
|
|
completion_errors = []
|
|
|
|
def complete(claim_row):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
completion_barrier.wait(timeout=10)
|
|
completions.append(db.finish_docker_depth_experiment_resolution(
|
|
'dockerhub', claim_row['id'], claim_row['resolver_generation'],
|
|
claim_row['resolver_token'], outcome, complete=True,
|
|
resolver_owner=claim_row['resolver_owner'], authority=authority,
|
|
final_cutover=True,
|
|
))
|
|
except Exception as exc:
|
|
completion_errors.append(exc)
|
|
finally:
|
|
db.close()
|
|
|
|
def admit_page():
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
completion_barrier.wait(timeout=10)
|
|
page_results.append(db.persist_dockerhub_discovery_page(
|
|
'dockerhub', queries[0], ['owner/pg-concurrent-page'],
|
|
observation={
|
|
'cycle_id': None, 'query_ordinal': 0,
|
|
'query_count': 61, 'page_number': 2,
|
|
'page_limit': 30, 'per_page': 100,
|
|
'total_count': 101, 'policy_sha256': policy_sha256,
|
|
'pass_kind': 'deep',
|
|
'collection_generation': depth.DOCKER_DEPTH_COLLECTION_GENERATION,
|
|
'ordered_query_hash': experiment_config.ordered_query_hash,
|
|
'query_complete': True,
|
|
},
|
|
experiment_authority=authority, final_cutover=True,
|
|
))
|
|
except Exception as exc:
|
|
completion_errors.append(exc)
|
|
finally:
|
|
db.close()
|
|
|
|
threads = [
|
|
*(threading.Thread(target=complete, args=(row,)) for row in claims),
|
|
threading.Thread(target=admit_page),
|
|
]
|
|
for thread in threads:
|
|
thread.start()
|
|
for thread in threads:
|
|
thread.join(timeout=15)
|
|
self.assertTrue(all(not thread.is_alive() for thread in threads))
|
|
self.assertFalse(completion_errors)
|
|
self.assertEqual([result['status'] for result in completions], ['resolved', 'resolved'])
|
|
self.assertEqual(page_results[0]['dynamic_hold_count'], 1)
|
|
counts = setup_db.conn.execute(
|
|
'''SELECT
|
|
(SELECT target_count FROM docker_depth_experiments WHERE id = ?) AS targets,
|
|
(SELECT selection_count FROM docker_depth_experiments WHERE id = ?) AS selections,
|
|
(SELECT COUNT(*) FROM docker_image_manifests) AS manifests,
|
|
(SELECT COUNT(*) FROM docker_manifest_layers) AS layers,
|
|
(SELECT COUNT(*) FROM docker_depth_experiment_targets) AS physical''',
|
|
(experiment['id'], experiment['id']),
|
|
).fetchone()
|
|
setup_db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
counts['targets'], counts['selections'], counts['manifests'],
|
|
counts['layers'], counts['physical'],
|
|
),
|
|
(1, 2, 1, 3, 1),
|
|
)
|
|
self.assertFalse(setup_db.has_claimable_targets_v2(
|
|
'dockerhub', 'docker', max_attempts=3,
|
|
))
|
|
positions = setup_db.conn.execute(
|
|
'''SELECT layer_digest, position_from_base, position_from_top
|
|
FROM docker_manifest_layers ORDER BY position_from_base'''
|
|
).fetchall()
|
|
setup_db.conn.commit()
|
|
self.assertEqual(
|
|
[(row['layer_digest'], row['position_from_base'], row['position_from_top'])
|
|
for row in positions],
|
|
[(layer_digest, 1, 3), ('sha256:' + ('4' * 64), 2, 2), (layer_digest, 3, 1)],
|
|
)
|
|
|
|
conflict_claim = setup_db.claim_docker_depth_experiment_resolutions(
|
|
'dockerhub', 1, 'pg-conflict-owner', authority=authority,
|
|
final_cutover=True,
|
|
)[0]
|
|
backup_repository = f'owner/pg-backup-{conflict_claim["query_ordinal"]:02d}'
|
|
backup_queue = setup_db.conn.execute(
|
|
'''INSERT INTO target_queue(
|
|
source, platform, query, target, normalized_target, status,
|
|
resolver_state, created_at, updated_at
|
|
) VALUES ('dockerhub', 'docker', ?, ?, ?, 'deferred', 'pending',
|
|
?, ?) RETURNING id''',
|
|
(
|
|
conflict_claim['query'], backup_repository, backup_repository,
|
|
now, now,
|
|
),
|
|
).fetchone()
|
|
backup_page_id = setup_db.conn.execute(
|
|
'''SELECT eligibility_page_id
|
|
FROM docker_depth_experiment_repositories WHERE id = ?''',
|
|
(conflict_claim['id'],),
|
|
).fetchone()['eligibility_page_id']
|
|
setup_db.conn.execute(
|
|
'''INSERT INTO docker_repository_query_provenance(
|
|
source, query, repository_queue_id, provenance_kind,
|
|
first_observed_at, last_observed_at, first_search_rank,
|
|
best_search_rank, last_search_rank, first_page_id,
|
|
last_page_id, first_policy_sha256, last_policy_sha256,
|
|
observation_count, fresh_observation_count,
|
|
fresh_complete_observation_count, fresh_coverage_eligible,
|
|
created_at, updated_at
|
|
) VALUES ('dockerhub', ?, ?, 'fresh_page', ?, ?, 11, 11, 11,
|
|
?, ?, ?, ?, 1, 1, 1, 1, ?, ?)''',
|
|
(
|
|
conflict_claim['query'], backup_queue['id'], now, now,
|
|
backup_page_id, backup_page_id, policy_sha256, policy_sha256,
|
|
now, now,
|
|
),
|
|
)
|
|
setup_db.conn.execute(
|
|
'''INSERT INTO docker_repository_query_observations(
|
|
page_id, repository_queue_id, source, query,
|
|
search_rank, observed_at
|
|
) VALUES (?, ?, 'dockerhub', ?, 11, ?)''',
|
|
(
|
|
backup_page_id, backup_queue['id'], conflict_claim['query'], now,
|
|
),
|
|
)
|
|
conflict_manifest_digest = 'sha256:' + ('5' * 64)
|
|
conflict_target = f'{conflict_claim["target"]}@{conflict_manifest_digest}'
|
|
setup_db.conn.execute(
|
|
'''INSERT INTO target_queue(
|
|
source, platform, query, target, normalized_target, status,
|
|
created_at, updated_at, completed_at
|
|
) VALUES ('dockerhub', 'docker', ?, ?, ?, 'done', ?, ?, ?)''',
|
|
(
|
|
conflict_claim['query'], conflict_target, conflict_target,
|
|
now, now, now,
|
|
),
|
|
)
|
|
setup_db.conn.commit()
|
|
conflict_candidate = {
|
|
'target': conflict_target,
|
|
'repository': conflict_claim['target'],
|
|
'manifest_digest': conflict_manifest_digest,
|
|
'manifest_media_type': 'application/vnd.oci.image.manifest.v1+json',
|
|
'manifest_size_bytes': 2048,
|
|
'config_digest': 'sha256:' + ('6' * 64),
|
|
'layers': ('sha256:' + ('7' * 64),),
|
|
'layer_descriptors': ({
|
|
'digest': 'sha256:' + ('7' * 64),
|
|
'media_type': 'application/vnd.oci.image.layer.v1.tar+gzip',
|
|
'size': 30,
|
|
},),
|
|
'updated_at': 1,
|
|
'source_index': 0,
|
|
}
|
|
conflict_selected = tuple(
|
|
scanner._docker_depth_selection_evidence(record, 1)
|
|
for record in scanner.select_docker_layer_graphs(
|
|
[conflict_candidate], 1,
|
|
)
|
|
)
|
|
conflict_outcome = scanner.DockerTagResolutionOutcome(
|
|
tags=tuple(record['target'] for record in conflict_selected),
|
|
status='ok', remote_attempted=True,
|
|
selection_records=conflict_selected,
|
|
selector_version=depth.DOCKER_DEPTH_SELECTOR_VERSION,
|
|
selector_hash=depth.canonical_selector_hash(
|
|
depth.DOCKER_DEPTH_SELECTOR_VERSION
|
|
),
|
|
candidate_distinct_graph_count=1,
|
|
fresh_graph_evidence=True, cache_bypassed=True,
|
|
)
|
|
conflict = setup_db.finish_docker_depth_experiment_resolution(
|
|
'dockerhub', conflict_claim['id'],
|
|
conflict_claim['resolver_generation'],
|
|
conflict_claim['resolver_token'], conflict_outcome, complete=True,
|
|
resolver_owner=conflict_claim['resolver_owner'], authority=authority,
|
|
final_cutover=True,
|
|
)
|
|
self.assertEqual(conflict['status'], 'replaced')
|
|
rollback_counts = setup_db.conn.execute(
|
|
'''SELECT
|
|
(SELECT target_count FROM docker_depth_experiments WHERE id = ?) AS targets,
|
|
(SELECT selection_count FROM docker_depth_experiments WHERE id = ?) AS selections,
|
|
(SELECT COUNT(*) FROM docker_image_manifests) AS manifests,
|
|
(SELECT COUNT(*) FROM docker_depth_experiment_targets) AS physical''',
|
|
(experiment['id'], experiment['id']),
|
|
).fetchone()
|
|
conflict_member = setup_db.conn.execute(
|
|
'''SELECT work_state, resolver_due_at, resolver_token,
|
|
replacement_repository_queue_id
|
|
FROM docker_depth_experiment_repositories WHERE id = ?''',
|
|
(conflict_claim['id'],),
|
|
).fetchone()
|
|
setup_db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
rollback_counts['targets'], rollback_counts['selections'],
|
|
rollback_counts['manifests'], rollback_counts['physical'],
|
|
),
|
|
(1, 2, 1, 1),
|
|
)
|
|
self.assertEqual(conflict_member['work_state'], 'pending')
|
|
self.assertIsNone(conflict_member['resolver_due_at'])
|
|
self.assertIsNone(conflict_member['resolver_token'])
|
|
self.assertEqual(
|
|
conflict_member['replacement_repository_queue_id'], backup_queue['id'],
|
|
)
|
|
skip_rows = setup_db.conn.execute(
|
|
'''SELECT candidate_kind, reason_code,
|
|
candidate_identity_sha256, evidence_sha256
|
|
FROM docker_depth_experiment_candidate_skips
|
|
WHERE experiment_repository_id = ? ORDER BY id''',
|
|
(conflict_claim['id'],),
|
|
).fetchall()
|
|
self.assertEqual(
|
|
[(row['candidate_kind'], row['reason_code']) for row in skip_rows],
|
|
[('image', 'immutable_target_terminal'),
|
|
('repository', 'no_eligible_physical_target')],
|
|
)
|
|
self.assertTrue(all(
|
|
len(row['candidate_identity_sha256']) == 64
|
|
and len(row['evidence_sha256']) == 64
|
|
for row in skip_rows
|
|
))
|
|
|
|
scarcity_claim = setup_db.claim_docker_depth_experiment_resolutions(
|
|
'dockerhub', 1, 'pg-scarcity-owner', authority=authority,
|
|
final_cutover=True,
|
|
)[0]
|
|
scarcity_manifest_digest = 'sha256:' + ('b' * 64)
|
|
scarcity_layer_digest = 'sha256:' + ('c' * 64)
|
|
scarcity_target = (
|
|
f'{scarcity_claim["target"]}@{scarcity_manifest_digest}'
|
|
)
|
|
setup_db.conn.execute(
|
|
'''INSERT INTO target_queue(
|
|
source, platform, query, target, normalized_target, status,
|
|
created_at, updated_at, completed_at
|
|
) VALUES ('dockerhub', 'docker', ?, ?, ?, 'done', ?, ?, ?)''',
|
|
(
|
|
scarcity_claim['query'], scarcity_target, scarcity_target,
|
|
now, now, now,
|
|
),
|
|
)
|
|
scarcity_candidate = {
|
|
'target': scarcity_target,
|
|
'repository': scarcity_claim['target'],
|
|
'manifest_digest': scarcity_manifest_digest,
|
|
'manifest_media_type': 'application/vnd.oci.image.manifest.v1+json',
|
|
'manifest_size_bytes': 1024,
|
|
'config_digest': 'sha256:' + ('d' * 64),
|
|
'layers': (scarcity_layer_digest,),
|
|
'layer_descriptors': ({
|
|
'digest': scarcity_layer_digest,
|
|
'media_type': 'application/vnd.oci.image.layer.v1.tar+gzip',
|
|
'size': 10,
|
|
},),
|
|
'updated_at': 1,
|
|
'source_index': 0,
|
|
}
|
|
scarcity_selected = tuple(
|
|
scanner._docker_depth_selection_evidence(record, 1)
|
|
for record in scanner.select_docker_layer_graphs(
|
|
[scarcity_candidate], 1,
|
|
)
|
|
)
|
|
scarcity_outcome = scanner.DockerTagResolutionOutcome(
|
|
tags=tuple(record['target'] for record in scarcity_selected),
|
|
status='ok', remote_attempted=True,
|
|
selection_records=scarcity_selected,
|
|
selector_version=depth.DOCKER_DEPTH_SELECTOR_VERSION,
|
|
selector_hash=depth.canonical_selector_hash(
|
|
depth.DOCKER_DEPTH_SELECTOR_VERSION
|
|
),
|
|
candidate_distinct_graph_count=1,
|
|
fresh_graph_evidence=True, cache_bypassed=True,
|
|
)
|
|
setup_db.conn.commit()
|
|
scarcity = setup_db.finish_docker_depth_experiment_resolution(
|
|
'dockerhub', scarcity_claim['id'],
|
|
scarcity_claim['resolver_generation'],
|
|
scarcity_claim['resolver_token'], scarcity_outcome, complete=True,
|
|
resolver_owner=scarcity_claim['resolver_owner'], authority=authority,
|
|
final_cutover=True,
|
|
)
|
|
scarcity_member = setup_db.conn.execute(
|
|
'''SELECT work_state, selected_image_count, last_error_code
|
|
FROM docker_depth_experiment_repositories WHERE id = ?''',
|
|
(scarcity_claim['id'],),
|
|
).fetchone()
|
|
scarcity_counts = setup_db.conn.execute(
|
|
'''SELECT target_count, selection_count
|
|
FROM docker_depth_experiments WHERE id = ?''',
|
|
(experiment['id'],),
|
|
).fetchone()
|
|
setup_db.conn.commit()
|
|
self.assertEqual(
|
|
(scarcity['status'], scarcity['reason']),
|
|
('skipped', depth.DOCKER_DEPTH_REPOSITORY_SKIP_REASON),
|
|
)
|
|
self.assertEqual(
|
|
(
|
|
scarcity_member['work_state'],
|
|
scarcity_member['selected_image_count'],
|
|
scarcity_member['last_error_code'],
|
|
),
|
|
('skipped', 0, depth.DOCKER_DEPTH_REPOSITORY_SKIP_REASON),
|
|
)
|
|
self.assertEqual(
|
|
(scarcity_counts['target_count'], scarcity_counts['selection_count']),
|
|
(1, 2),
|
|
)
|
|
|
|
deep_manifest_digest = 'sha256:' + ('8' * 64)
|
|
deep_layer_digest = 'sha256:' + ('9' * 64)
|
|
deep_candidate = {
|
|
'target': f'owner/pg-shared@{deep_manifest_digest}',
|
|
'repository': 'owner/pg-shared',
|
|
'manifest_digest': deep_manifest_digest,
|
|
'manifest_media_type': 'application/vnd.oci.image.manifest.v1+json',
|
|
'manifest_size_bytes': 2048,
|
|
'config_digest': 'sha256:' + ('a' * 64),
|
|
'layers': (deep_layer_digest,),
|
|
'layer_descriptors': ({
|
|
'digest': deep_layer_digest,
|
|
'media_type': 'application/vnd.oci.image.layer.v1.tar+gzip',
|
|
'size': 30,
|
|
},),
|
|
'updated_at': 0,
|
|
'source_index': 1,
|
|
}
|
|
deep_records = tuple(
|
|
scanner._docker_depth_selection_evidence(record, 2)
|
|
for record in scanner.select_docker_layer_graphs(
|
|
[candidate, deep_candidate], 2,
|
|
)
|
|
)
|
|
self.assertEqual(
|
|
[record['target'] for record in deep_records],
|
|
[candidate['target'], deep_candidate['target']],
|
|
)
|
|
setup_db.conn.execute(
|
|
'''UPDATE docker_depth_experiment_selections
|
|
SET selection_reason = ?, selection_evidence_sha256 = ?,
|
|
graph_sha256 = ?
|
|
WHERE experiment_repository_id = ? AND image_rank = 1''',
|
|
(
|
|
deep_records[0]['selection_reason'],
|
|
deep_records[0]['selection_evidence_sha256'],
|
|
deep_records[0]['graph_sha256'], claims[0]['id'],
|
|
),
|
|
)
|
|
deep_queue = setup_db.conn.execute(
|
|
'''INSERT INTO target_queue(
|
|
source, platform, query, target, normalized_target,
|
|
status, created_at, updated_at
|
|
) VALUES ('dockerhub', 'docker', ?, ?, ?, 'pending', ?, ?)
|
|
RETURNING id''',
|
|
(
|
|
claims[0]['query'], deep_records[1]['target'],
|
|
deep_records[1]['target'], now, now,
|
|
),
|
|
).fetchone()
|
|
deep_manifest = setup_db.conn.execute(
|
|
'''INSERT INTO docker_image_manifests(
|
|
target_queue_id, source, repository, manifest_digest,
|
|
manifest_media_type, config_digest, graph_sha256,
|
|
manifest_size_bytes, layer_count, resolved_at, created_at
|
|
) VALUES (?, 'dockerhub', ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
RETURNING id''',
|
|
(
|
|
deep_queue['id'], deep_records[1]['repository'],
|
|
deep_records[1]['manifest_digest'],
|
|
deep_records[1]['manifest_media_type'],
|
|
deep_records[1]['config_digest'], deep_records[1]['graph_sha256'],
|
|
deep_records[1]['manifest_size_bytes'], deep_records[1]['layer_count'],
|
|
now, now,
|
|
),
|
|
).fetchone()
|
|
for layer in deep_records[1]['layer_metadata']:
|
|
setup_db.conn.execute(
|
|
'''INSERT INTO docker_manifest_layers(
|
|
manifest_id, position_from_base, position_from_top,
|
|
layer_digest, media_type, layer_size_bytes,
|
|
descriptor_sha256, created_at
|
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)''',
|
|
(
|
|
deep_manifest['id'], layer['position_from_base'],
|
|
layer['position_from_top'], layer['digest'], layer['media_type'],
|
|
layer['size_bytes'], layer['descriptor_sha256'], now,
|
|
),
|
|
)
|
|
deep_target = setup_db.conn.execute(
|
|
'''INSERT INTO docker_depth_experiment_targets(
|
|
experiment_id, target_queue_id, manifest_id, counter_ordinal,
|
|
state, dispatch_wave, dispatch_order, created_at, updated_at
|
|
) VALUES (?, ?, ?, 2, 'pending', 2, 1, ?, ?) RETURNING id''',
|
|
(experiment['id'], deep_queue['id'], deep_manifest['id'], now, now),
|
|
).fetchone()
|
|
setup_db.conn.execute(
|
|
'''INSERT INTO docker_depth_experiment_selections(
|
|
experiment_id, query_ordinal, experiment_repository_id,
|
|
experiment_target_id, image_rank, selection_reason,
|
|
selection_evidence_sha256, graph_sha256,
|
|
selected_at, created_at
|
|
) VALUES (?, ?, ?, ?, 2, ?, ?, ?, ?, ?)''',
|
|
(
|
|
experiment['id'], claims[0]['query_ordinal'], claims[0]['id'],
|
|
deep_target['id'], deep_records[1]['selection_reason'],
|
|
deep_records[1]['selection_evidence_sha256'],
|
|
deep_records[1]['graph_sha256'], now, now,
|
|
),
|
|
)
|
|
stored_experiment = setup_db.conn.execute(
|
|
'SELECT * FROM docker_depth_experiments WHERE id = ?',
|
|
(experiment['id'],),
|
|
).fetchone()
|
|
pending_members = setup_db.conn.execute(
|
|
'''SELECT * FROM docker_depth_experiment_repositories
|
|
WHERE experiment_id = ? AND work_state = 'pending'
|
|
ORDER BY id''',
|
|
(experiment['id'],),
|
|
).fetchall()
|
|
for member in pending_members:
|
|
setup_db.conn.execute(
|
|
'''UPDATE docker_depth_experiment_repositories
|
|
SET work_state = 'skipped', is_deep_probe = 0,
|
|
selected_image_count = 0, last_error_code = ?,
|
|
resolver_due_at = NULL, resolved_at = ?, updated_at = ?
|
|
WHERE id = ?''',
|
|
(
|
|
depth.DOCKER_DEPTH_REPOSITORY_SKIP_REASON,
|
|
now, now, member['id'],
|
|
),
|
|
)
|
|
repository_queue_id = int(
|
|
member['replacement_repository_queue_id']
|
|
or member['repository_queue_id']
|
|
)
|
|
setup_db._record_docker_depth_candidate_skip_locked(
|
|
stored_experiment, member, repository_queue_id,
|
|
'repository', int(member['replacement_count']) + 1,
|
|
{'repository_queue_id': repository_queue_id},
|
|
depth.DOCKER_DEPTH_REPOSITORY_SKIP_REASON, now,
|
|
)
|
|
setup_db.conn.execute(
|
|
'''UPDATE docker_depth_experiment_repositories
|
|
SET is_deep_probe = 0
|
|
WHERE experiment_id = ? AND work_state = 'skipped' ''',
|
|
(experiment['id'],),
|
|
)
|
|
setup_db.conn.execute(
|
|
'''UPDATE docker_depth_experiment_repositories
|
|
SET is_deep_probe = 1, candidate_distinct_graph_count = 2,
|
|
selected_image_count = 2
|
|
WHERE id = ?''',
|
|
(claims[0]['id'],),
|
|
)
|
|
stored_experiment = setup_db.conn.execute(
|
|
'SELECT * FROM docker_depth_experiments WHERE id = ?',
|
|
(experiment['id'],),
|
|
).fetchone()
|
|
runtime_selection_sha256 = (
|
|
setup_db._docker_depth_runtime_selection_sha256_locked(
|
|
stored_experiment, authority,
|
|
)
|
|
)
|
|
setup_db.conn.execute(
|
|
'''UPDATE docker_depth_experiments
|
|
SET state = 'active', target_count = 2, selection_count = 3,
|
|
selection_sha256 = ?,
|
|
activated_at = ?, updated_at = ? WHERE id = ?''',
|
|
(runtime_selection_sha256, now, now, experiment['id']),
|
|
)
|
|
setup_db.conn.execute(
|
|
'''INSERT INTO pipeline_leases(
|
|
worker_name, generation, lease_token, supervisor_instance_id,
|
|
state, lease_expires_at, updated_at
|
|
) VALUES ('result_ingester', 1, 'pg-dispatch-ingester',
|
|
'pg-dispatch-supervisor', 'ready',
|
|
'2999-01-01T00:00:00+00:00', ?)
|
|
ON CONFLICT(worker_name) DO UPDATE SET
|
|
supervisor_instance_id = excluded.supervisor_instance_id,
|
|
state = excluded.state,
|
|
lease_expires_at = excluded.lease_expires_at,
|
|
updated_at = excluded.updated_at''',
|
|
(now,),
|
|
)
|
|
setup_db.conn.commit()
|
|
|
|
limits = {
|
|
'bundle_items': 10, 'bundle_bytes': 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 1024 * 1024,
|
|
'keycheck_items': 10, 'keycheck_bytes': 1024 * 1024,
|
|
}
|
|
|
|
def reserve(label, bundle_digit, event_digit):
|
|
return setup_db.reserve_and_claim_target(
|
|
'dockerhub', 'docker', current_process_identity(),
|
|
'pg-dispatch-supervisor', 4096, 2048, 1, 128,
|
|
capacity_limits=limits, reservation_token=label,
|
|
bundle_id=bundle_digit * 32, scan_event_id=event_digit * 32,
|
|
docker_depth_authority=authority, final_cutover=True,
|
|
)
|
|
|
|
import psycopg
|
|
setup_db.conn.execute(
|
|
'''CREATE FUNCTION fail_docker_depth_binding() RETURNS trigger
|
|
LANGUAGE plpgsql AS $$
|
|
BEGIN RAISE EXCEPTION 'synthetic binding rollback'; END $$'''
|
|
)
|
|
setup_db.conn.execute(
|
|
'''CREATE TRIGGER fail_docker_depth_binding
|
|
BEFORE INSERT ON docker_depth_experiment_scan_bindings
|
|
FOR EACH ROW EXECUTE FUNCTION fail_docker_depth_binding()'''
|
|
)
|
|
setup_db.conn.commit()
|
|
with self.assertRaises(psycopg.errors.RaiseException):
|
|
reserve('pg-binding-rollback', 'b', 'c')
|
|
rolled_back = setup_db.conn.execute(
|
|
'''SELECT target.state, target.reservation_count, queue.status,
|
|
queue.current_result_reservation_id
|
|
FROM docker_depth_experiment_targets target
|
|
JOIN target_queue queue ON queue.id = target.target_queue_id
|
|
WHERE target.dispatch_wave = 1'''
|
|
).fetchone()
|
|
setup_db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
rolled_back['state'], rolled_back['reservation_count'],
|
|
rolled_back['status'], rolled_back['current_result_reservation_id'],
|
|
),
|
|
('pending', 0, 'pending', None),
|
|
)
|
|
self.assertEqual(setup_db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM result_reservations'
|
|
).fetchone()['count'], 0)
|
|
setup_db.conn.commit()
|
|
setup_db.conn.execute(
|
|
'DROP TRIGGER fail_docker_depth_binding '
|
|
'ON docker_depth_experiment_scan_bindings'
|
|
)
|
|
setup_db.conn.execute('DROP FUNCTION fail_docker_depth_binding()')
|
|
setup_db.conn.commit()
|
|
|
|
blocker = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
blocker.conn.execute(
|
|
'''SELECT id FROM docker_depth_experiment_targets
|
|
WHERE experiment_id = ? AND dispatch_wave = 1 FOR UPDATE''',
|
|
(experiment['id'],),
|
|
).fetchone()
|
|
self.assertIsNone(reserve('pg-wave-barrier', 'd', 'e'))
|
|
self.assertEqual(setup_db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM docker_depth_experiment_scan_bindings'
|
|
).fetchone()['count'], 0)
|
|
setup_db.conn.commit()
|
|
finally:
|
|
blocker.conn.rollback()
|
|
blocker.close()
|
|
|
|
breadth = reserve('pg-breadth-dispatch', 'f', '1')
|
|
self.assertIsNone(reserve('pg-deep-barrier', '2', '3'))
|
|
staged = stage_result_bundle(
|
|
{
|
|
'scan_event_id': breadth['scan_event_id'],
|
|
'target': breadth['target'], 'scan_type': 'docker',
|
|
'timestamp': '2026-09-10T00:00:00+00:00',
|
|
'scan_started_at': '2026-09-10T00:00:00+00:00',
|
|
'duration_sec': 1.0, 'findings': [], 'errors': [],
|
|
},
|
|
breadth, str(self.bundle_root), {},
|
|
{'queue_status': 'done', 'queue_error': None, 'available_after': None},
|
|
candidate_max_items=10, candidate_max_bytes=1024 * 1024,
|
|
)
|
|
self.assertTrue(setup_db.mark_result_bundle_ready(
|
|
breadth['reservation_id'], {
|
|
'bundle_id': staged.bundle_id,
|
|
'scan_event_id': staged.scan_event_id,
|
|
'scan_event_hash': staged.scan_event_hash,
|
|
'relative_path': staged.relative_path,
|
|
'actual_bytes': staged.actual_bytes,
|
|
'frame_count': staged.frame_count,
|
|
'finding_count': staged.finding_count,
|
|
'error_count': staged.error_count,
|
|
'candidate_count': staged.candidate_count,
|
|
},
|
|
))
|
|
breadth_reservation = dict(setup_db.conn.execute(
|
|
'SELECT * FROM result_reservations WHERE id = ?',
|
|
(breadth['reservation_id'],),
|
|
).fetchone())
|
|
breadth_bundle = dict(setup_db.conn.execute(
|
|
'SELECT * FROM result_bundles WHERE reservation_id = ?',
|
|
(breadth['reservation_id'],),
|
|
).fetchone())
|
|
setup_db.conn.commit()
|
|
experiment_locked = threading.Event()
|
|
release_ingestion = threading.Event()
|
|
ingestion_results = []
|
|
validator_results = []
|
|
concurrency_errors = []
|
|
|
|
def ingest_while_locked():
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
db._lock_docker_depth_experiment_for_reservation(
|
|
breadth['reservation_id']
|
|
)
|
|
experiment_locked.set()
|
|
release_ingestion.wait(timeout=10)
|
|
path = self.bundle_root.joinpath(*staged.relative_path.split('/'))
|
|
ingestion_results.append(db.ingest_result_bundle(
|
|
ResultBundleReader(str(path)), breadth_reservation,
|
|
breadth_bundle,
|
|
))
|
|
except Exception as exc:
|
|
concurrency_errors.append(exc)
|
|
finally:
|
|
db.close()
|
|
|
|
def validate_after_ingestion():
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
validator_results.append(db.refresh_docker_depth_experiment_state(
|
|
authority, final_cutover=True,
|
|
))
|
|
except Exception as exc:
|
|
concurrency_errors.append(exc)
|
|
finally:
|
|
db.close()
|
|
|
|
ingest_thread = threading.Thread(target=ingest_while_locked)
|
|
ingest_thread.start()
|
|
self.assertTrue(experiment_locked.wait(timeout=10))
|
|
validator_thread = threading.Thread(target=validate_after_ingestion)
|
|
validator_thread.start()
|
|
time.sleep(0.2)
|
|
self.assertTrue(validator_thread.is_alive())
|
|
release_ingestion.set()
|
|
ingest_thread.join(timeout=15)
|
|
validator_thread.join(timeout=15)
|
|
self.assertFalse(ingest_thread.is_alive())
|
|
self.assertFalse(validator_thread.is_alive())
|
|
self.assertFalse(concurrency_errors)
|
|
self.assertTrue(ingestion_results[0]['ingested'])
|
|
self.assertEqual(validator_results[0]['status'], 'active')
|
|
deep = reserve('pg-deep-dispatch', '4', '5')
|
|
self.assertEqual(
|
|
[(breadth['dispatch_wave'], breadth['dispatch_order']),
|
|
(deep['dispatch_wave'], deep['dispatch_order'])],
|
|
[(1, 1), (2, 1)],
|
|
)
|
|
bound = setup_db.conn.execute(
|
|
'''SELECT target.id, COUNT(selection.id) AS attributions,
|
|
COUNT(DISTINCT binding.id) AS bindings,
|
|
MIN(reservation.queue_id) AS reservation_queue_id,
|
|
target.target_queue_id
|
|
FROM docker_depth_experiment_targets target
|
|
JOIN docker_depth_experiment_selections selection
|
|
ON selection.experiment_target_id = target.id
|
|
JOIN docker_depth_experiment_scan_bindings binding
|
|
ON binding.experiment_target_id = target.id
|
|
JOIN result_reservations reservation
|
|
ON reservation.id = binding.reservation_id
|
|
WHERE target.dispatch_wave = 1
|
|
GROUP BY target.id, target.target_queue_id'''
|
|
).fetchone()
|
|
setup_db.conn.commit()
|
|
self.assertEqual(
|
|
(bound['attributions'], bound['bindings'],
|
|
bound['reservation_queue_id'], bound['target_queue_id']),
|
|
(2, 1, bound['target_queue_id'], bound['target_queue_id']),
|
|
)
|
|
|
|
self.assertTrue(setup_db.refund_uncommitted_reservation(
|
|
deep['reservation_id'], current_process_identity(),
|
|
'exercise atomic saturation hold', partial_absence_confirmed=True,
|
|
))
|
|
saturated = setup_db.reserve_and_claim_target(
|
|
'dockerhub', 'docker', current_process_identity(),
|
|
'pg-dispatch-supervisor', 4096, 2048, 1, 128,
|
|
capacity_limits={
|
|
'bundle_items': 0, 'bundle_bytes': 0,
|
|
'projection_items': 0, 'projection_bytes': 0,
|
|
'keycheck_items': 0, 'keycheck_bytes': 0,
|
|
},
|
|
reservation_token='pg-atomic-saturation',
|
|
bundle_id='7' * 32, scan_event_id='8' * 32,
|
|
docker_depth_authority=authority, final_cutover=True,
|
|
)
|
|
self.assertIsNone(saturated)
|
|
final = setup_db.conn.execute(
|
|
'''SELECT experiment.state AS experiment_state,
|
|
experiment.hold_reason_code, intent.state AS intent_state,
|
|
intent.resolution_detail, intent.reservation_id
|
|
FROM docker_depth_experiments experiment
|
|
JOIN admission_intents intent
|
|
ON intent.reservation_token = 'pg-atomic-saturation'
|
|
WHERE experiment.id = ?''',
|
|
(experiment['id'],),
|
|
).fetchone()
|
|
setup_db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
final['experiment_state'], final['hold_reason_code'],
|
|
final['intent_state'], final['resolution_detail'],
|
|
final['reservation_id'],
|
|
),
|
|
('active', None, 'aborted', 'pipeline_capacity_closed', None),
|
|
)
|
|
finally:
|
|
setup_db.close()
|
|
|
|
def test_docker_depth_concurrent_capacity_reservation_stops_at_cap(self):
|
|
setup_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(setup_db, initialize_base=True)
|
|
now = scanner_db.utc_now_iso()
|
|
experiment = setup_db.conn.execute(
|
|
'''INSERT INTO docker_depth_experiments(
|
|
experiment_key, source, state, config_sha256,
|
|
ordered_queries_sha256, selector_version, selector_sha256,
|
|
provenance_policy_sha256, query_count, repositories_per_query,
|
|
images_per_repository, target_limit, created_at, updated_at
|
|
) VALUES ('pg-cap-test', 'dockerhub', 'resolving', ?, ?, 'selector-v1',
|
|
?, ?, 1, 1, 1, 1, ?, ?) RETURNING id''',
|
|
('a' * 64, 'b' * 64, 'c' * 64, 'd' * 64, now, now),
|
|
).fetchone()
|
|
identities = []
|
|
for index in range(2):
|
|
target = f'owner/cap@sha256:{index + 1:064x}'
|
|
queue = setup_db.conn.execute(
|
|
'''INSERT INTO target_queue(
|
|
source, platform, query, target, normalized_target,
|
|
status, created_at, updated_at
|
|
) VALUES ('dockerhub', 'docker', 'cap', ?, ?, 'pending', ?, ?)
|
|
RETURNING id''',
|
|
(target, target, now, now),
|
|
).fetchone()
|
|
manifest = setup_db.conn.execute(
|
|
'''INSERT INTO docker_image_manifests(
|
|
target_queue_id, source, repository, manifest_digest,
|
|
manifest_media_type, graph_sha256, layer_count,
|
|
resolved_at, created_at
|
|
) VALUES (?, 'dockerhub', 'owner/cap', ?,
|
|
'application/vnd.oci.image.manifest.v1+json', ?, 0, ?, ?)
|
|
RETURNING id''',
|
|
(queue['id'], f'sha256:{index + 1:064x}', f'{index + 1:064x}', now, now),
|
|
).fetchone()
|
|
identities.append((int(queue['id']), int(manifest['id'])))
|
|
setup_db.conn.commit()
|
|
barrier = threading.Barrier(2)
|
|
results = []
|
|
|
|
def reserve(identity, order):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
barrier.wait(timeout=10)
|
|
result = db.reserve_docker_depth_experiment_target_capacity_locked(
|
|
experiment['id'], identity[0], identity[1], 1, order, now,
|
|
)
|
|
time.sleep(0.1)
|
|
db.conn.commit()
|
|
results.append(('inserted', result['inserted']))
|
|
except ScanEventConflictError:
|
|
db.conn.rollback()
|
|
results.append(('capacity', False))
|
|
finally:
|
|
db.close()
|
|
|
|
threads = [
|
|
threading.Thread(target=reserve, args=(identity, index + 1))
|
|
for index, identity in enumerate(identities)
|
|
]
|
|
for thread in threads:
|
|
thread.start()
|
|
for thread in threads:
|
|
thread.join(timeout=15)
|
|
self.assertEqual(sorted(results), [('capacity', False), ('inserted', True)])
|
|
final = setup_db.conn.execute(
|
|
'''SELECT target_count,
|
|
(SELECT COUNT(*) FROM docker_depth_experiment_targets
|
|
WHERE experiment_id = ?) AS physical
|
|
FROM docker_depth_experiments WHERE id = ?''',
|
|
(experiment['id'], experiment['id']),
|
|
).fetchone()
|
|
setup_db.conn.commit()
|
|
self.assertEqual((final['target_count'], final['physical']), (1, 1))
|
|
finally:
|
|
setup_db.close()
|
|
|
|
def test_docker_resolution_retry_and_periodic_refresh_are_fenced(self):
|
|
setup_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(setup_db, initialize_base=True)
|
|
repo = 'example/docker-repo'
|
|
digest_a = 'sha256:' + ('a' * 64)
|
|
digest_b = 'sha256:' + ('b' * 64)
|
|
target_a = f'{repo}@{digest_a}'
|
|
target_b = f'{repo}@{digest_b}'
|
|
self.assertEqual(
|
|
source_db.enqueue_targets(
|
|
'dockerhub', 'docker', 'integration', [], unresolved_targets=[repo],
|
|
),
|
|
1,
|
|
)
|
|
source_db.conn.execute(
|
|
'''UPDATE target_queue
|
|
SET resolver_due_at = ?, available_after = ?, resolver_attempts = 5
|
|
WHERE source = 'dockerhub' AND normalized_target = ?''',
|
|
('2000-01-01T00:00:00+00:00', '2000-01-01T00:00:00+00:00', repo),
|
|
)
|
|
source_db.conn.commit()
|
|
|
|
first = source_db.claim_docker_resolutions(
|
|
'dockerhub', 1, 'integration-resolver', lease_seconds=60,
|
|
)[0]
|
|
self.assertEqual(
|
|
(first['resolver_attempts_before'], first['resolver_attempts'], first['periodic']),
|
|
(5, 6, False),
|
|
)
|
|
retry_at = (datetime.now(timezone.utc) + timedelta(minutes=5)).isoformat(
|
|
timespec='seconds'
|
|
)
|
|
self.assertFalse(source_db.finish_docker_resolution(
|
|
'dockerhub', first['id'], first['resolver_token'] + '-stale',
|
|
[target_a], 'shared cooldown', complete=False,
|
|
retry_at=retry_at, claim_attempt_consumed=False,
|
|
))
|
|
self.assertEqual(
|
|
source_db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM target_queue WHERE normalized_target = ?',
|
|
(target_a,),
|
|
).fetchone()['count'],
|
|
0,
|
|
)
|
|
source_db.conn.commit()
|
|
self.assertTrue(source_db.finish_docker_resolution(
|
|
'dockerhub', first['id'], first['resolver_token'],
|
|
[], 'shared cooldown', complete=False,
|
|
retry_at=retry_at, claim_attempt_consumed=False,
|
|
))
|
|
cooled = source_db.conn.execute(
|
|
'''SELECT status, resolver_state, resolver_due_at, available_after,
|
|
resolver_attempts, resolver_token
|
|
FROM target_queue WHERE id = ?''',
|
|
(first['id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
cooled['status'], cooled['resolver_state'], cooled['resolver_due_at'],
|
|
cooled['available_after'], cooled['resolver_attempts'], cooled['resolver_token'],
|
|
),
|
|
('deferred', 'retry', retry_at, retry_at, 5, None),
|
|
)
|
|
|
|
source_db.conn.execute(
|
|
'UPDATE target_queue SET resolver_due_at = ?, available_after = ? WHERE id = ?',
|
|
('2000-01-01T00:00:00+00:00', '2000-01-01T00:00:00+00:00', first['id']),
|
|
)
|
|
source_db.conn.commit()
|
|
second = source_db.claim_docker_resolutions(
|
|
'dockerhub', 1, 'integration-resolver', lease_seconds=60,
|
|
)[0]
|
|
before_finish = datetime.now(timezone.utc)
|
|
self.assertTrue(source_db.finish_docker_resolution(
|
|
'dockerhub', second['id'], second['resolver_token'], [target_a],
|
|
complete=True, refresh_interval_sec=86400,
|
|
))
|
|
resolved = source_db.conn.execute(
|
|
'''SELECT status, resolver_state, resolver_due_at, resolver_attempts
|
|
FROM target_queue WHERE id = ?''',
|
|
(second['id'],),
|
|
).fetchone()
|
|
self.assertEqual(
|
|
(resolved['status'], resolved['resolver_state'], resolved['resolver_attempts']),
|
|
('done', 'resolved', 0),
|
|
)
|
|
self.assertGreaterEqual(
|
|
datetime.fromisoformat(resolved['resolver_due_at']),
|
|
before_finish + timedelta(hours=23, minutes=59),
|
|
)
|
|
self.assertEqual(
|
|
source_db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM target_queue WHERE normalized_target = ?',
|
|
(target_a,),
|
|
).fetchone()['count'],
|
|
1,
|
|
)
|
|
source_db.conn.commit()
|
|
|
|
source_db.enqueue_targets(
|
|
'dockerhub', 'docker', 'integration', [], unresolved_targets=[repo],
|
|
)
|
|
rediscovered = source_db.conn.execute(
|
|
'''SELECT status, resolver_state, resolver_due_at, resolver_attempts
|
|
FROM target_queue WHERE id = ?''',
|
|
(second['id'],),
|
|
).fetchone()
|
|
self.assertEqual(dict(rediscovered), dict(resolved))
|
|
self.assertEqual(source_db.claim_docker_resolutions(
|
|
'dockerhub', 1, 'integration-resolver', lease_seconds=60,
|
|
periodic_limit=1, periodic_only=True,
|
|
), [])
|
|
|
|
source_db.conn.execute(
|
|
'UPDATE target_queue SET resolver_due_at = ? WHERE id = ?',
|
|
('2000-01-01T00:00:00+00:00', second['id']),
|
|
)
|
|
source_db.conn.commit()
|
|
periodic = source_db.claim_docker_resolutions(
|
|
'dockerhub', 1, 'integration-resolver', lease_seconds=60,
|
|
periodic_limit=1, periodic_only=True,
|
|
)[0]
|
|
self.assertTrue(periodic['periodic'])
|
|
self.assertFalse(source_db.finish_docker_resolution(
|
|
'dockerhub', periodic['id'], periodic['resolver_token'] + '-stale',
|
|
[target_b], complete=True, refresh_interval_sec=86400,
|
|
))
|
|
self.assertTrue(source_db.finish_docker_resolution(
|
|
'dockerhub', periodic['id'], periodic['resolver_token'],
|
|
[target_a, target_b], complete=True, refresh_interval_sec=86400,
|
|
))
|
|
children = source_db.conn.execute(
|
|
'''SELECT normalized_target, COUNT(*) AS count
|
|
FROM target_queue WHERE normalized_target IN (?, ?)
|
|
GROUP BY normalized_target ORDER BY normalized_target''',
|
|
(target_a, target_b),
|
|
).fetchall()
|
|
anchor = source_db.conn.execute(
|
|
'''SELECT status, resolver_state, resolver_attempts, resolver_token
|
|
FROM target_queue WHERE id = ?''',
|
|
(periodic['id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
[(row['normalized_target'], row['count']) for row in children],
|
|
[(target_a, 1), (target_b, 1)],
|
|
)
|
|
self.assertEqual(
|
|
(
|
|
anchor['status'], anchor['resolver_state'],
|
|
anchor['resolver_attempts'], anchor['resolver_token'],
|
|
),
|
|
('done', 'resolved', 0, None),
|
|
)
|
|
finally:
|
|
source_db.close()
|
|
setup_db.close()
|
|
|
|
def test_target_queue_cold_policy_is_atomic_reversible_and_preserved(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
config = {'sources': {'dockerhub': {'queries': ['kept']}}}
|
|
config_sha256 = 'a' * 64
|
|
digest = lambda value: 'sha256:' + (value * 64)
|
|
kept_target = f'example/kept@{digest("a")}'
|
|
stale_targets = [
|
|
f'example/stale-pending@{digest("b")}',
|
|
f'example/stale-deferred@{digest("c")}',
|
|
]
|
|
self.assertEqual(
|
|
db.enqueue_targets('dockerhub', 'docker', 'kept', [kept_target]), 1,
|
|
)
|
|
self.assertEqual(
|
|
db.enqueue_targets('dockerhub', 'docker', 'retired', stale_targets), 2,
|
|
)
|
|
stale_rows = db.conn.execute(
|
|
'''SELECT * FROM target_queue
|
|
WHERE source = 'dockerhub' AND query = 'retired' ORDER BY id'''
|
|
).fetchall()
|
|
deferred_id = int(stale_rows[1]['id'])
|
|
db.conn.execute(
|
|
'''UPDATE target_queue SET status = 'deferred', attempts = 2,
|
|
available_after = '2099-01-01T00:00:00+00:00',
|
|
last_error = 'fixture retry'
|
|
WHERE id = ?''',
|
|
(deferred_id,),
|
|
)
|
|
db.conn.commit()
|
|
stale_rows = db.conn.execute(
|
|
'''SELECT * FROM target_queue
|
|
WHERE source = 'dockerhub' AND query = 'retired' ORDER BY id'''
|
|
).fetchall()
|
|
originals = {int(row['id']): dict(row) for row in stale_rows}
|
|
|
|
manifest = plan_stale_target_queue_cold(
|
|
db, config, source='dockerhub', platform='docker',
|
|
config_sha256=config_sha256, max_rows=10,
|
|
)
|
|
self.assertEqual(
|
|
[entry['prior_status'] for entry in manifest['entries']],
|
|
['pending', 'deferred'],
|
|
)
|
|
manifest_sha256 = _canonical_json_sha256(manifest)
|
|
|
|
blocked_id = int(stale_rows[0]['id'])
|
|
db.conn.execute(
|
|
'UPDATE target_queue SET lease_owner = ? WHERE id = ?',
|
|
('fixture-owner', blocked_id),
|
|
)
|
|
db.conn.commit()
|
|
with self.assertRaisesRegex(RuntimeError, 'fenced row'):
|
|
apply_stale_target_queue_cold(
|
|
db, config, manifest, manifest_sha256,
|
|
config_sha256=config_sha256, max_rows=10,
|
|
)
|
|
unchanged = db.conn.execute(
|
|
'''SELECT status FROM target_queue
|
|
WHERE query = 'retired' ORDER BY id'''
|
|
).fetchall()
|
|
event_count = db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM target_queue_policy_events'
|
|
).fetchone()['count']
|
|
db.conn.commit()
|
|
self.assertEqual([row['status'] for row in unchanged], ['pending', 'deferred'])
|
|
self.assertEqual(event_count, 0)
|
|
|
|
db.conn.execute(
|
|
'UPDATE target_queue SET lease_owner = NULL WHERE id = ?',
|
|
(blocked_id,),
|
|
)
|
|
db.conn.commit()
|
|
applied = apply_stale_target_queue_cold(
|
|
db, config, manifest, manifest_sha256,
|
|
config_sha256=config_sha256, max_rows=10,
|
|
)
|
|
self.assertEqual((applied['transitioned'], applied['duplicates']), (2, 0))
|
|
replayed = apply_stale_target_queue_cold(
|
|
db, config, manifest, manifest_sha256,
|
|
config_sha256=config_sha256, max_rows=10,
|
|
)
|
|
self.assertEqual((replayed['transitioned'], replayed['duplicates']), (0, 2))
|
|
|
|
cold_rows = db.conn.execute(
|
|
'''SELECT * FROM target_queue
|
|
WHERE query = 'retired' ORDER BY id'''
|
|
).fetchall()
|
|
db.conn.commit()
|
|
for row in cold_rows:
|
|
before = originals[int(row['id'])]
|
|
self.assertEqual(row['status'], 'cold')
|
|
for column in (
|
|
'source', 'platform', 'query', 'target', 'normalized_target',
|
|
'attempts', 'available_after', 'last_error', 'resolver_state',
|
|
'resolver_due_at', 'remote_modified_at', 'covered_ref', 'covered_head',
|
|
):
|
|
self.assertEqual(row[column], before[column])
|
|
self.assertEqual(db.target_queue_counts('dockerhub')['counts']['cold'], 2)
|
|
|
|
claimed = db.claim_targets(
|
|
'dockerhub', 'docker', 10, lease_owner='fixture-claim',
|
|
lease_seconds=60, return_rows=True,
|
|
)
|
|
self.assertEqual([row['target'] for row in claimed], [kept_target])
|
|
self.assertEqual(
|
|
db.enqueue_targets(
|
|
'dockerhub', 'docker', 'kept', [stale_targets[0]], requeue_done=True,
|
|
),
|
|
1,
|
|
)
|
|
self.assertTrue(db.sync_target_queue_from_files(
|
|
'dockerhub', 'docker', todo_targets=[stale_targets[0]],
|
|
checked_targets=[stale_targets[1]], query='kept',
|
|
))
|
|
preserved = db.conn.execute(
|
|
'''SELECT status FROM target_queue
|
|
WHERE query = 'retired' ORDER BY id'''
|
|
).fetchall()
|
|
db.conn.commit()
|
|
self.assertEqual([row['status'] for row in preserved], ['cold', 'cold'])
|
|
|
|
reactivation = plan_cold_target_queue_reactivation(
|
|
db, config, source='dockerhub', platform='docker', query='retired',
|
|
config_sha256=config_sha256, max_rows=10,
|
|
)
|
|
reactivation_sha256 = _canonical_json_sha256(reactivation)
|
|
restored = apply_cold_target_queue_reactivation(
|
|
db, config, reactivation, reactivation_sha256,
|
|
config_sha256=config_sha256, max_rows=10,
|
|
)
|
|
self.assertEqual((restored['transitioned'], restored['duplicates']), (2, 0))
|
|
replayed_restore = apply_cold_target_queue_reactivation(
|
|
db, config, reactivation, reactivation_sha256,
|
|
config_sha256=config_sha256, max_rows=10,
|
|
)
|
|
self.assertEqual(
|
|
(replayed_restore['transitioned'], replayed_restore['duplicates']),
|
|
(0, 2),
|
|
)
|
|
final_rows = db.conn.execute(
|
|
'''SELECT status FROM target_queue
|
|
WHERE query = 'retired' ORDER BY id'''
|
|
).fetchall()
|
|
events = db.conn.execute(
|
|
'''SELECT action, COUNT(*) AS count FROM target_queue_policy_events
|
|
GROUP BY action ORDER BY action'''
|
|
).fetchall()
|
|
db.conn.commit()
|
|
self.assertEqual([row['status'] for row in final_rows], ['pending', 'deferred'])
|
|
self.assertEqual([(row['action'], row['count']) for row in events], [
|
|
('cold', 2), ('reactivate', 2),
|
|
])
|
|
finally:
|
|
db.close()
|
|
|
|
def test_rejected_query_policy_colds_only_exact_registered_source_pairs(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
|
|
def rejected(source, query, rows):
|
|
return {
|
|
'source': source,
|
|
'query': query,
|
|
'status': 'rejected_zero_alive',
|
|
'evidence_cutoff': '2026-09-07T00:00:00+00:00',
|
|
'successful_scans': 1000,
|
|
'findings': 0,
|
|
'unique_credentials': 0,
|
|
'pending_candidates': 0,
|
|
'ever_alive_credentials': 0,
|
|
'reviewed_queue_rows': rows,
|
|
}
|
|
|
|
config = {
|
|
'sources': {
|
|
'dockerhub': {'queries': ['kept']},
|
|
'github': {'queries': ['retired']},
|
|
},
|
|
'query_policy': {
|
|
'rejected': [
|
|
rejected('dockerhub', 'retired', 2),
|
|
rejected('github', 'obsolete', 1),
|
|
],
|
|
},
|
|
}
|
|
config_sha256 = 'b' * 64
|
|
digest = lambda value: 'sha256:' + (value * 64)
|
|
docker_targets = {
|
|
'retired': [
|
|
f'example/rejected-a@{digest("a")}',
|
|
f'example/rejected-b@{digest("b")}',
|
|
],
|
|
'unregistered': [f'example/unregistered@{digest("c")}'],
|
|
'kept': [f'example/kept@{digest("d")}'],
|
|
}
|
|
for query, targets in docker_targets.items():
|
|
self.assertEqual(
|
|
db.enqueue_targets('dockerhub', 'docker', query, targets),
|
|
len(targets),
|
|
)
|
|
github_targets = {
|
|
'obsolete': ['https://example.invalid/rejected.git'],
|
|
'retired': ['https://example.invalid/source-specific-kept.git'],
|
|
'unregistered': ['https://example.invalid/unregistered.git'],
|
|
}
|
|
for query, targets in github_targets.items():
|
|
self.assertEqual(
|
|
db.enqueue_targets('github', 'github', query, targets),
|
|
len(targets),
|
|
)
|
|
|
|
before = db.conn.execute(
|
|
'''SELECT id, source, platform, query, target, normalized_target,
|
|
attempts, available_after, last_error, resolver_state,
|
|
resolver_due_at, remote_modified_at, covered_ref, covered_head
|
|
FROM target_queue ORDER BY id'''
|
|
).fetchall()
|
|
db.conn.commit()
|
|
before_by_id = {int(row['id']): dict(row) for row in before}
|
|
|
|
docker_manifest = plan_stale_target_queue_cold(
|
|
db, config, source='dockerhub', platform='docker',
|
|
config_sha256=config_sha256, max_rows=10,
|
|
)
|
|
github_manifest = plan_stale_target_queue_cold(
|
|
db, config, source='github', platform='github',
|
|
config_sha256=config_sha256, max_rows=10,
|
|
)
|
|
self.assertEqual(docker_manifest['reason_code'], 'rejected_zero_alive')
|
|
self.assertEqual(github_manifest['reason_code'], 'rejected_zero_alive')
|
|
self.assertEqual(
|
|
[entry['query'] for entry in docker_manifest['entries']],
|
|
['retired', 'retired'],
|
|
)
|
|
self.assertEqual(
|
|
[entry['query'] for entry in github_manifest['entries']],
|
|
['obsolete'],
|
|
)
|
|
|
|
for manifest in (docker_manifest, github_manifest):
|
|
manifest_sha256 = _canonical_json_sha256(manifest)
|
|
applied = apply_stale_target_queue_cold(
|
|
db, config, manifest, manifest_sha256,
|
|
config_sha256=config_sha256, max_rows=10,
|
|
)
|
|
self.assertEqual(applied['duplicates'], 0)
|
|
replayed = apply_stale_target_queue_cold(
|
|
db, config, manifest, manifest_sha256,
|
|
config_sha256=config_sha256, max_rows=10,
|
|
)
|
|
self.assertEqual(replayed['transitioned'], 0)
|
|
self.assertEqual(replayed['duplicates'], len(manifest['entries']))
|
|
|
|
rows = db.conn.execute(
|
|
'''SELECT * FROM target_queue ORDER BY id'''
|
|
).fetchall()
|
|
events = db.conn.execute(
|
|
'''SELECT queue_id, action, reason_code
|
|
FROM target_queue_policy_events ORDER BY queue_id'''
|
|
).fetchall()
|
|
db.conn.commit()
|
|
cold = [row for row in rows if row['status'] == 'cold']
|
|
self.assertEqual(
|
|
[(row['source'], row['query']) for row in cold],
|
|
[('dockerhub', 'retired'), ('dockerhub', 'retired'), ('github', 'obsolete')],
|
|
)
|
|
self.assertEqual(len(rows), len(before))
|
|
self.assertEqual(len(events), 3)
|
|
self.assertTrue(all(row['action'] == 'cold' for row in events))
|
|
self.assertTrue(all(row['reason_code'] == 'rejected_zero_alive' for row in events))
|
|
for row in cold:
|
|
original = before_by_id[int(row['id'])]
|
|
for column in (
|
|
'source', 'platform', 'query', 'target', 'normalized_target',
|
|
'attempts', 'available_after', 'last_error', 'resolver_state',
|
|
'resolver_due_at', 'remote_modified_at', 'covered_ref', 'covered_head',
|
|
):
|
|
self.assertEqual(row[column], original[column])
|
|
self.assertEqual(
|
|
sorted((row['source'], row['query'], row['status']) for row in rows if row['status'] != 'cold'),
|
|
[
|
|
('dockerhub', 'kept', 'pending'),
|
|
('dockerhub', 'unregistered', 'pending'),
|
|
('github', 'retired', 'pending'),
|
|
('github', 'unregistered', 'pending'),
|
|
],
|
|
)
|
|
|
|
reactivation = plan_cold_target_queue_reactivation(
|
|
db, config, source='github', platform='github', query='obsolete',
|
|
config_sha256=config_sha256, max_rows=10,
|
|
)
|
|
restored = apply_cold_target_queue_reactivation(
|
|
db, config, reactivation, _canonical_json_sha256(reactivation),
|
|
config_sha256=config_sha256, max_rows=10,
|
|
)
|
|
self.assertEqual((restored['transitioned'], restored['duplicates']), (1, 0))
|
|
github_rejected = db.conn.execute(
|
|
'''SELECT status FROM target_queue
|
|
WHERE source = 'github' AND query = 'obsolete' '''
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(github_rejected['status'], 'pending')
|
|
finally:
|
|
db.close()
|
|
|
|
def test_docker_resolution_allowed_queries_filter_retry_and_periodic_anchors(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
repositories = {
|
|
'kept': 'example/resolver-kept',
|
|
'removed': 'example/resolver-removed',
|
|
'Kept': 'example/resolver-case-mismatch',
|
|
}
|
|
for query, repository in repositories.items():
|
|
self.assertEqual(
|
|
db.enqueue_targets(
|
|
'dockerhub', 'docker', query, [], unresolved_targets=[repository],
|
|
),
|
|
1,
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE target_queue SET resolver_due_at = ?, available_after = ?
|
|
WHERE source = 'dockerhub' AND platform = 'docker' ''',
|
|
('2000-01-01T00:00:00+00:00', '2000-01-01T00:00:00+00:00'),
|
|
)
|
|
db.conn.commit()
|
|
|
|
retry = db.claim_docker_resolutions(
|
|
'dockerhub', 3, 'resolver-filter', lease_seconds=60,
|
|
allowed_queries=('kept',),
|
|
)
|
|
self.assertEqual([row['target'] for row in retry], [repositories['kept']])
|
|
self.assertTrue(db.finish_docker_resolution(
|
|
'dockerhub', retry[0]['id'], retry[0]['resolver_token'],
|
|
[], complete=True, refresh_interval_sec=60,
|
|
))
|
|
untouched = db.conn.execute(
|
|
'''SELECT query, resolver_state, resolver_token FROM target_queue
|
|
WHERE query IN ('removed', 'Kept') ORDER BY query'''
|
|
).fetchall()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
[(row['query'], row['resolver_state'], row['resolver_token']) for row in untouched],
|
|
[('Kept', 'pending', None), ('removed', 'pending', None)],
|
|
)
|
|
|
|
db.conn.execute(
|
|
'''UPDATE target_queue SET status = 'done', resolver_state = 'resolved',
|
|
resolver_token = NULL, resolver_due_at = ?, available_after = NULL
|
|
WHERE source = 'dockerhub' AND platform = 'docker' ''',
|
|
('2000-01-01T00:00:00+00:00',),
|
|
)
|
|
db.conn.commit()
|
|
periodic = db.claim_docker_resolutions(
|
|
'dockerhub', 3, 'resolver-filter', lease_seconds=60,
|
|
periodic_limit=3, periodic_only=True, allowed_queries=('kept',),
|
|
)
|
|
self.assertEqual([row['target'] for row in periodic], [repositories['kept']])
|
|
self.assertTrue(periodic[0]['periodic'])
|
|
self.assertEqual(db.claim_docker_resolutions(
|
|
'dockerhub', 3, 'resolver-empty', lease_seconds=60,
|
|
periodic_limit=3, periodic_only=True, allowed_queries=(),
|
|
), [])
|
|
finally:
|
|
db.close()
|
|
|
|
def test_projector_preserves_primary_sql_error_and_requires_findings_index(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
projector = None
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.record_final_cutover({'test': self.id()})
|
|
index = db.conn.table_indexes('findings').get('idx_findings_target_scan_id_id')
|
|
self.assertEqual(index['columns'], ['target_scan_id', 'id'])
|
|
self.assertFalse(index['unique'])
|
|
|
|
db.conn.execute('DROP INDEX idx_findings_target_scan_id_id')
|
|
db.conn.commit()
|
|
db._runtime_safety_schema_validated = False
|
|
with self.assertRaisesRegex(RuntimeSafetySchemaError, 'idx_findings_target_scan_id_id'):
|
|
db.require_runtime_safety_schema()
|
|
migrate_runtime_safety_schema(db)
|
|
self.assertTrue(db.require_runtime_safety_schema())
|
|
|
|
run_id = db.start_run('integration', selected_source='github')
|
|
cycle_id = db.start_source_cycle(
|
|
run_id, 'github', 'github', 'integration', 'fixture',
|
|
)
|
|
target_scan_id = db.record_target_result(
|
|
run_id, cycle_id, 'github', 'fixture', 'https://example.invalid/rollback',
|
|
{
|
|
'target': 'https://example.invalid/rollback',
|
|
'scan_type': 'github',
|
|
'timestamp': '2026-08-31T00:00:00+00:00',
|
|
'findings': [],
|
|
'errors': [],
|
|
},
|
|
)
|
|
backfill_normalized_raw_results(db, max_rows=1, max_bytes=1024 * 1024)
|
|
db.conn.execute(
|
|
'''UPDATE pipeline_capacity
|
|
SET projection_items = projection_items + 1,
|
|
projection_bytes = projection_bytes + ? WHERE id = 1''',
|
|
(1024 * 1024,),
|
|
)
|
|
job_id = db.conn.insert_returning_id(
|
|
'''INSERT INTO projection_jobs(
|
|
job_kind, event_id, event_hash, target_scan_id, status,
|
|
required_stream_mask, capacity_items, capacity_bytes,
|
|
created_at, updated_at
|
|
) VALUES ('scan_event', ?, ?, ?, 'pending', 1, 1, ?, ?, ?)''',
|
|
(
|
|
'1' * 64, '2' * 64, target_scan_id, 1024 * 1024,
|
|
'2026-08-31T00:00:00+00:00', '2026-08-31T00:00:00+00:00',
|
|
),
|
|
)
|
|
db.conn.commit()
|
|
projector = JsonlProjector(
|
|
db, str(self.results), 'integration-supervisor', lease_seconds=300,
|
|
keycheck_dir=str(self.keychecks),
|
|
).start()
|
|
|
|
def fail_with_primary_sql_error(_target_scan_id):
|
|
db.conn.execute('SELECT 1 / 0').fetchone()
|
|
return iter(())
|
|
|
|
db.iter_projection_findings = fail_with_primary_sql_error
|
|
with self.assertRaises(Exception) as raised:
|
|
projector.process_one()
|
|
self.assertEqual(getattr(raised.exception, 'sqlstate', None), '22012')
|
|
self.assertNotIn('current transaction is aborted', str(raised.exception).lower())
|
|
self.assertEqual(db.conn.execute('SELECT 1 AS value').fetchone()['value'], 1)
|
|
db.conn.commit()
|
|
artifact = db.conn.execute(
|
|
'''SELECT state FROM pipeline_artifacts
|
|
WHERE subsystem = 'jsonl_projector' AND owner_id = ?''',
|
|
(job_id,),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(artifact['state'], 'deleted')
|
|
projector.stop('primary SQL error fixture')
|
|
self.assertIsNone(projector.lease)
|
|
finally:
|
|
if projector is not None and projector.lease is not None:
|
|
projector.stop()
|
|
db.close()
|
|
|
|
def test_synthetic_llm_candidates_reach_final_database_accounting(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(ingester_db, initialize_base=True)
|
|
ingester_db.record_final_cutover({'test': self.id()})
|
|
run_id = source_db.start_run('integration', selected_source='github')
|
|
cycle_id = source_db.start_source_cycle(
|
|
run_id, 'github', 'github', 'integration', 'fixture',
|
|
)
|
|
target = 'https://example.invalid/synthetic-llm-pipeline'
|
|
self.assertEqual(
|
|
source_db.enqueue_targets('github', 'github', 'fixture', [target]), 1,
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor', lease_seconds=300,
|
|
).start()
|
|
claim = source_db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(), 'integration-supervisor',
|
|
4 * 1024 * 1024, 4 * 1024 * 1024, 10, 1024 * 1024,
|
|
run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits={
|
|
'bundle_items': 10, 'bundle_bytes': 64 * 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 64 * 1024 * 1024,
|
|
'keycheck_items': 10, 'keycheck_bytes': 16 * 1024 * 1024,
|
|
},
|
|
reservation_token='synthetic-llm-reservation',
|
|
bundle_id='9' * 32,
|
|
scan_event_id='8' * 32,
|
|
)
|
|
self.assertIsNotNone(claim)
|
|
alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
|
|
|
|
def material(label, length, characters):
|
|
seed = hashlib.sha512(label.encode('ascii')).hexdigest()
|
|
output = ''
|
|
while len(output) < length:
|
|
output += ''.join(
|
|
characters[int(seed[index:index + 2], 16) % len(characters)]
|
|
for index in range(0, len(seed), 2)
|
|
)
|
|
seed = hashlib.sha512(seed.encode('ascii')).hexdigest()
|
|
return output[:length]
|
|
|
|
tokens = {
|
|
'OpenAI': (
|
|
'sk-proj-' + material('db-openai-prefix', 24, alphabet)
|
|
+ 'T3BlbkFJ' + material('db-openai-suffix', 24, alphabet)
|
|
),
|
|
'OpenRouter': 'sk-or-v1-' + material(
|
|
'db-openrouter', 64, '0123456789abcdef',
|
|
),
|
|
'Anthropic': (
|
|
'sk-ant-api03-' + material('db-anthropic', 93, alphabet + '-_') + 'AA'
|
|
),
|
|
}
|
|
result = {
|
|
'scan_event_id': claim['scan_event_id'],
|
|
'target': claim['target'],
|
|
'scan_type': 'github',
|
|
'timestamp': '2026-09-07T00:00:00+00:00',
|
|
'scan_started_at': '2026-09-07T00:00:00+00:00',
|
|
'duration_sec': 1.0,
|
|
'findings': [
|
|
{
|
|
'DetectorName': detector,
|
|
'Raw': token,
|
|
'finding_uid': hashlib.sha256(detector.encode('ascii')).hexdigest(),
|
|
'Verified': False,
|
|
}
|
|
for detector, token in tokens.items()
|
|
],
|
|
'errors': [],
|
|
}
|
|
staged = stage_result_bundle(
|
|
result, claim, str(self.bundle_root), {},
|
|
{'queue_status': 'done', 'queue_error': None, 'available_after': None},
|
|
candidate_max_items=10, candidate_max_bytes=1024 * 1024,
|
|
)
|
|
self.assertEqual(staged.candidate_count, 3)
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
claim['reservation_id'], {
|
|
'bundle_id': staged.bundle_id,
|
|
'scan_event_id': staged.scan_event_id,
|
|
'scan_event_hash': staged.scan_event_hash,
|
|
'relative_path': staged.relative_path,
|
|
'actual_bytes': staged.actual_bytes,
|
|
'frame_count': staged.frame_count,
|
|
'finding_count': staged.finding_count,
|
|
'error_count': staged.error_count,
|
|
'candidate_count': staged.candidate_count,
|
|
},
|
|
))
|
|
self.assertTrue(ingester.process_one())
|
|
candidates = source_db.conn.execute(
|
|
'''SELECT c.id, c.service
|
|
FROM keycheck_candidates c
|
|
ORDER BY c.service'''
|
|
).fetchall()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
[row['service'] for row in candidates],
|
|
['anthropic', 'openai', 'openrouter'],
|
|
)
|
|
for row in candidates:
|
|
candidate = source_db.claim_keycheck_candidate(
|
|
row['service'], f'synthetic-{row["service"]}',
|
|
)
|
|
self.assertIsNotNone(candidate)
|
|
event_id = hashlib.sha256(
|
|
f'synthetic-result:{row["service"]}'.encode('ascii')
|
|
).hexdigest()
|
|
completed = source_db.complete_keycheck_candidate(
|
|
candidate['id'], candidate['lease_token'], event_id,
|
|
'ALIVE', 'alive', message='synthetic local result',
|
|
metadata={'synthetic': True},
|
|
)
|
|
self.assertTrue(completed['completed'])
|
|
current = source_db.conn.execute(
|
|
'''SELECT c.service, s.status_group
|
|
FROM keycheck_current_state s
|
|
JOIN keycheck_credentials c ON c.id = s.credential_id
|
|
ORDER BY c.service'''
|
|
).fetchall()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
[(row['service'], row['status_group']) for row in current],
|
|
[('anthropic', 'alive'), ('openai', 'alive'), ('openrouter', 'alive')],
|
|
)
|
|
self.assertTrue(ingester.stop())
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
source_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_bundle_ingest_projection_and_db_keycheck_are_transactional(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
projector_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
projector = None
|
|
try:
|
|
migrate_runtime_safety_schema(ingester_db, initialize_base=True)
|
|
with self.assertRaisesRegex(RuntimeError, 'cutover marker'):
|
|
ingester_db.require_final_cutover()
|
|
ingester_db.record_final_cutover({'test': self.id()})
|
|
self.assertTrue(ingester_db.require_runtime_safety_schema())
|
|
run_id = source_db.start_run('integration', selected_source='github')
|
|
cycle_id = source_db.start_source_cycle(
|
|
run_id, 'github', 'github', 'integration', 'fixture',
|
|
)
|
|
self.assertEqual(
|
|
source_db.enqueue_targets(
|
|
'github', 'github', 'fixture', ['https://example.invalid/repo'],
|
|
),
|
|
1,
|
|
)
|
|
|
|
injected = {'pending': True}
|
|
|
|
def fault(stage, _value):
|
|
if stage == 'after_db_commit' and injected['pending']:
|
|
injected['pending'] = False
|
|
raise RuntimeError('injected ambiguous commit response')
|
|
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor',
|
|
lease_seconds=300, fault=fault,
|
|
).start()
|
|
claim = source_db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(), 'integration-supervisor',
|
|
4 * 1024 * 1024, 4 * 1024 * 1024, 10, 1024 * 1024,
|
|
run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits={
|
|
'bundle_items': 10, 'bundle_bytes': 64 * 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 64 * 1024 * 1024,
|
|
'keycheck_items': 100, 'keycheck_bytes': 16 * 1024 * 1024,
|
|
},
|
|
reservation_token='integration-reservation-one',
|
|
bundle_id='1' * 32, scan_event_id='2' * 32,
|
|
)
|
|
self.assertIsNotNone(claim)
|
|
result = {
|
|
'scan_event_id': claim['scan_event_id'],
|
|
'target': claim['target'],
|
|
'scan_type': 'github',
|
|
'timestamp': '2026-07-27T00:00:00+00:00',
|
|
'scan_started_at': '2026-07-27T00:00:00+00:00',
|
|
'duration_sec': 1.0,
|
|
'findings': [{
|
|
'DetectorName': 'OpenAI',
|
|
'Raw': 'sk-integration-fixture-secret',
|
|
'finding_uid': 'f' * 64,
|
|
'Verified': False,
|
|
}],
|
|
'errors': [],
|
|
}
|
|
staged = stage_result_bundle(
|
|
result, claim, str(self.bundle_root), {},
|
|
{'queue_status': 'done', 'queue_error': None, 'available_after': None},
|
|
candidate_max_items=10, candidate_max_bytes=1024 * 1024,
|
|
)
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
claim['reservation_id'], {
|
|
'bundle_id': staged.bundle_id,
|
|
'scan_event_id': staged.scan_event_id,
|
|
'scan_event_hash': staged.scan_event_hash,
|
|
'relative_path': staged.relative_path,
|
|
'actual_bytes': staged.actual_bytes,
|
|
'frame_count': staged.frame_count,
|
|
'finding_count': staged.finding_count,
|
|
'error_count': staged.error_count,
|
|
'candidate_count': staged.candidate_count,
|
|
},
|
|
))
|
|
with self.assertRaisesRegex(RuntimeError, 'ambiguous commit response'):
|
|
ingester.process_one()
|
|
self.assertEqual(
|
|
source_db.conn.execute('SELECT COUNT(*) AS count FROM target_scans').fetchone()['count'],
|
|
1,
|
|
)
|
|
source_db.conn.commit()
|
|
unlink_fault = {'pending': True}
|
|
|
|
def fail_after_unlink(stage, _value):
|
|
if stage == 'after_unlink' and unlink_fault['pending']:
|
|
unlink_fault['pending'] = False
|
|
raise RuntimeError('injected unlink acknowledgement loss')
|
|
|
|
ingester.fault = fail_after_unlink
|
|
with self.assertRaisesRegex(RuntimeError, 'unlink acknowledgement loss'):
|
|
ingester.process_one()
|
|
self.assertEqual(source_db.pipeline_capacity_snapshot()['bundle_items'], 1)
|
|
ingester.fault = None
|
|
self.assertTrue(ingester.process_one())
|
|
self.assertEqual(source_db.pipeline_capacity_snapshot()['bundle_items'], 0)
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
claim['reservation_id'], {
|
|
'bundle_id': staged.bundle_id,
|
|
'scan_event_id': staged.scan_event_id,
|
|
'scan_event_hash': staged.scan_event_hash,
|
|
'relative_path': staged.relative_path,
|
|
'actual_bytes': staged.actual_bytes,
|
|
'frame_count': staged.frame_count,
|
|
'finding_count': staged.finding_count,
|
|
'error_count': staged.error_count,
|
|
'candidate_count': staged.candidate_count,
|
|
},
|
|
))
|
|
ready_artifact = source_db.conn.execute(
|
|
'''SELECT state FROM pipeline_artifacts
|
|
WHERE subsystem = 'result_bundle' AND artifact_kind = 'bundle_ready'
|
|
AND owner_id = ?''',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(ready_artifact['state'], 'deleted')
|
|
self.assertEqual(
|
|
source_db.conn.execute('SELECT COUNT(*) AS count FROM target_scans').fetchone()['count'],
|
|
1,
|
|
)
|
|
source_db.conn.commit()
|
|
scan = source_db.conn.execute(
|
|
'SELECT raw_result_json, raw_result_storage FROM target_scans WHERE scan_event_id = ?',
|
|
(claim['scan_event_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertIsNone(scan['raw_result_json'])
|
|
self.assertEqual(scan['raw_result_storage'], 'normalized_v2')
|
|
|
|
projection_job = source_db.conn.execute(
|
|
'''SELECT id, capacity_bytes FROM projection_jobs
|
|
WHERE event_id = ?''',
|
|
(claim['scan_event_id'],),
|
|
).fetchone()
|
|
source_db.conn.execute(
|
|
'''UPDATE projection_jobs SET capacity_bytes = 1 WHERE id = ?''',
|
|
(projection_job['id'],),
|
|
)
|
|
source_db.conn.execute(
|
|
'''UPDATE pipeline_capacity
|
|
SET projection_bytes = ? WHERE id = 1''',
|
|
(64 * 1024 * 1024,),
|
|
)
|
|
source_db.conn.commit()
|
|
projector = JsonlProjector(
|
|
projector_db, str(self.results), 'integration-supervisor',
|
|
lease_seconds=300, keycheck_dir=str(self.keychecks),
|
|
projection_max_bytes=64 * 1024 * 1024,
|
|
).start()
|
|
self.assertTrue(projector.process_one())
|
|
deferred_projection = source_db.conn.execute(
|
|
'''SELECT status, capacity_bytes FROM projection_jobs WHERE id = ?''',
|
|
(projection_job['id'],),
|
|
).fetchone()
|
|
projection_quarantine = source_db.conn.execute(
|
|
'''SELECT COUNT(*) AS count FROM pipeline_quarantine
|
|
WHERE projection_job_id = ?''',
|
|
(projection_job['id'],),
|
|
).fetchone()
|
|
projection_appends = source_db.conn.execute(
|
|
'''SELECT COUNT(*) AS count FROM projection_appends
|
|
WHERE job_id = ?''',
|
|
(projection_job['id'],),
|
|
).fetchone()
|
|
source_db.conn.execute(
|
|
'''UPDATE projection_jobs SET available_after = NULL WHERE id = ?''',
|
|
(projection_job['id'],),
|
|
)
|
|
source_db.conn.execute(
|
|
'''UPDATE pipeline_capacity SET projection_bytes = 1 WHERE id = 1'''
|
|
)
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
(deferred_projection['status'], deferred_projection['capacity_bytes']),
|
|
('pending', 1),
|
|
)
|
|
self.assertEqual(projection_quarantine['count'], 0)
|
|
self.assertEqual(projection_appends['count'], 0)
|
|
projector.stop()
|
|
|
|
append_fault = {'pending': True}
|
|
|
|
def fail_after_append(stage, _value):
|
|
if stage == 'after_append_fsync' and append_fault['pending']:
|
|
append_fault['pending'] = False
|
|
raise RuntimeError('injected projection append acknowledgement loss')
|
|
|
|
projector = JsonlProjector(
|
|
projector_db, str(self.results), 'integration-supervisor',
|
|
lease_seconds=300, keycheck_dir=str(self.keychecks),
|
|
fault=fail_after_append, projection_max_bytes=64 * 1024 * 1024,
|
|
).start()
|
|
with self.assertRaisesRegex(RuntimeError, 'projection append acknowledgement loss'):
|
|
projector.process_one()
|
|
projector.stop()
|
|
projector = JsonlProjector(
|
|
projector_db, str(self.results), 'integration-supervisor',
|
|
lease_seconds=300, keycheck_dir=str(self.keychecks),
|
|
projection_max_bytes=64 * 1024 * 1024,
|
|
).start()
|
|
self.assertTrue(projector.process_one())
|
|
self.assertTrue((self.results / 'scan_results.jsonl').is_file())
|
|
self.assertTrue((self.results / 'found_secrets.jsonl').is_file())
|
|
scan_lines = (self.results / 'scan_results.jsonl').read_text(encoding='utf-8').splitlines()
|
|
self.assertEqual(len(scan_lines), 1)
|
|
source_db.conn.execute(
|
|
"UPDATE projection_streams SET rotation_bytes = 1 WHERE stream_name = 'scan_results'"
|
|
)
|
|
source_db.conn.commit()
|
|
state = projector_db.projection_stream_state('scan_results')
|
|
rotated = projector._rotate_if_needed(state, 1)
|
|
self.assertEqual(rotated['current_generation'], 1)
|
|
self.assertTrue((self.results / 'scan_results.g000000.jsonl').is_file())
|
|
self.assertEqual((self.results / 'scan_results.jsonl').stat().st_size, 0)
|
|
source_db.conn.execute(
|
|
'''UPDATE pipeline_capacity SET projection_items = projection_items + 1,
|
|
projection_bytes = projection_bytes + 1024 WHERE id = 1'''
|
|
)
|
|
poison_job = source_db.conn.insert_returning_id(
|
|
'''INSERT INTO projection_jobs(
|
|
job_kind, event_id, event_hash, status, required_stream_mask,
|
|
capacity_items, capacity_bytes, created_at, updated_at
|
|
) VALUES ('scan_event', ?, ?, 'pending', 1, 1, 1024, ?, ?)''',
|
|
('d' * 64, 'e' * 64, '2026-07-27T00:00:00+00:00', '2026-07-27T00:00:00+00:00'),
|
|
)
|
|
source_db.conn.commit()
|
|
self.assertTrue(projector.process_one())
|
|
poison_state = source_db.conn.execute(
|
|
'SELECT status FROM projection_jobs WHERE id = ?', (poison_job,),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(poison_state['status'], 'quarantined')
|
|
|
|
source_db.conn.execute(
|
|
'''UPDATE pipeline_capacity SET projection_items = projection_items + 1,
|
|
projection_bytes = projection_bytes + 1024 WHERE id = 1'''
|
|
)
|
|
abandoned_job = source_db.conn.insert_returning_id(
|
|
'''INSERT INTO projection_jobs(
|
|
job_kind, event_id, event_hash, target_scan_id, status,
|
|
required_stream_mask, capacity_items, capacity_bytes, created_at, updated_at
|
|
) VALUES ('scan_event', ?, ?, 1, 'pending', 1, 1, 1024, ?, ?)''',
|
|
('7' * 64, '8' * 64, '2026-07-27T00:00:00+00:00', '2026-07-27T00:00:00+00:00'),
|
|
)
|
|
source_db.conn.commit()
|
|
abandoned_claim = source_db.claim_projection_job(
|
|
projector.lease['generation'], projector.lease['lease_token'], 300,
|
|
)
|
|
self.assertEqual(abandoned_claim['id'], abandoned_job)
|
|
stream_state = source_db.projection_stream_state('scan_results')
|
|
source_db.prepare_projection_append(
|
|
abandoned_job, abandoned_claim['lease_token'], 'scan_results',
|
|
stream_state['generation'], 1, hashlib.sha256(b'x').hexdigest(), 1,
|
|
)
|
|
self.assertTrue(source_db.quarantine_projection_job(
|
|
abandoned_job, abandoned_claim['lease_token'],
|
|
'integration_abandoned_append', 'fixture',
|
|
))
|
|
audit = source_db.conn.execute(
|
|
'''SELECT COUNT(*) AS count FROM projection_append_audit
|
|
WHERE job_id = ? AND state = 'quarantined' ''',
|
|
(abandoned_job,),
|
|
).fetchone()
|
|
prepared = source_db.conn.execute(
|
|
"SELECT COUNT(*) AS count FROM projection_appends WHERE job_id = ? AND state = 'prepared'",
|
|
(abandoned_job,),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(audit['count'], 1)
|
|
self.assertEqual(prepared['count'], 0)
|
|
|
|
candidate = source_db.claim_keycheck_candidate('openai', 'integration-provider')
|
|
self.assertIsNotNone(candidate)
|
|
self.assertIsNone(source_db.complete_keycheck_candidate(
|
|
candidate['id'], 'wrong-lease-token', 'a' * 64,
|
|
'DEAD', 'dead', message='must not commit',
|
|
))
|
|
openai_dir = self.keychecks / 'openai'
|
|
ensure_private_directory(str(openai_dir), reject_reparse=True)
|
|
legacy_results = openai_dir / 'openaiResults.jsonl'
|
|
legacy_results.write_text('{"legacy":true}\n', encoding='ascii')
|
|
harden_private_file(str(legacy_results))
|
|
completed = source_db.complete_keycheck_candidate(
|
|
candidate['id'], candidate['lease_token'], 'c' * 64,
|
|
'ALIVE', 'alive', message='integration result',
|
|
metadata={'probe': 'fixture'},
|
|
)
|
|
self.assertTrue(completed['completed'])
|
|
stored_hashes = source_db.conn.execute(
|
|
'SELECT key_hash, secret_hash FROM keycheck_results WHERE id = ?',
|
|
(completed['keycheck_result_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(stored_hashes['key_hash'], candidate['provider_key_hash'])
|
|
self.assertEqual(stored_hashes['secret_hash'], candidate['secret_hash'])
|
|
replay = source_db.complete_keycheck_candidate(
|
|
candidate['id'], candidate['lease_token'], 'c' * 64,
|
|
'ALIVE', 'alive', message='integration result',
|
|
metadata={'probe': 'fixture'},
|
|
)
|
|
self.assertTrue(replay['duplicate'])
|
|
self.assertTrue(projector.process_one())
|
|
current = source_db.conn.execute(
|
|
'''SELECT status, state_version FROM keycheck_current_state
|
|
WHERE credential_id = ?''',
|
|
(candidate['credential_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(current['status'], 'ALIVE')
|
|
self.assertEqual(current['state_version'], 1)
|
|
job_state = source_db.conn.execute(
|
|
'''SELECT status, last_error_detail, required_stream_mask
|
|
FROM projection_jobs WHERE id = ?''',
|
|
(completed['projection_job_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(job_state['status'], 'completed', job_state['last_error_detail'])
|
|
self.assertEqual(job_state['required_stream_mask'], 8)
|
|
self.assertTrue((self.keychecks / 'openai' / 'openaiResults.jsonl').is_file())
|
|
self.assertFalse((self.keychecks / 'openai' / 'openaiChecked.txt').exists())
|
|
self.assertTrue(
|
|
(self.keychecks / 'openai' / 'openaiResults.jsonl')
|
|
.read_text(encoding='utf-8').startswith('{"legacy":true}\n')
|
|
)
|
|
rebuild = rebuild_jsonl_projections(
|
|
source_db, str(self.root / 'full-rebuild'),
|
|
max_rows=100, max_bytes=64 * 1024 * 1024, max_seconds=30,
|
|
)
|
|
self.assertTrue(rebuild['completed'], rebuild)
|
|
self.assertEqual(
|
|
len((self.root / 'full-rebuild' / 'results' / 'scan_results.jsonl')
|
|
.read_text(encoding='utf-8').splitlines()),
|
|
1,
|
|
)
|
|
projector.stop()
|
|
self.assertTrue(ingester.stop())
|
|
finally:
|
|
if projector is not None and projector.lease is not None:
|
|
projector.stop()
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
projector_db.close()
|
|
source_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_known_postgres_occurrences_use_cached_status_except_explicit_retries(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.record_final_cutover({'test': self.id()})
|
|
now = '2026-07-27T00:00:00+00:00'
|
|
cases = (
|
|
(
|
|
'openai', openaiKeycheck, 'OpenAI', 'sk-' + ('a' * 40),
|
|
SimpleNamespace(
|
|
input='forbidden.jsonl', plain=['forbidden.txt'], proxy_file='proxy.txt',
|
|
max_keys=0, retry_network=False, retry_limited=False,
|
|
retry_unknown=False, retry_restricted=False, retry_no_balance=False,
|
|
recheck_all=False,
|
|
),
|
|
'check_authentication', ('dead', 'fixture invalid key'),
|
|
),
|
|
(
|
|
'gemini', geminiKeycheck, 'GoogleAI', 'AIza' + ('A' * 35),
|
|
SimpleNamespace(
|
|
input='forbidden.jsonl', plain=['forbidden.txt'], proxy_file='proxy.txt',
|
|
timeout=1, max_keys=0, probe_generation=False,
|
|
retry_limited=False, retry_unknown=False, retry_network=False,
|
|
retry_valid=False, recheck_all=False, debug=False,
|
|
),
|
|
'check_key', {
|
|
'status': 'INVALID', 'error': {'message': 'fixture invalid key'},
|
|
'models': [], 'model_infos': [], 'notable_models': [],
|
|
'generation_models': [], 'model_class': 'none',
|
|
},
|
|
),
|
|
)
|
|
for service, provider, detector, key, args, probe_name, probe_result in cases:
|
|
credential_hash = hashlib.sha256(f'{service}|{key}'.encode('utf-8')).hexdigest()
|
|
provider_key_hash = hashlib.sha256(key.encode('utf-8')).hexdigest()
|
|
credential_id = db.conn.insert_returning_id(
|
|
'''INSERT INTO keycheck_credentials(
|
|
service, credential_hash, provider_key_hash, candidate_kind,
|
|
secret_text, key_masked, created_at, updated_at
|
|
) VALUES (?, ?, ?, 'provider_key', ?, '***', ?, ?)''',
|
|
(service, credential_hash, provider_key_hash, key, now, now),
|
|
)
|
|
candidate_ids = []
|
|
for occurrence in range(4):
|
|
candidate_uid = hashlib.sha256(
|
|
f'{service}|{credential_id}|{occurrence}'.encode('utf-8')
|
|
).hexdigest()
|
|
metadata_json = json.dumps({
|
|
'recheck_of_status': 'dead',
|
|
'state_version': 1,
|
|
'recheck_generation': 'fixture',
|
|
}) if occurrence == 2 else '{}'
|
|
candidate_ids.append(db.conn.insert_returning_id(
|
|
'''INSERT INTO keycheck_candidates(
|
|
candidate_uid, credential_id, service, secret_hash,
|
|
source, detector_name, metadata_json, state, capacity_bytes,
|
|
created_at, updated_at
|
|
) VALUES (?, ?, ?, ?, ?, ?, ?, 'pending', 1024, ?, ?)''',
|
|
(
|
|
candidate_uid, credential_id, service, provider_key_hash,
|
|
f'fixture:{occurrence}', detector, metadata_json, now, now,
|
|
),
|
|
))
|
|
db.conn.execute(
|
|
'''INSERT INTO pipeline_quarantine(
|
|
subsystem, object_type, object_id, keycheck_candidate_id,
|
|
reason_code, reason_detail, capacity_items, capacity_bytes,
|
|
review_status, detected_at, resolved_at
|
|
) VALUES ('keycheck', 'keycheck_candidate', ?, ?,
|
|
'provider_candidate_unconsumed', 'fixture', 0, 0,
|
|
'approved_retry', ?, ?)''',
|
|
(candidate_ids[3], candidate_ids[3], now, now),
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE pipeline_capacity SET keycheck_items = keycheck_items + 4,
|
|
keycheck_bytes = keycheck_bytes + 4096 WHERE id = 1'''
|
|
)
|
|
db.conn.commit()
|
|
|
|
leaf_common = sys.modules[provider.iter_findings.__module__]
|
|
with ExitStack() as stack:
|
|
stack.enter_context(mock.patch.dict(os.environ, {
|
|
'KEYCHECK_INPUT_MODE': 'postgres', 'KEYCHECK_SERVICE': service,
|
|
}, clear=False))
|
|
stack.enter_context(mock.patch.object(
|
|
provider, 'require_provider_authority', return_value={},
|
|
))
|
|
stack.enter_context(mock.patch.object(provider, 'parse_args', return_value=args))
|
|
stack.enter_context(mock.patch.object(provider, 'load_proxies', return_value=None))
|
|
stack.enter_context(mock.patch.object(
|
|
provider, 'record_cached_keycheck_occurrence',
|
|
side_effect=AssertionError('cached-file path executed'),
|
|
))
|
|
stack.enter_context(mock.patch.object(
|
|
leaf_common, '_postgres_candidate_db', return_value=db,
|
|
))
|
|
stack.enter_context(mock.patch(
|
|
'builtins.open',
|
|
side_effect=AssertionError('provider opened compatibility state'),
|
|
))
|
|
probe = stack.enter_context(mock.patch.object(
|
|
provider, probe_name, return_value=probe_result,
|
|
))
|
|
if service == 'gemini':
|
|
stack.enter_context(mock.patch.object(provider.time, 'sleep'))
|
|
leaf_common._ACTIVE_DB_CANDIDATE = None
|
|
provider.main()
|
|
|
|
candidates = db.conn.execute(
|
|
'''SELECT state, keycheck_result_id FROM keycheck_candidates
|
|
WHERE credential_id = ? ORDER BY id''',
|
|
(credential_id,),
|
|
).fetchall()
|
|
results = db.conn.execute(
|
|
'''SELECT id, candidate_id, event_id, status, status_group,
|
|
checked_at, message, metadata_json, result_source
|
|
FROM keycheck_results
|
|
WHERE credential_id = ? ORDER BY id''',
|
|
(credential_id,),
|
|
).fetchall()
|
|
current = db.conn.execute(
|
|
'''SELECT state_version FROM keycheck_current_state
|
|
WHERE credential_id = ?''',
|
|
(credential_id,),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
[row['state'] for row in candidates],
|
|
['completed', 'completed', 'completed', 'completed'],
|
|
)
|
|
self.assertEqual(len({row['keycheck_result_id'] for row in candidates}), 4)
|
|
self.assertEqual(len(results), 4)
|
|
self.assertEqual(len({row['candidate_id'] for row in results}), 4)
|
|
self.assertEqual(
|
|
[row['result_source'] for row in results],
|
|
['api_check', 'cached_status', 'api_check', 'api_check'],
|
|
)
|
|
self.assertEqual(current['state_version'], 3)
|
|
self.assertEqual(probe.call_count, 3)
|
|
self.assertIsNone(leaf_common._ACTIVE_DB_CANDIDATE)
|
|
cached_result = results[1]
|
|
cached_metadata = json.loads(cached_result['metadata_json'])
|
|
cached_metadata.pop('_event_hash')
|
|
replay = db.complete_keycheck_candidate(
|
|
cached_result['candidate_id'], 'expired-lease', cached_result['event_id'],
|
|
cached_result['status'], cached_result['status_group'],
|
|
checked_at=cached_result['checked_at'], message=cached_result['message'],
|
|
metadata=cached_metadata, result_source='cached_status',
|
|
cached_state_version=cached_metadata['cached_state_version'],
|
|
cached_last_result_id=cached_metadata['cached_result_id'],
|
|
)
|
|
self.assertTrue(replay['duplicate'])
|
|
|
|
capacity = db.pipeline_capacity_snapshot()
|
|
self.assertEqual((capacity['keycheck_items'], capacity['keycheck_bytes']), (0, 0))
|
|
finally:
|
|
db.close()
|
|
|
|
def test_corrupt_bundle_is_quarantined_and_next_event_continues(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(ingester_db, initialize_base=True)
|
|
ingester_db.record_final_cutover({'test': self.id()})
|
|
run_id = source_db.start_run('integration', selected_source='github')
|
|
cycle_id = source_db.start_source_cycle(
|
|
run_id, 'github', 'github', 'integration', 'fixture',
|
|
)
|
|
targets = ['https://example.invalid/corrupt', 'https://example.invalid/valid']
|
|
self.assertEqual(source_db.enqueue_targets('github', 'github', 'fixture', targets), 2)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor', lease_seconds=300,
|
|
).start()
|
|
limits = {
|
|
'bundle_items': 10, 'bundle_bytes': 64 * 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 64 * 1024 * 1024,
|
|
'keycheck_items': 100, 'keycheck_bytes': 16 * 1024 * 1024,
|
|
}
|
|
claims = [
|
|
source_db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(), 'integration-supervisor',
|
|
1024 * 1024, 1024 * 1024, 1, 64 * 1024,
|
|
run_id=run_id, cycle_id=cycle_id, capacity_limits=limits,
|
|
reservation_token=f'corrupt-reservation-{index}',
|
|
bundle_id=f'{index + 10:032x}', scan_event_id=f'{index + 20:032x}',
|
|
)
|
|
for index in range(2)
|
|
]
|
|
corrupt = claims[0]
|
|
ready_path = self.bundle_root.joinpath(*corrupt['ready_relative_path'].split('/'))
|
|
ensure_private_directory(str(ready_path.parent), reject_reparse=True)
|
|
ready_path.write_bytes(b'not-a-result-bundle')
|
|
harden_private_file(str(ready_path))
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
corrupt['reservation_id'], {
|
|
'bundle_id': corrupt['bundle_id'],
|
|
'scan_event_id': corrupt['scan_event_id'],
|
|
'scan_event_hash': hashlib.sha256(b'not-a-result-bundle').hexdigest(),
|
|
'relative_path': corrupt['ready_relative_path'],
|
|
'actual_bytes': ready_path.stat().st_size,
|
|
'frame_count': 1, 'finding_count': 0,
|
|
'error_count': 0, 'candidate_count': 0,
|
|
},
|
|
))
|
|
valid = claims[1]
|
|
staged = stage_result_bundle(
|
|
{
|
|
'scan_event_id': valid['scan_event_id'], 'target': valid['target'],
|
|
'scan_type': 'github', 'timestamp': '2026-07-27T00:00:00+00:00',
|
|
'findings': [], 'errors': [],
|
|
},
|
|
valid, str(self.bundle_root), {}, {'queue_status': 'done'},
|
|
candidate_max_items=1, candidate_max_bytes=64 * 1024,
|
|
)
|
|
quarantine_baseline_items = 9999
|
|
quarantine_baseline_bytes = 1024 * 1024 * 1024 - 1
|
|
source_db.conn.execute(
|
|
'''UPDATE pipeline_capacity SET quarantine_items = ?, quarantine_bytes = ?
|
|
WHERE id = 1''',
|
|
(quarantine_baseline_items, quarantine_baseline_bytes),
|
|
)
|
|
source_db.conn.commit()
|
|
# Simulate a lost ready-notification response; recovery uses the indexed exact path.
|
|
ingester.recover()
|
|
self.assertTrue(ingester.process_one())
|
|
self.assertTrue(ingester.process_one())
|
|
rows = source_db.conn.execute(
|
|
'SELECT target, status FROM target_queue ORDER BY id'
|
|
).fetchall()
|
|
source_db.conn.commit()
|
|
self.assertEqual([row['status'] for row in rows], ['quarantined', 'done'])
|
|
saturated = source_db.pipeline_capacity_snapshot()
|
|
self.assertGreater(saturated['quarantine_items'], 10000)
|
|
self.assertGreater(saturated['quarantine_bytes'], 1024 * 1024 * 1024)
|
|
source_db.enqueue_targets(
|
|
'github', 'github', 'fixture', ['https://example.invalid/blocked-after-poison'],
|
|
)
|
|
self.assertIsNone(source_db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(), 'integration-supervisor',
|
|
1024 * 1024, 1024 * 1024, 1, 64 * 1024,
|
|
run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits=dict(
|
|
limits, quarantine_items=10000,
|
|
quarantine_bytes=1024 * 1024 * 1024,
|
|
),
|
|
reservation_token='blocked-after-poison',
|
|
bundle_id='9' * 32, scan_event_id='8' * 32,
|
|
))
|
|
quarantine = source_db.conn.execute(
|
|
'''SELECT id, reason_code, payload_sha256, source_relative_path
|
|
FROM pipeline_quarantine WHERE subsystem = 'result_ingester' '''
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertIsNotNone(quarantine)
|
|
artifact = source_db.conn.execute(
|
|
'''SELECT id, byte_count, state FROM pipeline_artifacts
|
|
WHERE subsystem = 'result_bundle' AND artifact_kind = 'bundle_quarantine' '''
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(artifact['state'], 'quarantined')
|
|
self.assertGreater(artifact['byte_count'], 0)
|
|
self.assertEqual(
|
|
source_db.conn.execute('SELECT COUNT(*) AS count FROM target_scans').fetchone()['count'],
|
|
1,
|
|
)
|
|
source_db.conn.commit()
|
|
manifest = self.root / 'bundle-quarantine-review.json'
|
|
atomic_write_private_json(str(manifest), {
|
|
'type': 'truf-pipeline-quarantine-review-v1',
|
|
'entries': [{
|
|
'id': quarantine['id'], 'reason_code': quarantine['reason_code'],
|
|
'payload_sha256': quarantine['payload_sha256'], 'action': 'discard',
|
|
}],
|
|
})
|
|
review_pipeline_quarantine_manifest(
|
|
source_db, str(manifest), max_rows=1,
|
|
config={'global': {
|
|
'results_dir': str(self.results),
|
|
'result_bundle_dir': str(self.bundle_root),
|
|
}},
|
|
)
|
|
self.assertFalse(
|
|
(self.bundle_root / Path(quarantine['source_relative_path'])).exists()
|
|
)
|
|
reviewed_capacity = source_db.pipeline_capacity_snapshot()
|
|
self.assertEqual(reviewed_capacity['quarantine_items'], quarantine_baseline_items)
|
|
self.assertEqual(reviewed_capacity['quarantine_bytes'], quarantine_baseline_bytes)
|
|
self.assertTrue(ingester.stop())
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
source_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_offline_review_refuses_conflicting_prepared_bundle_quarantine(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(ingester_db, initialize_base=True)
|
|
ingester_db.record_final_cutover({'test': self.id()})
|
|
run_id = source_db.start_run('integration', selected_source='github')
|
|
cycle_id = source_db.start_source_cycle(
|
|
run_id, 'github', 'github', 'integration', 'fixture',
|
|
)
|
|
source_db.enqueue_targets(
|
|
'github', 'github', 'fixture', ['https://example.invalid/prepared-quarantine'],
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor', lease_seconds=300,
|
|
).start()
|
|
claim = source_db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(), 'integration-supervisor',
|
|
1024 * 1024, 2 * 1024 * 1024, 1, 64 * 1024,
|
|
run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits={
|
|
'bundle_items': 10, 'bundle_bytes': 16 * 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 64 * 1024 * 1024,
|
|
'keycheck_items': 10, 'keycheck_bytes': 1024 * 1024,
|
|
'quarantine_items': 10, 'quarantine_bytes': 16 * 1024 * 1024,
|
|
},
|
|
reservation_token='prepared-quarantine-token',
|
|
bundle_id='3' * 32, scan_event_id='4' * 32,
|
|
)
|
|
staged = stage_result_bundle(
|
|
{
|
|
'scan_event_id': claim['scan_event_id'], 'target': claim['target'],
|
|
'scan_type': 'github', 'timestamp': '2026-07-27T00:00:00+00:00',
|
|
'findings': [], 'errors': [],
|
|
},
|
|
claim, str(self.bundle_root), {}, {'queue_status': 'done'},
|
|
candidate_max_items=1, candidate_max_bytes=64 * 1024,
|
|
)
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
claim['reservation_id'], {
|
|
'bundle_id': staged.bundle_id, 'scan_event_id': staged.scan_event_id,
|
|
'scan_event_hash': staged.scan_event_hash,
|
|
'relative_path': staged.relative_path, 'actual_bytes': staged.actual_bytes,
|
|
'frame_count': staged.frame_count, 'finding_count': staged.finding_count,
|
|
'error_count': staged.error_count, 'candidate_count': staged.candidate_count,
|
|
},
|
|
))
|
|
quarantine_relative = f'quarantine/{claim["bundle_id"][:2]}/{claim["bundle_id"]}.trb'
|
|
ready_path = self.bundle_root.joinpath(*claim['ready_relative_path'].split('/'))
|
|
payload = ready_path.read_bytes()
|
|
payload_hash = hashlib.sha256(payload).hexdigest()
|
|
quarantine_id = source_db.quarantine_result_bundle(
|
|
claim['reservation_id'], 'prepared_fixture', 'fixture move interrupted',
|
|
quarantine_relative, payload_sha256=payload_hash,
|
|
byte_count=len(payload), physical_confirmed=False,
|
|
)
|
|
quarantine_path = self.bundle_root.joinpath(*quarantine_relative.split('/'))
|
|
ensure_private_directory(str(quarantine_path.parent), reject_reparse=True)
|
|
quarantine_path.write_bytes(payload)
|
|
harden_private_file(str(quarantine_path))
|
|
manifest = self.root / 'prepared-quarantine-review.json'
|
|
atomic_write_private_json(str(manifest), {
|
|
'type': 'truf-pipeline-quarantine-review-v1',
|
|
'entries': [{
|
|
'id': quarantine_id, 'reason_code': 'prepared_fixture',
|
|
'payload_sha256': payload_hash, 'action': 'discard',
|
|
}],
|
|
})
|
|
with self.assertRaisesRegex(RuntimeError, 'conflicting physical state'):
|
|
review_pipeline_quarantine_manifest(
|
|
source_db, str(manifest), max_rows=1,
|
|
config={'global': {
|
|
'results_dir': str(self.results),
|
|
'result_bundle_dir': str(self.bundle_root),
|
|
}},
|
|
)
|
|
reservation = source_db.conn.execute(
|
|
'SELECT state FROM result_reservations WHERE id = ?',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
quarantine = source_db.conn.execute(
|
|
'SELECT review_status FROM pipeline_quarantine WHERE id = ?',
|
|
(quarantine_id,),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(reservation['state'], 'ready')
|
|
self.assertEqual(quarantine['review_status'], 'pending')
|
|
self.assertTrue(ready_path.exists())
|
|
self.assertGreater(source_db.pipeline_capacity_snapshot()['quarantine_items'], 0)
|
|
quarantine_path.unlink()
|
|
review_pipeline_quarantine_manifest(
|
|
source_db, str(manifest), max_rows=1,
|
|
config={'global': {
|
|
'results_dir': str(self.results),
|
|
'result_bundle_dir': str(self.bundle_root),
|
|
}},
|
|
)
|
|
final = source_db.conn.execute(
|
|
'SELECT state FROM result_reservations WHERE id = ?',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(final['state'], 'quarantined')
|
|
self.assertFalse(ready_path.exists())
|
|
self.assertFalse(quarantine_path.exists())
|
|
self.assertEqual(source_db.pipeline_capacity_snapshot()['quarantine_items'], 0)
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
source_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_offline_review_retries_valid_bundle_and_ingestion_converges(self):
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(source_db, initialize_base=True)
|
|
source_db.record_final_cutover({'test': self.id()})
|
|
run_id = source_db.start_run('integration', selected_source='github')
|
|
cycle_id = source_db.start_source_cycle(
|
|
run_id, 'github', 'github', 'integration', 'fixture',
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor', lease_seconds=300,
|
|
).start()
|
|
self.assertEqual(source_db.enqueue_targets(
|
|
'github', 'github', 'fixture', ['https://example.invalid/retry-bundle'],
|
|
), 1)
|
|
claim = source_db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(), 'integration-supervisor',
|
|
1024 * 1024, 2 * 1024 * 1024, 1, 64 * 1024,
|
|
run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits={
|
|
'bundle_items': 10, 'bundle_bytes': 64 * 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 64 * 1024 * 1024,
|
|
'keycheck_items': 100, 'keycheck_bytes': 16 * 1024 * 1024,
|
|
'quarantine_items': 100, 'quarantine_bytes': 64 * 1024 * 1024,
|
|
},
|
|
reservation_token='retry-bundle-token',
|
|
bundle_id='5' * 32, scan_event_id='6' * 32,
|
|
)
|
|
staged = stage_result_bundle(
|
|
{
|
|
'scan_event_id': claim['scan_event_id'], 'target': claim['target'],
|
|
'scan_type': 'github', 'timestamp': '2026-07-27T00:00:00+00:00',
|
|
'findings': [], 'errors': [],
|
|
},
|
|
claim, str(self.bundle_root), {}, {'queue_status': 'done'},
|
|
candidate_max_items=1, candidate_max_bytes=64 * 1024,
|
|
)
|
|
ready_path = self.bundle_root.joinpath(*claim['ready_relative_path'].split('/'))
|
|
worker = ResultIngester(source_db, str(self.bundle_root), 'integration-supervisor')
|
|
reservation_row = source_db.conn.execute(
|
|
'SELECT * FROM result_reservations WHERE id = ?',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
quarantine_id = worker.quarantine(
|
|
dict(reservation_row), str(ready_path),
|
|
'bundle_validation_failed', 'transient permission fixture',
|
|
)
|
|
quarantine = source_db.pipeline_quarantine_for_review(quarantine_id)
|
|
manifest = self.root / 'bundle-retry-review.json'
|
|
atomic_write_private_json(str(manifest), {
|
|
'type': 'truf-pipeline-quarantine-review-v1',
|
|
'entries': [{
|
|
'id': quarantine_id,
|
|
'reason_code': quarantine['reason_code'],
|
|
'payload_sha256': quarantine['payload_sha256'],
|
|
'action': 'retry',
|
|
}],
|
|
})
|
|
review_pipeline_quarantine_manifest(
|
|
source_db, str(manifest), max_rows=1,
|
|
config={'global': {
|
|
'results_dir': str(self.results),
|
|
'result_bundle_dir': str(self.bundle_root),
|
|
'result_bundle_max_event_bytes': 192 * 1024 * 1024,
|
|
}},
|
|
)
|
|
reservation_row = source_db.conn.execute(
|
|
'SELECT state FROM result_reservations WHERE id = ?',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
review_row = source_db.conn.execute(
|
|
'SELECT review_status FROM pipeline_quarantine WHERE id = ?',
|
|
(quarantine_id,),
|
|
).fetchone()
|
|
target_after_review = source_db.conn.execute(
|
|
'SELECT status FROM target_queue WHERE id = ?', (claim['queue_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(reservation_row['state'], 'scanning')
|
|
self.assertEqual(review_row['review_status'], 'approved_retry')
|
|
self.assertEqual(target_after_review['status'], 'in_progress')
|
|
self.assertTrue(ready_path.exists())
|
|
|
|
ingester.recover()
|
|
post_recover = source_db.conn.execute(
|
|
'''SELECT r.state,
|
|
(SELECT reason_detail FROM pipeline_quarantine q
|
|
WHERE q.reservation_id = r.id AND q.review_status = 'pending'
|
|
ORDER BY q.id DESC LIMIT 1) AS quarantine_detail
|
|
FROM result_reservations r WHERE r.id = ?''',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(post_recover['state'], 'ready', post_recover['quarantine_detail'])
|
|
self.assertTrue(ingester.process_one())
|
|
target = source_db.conn.execute(
|
|
'SELECT status FROM target_queue WHERE id = ?', (claim['queue_id'],),
|
|
).fetchone()
|
|
final_quarantine = source_db.conn.execute(
|
|
'''SELECT reason_detail FROM pipeline_quarantine
|
|
WHERE reservation_id = ? AND review_status = 'pending'
|
|
ORDER BY id DESC LIMIT 1''',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(
|
|
target['status'], 'done',
|
|
final_quarantine['reason_detail'] if final_quarantine else None,
|
|
)
|
|
self.assertFalse(ready_path.exists())
|
|
capacity = source_db.pipeline_capacity_snapshot()
|
|
self.assertEqual(capacity['quarantine_items'], 0)
|
|
self.assertEqual(capacity['quarantine_bytes'], 0)
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
source_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_updated_target_observation_is_bounded_concurrent_and_claim_fenced(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester_db = None
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.record_final_cutover({'test': self.id()})
|
|
run_id = db.start_run('integration', selected_source='github')
|
|
cycle_id = db.start_source_cycle(
|
|
run_id, 'github', 'github', 'integration', 'fixture',
|
|
)
|
|
base_targets = {
|
|
name: f'https://example.invalid/{name}'
|
|
for name in (
|
|
'legacy', 'unchanged', 'active', 'failed', 'fenced',
|
|
'capped-one', 'capped-two', 'malformed',
|
|
)
|
|
}
|
|
initial = db.observe_discovered_targets(
|
|
'github', 'github', 'fixture',
|
|
[
|
|
{'target': target, 'remote_modified_at': '2025-01-01T00:00:00Z'}
|
|
for target in base_targets.values()
|
|
],
|
|
rescan_limit=1,
|
|
)
|
|
self.assertEqual(initial['queued_new_count'], len(base_targets))
|
|
rows = db.conn.execute(
|
|
'SELECT id, target FROM target_queue WHERE source = ?', ('github',),
|
|
).fetchall()
|
|
ids = {row['target']: int(row['id']) for row in rows}
|
|
db.conn.execute(
|
|
'''UPDATE target_queue SET status = 'done', completed_at = ?,
|
|
scan_remote_modified_at = NULL
|
|
WHERE source = ?''',
|
|
('2025-02-01T00:00:00+00:00', 'github'),
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE target_queue SET scan_remote_modified_at = ? WHERE id = ?''',
|
|
('2025-03-01T00:00:00+00:00', ids[base_targets['unchanged']]),
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE target_queue SET status = 'in_progress', completed_at = NULL,
|
|
lease_owner = 'owner', lease_token = 'token', claim_batch = 'batch',
|
|
leased_at = ?, lease_expires_at = ?, scan_remote_modified_at = ?
|
|
WHERE id = ?''',
|
|
(
|
|
'2025-02-01T00:00:00+00:00', '2027-02-01T00:00:00+00:00',
|
|
'2025-01-01T00:00:00+00:00', ids[base_targets['active']],
|
|
),
|
|
)
|
|
db.conn.execute(
|
|
"UPDATE target_queue SET status = 'failed' WHERE id = ?",
|
|
(ids[base_targets['failed']],),
|
|
)
|
|
db.conn.execute(
|
|
"UPDATE target_queue SET claim_event_id = ? WHERE id = ?",
|
|
('f' * 32, ids[base_targets['fenced']]),
|
|
)
|
|
db.conn.commit()
|
|
|
|
observed = db.observe_discovered_targets(
|
|
'github', 'github', 'fixture',
|
|
[
|
|
{'target': base_targets['legacy'], 'remote_modified_at': '2025-04-01T00:00:00Z'},
|
|
{'target': base_targets['unchanged'], 'remote_modified_at': '2025-03-01T00:00:00Z'},
|
|
{'target': base_targets['active'], 'remote_modified_at': '2025-05-01T00:00:00Z'},
|
|
{'target': base_targets['failed'], 'remote_modified_at': '2025-06-01T00:00:00Z'},
|
|
{'target': base_targets['fenced'], 'remote_modified_at': '2025-06-02T00:00:00Z'},
|
|
{'target': base_targets['capped-one'], 'remote_modified_at': '2025-07-01T00:00:00Z'},
|
|
{'target': base_targets['capped-two'], 'remote_modified_at': '2025-08-01T00:00:00Z'},
|
|
{'target': base_targets['malformed'], 'remote_modified_at': 'not-a-time'},
|
|
],
|
|
rescan_limit=1,
|
|
)
|
|
self.assertEqual(observed['queued_new_count'], 0)
|
|
self.assertEqual(observed['queued_updated_count'], 1)
|
|
states = {
|
|
row['target']: dict(row) for row in db.conn.execute(
|
|
'''SELECT target, status, remote_modified_at, scan_remote_modified_at,
|
|
lease_owner, lease_token, claim_batch
|
|
FROM target_queue WHERE source = ?''',
|
|
('github',),
|
|
).fetchall()
|
|
}
|
|
db.conn.commit()
|
|
self.assertEqual(states[base_targets['capped-two']]['status'], 'pending')
|
|
self.assertEqual(states[base_targets['legacy']]['status'], 'done')
|
|
self.assertEqual(states[base_targets['failed']]['status'], 'failed')
|
|
self.assertEqual(states[base_targets['fenced']]['status'], 'done')
|
|
self.assertEqual(states[base_targets['active']]['status'], 'in_progress')
|
|
self.assertEqual(states[base_targets['active']]['lease_token'], 'token')
|
|
self.assertEqual(
|
|
states[base_targets['active']]['remote_modified_at'],
|
|
'2025-05-01T00:00:00+00:00',
|
|
)
|
|
self.assertEqual(
|
|
states[base_targets['malformed']]['remote_modified_at'],
|
|
'2025-01-01T00:00:00+00:00',
|
|
)
|
|
|
|
second = db.observe_discovered_targets(
|
|
'github', 'github', 'fixture',
|
|
[
|
|
{'target': base_targets['legacy'], 'remote_modified_at': '2025-04-01T00:00:00Z'},
|
|
{'target': base_targets['capped-one'], 'remote_modified_at': '2025-07-01T00:00:00Z'},
|
|
],
|
|
rescan_limit=2,
|
|
)
|
|
self.assertEqual(second['queued_updated_count'], 2)
|
|
|
|
race_target = 'https://example.invalid/race'
|
|
db.observe_discovered_targets(
|
|
'race', 'github', 'fixture',
|
|
[{'target': race_target, 'remote_modified_at': '2025-01-01T00:00:00Z'}],
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE target_queue SET status = 'done', completed_at = ?,
|
|
scan_remote_modified_at = ? WHERE source = ?''',
|
|
('2025-02-01T00:00:00+00:00', '2025-01-01T00:00:00+00:00', 'race'),
|
|
)
|
|
db.conn.commit()
|
|
barrier = threading.Barrier(2)
|
|
outcomes = []
|
|
failures = []
|
|
lock = threading.Lock()
|
|
|
|
def observe_race():
|
|
connection = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
barrier.wait(5)
|
|
result = connection.observe_discovered_targets(
|
|
'race', 'github', 'fixture',
|
|
[{'target': race_target, 'remote_modified_at': '2025-09-01T00:00:00Z'}],
|
|
rescan_limit=1,
|
|
)
|
|
with lock:
|
|
outcomes.append(result['queued_updated_count'])
|
|
except Exception as exc:
|
|
with lock:
|
|
failures.append(exc)
|
|
finally:
|
|
connection.close()
|
|
|
|
threads = [threading.Thread(target=observe_race) for _ in range(2)]
|
|
for thread in threads:
|
|
thread.start()
|
|
for thread in threads:
|
|
thread.join(10)
|
|
self.assertEqual(failures, [])
|
|
self.assertEqual(sorted(outcomes), [0, 1])
|
|
|
|
reversed_targets = [
|
|
'https://example.invalid/reversed-one',
|
|
'https://example.invalid/reversed-two',
|
|
]
|
|
db.observe_discovered_targets(
|
|
'reversed-race', 'github', 'fixture',
|
|
[
|
|
{'target': target, 'remote_modified_at': '2025-01-01T00:00:00Z'}
|
|
for target in reversed_targets
|
|
],
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE target_queue SET status = 'done', completed_at = ?,
|
|
scan_remote_modified_at = ? WHERE source = ?''',
|
|
(
|
|
'2025-02-01T00:00:00+00:00',
|
|
'2025-01-01T00:00:00+00:00', 'reversed-race',
|
|
),
|
|
)
|
|
db.conn.commit()
|
|
barrier = threading.Barrier(2)
|
|
outcomes = []
|
|
failures = []
|
|
|
|
def observe_reversed(reverse):
|
|
connection = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
barrier.wait(5)
|
|
targets = list(reversed(reversed_targets)) if reverse else reversed_targets
|
|
result = connection.observe_discovered_targets(
|
|
'reversed-race', 'github', 'fixture',
|
|
[
|
|
{'target': target, 'remote_modified_at': '2025-09-01T00:00:00Z'}
|
|
for target in targets
|
|
],
|
|
rescan_limit=2,
|
|
)
|
|
with lock:
|
|
outcomes.append(result['queued_updated_count'])
|
|
except Exception as exc:
|
|
with lock:
|
|
failures.append(exc)
|
|
finally:
|
|
connection.close()
|
|
|
|
threads = [
|
|
threading.Thread(target=observe_reversed, args=(False,)),
|
|
threading.Thread(target=observe_reversed, args=(True,)),
|
|
]
|
|
for thread in threads:
|
|
thread.start()
|
|
for thread in threads:
|
|
thread.join(10)
|
|
self.assertEqual(failures, [])
|
|
self.assertEqual(sorted(outcomes), [0, 2])
|
|
|
|
cooldown_target = 'https://example.invalid/cooldown'
|
|
db.observe_discovered_targets(
|
|
'cooldown-source', 'github', 'fixture',
|
|
[{'target': cooldown_target, 'remote_modified_at': '2025-01-01T00:00:00Z'}],
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE target_queue SET status = 'done', completed_at = ?,
|
|
scan_remote_modified_at = ? WHERE source = ?''',
|
|
(
|
|
datetime.now(timezone.utc).isoformat(timespec='seconds'),
|
|
'2025-01-01T00:00:00+00:00', 'cooldown-source',
|
|
),
|
|
)
|
|
db.conn.commit()
|
|
cooldown = db.observe_discovered_targets(
|
|
'cooldown-source', 'github', 'fixture',
|
|
[{'target': cooldown_target, 'remote_modified_at': '2025-09-01T00:00:00Z'}],
|
|
rescan_limit=1, cooldown_seconds=86400,
|
|
)
|
|
self.assertEqual(cooldown['queued_updated_count'], 0)
|
|
cooldown_state = db.conn.execute(
|
|
'SELECT status FROM target_queue WHERE source = ?', ('cooldown-source',),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(cooldown_state['status'], 'done')
|
|
db.conn.execute(
|
|
'''UPDATE target_queue SET completed_at = ?
|
|
WHERE source = ?''',
|
|
(
|
|
(datetime.now(timezone.utc) - timedelta(days=2)).isoformat(timespec='seconds'),
|
|
'cooldown-source',
|
|
),
|
|
)
|
|
db.conn.commit()
|
|
cooldown_elapsed = db.observe_discovered_targets(
|
|
'cooldown-source', 'github', 'fixture',
|
|
[{'target': cooldown_target, 'remote_modified_at': '2025-09-01T00:00:00Z'}],
|
|
rescan_limit=1, cooldown_seconds=86400,
|
|
)
|
|
self.assertEqual(cooldown_elapsed['queued_updated_count'], 1)
|
|
|
|
claim_target = 'https://example.invalid/claim-snapshot'
|
|
db.observe_discovered_targets(
|
|
'claim-source', 'github', 'fixture',
|
|
[{'target': claim_target, 'remote_modified_at': '2026-01-01T00:00:00Z'}],
|
|
)
|
|
claim_cycle = db.start_source_cycle(
|
|
run_id, 'claim-source', 'github', 'integration', 'fixture',
|
|
)
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor', lease_seconds=300,
|
|
).start()
|
|
claim = db.reserve_and_claim_target(
|
|
'claim-source', 'github', current_process_identity(), 'integration-supervisor',
|
|
1024 * 1024, 64 * 1024, 1, 1024,
|
|
run_id=run_id, cycle_id=claim_cycle,
|
|
capacity_limits={
|
|
'bundle_items': 10, 'bundle_bytes': 64 * 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 64 * 1024 * 1024,
|
|
'keycheck_items': 100, 'keycheck_bytes': 16 * 1024 * 1024,
|
|
},
|
|
reservation_token='updated-target-claim',
|
|
bundle_id='c' * 32, scan_event_id='d' * 32,
|
|
)
|
|
self.assertIsNotNone(claim)
|
|
claimed = db.conn.execute(
|
|
'''SELECT status, remote_modified_at, scan_remote_modified_at
|
|
FROM target_queue WHERE id = ?''',
|
|
(claim['queue_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(claimed['status'], 'in_progress')
|
|
self.assertEqual(claimed['remote_modified_at'], claimed['scan_remote_modified_at'])
|
|
|
|
during_scan = db.observe_discovered_targets(
|
|
'claim-source', 'github', 'fixture',
|
|
[{'target': claim_target, 'remote_modified_at': '2027-01-01T00:00:00Z'}],
|
|
rescan_limit=1,
|
|
)
|
|
self.assertEqual(during_scan['queued_updated_count'], 0)
|
|
changed = db.conn.execute(
|
|
'''SELECT status, remote_modified_at, scan_remote_modified_at
|
|
FROM target_queue WHERE id = ?''',
|
|
(claim['queue_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(changed['status'], 'in_progress')
|
|
self.assertEqual(changed['remote_modified_at'], '2027-01-01T00:00:00+00:00')
|
|
self.assertEqual(changed['scan_remote_modified_at'], '2026-01-01T00:00:00+00:00')
|
|
staged = stage_result_bundle(
|
|
{
|
|
'scan_event_id': claim['scan_event_id'],
|
|
'target': claim['target'],
|
|
'scan_type': 'github',
|
|
'timestamp': '2026-08-25T00:00:00+00:00',
|
|
'scan_started_at': '2026-08-25T00:00:00+00:00',
|
|
'duration_sec': 1.0,
|
|
'findings': [],
|
|
'errors': [],
|
|
},
|
|
claim,
|
|
str(self.bundle_root),
|
|
{},
|
|
{'queue_status': 'done', 'queue_error': None, 'available_after': None},
|
|
candidate_max_items=10,
|
|
candidate_max_bytes=1024 * 1024,
|
|
)
|
|
self.assertTrue(db.mark_result_bundle_ready(
|
|
claim['reservation_id'],
|
|
{
|
|
'bundle_id': staged.bundle_id,
|
|
'scan_event_id': staged.scan_event_id,
|
|
'scan_event_hash': staged.scan_event_hash,
|
|
'relative_path': staged.relative_path,
|
|
'actual_bytes': staged.actual_bytes,
|
|
'frame_count': staged.frame_count,
|
|
'finding_count': staged.finding_count,
|
|
'error_count': staged.error_count,
|
|
'candidate_count': staged.candidate_count,
|
|
},
|
|
))
|
|
self.assertTrue(ingester.process_one())
|
|
completed = db.conn.execute(
|
|
'''SELECT status, remote_modified_at, scan_remote_modified_at
|
|
FROM target_queue WHERE id = ?''',
|
|
(claim['queue_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(completed['status'], 'done')
|
|
self.assertEqual(completed['remote_modified_at'], '2027-01-01T00:00:00+00:00')
|
|
self.assertEqual(completed['scan_remote_modified_at'], '2026-01-01T00:00:00+00:00')
|
|
follow_up = db.observe_discovered_targets(
|
|
'claim-source', 'github', 'fixture',
|
|
[{'target': claim_target, 'remote_modified_at': '2027-01-01T00:00:00Z'}],
|
|
rescan_limit=1,
|
|
)
|
|
self.assertEqual(follow_up['queued_updated_count'], 1)
|
|
|
|
legacy_target = 'https://example.invalid/legacy-claim'
|
|
db.observe_discovered_targets(
|
|
'legacy-claim-source', 'github', 'fixture',
|
|
[{'target': legacy_target, 'remote_modified_at': '2026-05-01T00:00:00Z'}],
|
|
)
|
|
legacy_claim = db.claim_targets(
|
|
'legacy-claim-source', 'github', 1, 'legacy-owner', 3600,
|
|
return_rows=True,
|
|
)[0]
|
|
legacy_row = db.conn.execute(
|
|
'SELECT remote_modified_at, scan_remote_modified_at FROM target_queue WHERE id = ?',
|
|
(legacy_claim['id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(legacy_row['remote_modified_at'], legacy_row['scan_remote_modified_at'])
|
|
|
|
db.finish_source_cycle(
|
|
cycle_id, 'completed',
|
|
{'fetched_count': 7, 'queued_new_count': 0, 'queued_updated_count': 3},
|
|
{},
|
|
)
|
|
cycle = db.conn.execute(
|
|
'SELECT queued_updated_count FROM source_cycles WHERE id = ?', (cycle_id,),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(cycle['queued_updated_count'], 3)
|
|
|
|
window_start = datetime(2020, 1, 1, tzinfo=timezone.utc)
|
|
window_end = datetime(2030, 1, 1, tzinfo=timezone.utc)
|
|
dashboard_errors = []
|
|
with mock.patch.object(dashboard, 'DASHBOARD_DB_DIALECT', 'postgres'), \
|
|
mock.patch.object(dashboard.st, 'error', side_effect=dashboard_errors.append):
|
|
summary = dashboard.period_summary_df(db.conn, window_start, window_end)
|
|
activity = dashboard.source_activity_df(db.conn, window_start, window_end)
|
|
self.assertEqual(dashboard_errors, [])
|
|
self.assertIn('queued_new', summary.columns)
|
|
self.assertIn('queued_updated', summary.columns)
|
|
self.assertIn('queued_new', activity.columns)
|
|
self.assertIn('queued_updated', activity.columns)
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
if ingester_db is not None:
|
|
ingester_db.close()
|
|
db.close()
|
|
|
|
def test_updated_target_columns_upgrade_existing_runtime_schema(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.enqueue_targets(
|
|
'legacy-upgrade', 'github', 'fixture',
|
|
['https://example.invalid/historical'],
|
|
)
|
|
run_id = db.start_run('integration', selected_source='legacy-upgrade')
|
|
cycle_id = db.start_source_cycle(
|
|
run_id, 'legacy-upgrade', 'github', 'integration', 'fixture',
|
|
)
|
|
db.conn.execute('DROP INDEX IF EXISTS idx_target_queue_updated_rescan')
|
|
db.conn.execute('ALTER TABLE target_queue DROP COLUMN scan_remote_modified_at')
|
|
db.conn.execute('ALTER TABLE target_queue DROP COLUMN remote_modified_at')
|
|
db.conn.execute('ALTER TABLE source_cycles DROP COLUMN queued_updated_count')
|
|
db.conn.commit()
|
|
|
|
migrate_runtime_safety_schema(db, initialize_base=False)
|
|
target = db.conn.execute(
|
|
'''SELECT status, remote_modified_at, scan_remote_modified_at
|
|
FROM target_queue WHERE source = ?''',
|
|
('legacy-upgrade',),
|
|
).fetchone()
|
|
cycle = db.conn.execute(
|
|
'SELECT queued_updated_count FROM source_cycles WHERE id = ?', (cycle_id,),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(target['status'], 'pending')
|
|
self.assertIsNone(target['remote_modified_at'])
|
|
self.assertIsNone(target['scan_remote_modified_at'])
|
|
self.assertEqual(cycle['queued_updated_count'], 0)
|
|
self.assertTrue(
|
|
db.conn.table_column_details('source_cycles')['queued_updated_count']['not_null']
|
|
)
|
|
self.assertIn(
|
|
'idx_target_queue_updated_rescan', db.conn.table_indexes('target_queue'),
|
|
)
|
|
|
|
migrate_runtime_safety_schema(db, initialize_base=False)
|
|
preserved = db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM target_queue WHERE source = ?',
|
|
('legacy-upgrade',),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(preserved['count'], 1)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_target_claim_order_balances_old_and_fresh_backlog(self):
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(source_db, initialize_base=True)
|
|
source_db.record_final_cutover({'test': self.id()})
|
|
run_id = source_db.start_run('integration', selected_source='package_git')
|
|
cycle_id = source_db.start_source_cycle(
|
|
run_id, 'package_git', 'package_git', 'integration', 'fixture',
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor', lease_seconds=300,
|
|
).start()
|
|
targets = [f'https://example.invalid/repo-{index}' for index in range(4)]
|
|
self.assertEqual(source_db.enqueue_targets(
|
|
'package_git', 'package_git', 'fixture', targets,
|
|
), 4)
|
|
limits = {
|
|
'bundle_items': 10, 'bundle_bytes': 64 * 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 64 * 1024 * 1024,
|
|
'keycheck_items': 100, 'keycheck_bytes': 16 * 1024 * 1024,
|
|
}
|
|
|
|
def claim(label, bundle_id, scan_event_id, order):
|
|
return source_db.reserve_and_claim_target(
|
|
'package_git', 'package_git', current_process_identity(),
|
|
'integration-supervisor', 1024 * 1024, 2 * 1024 * 1024,
|
|
1, 64 * 1024, run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits=limits, reservation_token=label,
|
|
bundle_id=bundle_id, scan_event_id=scan_event_id,
|
|
claim_order=order,
|
|
)
|
|
|
|
self.assertEqual(claim('newest', '1' * 32, 'a' * 32, 'newest')['target'], targets[3])
|
|
self.assertEqual(claim('oldest', '2' * 32, 'b' * 32, 'oldest')['target'], targets[0])
|
|
self.assertEqual(claim('balanced-new', '3' * 32, 'e' * 32, 'balanced')['target'], targets[2])
|
|
self.assertEqual(claim('balanced-old', '4' * 32, 'f' * 32, 'balanced')['target'], targets[1])
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
source_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_concurrent_capacity_claim_is_atomic_and_fenced(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
setup_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(ingester_db, initialize_base=True)
|
|
ingester_db.record_final_cutover({'test': self.id()})
|
|
run_id = setup_db.start_run('integration', selected_source='github')
|
|
cycle_id = setup_db.start_source_cycle(
|
|
run_id, 'github', 'github', 'integration', 'fixture',
|
|
)
|
|
setup_db.enqueue_targets(
|
|
'github', 'github', 'fixture',
|
|
['https://example.invalid/one', 'https://example.invalid/two'],
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor', lease_seconds=300,
|
|
).start()
|
|
barrier = threading.Barrier(2)
|
|
claims = []
|
|
failures = []
|
|
lock = threading.Lock()
|
|
limits = {
|
|
'bundle_items': 1, 'bundle_bytes': 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 16 * 1024 * 1024,
|
|
'keycheck_items': 10, 'keycheck_bytes': 1024 * 1024,
|
|
}
|
|
|
|
def claim():
|
|
connection = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
barrier.wait(5)
|
|
value = connection.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(),
|
|
'integration-supervisor', 1024 * 1024, 64 * 1024, 1, 1024,
|
|
run_id=run_id, cycle_id=cycle_id, capacity_limits=limits,
|
|
reservation_token=f'concurrent-{threading.get_ident()}',
|
|
bundle_id=f'{threading.get_ident():032x}'[-32:],
|
|
scan_event_id=f'{threading.get_ident() + 1000:032x}'[-32:],
|
|
)
|
|
with lock:
|
|
claims.append(value)
|
|
except Exception as exc:
|
|
with lock:
|
|
failures.append(exc)
|
|
finally:
|
|
connection.close()
|
|
|
|
threads = [threading.Thread(target=claim) for _ in range(2)]
|
|
for thread in threads:
|
|
thread.start()
|
|
for thread in threads:
|
|
thread.join(10)
|
|
self.assertEqual(failures, [])
|
|
held = [value for value in claims if value]
|
|
self.assertEqual(len(held), 1)
|
|
capacity = setup_db.pipeline_capacity_snapshot()
|
|
self.assertEqual(capacity['bundle_items'], 1)
|
|
queue = setup_db.conn.execute(
|
|
'SELECT status, current_result_reservation_id FROM target_queue ORDER BY id'
|
|
).fetchall()
|
|
setup_db.conn.commit()
|
|
self.assertEqual(sum(row['status'] == 'in_progress' for row in queue), 1)
|
|
self.assertEqual(
|
|
sum(row['current_result_reservation_id'] is not None for row in queue), 1,
|
|
)
|
|
self.assertTrue(setup_db.refund_uncommitted_reservation(
|
|
held[0]['reservation_id'], current_process_identity(), 'integration refund',
|
|
partial_absence_confirmed=True,
|
|
))
|
|
self.assertEqual(setup_db.pipeline_capacity_snapshot()['bundle_items'], 0)
|
|
next_claim = setup_db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(), 'integration-supervisor',
|
|
1024 * 1024, 64 * 1024, 1, 1024,
|
|
run_id=run_id, cycle_id=cycle_id, capacity_limits=limits,
|
|
reservation_token='next-capacity-reservation',
|
|
bundle_id='a' * 32, scan_event_id='b' * 32,
|
|
)
|
|
self.assertIsNotNone(next_claim)
|
|
self.assertTrue(setup_db.refund_uncommitted_reservation(
|
|
next_claim['reservation_id'], current_process_identity(), 'integration refund',
|
|
partial_absence_confirmed=True,
|
|
))
|
|
blocked_row = setup_db.conn.execute(
|
|
"SELECT id FROM target_queue WHERE status = 'pending' ORDER BY id LIMIT 1"
|
|
).fetchone()
|
|
setup_db.conn.execute(
|
|
'''UPDATE target_queue SET remote_modified_at = ?, scan_remote_modified_at = ?
|
|
WHERE id = ?''',
|
|
(
|
|
'2026-08-25T00:00:00+00:00',
|
|
'2026-08-24T00:00:00+00:00',
|
|
blocked_row['id'],
|
|
),
|
|
)
|
|
setup_db.conn.execute(
|
|
'UPDATE pipeline_capacity SET quarantine_items = 10, quarantine_bytes = 1024 WHERE id = 1'
|
|
)
|
|
setup_db.conn.commit()
|
|
blocked_limits = dict(limits, quarantine_items=10, quarantine_bytes=1024 * 1024)
|
|
self.assertIsNone(setup_db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(), 'integration-supervisor',
|
|
1024 * 1024, 64 * 1024, 1, 1024,
|
|
run_id=run_id, cycle_id=cycle_id, capacity_limits=blocked_limits,
|
|
reservation_token='quarantine-blocked-reservation',
|
|
bundle_id='e' * 32, scan_event_id='f' * 32,
|
|
))
|
|
blocked_after = setup_db.conn.execute(
|
|
'''SELECT status, remote_modified_at, scan_remote_modified_at
|
|
FROM target_queue WHERE id = ?''',
|
|
(blocked_row['id'],),
|
|
).fetchone()
|
|
setup_db.conn.commit()
|
|
self.assertEqual(blocked_after['status'], 'pending')
|
|
self.assertEqual(
|
|
blocked_after['remote_modified_at'], '2026-08-25T00:00:00+00:00',
|
|
)
|
|
self.assertEqual(
|
|
blocked_after['scan_remote_modified_at'], '2026-08-24T00:00:00+00:00',
|
|
)
|
|
self.assertTrue(ingester.stop())
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
setup_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_legacy_raw_result_backfill_is_bounded_and_reconstructable(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
run_id = db.start_run('integration', selected_source='github')
|
|
cycle_id = db.start_source_cycle(run_id, 'github', 'github', 'integration', 'fixture')
|
|
target_scan_id = db.record_target_result(
|
|
run_id, cycle_id, 'github', 'fixture', 'https://example.invalid/legacy',
|
|
{
|
|
'target': 'https://example.invalid/legacy',
|
|
'scan_type': 'github', 'timestamp': '2026-07-27T00:00:00+00:00',
|
|
'findings': [{
|
|
'DetectorName': 'OpenAI', 'Raw': 'sk-legacy-fixture',
|
|
'finding_uid': '9' * 64, 'Verified': False,
|
|
}],
|
|
'errors': ['fixture error'],
|
|
},
|
|
)
|
|
report = backfill_normalized_raw_results(
|
|
db, max_rows=1, max_bytes=1024 * 1024, max_seconds=10,
|
|
)
|
|
self.assertEqual(report['processed'], 1)
|
|
row = db.conn.execute(
|
|
'SELECT raw_result_json, raw_result_storage FROM target_scans WHERE id = ?',
|
|
(target_scan_id,),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertIsNone(row['raw_result_json'])
|
|
self.assertEqual(row['raw_result_storage'], 'normalized_v2')
|
|
rebuilt = db.reconstruct_scan_result(target_scan_id)
|
|
self.assertEqual(rebuilt['findings'][0]['Raw'], 'sk-legacy-fixture')
|
|
self.assertEqual(rebuilt['errors'], ['fixture error'])
|
|
first_marker = db.record_final_cutover({'deployment': 'before'})
|
|
second_marker = db.record_final_cutover({'deployment': 'after'})
|
|
preserved = db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM target_scans WHERE id = ?', (target_scan_id,),
|
|
).fetchone()
|
|
marker_rows = db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM runtime_final_cutover WHERE id = 1'
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertNotEqual(
|
|
first_marker['evidence_sha256'], second_marker['evidence_sha256'],
|
|
)
|
|
self.assertEqual((preserved['count'], marker_rows['count']), (1, 1))
|
|
finally:
|
|
db.close()
|
|
|
|
def test_remote_baseline_global_cap_and_resolved_slot_are_atomic(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.record_final_cutover({'test': self.id()})
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'remote-capacity-supervisor',
|
|
lease_seconds=300,
|
|
).start()
|
|
targets = [
|
|
f'https://github.com/example/remote-capacity-{index}.git'
|
|
for index in range(51)
|
|
]
|
|
self.assertEqual(
|
|
db.enqueue_targets('github', 'github', 'remote-capacity', targets),
|
|
51,
|
|
)
|
|
token_sha256 = hashlib.sha256(b'remote-capacity-token').hexdigest()
|
|
device = db.provision_remote_worker_device(
|
|
'remote-capacity-user', 'remote-capacity-device',
|
|
token_sha256, 51,
|
|
)
|
|
effective, snapshot = self._remote_execution_snapshot()
|
|
limits = {
|
|
'bundle_items': 100, 'bundle_bytes': 512 * 1024 * 1024,
|
|
'projection_items': 100,
|
|
'projection_bytes': 256 * 1024 * 1024,
|
|
'projection_headroom_bytes': 128 * 1024 * 1024,
|
|
'keycheck_items': 131072,
|
|
'keycheck_bytes': 128 * 1024 * 1024,
|
|
'quarantine_items': 100,
|
|
'quarantine_bytes': 512 * 1024 * 1024,
|
|
}
|
|
|
|
def claim(index, label='claim'):
|
|
identity = hashlib.sha256(
|
|
f'{label}:{index}'.encode('ascii')
|
|
).hexdigest()
|
|
return db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(),
|
|
'remote-capacity-supervisor', 64 * 1024 * 1024,
|
|
2 * 1024 * 1024, 0, 0,
|
|
lease_seconds=300, max_attempts=3,
|
|
capacity_limits=limits,
|
|
reservation_token=identity,
|
|
bundle_id=hashlib.sha256(
|
|
f'{label}:bundle:{index}'.encode('ascii')
|
|
).hexdigest(),
|
|
scan_event_id=hashlib.sha256(
|
|
f'{label}:event:{index}'.encode('ascii')
|
|
).hexdigest(),
|
|
final_cutover=True,
|
|
reserved_bundle_bytes=2 * 1024 * 1024,
|
|
remote_max_active=50,
|
|
remote_assignment={
|
|
'user_id': device['user_id'],
|
|
'device_id': device['device_id'],
|
|
'effective_config_sha256': effective,
|
|
'client_compat_sha256': hashlib.sha256(
|
|
f'{label}:client:{index}'.encode('ascii')
|
|
).hexdigest(),
|
|
'token_sha256': token_sha256,
|
|
'result_upload_body_timeout_seconds': 1800,
|
|
'execution_snapshot': snapshot,
|
|
},
|
|
), identity
|
|
|
|
claims = []
|
|
for index in range(50):
|
|
claimed, _identity = claim(index)
|
|
self.assertIsNotNone(claimed)
|
|
claims.append(claimed)
|
|
capacity = db.pipeline_capacity_snapshot()
|
|
self.assertEqual(capacity['bundle_bytes'], 100 * 1024 * 1024)
|
|
self.assertEqual(capacity['projection_bytes'], 100 * 1024 * 1024)
|
|
persisted = db.conn.execute(
|
|
'''SELECT COUNT(*) AS count,
|
|
MIN(declared_bundle_bytes) AS hard_min,
|
|
MAX(declared_bundle_bytes) AS hard_max,
|
|
MIN(reserved_bundle_bytes) AS reserve_min,
|
|
MAX(reserved_bundle_bytes) AS reserve_max
|
|
FROM result_reservations WHERE remote_resolved_at IS NULL'''
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
persisted['count'], persisted['hard_min'],
|
|
persisted['hard_max'], persisted['reserve_min'],
|
|
persisted['reserve_max'],
|
|
),
|
|
(50, 64 * 1024 * 1024, 64 * 1024 * 1024,
|
|
2 * 1024 * 1024, 2 * 1024 * 1024),
|
|
)
|
|
|
|
blocked, blocked_identity = claim(50, 'blocked')
|
|
self.assertIsNone(blocked)
|
|
self.assertEqual(
|
|
db.admission_intent_resolution(blocked_identity),
|
|
'remote_global_quota_closed',
|
|
)
|
|
receipt = db.report_remote_prebundle_failure(
|
|
claims[0]['reservation_id'], device['device_id'], token_sha256,
|
|
{
|
|
'failure_code': 'client_cancelled',
|
|
'detail': 'integration release',
|
|
},
|
|
)
|
|
self.assertEqual(receipt['resolution'], 'prebundle_report')
|
|
replacement, _identity = claim(50, 'replacement')
|
|
self.assertIsNotNone(replacement)
|
|
unresolved = db.conn.execute(
|
|
'''SELECT COUNT(*) AS count FROM result_reservations
|
|
WHERE assignment_kind = 'remote' AND remote_resolved_at IS NULL'''
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(unresolved['count'], 50)
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
ingester_db.close()
|
|
db.close()
|
|
|
|
def test_reserved_bundle_migration_backfills_and_reconciles_active_rows(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.record_final_cutover({'test': self.id()})
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'migration-capacity-supervisor',
|
|
lease_seconds=300,
|
|
).start()
|
|
db.enqueue_targets(
|
|
'github', 'github', 'migration-capacity',
|
|
['https://example.invalid/migration-capacity'],
|
|
)
|
|
claim = db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(),
|
|
'migration-capacity-supervisor', 8 * 1024 * 1024,
|
|
2 * 1024 * 1024, 0, 0,
|
|
capacity_limits={
|
|
'bundle_items': 10, 'bundle_bytes': 64 * 1024 * 1024,
|
|
'projection_items': 10,
|
|
'projection_bytes': 64 * 1024 * 1024,
|
|
'keycheck_items': 10, 'keycheck_bytes': 1024 * 1024,
|
|
},
|
|
reservation_token='migration-capacity-reservation',
|
|
bundle_id='a' * 32, scan_event_id='b' * 32,
|
|
)
|
|
self.assertIsNotNone(claim)
|
|
self.assertTrue(ingester.stop())
|
|
db.conn.execute(
|
|
'ALTER TABLE result_reservations DROP COLUMN reserved_bundle_bytes'
|
|
)
|
|
db.conn.execute(
|
|
'DELETE FROM runtime_schema_migrations WHERE version = ?',
|
|
(REMOTE_ASSIGNMENT_CAPACITY_MIGRATION,),
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE pipeline_capacity SET bundle_items = 0, bundle_bytes = 0,
|
|
projection_items = 0, projection_bytes = 0'''
|
|
)
|
|
db.conn.commit()
|
|
|
|
self.assertTrue(migrate_runtime_safety_schema(db))
|
|
row = db.conn.execute(
|
|
'''SELECT declared_bundle_bytes, reserved_bundle_bytes
|
|
FROM result_reservations WHERE id = ?''',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
nullable = db.conn.execute(
|
|
'''SELECT is_nullable FROM information_schema.columns
|
|
WHERE table_schema = ? AND table_name = 'result_reservations'
|
|
AND column_name = 'reserved_bundle_bytes' ''',
|
|
(db.conn.application_schema,),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
row['reserved_bundle_bytes'], row['declared_bundle_bytes'],
|
|
)
|
|
self.assertEqual(nullable['is_nullable'], 'NO')
|
|
capacity = db.pipeline_capacity_snapshot()
|
|
self.assertEqual(capacity['bundle_items'], 1)
|
|
self.assertEqual(capacity['bundle_bytes'], 8 * 1024 * 1024)
|
|
self.assertEqual(capacity['projection_items'], 1)
|
|
self.assertEqual(capacity['projection_bytes'], 2 * 1024 * 1024)
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
ingester_db.close()
|
|
db.close()
|
|
|
|
def test_projection_capacity_expansion_defers_replays_and_releases_atomically(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
now = scanner_db.utc_now_iso()
|
|
job_id = db.conn.insert_returning_id(
|
|
'''INSERT INTO projection_jobs(
|
|
job_kind, event_id, event_hash, status,
|
|
required_stream_mask, capacity_items, capacity_bytes,
|
|
capacity_released, attempts, lease_generation,
|
|
lease_token, lease_expires_at, created_at, updated_at
|
|
) VALUES ('scan_event', ?, ?, 'leased', 0, 1, 2, 0, 1,
|
|
1, 'projection-capacity-lease',
|
|
'2999-01-01T00:00:00+00:00', ?, ?)''',
|
|
('projection-capacity-event', 'a' * 64, now, now),
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE pipeline_capacity
|
|
SET projection_items = 1, projection_bytes = 2,
|
|
updated_at = ? WHERE id = 1''',
|
|
(now,),
|
|
)
|
|
db.conn.commit()
|
|
|
|
self.assertIs(
|
|
db.expand_projection_job_capacity(
|
|
job_id, 'projection-capacity-lease', 5, 4,
|
|
),
|
|
False,
|
|
)
|
|
deferred = db.conn.execute(
|
|
'''SELECT status, capacity_bytes, lease_token, last_error_code
|
|
FROM projection_jobs WHERE id = ?''',
|
|
(job_id,),
|
|
).fetchone()
|
|
capacity = db.pipeline_capacity_snapshot()
|
|
self.assertEqual(
|
|
(
|
|
deferred['status'], deferred['capacity_bytes'],
|
|
deferred['lease_token'], deferred['last_error_code'],
|
|
capacity['projection_bytes'],
|
|
),
|
|
('pending', 2, None, 'projection_capacity_backpressure', 2),
|
|
)
|
|
|
|
db.conn.execute(
|
|
'''UPDATE projection_jobs
|
|
SET status = 'leased', lease_generation = 2,
|
|
lease_token = 'projection-capacity-retry',
|
|
lease_expires_at = '2999-01-01T00:00:00+00:00'
|
|
WHERE id = ?''',
|
|
(job_id,),
|
|
)
|
|
db.conn.commit()
|
|
expanded = db.expand_projection_job_capacity(
|
|
job_id, 'projection-capacity-retry', 5, 10,
|
|
)
|
|
replayed = db.expand_projection_job_capacity(
|
|
job_id, 'projection-capacity-retry', 5, 10,
|
|
)
|
|
self.assertEqual(expanded['capacity_bytes'], 5)
|
|
self.assertEqual(replayed['capacity_bytes'], 5)
|
|
self.assertEqual(db.pipeline_capacity_snapshot()['projection_bytes'], 5)
|
|
self.assertTrue(db.complete_projection_job(
|
|
job_id, 'projection-capacity-retry',
|
|
))
|
|
self.assertEqual(db.pipeline_capacity_snapshot()['projection_bytes'], 0)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_ambiguous_admission_commit_reuses_exact_caller_identity(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
real_commit = None
|
|
try:
|
|
migrate_runtime_safety_schema(ingester_db, initialize_base=True)
|
|
ingester_db.record_final_cutover({'test': self.id()})
|
|
run_id = source_db.start_run('integration', selected_source='github')
|
|
cycle_id = source_db.start_source_cycle(run_id, 'github', 'github', 'integration', 'fixture')
|
|
source_db.enqueue_targets(
|
|
'github', 'github', 'fixture',
|
|
['https://example.invalid/ambiguous-one', 'https://example.invalid/ambiguous-two'],
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor', lease_seconds=300,
|
|
).start()
|
|
arguments = dict(
|
|
source='github', platform='github',
|
|
producer_identity=current_process_identity(),
|
|
supervisor_instance_id='integration-supervisor',
|
|
declared_bundle_bytes=1024 * 1024, projection_bytes=64 * 1024,
|
|
candidate_items=1, candidate_bytes=1024,
|
|
run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits={
|
|
'bundle_items': 10, 'bundle_bytes': 16 * 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 16 * 1024 * 1024,
|
|
'keycheck_items': 10, 'keycheck_bytes': 1024 * 1024,
|
|
},
|
|
reservation_token='ambiguous-reservation-token',
|
|
bundle_id='3' * 32, scan_event_id='4' * 32,
|
|
)
|
|
factory_calls = {'count': 0}
|
|
|
|
def db_factory(**kwargs):
|
|
connection = ScannerDB(**kwargs)
|
|
factory_calls['count'] += 1
|
|
if factory_calls['count'] == 1:
|
|
original_set_name = connection.set_application_name
|
|
|
|
def set_name_then_arm(value):
|
|
original_set_name(value)
|
|
original_commit = connection.conn.commit
|
|
commit_count = {'value': 0}
|
|
|
|
def ambiguous_commit():
|
|
commit_count['value'] += 1
|
|
original_commit()
|
|
if commit_count['value'] == 2:
|
|
raise OSError('injected admission acknowledgement loss')
|
|
|
|
connection.conn.commit = ambiguous_commit
|
|
return True
|
|
|
|
connection.set_application_name = set_name_then_arm
|
|
return connection
|
|
|
|
admission = reserve_v2_admission_with_recovery(
|
|
self.dsn, arguments['source'], arguments['platform'],
|
|
arguments['producer_identity'].as_dict(),
|
|
arguments['supervisor_instance_id'],
|
|
arguments['declared_bundle_bytes'], arguments['projection_bytes'],
|
|
arguments['candidate_items'], arguments['candidate_bytes'],
|
|
lease_seconds=3600, max_attempts=3,
|
|
capacity_limits=arguments['capacity_limits'], run_id=run_id,
|
|
cycle_id=cycle_id,
|
|
reservation_token=arguments['reservation_token'],
|
|
bundle_id=arguments['bundle_id'], scan_event_id=arguments['scan_event_id'],
|
|
resolution_attempts=3, resolution_seconds=5,
|
|
db_factory=db_factory, stop_requested=lambda: False, sleep=lambda _delay: None,
|
|
)
|
|
self.assertEqual(factory_calls['count'], 2)
|
|
self.assertTrue(admission.permit_released)
|
|
recovered = admission.claim
|
|
self.assertEqual(recovered['reservation_token'], arguments['reservation_token'])
|
|
self.assertEqual(recovered['bundle_id'], arguments['bundle_id'])
|
|
self.assertEqual(source_db.pipeline_capacity_snapshot()['bundle_items'], 1)
|
|
counts = source_db.conn.execute(
|
|
'''SELECT COUNT(*) AS total,
|
|
SUM(CASE WHEN status = 'in_progress' THEN 1 ELSE 0 END) AS active,
|
|
SUM(attempts) AS attempts FROM target_queue'''
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(counts['total'], 2)
|
|
self.assertEqual(counts['active'], 1)
|
|
self.assertEqual(counts['attempts'], 1)
|
|
self.assertTrue(source_db.refund_uncommitted_reservation(
|
|
recovered['reservation_id'], current_process_identity(), 'integration refund',
|
|
partial_absence_confirmed=True,
|
|
))
|
|
finally:
|
|
if real_commit is not None:
|
|
source_db.conn.commit = real_commit
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
source_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_admission_intent_serializes_recovery_behind_late_commit(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
setup_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
original = ScannerDB(db_url=self.dsn, initialize=False)
|
|
recovery = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(ingester_db, initialize_base=True)
|
|
ingester_db.record_final_cutover({'test': self.id()})
|
|
run_id = setup_db.start_run('integration', selected_source='github')
|
|
cycle_id = setup_db.start_source_cycle(
|
|
run_id, 'github', 'github', 'integration', 'fixture',
|
|
)
|
|
setup_db.enqueue_targets(
|
|
'github', 'github', 'fixture', ['https://example.invalid/late-commit'],
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor', lease_seconds=300,
|
|
).start()
|
|
identity = current_process_identity()
|
|
parameters = dict(
|
|
source='github', platform='github', producer_identity=identity,
|
|
supervisor_instance_id='integration-supervisor',
|
|
declared_bundle_bytes=1024 * 1024, projection_bytes=2 * 1024 * 1024,
|
|
candidate_items=1, candidate_bytes=1024,
|
|
run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits={
|
|
'bundle_items': 10, 'bundle_bytes': 16 * 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 64 * 1024 * 1024,
|
|
'keycheck_items': 10, 'keycheck_bytes': 1024 * 1024,
|
|
'quarantine_items': 10, 'quarantine_bytes': 16 * 1024 * 1024,
|
|
},
|
|
reservation_token='late-commit-intent',
|
|
bundle_id='1' * 32, scan_event_id='2' * 32,
|
|
)
|
|
before_commit = threading.Event()
|
|
allow_commit = threading.Event()
|
|
original_result = []
|
|
recovery_result = []
|
|
commit_calls = {'count': 0}
|
|
real_commit = original.conn.commit
|
|
|
|
def delayed_commit():
|
|
commit_calls['count'] += 1
|
|
if commit_calls['count'] == 2:
|
|
before_commit.set()
|
|
self.assertTrue(allow_commit.wait(10))
|
|
real_commit()
|
|
raise OSError('late commit acknowledgement lost')
|
|
return real_commit()
|
|
|
|
original.conn.commit = delayed_commit
|
|
|
|
def submit_original():
|
|
try:
|
|
original_result.append(original.reserve_and_claim_target(**parameters))
|
|
except Exception as exc:
|
|
original_result.append(exc)
|
|
|
|
def submit_recovery():
|
|
try:
|
|
recovery_result.append(recovery.recover_result_reservation_claim(
|
|
parameters['reservation_token'], {
|
|
'bundle_id': parameters['bundle_id'],
|
|
'scan_event_id': parameters['scan_event_id'],
|
|
'source': parameters['source'],
|
|
'platform': parameters['platform'],
|
|
'producer_instance_id': parameters['supervisor_instance_id'],
|
|
'producer_pid': identity.pid,
|
|
'producer_creation_time': identity.creation_time,
|
|
'producer_executable': identity.executable,
|
|
'declared_bundle_bytes': parameters['declared_bundle_bytes'],
|
|
'reserved_bundle_bytes': parameters['declared_bundle_bytes'],
|
|
'reserved_projection_items': 1,
|
|
'reserved_projection_bytes': parameters['projection_bytes'],
|
|
'reserved_candidate_items': parameters['candidate_items'],
|
|
'reserved_candidate_bytes': parameters['candidate_bytes'],
|
|
'run_id': run_id,
|
|
'cycle_id': cycle_id,
|
|
'assignment_kind': 'local',
|
|
'remote_user_id': None,
|
|
'remote_device_id': None,
|
|
'remote_effective_config_sha256': None,
|
|
'remote_client_compat_sha256': None,
|
|
'remote_execution_snapshot_json': None,
|
|
'remote_execution_snapshot_sha256': None,
|
|
},
|
|
))
|
|
except Exception as exc:
|
|
recovery_result.append(exc)
|
|
|
|
original_thread = threading.Thread(target=submit_original)
|
|
original_thread.start()
|
|
self.assertTrue(before_commit.wait(10))
|
|
invisible = setup_db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM result_reservations WHERE reservation_token = ?',
|
|
(parameters['reservation_token'],),
|
|
).fetchone()
|
|
setup_db.conn.commit()
|
|
self.assertEqual(invisible['count'], 0)
|
|
recovery_thread = threading.Thread(target=submit_recovery)
|
|
recovery_thread.start()
|
|
time.sleep(0.2)
|
|
self.assertTrue(recovery_thread.is_alive())
|
|
allow_commit.set()
|
|
original_thread.join(10)
|
|
recovery_thread.join(10)
|
|
self.assertIsInstance(original_result[0], OSError)
|
|
self.assertIsInstance(recovery_result[0], dict)
|
|
rows = setup_db.conn.execute(
|
|
'''SELECT r.id, q.status, i.state AS intent_state
|
|
FROM result_reservations r
|
|
JOIN target_queue q ON q.id = r.queue_id
|
|
JOIN admission_intents i ON i.reservation_token = r.reservation_token
|
|
WHERE r.reservation_token = ?''',
|
|
(parameters['reservation_token'],),
|
|
).fetchall()
|
|
setup_db.conn.commit()
|
|
self.assertEqual(len(rows), 1)
|
|
self.assertEqual((rows[0]['status'], rows[0]['intent_state']), ('in_progress', 'committed'))
|
|
capacity = setup_db.pipeline_capacity_snapshot()
|
|
self.assertEqual((capacity['bundle_items'], capacity['projection_items']), (1, 1))
|
|
self.assertTrue(setup_db.refund_uncommitted_reservation(
|
|
rows[0]['id'], identity, 'integration cleanup', partial_absence_confirmed=True,
|
|
))
|
|
finally:
|
|
allow_commit.set() if 'allow_commit' in locals() else None
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
original.close()
|
|
recovery.close()
|
|
setup_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_discovery_pause_and_provider_admission_serialize_in_both_orders(self):
|
|
setup_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
admission_first = ScannerDB(db_url=self.dsn, initialize=False)
|
|
pause_after = ScannerDB(db_url=self.dsn, initialize=False)
|
|
pause_first = ScannerDB(db_url=self.dsn, initialize=False)
|
|
admission_after = ScannerDB(db_url=self.dsn, initialize=False)
|
|
releases = []
|
|
try:
|
|
migrate_runtime_safety_schema(setup_db, initialize_base=True)
|
|
entered, release = self._arm_delayed_commit(admission_first, 1)
|
|
releases.append(release)
|
|
admission_result = []
|
|
pause_result = []
|
|
|
|
def admit_before_pause():
|
|
try:
|
|
admission_result.append(admission_first.enqueue_targets(
|
|
'github', 'github', 'race',
|
|
['https://example.invalid/discovery-before-pause'],
|
|
discovery_admission=True,
|
|
))
|
|
except Exception as exc:
|
|
admission_result.append(exc)
|
|
|
|
def pause_after_admission():
|
|
try:
|
|
pause_result.append(pause_after.set_runtime_discovery_paused(
|
|
True, expected_revision=0, actor='integration:pause-after',
|
|
operation_id=str(uuid.uuid4()),
|
|
))
|
|
except Exception as exc:
|
|
pause_result.append(exc)
|
|
|
|
admission_thread = threading.Thread(target=admit_before_pause)
|
|
admission_thread.start()
|
|
self.assertTrue(entered.wait(10))
|
|
pause_thread = threading.Thread(target=pause_after_admission)
|
|
pause_thread.start()
|
|
time.sleep(0.2)
|
|
self.assertTrue(pause_thread.is_alive())
|
|
release.set()
|
|
admission_thread.join(10)
|
|
pause_thread.join(10)
|
|
self.assertEqual(admission_result, [1])
|
|
self.assertEqual(len(pause_result), 1)
|
|
self.assertIsInstance(pause_result[0], dict)
|
|
self.assertEqual(pause_result[0]['after']['revision'], 1)
|
|
|
|
resumed = setup_db.set_runtime_discovery_paused(
|
|
False, expected_revision=1, actor='integration:resume',
|
|
operation_id=str(uuid.uuid4()),
|
|
)
|
|
self.assertEqual(resumed['after']['revision'], 2)
|
|
|
|
pause_entered, pause_release = self._arm_delayed_commit(pause_first, 1)
|
|
releases.append(pause_release)
|
|
second_pause = []
|
|
second_admission = []
|
|
|
|
def commit_pause_first():
|
|
try:
|
|
second_pause.append(pause_first.set_runtime_discovery_paused(
|
|
True, expected_revision=2, actor='integration:pause-first',
|
|
operation_id=str(uuid.uuid4()),
|
|
))
|
|
except Exception as exc:
|
|
second_pause.append(exc)
|
|
|
|
def admit_after_pause():
|
|
try:
|
|
second_admission.append(admission_after.enqueue_targets(
|
|
'github', 'github', 'race',
|
|
['https://example.invalid/discovery-after-pause'],
|
|
discovery_admission=True,
|
|
))
|
|
except Exception as exc:
|
|
second_admission.append(exc)
|
|
|
|
pause_thread = threading.Thread(target=commit_pause_first)
|
|
pause_thread.start()
|
|
self.assertTrue(pause_entered.wait(10))
|
|
admission_thread = threading.Thread(target=admit_after_pause)
|
|
admission_thread.start()
|
|
time.sleep(0.2)
|
|
self.assertTrue(admission_thread.is_alive())
|
|
pause_release.set()
|
|
pause_thread.join(10)
|
|
admission_thread.join(10)
|
|
self.assertEqual(len(second_pause), 1)
|
|
self.assertIsInstance(second_pause[0], dict)
|
|
self.assertEqual(len(second_admission), 1)
|
|
self.assertIsInstance(second_admission[0], DiscoveryPausedError)
|
|
|
|
rows = setup_db.conn.execute(
|
|
'''SELECT target FROM target_queue
|
|
WHERE query = 'race' ORDER BY target'''
|
|
).fetchall()
|
|
counts = setup_db.conn.execute(
|
|
'''SELECT
|
|
(SELECT COUNT(*) FROM runtime_operations) AS operations,
|
|
(SELECT COUNT(*) FROM runtime_audit_events) AS audits'''
|
|
).fetchone()
|
|
setup_db.conn.commit()
|
|
self.assertEqual(
|
|
[row['target'] for row in rows],
|
|
['https://example.invalid/discovery-before-pause'],
|
|
)
|
|
self.assertEqual((counts['operations'], counts['audits']), (3, 3))
|
|
state = setup_db.runtime_control_state()
|
|
self.assertEqual(state['revision'], 3)
|
|
self.assertTrue(state['effective_discovery_paused'])
|
|
finally:
|
|
for release in releases:
|
|
release.set()
|
|
admission_after.close()
|
|
pause_first.close()
|
|
pause_after.close()
|
|
admission_first.close()
|
|
setup_db.close()
|
|
|
|
def test_dispatch_pause_and_remote_reservation_serialize_in_both_orders(self):
|
|
setup_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
admission_first = ScannerDB(db_url=self.dsn, initialize=False)
|
|
pause_after = ScannerDB(db_url=self.dsn, initialize=False)
|
|
pause_first = ScannerDB(db_url=self.dsn, initialize=False)
|
|
admission_after = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
releases = []
|
|
try:
|
|
migrate_runtime_safety_schema(setup_db, initialize_base=True)
|
|
setup_db.record_final_cutover({'test': self.id()})
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor',
|
|
lease_seconds=300,
|
|
).start()
|
|
targets = [
|
|
'https://github.com/example/dispatch-before-pause.git',
|
|
'https://github.com/example/dispatch-after-pause.git',
|
|
]
|
|
self.assertEqual(
|
|
setup_db.enqueue_targets('github', 'github', 'dispatch-race', targets),
|
|
2,
|
|
)
|
|
token_sha256 = hashlib.sha256(b'dispatch-race-token').hexdigest()
|
|
device = setup_db.provision_remote_worker_device(
|
|
'dispatch-race-user', 'dispatch-race-device', token_sha256, 2,
|
|
)
|
|
effective, snapshot = self._remote_execution_snapshot()
|
|
|
|
limits = {
|
|
'bundle_items': 2, 'bundle_bytes': 2 * 1024 * 1024,
|
|
'projection_items': 2, 'projection_bytes': 2 * 1024 * 1024,
|
|
'keycheck_items': 2, 'keycheck_bytes': 2 * 1024 * 1024,
|
|
'quarantine_items': 2, 'quarantine_bytes': 2 * 1024 * 1024,
|
|
}
|
|
request_ids = {
|
|
label: {
|
|
'reservation_token': hashlib.sha256(
|
|
f'dispatch-request:{label}'.encode('ascii')
|
|
).hexdigest(),
|
|
'bundle_id': hashlib.sha256(
|
|
f'dispatch-bundle:{label}'.encode('ascii')
|
|
).hexdigest(),
|
|
'scan_event_id': hashlib.sha256(
|
|
f'dispatch-event:{label}'.encode('ascii')
|
|
).hexdigest(),
|
|
}
|
|
for label in ('before', 'after')
|
|
}
|
|
|
|
def claim(database, label):
|
|
identity = request_ids[label]
|
|
return database.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(),
|
|
'integration-supervisor', 1024 * 1024, 1024 * 1024,
|
|
0, 0, lease_seconds=300, max_attempts=3,
|
|
capacity_limits=limits,
|
|
reservation_token=identity['reservation_token'],
|
|
bundle_id=identity['bundle_id'],
|
|
scan_event_id=identity['scan_event_id'],
|
|
claim_order='oldest', final_cutover=True,
|
|
remote_assignment={
|
|
'user_id': device['user_id'],
|
|
'device_id': device['device_id'],
|
|
'effective_config_sha256': effective,
|
|
'client_compat_sha256': hashlib.sha256(
|
|
f'dispatch-client:{label}'.encode('ascii')
|
|
).hexdigest(),
|
|
'token_sha256': token_sha256,
|
|
'result_upload_body_timeout_seconds': 1800,
|
|
'execution_snapshot': snapshot,
|
|
},
|
|
)
|
|
|
|
entered, release = self._arm_delayed_commit(admission_first, 2)
|
|
releases.append(release)
|
|
first_claim = []
|
|
first_pause = []
|
|
|
|
def claim_before_pause():
|
|
try:
|
|
first_claim.append(claim(admission_first, 'before'))
|
|
except Exception as exc:
|
|
first_claim.append(exc)
|
|
|
|
def pause_after_claim():
|
|
try:
|
|
first_pause.append(pause_after.set_runtime_dispatch_paused(
|
|
True, expected_revision=0, actor='integration:dispatch-after',
|
|
operation_id=str(uuid.uuid4()),
|
|
))
|
|
except Exception as exc:
|
|
first_pause.append(exc)
|
|
|
|
claim_thread = threading.Thread(target=claim_before_pause)
|
|
claim_thread.start()
|
|
self.assertTrue(entered.wait(10))
|
|
pause_thread = threading.Thread(target=pause_after_claim)
|
|
pause_thread.start()
|
|
time.sleep(0.2)
|
|
self.assertTrue(pause_thread.is_alive())
|
|
release.set()
|
|
claim_thread.join(10)
|
|
pause_thread.join(10)
|
|
self.assertEqual(len(first_claim), 1)
|
|
self.assertIsInstance(first_claim[0], dict)
|
|
self.assertEqual(first_claim[0]['target'], targets[0])
|
|
self.assertEqual(len(first_pause), 1)
|
|
self.assertIsInstance(first_pause[0], dict)
|
|
|
|
setup_db.set_runtime_dispatch_paused(
|
|
False, expected_revision=1, actor='integration:dispatch-resume',
|
|
operation_id=str(uuid.uuid4()),
|
|
)
|
|
pause_entered, pause_release = self._arm_delayed_commit(pause_first, 1)
|
|
releases.append(pause_release)
|
|
second_pause = []
|
|
second_claim = []
|
|
|
|
def commit_pause_first():
|
|
try:
|
|
second_pause.append(pause_first.set_runtime_dispatch_paused(
|
|
True, expected_revision=2, actor='integration:dispatch-first',
|
|
operation_id=str(uuid.uuid4()),
|
|
))
|
|
except Exception as exc:
|
|
second_pause.append(exc)
|
|
|
|
def claim_after_pause():
|
|
try:
|
|
second_claim.append(claim(admission_after, 'after'))
|
|
except Exception as exc:
|
|
second_claim.append(exc)
|
|
|
|
pause_thread = threading.Thread(target=commit_pause_first)
|
|
pause_thread.start()
|
|
self.assertTrue(pause_entered.wait(10))
|
|
claim_thread = threading.Thread(target=claim_after_pause)
|
|
claim_thread.start()
|
|
time.sleep(0.2)
|
|
self.assertTrue(claim_thread.is_alive())
|
|
pause_release.set()
|
|
pause_thread.join(10)
|
|
claim_thread.join(10)
|
|
self.assertEqual(len(second_pause), 1)
|
|
self.assertIsInstance(second_pause[0], dict)
|
|
self.assertEqual(second_claim, [None])
|
|
|
|
rows = setup_db.conn.execute(
|
|
'''SELECT q.target, q.status, q.attempts,
|
|
q.current_result_reservation_id
|
|
FROM target_queue q WHERE q.query = 'dispatch-race'
|
|
ORDER BY q.target'''
|
|
).fetchall()
|
|
intents = setup_db.conn.execute(
|
|
'''SELECT reservation_token, state, resolution_detail
|
|
FROM admission_intents ORDER BY reservation_token'''
|
|
).fetchall()
|
|
reservations = setup_db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM result_reservations'
|
|
).fetchone()
|
|
setup_db.conn.commit()
|
|
by_target = {row['target']: row for row in rows}
|
|
self.assertEqual(
|
|
(by_target[targets[0]]['status'], by_target[targets[0]]['attempts']),
|
|
('in_progress', 1),
|
|
)
|
|
self.assertEqual(
|
|
(
|
|
by_target[targets[1]]['status'], by_target[targets[1]]['attempts'],
|
|
by_target[targets[1]]['current_result_reservation_id'],
|
|
),
|
|
('pending', 0, None),
|
|
)
|
|
intent_by_token = {row['reservation_token']: row for row in intents}
|
|
self.assertEqual(
|
|
intent_by_token[request_ids['before']['reservation_token']]['state'],
|
|
'committed',
|
|
)
|
|
blocked = intent_by_token[request_ids['after']['reservation_token']]
|
|
self.assertEqual(
|
|
(blocked['state'], blocked['resolution_detail']),
|
|
('aborted', 'dispatch_gate_closed'),
|
|
)
|
|
self.assertEqual(reservations['count'], 1)
|
|
self.assertEqual(setup_db.pipeline_capacity_snapshot()['bundle_items'], 1)
|
|
state = setup_db.runtime_control_state()
|
|
self.assertEqual(state['revision'], 3)
|
|
self.assertTrue(state['effective_dispatch_paused'])
|
|
finally:
|
|
for release in releases:
|
|
release.set()
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
admission_after.close()
|
|
pause_first.close()
|
|
pause_after.close()
|
|
admission_first.close()
|
|
ingester_db.close()
|
|
setup_db.close()
|
|
|
|
def test_concurrent_control_cas_has_one_winner_and_persists_across_reconnect(self):
|
|
setup_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
discovery_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
dispatch_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
operation_ids = {
|
|
'discovery': str(uuid.uuid4()),
|
|
'dispatch': str(uuid.uuid4()),
|
|
}
|
|
actors = {
|
|
'discovery': 'integration:discovery-cas',
|
|
'dispatch': 'integration:dispatch-cas',
|
|
}
|
|
outcomes = {}
|
|
lock = threading.Lock()
|
|
barrier = threading.Barrier(2)
|
|
try:
|
|
migrate_runtime_safety_schema(setup_db, initialize_base=True)
|
|
|
|
def mutate(name, database):
|
|
try:
|
|
barrier.wait(5)
|
|
if name == 'discovery':
|
|
value = database.set_runtime_discovery_paused(
|
|
True, expected_revision=0, actor=actors[name],
|
|
operation_id=operation_ids[name],
|
|
)
|
|
else:
|
|
value = database.set_runtime_dispatch_paused(
|
|
True, expected_revision=0, actor=actors[name],
|
|
operation_id=operation_ids[name],
|
|
)
|
|
except Exception as exc:
|
|
value = exc
|
|
with lock:
|
|
outcomes[name] = value
|
|
|
|
threads = [
|
|
threading.Thread(target=mutate, args=('discovery', discovery_db)),
|
|
threading.Thread(target=mutate, args=('dispatch', dispatch_db)),
|
|
]
|
|
for thread in threads:
|
|
thread.start()
|
|
for thread in threads:
|
|
thread.join(10)
|
|
winners = [name for name, value in outcomes.items() if isinstance(value, dict)]
|
|
losers = [
|
|
name for name, value in outcomes.items()
|
|
if isinstance(value, RuntimeControlRevisionConflictError)
|
|
]
|
|
self.assertEqual((len(winners), len(losers)), (1, 1))
|
|
loser = outcomes[losers[0]]
|
|
self.assertEqual(loser.expected_revision, 0)
|
|
self.assertEqual(loser.current_state['revision'], 1)
|
|
|
|
winner = winners[0]
|
|
missing = losers[0]
|
|
if missing == 'discovery':
|
|
setup_db.set_runtime_discovery_paused(
|
|
True, expected_revision=1, actor=actors[missing],
|
|
operation_id=operation_ids[missing],
|
|
)
|
|
else:
|
|
setup_db.set_runtime_dispatch_paused(
|
|
True, expected_revision=1, actor=actors[missing],
|
|
operation_id=operation_ids[missing],
|
|
)
|
|
counts = setup_db.conn.execute(
|
|
'''SELECT
|
|
(SELECT COUNT(*) FROM runtime_operations) AS operations,
|
|
(SELECT COUNT(*) FROM runtime_audit_events) AS audits'''
|
|
).fetchone()
|
|
setup_db.conn.commit()
|
|
self.assertEqual((counts['operations'], counts['audits']), (2, 2))
|
|
finally:
|
|
dispatch_db.close()
|
|
discovery_db.close()
|
|
setup_db.close()
|
|
|
|
reopened = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
state = reopened.runtime_control_state()
|
|
self.assertEqual(state['revision'], 2)
|
|
self.assertTrue(state['discovery_paused'])
|
|
self.assertTrue(state['dispatch_paused'])
|
|
if winner == 'discovery':
|
|
replay = reopened.set_runtime_discovery_paused(
|
|
True, expected_revision=0, actor=actors[winner],
|
|
operation_id=operation_ids[winner],
|
|
)
|
|
else:
|
|
replay = reopened.set_runtime_dispatch_paused(
|
|
True, expected_revision=0, actor=actors[winner],
|
|
operation_id=operation_ids[winner],
|
|
)
|
|
self.assertTrue(replay['replayed'])
|
|
counts = reopened.conn.execute(
|
|
'''SELECT
|
|
(SELECT COUNT(*) FROM runtime_operations) AS operations,
|
|
(SELECT COUNT(*) FROM runtime_audit_events) AS audits'''
|
|
).fetchone()
|
|
reopened.conn.commit()
|
|
self.assertEqual((counts['operations'], counts['audits']), (2, 2))
|
|
finally:
|
|
reopened.close()
|
|
|
|
def test_runtime_operation_reconciliation_serializes_across_restart_race(self):
|
|
setup_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
running_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
result_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
operation_id = str(uuid.uuid4())
|
|
expected = {
|
|
'active_config_sha256': '1' * 64,
|
|
'active_secrets_sha256': '2' * 64,
|
|
'candidate_config_sha256': '3' * 64,
|
|
'candidate_secrets_sha256': '4' * 64,
|
|
}
|
|
resulting = {
|
|
'active_config_sha256': '3' * 64,
|
|
'active_secrets_sha256': '4' * 64,
|
|
}
|
|
envelope = json.dumps({
|
|
'schema': 1,
|
|
'operation_id': operation_id,
|
|
'action': 'apply-both',
|
|
'result': 'succeeded',
|
|
'safe_category': None,
|
|
'safe_detail': None,
|
|
'resulting_identity': resulting,
|
|
}, sort_keys=True, separators=(',', ':')).encode('utf-8')
|
|
barrier = threading.Barrier(2)
|
|
outcomes = []
|
|
lock = threading.Lock()
|
|
try:
|
|
migrate_runtime_safety_schema(setup_db, initialize_base=True)
|
|
setup_db.create_runtime_operation(
|
|
operation_id=operation_id,
|
|
actor='integration:operation-race',
|
|
action='apply-both',
|
|
expected_identity=expected,
|
|
)
|
|
|
|
def run_transition(kind, database):
|
|
try:
|
|
barrier.wait(5)
|
|
if kind == 'running':
|
|
value = database.mark_runtime_operation_running(operation_id)
|
|
else:
|
|
value = database.reconcile_runtime_operation_result(envelope)
|
|
except Exception as exc:
|
|
value = exc
|
|
with lock:
|
|
outcomes.append((kind, value))
|
|
|
|
threads = [
|
|
threading.Thread(target=run_transition, args=('running', running_db)),
|
|
threading.Thread(target=run_transition, args=('result', result_db)),
|
|
]
|
|
for thread in threads:
|
|
thread.start()
|
|
for thread in threads:
|
|
thread.join(10)
|
|
self.assertFalse(thread.is_alive())
|
|
|
|
by_kind = dict(outcomes)
|
|
self.assertIsInstance(by_kind['result'], dict)
|
|
self.assertEqual(by_kind['result']['status'], 'succeeded')
|
|
running_outcome = by_kind['running']
|
|
self.assertTrue(
|
|
isinstance(running_outcome, dict)
|
|
or isinstance(running_outcome, scanner_db.RuntimeOperationTransitionError)
|
|
)
|
|
finally:
|
|
result_db.close()
|
|
running_db.close()
|
|
setup_db.close()
|
|
|
|
reopened = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
persisted = reopened.runtime_operation(operation_id)
|
|
self.assertEqual(persisted['status'], 'succeeded')
|
|
self.assertEqual(persisted['resulting_identity'], resulting)
|
|
audits = reopened.conn.execute(
|
|
'''SELECT id, result, previous_event_id, previous_event_sha256, event_sha256
|
|
FROM runtime_audit_events WHERE operation_id = ? ORDER BY id''',
|
|
(operation_id,),
|
|
).fetchall()
|
|
reopened.conn.commit()
|
|
self.assertEqual([row['result'] for row in audits], ['accepted', 'succeeded'])
|
|
self.assertEqual(audits[1]['previous_event_id'], audits[0]['id'])
|
|
self.assertEqual(audits[1]['previous_event_sha256'], audits[0]['event_sha256'])
|
|
finally:
|
|
reopened.close()
|
|
|
|
def test_runtime_audit_cursor_pages_survive_restart_and_remain_append_only(self):
|
|
database = ScannerDB(db_url=self.dsn, initialize=False)
|
|
operation_ids = [str(uuid.uuid4()) for _ in range(4)]
|
|
expected = {
|
|
'active_config_sha256': '1' * 64,
|
|
'active_secrets_sha256': '2' * 64,
|
|
'candidate_config_sha256': '3' * 64,
|
|
'candidate_secrets_sha256': None,
|
|
}
|
|
try:
|
|
migrate_runtime_safety_schema(database, initialize_base=True)
|
|
for operation_id in operation_ids:
|
|
database.create_runtime_operation(
|
|
operation_id=operation_id,
|
|
actor='integration:audit-page',
|
|
action='apply-config',
|
|
expected_identity=expected,
|
|
)
|
|
first = database.runtime_audit_events(limit=2)
|
|
self.assertEqual(len(first['events']), 2)
|
|
self.assertEqual(
|
|
[event['operation_id'] for event in first['events']],
|
|
list(reversed(operation_ids[-2:])),
|
|
)
|
|
self.assertIsNotNone(first['next_before_event_id'])
|
|
finally:
|
|
database.close()
|
|
|
|
reopened = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
second = reopened.runtime_audit_events(
|
|
before_event_id=first['next_before_event_id'], limit=2,
|
|
)
|
|
self.assertEqual(
|
|
[event['operation_id'] for event in second['events']],
|
|
list(reversed(operation_ids[:2])),
|
|
)
|
|
self.assertIsNone(second['next_before_event_id'])
|
|
self.assertTrue(
|
|
set(event['id'] for event in first['events']).isdisjoint(
|
|
event['id'] for event in second['events']
|
|
)
|
|
)
|
|
|
|
for statement in (
|
|
"UPDATE runtime_audit_events SET actor = 'tampered'",
|
|
'DELETE FROM runtime_audit_events',
|
|
'TRUNCATE runtime_audit_events',
|
|
):
|
|
with self.subTest(statement=statement), self.assertRaises(Exception):
|
|
reopened.conn.execute(statement)
|
|
reopened.conn.rollback()
|
|
finally:
|
|
reopened.close()
|
|
|
|
def test_managed_file_execution_advisory_lock_blocks_and_releases(self):
|
|
for release_mode in ('explicit', 'session-close'):
|
|
with self.subTest(release_mode=release_mode):
|
|
operation_id = str(uuid.uuid4())
|
|
owner = ScannerDB(db_url=self.dsn, initialize=False)
|
|
started = threading.Event()
|
|
acquired = threading.Event()
|
|
release_contender = threading.Event()
|
|
errors = []
|
|
|
|
owner.acquire_runtime_managed_file_execution(operation_id)
|
|
|
|
def contend():
|
|
contender = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
started.set()
|
|
contender.acquire_runtime_managed_file_execution(operation_id)
|
|
acquired.set()
|
|
if not release_contender.wait(10):
|
|
raise AssertionError(
|
|
'managed file advisory lock release timed out'
|
|
)
|
|
contender.release_runtime_managed_file_execution(operation_id)
|
|
except BaseException as exc:
|
|
errors.append(exc)
|
|
finally:
|
|
contender.close()
|
|
|
|
thread = threading.Thread(target=contend, daemon=True)
|
|
thread.start()
|
|
owner_released = False
|
|
try:
|
|
self.assertTrue(started.wait(5))
|
|
self.assertFalse(acquired.wait(0.2))
|
|
if release_mode == 'explicit':
|
|
owner.release_runtime_managed_file_execution(operation_id)
|
|
else:
|
|
owner.close()
|
|
owner_released = True
|
|
self.assertTrue(acquired.wait(5))
|
|
finally:
|
|
if not owner_released:
|
|
owner.close()
|
|
release_contender.set()
|
|
thread.join(10)
|
|
if release_mode == 'explicit':
|
|
owner.close()
|
|
|
|
self.assertFalse(thread.is_alive())
|
|
self.assertEqual(errors, [])
|
|
|
|
def test_drain_allows_protocol1_upload_and_completes_after_ingestion_commit(self):
|
|
setup_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(setup_db, initialize_base=True)
|
|
setup_db.record_final_cutover({'test': self.id()})
|
|
injected = {'pending': True}
|
|
|
|
def fault(stage, _value):
|
|
if stage == 'after_db_commit' and injected['pending']:
|
|
injected['pending'] = False
|
|
raise RuntimeError('injected remote ingestion acknowledgement loss')
|
|
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor',
|
|
lease_seconds=300, fault=fault,
|
|
).start()
|
|
target = 'https://github.com/example/drain-upload.git'
|
|
self.assertEqual(
|
|
setup_db.enqueue_targets('github', 'github', 'drain-upload', [target]),
|
|
1,
|
|
)
|
|
token_sha256 = hashlib.sha256(b'drain-upload-token').hexdigest()
|
|
device = setup_db.provision_remote_worker_device(
|
|
'drain-upload-user', 'drain-upload-device', token_sha256, 1,
|
|
)
|
|
effective, snapshot = self._remote_execution_snapshot()
|
|
snapshot['compatibility']['protocol_version'] = 1
|
|
reservation_token = hashlib.sha256(b'drain-upload-request').hexdigest()
|
|
bundle_id = hashlib.sha256(b'drain-upload-bundle').hexdigest()
|
|
scan_event_id = hashlib.sha256(b'drain-upload-event').hexdigest()
|
|
declared_bytes = 1024 * 1024
|
|
claim = setup_db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(),
|
|
'integration-supervisor', declared_bytes, declared_bytes,
|
|
0, 0, lease_seconds=300, max_attempts=3,
|
|
capacity_limits={
|
|
'bundle_items': 1, 'bundle_bytes': declared_bytes,
|
|
'projection_items': 2, 'projection_bytes': 2 * declared_bytes,
|
|
'keycheck_items': 2, 'keycheck_bytes': 2 * declared_bytes,
|
|
'quarantine_items': 1, 'quarantine_bytes': declared_bytes,
|
|
},
|
|
reservation_token=reservation_token, bundle_id=bundle_id,
|
|
scan_event_id=scan_event_id, claim_order='oldest',
|
|
final_cutover=True,
|
|
remote_assignment={
|
|
'user_id': device['user_id'],
|
|
'device_id': device['device_id'],
|
|
'effective_config_sha256': effective,
|
|
'client_compat_sha256': hashlib.sha256(
|
|
b'drain-upload-client'
|
|
).hexdigest(),
|
|
'token_sha256': token_sha256,
|
|
'result_upload_body_timeout_seconds': 1800,
|
|
'execution_snapshot': snapshot,
|
|
},
|
|
)
|
|
self.assertIsNotNone(claim)
|
|
resolution = {
|
|
'provider': 'github',
|
|
'repo_url': target,
|
|
'repo_path': 'example/drain-upload',
|
|
'branch': 'main',
|
|
'ref': 'refs/heads/main',
|
|
'head_sha': 'b' * 40,
|
|
'ref_source': 'provider_default',
|
|
}
|
|
plan = setup_db.bind_git_scan_plan(
|
|
claim['reservation_id'], claim['claim_lease_token'], resolution, 100,
|
|
remote_credential={
|
|
'device_id': device['device_id'],
|
|
'token_sha256': token_sha256,
|
|
},
|
|
)
|
|
plan_sha256 = hashlib.sha256(
|
|
canonical_git_scan_plan_bytes(plan)
|
|
).hexdigest()
|
|
exact_scope = {
|
|
key: plan.get(key) for key in (
|
|
'provider', 'ref', 'head_sha', 'base_sha', 'mode',
|
|
'baseline_depth', 'ref_source',
|
|
)
|
|
}
|
|
staged = stage_result_bundle(
|
|
{
|
|
'scan_event_id': claim['scan_event_id'],
|
|
'target': claim['target'],
|
|
'scan_type': 'github',
|
|
'timestamp': '2026-09-19T00:00:00+00:00',
|
|
'scan_started_at': '2026-09-19T00:00:00+00:00',
|
|
'duration_sec': 1.0,
|
|
'findings': [],
|
|
'errors': [],
|
|
'git_scan_plan': plan,
|
|
'git_scan_execution': {
|
|
'mode': plan['mode'],
|
|
'pinned': True,
|
|
'success': True,
|
|
'continuity_reset': False,
|
|
'plan_sha256': plan_sha256,
|
|
},
|
|
'scan_meta': {'exact_git_scope': exact_scope},
|
|
},
|
|
claim, str(self.bundle_root), {},
|
|
{'queue_status': 'done', 'queue_error': None, 'available_after': None},
|
|
candidate_max_items=1, candidate_max_bytes=1024,
|
|
)
|
|
ready_path = self.bundle_root.joinpath(*staged.relative_path.split('/'))
|
|
upload_reader = ResultBundleReader(str(ready_path))
|
|
metadata = upload_reader.validate().as_dict()
|
|
metadata['relative_path'] = staged.relative_path
|
|
upload_diagnostics = upload_reader.effective_diagnostics()
|
|
metadata['effective_diagnostic_projection_version'] = 1
|
|
metadata['effective_diagnostic_count'] = len(upload_diagnostics)
|
|
metadata['effective_diagnostic_uids_sha256'] = (
|
|
worker_contracts.ordered_diagnostic_uid_set_sha256(
|
|
upload_diagnostics
|
|
)
|
|
)
|
|
payload_sha256 = hashlib.sha256(ready_path.read_bytes()).hexdigest()
|
|
acceptance = {
|
|
'device_id': device['device_id'],
|
|
'token_sha256': token_sha256,
|
|
'payload_sha256': payload_sha256,
|
|
}
|
|
|
|
started = setup_db.start_runtime_drain(
|
|
expected_revision=0, actor='integration:drain',
|
|
operation_id=str(uuid.uuid4()),
|
|
)
|
|
self.assertEqual(started['after']['drain_state'], 'draining')
|
|
progress = setup_db.runtime_drain_progress()
|
|
self.assertEqual(
|
|
(
|
|
progress['live_remote_assignments'],
|
|
progress['precommit_result_bundles'],
|
|
progress['blocker_count'],
|
|
),
|
|
(1, 0, 1),
|
|
)
|
|
self.assertTrue(progress['effective_discovery_paused'])
|
|
self.assertTrue(progress['effective_dispatch_paused'])
|
|
|
|
receipt = setup_db.mark_result_bundle_ready(
|
|
claim['reservation_id'], metadata, remote_acceptance=acceptance,
|
|
)
|
|
self.assertEqual(receipt['resolution'], 'bundle_accepted')
|
|
progress = setup_db.runtime_drain_progress()
|
|
self.assertEqual(
|
|
(
|
|
progress['live_remote_assignments'],
|
|
progress['precommit_result_bundles'],
|
|
progress['blocker_count'],
|
|
),
|
|
(0, 1, 1),
|
|
)
|
|
self.assertIsNone(setup_db.reconcile_runtime_drain())
|
|
|
|
with self.assertRaisesRegex(
|
|
RuntimeError, 'remote ingestion acknowledgement loss',
|
|
):
|
|
ingester.process_one()
|
|
progress = setup_db.runtime_drain_progress()
|
|
self.assertEqual(
|
|
(
|
|
progress['live_remote_assignments'],
|
|
progress['precommit_result_bundles'],
|
|
progress['blocker_count'],
|
|
),
|
|
(0, 0, 0),
|
|
)
|
|
completed = setup_db.reconcile_runtime_drain()
|
|
self.assertEqual(completed['action'], 'control.drain.complete')
|
|
self.assertEqual(completed['after']['drain_state'], 'drained')
|
|
self.assertEqual(completed['after']['revision'], 2)
|
|
state = setup_db.runtime_control_state()
|
|
self.assertFalse(state['discovery_paused'])
|
|
self.assertFalse(state['dispatch_paused'])
|
|
self.assertTrue(state['effective_discovery_paused'])
|
|
self.assertTrue(state['effective_dispatch_paused'])
|
|
|
|
replay = setup_db.mark_result_bundle_ready(
|
|
claim['reservation_id'], metadata, remote_acceptance=acceptance,
|
|
)
|
|
self.assertEqual(replay, receipt)
|
|
status = setup_db.remote_assignment_status(
|
|
claim['reservation_id'], device['device_id'], token_sha256,
|
|
)
|
|
self.assertEqual(
|
|
{key: status[key] for key in receipt}, receipt,
|
|
)
|
|
self.assertIn('deadlines', status)
|
|
self.assertIn('latest_progress', status)
|
|
self.assertIn('diagnostics', status)
|
|
ingester.fault = None
|
|
self.assertTrue(ingester.process_one())
|
|
final = setup_db.conn.execute(
|
|
'''SELECT r.state AS reservation_state, b.state AS bundle_state,
|
|
q.status AS queue_status
|
|
FROM result_reservations r
|
|
JOIN result_bundles b ON b.reservation_id = r.id
|
|
JOIN target_queue q ON q.id = r.queue_id
|
|
WHERE r.id = ?''',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
scan_count = setup_db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM target_scans WHERE scan_event_id = ?',
|
|
(claim['scan_event_id'],),
|
|
).fetchone()
|
|
setup_db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
final['reservation_state'], final['bundle_state'],
|
|
final['queue_status'], scan_count['count'],
|
|
),
|
|
('acknowledged', 'acknowledged', 'done', 1),
|
|
)
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
ingester_db.close()
|
|
setup_db.close()
|
|
|
|
def test_production_capacity_allows_three_base_and_one_gated_bonus_admission(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
setup_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
old_limiter = (
|
|
scan_config.max_active_scans,
|
|
scan_config.scan_limiter_db,
|
|
scan_config.opportunistic_scan_slots,
|
|
scan_config.opportunistic_scan_sources,
|
|
)
|
|
leases = []
|
|
try:
|
|
migrate_runtime_safety_schema(ingester_db, initialize_base=True)
|
|
ingester_db.record_final_cutover({'test': self.id()})
|
|
run_id = setup_db.start_run('integration', selected_source='github')
|
|
cycle_id = setup_db.start_source_cycle(
|
|
run_id, 'github', 'github', 'integration', 'fixture',
|
|
)
|
|
setup_db.enqueue_targets(
|
|
'github', 'github', 'fixture',
|
|
[f'https://example.invalid/slot-{index}' for index in range(5)],
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor', lease_seconds=300,
|
|
).start()
|
|
event_bytes = 201326592
|
|
projection_bytes = event_bytes * 2
|
|
projection_limit = 2147483648
|
|
headroom = projection_bytes
|
|
model = validate_v2_capacity_model(
|
|
4, event_bytes, projection_limit, headroom,
|
|
)
|
|
self.assertEqual(model['required_projection_bytes'], 2013265920)
|
|
scan_config.max_active_scans = 3
|
|
scan_config.opportunistic_scan_slots = 1
|
|
scan_config.opportunistic_scan_sources = ['github']
|
|
scan_config.scan_limiter_db = str(self.root / 'production-scan-limiter.db')
|
|
claims = []
|
|
limits = {
|
|
'bundle_items': 10000,
|
|
'bundle_bytes': 3221225472,
|
|
'projection_items': 10000,
|
|
'projection_bytes': projection_limit,
|
|
'keycheck_items': 100000,
|
|
'keycheck_bytes': 536870912,
|
|
'quarantine_items': 10000,
|
|
'quarantine_bytes': 1073741824,
|
|
}
|
|
with mock.patch.object(scanner, 'opportunistic_scan_slot_allowed', return_value=True):
|
|
for index in range(4):
|
|
lease = acquire_scan_slot(
|
|
['integration-production-slot', 'github'], 1800,
|
|
wait=False, start_heartbeat=False,
|
|
)
|
|
self.assertIsNotNone(lease)
|
|
leases.append(lease)
|
|
claims.append(setup_db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(),
|
|
'integration-supervisor', event_bytes, projection_bytes,
|
|
2000, 2097152, run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits=limits,
|
|
reservation_token=f'production-slot-{index}',
|
|
bundle_id=f'{index + 1:032x}',
|
|
scan_event_id=f'{index + 101:032x}',
|
|
))
|
|
fifth_lease = acquire_scan_slot(
|
|
['integration-production-slot', 'github'], 1800,
|
|
wait=False, start_heartbeat=False,
|
|
)
|
|
self.assertIsNone(fifth_lease)
|
|
self.assertEqual(len([claim for claim in claims if claim]), 4)
|
|
capacity = setup_db.pipeline_capacity_snapshot()
|
|
self.assertEqual(capacity['projection_items'], 4)
|
|
self.assertEqual(capacity['projection_bytes'], 4 * projection_bytes)
|
|
self.assertGreaterEqual(
|
|
projection_limit - capacity['projection_bytes'], headroom,
|
|
)
|
|
queue = setup_db.conn.execute(
|
|
'''SELECT status, COUNT(*) AS count FROM target_queue
|
|
GROUP BY status ORDER BY status'''
|
|
).fetchall()
|
|
setup_db.conn.commit()
|
|
self.assertEqual(
|
|
{row['status']: row['count'] for row in queue},
|
|
{'in_progress': 4, 'pending': 1},
|
|
)
|
|
for lease in leases:
|
|
lease.release()
|
|
leases.clear()
|
|
with self.assertRaisesRegex(RuntimeError, 'partial absence'):
|
|
setup_db.refund_uncommitted_reservation(
|
|
claims[0]['reservation_id'], current_process_identity(),
|
|
'unconfirmed cleanup',
|
|
)
|
|
for claim in claims:
|
|
self.assertTrue(setup_db.refund_uncommitted_reservation(
|
|
claim['reservation_id'], current_process_identity(),
|
|
'integration cleanup', partial_absence_confirmed=True,
|
|
))
|
|
old = '2000-01-01T00:00:00+00:00'
|
|
setup_db.conn.execute(
|
|
'''INSERT INTO admission_intents(
|
|
reservation_token, intent_sha256, state, resolution_detail,
|
|
created_at, updated_at, resolved_at
|
|
) VALUES ('retire-aborted', ?, 'aborted', 'fixture', ?, ?, ?),
|
|
('retain-pending', ?, 'pending', 'fixture', ?, ?, NULL)''',
|
|
('1' * 64, old, old, old, '2' * 64, old, old),
|
|
)
|
|
setup_db.conn.execute(
|
|
"UPDATE admission_intents SET resolved_at = ?, updated_at = ? WHERE state = 'committed'",
|
|
(old, old),
|
|
)
|
|
setup_db.conn.execute(
|
|
"UPDATE pipeline_artifacts SET deleted_at = ?, updated_at = ? WHERE state = 'deleted'",
|
|
(old, old),
|
|
)
|
|
protected = setup_db.conn.execute(
|
|
"SELECT id FROM pipeline_artifacts WHERE state = 'deleted' ORDER BY id LIMIT 1"
|
|
).fetchone()
|
|
setup_db.conn.execute(
|
|
'''INSERT INTO pipeline_quarantine(
|
|
subsystem, object_type, object_id, reason_code, reason_detail,
|
|
byte_count, capacity_items, capacity_bytes,
|
|
capacity_credit_applied, review_status, detected_at
|
|
) VALUES ('fixture','projection_tail',?,'fixture','fixture',
|
|
0,0,0,0,'pending',?)''',
|
|
(protected['id'], old),
|
|
)
|
|
setup_db.conn.commit()
|
|
self.assertEqual(setup_db.retire_admission_intents(3600, 100), 1)
|
|
retired_artifacts = setup_db.retire_deleted_pipeline_artifacts(3600, 100)
|
|
intent_states = setup_db.conn.execute(
|
|
'SELECT reservation_token, state FROM admission_intents ORDER BY reservation_token'
|
|
).fetchall()
|
|
protected_row = setup_db.conn.execute(
|
|
'SELECT state FROM pipeline_artifacts WHERE id = ?', (protected['id'],),
|
|
).fetchone()
|
|
intent_summary = setup_db.conn.execute(
|
|
'SELECT retired_count, chain_sha256 FROM admission_intent_retirement WHERE id = 1'
|
|
).fetchone()
|
|
artifact_summary = setup_db.conn.execute(
|
|
'SELECT retired_count, chain_sha256 FROM pipeline_artifact_retirement WHERE id = 1'
|
|
).fetchone()
|
|
setup_db.conn.commit()
|
|
self.assertNotIn('retire-aborted', {row['reservation_token'] for row in intent_states})
|
|
self.assertIn('retain-pending', {row['reservation_token'] for row in intent_states})
|
|
self.assertTrue(any(row['state'] == 'committed' for row in intent_states))
|
|
self.assertIsNotNone(protected_row)
|
|
self.assertGreaterEqual(retired_artifacts, 1)
|
|
self.assertEqual(intent_summary['retired_count'], 1)
|
|
self.assertNotEqual(intent_summary['chain_sha256'], '0' * 64)
|
|
self.assertEqual(artifact_summary['retired_count'], retired_artifacts)
|
|
self.assertNotEqual(artifact_summary['chain_sha256'], '0' * 64)
|
|
finally:
|
|
for lease in leases:
|
|
lease.release()
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
(
|
|
scan_config.max_active_scans,
|
|
scan_config.scan_limiter_db,
|
|
scan_config.opportunistic_scan_slots,
|
|
scan_config.opportunistic_scan_sources,
|
|
) = old_limiter
|
|
setup_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_unknown_partial_blocks_refund_then_dead_producer_recovery_converges(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(ingester_db, initialize_base=True)
|
|
ingester_db.record_final_cutover({'test': self.id()})
|
|
run_id = source_db.start_run('integration', selected_source='github')
|
|
cycle_id = source_db.start_source_cycle(
|
|
run_id, 'github', 'github', 'integration', 'fixture',
|
|
)
|
|
source_db.enqueue_targets(
|
|
'github', 'github', 'fixture', ['https://example.invalid/partial-recovery'],
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor', lease_seconds=300,
|
|
).start()
|
|
identity = current_process_identity()
|
|
claim = source_db.reserve_and_claim_target(
|
|
'github', 'github', identity, 'integration-supervisor',
|
|
1024 * 1024, 2 * 1024 * 1024, 1, 1024,
|
|
run_id=run_id, cycle_id=cycle_id,
|
|
capacity_limits={
|
|
'bundle_items': 10, 'bundle_bytes': 16 * 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 64 * 1024 * 1024,
|
|
'keycheck_items': 10, 'keycheck_bytes': 1024 * 1024,
|
|
'quarantine_items': 10, 'quarantine_bytes': 16 * 1024 * 1024,
|
|
},
|
|
reservation_token='partial-recovery-token',
|
|
bundle_id='6' * 32, scan_event_id='7' * 32,
|
|
)
|
|
from result_bundle import bundle_partial_path, ensure_bundle_reservation_paths
|
|
|
|
ensure_bundle_reservation_paths(str(self.bundle_root), claim)
|
|
partial = bundle_partial_path(
|
|
str(self.bundle_root), claim['bundle_id'], claim['reservation_token'],
|
|
)
|
|
Path(partial).write_bytes(b'incomplete')
|
|
harden_private_file(partial)
|
|
with mock.patch.object(
|
|
console_runner, 'durable_unlink', side_effect=OSError('storage unlink unknown'),
|
|
):
|
|
self.assertFalse(console_runner.refund_v2_claim_after_no_handoff(
|
|
source_db, str(self.bundle_root), claim, identity.as_dict(), 'fixture failure',
|
|
))
|
|
retained = source_db.conn.execute(
|
|
'SELECT state FROM result_reservations WHERE id = ?',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(retained['state'], 'scanning')
|
|
self.assertEqual(source_db.pipeline_capacity_snapshot()['bundle_items'], 1)
|
|
with mock.patch.object(
|
|
result_ingester, 'exact_process_identity_state', return_value='dead',
|
|
):
|
|
ingester.recover()
|
|
recovered = source_db.conn.execute(
|
|
'SELECT state FROM result_reservations WHERE id = ?',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
count = source_db.conn.execute(
|
|
'SELECT COUNT(*) AS count FROM result_reservations'
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(recovered['state'], 'refunded')
|
|
self.assertEqual(count['count'], 1)
|
|
self.assertFalse(os.path.exists(partial))
|
|
self.assertEqual(source_db.pipeline_capacity_snapshot()['bundle_items'], 0)
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
source_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_persistent_cleanup_failure_on_a_does_not_block_bundle_b(self):
|
|
ingester_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
source_db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(ingester_db, initialize_base=True)
|
|
ingester_db.record_final_cutover({'test': self.id()})
|
|
run_id = source_db.start_run('integration', selected_source='github')
|
|
cycle_id = source_db.start_source_cycle(
|
|
run_id, 'github', 'github', 'integration', 'fixture',
|
|
)
|
|
source_db.enqueue_targets(
|
|
'github', 'github', 'fixture',
|
|
['https://example.invalid/cleanup-a', 'https://example.invalid/cleanup-b'],
|
|
)
|
|
ingester = ResultIngester(
|
|
ingester_db, str(self.bundle_root), 'integration-supervisor', lease_seconds=300,
|
|
).start()
|
|
identity = current_process_identity()
|
|
limits = {
|
|
'bundle_items': 10, 'bundle_bytes': 16 * 1024 * 1024,
|
|
'projection_items': 10, 'projection_bytes': 64 * 1024 * 1024,
|
|
'keycheck_items': 10, 'keycheck_bytes': 1024 * 1024,
|
|
'quarantine_items': 10, 'quarantine_bytes': 16 * 1024 * 1024,
|
|
}
|
|
claims = [
|
|
source_db.reserve_and_claim_target(
|
|
'github', 'github', identity, 'integration-supervisor',
|
|
1024 * 1024, 2 * 1024 * 1024, 1, 1024,
|
|
run_id=run_id, cycle_id=cycle_id, capacity_limits=limits,
|
|
reservation_token=f'cleanup-{name}',
|
|
bundle_id=(char * 32), scan_event_id=(event_char * 32),
|
|
)
|
|
for name, char, event_char in (('a', 'a', 'c'), ('b', 'b', 'd'))
|
|
]
|
|
from result_bundle import bundle_partial_path, ensure_bundle_reservation_paths
|
|
|
|
ensure_bundle_reservation_paths(str(self.bundle_root), claims[0])
|
|
partial_a = bundle_partial_path(
|
|
str(self.bundle_root), claims[0]['bundle_id'], claims[0]['reservation_token'],
|
|
)
|
|
Path(partial_a).write_bytes(b'locked-partial')
|
|
harden_private_file(partial_a)
|
|
ensure_bundle_reservation_paths(str(self.bundle_root), claims[1])
|
|
staged_b = stage_result_bundle(
|
|
{
|
|
'scan_event_id': claims[1]['scan_event_id'], 'target': claims[1]['target'],
|
|
'scan_type': 'github', 'timestamp': '2026-07-27T00:00:00+00:00',
|
|
'findings': [], 'errors': [],
|
|
},
|
|
claims[1], str(self.bundle_root), {}, {'queue_status': 'done'},
|
|
candidate_max_items=1, candidate_max_bytes=1024,
|
|
)
|
|
self.assertTrue(source_db.mark_result_bundle_ready(
|
|
claims[1]['reservation_id'], {
|
|
'bundle_id': staged_b.bundle_id, 'scan_event_id': staged_b.scan_event_id,
|
|
'scan_event_hash': staged_b.scan_event_hash,
|
|
'relative_path': staged_b.relative_path, 'actual_bytes': staged_b.actual_bytes,
|
|
'frame_count': staged_b.frame_count, 'finding_count': staged_b.finding_count,
|
|
'error_count': staged_b.error_count, 'candidate_count': staged_b.candidate_count,
|
|
},
|
|
))
|
|
real_unlink = result_ingester.durable_unlink
|
|
|
|
def sharing_violation(path):
|
|
if os.path.normcase(os.path.abspath(path)) == os.path.normcase(os.path.abspath(partial_a)):
|
|
raise OSError('persistent sharing violation')
|
|
return real_unlink(path)
|
|
|
|
with mock.patch.object(
|
|
result_ingester, 'exact_process_identity_state', return_value='dead',
|
|
), mock.patch.object(
|
|
result_ingester, 'durable_unlink', side_effect=sharing_violation,
|
|
):
|
|
ingester.recover()
|
|
self.assertTrue(ingester.process_one())
|
|
states = source_db.conn.execute(
|
|
'''SELECT id, state, cleanup_attempts FROM result_reservations ORDER BY id'''
|
|
).fetchall()
|
|
source_db.conn.commit()
|
|
self.assertEqual(states[0]['state'], 'scanning')
|
|
self.assertGreaterEqual(states[0]['cleanup_attempts'], 1)
|
|
self.assertEqual(states[1]['state'], 'acknowledged')
|
|
self.assertEqual(source_db.pipeline_capacity_snapshot()['bundle_items'], 1)
|
|
source_db.conn.execute(
|
|
'''UPDATE result_reservations SET cleanup_available_after = ? WHERE id = ?''',
|
|
('2000-01-01T00:00:00+00:00', claims[0]['reservation_id']),
|
|
)
|
|
source_db.conn.commit()
|
|
with mock.patch.object(
|
|
result_ingester, 'exact_process_identity_state', return_value='dead',
|
|
):
|
|
ingester.recover()
|
|
final_a = source_db.conn.execute(
|
|
'SELECT state FROM result_reservations WHERE id = ?',
|
|
(claims[0]['reservation_id'],),
|
|
).fetchone()
|
|
source_db.conn.commit()
|
|
self.assertEqual(final_a['state'], 'refunded')
|
|
self.assertEqual(source_db.pipeline_capacity_snapshot()['bundle_items'], 0)
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
source_db.close()
|
|
ingester_db.close()
|
|
|
|
def test_recheck_keyset_cursor_reaches_credentials_after_first_thousand(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
now = '2026-07-27T00:00:00+00:00'
|
|
db.conn.execute(
|
|
'''INSERT INTO keycheck_credentials(
|
|
service, credential_hash, provider_key_hash, candidate_kind,
|
|
secret_text, created_at, updated_at
|
|
) SELECT 'openai', lpad(to_hex(value), 64, '0'),
|
|
lpad(to_hex(value), 64, '0'), 'provider_key',
|
|
'sk-' || value::text, ?, ?
|
|
FROM generate_series(1, 1505) AS value''',
|
|
(now, now),
|
|
)
|
|
db.conn.execute(
|
|
'''INSERT INTO keycheck_results(
|
|
service, status, status_group, checked_at, key_hash, secret_hash,
|
|
key_masked, credential_id, source, query, target, detector_name,
|
|
found_at, finding_uid, result_source, created_at
|
|
) SELECT 'openai', 'DEAD', 'dead', ?, c.provider_key_hash,
|
|
c.provider_key_hash, '***', c.id, 'package_git', 'fixture-query',
|
|
'https://example.invalid/repo', 'OpenAI', ?,
|
|
'fixture-finding-' || c.id::text, 'api_check', ?
|
|
FROM keycheck_credentials c WHERE c.service = 'openai' ORDER BY c.id''',
|
|
(now, now, now),
|
|
)
|
|
db.conn.execute(
|
|
'''INSERT INTO keycheck_current_state(
|
|
credential_id, service, status, status_group, last_result_id,
|
|
result_source, checked_at, state_version, updated_at
|
|
) SELECT c.id, c.service, 'DEAD', 'dead', r.id,
|
|
'api_check', ?, 1, ?
|
|
FROM keycheck_credentials c
|
|
JOIN keycheck_results r ON r.credential_id = c.id
|
|
WHERE c.service = 'openai' ''',
|
|
(now, now),
|
|
)
|
|
db.conn.commit()
|
|
first = db.enqueue_keycheck_rechecks('openai', {'dead'}, max_items=1000)
|
|
second = db.enqueue_keycheck_rechecks('openai', {'dead'}, max_items=1000)
|
|
count = db.conn.execute(
|
|
"SELECT COUNT(*) AS count FROM keycheck_candidates WHERE service = 'openai'"
|
|
).fetchone()
|
|
cursor = db.conn.execute(
|
|
"SELECT last_credential_id FROM keycheck_recheck_cursors WHERE service = 'openai'"
|
|
).fetchone()
|
|
candidate = db.conn.execute(
|
|
'''SELECT source, query, target, detector_name, found_at, finding_uid,
|
|
metadata_json
|
|
FROM keycheck_candidates WHERE service = 'openai' ORDER BY id LIMIT 1'''
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual((first, second, count['count']), (1000, 505, 1505))
|
|
self.assertGreaterEqual(cursor['last_credential_id'], 1505)
|
|
self.assertEqual(candidate['source'], 'package_git')
|
|
self.assertEqual(candidate['query'], 'fixture-query')
|
|
self.assertEqual(candidate['target'], 'https://example.invalid/repo')
|
|
self.assertEqual(candidate['detector_name'], 'OpenAI')
|
|
self.assertEqual(candidate['found_at'], now)
|
|
self.assertTrue(candidate['finding_uid'].startswith('fixture-finding-'))
|
|
self.assertEqual(json.loads(candidate['metadata_json'])['provider_hint'], 'openai')
|
|
finally:
|
|
db.close()
|
|
|
|
def test_resolver_completion_reassigns_to_canonical_provider_atomically(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
now = '2026-08-16T00:00:00+00:00'
|
|
key = 'sk-' + ('r' * 32)
|
|
provider_key_hash = hashlib.sha256(key.encode('utf-8')).hexdigest()
|
|
resolver_hash = hashlib.sha256(
|
|
f'truf-credential-v2|provider_resolver|{key}'.encode('utf-8')
|
|
).hexdigest()
|
|
zai_hash = hashlib.sha256(
|
|
f'truf-credential-v2|zai|{key}'.encode('utf-8')
|
|
).hexdigest()
|
|
resolver_credential_id = db.conn.insert_returning_id(
|
|
'''INSERT INTO keycheck_credentials(
|
|
service, credential_hash, provider_key_hash, candidate_kind,
|
|
secret_text, key_masked, metadata_json, created_at, updated_at
|
|
) VALUES ('provider_resolver', ?, ?, 'provider_key', ?, 'sk-****', '{}', ?, ?)''',
|
|
(resolver_hash, provider_key_hash, key, now, now),
|
|
)
|
|
candidate_id = db.conn.insert_returning_id(
|
|
'''INSERT INTO keycheck_candidates(
|
|
candidate_uid, credential_id, service, routed_service,
|
|
secret_hash, detector_name,
|
|
state, capacity_bytes, created_at, updated_at
|
|
) VALUES (?, ?, 'provider_resolver', 'provider_resolver', ?,
|
|
'DeepSeek', 'pending', 1024, ?, ?)''',
|
|
('9' * 64, resolver_credential_id, provider_key_hash, now, now),
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE pipeline_capacity SET keycheck_items = keycheck_items + 1,
|
|
keycheck_bytes = keycheck_bytes + 1024 WHERE id = 1'''
|
|
)
|
|
db.conn.commit()
|
|
|
|
candidate = db.claim_keycheck_candidate('provider_resolver', 'resolver-test')
|
|
metadata = {
|
|
'resolved_provider': 'zai',
|
|
'provider_resolution': 'matched',
|
|
'authenticated': True,
|
|
'provider_resolution_attempts': [
|
|
{'provider': 'deepseek', 'outcome': 'no_match', 'status': 'DEAD'},
|
|
{'provider': 'zai', 'outcome': 'match', 'status': 'VALID'},
|
|
],
|
|
}
|
|
self.assertIsNone(db.complete_keycheck_candidate(
|
|
candidate_id, 'wrong-fence', 'a' * 64, 'VALID', 'alive',
|
|
metadata=metadata, resolved_service='zai',
|
|
))
|
|
counts = db.conn.execute(
|
|
'''SELECT
|
|
(SELECT COUNT(*) FROM keycheck_credentials WHERE service = 'zai') AS credentials,
|
|
(SELECT COUNT(*) FROM keycheck_results) AS results'''
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual((counts['credentials'], counts['results']), (0, 0))
|
|
|
|
zai_credential_id = db.conn.insert_returning_id(
|
|
'''INSERT INTO keycheck_credentials(
|
|
service, credential_hash, provider_key_hash, candidate_kind,
|
|
secret_text, key_masked, metadata_json, created_at, updated_at
|
|
) VALUES ('zai', ?, ?, 'provider_key', ?, 'sk-****', '{}', ?, ?)''',
|
|
(zai_hash, provider_key_hash, key, now, now),
|
|
)
|
|
db.conn.commit()
|
|
completed = db.complete_keycheck_candidate(
|
|
candidate_id, candidate['lease_token'], 'b' * 64,
|
|
'VALID', 'alive', message='authenticated models=9',
|
|
metadata=metadata, result_source='provider_resolution',
|
|
resolved_service='zai',
|
|
)
|
|
self.assertTrue(completed['completed'])
|
|
|
|
row = db.conn.execute(
|
|
'''SELECT c.state, c.service AS candidate_service, c.routed_service,
|
|
c.credential_id,
|
|
kc.service AS credential_service, r.service AS result_service,
|
|
r.credential_id AS result_credential_id, s.service AS state_service,
|
|
r.result_source
|
|
FROM keycheck_candidates c
|
|
JOIN keycheck_credentials kc ON kc.id = c.credential_id
|
|
JOIN keycheck_results r ON r.id = c.keycheck_result_id
|
|
JOIN keycheck_current_state s ON s.credential_id = c.credential_id
|
|
WHERE c.id = ?''',
|
|
(candidate_id,),
|
|
).fetchone()
|
|
credential_count = db.conn.execute(
|
|
"SELECT COUNT(*) AS count FROM keycheck_credentials WHERE service = 'zai'"
|
|
).fetchone()
|
|
stream = db.conn.execute(
|
|
"SELECT stream_name FROM projection_streams WHERE stream_name = 'keycheck:zai:results'"
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(row['state'], 'completed')
|
|
self.assertEqual(row['candidate_service'], 'zai')
|
|
self.assertEqual(row['routed_service'], 'provider_resolver')
|
|
self.assertEqual(row['credential_service'], 'zai')
|
|
self.assertEqual(row['result_service'], 'zai')
|
|
self.assertEqual(row['state_service'], 'zai')
|
|
self.assertEqual(row['credential_id'], zai_credential_id)
|
|
self.assertEqual(row['result_credential_id'], zai_credential_id)
|
|
self.assertEqual(row['result_source'], 'provider_resolution')
|
|
self.assertEqual(credential_count['count'], 1)
|
|
self.assertIsNotNone(stream)
|
|
|
|
replay = db.complete_keycheck_candidate(
|
|
candidate_id, candidate['lease_token'], 'b' * 64,
|
|
'VALID', 'alive', message='authenticated models=9',
|
|
metadata=metadata, result_source='provider_resolution',
|
|
resolved_service='zai',
|
|
)
|
|
self.assertTrue(replay['duplicate'])
|
|
finally:
|
|
db.close()
|
|
|
|
def test_dense_keycheck_input_has_separate_result_projection_capacity(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
now = '2026-07-27T00:00:00+00:00'
|
|
db.conn.execute(
|
|
'''INSERT INTO keycheck_credentials(
|
|
service, credential_hash, provider_key_hash, candidate_kind,
|
|
secret_text, key_masked, created_at, updated_at
|
|
) SELECT 'xai', lpad(to_hex(value), 64, '0'),
|
|
lpad(to_hex(value), 64, '0'), 'provider_key',
|
|
'xai-' || value::text, '***', ?, ?
|
|
FROM generate_series(1, 2000) AS value''',
|
|
(now, now),
|
|
)
|
|
db.conn.execute(
|
|
'''INSERT INTO keycheck_candidates(
|
|
candidate_uid, credential_id, service, secret_hash, detector_name,
|
|
state, capacity_bytes, created_at, updated_at
|
|
) SELECT lpad(to_hex(c.id + 10000), 64, '0'), c.id, 'xai',
|
|
c.provider_key_hash, 'XAI', 'pending', 1024, ?, ?
|
|
FROM keycheck_credentials c WHERE c.service = 'xai' ''',
|
|
(now, now),
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE pipeline_capacity SET keycheck_items = 2000,
|
|
keycheck_bytes = 2048000,
|
|
projection_items = 10000,
|
|
quarantine_items = 9999,
|
|
quarantine_bytes = 1073741823 WHERE id = 1'''
|
|
)
|
|
db.conn.commit()
|
|
blocked = db.claim_keycheck_candidate(
|
|
'xai', 'capacity-blocked', result_projection_reserve_bytes=3145728,
|
|
projection_max_items=10000, projection_max_bytes=2147483648,
|
|
)
|
|
self.assertTrue(blocked['_capacity_blocked'])
|
|
pending = db.conn.execute(
|
|
"SELECT COUNT(*) AS count FROM keycheck_candidates WHERE state = 'pending'"
|
|
).fetchone()
|
|
db.conn.execute('UPDATE pipeline_capacity SET projection_items = 0 WHERE id = 1')
|
|
db.conn.commit()
|
|
self.assertEqual(pending['count'], 2000)
|
|
poison = db.claim_keycheck_candidate(
|
|
'xai', 'provider-one', result_projection_reserve_bytes=3145728,
|
|
projection_max_items=10000,
|
|
projection_max_bytes=2147483648,
|
|
)
|
|
self.assertEqual(poison['capacity_bytes'], 1024)
|
|
self.assertEqual(poison['result_projection_reserved_bytes'], 3145728)
|
|
self.assertTrue(db.quarantine_keycheck_candidate(
|
|
poison['id'], poison['lease_token'], 'fixture_poison', 'deterministic fixture',
|
|
))
|
|
saturated = db.pipeline_capacity_snapshot()
|
|
self.assertGreater(saturated['quarantine_items'], 10000)
|
|
self.assertGreater(saturated['quarantine_bytes'], 1073741824)
|
|
healthy = db.claim_keycheck_candidate(
|
|
'xai', 'provider-two', result_projection_reserve_bytes=3145728,
|
|
projection_max_items=10000,
|
|
projection_max_bytes=2147483648,
|
|
)
|
|
metadata = {
|
|
'models': [
|
|
{
|
|
'id': f'grok-model-{index}',
|
|
'context_window': 131072,
|
|
'capabilities': ['chat', 'tools', 'vision'],
|
|
}
|
|
for index in range(20)
|
|
],
|
|
'probe': {'accepted': True, 'route': '/v1/models'},
|
|
}
|
|
completed = db.complete_keycheck_candidate(
|
|
healthy['id'], healthy['lease_token'], 'e' * 64,
|
|
'ALIVE', 'alive', message='20 model payload accepted', metadata=metadata,
|
|
)
|
|
self.assertTrue(completed['completed'])
|
|
candidate = db.conn.execute(
|
|
'''SELECT capacity_bytes, result_projection_reserved_bytes,
|
|
result_projection_credit_transferred, state
|
|
FROM keycheck_candidates WHERE id = ?''',
|
|
(healthy['id'],),
|
|
).fetchone()
|
|
job = db.conn.execute(
|
|
'SELECT capacity_bytes, status FROM projection_jobs WHERE id = ?',
|
|
(completed['projection_job_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(candidate['capacity_bytes'], 1024)
|
|
self.assertEqual(candidate['result_projection_reserved_bytes'], 3145728)
|
|
self.assertTrue(candidate['result_projection_credit_transferred'])
|
|
self.assertEqual(candidate['state'], 'completed')
|
|
self.assertGreater(job['capacity_bytes'], 1024)
|
|
self.assertLessEqual(job['capacity_bytes'], 3145728)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_offline_review_retries_keycheck_candidate_with_exact_capacity(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.record_final_cutover({'test': self.id()})
|
|
now = '2026-07-27T00:00:00+00:00'
|
|
credential_id = db.conn.insert_returning_id(
|
|
'''INSERT INTO keycheck_credentials(
|
|
service, credential_hash, provider_key_hash, candidate_kind,
|
|
secret_text, key_masked, created_at, updated_at
|
|
) VALUES ('xai', ?, ?, 'provider_key', 'xai-fixture', '***', ?, ?)''',
|
|
('1' * 64, '2' * 64, now, now),
|
|
)
|
|
candidate_id = db.conn.insert_returning_id(
|
|
'''INSERT INTO keycheck_candidates(
|
|
candidate_uid, credential_id, service, secret_hash, detector_name,
|
|
state, capacity_bytes, created_at, updated_at
|
|
) VALUES (?, ?, 'xai', ?, 'XAI', 'pending', 1024, ?, ?)''',
|
|
('3' * 64, credential_id, '4' * 64, now, now),
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE pipeline_capacity SET keycheck_items = 1,
|
|
keycheck_bytes = 1024 WHERE id = 1'''
|
|
)
|
|
db.conn.commit()
|
|
claimed = db.claim_keycheck_candidate(
|
|
'xai', 'retry-fixture', result_projection_reserve_bytes=3145728,
|
|
projection_max_items=10, projection_max_bytes=64 * 1024 * 1024,
|
|
)
|
|
self.assertEqual(claimed['id'], candidate_id)
|
|
self.assertTrue(db.quarantine_keycheck_candidate(
|
|
candidate_id, claimed['lease_token'],
|
|
'provider_candidate_unconsumed', 'fixture unconsumed candidate',
|
|
))
|
|
quarantine = db.conn.execute(
|
|
'''SELECT * FROM pipeline_quarantine
|
|
WHERE keycheck_candidate_id = ? AND review_status = 'pending' ''',
|
|
(candidate_id,),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
manifest = self.root / 'keycheck-retry-review.json'
|
|
atomic_write_private_json(str(manifest), {
|
|
'type': 'truf-pipeline-quarantine-review-v1',
|
|
'entries': [{
|
|
'id': quarantine['id'],
|
|
'reason_code': quarantine['reason_code'],
|
|
'payload_sha256': quarantine['payload_sha256'],
|
|
'action': 'retry',
|
|
}],
|
|
})
|
|
review_pipeline_quarantine_manifest(
|
|
db, str(manifest), max_rows=1,
|
|
config={'global': {
|
|
'results_dir': str(self.results),
|
|
'result_bundle_dir': str(self.bundle_root),
|
|
}},
|
|
)
|
|
candidate = db.conn.execute(
|
|
'''SELECT state, attempts, capacity_released,
|
|
result_projection_credit_transferred,
|
|
result_projection_reserved_bytes
|
|
FROM keycheck_candidates WHERE id = ?''',
|
|
(candidate_id,),
|
|
).fetchone()
|
|
review = db.conn.execute(
|
|
'SELECT review_status FROM pipeline_quarantine WHERE id = ?',
|
|
(quarantine['id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(candidate['state'], 'pending')
|
|
self.assertEqual(candidate['attempts'], 0)
|
|
self.assertFalse(candidate['capacity_released'])
|
|
self.assertFalse(candidate['result_projection_credit_transferred'])
|
|
self.assertEqual(candidate['result_projection_reserved_bytes'], 0)
|
|
self.assertEqual(review['review_status'], 'approved_retry')
|
|
capacity = db.pipeline_capacity_snapshot()
|
|
self.assertEqual(capacity['keycheck_items'], 1)
|
|
self.assertEqual(capacity['keycheck_bytes'], 1024)
|
|
self.assertEqual(capacity['projection_items'], 0)
|
|
self.assertEqual(capacity['projection_bytes'], 0)
|
|
self.assertEqual(capacity['quarantine_items'], 0)
|
|
self.assertEqual(capacity['quarantine_bytes'], 0)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_v2_backlog_exists_branches_avoid_historical_primary_key_scan(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.conn.execute(
|
|
'''CREATE UNLOGGED TABLE target_queue_plan_fixture (
|
|
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|
source TEXT NOT NULL, platform TEXT NOT NULL, status TEXT NOT NULL,
|
|
current_result_reservation_id BIGINT, available_after TEXT,
|
|
attempts INTEGER NOT NULL DEFAULT 0, resolver_state TEXT
|
|
)'''
|
|
)
|
|
db.conn.execute(
|
|
'''CREATE INDEX fixture_pending ON target_queue_plan_fixture(source, platform, id)
|
|
WHERE status = 'pending' AND current_result_reservation_id IS NULL
|
|
AND (resolver_state IS NULL OR resolver_state = 'resolved')'''
|
|
)
|
|
db.conn.execute(
|
|
'''CREATE INDEX fixture_deferred ON target_queue_plan_fixture(
|
|
source, platform, available_after, id
|
|
) WHERE status = 'deferred' AND current_result_reservation_id IS NULL
|
|
AND (resolver_state IS NULL OR resolver_state = 'resolved')'''
|
|
)
|
|
db.conn.execute(
|
|
'''INSERT INTO target_queue_plan_fixture(source, platform, status)
|
|
SELECT 'history', 'github', 'done' FROM generate_series(1, 1000000)'''
|
|
)
|
|
db.conn.execute(
|
|
'''INSERT INTO target_queue_plan_fixture(
|
|
source, platform, status, available_after, resolver_state
|
|
) VALUES ('fixture','github','pending',NULL,'resolved'),
|
|
('fixture','github','deferred','2020-01-01T00:00:00+00:00','resolved')'''
|
|
)
|
|
db.conn.execute('ANALYZE target_queue_plan_fixture')
|
|
plan_rows = db.conn.execute(
|
|
'EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) '
|
|
+ HAS_CLAIMABLE_TARGETS_V2_SQL.replace(
|
|
'target_queue.id', 'target_queue_plan_fixture.id',
|
|
).replace('FROM target_queue', 'FROM target_queue_plan_fixture'),
|
|
(
|
|
'fixture', 'github', '2026-07-27T00:00:00+00:00', 3, 3,
|
|
'fixture', 'github', '2026-07-27T00:00:00+00:00', 3, 3,
|
|
),
|
|
).fetchall()
|
|
db.conn.commit()
|
|
plan = '\n'.join(str(row['QUERY PLAN']) for row in plan_rows)
|
|
self.assertIn('fixture_pending', plan)
|
|
self.assertIn('fixture_deferred', plan)
|
|
self.assertNotIn('target_queue_plan_fixture_pkey', plan)
|
|
self.assertNotIn('Seq Scan on target_queue_plan_fixture', plan)
|
|
finally:
|
|
db.close()
|
|
|
|
def test_repeated_different_projection_tails_recover_and_cleanup_physically(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
projector = None
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.record_final_cutover({'test': self.id()})
|
|
run_id = db.start_run('integration', selected_source='github')
|
|
cycle_id = db.start_source_cycle(run_id, 'github', 'github', 'integration', 'fixture')
|
|
|
|
def add_scan(target, event_id, event_hash):
|
|
target_scan_id = db.record_target_result(
|
|
run_id, cycle_id, 'github', 'fixture', target,
|
|
{
|
|
'target': target, 'scan_type': 'github',
|
|
'timestamp': '2026-07-27T00:00:00+00:00',
|
|
'findings': [], 'errors': [],
|
|
},
|
|
)
|
|
backfill_normalized_raw_results(db, max_rows=1, max_bytes=1024 * 1024)
|
|
db.conn.execute(
|
|
'''UPDATE pipeline_capacity SET projection_items = projection_items + 1,
|
|
projection_bytes = projection_bytes + ? WHERE id = 1''',
|
|
(4 * 1024 * 1024,),
|
|
)
|
|
job_id = db.conn.insert_returning_id(
|
|
'''INSERT INTO projection_jobs(
|
|
job_kind, event_id, event_hash, target_scan_id, status,
|
|
required_stream_mask, capacity_items, capacity_bytes,
|
|
created_at, updated_at
|
|
) VALUES ('scan_event', ?, ?, ?, 'pending', 1, 1, ?, ?, ?)''',
|
|
(
|
|
event_id, event_hash, target_scan_id, 4 * 1024 * 1024,
|
|
'2026-07-27T00:00:00+00:00', '2026-07-27T00:00:00+00:00',
|
|
),
|
|
)
|
|
db.conn.commit()
|
|
return job_id
|
|
|
|
first_job = add_scan('https://example.invalid/tail-one', 'a' * 64, 'b' * 64)
|
|
second_job = add_scan('https://example.invalid/tail-two', 'c' * 64, 'd' * 64)
|
|
projector = JsonlProjector(
|
|
db, str(self.results), 'integration-supervisor', lease_seconds=300,
|
|
keycheck_dir=str(self.keychecks),
|
|
quarantine_max_items=100, quarantine_max_bytes=16 * 1024 * 1024,
|
|
).start()
|
|
claimed = db.claim_projection_job(
|
|
projector.lease['generation'], projector.lease['lease_token'], 300,
|
|
)
|
|
self.assertEqual(claimed['id'], first_job)
|
|
streams = projector._serialize(claimed)
|
|
serialized = streams[0]
|
|
state = db.projection_stream_state('scan_results')
|
|
append = db.prepare_projection_append(
|
|
claimed['id'], claimed['lease_token'], 'scan_results', state['generation'],
|
|
serialized.byte_length, serialized.payload_sha256, serialized.record_count,
|
|
)
|
|
active = projector._results_path(state['base_relative_path'], 'scan_results')
|
|
projector._create_private_empty(active)
|
|
quarantine_baseline_items = 99
|
|
quarantine_baseline_bytes = 16 * 1024 * 1024 - 1
|
|
db.conn.execute(
|
|
'UPDATE pipeline_capacity SET quarantine_items = ?, quarantine_bytes = ? WHERE id = 1',
|
|
(quarantine_baseline_items, quarantine_baseline_bytes),
|
|
)
|
|
db.conn.commit()
|
|
|
|
def fail_after_recovery(stage, _value):
|
|
if stage == 'after_tail_recovery':
|
|
raise RuntimeError('injected repeated tail recovery crash')
|
|
|
|
projector.fault = fail_after_recovery
|
|
for partial in (b'first-partial', b'second-different-partial'):
|
|
with open(active, 'ab', buffering=0) as handle:
|
|
handle.write(partial)
|
|
handle.flush()
|
|
os.fsync(handle.fileno())
|
|
with self.assertRaisesRegex(RuntimeError, 'repeated tail recovery crash'):
|
|
projector._append_stream(claimed, serialized)
|
|
self.assertEqual(os.path.getsize(active), int(append['byte_offset']))
|
|
|
|
projector.fault = None
|
|
projector._append_stream(claimed, serialized)
|
|
self.assertTrue(db.complete_projection_job(claimed['id'], claimed['lease_token']))
|
|
projector.reconcile_terminal_temps()
|
|
self.assertFalse(os.path.exists(serialized.path))
|
|
tail_rows = db.conn.execute(
|
|
'''SELECT q.id, q.reason_code, q.payload_sha256, q.source_relative_path
|
|
FROM pipeline_quarantine q
|
|
WHERE q.object_type = 'projection_tail' ORDER BY q.id'''
|
|
).fetchall()
|
|
db.conn.commit()
|
|
self.assertEqual(len(tail_rows), 2)
|
|
self.assertEqual(len({row['source_relative_path'] for row in tail_rows}), 2)
|
|
saturated = db.pipeline_capacity_snapshot()
|
|
self.assertGreater(saturated['quarantine_items'], 100)
|
|
self.assertGreater(saturated['quarantine_bytes'], 16 * 1024 * 1024)
|
|
|
|
self.assertTrue(projector.process_one())
|
|
second_state = db.conn.execute(
|
|
'SELECT status FROM projection_jobs WHERE id = ?', (second_job,),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(second_state['status'], 'completed')
|
|
|
|
manifest_path = self.root / 'quarantine-review.json'
|
|
atomic_write_private_json(str(manifest_path), {
|
|
'type': 'truf-pipeline-quarantine-review-v1',
|
|
'entries': [
|
|
{
|
|
'id': row['id'], 'reason_code': row['reason_code'],
|
|
'payload_sha256': row['payload_sha256'], 'action': 'discard',
|
|
}
|
|
for row in tail_rows
|
|
],
|
|
})
|
|
review_pipeline_quarantine_manifest(
|
|
db, str(manifest_path), max_rows=10,
|
|
config={'global': {
|
|
'results_dir': str(self.results),
|
|
'result_bundle_dir': str(self.bundle_root),
|
|
}},
|
|
)
|
|
for row in tail_rows:
|
|
self.assertFalse((self.results / Path(row['source_relative_path'])).exists())
|
|
capacity = db.pipeline_capacity_snapshot()
|
|
self.assertEqual(capacity['quarantine_items'], quarantine_baseline_items)
|
|
self.assertEqual(capacity['quarantine_bytes'], quarantine_baseline_bytes)
|
|
finally:
|
|
if projector is not None and projector.lease is not None:
|
|
projector.stop()
|
|
db.close()
|
|
|
|
def test_worker_observability_persistence_is_idempotent_and_non_renewing(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.record_final_cutover({'test': self.id()})
|
|
ingester = ResultIngester(
|
|
db, str(self.bundle_root), 'observability-supervisor',
|
|
lease_seconds=300,
|
|
).start()
|
|
target = 'https://github.com/example/worker-observability.git'
|
|
self.assertEqual(
|
|
db.enqueue_targets('github', 'github', 'observability', [target]),
|
|
1,
|
|
)
|
|
token_sha256 = hashlib.sha256(b'worker-observability-token').hexdigest()
|
|
device = db.provision_remote_worker_device(
|
|
'observability-user', 'observability-device', token_sha256, 1,
|
|
)
|
|
effective, snapshot = self._remote_execution_snapshot()
|
|
claim = db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(),
|
|
'observability-supervisor', 1024 * 1024, 1024 * 1024,
|
|
0, 0, lease_seconds=300, max_attempts=3,
|
|
capacity_limits={
|
|
'bundle_items': 1, 'bundle_bytes': 1024 * 1024,
|
|
'projection_items': 1, 'projection_bytes': 1024 * 1024,
|
|
'keycheck_items': 1, 'keycheck_bytes': 1024 * 1024,
|
|
'quarantine_items': 1, 'quarantine_bytes': 1024 * 1024,
|
|
},
|
|
reservation_token=hashlib.sha256(b'observability-reservation').hexdigest(),
|
|
bundle_id=hashlib.sha256(b'observability-bundle').hexdigest(),
|
|
scan_event_id=hashlib.sha256(b'observability-scan').hexdigest(),
|
|
claim_order='oldest', final_cutover=True,
|
|
remote_assignment={
|
|
'user_id': device['user_id'],
|
|
'device_id': device['device_id'],
|
|
'effective_config_sha256': effective,
|
|
'client_compat_sha256': hashlib.sha256(
|
|
b'observability-client'
|
|
).hexdigest(),
|
|
'token_sha256': token_sha256,
|
|
'result_upload_body_timeout_seconds': 1800,
|
|
'execution_snapshot': snapshot,
|
|
},
|
|
)
|
|
before = dict(db.conn.execute(
|
|
'''SELECT r.remote_expires_at,
|
|
r.remote_result_upload_body_timeout_seconds,
|
|
r.producer_lease_expires_at,
|
|
q.lease_expires_at
|
|
FROM result_reservations r
|
|
JOIN target_queue q ON q.id = r.queue_id
|
|
WHERE r.id = ?''',
|
|
(claim['reservation_id'],),
|
|
).fetchone())
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
before['remote_result_upload_body_timeout_seconds'], 1800,
|
|
)
|
|
legacy_status = db.remote_assignment_status(
|
|
claim['reservation_id'], device['device_id'], token_sha256,
|
|
)
|
|
self.assertFalse(legacy_status['latest_progress']['available'])
|
|
self.assertFalse(legacy_status['diagnostics']['available'])
|
|
self.assertIsNone(legacy_status['deadlines']['scan_deadline_at'])
|
|
authority_now = datetime.now(timezone.utc)
|
|
issued_for_metrics = authority_now - timedelta(seconds=70)
|
|
base = authority_now - timedelta(seconds=60)
|
|
timestamp = base.isoformat(timespec='milliseconds').replace(
|
|
'+00:00', 'Z',
|
|
)
|
|
phase_started = issued_for_metrics.isoformat(
|
|
timespec='milliseconds',
|
|
).replace('+00:00', 'Z')
|
|
scan_deadline = (
|
|
authority_now + timedelta(seconds=120)
|
|
).isoformat(timespec='milliseconds').replace('+00:00', 'Z')
|
|
db.conn.execute(
|
|
'UPDATE result_reservations SET remote_issued_at = ? WHERE id = ?',
|
|
(issued_for_metrics.isoformat(), claim['reservation_id']),
|
|
)
|
|
db.conn.commit()
|
|
event = json.loads(worker_contracts.encode_worker_event(
|
|
worker_contracts.WorkerEvent(
|
|
schema=worker_contracts.WORKER_EVENT_SCHEMA,
|
|
sequence=7,
|
|
timestamp=timestamp,
|
|
instance_id='observability-instance',
|
|
slot_id=0,
|
|
reservation_id=claim['reservation_id'],
|
|
source='github',
|
|
type=worker_contracts.WORKER_EVENT_TYPE,
|
|
phase=worker_contracts.WorkerPhase.PREPARING,
|
|
phase_started_at=phase_started,
|
|
scan_deadline_at=scan_deadline,
|
|
assignment_deadline_at=claim['remote_expires_at'].replace(
|
|
'+00:00', 'Z'
|
|
),
|
|
progress={},
|
|
)
|
|
).decode('ascii'))
|
|
persisted = db.record_worker_progress_event(
|
|
claim['reservation_id'], device['device_id'], event,
|
|
)
|
|
replay = db.record_worker_progress_event(
|
|
claim['reservation_id'], device['device_id'], event,
|
|
)
|
|
self.assertFalse(persisted['replayed'])
|
|
self.assertTrue(replay['replayed'])
|
|
gap = dict(event, sequence=9)
|
|
accepted_gap = db.record_worker_progress_event(
|
|
claim['reservation_id'], device['device_id'], gap,
|
|
)
|
|
self.assertEqual(accepted_gap['sequence'], 9)
|
|
status = db.remote_assignment_status(
|
|
claim['reservation_id'], device['device_id'], token_sha256,
|
|
)
|
|
self.assertEqual(status['latest_progress']['event']['sequence'], 9)
|
|
self.assertEqual(status['latest_progress']['event']['phase'], 'preparing')
|
|
self.assertTrue(status['deadlines']['immutable'])
|
|
self.assertEqual(
|
|
status['deadlines']['result_upload_body_timeout_seconds'], 1800,
|
|
)
|
|
self.assertEqual(
|
|
status['deadlines']['result_upload_body_timeout_availability'],
|
|
'persisted',
|
|
)
|
|
self.assertEqual(
|
|
status['deadlines']['assignment_deadline_at'],
|
|
claim['remote_expires_at'],
|
|
)
|
|
self.assertEqual(
|
|
status['deadlines']['scan_deadline_at'], scan_deadline,
|
|
)
|
|
after = dict(db.conn.execute(
|
|
'''SELECT r.remote_expires_at,
|
|
r.remote_result_upload_body_timeout_seconds,
|
|
r.producer_lease_expires_at,
|
|
q.lease_expires_at
|
|
FROM result_reservations r
|
|
JOIN target_queue q ON q.id = r.queue_id
|
|
WHERE r.id = ?''',
|
|
(claim['reservation_id'],),
|
|
).fetchone())
|
|
db.conn.commit()
|
|
self.assertEqual(after, before)
|
|
|
|
target_scan_id = db.conn.insert_returning_id(
|
|
'''INSERT INTO target_scans(
|
|
scan_event_id, result_reservation_id, source, target,
|
|
status, started_at, ended_at, created_at
|
|
) VALUES (?, ?, 'github', ?, 'error', ?, ?, ?)''',
|
|
(
|
|
claim['scan_event_id'], claim['reservation_id'], target,
|
|
timestamp, timestamp, timestamp,
|
|
),
|
|
)
|
|
db.conn.commit()
|
|
envelope = worker_contracts.build_diagnostic_envelope(
|
|
occurrence_id='observability-occurrence',
|
|
reservation_id=claim['reservation_id'],
|
|
scan_event_id=claim['scan_event_id'],
|
|
slot_id=0,
|
|
source='github',
|
|
phase=worker_contracts.WorkerPhase.SCANNING,
|
|
kind=worker_contracts.DiagnosticKind.ASSIGNMENT,
|
|
category=worker_contracts.DiagnosticCategory.INTERNAL,
|
|
code='worker.observability_fixture',
|
|
summary='integration diagnostic',
|
|
retryable=False,
|
|
attempt=1,
|
|
assignment_outcome=worker_contracts.AssignmentOutcome.ACCEPTED,
|
|
scan_outcome=worker_contracts.ScanOutcome.ERROR,
|
|
occurred_at=timestamp,
|
|
captured_at=timestamp,
|
|
)
|
|
diagnostic = json.loads(
|
|
worker_contracts.encode_diagnostic_envelope(envelope).decode('ascii')
|
|
)
|
|
inserted = db.record_worker_diagnostic(
|
|
claim['reservation_id'], diagnostic, target_scan_id,
|
|
)
|
|
diagnostic_replay = db.record_worker_diagnostic(
|
|
claim['reservation_id'], diagnostic, target_scan_id,
|
|
)
|
|
self.assertFalse(inserted['replayed'])
|
|
self.assertTrue(diagnostic_replay['replayed'])
|
|
progress_rows = db.worker_progress_events(claim['reservation_id'])
|
|
diagnostic_rows = db.worker_diagnostics(claim['reservation_id'])
|
|
self.assertEqual(progress_rows[0]['target_scan_id'], target_scan_id)
|
|
self.assertEqual(progress_rows[0]['queue_status'], 'in_progress')
|
|
self.assertEqual(diagnostic_rows[0]['target_scan_id'], target_scan_id)
|
|
self.assertEqual(diagnostic_rows[0]['scan_status'], 'error')
|
|
status = db.remote_assignment_status(
|
|
claim['reservation_id'], device['device_id'], token_sha256,
|
|
)
|
|
self.assertEqual(status['diagnostics'], {
|
|
'available': True, 'count': 1,
|
|
'projection_version': None,
|
|
'ordered_uid_set_sha256': None,
|
|
})
|
|
admin_snapshot = db.admin_remote_worker_snapshot(
|
|
limit=20, filters={'category': 'internal'},
|
|
)
|
|
assignment = next(
|
|
row for row in admin_snapshot['assignments']
|
|
if row['reservation_id'] == claim['reservation_id']
|
|
)
|
|
self.assertEqual(assignment['assignment_outcome'], 'unfinished')
|
|
self.assertEqual(assignment['scan_outcome'], 'unavailable')
|
|
self.assertEqual(assignment['diagnostic_count'], 1)
|
|
self.assertEqual(assignment['active_phase'], 'preparing')
|
|
self.assertEqual(assignment['slot_id'], 0)
|
|
self.assertEqual(assignment['protocol_version'], '2')
|
|
self.assertEqual(
|
|
assignment['remote_result_upload_body_timeout_seconds'], 1800,
|
|
)
|
|
diagnostic_groups = db.admin_worker_diagnostic_groups(
|
|
limit=20, filters={'category': 'internal'},
|
|
)
|
|
self.assertEqual(diagnostic_groups['groups'][0]['count'], 1)
|
|
self.assertEqual(
|
|
diagnostic_groups['groups'][0]['occurrences'][0]['reservation_id'],
|
|
claim['reservation_id'],
|
|
)
|
|
detail = db.admin_worker_assignment_detail(
|
|
claim['reservation_id'], event_limit=20, diagnostic_limit=20,
|
|
)
|
|
self.assertEqual(detail['assignment']['reservation_id'], claim['reservation_id'])
|
|
self.assertEqual(detail['diagnostics']['availability'], 'current')
|
|
self.assertEqual(detail['deadlines']['upload_timeout_seconds'], 1800)
|
|
self.assertEqual(
|
|
detail['diagnostics']['items'][0]['canonical_envelope_json'],
|
|
worker_contracts.encode_diagnostic_envelope(envelope).decode('ascii'),
|
|
)
|
|
downloaded = db.admin_worker_diagnostic_envelope(
|
|
claim['reservation_id'], diagnostic['diagnostic_uid'],
|
|
)
|
|
self.assertEqual(
|
|
downloaded['canonical_json'],
|
|
worker_contracts.encode_diagnostic_envelope(envelope).decode('ascii'),
|
|
)
|
|
|
|
transitions = (
|
|
(10, 10, worker_contracts.WorkerPhase.SCANNING),
|
|
(11, 11, worker_contracts.WorkerPhase.RESOLVING),
|
|
(12, 12, worker_contracts.WorkerPhase.SCANNING),
|
|
(13, 14, worker_contracts.WorkerPhase.RESOLVING),
|
|
(14, 15, worker_contracts.WorkerPhase.SCANNING),
|
|
(15, 18, worker_contracts.WorkerPhase.RESOLVING),
|
|
(16, 19, worker_contracts.WorkerPhase.SCANNING),
|
|
(17, 23, worker_contracts.WorkerPhase.RESOLVING),
|
|
(18, 24, worker_contracts.WorkerPhase.SCANNING),
|
|
)
|
|
for sequence, seconds, phase in transitions:
|
|
observed = (base + timedelta(seconds=seconds)).isoformat().replace(
|
|
'+00:00', 'Z',
|
|
)
|
|
next_event = dict(
|
|
event, sequence=sequence, timestamp=observed,
|
|
phase=phase.value, phase_started_at=observed,
|
|
)
|
|
db.record_worker_progress_event(
|
|
claim['reservation_id'], device['device_id'], next_event,
|
|
)
|
|
resolved_at = (base + timedelta(seconds=29)).isoformat().replace(
|
|
'+00:00', 'Z',
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE result_reservations
|
|
SET remote_resolution_kind = 'expired', remote_resolved_at = ?
|
|
WHERE id = ?''',
|
|
(resolved_at, claim['reservation_id']),
|
|
)
|
|
db.conn.commit()
|
|
completion_window = (base + timedelta(milliseconds=500)).isoformat()
|
|
issued_at = db.conn.execute(
|
|
'SELECT remote_issued_at FROM result_reservations WHERE id = ?',
|
|
(claim['reservation_id'],),
|
|
).fetchone()['remote_issued_at']
|
|
db.conn.commit()
|
|
self.assertLess(
|
|
datetime.fromisoformat(str(issued_at).replace('Z', '+00:00')),
|
|
datetime.fromisoformat(completion_window),
|
|
)
|
|
metrics = db.admin_worker_duration_metrics(
|
|
limit=20, filters={
|
|
'source': 'github', 'phase': 'scanning',
|
|
'since': completion_window,
|
|
},
|
|
)
|
|
scanning = next(
|
|
item for item in metrics['metrics']
|
|
if item['phase'] == 'scanning' and item['outcome'] == 'expired'
|
|
)
|
|
self.assertEqual(scanning['sample_count'], 5)
|
|
self.assertTrue(scanning['sufficient'])
|
|
self.assertAlmostEqual(scanning['p50_seconds'], 3.0)
|
|
self.assertAlmostEqual(scanning['p95_seconds'], 4.8)
|
|
self.assertAlmostEqual(scanning['p99_seconds'], 4.96)
|
|
preparing_metrics = db.admin_worker_duration_metrics(
|
|
limit=20, filters={
|
|
'source': 'github', 'phase': 'preparing',
|
|
'since': completion_window,
|
|
},
|
|
)
|
|
preparing = next(
|
|
item for item in preparing_metrics['metrics']
|
|
if item['phase'] == 'preparing' and item['outcome'] == 'expired'
|
|
)
|
|
self.assertEqual(preparing['sample_count'], 1)
|
|
self.assertAlmostEqual(preparing['p50_seconds'], 20.0, delta=0.001)
|
|
self.assertAlmostEqual(preparing['p95_seconds'], 20.0, delta=0.001)
|
|
self.assertAlmostEqual(preparing['p99_seconds'], 20.0, delta=0.001)
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
db.close()
|
|
|
|
def test_remote_prebundle_and_expiry_diagnostics_settle_transactionally(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.record_final_cutover({'test': self.id()})
|
|
ingester = ResultIngester(
|
|
db, str(self.bundle_root), 'diagnostic-settlement-supervisor',
|
|
lease_seconds=300,
|
|
).start()
|
|
targets = [
|
|
'https://github.com/example/prebundle-diagnostic.git',
|
|
'https://github.com/example/expiry-diagnostic.git',
|
|
'https://github.com/example/accepted-diagnostic.git',
|
|
]
|
|
self.assertEqual(
|
|
db.enqueue_targets('github', 'github', 'diagnostic-settlement', targets),
|
|
3,
|
|
)
|
|
token_sha256 = hashlib.sha256(b'diagnostic-settlement-token').hexdigest()
|
|
device = db.provision_remote_worker_device(
|
|
'diagnostic-settlement-user', 'diagnostic-settlement-device',
|
|
token_sha256, 3,
|
|
)
|
|
effective, snapshot = self._remote_execution_snapshot()
|
|
|
|
def install_diagnostic_rejection():
|
|
db.conn.execute('''CREATE OR REPLACE FUNCTION reject_worker_diagnostic()
|
|
RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN
|
|
RAISE EXCEPTION 'injected diagnostic rollback'; END $$''')
|
|
db.conn.execute('''CREATE TRIGGER reject_worker_diagnostic_insert
|
|
BEFORE INSERT ON worker_diagnostics FOR EACH ROW
|
|
EXECUTE FUNCTION reject_worker_diagnostic()''')
|
|
db.conn.commit()
|
|
|
|
def remove_diagnostic_rejection():
|
|
db.conn.execute(
|
|
'DROP TRIGGER IF EXISTS reject_worker_diagnostic_insert ON worker_diagnostics'
|
|
)
|
|
db.conn.execute('DROP FUNCTION IF EXISTS reject_worker_diagnostic()')
|
|
db.conn.commit()
|
|
|
|
def claim(label):
|
|
return db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(),
|
|
'diagnostic-settlement-supervisor', 4 * 1024 * 1024,
|
|
2 * 1024 * 1024,
|
|
0, 0, lease_seconds=300, max_attempts=3,
|
|
capacity_limits={
|
|
'bundle_items': 3, 'bundle_bytes': 12 * 1024 * 1024,
|
|
'projection_items': 3, 'projection_bytes': 6 * 1024 * 1024,
|
|
'keycheck_items': 3, 'keycheck_bytes': 3 * 1024 * 1024,
|
|
'quarantine_items': 3, 'quarantine_bytes': 3 * 1024 * 1024,
|
|
},
|
|
reservation_token=hashlib.sha256(
|
|
f'{label}:reservation'.encode('ascii')
|
|
).hexdigest(),
|
|
bundle_id=hashlib.sha256(
|
|
f'{label}:bundle'.encode('ascii')
|
|
).hexdigest(),
|
|
scan_event_id=hashlib.sha256(
|
|
f'{label}:scan'.encode('ascii')
|
|
).hexdigest(),
|
|
claim_order='oldest', final_cutover=True,
|
|
reserved_bundle_bytes=2 * 1024 * 1024,
|
|
remote_max_active=50,
|
|
remote_assignment={
|
|
'user_id': device['user_id'],
|
|
'device_id': device['device_id'],
|
|
'effective_config_sha256': effective,
|
|
'client_compat_sha256': hashlib.sha256(
|
|
f'{label}:client'.encode('ascii')
|
|
).hexdigest(),
|
|
'token_sha256': token_sha256,
|
|
'result_upload_body_timeout_seconds': 1800,
|
|
'execution_snapshot': snapshot,
|
|
},
|
|
)
|
|
|
|
prebundle = claim('prebundle')
|
|
timestamp = '2026-09-24T00:00:00Z'
|
|
envelope = worker_contracts.build_diagnostic_envelope(
|
|
occurrence_id='prebundle-occurrence',
|
|
reservation_id=prebundle['reservation_id'],
|
|
scan_event_id=prebundle['scan_event_id'],
|
|
slot_id=0,
|
|
source='github',
|
|
phase=worker_contracts.WorkerPhase.PREPARING,
|
|
kind=worker_contracts.DiagnosticKind.ASSIGNMENT,
|
|
category=worker_contracts.DiagnosticCategory.INTERNAL,
|
|
code='worker.prebundle_fixture',
|
|
summary='prebundle integration diagnostic',
|
|
retryable=False,
|
|
attempt=1,
|
|
assignment_outcome=worker_contracts.AssignmentOutcome.PREBUNDLE_FAILED,
|
|
scan_outcome=worker_contracts.ScanOutcome.UNAVAILABLE,
|
|
occurred_at=timestamp,
|
|
captured_at=timestamp,
|
|
)
|
|
diagnostic = json.loads(
|
|
worker_contracts.encode_diagnostic_envelope(envelope).decode('ascii')
|
|
)
|
|
report = {
|
|
'failure_code': 'client_process_failed',
|
|
'detail': 'local worker execution failed',
|
|
'diagnostics': [diagnostic],
|
|
}
|
|
install_diagnostic_rejection()
|
|
with self.assertRaisesRegex(Exception, 'injected diagnostic rollback'):
|
|
db.report_remote_prebundle_failure(
|
|
prebundle['reservation_id'], device['device_id'], token_sha256,
|
|
report,
|
|
)
|
|
rolled_back = db.conn.execute(
|
|
'''SELECT r.state AS reservation_state,
|
|
r.remote_resolution_kind, q.status AS queue_status,
|
|
(SELECT COUNT(*) FROM worker_diagnostics d
|
|
WHERE d.reservation_id = r.id) AS diagnostic_count
|
|
FROM result_reservations r
|
|
JOIN target_queue q ON q.id = r.queue_id WHERE r.id = ?''',
|
|
(prebundle['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
rolled_back['reservation_state'],
|
|
rolled_back['remote_resolution_kind'],
|
|
rolled_back['queue_status'],
|
|
rolled_back['diagnostic_count'],
|
|
),
|
|
('scanning', None, 'in_progress', 0),
|
|
)
|
|
remove_diagnostic_rejection()
|
|
receipt = db.report_remote_prebundle_failure(
|
|
prebundle['reservation_id'], device['device_id'], token_sha256,
|
|
report,
|
|
)
|
|
self.assertEqual(receipt['resolution'], 'prebundle_report')
|
|
self.assertEqual(receipt['diagnostics'], {
|
|
'available': True, 'count': 1,
|
|
'projection_version': None,
|
|
'ordered_uid_set_sha256': None,
|
|
})
|
|
self.assertEqual(
|
|
db.report_remote_prebundle_failure(
|
|
prebundle['reservation_id'], device['device_id'], token_sha256,
|
|
report,
|
|
),
|
|
receipt,
|
|
)
|
|
legacy_receipt = {
|
|
key: value for key, value in receipt.items()
|
|
if key not in {
|
|
'deadlines', 'latest_progress', 'known_reason', 'diagnostics',
|
|
}
|
|
}
|
|
legacy_receipt_json = json.dumps(
|
|
legacy_receipt, ensure_ascii=True, sort_keys=True,
|
|
separators=(',', ':'),
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE result_reservations SET remote_resolution_json = ?
|
|
WHERE id = ?''',
|
|
(legacy_receipt_json, prebundle['reservation_id']),
|
|
)
|
|
db.conn.commit()
|
|
legacy_status = db.remote_assignment_status(
|
|
prebundle['reservation_id'], device['device_id'], token_sha256,
|
|
)
|
|
self.assertEqual(
|
|
{key: legacy_status[key] for key in legacy_receipt},
|
|
legacy_receipt,
|
|
)
|
|
self.assertEqual(
|
|
legacy_status['latest_progress'],
|
|
{'available': False, 'event': None},
|
|
)
|
|
self.assertEqual(legacy_status['known_reason'], None)
|
|
self.assertEqual(
|
|
legacy_status['diagnostics'], {
|
|
'available': True, 'count': 1,
|
|
'projection_version': None,
|
|
'ordered_uid_set_sha256': None,
|
|
},
|
|
)
|
|
durable_legacy = db.conn.execute(
|
|
'''SELECT remote_resolution_json FROM result_reservations
|
|
WHERE id = ?''',
|
|
(prebundle['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(durable_legacy['remote_resolution_json'], legacy_receipt_json)
|
|
authority_before = dict(db.conn.execute(
|
|
'''SELECT remote_expires_at, producer_lease_expires_at,
|
|
remote_receipt_id, remote_resolution_json
|
|
FROM result_reservations WHERE id = ?''',
|
|
(prebundle['reservation_id'],),
|
|
).fetchone())
|
|
late_timestamp = scanner_db.utc_now_iso().replace('+00:00', 'Z')
|
|
late_event = json.loads(worker_contracts.encode_worker_event(
|
|
worker_contracts.WorkerEvent(
|
|
schema=worker_contracts.WORKER_EVENT_SCHEMA,
|
|
sequence=100,
|
|
timestamp=late_timestamp,
|
|
instance_id='late-progress-instance',
|
|
slot_id=0,
|
|
reservation_id=prebundle['reservation_id'],
|
|
source='github',
|
|
type=worker_contracts.WORKER_EVENT_TYPE,
|
|
phase=worker_contracts.WorkerPhase.AWAITING_RECEIPT,
|
|
phase_started_at=late_timestamp,
|
|
scan_deadline_at=None,
|
|
assignment_deadline_at=prebundle['remote_expires_at'].replace(
|
|
'+00:00', 'Z'
|
|
),
|
|
progress={'reason': 'terminal_report'},
|
|
)
|
|
).decode('ascii'))
|
|
accepted_late = db.record_remote_worker_progress_event(
|
|
prebundle['reservation_id'], device['device_id'],
|
|
token_sha256, late_event,
|
|
)
|
|
replayed_late = db.record_remote_worker_progress_event(
|
|
prebundle['reservation_id'], device['device_id'],
|
|
token_sha256, late_event,
|
|
)
|
|
authority_after = dict(db.conn.execute(
|
|
'''SELECT remote_expires_at, producer_lease_expires_at,
|
|
remote_receipt_id, remote_resolution_json
|
|
FROM result_reservations WHERE id = ?''',
|
|
(prebundle['reservation_id'],),
|
|
).fetchone())
|
|
db.conn.commit()
|
|
self.assertFalse(accepted_late['replayed'])
|
|
self.assertTrue(replayed_late['replayed'])
|
|
self.assertEqual(authority_after, authority_before)
|
|
resolved_status = db.remote_assignment_status(
|
|
prebundle['reservation_id'], device['device_id'], token_sha256,
|
|
)
|
|
self.assertEqual(
|
|
resolved_status['latest_progress']['event']['sequence'], 100,
|
|
)
|
|
self.assertEqual(
|
|
resolved_status['latest_progress']['event']['received_at'],
|
|
accepted_late['received_at'],
|
|
)
|
|
settled = db.conn.execute(
|
|
'''SELECT r.state AS reservation_state, q.status AS queue_status,
|
|
d.target_scan_id, d.category
|
|
FROM result_reservations r
|
|
JOIN target_queue q ON q.id = r.queue_id
|
|
JOIN worker_diagnostics d ON d.reservation_id = r.id
|
|
WHERE r.id = ?''',
|
|
(prebundle['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
(settled['reservation_state'], settled['queue_status']),
|
|
('refunded', 'pending'),
|
|
)
|
|
self.assertIsNone(settled['target_scan_id'])
|
|
|
|
expired = claim('expiry')
|
|
deadline = '2026-09-24T00:00:00+00:00'
|
|
db.conn.execute(
|
|
'UPDATE result_reservations SET remote_expires_at = ? WHERE id = ?',
|
|
(deadline, expired['reservation_id']),
|
|
)
|
|
db.conn.commit()
|
|
install_diagnostic_rejection()
|
|
with self.assertRaisesRegex(Exception, 'injected diagnostic rollback'):
|
|
db.expire_remote_assignment(
|
|
expired['reservation_id'], now='2026-09-24T00:00:01+00:00',
|
|
)
|
|
expiry_rolled_back = db.conn.execute(
|
|
'''SELECT r.state AS reservation_state,
|
|
r.remote_resolution_kind, q.status AS queue_status,
|
|
(SELECT COUNT(*) FROM worker_diagnostics d
|
|
WHERE d.reservation_id = r.id) AS diagnostic_count
|
|
FROM result_reservations r
|
|
JOIN target_queue q ON q.id = r.queue_id WHERE r.id = ?''',
|
|
(expired['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
expiry_rolled_back['reservation_state'],
|
|
expiry_rolled_back['remote_resolution_kind'],
|
|
expiry_rolled_back['queue_status'],
|
|
expiry_rolled_back['diagnostic_count'],
|
|
),
|
|
('scanning', None, 'in_progress', 0),
|
|
)
|
|
remove_diagnostic_rejection()
|
|
expiry_receipt = db.expire_remote_assignment(
|
|
expired['reservation_id'], now='2026-09-24T00:00:01+00:00',
|
|
)
|
|
self.assertEqual(expiry_receipt['resolution'], 'expired')
|
|
self.assertEqual(
|
|
expiry_receipt['diagnostics'], {
|
|
'available': True, 'count': 1,
|
|
'projection_version': None,
|
|
'ordered_uid_set_sha256': None,
|
|
},
|
|
)
|
|
expiry = db.conn.execute(
|
|
'''SELECT r.state AS reservation_state, q.status AS queue_status,
|
|
d.category, d.code, d.target_scan_id
|
|
FROM result_reservations r
|
|
JOIN target_queue q ON q.id = r.queue_id
|
|
JOIN worker_diagnostics d ON d.reservation_id = r.id
|
|
WHERE r.id = ?''',
|
|
(expired['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
(expiry['reservation_state'], expiry['queue_status']),
|
|
('refunded', 'pending'),
|
|
)
|
|
self.assertEqual(expiry['category'], 'assignment_expired')
|
|
self.assertEqual(expiry['code'], 'assignment.deadline_expired')
|
|
self.assertIsNone(expiry['target_scan_id'])
|
|
|
|
accepted = claim('accepted')
|
|
resolution = {
|
|
'provider': 'github',
|
|
'repo_url': accepted['target'],
|
|
'repo_path': accepted['target'].split('github.com/', 1)[1].removesuffix('.git'),
|
|
'branch': 'main',
|
|
'ref': 'refs/heads/main',
|
|
'head_sha': 'b' * 40,
|
|
'ref_source': 'provider_default',
|
|
}
|
|
plan = db.bind_git_scan_plan(
|
|
accepted['reservation_id'], accepted['claim_lease_token'],
|
|
resolution, 100,
|
|
remote_credential={
|
|
'device_id': device['device_id'],
|
|
'token_sha256': token_sha256,
|
|
},
|
|
)
|
|
plan_sha256 = hashlib.sha256(
|
|
canonical_git_scan_plan_bytes(plan)
|
|
).hexdigest()
|
|
exact_scope = {
|
|
key: plan.get(key) for key in (
|
|
'provider', 'ref', 'head_sha', 'base_sha', 'mode',
|
|
'baseline_depth', 'ref_source',
|
|
)
|
|
}
|
|
result_metadata = {
|
|
'scan_event_id': accepted['scan_event_id'],
|
|
'target': accepted['target'],
|
|
'scan_type': 'github',
|
|
'timestamp': '2026-09-24T00:02:00+00:00',
|
|
'scan_started_at': '2026-09-24T00:01:00+00:00',
|
|
'duration_sec': 60.0,
|
|
'retryable': False,
|
|
'git_scan_plan': plan,
|
|
'git_scan_execution': {
|
|
'mode': plan['mode'], 'pinned': True, 'success': True,
|
|
'continuity_reset': False, 'plan_sha256': plan_sha256,
|
|
},
|
|
'scan_meta': {'exact_git_scope': exact_scope},
|
|
'reservation_id': accepted['reservation_id'],
|
|
'queue_id': accepted['queue_id'],
|
|
'bundle_id': accepted['bundle_id'],
|
|
'source': accepted['source'],
|
|
'platform': accepted['platform'],
|
|
'query': accepted['query'],
|
|
'normalized_target': accepted['normalized_target'],
|
|
'status': 'error',
|
|
'findings_count': 0,
|
|
'verified_findings_count': 0,
|
|
'error_count': 40,
|
|
'first_error_summary': 'legacy remote error 0',
|
|
'scan_options': {},
|
|
'derived_postman_targets': [],
|
|
'queue_status': 'failed',
|
|
'queue_error': 'legacy remote error 0',
|
|
}
|
|
with ResultBundleWriter.open(
|
|
str(self.bundle_root), BundleReservation.from_mapping(accepted),
|
|
) as writer:
|
|
for index in range(40):
|
|
writer.write_error(
|
|
f'legacy remote error {index}:' + ('x' * 65536)
|
|
)
|
|
commit = writer.finish(result_metadata)
|
|
ready_path = self.bundle_root.joinpath(*commit.relative_path.split('/'))
|
|
accepted_reader = ResultBundleReader(str(ready_path))
|
|
metadata = accepted_reader.validate().as_dict()
|
|
metadata['relative_path'] = commit.relative_path
|
|
effective_diagnostics = accepted_reader.effective_diagnostics()
|
|
effective_uids = {
|
|
diagnostic['diagnostic_uid'] for diagnostic in effective_diagnostics
|
|
}
|
|
effective_uid_hash = (
|
|
worker_contracts.ordered_diagnostic_uid_set_sha256(
|
|
effective_diagnostics
|
|
)
|
|
)
|
|
metadata['effective_diagnostic_projection_version'] = 1
|
|
metadata['effective_diagnostic_count'] = len(effective_diagnostics)
|
|
metadata['effective_diagnostic_uids_sha256'] = effective_uid_hash
|
|
self.assertEqual(metadata['diagnostic_count'], 0)
|
|
self.assertEqual(len(effective_diagnostics), 32)
|
|
accepted_progress_timestamp = datetime.now(timezone.utc).isoformat(
|
|
timespec='milliseconds',
|
|
).replace('+00:00', 'Z')
|
|
accepted_scan_deadline = (
|
|
datetime.now(timezone.utc) + timedelta(seconds=120)
|
|
).isoformat(timespec='milliseconds').replace('+00:00', 'Z')
|
|
accepted_progress = dict(
|
|
event,
|
|
reservation_id=accepted['reservation_id'],
|
|
sequence=9,
|
|
timestamp=accepted_progress_timestamp,
|
|
phase='scanning',
|
|
phase_started_at=accepted_progress_timestamp,
|
|
scan_deadline_at=accepted_scan_deadline,
|
|
assignment_deadline_at=accepted['remote_expires_at'].replace(
|
|
'+00:00', 'Z'
|
|
),
|
|
)
|
|
db.record_worker_progress_event(
|
|
accepted['reservation_id'], device['device_id'], accepted_progress,
|
|
)
|
|
db.conn.execute(
|
|
'''UPDATE pipeline_capacity SET bundle_bytes = ? WHERE id = 1''',
|
|
(12 * 1024 * 1024,),
|
|
)
|
|
db.conn.commit()
|
|
with self.assertRaises(PipelineCapacityUnavailable):
|
|
db.mark_result_bundle_ready(
|
|
accepted['reservation_id'], metadata,
|
|
remote_acceptance={
|
|
'device_id': device['device_id'],
|
|
'token_sha256': token_sha256,
|
|
'payload_sha256': hashlib.sha256(
|
|
ready_path.read_bytes()
|
|
).hexdigest(),
|
|
},
|
|
bundle_capacity_bytes=12 * 1024 * 1024,
|
|
)
|
|
deferred_bundle = db.conn.execute(
|
|
'''SELECT reserved_bundle_bytes, remote_resolution_kind
|
|
FROM result_reservations WHERE id = ?''',
|
|
(accepted['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.execute(
|
|
'''UPDATE pipeline_capacity SET bundle_bytes = ? WHERE id = 1''',
|
|
(2 * 1024 * 1024,),
|
|
)
|
|
db.conn.commit()
|
|
self.assertEqual(deferred_bundle['reserved_bundle_bytes'], 2 * 1024 * 1024)
|
|
self.assertIsNone(deferred_bundle['remote_resolution_kind'])
|
|
receipt = db.mark_result_bundle_ready(
|
|
accepted['reservation_id'], metadata,
|
|
remote_acceptance={
|
|
'device_id': device['device_id'],
|
|
'token_sha256': token_sha256,
|
|
'payload_sha256': hashlib.sha256(ready_path.read_bytes()).hexdigest(),
|
|
},
|
|
bundle_capacity_bytes=12 * 1024 * 1024,
|
|
)
|
|
expanded = db.conn.execute(
|
|
'''SELECT reserved_bundle_bytes FROM result_reservations
|
|
WHERE id = ?''',
|
|
(accepted['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertGreater(metadata['actual_bytes'], 2 * 1024 * 1024)
|
|
self.assertEqual(expanded['reserved_bundle_bytes'], metadata['actual_bytes'])
|
|
self.assertEqual(
|
|
db.pipeline_capacity_snapshot()['bundle_bytes'],
|
|
metadata['actual_bytes'],
|
|
)
|
|
self.assertEqual(receipt['diagnostics'], {
|
|
'available': True, 'count': 32,
|
|
'projection_version': 1,
|
|
'ordered_uid_set_sha256': effective_uid_hash,
|
|
})
|
|
self.assertEqual(
|
|
receipt['deadlines']['scan_deadline_at'], accepted_scan_deadline,
|
|
)
|
|
late_timestamp = datetime.now(timezone.utc).isoformat(
|
|
timespec='milliseconds',
|
|
).replace('+00:00', 'Z')
|
|
late_event = dict(
|
|
accepted_progress,
|
|
sequence=10,
|
|
timestamp=late_timestamp,
|
|
phase='awaiting_receipt',
|
|
phase_started_at=late_timestamp,
|
|
scan_deadline_at=None,
|
|
)
|
|
late_progress = db.record_worker_progress_event(
|
|
accepted['reservation_id'], device['device_id'], late_event,
|
|
)
|
|
self.assertIsNone(late_progress['event']['scan_deadline_at'])
|
|
accepted_status = db.remote_assignment_status(
|
|
accepted['reservation_id'], device['device_id'], token_sha256,
|
|
)
|
|
self.assertEqual(
|
|
accepted_status['latest_progress']['event']['sequence'], 10,
|
|
)
|
|
self.assertEqual(
|
|
accepted_status['latest_progress']['event']['phase'],
|
|
'awaiting_receipt',
|
|
)
|
|
self.assertEqual(accepted_status['deadlines'], receipt['deadlines'])
|
|
self.assertEqual(accepted_status['diagnostics'], receipt['diagnostics'])
|
|
projection_fence = db.conn.execute(
|
|
'''SELECT remote_diagnostic_projection_version,
|
|
remote_diagnostic_count,
|
|
remote_diagnostic_uids_sha256
|
|
FROM result_reservations WHERE id = ?''',
|
|
(accepted['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
projection_fence['remote_diagnostic_projection_version'],
|
|
projection_fence['remote_diagnostic_count'],
|
|
projection_fence['remote_diagnostic_uids_sha256'],
|
|
),
|
|
(1, 32, effective_uid_hash),
|
|
)
|
|
replay_receipt = db.mark_result_bundle_ready(
|
|
accepted['reservation_id'], metadata,
|
|
remote_acceptance={
|
|
'device_id': device['device_id'],
|
|
'token_sha256': token_sha256,
|
|
'payload_sha256': hashlib.sha256(ready_path.read_bytes()).hexdigest(),
|
|
},
|
|
bundle_capacity_bytes=12 * 1024 * 1024,
|
|
)
|
|
self.assertEqual(replay_receipt, receipt)
|
|
self.assertEqual(
|
|
db.pipeline_capacity_snapshot()['bundle_bytes'],
|
|
metadata['actual_bytes'],
|
|
)
|
|
claimed_bundle = db.claim_ready_result_bundle(
|
|
ingester.lease['generation'], ingester.lease['lease_token'], 300,
|
|
)
|
|
conflicting_reader = mock.Mock(wraps=accepted_reader)
|
|
conflicting_reader.effective_diagnostics.return_value = tuple(
|
|
reversed(effective_diagnostics)
|
|
)
|
|
with self.assertRaisesRegex(
|
|
ScanEventConflictError, 'differs from receipt authority',
|
|
):
|
|
db.ingest_result_bundle(
|
|
conflicting_reader, claimed_bundle['reservation'],
|
|
claimed_bundle['bundle'],
|
|
)
|
|
install_diagnostic_rejection()
|
|
with self.assertRaisesRegex(Exception, 'injected diagnostic rollback'):
|
|
db.ingest_result_bundle(
|
|
accepted_reader, claimed_bundle['reservation'],
|
|
claimed_bundle['bundle'],
|
|
)
|
|
accepted_rollback = db.conn.execute(
|
|
'''SELECT r.state AS reservation_state, q.status AS queue_status,
|
|
(SELECT COUNT(*) FROM target_scans s
|
|
WHERE s.result_reservation_id = r.id) AS scan_count,
|
|
(SELECT COUNT(*) FROM worker_diagnostics d
|
|
WHERE d.reservation_id = r.id) AS diagnostic_count
|
|
FROM result_reservations r
|
|
JOIN target_queue q ON q.id = r.queue_id WHERE r.id = ?''',
|
|
(accepted['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
accepted_rollback['queue_status'],
|
|
accepted_rollback['scan_count'],
|
|
accepted_rollback['diagnostic_count'],
|
|
),
|
|
('in_progress', 0, 0),
|
|
)
|
|
self.assertIn(
|
|
accepted_rollback['reservation_state'], ('ready', 'ingesting'),
|
|
)
|
|
remove_diagnostic_rejection()
|
|
committed = db.ingest_result_bundle(
|
|
accepted_reader, claimed_bundle['reservation'],
|
|
claimed_bundle['bundle'],
|
|
)
|
|
replayed = db.ingest_result_bundle(
|
|
accepted_reader, claimed_bundle['reservation'],
|
|
claimed_bundle['bundle'],
|
|
)
|
|
self.assertFalse(committed['duplicate'])
|
|
self.assertTrue(replayed['duplicate'])
|
|
db.conn.execute(
|
|
'''UPDATE result_reservations
|
|
SET remote_diagnostic_projection_version = 0,
|
|
remote_diagnostic_count = NULL,
|
|
remote_diagnostic_uids_sha256 = NULL
|
|
WHERE id = ?''',
|
|
(accepted['reservation_id'],),
|
|
)
|
|
db.conn.commit()
|
|
legacy_fenced = db.ingest_result_bundle(
|
|
accepted_reader, claimed_bundle['reservation'],
|
|
claimed_bundle['bundle'],
|
|
)
|
|
self.assertTrue(legacy_fenced['duplicate'])
|
|
backfilled_fence = db.conn.execute(
|
|
'''SELECT remote_diagnostic_projection_version,
|
|
remote_diagnostic_count,
|
|
remote_diagnostic_uids_sha256
|
|
FROM result_reservations WHERE id = ?''',
|
|
(accepted['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(
|
|
(
|
|
backfilled_fence['remote_diagnostic_projection_version'],
|
|
backfilled_fence['remote_diagnostic_count'],
|
|
backfilled_fence['remote_diagnostic_uids_sha256'],
|
|
),
|
|
(1, 32, effective_uid_hash),
|
|
)
|
|
count = db.conn.execute(
|
|
'''SELECT COUNT(*) AS count FROM worker_diagnostics
|
|
WHERE reservation_id = ?''',
|
|
(accepted['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(count['count'], 32)
|
|
self.assertTrue(ingester.process_one())
|
|
attached = db.conn.execute(
|
|
'''SELECT d.target_scan_id, d.code, d.diagnostic_uid,
|
|
ts.status AS scan_status,
|
|
q.status AS queue_status
|
|
FROM worker_diagnostics d
|
|
JOIN target_scans ts ON ts.id = d.target_scan_id
|
|
JOIN result_reservations r ON r.id = d.reservation_id
|
|
JOIN target_queue q ON q.id = r.queue_id
|
|
WHERE d.reservation_id = ?''',
|
|
(accepted['reservation_id'],),
|
|
).fetchall()
|
|
db.conn.commit()
|
|
self.assertEqual(len(attached), 32)
|
|
self.assertEqual(
|
|
{row['diagnostic_uid'] for row in attached}, effective_uids,
|
|
)
|
|
self.assertTrue(all(row['target_scan_id'] for row in attached))
|
|
self.assertTrue(all(
|
|
row['code'] in {'legacy.error_frame', 'legacy.error_frame_aggregate'}
|
|
for row in attached
|
|
))
|
|
self.assertTrue(all(row['scan_status'] == 'error' for row in attached))
|
|
self.assertTrue(all(row['queue_status'] == 'failed' for row in attached))
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
db.close()
|
|
|
|
def test_local_dless_error_bundle_projects_one_transactional_legacy_diagnostic(self):
|
|
db = ScannerDB(db_url=self.dsn, initialize=False)
|
|
ingester = None
|
|
try:
|
|
migrate_runtime_safety_schema(db, initialize_base=True)
|
|
db.record_final_cutover({'test': self.id()})
|
|
ingester = ResultIngester(
|
|
db, str(self.bundle_root), 'local-legacy-diagnostic-supervisor',
|
|
lease_seconds=300,
|
|
).start()
|
|
target = 'https://github.com/example/local-legacy-diagnostic.git'
|
|
self.assertEqual(
|
|
db.enqueue_targets('github', 'github', 'local-legacy', [target]),
|
|
1,
|
|
)
|
|
claim = db.reserve_and_claim_target(
|
|
'github', 'github', current_process_identity(),
|
|
'local-legacy-diagnostic-supervisor',
|
|
1024 * 1024, 1024 * 1024, 0, 0,
|
|
lease_seconds=300, max_attempts=3,
|
|
capacity_limits={
|
|
'bundle_items': 1, 'bundle_bytes': 1024 * 1024,
|
|
'projection_items': 1, 'projection_bytes': 1024 * 1024,
|
|
'keycheck_items': 1, 'keycheck_bytes': 1024 * 1024,
|
|
'quarantine_items': 1, 'quarantine_bytes': 1024 * 1024,
|
|
},
|
|
reservation_token=hashlib.sha256(b'local-legacy-reservation').hexdigest(),
|
|
bundle_id=hashlib.sha256(b'local-legacy-bundle').hexdigest(),
|
|
scan_event_id=hashlib.sha256(b'local-legacy-scan').hexdigest(),
|
|
claim_order='oldest', final_cutover=True,
|
|
)
|
|
reservation = BundleReservation.from_mapping(claim)
|
|
with ResultBundleWriter.open(str(self.bundle_root), reservation) as writer:
|
|
writer.write_error('exact legacy E-frame evidence')
|
|
commit = writer.finish({
|
|
'scan_event_id': claim['scan_event_id'],
|
|
'target': claim['target'],
|
|
'scan_type': claim['platform'],
|
|
'timestamp': '2026-09-24T00:01:00Z',
|
|
'scan_started_at': '2026-09-24T00:00:00Z',
|
|
'duration_sec': 60.0,
|
|
'status': 'error',
|
|
'queue_status': 'failed',
|
|
'queue_error': 'exact legacy E-frame evidence',
|
|
'reservation_id': claim['reservation_id'],
|
|
'queue_id': claim['queue_id'],
|
|
'bundle_id': claim['bundle_id'],
|
|
'source': claim['source'],
|
|
'platform': claim['platform'],
|
|
'query': claim['query'],
|
|
'normalized_target': claim['normalized_target'],
|
|
'findings_count': 0,
|
|
'verified_findings_count': 0,
|
|
'error_count': 1,
|
|
'first_error_summary': 'exact legacy E-frame evidence',
|
|
'scan_options': {},
|
|
'derived_postman_targets': [],
|
|
})
|
|
path = self.bundle_root.joinpath(*commit.relative_path.split('/'))
|
|
reader = ResultBundleReader(str(path))
|
|
metadata = reader.validate().as_dict()
|
|
metadata['relative_path'] = commit.relative_path
|
|
self.assertEqual(reader.validate().diagnostic_count, 0)
|
|
self.assertTrue(db.mark_result_bundle_ready(
|
|
claim['reservation_id'], metadata,
|
|
))
|
|
lost = {'pending': True}
|
|
|
|
def lose_commit(stage, _value):
|
|
if stage == 'after_db_commit' and lost['pending']:
|
|
lost['pending'] = False
|
|
raise RuntimeError('injected local legacy diagnostic commit loss')
|
|
|
|
ingester.fault = lose_commit
|
|
with self.assertRaisesRegex(
|
|
RuntimeError, 'local legacy diagnostic commit loss',
|
|
):
|
|
ingester.process_one()
|
|
row = db.conn.execute(
|
|
'''SELECT d.diagnostic_uid, d.code, d.target_scan_id,
|
|
r.assignment_kind
|
|
FROM worker_diagnostics d
|
|
JOIN result_reservations r ON r.id = d.reservation_id
|
|
WHERE d.reservation_id = ?''',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(row['code'], 'legacy.error_frame')
|
|
self.assertEqual(row['assignment_kind'], 'local')
|
|
self.assertIsNotNone(row['target_scan_id'])
|
|
uid = row['diagnostic_uid']
|
|
ingester.fault = None
|
|
self.assertTrue(ingester.process_one())
|
|
replay = db.conn.execute(
|
|
'''SELECT COUNT(*) AS count, MIN(diagnostic_uid) AS diagnostic_uid
|
|
FROM worker_diagnostics WHERE reservation_id = ?''',
|
|
(claim['reservation_id'],),
|
|
).fetchone()
|
|
db.conn.commit()
|
|
self.assertEqual(replay['count'], 1)
|
|
self.assertEqual(replay['diagnostic_uid'], uid)
|
|
finally:
|
|
if ingester is not None and ingester.lease is not None:
|
|
ingester.stop()
|
|
db.close()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|