diff --git a/src/api/model.rs b/src/api/model.rs index 1c49523..732bf24 100644 --- a/src/api/model.rs +++ b/src/api/model.rs @@ -80,7 +80,7 @@ impl ApiVmIpAssignment { } } -#[derive(Clone, Copy, Serialize, Deserialize, JsonSchema)] +#[derive(Clone, Copy, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash)] #[serde(rename_all = "lowercase")] pub enum DiskType { HDD = 0, @@ -105,7 +105,7 @@ impl From for lnvps_db::DiskType { } } -#[derive(Clone, Copy, Serialize, Deserialize, JsonSchema)] +#[derive(Clone, Copy, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Hash)] #[serde(rename_all = "lowercase")] pub enum DiskInterface { SATA = 0, @@ -166,8 +166,6 @@ pub struct ApiCustomTemplateParams { pub min_cpu: u16, pub min_memory: u64, pub max_memory: u64, - pub min_disk: u64, - pub max_disk: u64, pub disks: Vec, } @@ -178,7 +176,7 @@ impl ApiCustomTemplateParams { region: &VmHostRegion, max_cpu: u16, max_memory: u64, - max_disk: u64, + max_disk: &HashMap<(DiskType, DiskInterface), u64>, ) -> Result { const GB: u64 = 1024 * 1024 * 1024; Ok(ApiCustomTemplateParams { @@ -192,14 +190,17 @@ impl ApiCustomTemplateParams { min_cpu: 1, min_memory: GB, max_memory, - min_disk: GB * 5, - max_disk, disks: disks .iter() .filter(|d| d.pricing_id == pricing.id) - .map(|d| ApiCustomTemplateDiskParam { - disk_type: d.kind.into(), - disk_interface: d.interface.into(), + .filter_map(|d| { + Some(ApiCustomTemplateDiskParam { + min_disk: GB * 5, + max_disk: *max_disk + .get(&(d.kind.into(), d.interface.into()))?, + disk_type: d.kind.into(), + disk_interface: d.interface.into(), + }) }) .collect(), }) @@ -207,6 +208,8 @@ impl ApiCustomTemplateParams { } #[derive(Clone, Serialize, Deserialize, JsonSchema)] pub struct ApiCustomTemplateDiskParam { + pub min_disk: u64, + pub max_disk: u64, pub disk_type: DiskType, pub disk_interface: DiskInterface, } diff --git a/src/api/routes.rs b/src/api/routes.rs index bbaf623..98c40af 100644 --- a/src/api/routes.rs +++ b/src/api/routes.rs @@ -356,9 +356,18 @@ async fn v1_list_vm_templates( let max_memory = templates.iter().map(|t| t.memory).max().unwrap_or(GB * 2); let max_disk = templates .iter() - .map(|t| t.disk_size) - .max() - .unwrap_or(GB * 5); + .map(|t| (t.disk_type, t.disk_interface, t.disk_size)) + .fold(HashMap::new(), |mut acc, v| { + let k = (v.0.into(), v.1.into()); + if let Some(mut x) = acc.get_mut(&k) { + if *x < v.2 { + *x = v.2; + } + } else { + acc.insert(k, v.2); + } + return acc; + }); Some( custom_templates .into_iter() @@ -370,7 +379,7 @@ async fn v1_list_vm_templates( region, max_cpu, max_memory, - max_disk, + &max_disk, ) .ok() })