Skip to main content

alien_bindings/providers/vault/
grpc.rs

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