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