Fence governed connector acquisitions
This commit is contained in:
@@ -27,6 +27,16 @@ from govoplan_connectors.backend.sanctions_sources import (
|
||||
)
|
||||
from govoplan_core.auth import ApiPrincipal
|
||||
from govoplan_core.core.access import PrincipalRef
|
||||
from govoplan_core.core.recovery import (
|
||||
RecoveryCheckpoint,
|
||||
RecoveryOperation,
|
||||
RecoveryStatus,
|
||||
)
|
||||
from govoplan_core.core.runtime_coordination import (
|
||||
DistributedLease,
|
||||
RuntimeIdentity,
|
||||
bind_process_runtime_identity,
|
||||
)
|
||||
from govoplan_core.db.base import Base, utcnow
|
||||
|
||||
|
||||
@@ -89,13 +99,27 @@ class SanctionsSourcesTests(unittest.TestCase):
|
||||
Base.metadata.create_all(
|
||||
self.engine,
|
||||
tables=(
|
||||
DistributedLease.__table__,
|
||||
RecoveryOperation.__table__,
|
||||
RecoveryCheckpoint.__table__,
|
||||
ConnectorSanctionsAcquisitionRun.__table__,
|
||||
ConnectorSanctionsSnapshot.__table__,
|
||||
),
|
||||
)
|
||||
self.session = Session(self.engine)
|
||||
bind_process_runtime_identity(
|
||||
RuntimeIdentity(
|
||||
installation_id="connectors-tests",
|
||||
node_id="connectors-test-node",
|
||||
incarnation="connectors-test-incarnation",
|
||||
role="worker",
|
||||
software_version="test",
|
||||
composition_hash="a" * 64,
|
||||
)
|
||||
)
|
||||
|
||||
def tearDown(self) -> None:
|
||||
bind_process_runtime_identity(None)
|
||||
self.session.close()
|
||||
self.engine.dispose()
|
||||
|
||||
@@ -234,6 +258,7 @@ class SanctionsSourcesTests(unittest.TestCase):
|
||||
first.snapshot.ref.removeprefix("sanctions-snapshot:"),
|
||||
)
|
||||
record.acquired_at = utcnow() - timedelta(days=3)
|
||||
self.session.commit()
|
||||
|
||||
result = provider.refresh_source(
|
||||
self.session,
|
||||
@@ -244,6 +269,48 @@ class SanctionsSourcesTests(unittest.TestCase):
|
||||
self.assertEqual("stale", result.status)
|
||||
self.assertEqual(first.snapshot.ref, result.snapshot.ref)
|
||||
|
||||
def test_idempotent_refresh_replays_the_committed_acquisition(self) -> None:
|
||||
transport = _Transport((response(),))
|
||||
provider = SqlSanctionsSnapshotProvider(transport)
|
||||
|
||||
first = provider.refresh_source(
|
||||
self.session,
|
||||
principal(),
|
||||
provider_id=UNSC_PROVIDER_ID,
|
||||
idempotency_key="scheduled-refresh-1",
|
||||
)
|
||||
replay = provider.refresh_source(
|
||||
self.session,
|
||||
principal(),
|
||||
provider_id=UNSC_PROVIDER_ID,
|
||||
idempotency_key="scheduled-refresh-1",
|
||||
)
|
||||
|
||||
self.assertEqual(first.run_id, replay.run_id)
|
||||
self.assertEqual(first.snapshot.ref, replay.snapshot.ref)
|
||||
self.assertEqual([], transport.responses)
|
||||
operation = self.session.query(RecoveryOperation).one()
|
||||
self.assertEqual(RecoveryStatus.SUCCEEDED.value, operation.status)
|
||||
|
||||
def test_provider_failure_commits_failed_run_and_terminal_recovery(self) -> None:
|
||||
provider = SqlSanctionsSnapshotProvider(
|
||||
_Transport((SanctionsSourceError("offline"),))
|
||||
)
|
||||
|
||||
result = provider.refresh_source(
|
||||
self.session,
|
||||
principal(),
|
||||
provider_id=UNSC_PROVIDER_ID,
|
||||
)
|
||||
|
||||
self.assertEqual("unavailable", result.status)
|
||||
operation = self.session.query(RecoveryOperation).one()
|
||||
self.assertEqual(RecoveryStatus.FAILED.value, operation.status)
|
||||
self.assertEqual(
|
||||
result.run_id,
|
||||
self.session.query(ConnectorSanctionsAcquisitionRun).one().id,
|
||||
)
|
||||
|
||||
def test_snapshot_access_is_tenant_and_scope_isolated(self) -> None:
|
||||
provider = SqlSanctionsSnapshotProvider()
|
||||
created = provider.refresh_source(
|
||||
|
||||
Reference in New Issue
Block a user