use crate::core::error::Result;
use crate::core::remote::CloudProvider;
use blueprint_std::collections::HashMap;
use chrono::{DateTime, Duration, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeploymentRecord {
pub id: String,
pub blueprint_id: String,
pub deployment_type: DeploymentType,
pub provider: Option<CloudProvider>,
pub region: Option<String>,
pub resource_spec: crate::core::resources::ResourceSpec,
pub resource_ids: HashMap<String, String>,
pub deployed_at: DateTime<Utc>,
pub ttl_seconds: Option<u64>,
pub expires_at: Option<DateTime<Utc>>,
pub status: DeploymentStatus,
pub cleanup_webhook: Option<String>,
pub metadata: HashMap<String, String>,
}
impl DeploymentRecord {
pub fn new(
blueprint_id: String,
deployment_type: DeploymentType,
resource_spec: crate::core::resources::ResourceSpec,
ttl_seconds: Option<u64>,
) -> Self {
let expires_at = ttl_seconds.map(|ttl| Utc::now() + Duration::seconds(ttl as i64));
let id = format!("dep-{}", uuid::Uuid::new_v4());
Self {
id,
blueprint_id,
deployment_type,
provider: None,
region: None,
resource_spec,
resource_ids: HashMap::new(),
deployed_at: Utc::now(),
ttl_seconds,
expires_at,
status: DeploymentStatus::Active,
cleanup_webhook: None,
metadata: HashMap::new(),
}
}
pub fn add_resource(&mut self, resource_type: String, resource_id: String) {
self.resource_ids.insert(resource_type, resource_id);
}
pub fn set_cloud_info(&mut self, provider: CloudProvider, region: String) {
self.provider = Some(provider);
self.region = Some(region);
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum DeploymentType {
LocalDocker,
LocalKubernetes,
LocalHypervisor,
AwsEc2,
GcpGce,
AzureVm,
DigitalOceanDroplet,
VultrInstance,
AwsEks,
GcpGke,
AzureAks,
DigitalOceanDoks,
VultrVke,
LambdaLabsInstance,
RunPodInstance,
VastAiInstance,
CoreWeaveWorkload,
PaperspaceMachine,
FluidstackServer,
TensorDockServer,
AkashLease,
IoNetCluster,
PrimeIntellectPod,
RenderDispersedNode,
BittensorLiumMiner,
SshRemote,
BareMetal,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum DeploymentStatus {
Active,
Terminating,
Terminated,
Failed,
Unknown,
}
#[async_trait::async_trait]
pub trait CleanupHandler: Send + Sync {
async fn cleanup(&self, deployment: &DeploymentRecord) -> Result<()>;
}