use serde::{Deserialize, Serialize};
use super::common::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pod {
pub id: String,
pub name: Option<String>,
pub image: Option<String>,
pub consumer_user_id: Option<String>,
pub machine_id: Option<String>,
pub desired_status: Option<PodStatus>,
#[serde(default)]
pub cost_per_hr: f64,
#[serde(default)]
pub adjusted_cost_per_hr: f64,
pub gpu_count: Option<i32>,
#[serde(default)]
pub vcpu_count: f64,
#[serde(default)]
pub memory_in_gb: f64,
#[serde(default)]
pub container_disk_in_gb: i32,
pub volume_in_gb: Option<i32>,
pub volume_mount_path: Option<String>,
#[serde(default)]
pub volume_encrypted: bool,
pub ports: Option<Vec<String>>,
pub port_mappings: Option<PortMappings>,
pub public_ip: Option<String>,
pub env: Option<EnvVars>,
pub docker_entrypoint: Option<Vec<String>>,
pub docker_start_cmd: Option<Vec<String>>,
#[serde(default)]
pub interruptible: bool,
#[serde(default)]
pub locked: bool,
pub gpu: Option<GpuInfo>,
pub cpu_flavor_id: Option<String>,
pub gpu_type_id: Option<String>,
pub template_id: Option<String>,
pub network_volume_id: Option<String>,
pub container_registry_auth_id: Option<String>,
pub endpoint_id: Option<String>,
pub ai_api_id: Option<String>,
pub sls_version: Option<i32>,
pub last_started_at: Option<String>,
pub last_status_change: Option<String>,
pub machine: Option<Machine>,
pub network_volume: Option<NetworkVolume>,
pub savings_plans: Option<Vec<SavingsPlan>>,
}
pub type Pods = Vec<Pod>;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PodCreateInput {
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_cuda_versions: Option<Vec<CudaVersion>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cloud_type: Option<CloudType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub compute_type: Option<ComputeType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub container_disk_in_gb: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub container_registry_auth_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub country_codes: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cpu_flavor_ids: Option<Vec<CpuFlavorId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cpu_flavor_priority: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_center_ids: Option<Vec<DataCenterId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_center_priority: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub docker_entrypoint: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub docker_start_cmd: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub env: Option<EnvVars>,
#[serde(skip_serializing_if = "Option::is_none")]
pub global_networking: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gpu_count: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gpu_type_ids: Option<Vec<GpuTypeId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gpu_type_priority: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub interruptible: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub locked: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_disk_bandwidth_m_bps: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_download_mbps: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_ram_per_gpu: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_upload_mbps: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_vcpu_per_gpu: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub network_volume_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ports: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub support_public_ip: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub template_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub vcpu_count: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub volume_in_gb: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub volume_mount_path: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PodUpdateInput {
#[serde(skip_serializing_if = "Option::is_none")]
pub container_disk_in_gb: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub container_registry_auth_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub docker_entrypoint: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub docker_start_cmd: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub env: Option<EnvVars>,
#[serde(skip_serializing_if = "Option::is_none")]
pub global_networking: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub locked: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ports: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub volume_in_gb: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub volume_mount_path: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ListPodsQuery {
#[serde(skip_serializing_if = "Option::is_none")]
pub compute_type: Option<ComputeType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cpu_flavor_id: Option<Vec<CpuFlavorId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_center_id: Option<Vec<DataCenterId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub desired_status: Option<PodStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub endpoint_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gpu_type_id: Option<Vec<GpuTypeId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_machine: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_network_volume: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_savings_plans: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_template: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_workers: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub network_volume_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub template_id: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetPodQuery {
#[serde(skip_serializing_if = "Option::is_none")]
pub include_machine: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_network_volume: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_savings_plans: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_template: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_workers: Option<bool>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_pod_deserialization_from_partial_json() {
let pod_json = r#"{"id": "pod-123"}"#;
let pod: Pod = serde_json::from_str(pod_json).expect("Failed to deserialize Pod");
assert_eq!(pod.id, "pod-123");
assert!(pod.image.is_none());
assert!(pod.consumer_user_id.is_none());
assert!(pod.machine_id.is_none());
assert!(pod.desired_status.is_none());
assert_eq!(pod.cost_per_hr, 0.0);
}
}