Skip to main content

alien_bindings/providers/container/
kubernetes.rs

1use crate::{
2    error::{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    namespace: String,
13    service_name: String,
14    service_port: u16,
15    public_url: Option<String>,
16    internal_url: String,
17}
18
19impl KubernetesContainer {
20    pub fn new(binding_name: String, binding: KubernetesContainerBinding) -> Result<Self> {
21        let namespace = binding
22            .namespace
23            .into_value(&binding_name, "namespace")
24            .context(ErrorData::BindingConfigInvalid {
25                binding_name: binding_name.clone(),
26                reason: "Failed to extract namespace from Kubernetes container binding".to_string(),
27            })?;
28
29        let service_name = binding
30            .service_name
31            .into_value(&binding_name, "service_name")
32            .context(ErrorData::BindingConfigInvalid {
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                binding_name: binding_name.clone(),
43                reason: "Failed to extract service_port from Kubernetes container binding"
44                    .to_string(),
45            })?;
46
47        let public_url = binding
48            .public_url
49            .map(|v| v.into_value(&binding_name, "public_url"))
50            .transpose()
51            .context(ErrorData::BindingConfigInvalid {
52                binding_name: binding_name.clone(),
53                reason: "Failed to extract public_url from Kubernetes container binding"
54                    .to_string(),
55            })?;
56
57        // Construct internal service URL
58        let internal_url = format!(
59            "http://{}.{}.svc.cluster.local:{}",
60            service_name, namespace, service_port
61        );
62
63        Ok(Self {
64            namespace,
65            service_name: service_name.clone(),
66            service_port,
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}