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 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 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}