Skip to main content

alien_bindings/providers/container/
kubernetes.rs

1use crate::{
2    error::{binding_env_var, ErrorData, Result},
3    traits::{Binding, Container},
4};
5use alien_core::bindings::KubernetesContainerBinding;
6use alien_error::Context;
7use async_trait::async_trait;
8
9/// Kubernetes Container implementation that provides URLs for container-to-container communication
10#[derive(Debug)]
11pub struct KubernetesContainer {
12    service_name: String,
13    public_url: Option<String>,
14    internal_url: String,
15}
16
17impl KubernetesContainer {
18    pub fn new(binding_name: String, binding: KubernetesContainerBinding) -> Result<Self> {
19        let namespace = binding
20            .namespace
21            .into_value(&binding_name, "namespace")
22            .context(ErrorData::BindingConfigInvalid {
23                env_var: binding_env_var(&binding_name),
24                binding_name: binding_name.clone(),
25                reason: "Failed to extract namespace from Kubernetes container binding".to_string(),
26            })?;
27
28        let service_name = binding
29            .service_name
30            .into_value(&binding_name, "service_name")
31            .context(ErrorData::BindingConfigInvalid {
32                env_var: binding_env_var(&binding_name),
33                binding_name: binding_name.clone(),
34                reason: "Failed to extract service_name from Kubernetes container binding"
35                    .to_string(),
36            })?;
37
38        let service_port = binding
39            .service_port
40            .into_value(&binding_name, "service_port")
41            .context(ErrorData::BindingConfigInvalid {
42                env_var: binding_env_var(&binding_name),
43                binding_name: binding_name.clone(),
44                reason: "Failed to extract service_port from Kubernetes container binding"
45                    .to_string(),
46            })?;
47
48        let public_url = binding
49            .public_url
50            .map(|v| v.into_value(&binding_name, "public_url"))
51            .transpose()
52            .context(ErrorData::BindingConfigInvalid {
53                env_var: binding_env_var(&binding_name),
54                binding_name: binding_name.clone(),
55                reason: "Failed to extract public_url from Kubernetes container binding"
56                    .to_string(),
57            })?;
58
59        // Construct internal service URL
60        let internal_url = format!(
61            "http://{}.{}.svc.cluster.local:{}",
62            service_name, namespace, service_port
63        );
64
65        Ok(Self {
66            service_name: service_name.clone(),
67            public_url,
68            internal_url,
69        })
70    }
71}
72
73#[async_trait]
74impl Binding for KubernetesContainer {}
75
76impl Container for KubernetesContainer {
77    fn get_internal_url(&self) -> &str {
78        &self.internal_url
79    }
80
81    fn get_public_url(&self) -> Option<&str> {
82        self.public_url.as_deref()
83    }
84
85    fn get_container_name(&self) -> &str {
86        &self.service_name
87    }
88
89    fn as_any(&self) -> &dyn std::any::Any {
90        self
91    }
92}