81 lines
27 KiB
Plaintext
81 lines
27 KiB
Plaintext
CHAT_OUTPUT_BEGIN
|
|
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
|
|
REFERENCE_REGISTER_CHECK=OK
|
|
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
|
|
ERROR_REGISTER_CHECK=OK
|
|
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
|
|
COMMAND_SHA256=c92db35b051b231f28f75dee8513620581c9e13c76afce192d2ec6fee0e4f079
|
|
DUPLICATE_FAILED_COMMAND_BLOCKED=false
|
|
EXECUTION_STARTED=true
|
|
CHANGE_DECLARED=false
|
|
RESULT_CONTRACT_VALID=true
|
|
RESULT_CONTRACT_STATUS=NOT_APPLICABLE
|
|
RESULT_CONTRACT_ERROR=NONE
|
|
COMMAND_RC=0
|
|
CHANGES_MADE=false
|
|
ROLLBACK_STARTED=false
|
|
ROLLBACK_RESTORED=null
|
|
MUTATION_OUTCOME=NO_MUTATION
|
|
SANITIZED=yes
|
|
SECRETS_INCLUDED=no
|
|
PRIVATE_ADDRESSES_INCLUDED=no
|
|
RAW_EVIDENCE_SHA256=c1d3cbae7498e09aa4e54da7ebb0dccf3852f02ee425b59732aff80cbe2d72d3
|
|
SANITIZED_OUTPUT_SHA256=c1d3cbae7498e09aa4e54da7ebb0dccf3852f02ee425b59732aff80cbe2d72d3
|
|
OUTPUT_BEGIN
|
|
COMMAND_ID=SUPPORT-260915-INFRA-DR-BACKUPV2-CT112-CLOUD-SEAL-CONTRACT-PREFLIGHT-427R1
|
|
MODE=READ_ONLY_CT112_CLOUD_SEAL_CONTRACT_PREFLIGHT
|
|
NO_BACKUP_EXECUTION=YES
|
|
NO_VZDUMP_EXECUTION=YES
|
|
NO_CLOUD_ACCESS=YES
|
|
NO_RCLONE_EXECUTION=YES
|
|
NO_CLOUD_DELETION=YES
|
|
NO_SYSTEMD_MUTATION=YES
|
|
NO_FILE_MUTATION=YES
|
|
PRODUCTION_AND_CANDIDATE_IDENTITY=PASS
|
|
SOURCE_SET_IDENTITY=PASS
|
|
G426_IMMUTABLE_COMMIT=8e261f22b35fe49616ab7c2e23f5cac3a5b66376
|
|
G426_STAGE_BINDING=PASS
|
|
G426_GENERATION=G426-20260915T115318Z-d9bb39ace5781d2e
|
|
G426_PAYLOAD_BYTES=223855196
|
|
G426_PAYLOAD_SHA256=8b7ed12905966302695ab4d8a3de81c171ed516e1f072eb1f761aace05cecd12
|
|
G426_PAYLOAD_MODE=0400
|
|
CLOUD_ENGINE_OWNER_GRAPH=PASS
|
|
GUEST266_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"}
|
|
LARGE264_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"}
|
|
LARGE264_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"}
|
|
LARGE264_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"}
|
|
LARGE264_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"}
|
|
LARGE264_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>)"}
|
|
TEST_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"}
|
|
TEST_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"}
|
|
TEST_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"}
|
|
TEST_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"}
|
|
CANDIDATE_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"]}]
|
|
G426_PAYLOAD_POST_INSPECTION_SHA256=8b7ed12905966302695ab4d8a3de81c171ed516e1f072eb1f761aace05cecd12
|
|
PRODUCTION_POST_PREFLIGHT_UNCHANGED=PASS
|
|
CANDIDATE_POST_PREFLIGHT_UNCHANGED=PASS
|
|
CLOUD_SEAL_CONTRACT_PREFLIGHT=PASS
|
|
STATUS=OK
|
|
PHASE=COMPLETE
|
|
REASON=NONE
|
|
NEXT_GATE=CT112_REAL_BACKUP_1_TWO_REPLICA_SEAL_IMPLEMENTATION
|
|
CHANGES_MADE=false
|
|
MUTATION_OUTCOME=NO_MUTATION
|
|
BACKUP_EXECUTIONS=0
|
|
VZDUMP_EXECUTIONS=0
|
|
CLOUD_WRITES=0
|
|
CLOUD_DELETIONS=0
|
|
SYSTEMD_MUTATIONS=0
|
|
SCHEDULER_CUTOVER=NO
|
|
LEGACY_BACKUP_DISABLES=0
|
|
LOCAL_G426_PAYLOAD_PRESERVED=YES
|
|
HOMELAB_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}
|
|
|
|
OUTPUT_END
|
|
CHAT_OUTPUT_END
|