tba-protocol-workload-spiffe-workload-api 0.4.0.dev2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (16) hide show
  1. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/PKG-INFO +11 -0
  2. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/pyproject.toml +10 -0
  3. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/src/tba_protocol_workload_spiffe_workload_api/__init__.py +18 -0
  4. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/src/tba_protocol_workload_spiffe_workload_api/bindings.py +5 -0
  5. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/src/tba_protocol_workload_spiffe_workload_api/claims.py +5 -0
  6. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/src/tba_protocol_workload_spiffe_workload_api/compatibility.py +3 -0
  7. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/src/tba_protocol_workload_spiffe_workload_api/endpoint.py +5 -0
  8. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/src/tba_protocol_workload_spiffe_workload_api/errors.py +8 -0
  9. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/src/tba_protocol_workload_spiffe_workload_api/features.py +10 -0
  10. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/src/tba_protocol_workload_spiffe_workload_api/migrations.py +6 -0
  11. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/src/tba_protocol_workload_spiffe_workload_api/py.typed +0 -0
  12. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/src/tba_protocol_workload_spiffe_workload_api/rpcs.py +19 -0
  13. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/src/tba_protocol_workload_spiffe_workload_api/schemas.py +5 -0
  14. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/src/tba_protocol_workload_spiffe_workload_api/service.py +18 -0
  15. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/src/tba_protocol_workload_spiffe_workload_api/streams.py +6 -0
  16. tba_protocol_workload_spiffe_workload_api-0.4.0.dev2/src/tba_protocol_workload_spiffe_workload_api/versions.py +16 -0
