alien_bindings/providers/container/
kubernetes.rs1use 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#[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 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}