Documentation

Wire-contract Secret data fields

The single source of truth for what the operator writes and what the proxy reads on Kubernetes Secrets. The contract is split across two files; both must agree.

#Labels (selectable on every Secret)

LabelNotes
broker.stowage.io/rolevirtual-credential (operator namespace) | consumer-secret (claim namespace) | anonymous-binding.
broker.stowage.io/claim-namespaceThe namespace of the owning BucketClaim.
broker.stowage.io/claim-nameThe name of the owning BucketClaim.
broker.stowage.io/claim-uidThe UID of the owning BucketClaim.
broker.stowage.io/access-key-idAccess key ID (also a data field).
broker.stowage.io/backendName of the S3Backend.
broker.stowage.io/bucketName of the bucket.
broker.stowage.io/rotation-generationIncrements on each rotation.

#Annotations

AnnotationNotes
broker.stowage.io/expires-atOptional credential expiry in RFC3339.

#Internal Secret data (in operator namespace)

The proxy informer reads these. Sealed at rest by the API server's encryption-at-rest if you have it configured; not double-sealed by Stowage's AES key on this side (it's a per-cluster wire-contract).

KeyRequiredNotes
access_key_idyesThe credential's public ID.
secret_access_keyyesPlaintext (within the Secret). Treat the Secret as sensitive.
bucket_nameyesPrimary bucket for legacy single-scope readers.
backendyesS3Backend name.
claim_uidyesOwning claim's UID.
bucket_scopesoptionalJSON-encoded []BucketScope. When present, readers prefer this over the singular fields. Authoritative scope list.
quota_soft_bytesoptionalDecimal byte count.
quota_hard_bytesoptionalDecimal byte count.
anonymous_modefor role=anonymous-bindingNone | ReadOnly.
anonymous_per_source_ip_rpsoptionalPer-binding override of s3_proxy.anonymous_rps.

#Consumer Secret data (in claim namespace)

What tenant Pods consume. AWS-shaped env-var names so the standard SDK credential providers pick them up automatically.

KeyNotes
AWS_ACCESS_KEY_IDSame value as access_key_id on the internal side.
AWS_SECRET_ACCESS_KEYSame value as secret_access_key.
AWS_REGIONRegion per the S3Backend.
AWS_ENDPOINT_URLStowage proxy URL.
AWS_ENDPOINT_URL_S3Same value, separated for SDKs that prefer the S3-specific name.
BUCKET_NAMEThe real bucket name.
S3_ADDRESSING_STYLEpath | virtual.

#Why both sides match

The operator and the proxy compile to separate binaries from the same Go module. Changing a field name on one side without the other silently breaks the integration — the informer keeps cycling, no errors logged at INFO. Both sides use the constants from vcstore/labels.go to avoid stringly-typed drift.

If you fork the operator or the proxy, keep these constants in lock- step.