@@ -0,0 +1,11 @@
1
+ Metadata-Version: 2.4
2
+ Name: tba-protocol-workload-spiffe-workload-api
3
+ Version: 0.4.0.dev2
4
+ Summary:
5
+ Requires-Python: >=3.10,<3.15
6
+ Classifier: Programming Language :: Python :: 3
7
+ Classifier: Programming Language :: Python :: 3.10
8
+ Classifier: Programming Language :: Python :: 3.11
9
+ Classifier: Programming Language :: Python :: 3.12
10
+ Classifier: Programming Language :: Python :: 3.13
11
+ Classifier: Programming Language :: Python :: 3.14
@@ -0,0 +1,10 @@
1
+ [project]
2
+ name="tba-protocol-workload-spiffe-workload-api"
3
+ version="0.4.0.dev2"
4
+ requires-python=">=3.10,<3.15"
5
+ dependencies=[]
6
+ [build-system]
7
+ requires=["poetry-core>=1.0.0"]
8
+ build-backend="poetry.core.masonry.api"
9
+ [tool.poetry]
10
+ packages=[{include="tba_protocol_workload_spiffe_workload_api",from="src"}]
@@ -0,0 +1,18 @@
1
+ from .endpoint import validate_endpoint
2
+ from .rpcs import FORBIDDEN_EXTENSION_RPCS, RPC_DEFINITIONS, RPC_NAMES, RpcDefinition
3
+ from .service import WorkloadApiService
4
+ from .streams import validate_full_snapshot
5
+ from .versions import CURRENT_VERSION, VERSION_HISTORY, WorkloadApiVersion
6
+
7
+ __all__ = [
8
+ "CURRENT_VERSION",
9
+ "FORBIDDEN_EXTENSION_RPCS",
10
+ "RPC_DEFINITIONS",
11
+ "RPC_NAMES",
12
+ "VERSION_HISTORY",
13
+ "RpcDefinition",
14
+ "WorkloadApiService",
15
+ "WorkloadApiVersion",
16
+ "validate_endpoint",
17
+ "validate_full_snapshot",
18
+ ]
@@ -0,0 +1,5 @@
1
+ """Capability bindings owned by the versioned protocol package."""
2
+
3
+ PROTOCOL_CAPABILITY_BINDINGS: tuple[str, ...] = ()
4
+
5
+ __all__ = ["PROTOCOL_CAPABILITY_BINDINGS"]
@@ -0,0 +1,5 @@
1
+ """Claim vocabulary selected by the versioned protocol package."""
2
+
3
+ PROTOCOL_CLAIM_NAMES: tuple[str, ...] = ()
4
+
5
+ __all__ = ["PROTOCOL_CLAIM_NAMES"]
@@ -0,0 +1,3 @@
1
+ def require_version(identifier: str) -> None:
2
+ if identifier != "SPIFFE-Workload-API-1.0":
3
+ raise ValueError(f"unsupported Workload API revision: {identifier}")
@@ -0,0 +1,5 @@
1
+ def validate_endpoint(address: str) -> None:
2
+ if not (address.startswith("unix://") or address.startswith("npipe://")):
3
+ raise ValueError(
4
+ "Workload API endpoint must use an explicitly configured local transport"
5
+ )
@@ -0,0 +1,8 @@
1
+ """Errors raised by the versioned protocol package."""
2
+
3
+
4
+ class ProtocolProfileError(ValueError):
5
+ """The artifact or request does not satisfy the selected protocol profile."""
6
+
7
+
8
+ __all__ = ["ProtocolProfileError"]
@@ -0,0 +1,10 @@
1
+ FEATURES = frozenset(
2
+ {
3
+ "x509-svid-stream",
4
+ "x509-bundle-stream",
5
+ "jwt-svid-fetch",
6
+ "jwt-bundle-stream",
7
+ "jwt-svid-validation",
8
+ "full-snapshot-streams",
9
+ }
10
+ )
@@ -0,0 +1,6 @@
1
+ def migration_path(
2
+ source: str, target: str = "SPIFFE-Workload-API-1.0"
3
+ ) -> tuple[str, ...]:
4
+ if source == target:
5
+ return ()
6
+ raise ValueError(f"manual Workload API migration required: {source} to {target}")
@@ -0,0 +1,19 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass(frozen=True, slots=True)
5
+ class RpcDefinition:
6
+ name: str
7
+ server_streaming: bool
8
+ profile: str
9
+
10
+
11
+ RPC_DEFINITIONS = (
12
+ RpcDefinition("FetchX509SVID", True, "x509-svid"),
13
+ RpcDefinition("FetchX509Bundles", True, "x509-svid"),
14
+ RpcDefinition("FetchJWTSVID", False, "jwt-svid"),
15
+ RpcDefinition("FetchJWTBundles", True, "jwt-svid"),
16
+ RpcDefinition("ValidateJWTSVID", False, "jwt-svid"),
17
+ )
18
+ RPC_NAMES = frozenset(item.name for item in RPC_DEFINITIONS)
19
+ FORBIDDEN_EXTENSION_RPCS = frozenset({"FetchWITSVID", "FetchCWTSVID"})
@@ -0,0 +1,5 @@
1
+ """Wire-schema inventory owned by the versioned protocol package."""
2
+
3
+ PROTOCOL_WIRE_SCHEMA_NAMES: tuple[str, ...] = ()
4
+
5
+ __all__ = ["PROTOCOL_WIRE_SCHEMA_NAMES"]
@@ -0,0 +1,18 @@
1
+ from collections.abc import Callable, Mapping
2
+ from .rpcs import RPC_NAMES
3
+
4
+
5
+ class WorkloadApiService:
6
+ def __init__(self, handlers: Mapping[str, Callable[..., object]]) -> None:
7
+ unknown = set(handlers).difference(RPC_NAMES)
8
+ if unknown:
9
+ raise ValueError(f"Workload API must not be extended: {sorted(unknown)}")
10
+ missing = RPC_NAMES.difference(handlers)
11
+ if missing:
12
+ raise ValueError(f"missing Workload API handlers: {sorted(missing)}")
13
+ self._handlers = dict(handlers)
14
+
15
+ def dispatch(self, rpc: str, request: object) -> object:
16
+ if rpc not in RPC_NAMES:
17
+ raise ValueError(f"unknown Workload API RPC: {rpc}")
18
+ return self._handlers[rpc](request)
@@ -0,0 +1,6 @@
1
+ def validate_full_snapshot(
2
+ previous: frozenset[str], current: frozenset[str], *, declared_full_snapshot: bool
3
+ ) -> frozenset[str]:
4
+ if not declared_full_snapshot:
5
+ raise ValueError("SPIFFE stream updates must be complete snapshots")
6
+ return current
@@ -0,0 +1,16 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass(frozen=True, slots=True)
5
+ class WorkloadApiVersion:
6
+ identifier: str
7
+ status: str
8
+ specification_uri: str
9
+
10
+
11
+ CURRENT_VERSION = WorkloadApiVersion(
12
+ "SPIFFE-Workload-API-1.0",
13
+ "stable",
14
+ "https://github.com/spiffe/spiffe/blob/main/standards/SPIFFE_Workload_API.md",
15
+ )
16
+ VERSION_HISTORY = (CURRENT_VERSION,)