Skip to main content

alien_bindings/providers/vault/
grpc.rs

1use crate::{
2    error::{Error, ErrorData},
3    grpc::status_conversion::status_to_alien_error,
4    grpc::vault_service::alien_bindings::vault::{
5        vault_service_client::VaultServiceClient, DeleteSecretRequest, GetSecretRequest,
6        SetSecretRequest,
7    },
8    traits::{Binding, Vault},
9};
10
11use alien_error::{AlienError, Context};
12use async_trait::async_trait;
13use tonic::{transport::Channel, Request, Status};
14
15/// gRPC implementation of the `Vault` trait.
16///
17/// This implementation communicates with an alien-runtime gRPC server
18/// to manage vault operations.
19#[derive(Debug)]
20pub struct GrpcVault {
21    client: VaultServiceClient<Channel>,
22    binding_name: String,
23}
24
25impl GrpcVault {
26    /// Creates a new gRPC vault instance from binding parameters.
27    pub async fn new(binding_name: String, grpc_address: String) -> Result<Self, Error> {
28        let channel = crate::providers::grpc_provider::create_grpc_channel(grpc_address).await?;
29        Self::new_from_channel(channel, binding_name).await
30    }
31
32    /// Creates a new gRPC vault instance from a channel.
33    pub async fn new_from_channel(channel: Channel, binding_name: String) -> Result<Self, Error> {
34        let client = VaultServiceClient::new(channel);
35
36        Ok(Self {
37            client,
38            binding_name,
39        })
40    }
41
42    fn client(&self) -> VaultServiceClient<Channel> {
43        self.client.clone()
44    }
45}
46
47impl Binding for GrpcVault {}
48
49#[async_trait]
50impl Vault for GrpcVault {
51    async fn get_secret(&self, secret_name: &str) -> Result<String, Error> {
52        let mut client = self.client();
53
54        let request = GetSecretRequest {
55            binding_name: self.binding_name.clone(),
56            secret_name: secret_name.to_string(),
57        };
58
59        let response = client
60            .get_secret(Request::new(request))
61            .await
62            .map_err(|e| status_to_alien_error(e, "get_secret"))?
63            .into_inner();
64
65        Ok(response.value)
66    }
67
68    async fn set_secret(&self, secret_name: &str, value: &str) -> Result<(), Error> {
69        let mut client = self.client();
70
71        let request = SetSecretRequest {
72            binding_name: self.binding_name.clone(),
73            secret_name: secret_name.to_string(),
74            value: value.to_string(),
75        };
76
77        client
78            .set_secret(Request::new(request))
79            .await
80            .map_err(|e| status_to_alien_error(e, "set_secret"))?;
81
82        Ok(())
83    }
84
85    async fn delete_secret(&self, secret_name: &str) -> Result<(), Error> {
86        let mut client = self.client();
87
88        let request = DeleteSecretRequest {
89            binding_name: self.binding_name.clone(),
90            secret_name: secret_name.to_string(),
91        };
92
93        client
94            .delete_secret(Request::new(request))
95            .await
96            .map_err(|e| status_to_alien_error(e, "delete_secret"))?;
97
98        Ok(())
99    }
100}