The founder dry-run refused on mount-wide platform/metadata/* grants held by ops-mason-survey and platform-readonly. Those cannot read the value, so they are now recorded as metadata_only_policies and no longer block retirement. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 469992@bnt-lap001 Assistant-Session: e4b8e420-df0a-441d-83ae-7f19130594d9
121 lines
5.6 KiB
Python
121 lines
5.6 KiB
Python
"""Offline tests for the duplicate KV retirement helper against a fake ``bao``."""
|
|
import importlib.util
|
|
import json
|
|
import os
|
|
from pathlib import Path
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
import textwrap
|
|
import unittest
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
SCRIPT = ROOT / 'scripts/kv_duplicate_retire.py'
|
|
spec = importlib.util.spec_from_file_location('kv_duplicate_retire', SCRIPT)
|
|
helper = importlib.util.module_from_spec(spec)
|
|
sys.path.insert(0, str(ROOT / 'scripts'))
|
|
spec.loader.exec_module(helper)
|
|
|
|
CONFIRM = 'RETIRE activity-core/default/llm-connect-provider-secrets'
|
|
DUP = 'workloads/activity-core/default/llm-connect-provider-secrets'
|
|
CANON = 'workloads/activity-core/llm-connect/llm-connect-provider-secrets'
|
|
|
|
FAKE_BAO = textwrap.dedent('''\
|
|
#!/usr/bin/env python3
|
|
import json, os, sys
|
|
sf = os.environ['FAKE_BAO_STATE']
|
|
st = json.load(open(sf))
|
|
st['calls'].append(sys.argv[1:])
|
|
def save(): json.dump(st, open(sf, 'w'))
|
|
def out(text): save(); print(text); sys.exit(0)
|
|
a = [x for x in sys.argv[1:] if x != '-format=json']
|
|
if a[:2] == ['policy', 'list']: out(json.dumps(sorted(st['policies'])))
|
|
if a[:2] == ['policy', 'read']: out(st['policies'][a[2]])
|
|
if a[0] == 'read':
|
|
if a[1] == 'auth/token/lookup-self': out(json.dumps({'data': st['identity']}))
|
|
rest = a[1].split('/', 2)[2]
|
|
if rest not in st['kv']: save(); sys.stderr.write('No value found\\n'); sys.exit(2)
|
|
n = st['kv'][rest]
|
|
out(json.dumps({'data': {'current_version': n, 'versions': {str(i + 1): {} for i in range(n)}}}))
|
|
if a[0] == 'delete':
|
|
st['kv'].pop(a[1].split('/', 2)[2], None); save(); sys.exit(0)
|
|
save(); sys.exit(9)
|
|
''')
|
|
|
|
CLEAN = {
|
|
'platform-admin': 'path "platform/*" { capabilities = ["read", "delete"] }',
|
|
'agent-high-risk-boundary': f'path "platform/data/{DUP}" {{ capabilities = ["deny"] }}',
|
|
'workload-kv-read-activity-core': f'path "platform/data/{CANON}" {{\n capabilities = ["read"]\n}}',
|
|
}
|
|
|
|
|
|
class GlobMatching(unittest.TestCase):
|
|
def test_exact_plus_and_trailing_star(self):
|
|
path = f'platform/data/{DUP}'
|
|
self.assertTrue(helper.glob_matches(path, path))
|
|
self.assertTrue(helper.glob_matches('platform/data/workloads/activity-core/*', path))
|
|
self.assertTrue(helper.glob_matches('platform/data/workloads/+/default/*', path))
|
|
self.assertFalse(helper.glob_matches('platform/data/workloads/activity-core/llm-connect/*', path))
|
|
self.assertFalse(helper.glob_matches('platform/data/workloads/+/llm-connect/*', path))
|
|
|
|
|
|
class Retire(unittest.TestCase):
|
|
def setUp(self):
|
|
self.tmp = Path(tempfile.mkdtemp())
|
|
(self.tmp / 'bin').mkdir()
|
|
(self.tmp / 'bin/bao').write_text(FAKE_BAO)
|
|
(self.tmp / 'bin/bao').chmod(0o755)
|
|
self.home = self.tmp / '.warden-attended-login' / 'session'
|
|
self.home.mkdir(parents=True)
|
|
self.state = {'calls': [], 'identity': {'policies': ['platform-admin']},
|
|
'policies': dict(CLEAN), 'kv': {DUP: 1, CANON: 3}}
|
|
|
|
def run_helper(self, *extra):
|
|
(self.tmp / 'state.json').write_text(json.dumps(self.state))
|
|
receipt = self.tmp / f'r{len(self.state["calls"])}.json'
|
|
env = {k: v for k, v in os.environ.items() if k not in ('BAO_TOKEN', 'VAULT_TOKEN')}
|
|
env.update(PATH=f'{self.tmp / "bin"}:{env["PATH"]}', HOME=str(self.home),
|
|
FAKE_BAO_STATE=str(self.tmp / 'state.json'))
|
|
proc = subprocess.run([sys.executable, str(SCRIPT), '--confirm', CONFIRM,
|
|
'--receipt', str(receipt), *extra], env=env, capture_output=True, text=True)
|
|
self.assertEqual((proc.stdout, proc.stderr), ('', ''))
|
|
self.state = json.loads((self.tmp / 'state.json').read_text())
|
|
return proc.returncode, json.loads(receipt.read_text())
|
|
|
|
def test_retires_when_no_policy_grants(self):
|
|
code, receipt = self.run_helper()
|
|
self.assertEqual((code, receipt['outcome']), (0, 'retired'))
|
|
self.assertNotIn(DUP, self.state['kv'])
|
|
self.assertIn(CANON, self.state['kv'])
|
|
self.assertFalse(any(c[0] == 'read' and '/data/' in c[-1] for c in self.state['calls']))
|
|
|
|
def test_dry_run_deletes_nothing(self):
|
|
code, receipt = self.run_helper('--dry-run')
|
|
self.assertEqual((code, receipt['outcome']), (0, 'dry_run_would_retire'))
|
|
self.assertIn(DUP, self.state['kv'])
|
|
|
|
def test_wildcard_grant_blocks(self):
|
|
self.state['policies']['coding-agent'] = 'path "platform/data/workloads/activity-core/*" { capabilities = ["read"] }'
|
|
code, receipt = self.run_helper()
|
|
self.assertEqual((code, receipt['outcome']), (3, 'live_policy_grants_duplicate'))
|
|
self.assertEqual(list(receipt['granting_policies']), ['coding-agent'])
|
|
self.assertIn(DUP, self.state['kv'])
|
|
|
|
def test_mount_wide_metadata_survey_does_not_block(self):
|
|
self.state['policies']['platform-readonly'] = 'path "platform/metadata/*" { capabilities = ["read", "list"] }'
|
|
code, receipt = self.run_helper('--dry-run')
|
|
self.assertEqual((code, receipt['outcome']), (0, 'dry_run_would_retire'))
|
|
self.assertEqual(receipt['metadata_only_policies'], {'platform-readonly': ['platform/metadata/*']})
|
|
|
|
def test_unexpected_versions_or_missing_canonical_refuse(self):
|
|
self.state['kv'][DUP] = 2
|
|
code, receipt = self.run_helper()
|
|
self.assertEqual((code, receipt['outcome']), (2, 'duplicate_version_unexpected'))
|
|
self.state['kv'] = {DUP: 1}
|
|
code, receipt = self.run_helper()
|
|
self.assertEqual((code, receipt['outcome']), (2, 'canonical_not_live'))
|
|
self.assertIn(DUP, self.state['kv'])
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|