| 1168 | } |
| 1169 | |
| 1170 | fn make_vm_config(cfg: &Config, manifest: &Manifest, image: &Image) -> Result<serde_json::Value> { |
| 1171 | let os_image_hash = image |
| 1172 | .digest |
| 1173 | .as_ref() |
| 1174 | .and_then(|d| hex::decode(d).ok()) |
| 1175 | .unwrap_or_default(); |
| 1176 | let gpus = manifest.gpus.clone().unwrap_or_default(); |
| 1177 | let mut config = serde_json::to_value(dstack_types::VmConfig { |
| 1178 | os_image_hash, |
| 1179 | cpu_count: manifest.vcpu, |
| 1180 | memory_size: manifest.memory as u64 * 1024 * 1024, |
| 1181 | qemu_single_pass_add_pages: cfg.cvm.qemu_single_pass_add_pages, |
| 1182 | pic: cfg.cvm.qemu_pic, |
| 1183 | qemu_version: cfg.cvm.qemu_version.clone(), |
| 1184 | pci_hole64_size: cfg.cvm.qemu_pci_hole64_size, |
| 1185 | hugepages: manifest.hugepages, |
| 1186 | num_gpus: gpus.gpus.len() as u32, |
| 1187 | num_nvswitches: gpus.bridges.len() as u32, |
| 1188 | host_share_mode: cfg.cvm.host_share_mode.clone(), |
| 1189 | hotplug_off: cfg.cvm.qemu_hotplug_off, |
| 1190 | image: Some(manifest.image.clone()), |
| 1191 | ovmf_variant: image.info.ovmf_variant, |
| 1192 | })?; |
| 1193 | // For backward compatibility |
| 1194 | config["spec_version"] = serde_json::Value::from(1); |
| 1195 | Ok(config) |
| 1196 | } |
| 1197 | |
| 1198 | fn paginate<T>(items: Vec<T>, page: u32, page_size: u32) -> impl Iterator<Item = T> { |
| 1199 | let skip; |