pub struct RaftSecretsStore { /* private fields */ }Expand description
Cluster-replicated secrets store.
Reads are served from the local Raft-replicated SecretsState.
Writes are proposed through the leader via RaftSecretsHandle.
The unwrapped cluster DEK is cached in memory and invalidated when
the observed dek_generation changes.
Implementations§
Source§impl RaftSecretsStore
impl RaftSecretsStore
Sourcepub fn new(
node_priv: RecipientPrivateKey,
node_id: String,
raft: Arc<dyn RaftSecretsHandle>,
) -> Self
pub fn new( node_priv: RecipientPrivateKey, node_id: String, raft: Arc<dyn RaftSecretsHandle>, ) -> Self
Construct a new store bound to a running RaftSecretsHandle.
The DEK cache starts empty and is populated on first read.
Sourcepub fn make_key(scope: &str, name: &str) -> String
pub fn make_key(scope: &str, name: &str) -> String
Construct a storage key in the same shape used by
crate::PersistentSecretsStore ("{scope}:{name}"), so a
secret written via RaftSecretsStore is findable via the same
key under the persistent store and vice versa.
Sourcepub fn node_allowed(node_id: &str, affinity: Option<&NodeAffinity>) -> bool
pub fn node_allowed(node_id: &str, affinity: Option<&NodeAffinity>) -> bool
Is the local node currently entitled to host this secret’s decryptable form?
Noneaffinity: any node may host. Returnstrue.NodeAffinity::Nodes: returnstrueiffnode_idis in the allow-list.NodeAffinity::Labels: node-label matching is not yet implemented in this layer (the SM doesn’t carry labels). Returnstrueso the read is permitted; the API gate is the authoritative enforcement point until labels are wired in.
Trait Implementations§
Source§impl SecretsProvider for RaftSecretsStore
impl SecretsProvider for RaftSecretsStore
Source§fn get_secret<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
scope: &'life1 str,
name: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<Secret>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn get_secret<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
scope: &'life1 str,
name: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<Secret>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Retrieve a single secret by scope and name. Read more
Source§fn get_secrets<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
scope: &'life1 str,
names: &'life2 [&'life3 str],
) -> Pin<Box<dyn Future<Output = Result<HashMap<String, Secret>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn get_secrets<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
scope: &'life1 str,
names: &'life2 [&'life3 str],
) -> Pin<Box<dyn Future<Output = Result<HashMap<String, Secret>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Retrieve multiple secrets by scope and names. Read more
Source§fn list_secrets<'life0, 'life1, 'async_trait>(
&'life0 self,
scope: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<SecretMetadata>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn list_secrets<'life0, 'life1, 'async_trait>(
&'life0 self,
scope: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<SecretMetadata>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
List metadata for all secrets in a scope. Read more
Source§fn exists<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
scope: &'life1 str,
name: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn exists<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
scope: &'life1 str,
name: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Check if a secret exists in the given scope. Read more
Source§impl SecretsStore for RaftSecretsStore
impl SecretsStore for RaftSecretsStore
Source§fn set_secret<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
scope: &'life1 str,
name: &'life2 str,
value: &'life3 Secret,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn set_secret<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
scope: &'life1 str,
name: &'life2 str,
value: &'life3 Secret,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Store or update a secret. Read more
Source§fn delete_secret<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
scope: &'life1 str,
name: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn delete_secret<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
scope: &'life1 str,
name: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Delete a secret from the store. Read more
Source§fn rotate_secret<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
scope: &'life1 str,
name: &'life2 str,
value: &'life3 Secret,
) -> Pin<Box<dyn Future<Output = Result<RotationResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn rotate_secret<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
scope: &'life1 str,
name: &'life2 str,
value: &'life3 Secret,
) -> Pin<Box<dyn Future<Output = Result<RotationResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Rotate a secret: overwrite with a new value and return the version before+after. Read more
Source§fn set_secret_with_affinity<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
scope: &'life1 str,
name: &'life2 str,
value: &'life3 Secret,
node_affinity: Option<&'life4 NodeAffinity>,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
fn set_secret_with_affinity<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
scope: &'life1 str,
name: &'life2 str,
value: &'life3 Secret,
node_affinity: Option<&'life4 NodeAffinity>,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
Store a secret along with an optional
NodeAffinity selector. Read moreSource§fn rotate_secret_with_affinity<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
scope: &'life1 str,
name: &'life2 str,
value: &'life3 Secret,
node_affinity: Option<&'life4 NodeAffinity>,
) -> Pin<Box<dyn Future<Output = Result<RotationResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
fn rotate_secret_with_affinity<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
scope: &'life1 str,
name: &'life2 str,
value: &'life3 Secret,
node_affinity: Option<&'life4 NodeAffinity>,
) -> Pin<Box<dyn Future<Output = Result<RotationResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
Rotate a secret, optionally updating its
NodeAffinity selector. Read moreAuto Trait Implementations§
impl !Freeze for RaftSecretsStore
impl !RefUnwindSafe for RaftSecretsStore
impl Send for RaftSecretsStore
impl Sync for RaftSecretsStore
impl Unpin for RaftSecretsStore
impl UnsafeUnpin for RaftSecretsStore
impl !UnwindSafe for RaftSecretsStore
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more