@@ -6,7 +6,10 @@ use iceberg_ext::catalog::rest::IcebergErrorResponse;
66use serde:: { de:: DeserializeOwned , Serialize } ;
77use tokio:: { sync:: RwLock , time:: Sleep } ;
88use uuid:: Uuid ;
9- use vaultrs:: client:: { Client , VaultClient } ;
9+ use vaultrs:: {
10+ client:: { Client , VaultClient } ,
11+ error:: ClientError ,
12+ } ;
1013use vaultrs_login:: { engines:: userpass:: UserpassLogin , LoginMethod } ;
1114
1215use crate :: {
@@ -21,27 +24,35 @@ use crate::{
2124#[ async_trait:: async_trait]
2225impl SecretStore for SecretsState {
2326 /// Get the secret for a given warehouse.
24- async fn get_secret_by_id < S : DeserializeOwned > (
27+ async fn get_secret_by_id_impl < S : DeserializeOwned > (
2528 & self ,
2629 secret_id : SecretId ,
27- ) -> Result < Secret < S > > {
30+ ) -> Result < Option < Secret < S > > > {
2831 // it seems there is no atomic get for metadata and secret so we read_metadata, and then
2932 // read the secret with the current version defined in the previously read metadata
3033 let metadata = vaultrs:: kv2:: read_metadata (
3134 & * self . vault_client . read ( ) . await ,
3235 self . secret_mount . as_str ( ) ,
3336 & secret_ident_to_key ( secret_id) ,
3437 )
35- . await
36- . map_err ( |err| {
37- IcebergErrorResponse :: from ( ErrorModel :: internal (
38- "secret metadata read failure" ,
39- "SecretReadFailed" ,
40- Some ( Box :: new ( err ) ) ,
41- ) )
42- } ) ? ;
38+ . await ;
39+
40+ let metadata = match metadata {
41+ Ok ( meta ) => meta ,
42+ Err ( err ) => {
43+ if matches ! ( & err , ClientError :: APIError { code : 404 , .. } ) {
44+ return Ok ( None ) ;
45+ }
4346
44- Ok ( Secret {
47+ return Err ( IcebergErrorResponse :: from ( ErrorModel :: internal (
48+ "secret metadata read failure" ,
49+ "SecretReadFailed" ,
50+ Some ( Box :: new ( err) ) ,
51+ ) ) ) ;
52+ }
53+ } ;
54+
55+ Ok ( Some ( Secret {
4556 secret_id,
4657 secret : vaultrs:: kv2:: read_version :: < S > (
4758 & * self . vault_client . read ( ) . await ,
@@ -71,11 +82,11 @@ impl SecretStore for SecretsState {
7182 Some ( Box :: new ( err) ) ,
7283 ) )
7384 } ) ?) ,
74- } )
85+ } ) )
7586 }
7687
7788 /// Create a new secret
78- async fn create_secret < S : Send + Sync + Serialize + std:: fmt:: Debug > (
89+ async fn create_secret_impl < S : Send + Sync + Serialize + std:: fmt:: Debug > (
7990 & self ,
8091 secret : S ,
8192 ) -> Result < SecretId > {
@@ -98,7 +109,7 @@ impl SecretStore for SecretsState {
98109 }
99110
100111 /// Delete a secret
101- async fn delete_secret ( & self , secret_id : & SecretId ) -> Result < ( ) > {
112+ async fn delete_secret_impl ( & self , secret_id : & SecretId ) -> Result < ( ) > {
102113 Ok ( vaultrs:: kv2:: delete_metadata (
103114 & * self . vault_client . read ( ) . await ,
104115 self . secret_mount . as_str ( ) ,
@@ -274,14 +285,26 @@ mod tests {
274285 } )
275286 . into ( ) ;
276287
277- let secret_id = state. create_secret ( secret. clone ( ) ) . await . unwrap ( ) ;
288+ let secret_id = state. create_storage_secret ( secret. clone ( ) ) . await . unwrap ( ) ;
278289
279- let read_secret = state
280- . get_secret_by_id :: < StorageCredential > ( secret_id)
290+ let read_secret = state. require_storage_secret_by_id ( secret_id) . await . unwrap ( ) ;
291+
292+ assert_eq ! ( & * read_secret. secret, & secret) ;
293+ }
294+
295+ #[ tokio:: test]
296+ async fn test_read_missing_secret ( ) {
297+ let state = SecretsState :: from_config ( CONFIG . kv2 . as_ref ( ) . unwrap ( ) )
281298 . await
282299 . unwrap ( ) ;
283300
284- assert_eq ! ( read_secret. secret, secret) ;
301+ let secret_id = SecretId :: from ( Uuid :: new_v4 ( ) ) ;
302+
303+ let read_secret = state
304+ . get_secret_by_id_impl :: < StorageCredential > ( secret_id)
305+ . await ;
306+
307+ assert ! ( read_secret. unwrap( ) . is_none( ) ) ;
285308 }
286309
287310 #[ tokio:: test]
@@ -298,13 +321,13 @@ mod tests {
298321 . into ( ) ;
299322
300323 let secret_id = state
301- . create_secret ( secret. clone ( ) )
324+ . create_storage_secret ( secret. clone ( ) )
302325 . await
303326 . expect ( "create secret failed" ) ;
304327
305328 state. delete_secret ( & secret_id) . await . unwrap ( ) ;
306329
307- let read_secret = state. get_secret_by_id :: < StorageCredential > ( secret_id) . await ;
330+ let read_secret = state. require_storage_secret_by_id ( secret_id) . await ;
308331
309332 assert ! ( read_secret. is_err( ) ) ;
310333 }
0 commit comments