use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum DeploymentTarget {
VirtualMachine {
runtime: ContainerRuntime,
},
ManagedKubernetes {
cluster_id: String,
namespace: String,
},
GenericKubernetes {
context: Option<String>,
namespace: String,
},
Serverless {
config: std::collections::HashMap<String, String>,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ContainerRuntime {
Docker,
Podman,
Containerd,
}
impl Default for DeploymentTarget {
fn default() -> Self {
Self::VirtualMachine {
runtime: ContainerRuntime::Docker,
}
}
}
impl DeploymentTarget {
pub fn requires_vm_provisioning(&self) -> bool {
matches!(self, Self::VirtualMachine { .. })
}
pub fn uses_kubernetes(&self) -> bool {
matches!(
self,
Self::ManagedKubernetes { .. } | Self::GenericKubernetes { .. }
)
}
pub fn container_runtime(&self) -> Option<&ContainerRuntime> {
match self {
Self::VirtualMachine { runtime } => Some(runtime),
_ => None,
}
}
pub fn kubernetes_namespace(&self) -> Option<&str> {
match self {
Self::ManagedKubernetes { namespace, .. }
| Self::GenericKubernetes { namespace, .. } => Some(namespace),
_ => None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeploymentConfig {
pub provider: crate::core::remote::CloudProvider,
pub target: DeploymentTarget,
pub region: String,
pub metadata: std::collections::HashMap<String, String>,
}
impl DeploymentConfig {
pub fn vm(
provider: crate::core::remote::CloudProvider,
region: String,
runtime: ContainerRuntime,
) -> Self {
Self {
provider,
target: DeploymentTarget::VirtualMachine { runtime },
region,
metadata: Default::default(),
}
}
pub fn managed_k8s(
provider: crate::core::remote::CloudProvider,
region: String,
cluster_id: String,
namespace: String,
) -> Self {
Self {
provider,
target: DeploymentTarget::ManagedKubernetes {
cluster_id,
namespace,
},
region,
metadata: Default::default(),
}
}
pub fn generic_k8s(context: Option<String>, namespace: String) -> Self {
Self {
provider: crate::core::remote::CloudProvider::Generic,
target: DeploymentTarget::GenericKubernetes { context, namespace },
region: "generic".to_string(),
metadata: Default::default(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_deployment_target_properties() {
let vm_target = DeploymentTarget::VirtualMachine {
runtime: ContainerRuntime::Docker,
};
assert!(vm_target.requires_vm_provisioning());
assert!(!vm_target.uses_kubernetes());
let k8s_target = DeploymentTarget::ManagedKubernetes {
cluster_id: "my-cluster".to_string(),
namespace: "default".to_string(),
};
assert!(!k8s_target.requires_vm_provisioning());
assert!(k8s_target.uses_kubernetes());
assert_eq!(k8s_target.kubernetes_namespace(), Some("default"));
}
#[test]
fn test_deployment_config_builders() {
let aws_vm = DeploymentConfig::vm(
crate::core::remote::CloudProvider::AWS,
"us-east-1".to_string(),
ContainerRuntime::Docker,
);
assert!(aws_vm.target.requires_vm_provisioning());
let aws_eks = DeploymentConfig::managed_k8s(
crate::core::remote::CloudProvider::AWS,
"us-east-1".to_string(),
"my-eks-cluster".to_string(),
"blueprint-ns".to_string(),
);
assert!(aws_eks.target.uses_kubernetes());
}
}