39 lines
29 KiB
JSON
39 lines
29 KiB
JSON
{
|
|
"schema_version": 1,
|
|
"channel": "homelab-runtime",
|
|
"command_id": "SUPPORT-260915-INFRA-DR-BACKUPV2-CT112-CLOUD-SEAL-CONTRACT-PREFLIGHT-427R1",
|
|
"status": "OK",
|
|
"rc": 0,
|
|
"host": "pve01",
|
|
"mode": "read-only",
|
|
"component": "infra-dr-backupv2-ct112-cloud-seal-contract-preflight",
|
|
"started_at_utc": "2026-09-15T12:36:13Z",
|
|
"finished_at_utc": "2026-09-15T12:36:14Z",
|
|
"reference_register_checked": true,
|
|
"reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66",
|
|
"error_register_checked": true,
|
|
"error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0",
|
|
"command_sha256": "c92db35b051b231f28f75dee8513620581c9e13c76afce192d2ec6fee0e4f079",
|
|
"duplicate_failed_command_blocked": false,
|
|
"block_reason": null,
|
|
"execution_started": true,
|
|
"change_declared": false,
|
|
"result_contract_valid": true,
|
|
"result_contract_status": null,
|
|
"result_contract_error": null,
|
|
"command_rc": 0,
|
|
"changes_made": false,
|
|
"rollback_started": false,
|
|
"rollback_restored": null,
|
|
"mutation_outcome": "NO_MUTATION",
|
|
"sanitized": true,
|
|
"secrets_included": false,
|
|
"private_addresses_included": false,
|
|
"raw_evidence_retained_locally": true,
|
|
"raw_evidence_sha256": "c1d3cbae7498e09aa4e54da7ebb0dccf3852f02ee425b59732aff80cbe2d72d3",
|
|
"sanitized_output_sha256": "c1d3cbae7498e09aa4e54da7ebb0dccf3852f02ee425b59732aff80cbe2d72d3",
|
|
"output_truncated_in_json": false,
|
|
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
|
|
"output": "COMMAND_ID=SUPPORT-260915-INFRA-DR-BACKUPV2-CT112-CLOUD-SEAL-CONTRACT-PREFLIGHT-427R1\nMODE=READ_ONLY_CT112_CLOUD_SEAL_CONTRACT_PREFLIGHT\nNO_BACKUP_EXECUTION=YES\nNO_VZDUMP_EXECUTION=YES\nNO_CLOUD_ACCESS=YES\nNO_RCLONE_EXECUTION=YES\nNO_CLOUD_DELETION=YES\nNO_SYSTEMD_MUTATION=YES\nNO_FILE_MUTATION=YES\nPRODUCTION_AND_CANDIDATE_IDENTITY=PASS\nSOURCE_SET_IDENTITY=PASS\nG426_IMMUTABLE_COMMIT=8e261f22b35fe49616ab7c2e23f5cac3a5b66376\nG426_STAGE_BINDING=PASS\nG426_GENERATION=G426-20260915T115318Z-d9bb39ace5781d2e\nG426_PAYLOAD_BYTES=223855196\nG426_PAYLOAD_SHA256=8b7ed12905966302695ab4d8a3de81c171ed516e1f072eb1f761aace05cecd12\nG426_PAYLOAD_MODE=0400\nCLOUD_ENGINE_OWNER_GRAPH=PASS\nGUEST266_RUN_FLOW_CONTRACT={\"direct_calls\":[\"Path\",\"all\",\"callable\",\"check_result\",\"clock\",\"compression_check\",\"core.canonical_bytes\",\"core.manifest_hash\",\"core.valid_name\",\"core.validate_inventory\",\"guard\",\"int\",\"job.get\",\"large.cleanup\",\"large.discover\",\"large.restore\",\"large.upload\",\"len\",\"produce\",\"producer.validate_job\",\"say\",\"state_guard\",\"t.create\",\"t.make_dir\",\"t.need\",\"time.time\"],\"signature\":\"(job, work, entries, cloud, reader, produce, state_guard, guard, compression_check, generation, say, clock=<function <lambda> at 0x76417f8f07c0>)\",\"source\":\"def run_flow(job,work,entries,cloud,reader,produce,state_guard,guard,compression_check,generation,say,clock=lambda:int(time.time())):\\n \\\"\\\"\\\"Caller provides real fresh PVE guards; simulation callbacks live in tests only.\\\"\\\"\\\"\\n producer.validate_job(job,clock());core.validate_inventory(entries)\\n t.need(job['type']=='lxc' and job.get('compression_dependent') is False,'FIRST_GUEST_POLICY')\\n t.need(core.valid_name(generation),'GENERATION_ID')\\n t.need(all(callable(f) for f in (produce,state_guard,guard,compression_check,say,clock)),'CALLBACKS_REQUIRED')\\n work=Path(work);state_guard();guard()\\n for sub in ('producer','upload','restore'):t.make_dir(work/sub,exclusive=True)\\n say('PHASE','REAL_SINGLE_GUEST_SNAPSHOT')\\n produced=produce(job,work/'producer')\\n source=check_result(produced,job,work/'producer');state_guard();guard()\\n t.create(work/'PRODUCER.json',core.canonical_bytes(produced))\\n say('PRODUCER_RC',0);say('PAYLOAD_BYTES',produced['size']);say('ARCHIVE_SHA256',produced['sha256'])\\n logical='guest-%s-%s-%d'%(job['node'],job['type'],job['vmid'])\\n say('PHASE','TWO_REPLICA_UPLOAD_AND_READBACK')\\n up=large.upload(source,work/'upload',entries,cloud,generation,logical,RESERVE_BYTES,guard,clock=clock)\\n t.need(up['manifest']['payload_bytes']==produced['size'] and up['manifest']['payload_sha256']==produced['sha256'],'MANIFEST_PRODUCER_MISMATCH')\\n say('SEALED_QUORUM_VERIFIED','YES');mh=core.manifest_hash(up['manifest']);say('MANIFEST_SHA256',mh)\\n say('PHASE','CLOUD_DISCOVERY_AND_ARCHIVE_RECONSTRUCTION')\\n found=large.discover(reader,entries,logical,mh)\\n restored=large.restore(work/'restore',reader,found)\\n t.need(compression_check(work/'restore/restored.bin') is True,'RECONSTRUCTED_COMPRESSION_FAILED')\\n state_guard();guard();say('PHASE','GUARDED_LOCAL_PAYLOAD_CLEANUP')\\n count=large.cleanup(up,restored,reader,guard)\\n return {'state':'SINGLE_GUEST_ARCHIVE_SEALED_AND_CLOUD_RECONSTRUCTED','vmid':job['vmid'],'type':job['type'],'node':job['node'],\\n 'generation':generation,'logical_id':logical,'manifest_sha256':mh,'payload_bytes':produced['size'],'payload_sha256':produced['sha256'],\\n 'replicas':up['manifest']['replicas'],'parts_count':len(up['manifest']['parts']),'archive_cloud_restore_verified':True,\\n 'guest_restore_verified':False,'application_consistency_verified':False,'whole_node_backup':False,'local_payload_files_remaining':0,\\n 'files_deleted':count,'accounts_scanned':found['accounts_scanned'],'config_sha256':job['config_sha256']}\\n\",\"source_sha256\":\"789140b440fc756f99c8979b543c60a44ada096b5acece83e7173791f23bb55c\"}\nLARGE264_UPLOAD_CONTRACT={\"direct_calls\":[\"Path\",\"clock\",\"cloud.absent\",\"cloud.bind\",\"cloud.get\",\"cloud.put\",\"cloud.quota\",\"cloud.read_stream\",\"core.allocate\",\"core.canonical_bytes\",\"core.make_manifest\",\"core.manifest_hash\",\"core.quota_reason\",\"core.valid_name\",\"core.validate_inventory\",\"core.verify_receipts\",\"guard\",\"hashlib.sha256\",\"int\",\"len\",\"r.validate_seal\",\"receipt\",\"receipts.append\",\"s.split_file\",\"s.verify_parts\",\"str\",\"t.create\",\"t.make_dir\",\"t.need\",\"t.sha\",\"time.time\"],\"signature\":\"(source, work, entries, cloud, generation, logical_id, reserve, guard, clock=<function <lambda> at 0x76417facc180>)\",\"source\":\"def upload(source,work,entries,cloud,generation,logical_id,reserve,guard,clock=lambda:int(time.time())):\\n \\\"\\\"\\\"Upload and seal; retain all source bytes here. Cleanup is a later gated operation.\\\"\\\"\\\"\\n work=Path(work);source=Path(source);guard();core.validate_inventory(entries)\\n t.need(core.valid_name(generation) and core.valid_name(logical_id),'GENERATION_ID')\\n partdir=work/'parts';t.make_dir(partdir,exclusive=True)\\n record=s.split_file(source,partdir)\\n t.create(work/'parts-record.json',core.canonical_bytes(record))\\n quotas={e['account_id']:cloud.quota(e['crypt_remote']) for e in entries}\\n allocation=core.allocate(entries,quotas,record['payload_bytes'],reserve,clock())\\n m=core.make_manifest(generation,logical_id,record['payload_bytes'],record['payload_sha256'],record['parts'],allocation)\\n mb=core.canonical_bytes(m);mh=core.manifest_hash(m);cloud.bind(m)\\n t.create(work/'allocation.json',core.canonical_bytes(allocation));t.create(work/'manifest.json',mb)\\n for rep in m['replicas']:\\n guard();cloud.absent(rep['crypt_remote'])\\n receipts=[]\\n for rep in m['replicas']:\\n guard();remote=rep['crypt_remote'];q=cloud.quota(remote)\\n t.need(core.quota_reason(q,clock()) is None and q['free']>=allocation['required_free_bytes'],'SELECTED_ACCOUNT_CAPACITY_CHANGED')\\n s.verify_parts(partdir,record)\\n for part in m['parts']:cloud.put(remote,part['name'],partdir/part['name'])\\n cloud.put(remote,'manifest.json',work/'manifest.json')\\n t.need(cloud.get(remote,'manifest.json',len(mb)+1)==mb,'MANIFEST_READBACK_MISMATCH')\\n whole=hashlib.sha256();count=0\\n for part in m['parts']:\\n observed=cloud.read_stream(remote,part['name'],part['size'],part['sha256'],whole.update)\\n t.need(observed=={'size':part['size'],'sha256':part['sha256']},'PART_READBACK_MISMATCH');count+=observed['size']\\n receipts.append(receipt(rep,m,whole,count));t.create(work/('receipt-%d.json'%len(receipts)),core.canonical_bytes(receipts[-1]))\\n core.verify_receipts(m,receipts)\\n seal={'schema_version':2,'state':'SEALED','generation':generation,'logical_id':logical_id,\\n 'manifest_sha256':mh,'replicas':m['replicas'],'receipts':receipts,\\n 'acceptance':'IDENTICAL_SEAL_REQUIRED_ON_BOTH_NAMED_ACCOUNTS'}\\n sb=core.canonical_bytes(seal);t.need(len(sb)<=core.SEAL_MAX_BYTES,'SEAL_BOUND')\\n r.validate_seal(sb,entries,generation,logical_id);t.create(work/'SEALED.json',sb)\\n for rep in m['replicas']:\\n guard();cloud.put(rep['crypt_remote'],'SEALED.json',work/'SEALED.json')\\n for rep in m['replicas']:\\n t.need(cloud.get(rep['crypt_remote'],'SEALED.json',len(sb)+1)==sb,'SEALED_QUORUM_REQUIRED')\\n guard();s.verify_parts(partdir,record)\\n t.create(work/'QUORUM_VERIFIED.json',core.canonical_bytes({'manifest_sha256':mh,'seal_sha256':t.sha(sb)}))\\n return {'sealed':True,'manifest':m,'seal_bytes':sb,'parts_record':record,'source':str(source),'work':str(work)}\\n\",\"source_sha256\":\"3fc04eea643b977e58713bea8a7b9bcfd485e60251a4393874dfe1a428014bbe\"}\nLARGE264_RESTORE_CONTRACT={\"direct_calls\":[\"Path\",\"cloud.read_stream\",\"core.canonical_bytes\",\"core.manifest_hash\",\"core.validate_manifest\",\"core.verify_receipts\",\"download_part\",\"enumerate\",\"fresh_seals\",\"hashlib.sha256\",\"receipt\",\"receipts.append\",\"s.reassemble\",\"str\",\"t.create\",\"t.make_dir\",\"t.need\"],\"signature\":\"(work, cloud, discovery)\",\"source\":\"def restore(work,cloud,discovery):\\n \\\"\\\"\\\"Reconstruct one replica on disk; hash every byte of the other independently.\\\"\\\"\\\"\\n work=Path(work);m=discovery['manifest'];core.validate_manifest(m)\\n partdir=work/'parts';t.make_dir(partdir,exclusive=True);owned={};receipts=[]\\n for i,rep in enumerate(m['replicas']):\\n whole=hashlib.sha256();count=0\\n for part in m['parts']:\\n if i==0:owned[part['name']]=download_part(cloud,rep,m,part,partdir/part['name'],whole)\\n else:\\n got=cloud.read_stream(rep['crypt_remote'],m['generation'],part['name'],part['size'],part['sha256'],whole.update)\\n t.need(got=={'size':part['size'],'sha256':part['sha256']},'PART_DOWNLOAD_MISMATCH')\\n count+=part['size']\\n receipts.append(receipt(rep,m,whole,count))\\n core.verify_receipts(m,receipts);fresh_seals(cloud,discovery)\\n rec={'schema_version':1,'payload_bytes':m['payload_bytes'],'payload_sha256':m['payload_sha256'],\\n 'part_bytes':core.PART_BYTES,'parts':m['parts'],'owned':owned,'source_identity':[0]*8}\\n result=s.reassemble(partdir,rec,work/'restored.bin')\\n fresh_seals(cloud,discovery)\\n t.create(work/'RESTORE_VERIFIED.json',core.canonical_bytes({'manifest_sha256':core.manifest_hash(m),'verified_replicas':2,\\n 'accounts_scanned':discovery['accounts_scanned'],'payload_bytes':result['size'],'payload_sha256':result['sha256']}))\\n return {'verified_replicas':2,'manifest_sha256':core.manifest_hash(m),'discovery':discovery,\\n 'parts_record':rec,'reassembled':result,'work':str(work)}\\n\",\"source_sha256\":\"0a73a874d1354b5a63645f4848a9bae933e463e444c3db177ab07c01ecd1f614\"}\nLARGE264_DISCOVER_CONTRACT={\"direct_calls\":[\"all\",\"blobs.append\",\"candidates.append\",\"cloud.get\",\"cloud.list_generations\",\"core.canonical_bytes\",\"core.valid_hash\",\"core.valid_name\",\"core.validate_inventory\",\"core.validate_manifest\",\"core.verify_receipts\",\"generations.update\",\"iter\",\"len\",\"next\",\"r.strict_json\",\"r.validate_seal\",\"seen.values\",\"set\",\"sorted\",\"t.need\",\"t.sha\",\"type\"],\"signature\":\"(cloud, entries, logical_id, expected_hash)\",\"source\":\"def discover(cloud,entries,logical_id,expected_hash):\\n \\\"\\\"\\\"Find placement from all cloud catalogs, using only an external manifest digest.\\\"\\\"\\\"\\n core.validate_inventory(entries)\\n t.need(core.valid_name(logical_id) and core.valid_hash(expected_hash),'DISCOVERY_INPUT')\\n listed={};generations=set()\\n for e in entries:\\n gs=cloud.list_generations(e['crypt_remote'])\\n t.need(type(gs) is list and len(gs)<=r.MAX_GENERATIONS and all(core.valid_name(g) for g in gs),'GENERATION_LIST_INVALID')\\n t.need(len(gs)==len(set(gs)),'GENERATION_LIST_DUPLICATE');listed[e['crypt_remote']]=set(gs);generations.update(gs)\\n t.need(len(generations)<=r.MAX_GENERATIONS,'TOTAL_GENERATIONS_BOUND')\\n candidates=[]\\n for gen in sorted(generations):\\n seen={}\\n for e in entries:\\n remote=e['crypt_remote']\\n if gen not in listed[remote]:continue\\n b=cloud.get(remote,gen,'SEALED.json',core.SEAL_MAX_BYTES+1,missing_ok=True)\\n if b is None:continue\\n seal=r.validate_seal(b,entries,gen,logical_id)\\n t.need(remote in {x['crypt_remote'] for x in seal['replicas']},'UNNAMED_SEAL_LOCATION');seen[remote]=(b,seal)\\n if not seen:continue\\n sb,seal=next(iter(seen.values()))\\n if seal['manifest_sha256']!=expected_hash:continue\\n named={x['crypt_remote'] for x in seal['replicas']}\\n t.need(set(seen)==named and all(b==sb for b,_ in seen.values()),'IDENTICAL_TWO_SEALS_REQUIRED')\\n blobs=[]\\n for rep in seal['replicas']:\\n b=cloud.get(rep['crypt_remote'],gen,'manifest.json',core.MANIFEST_MAX_BYTES+1)\\n t.need(type(b) is bytes and t.sha(b)==expected_hash,'MANIFEST_DIGEST_MISMATCH')\\n m=r.strict_json(b,core.MANIFEST_MAX_BYTES);core.validate_manifest(m)\\n t.need(m['generation']==gen and m['logical_id']==logical_id and m['replicas']==seal['replicas'],'MANIFEST_PLACEMENT')\\n t.need(core.canonical_bytes(m)==b,'MANIFEST_CANONICAL_BYTES');core.verify_receipts(m,seal['receipts']);blobs.append(b)\\n t.need(len(blobs)==2 and blobs[0]==blobs[1],'TWO_MANIFEST_COPIES_REQUIRED')\\n candidates.append({'manifest':m,'seal_bytes':sb,'accounts_scanned':len(listed)})\\n t.need(len(candidates)==1,'EXACTLY_ONE_ACCEPTED_GENERATION_REQUIRED')\\n return candidates[0]\\n\",\"source_sha256\":\"0f9d514dfa0985bfa0ee6446aa85a78377346003039896395cb39e0bf3643702\"}\nLARGE264_CLEANUP_CONTRACT={\"direct_calls\":[\"Path\",\"any\",\"core.canonical_bytes\",\"core.manifest_hash\",\"core.validate_manifest\",\"core.verify_receipts\",\"fresh_seals\",\"guard\",\"items.append\",\"len\",\"os.close\",\"os.fsync\",\"os.stat\",\"os.unlink\",\"p.exists\",\"p.is_symlink\",\"r.strict_json\",\"restore_result.get\",\"s.hash_file\",\"s.validate_record\",\"s.verify_parts\",\"str\",\"t.ident\",\"t.need\",\"t.open_dir\",\"tuple\",\"type\",\"upload_result.get\"],\"signature\":\"(upload_result, restore_result, cloud, guard)\",\"source\":\"def cleanup(upload_result,restore_result,cloud,guard):\\n \\\"\\\"\\\"No unlink until every expected file and both remote seals have passed verification.\\\"\\\"\\\"\\n t.need(type(upload_result) is dict and upload_result.get('sealed') is True,'UPLOAD_QUORUM_REQUIRED')\\n t.need(type(restore_result) is dict and restore_result.get('verified_replicas')==2,'RESTORE_REQUIRED')\\n m=upload_result['manifest'];core.validate_manifest(m);mh=core.manifest_hash(m)\\n t.need(restore_result['manifest_sha256']==mh,'RESTORE_GENERATION_MISMATCH')\\n t.need(core.canonical_bytes(restore_result['discovery']['manifest'])==core.canonical_bytes(m) and\\n restore_result['discovery']['seal_bytes']==upload_result['seal_bytes'],'RESTORE_QUORUM_MISMATCH')\\n core.verify_receipts(m,r.strict_json(upload_result['seal_bytes'],core.SEAL_MAX_BYTES)['receipts'])\\n guard();fresh_seals(cloud,restore_result['discovery'])\\n items=[]\\n for record,base in ((upload_result['parts_record'],Path(upload_result['work'])/'parts'),\\n (restore_result['parts_record'],Path(restore_result['work'])/'parts')):\\n s.validate_record(record);s.verify_parts(base,record)\\n for part in record['parts']:items.append((base/part['name'],tuple(record['owned'][part['name']]),part['size'],part['sha256']))\\n items.append((Path(upload_result['source']),tuple(upload_result['parts_record']['source_identity']),m['payload_bytes'],m['payload_sha256']))\\n items.append((Path(restore_result['work'])/'restored.bin',tuple(restore_result['reassembled']['identity']),m['payload_bytes'],m['payload_sha256']))\\n t.need(len({str(p) for p,_,_,_ in items})==len(items),'CLEANUP_DUPLICATE_PATH')\\n for p,identity,size,h in items:\\n n,d,seen=s.hash_file(p,size);t.need(seen==identity and n==size and d==h,'CLEANUP_IDENTITY_OR_HASH')\\n guard();fresh_seals(cloud,restore_result['discovery'])\\n for p,identity,size,h in items:\\n parent=t.open_dir(p.parent)\\n try:\\n t.need(t.ident(os.stat(p.name,dir_fd=parent,follow_symlinks=False))==identity,'CLEANUP_FILE_CHANGED')\\n os.unlink(p.name,dir_fd=parent);os.fsync(parent)\\n finally:os.close(parent)\\n t.need(not any(p.exists() or p.is_symlink() for p,_,_,_ in items),'LOCAL_CLEANUP_INCOMPLETE')\\n return len(items)\\n\",\"source_sha256\":\"2cbbf3325b84192705686a2c6d3a02f58a75f51145f68204786e08194013cd3b\"}\nLARGE264_FUNCTION_INDEX={\"cleanup\":\"(upload_result, restore_result, cloud, guard)\",\"discover\":\"(cloud, entries, logical_id, expected_hash)\",\"download_part\":\"(cloud, rep, m, part, path, whole)\",\"flags\":\"(executable, snapshot, work, args)\",\"fresh_seals\":\"(cloud, discovery)\",\"process_stream\":\"(argv, env, size, digest, consume, seconds)\",\"random_source\":\"(path, size=536870929)\",\"receipt\":\"(rep, m, whole, count)\",\"restore\":\"(work, cloud, discovery)\",\"upload\":\"(source, work, entries, cloud, generation, logical_id, reserve, guard, clock=<function <lambda> at 0x76417facc180>)\"}\nTEST_GUEST266_STORE_SOURCE={\"source\":\"class Store:\\n def __init__(self,mode='ok'):self.objects={};self.m=None;self.mode=mode\\n def quota(self,remote):return {'ok':True,'observed_at':NOW,'total':1000*G,'used':0,'free':1000*G-int(remote[1:])*1000}\\n def bind(self,m):self.m=m\\n def absent(self,remote):\\n if self.mode=='collision':raise t.Stop('COLLISION')\\n def put(self,remote,name,path):\\n if remote==self.m['replicas'][1]['crypt_remote'] and (self.mode=='second' or self.mode=='second_seal' and name=='SEALED.json'):raise t.Stop('TEST_FAILURE')\\n key=(remote,self.m['generation'],name)\\n if key in self.objects:raise t.Stop('COLLISION')\\n self.objects[key]=Path(path).read_bytes()\\n def get(self,remote,name,limit):return self.objects[(remote,self.m['generation'],name)][:limit]\\n def read_stream(self,remote,name,size,h,consume):\\n b=self.get(remote,name,size+1);sink=s.DigestSink(size,h)\\n for i in range(0,len(b),257):sink.feed(b[i:i+257]);consume(b[i:i+257])\\n return sink.finish()\\n\",\"source_sha256\":\"e45ff3e4e95d841661711a92f70d6f927351f9e6d60a3325fece9de4669b0664\"}\nTEST_GUEST266_READER_SOURCE={\"source\":\"class Reader:\\n def __init__(self,store,mode='ok'):self.store=store;self.mode=mode;self.listed=[]\\n def list_generations(self,remote):\\n self.listed.append(remote)\\n return sorted({gen for r,gen,n in self.store.objects if r==remote})\\n def get(self,remote,gen,name,limit,missing_ok=False):\\n v=self.store.objects.get((remote,gen,name))\\n if v is None and missing_ok:return None\\n if v is None:raise t.Stop('MISSING')\\n return v[:limit]\\n def read_stream(self,remote,gen,name,size,h,consume):\\n b=self.get(remote,gen,name,size+1)\\n if self.mode=='corrupt' and remote==self.store.m['replicas'][1]['crypt_remote']:b=b'!'+b[1:]\\n sink=s.DigestSink(size,h)\\n for i in range(0,len(b),257):sink.feed(b[i:i+257]);consume(b[i:i+257])\\n return sink.finish()\\n\",\"source_sha256\":\"dd76a1f73d7b66ecb837c2b80514a45f5ffd265d819aec6bda3d92d8113d1fcb\"}\nTEST_GUEST266_INVENTORY_CONTRACT={\"direct_calls\":[\"('acct%d' % i).encode\",\"range\",\"t.sha\"],\"signature\":\"()\",\"source\":\"def inventory():return [{'account_id':t.sha(('acct%d'%i).encode()),'crypt_remote':'c%d'%i,'mail_remote':'m%d'%i,'wrapped_path':'bucket'} for i in range(13)]\\n\",\"source_sha256\":\"4f0238dd193df9eb06953459c1e6dbe8eef7f7d3cdd3712be7d3c27b9abd6559\"}\nTEST_PRODUCER282_E2E_SOURCE={\"source\":\" def test_fresh_archive_flows_through_existing_two_replica_engine(self):\\n import guest266 as guest\\n import test_guest266 as support\\n job,tools=self.fixture();work=self.root/'generation';work.mkdir(mode=0o700)\\n store=support.Store();now=int(time.time())\\n def quota(remote):return {'ok':True,'observed_at':now,'total':1000*1024**3,'used':0,'free':1000*1024**3-int(remote[1:])*1000}\\n store.quota=quota\\n def prod(j,p):return f.produce(j,p,tools,lambda:None,mapping=MAP,expected_config=job['config_sha256'],emit=lambda k,v:self.events.append((k,v)))\\n def crc(p):return subprocess.run(['/usr/bin/zstd','--test','--quiet',str(p)],stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL).returncode==0\\n result=guest.run_flow(job,work,support.inventory(),store,support.Reader(store),prod,lambda:None,lambda:None,crc,'G268-fixture',lambda k,v:None,clock=lambda:now)\\n self.assertEqual(result['local_payload_files_remaining'],0);self.assertTrue(result['archive_cloud_restore_verified']);self.assertFalse(result['guest_restore_verified'])\\n self.assertTrue((work/'producer/producer.stderr.log').exists());self.assertFalse((work/'producer/guest-112.tar.zst').exists())\\n\",\"source_sha256\":\"a6de003495ee86836bb1bffb2a22a124331a4323726f5715c2a934d445d6b24f\"}\nCANDIDATE_CLOUD_ADAPTER_REFERENCES=[{\"file\":\"large264.py\",\"line\":56,\"line_sha256\":\"4ab4edc665f49c291b4ca5abb42b2e27a74403237f18eeabafab26dfb6dbbfd5\",\"tokens\":[\"class\",\"CloudLarge\",\"t\",\"RcloneIO\"]},{\"file\":\"large264.py\",\"line\":59,\"line_sha256\":\"d9107b9e748f739f75a51ce83c5708419ce820ae1090723ab8026949927e02c4\",\"tokens\":[\"t\",\"need\",\"type\",\"args\",\"is\",\"list\",\"and\",\"args\",\"and\",\"args\",\"in\",\"about\",\"lsjson\",\"copyto\",\"cat\",\"RCLONE_VERB_FORBIDDEN\"]},{\"file\":\"large264.py\",\"line\":61,\"line_sha256\":\"64b38e98ebced99e31c8f94c752a2767cae4b427e23d07bd1e3064ef4a2e2c45\",\"tokens\":[\"self\",\"check\",\"seconds\",\"min\",\"if\",\"args\",\"copyto\",\"else\",\"self\",\"deadline\",\"time\",\"monotonic\"]},{\"file\":\"large264.py\",\"line\":63,\"line_sha256\":\"95e28cb4c920f1f05c3b36f067a836e937b488aacbd4b8464d96b9c41b3e7575\",\"tokens\":[\"if\",\"args\",\"copyto\",\"self\",\"writes_attempted\"]},{\"file\":\"large264.py\",\"line\":74,\"line_sha256\":\"f69498f74dc185afaea74dad0cbe99178138f77cd288369e3cd6e9eba05ea4ec\",\"tokens\":[\"rc\",\"_\",\"self\",\"call\",\"lsjson\",\"dest\",\"stat\"]},{\"file\":\"large264.py\",\"line\":78,\"line_sha256\":\"ff1b43c434f93c38e81d2b9bd559e31baef49dcf3ed4bde121b02f72b38f607f\",\"tokens\":[\"rc\",\"_\",\"self\",\"call\",\"copyto\",\"str\",\"path\",\"dest\",\"immutable\",\"no\",\"update\",\"modtime\"]},{\"file\":\"large264.py\",\"line\":132,\"line_sha256\":\"6cad508b04c1979421f1df76e719cf88139404497f82f198f9aeb30afe55c6b3\",\"tokens\":[\"quotas\",\"e\",\"account_id\",\"cloud\",\"quota\",\"e\",\"crypt_remote\",\"for\",\"e\",\"in\",\"entries\"]},{\"file\":\"large264.py\",\"line\":141,\"line_sha256\":\"501fc63af37bd9126f146bbc6562c1d135cfca1f67db3ef1f53a9b949fdc61e7\",\"tokens\":[\"guard\",\"remote\",\"rep\",\"crypt_remote\",\"q\",\"cloud\",\"quota\",\"remote\"]},{\"file\":\"restore262.py\",\"line\":3,\"line_sha256\":\"bbd85fe87a59f8247a0a1a5cc42ed497bbafdfbc87e03590612447d705256d9e\",\"tokens\":[\"Cloud\",\"access\",\"is\",\"strictly\",\"lsjson\",\"cat\",\"No\",\"source\",\"local\",\"workspace\",\"manifest\",\"receipt\"]},{\"file\":\"restore262.py\",\"line\":50,\"line_sha256\":\"e442d31b20e2eff9207d7fc0b651516ba35d205677719c9a2add3f1e0f5090ce\",\"tokens\":[\"t\",\"need\",\"t\",\"sha\",\"t\",\"read_secure\",\"self\",\"executable\",\"self\",\"exe_sha\",\"RCLONE_BINARY_CHANGED\"]},{\"file\":\"restore262.py\",\"line\":62,\"line_sha256\":\"a1c27af31b577ebbce3ccfffad12e19986dc4af9437cf454480c2dd49dda9c94\",\"tokens\":[\"t\",\"need\",\"type\",\"args\",\"is\",\"list\",\"and\",\"args\",\"and\",\"args\",\"in\",\"lsjson\",\"cat\",\"READ_ONLY_CLOUD_VERB_REQUIRED\"]},{\"file\":\"restore262.py\",\"line\":69,\"line_sha256\":\"93cbda6a3396bc2369974f589ad0a1494e7561a293ebadfe361c38d64f8acf87\",\"tokens\":[\"rc\",\"out\",\"self\",\"call\",\"lsjson\",\"self\",\"address\",\"remote\",\"dirs\",\"only\",\"max\",\"depth\"]},{\"file\":\"stream263.py\",\"line\":3,\"line_sha256\":\"14c9c361fa8ac5652d5ee51d2f3f18721d40d02442fb2e0e3da2c5cbe47cc99a\",\"tokens\":[\"No\",\"executable\",\"entry\",\"point\",\"network\",\"rclone\",\"backup\",\"execution\",\"sealing\",\"or\",\"deletion\"]},{\"file\":\"test_guest266.py\",\"line\":25,\"line_sha256\":\"23b4bb50f445dce73aec7ebd298f7d6ecb1063c6049601af0dae6061f7f9636d\",\"tokens\":[\"def\",\"quota\",\"self\",\"remote\",\"return\",\"ok\",\"True\",\"observed_at\",\"NOW\",\"total\",\"G\",\"used\",\"free\",\"G\",\"int\",\"remote\"]},{\"file\":\"test_producer282.py\",\"line\":190,\"line_sha256\":\"b54584f63e7cb14df8cb2c66db5cbd015113fca4052614c02df0996f2a6b8f7f\",\"tokens\":[\"def\",\"quota\",\"remote\",\"return\",\"ok\",\"True\",\"observed_at\",\"now\",\"total\",\"used\",\"free\",\"int\",\"remote\"]},{\"file\":\"test_pve270.py\",\"line\":189,\"line_sha256\":\"b54584f63e7cb14df8cb2c66db5cbd015113fca4052614c02df0996f2a6b8f7f\",\"tokens\":[\"def\",\"quota\",\"remote\",\"return\",\"ok\",\"True\",\"observed_at\",\"now\",\"total\",\"used\",\"free\",\"int\",\"remote\"]},{\"file\":\"transport261.py\",\"line\":3,\"line_sha256\":\"44ce8b584aa0bd838288d3f181dd94c706cb7198cd5d7265305d1432647338c0\",\"tokens\":[\"Only\",\"about\",\"lsjson\",\"copyto\",\"and\",\"cat\",\"are\",\"permitted\",\"A\",\"completed\",\"canary\",\"is\",\"a\",\"small\"]},{\"file\":\"transport261.py\",\"line\":171,\"line_sha256\":\"7bd06d43b3c7c43e92988bc7f5bc79c61ff5a4cdeb0dbc2c719bc09d6d5296bd\",\"tokens\":[\"class\",\"RcloneIO\"]},{\"file\":\"transport261.py\",\"line\":185,\"line_sha256\":\"0a241b5e17035863793b414ac6576aa655e63cae48232001b88b38d46c593b7f\",\"tokens\":[\"need\",\"sha\",\"read_secure\",\"self\",\"executable\",\"self\",\"exe_sha\",\"RCLONE_BINARY_CHANGED\"]},{\"file\":\"transport261.py\",\"line\":187,\"line_sha256\":\"e4da1a906be5d6978f3a47abcd8d524463a8c41ec17dae4a813aec34f6d2349d\",\"tokens\":[\"need\",\"args\",\"in\",\"about\",\"lsjson\",\"copyto\",\"cat\",\"RCLONE_VERB_FORBIDDEN\"]},{\"file\":\"transport261.py\",\"line\":193,\"line_sha256\":\"95e28cb4c920f1f05c3b36f067a836e937b488aacbd4b8464d96b9c41b3e7575\",\"tokens\":[\"if\",\"args\",\"copyto\",\"self\",\"writes_attempted\"]},{\"file\":\"transport261.py\",\"line\":197,\"line_sha256\":\"a887c54bf0d144f2fb71086d385dd1eecd5f3c4ed54c8d46fd3775be00275e3e\",\"tokens\":[\"def\",\"quota\",\"self\",\"remote\"]},{\"file\":\"transport261.py\",\"line\":219,\"line_sha256\":\"b8f85d8b53248a1a6741103aa8ec42a948488b1daca961287026505b0754bafb\",\"tokens\":[\"rc\",\"_\",\"self\",\"call\",\"lsjson\",\"self\",\"address\",\"remote\",\"max\",\"depth\"]},{\"file\":\"transport261.py\",\"line\":224,\"line_sha256\":\"f69498f74dc185afaea74dad0cbe99178138f77cd288369e3cd6e9eba05ea4ec\",\"tokens\":[\"rc\",\"_\",\"self\",\"call\",\"lsjson\",\"dest\",\"stat\"]},{\"file\":\"transport261.py\",\"line\":227,\"line_sha256\":\"ec6a68482d4a09142676ac25a5010d18bdcf8b21d9f60067e857f5818c3e1311\",\"tokens\":[\"rc\",\"_\",\"self\",\"call\",\"copyto\",\"str\",\"path\",\"dest\",\"immutable\",\"no\",\"update\",\"modtime\"]},{\"file\":\"transport261.py\",\"line\":248,\"line_sha256\":\"12f619354bdfdb6783b881c113091a83637a533c3de9b7e185e8ed9e8bd35f60\",\"tokens\":[\"for\",\"e\",\"in\",\"entries\",\"quotas\",\"e\",\"account_id\",\"cloud\",\"quota\",\"e\",\"crypt_remote\"]},{\"file\":\"transport261.py\",\"line\":255,\"line_sha256\":\"3ecbce0f455e711bb54ae15ac845dc3de4e46d8ba23713ec58ec4d7f8eea8815\",\"tokens\":[\"q\",\"cloud\",\"quota\",\"e\",\"crypt_remote\"]},{\"file\":\"v2core.py\",\"line\":110,\"line_sha256\":\"1a51f0e9266b714dd0ebfaf2043d97756197268e3676b2897d53e570528ee2fc\",\"tokens\":[\"rclone\",\"crypt\",\"byte\",\"header\",\"plus\",\"per\",\"nonempty\",\"KiB\",\"block\"]}]\nG426_PAYLOAD_POST_INSPECTION_SHA256=8b7ed12905966302695ab4d8a3de81c171ed516e1f072eb1f761aace05cecd12\nPRODUCTION_POST_PREFLIGHT_UNCHANGED=PASS\nCANDIDATE_POST_PREFLIGHT_UNCHANGED=PASS\nCLOUD_SEAL_CONTRACT_PREFLIGHT=PASS\nSTATUS=OK\nPHASE=COMPLETE\nREASON=NONE\nNEXT_GATE=CT112_REAL_BACKUP_1_TWO_REPLICA_SEAL_IMPLEMENTATION\nCHANGES_MADE=false\nMUTATION_OUTCOME=NO_MUTATION\nBACKUP_EXECUTIONS=0\nVZDUMP_EXECUTIONS=0\nCLOUD_WRITES=0\nCLOUD_DELETIONS=0\nSYSTEMD_MUTATIONS=0\nSCHEDULER_CUTOVER=NO\nLEGACY_BACKUP_DISABLES=0\nLOCAL_G426_PAYLOAD_PRESERVED=YES\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260915-INFRA-DR-BACKUPV2-CT112-CLOUD-SEAL-CONTRACT-PREFLIGHT-427R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\n"
|
|
}
|