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    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                binding_name: binding_name.clone(),
24                reason: "Failed to extract namespace from Kubernetes container binding".to_string(),
25            })?;
26
27        let service_name = binding
28            .service_name
29            .into_value(&binding_name, "service_name")
30            .context(ErrorData::BindingConfigInvalid {
31                binding_name: binding_name.clone(),
32                reason: "Failed to extract service_name from Kubernetes container binding"
33                    .to_string(),
34            })?;
35
36        let service_port = binding
37            .service_port
38            .into_value(&binding_name, "service_port")
39            .context(ErrorData::BindingConfigInvalid {
40                binding_name: binding_name.clone(),
41                reason: "Failed to extract service_port from Kubernetes container binding"
42                    .to_string(),
43            })?;
44
45        let public_url = binding
46            .public_url
47            .map(|v| v.into_value(&binding_name, "public_url"))
48            .transpose()
49            .context(ErrorData::BindingConfigInvalid {
50                binding_name: binding_name.clone(),
51                reason: "Failed to extract public_url from Kubernetes container binding"
52                    .to_string(),
53            })?;
54
55        // Construct internal service URL
56        let internal_url = format!(
57            "http://{}.{}.svc.cluster.local:{}",
58            service_name, namespace, service_port
59        );
60
61        Ok(Self {
62            service_name: service_name.clone(),
63            public_url,
64            internal_url,
65        })
66    }
67}
68
69#[async_trait]
70impl Binding for KubernetesContainer {}
71
72impl Container for KubernetesContainer {
73    fn get_internal_url(&self) -> &str {
74        &self.internal_url
75    }
76
77    fn get_public_url(&self) -> Option<&str> {
78        self.public_url.as_deref()
79    }
80
81    fn get_container_name(&self) -> &str {
82        &self.service_name
83    }
84
85    fn as_any(&self) -> &dyn std::any::Any {
86        self
87    }
88}