1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4#[cfg(feature = "strum")]
5use strum::{Display, EnumString};
6
7#[derive(Debug, Clone, Default, Copy, PartialEq, Eq, Serialize, Deserialize)]
13#[cfg_attr(feature = "strum", derive(Display, EnumString))]
14#[serde(rename_all = "UPPERCASE")]
15#[cfg_attr(feature = "strum", strum(serialize_all = "UPPERCASE"))]
16pub enum ComputeType {
17 #[default]
19 Gpu,
20 Cpu,
22}
23
24#[derive(Debug, Clone, Default, Copy, PartialEq, Eq, Serialize, Deserialize)]
30#[cfg_attr(feature = "strum", derive(Display, EnumString))]
31#[serde(rename_all = "UPPERCASE")]
32#[cfg_attr(feature = "strum", strum(serialize_all = "UPPERCASE"))]
33pub enum CloudType {
34 #[default]
36 Secure,
37 Community,
39}
40
41#[derive(Debug, Clone, Default, Copy, PartialEq, Eq, Serialize, Deserialize)]
46#[cfg_attr(feature = "strum", derive(Display, EnumString))]
47#[serde(rename_all = "UPPERCASE")]
48#[cfg_attr(feature = "strum", strum(serialize_all = "UPPERCASE"))]
49pub enum PodStatus {
50 #[default]
52 Running,
53 Exited,
55 Terminated,
57}
58
59#[derive(Debug, Clone, Default, Copy, PartialEq, Eq, Serialize, Deserialize)]
64pub enum CudaVersion {
65 #[serde(rename = "13.0")]
67 V13_0,
68 #[serde(rename = "12.9")]
70 V12_9,
71 #[serde(rename = "12.8")]
73 V12_8,
74 #[serde(rename = "12.7")]
76 V12_7,
77 #[serde(rename = "12.6")]
79 V12_6,
80 #[serde(rename = "12.5")]
82 V12_5,
83 #[serde(rename = "12.4")]
85 V12_4,
86 #[serde(rename = "12.3")]
88 V12_3,
89 #[serde(rename = "12.2")]
91 V12_2,
92 #[serde(rename = "12.1")]
94 V12_1,
95 #[serde(rename = "12.0")]
97 #[default]
98 V12_0,
99 #[serde(rename = "11.8")]
101 V11_8,
102}
103
104#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
110pub enum GpuTypeId {
111 #[serde(rename = "NVIDIA GeForce RTX 4090")]
113 NvidiaGeForceRtx4090,
114 #[serde(rename = "NVIDIA A40")]
116 NvidiaA40,
117 #[serde(rename = "NVIDIA RTX A5000")]
119 NvidiaRtxA5000,
120 #[serde(rename = "NVIDIA GeForce RTX 3090")]
122 NvidiaGeForceRtx3090,
123 #[serde(rename = "NVIDIA RTX A4500")]
125 NvidiaRtxA4500,
126 #[serde(rename = "NVIDIA RTX A6000")]
128 NvidiaRtxA6000,
129 #[serde(rename = "NVIDIA L40S")]
131 NvidiaL40S,
132 #[serde(rename = "NVIDIA L4")]
134 NvidiaL4,
135 #[serde(rename = "NVIDIA H100 80GB HBM3")]
137 NvidiaH100_80GbHbm3,
138 #[serde(rename = "NVIDIA RTX 4000 Ada Generation")]
140 NvidiaRtx4000Ada,
141 #[serde(rename = "NVIDIA A100 80GB PCIe")]
143 NvidiaA100_80GbPcie,
144 #[serde(rename = "NVIDIA A100-SXM4-80GB")]
146 NvidiaA100Sxm4_80Gb,
147 #[serde(rename = "NVIDIA A100-SXM4-40GB")]
149 NvidiaA100Sxm4_40Gb,
150 #[serde(rename = "NVIDIA RTX A4000")]
152 NvidiaRtxA4000,
153 #[serde(rename = "NVIDIA RTX 6000 Ada Generation")]
155 NvidiaRtx6000Ada,
156 #[serde(rename = "NVIDIA RTX 2000 Ada Generation")]
158 NvidiaRtx2000Ada,
159 #[serde(rename = "NVIDIA H200")]
161 NvidiaH200,
162 #[serde(rename = "NVIDIA L40")]
164 NvidiaL40,
165 #[serde(rename = "NVIDIA H100 NVL")]
167 NvidiaH100Nvl,
168 #[serde(rename = "NVIDIA H100 PCIe")]
170 NvidiaH100Pcie,
171 #[serde(rename = "NVIDIA GeForce RTX 3080 Ti")]
173 NvidiaGeForceRtx3080Ti,
174 #[serde(rename = "NVIDIA GeForce RTX 3080")]
176 NvidiaGeForceRtx3080,
177 #[serde(rename = "NVIDIA GeForce RTX 3070")]
179 NvidiaGeForceRtx3070,
180 #[serde(rename = "Tesla V100-PCIE-16GB")]
182 TeslaV100Pcie16Gb,
183 #[serde(rename = "Tesla V100-PCIE-32GB")]
185 TeslaV100Pcie32Gb,
186 #[serde(rename = "Tesla T4")]
188 TeslaT4,
189 #[serde(rename = "AMD Instinct MI300X OAM")]
191 AmdInstinctMi300XOam,
192 #[serde(rename = "NVIDIA RTX A2000")]
194 NvidiaRtxA2000,
195 #[serde(rename = "NVIDIA RTX A30")]
197 NvidiaRtxA30,
198 #[serde(rename = "Tesla V100-FHHL-16GB")]
200 TeslaV100Fhhl16Gb,
201 #[serde(rename = "NVIDIA GeForce RTX 4080 SUPER")]
203 NvidiaGeForceRtx4080Super,
204 #[serde(rename = "Tesla V100-SXM2-16GB")]
206 TeslaV100Sxm2_16Gb,
207 #[serde(rename = "NVIDIA GeForce RTX 4070 Ti")]
209 NvidiaGeForceRtx4070Ti,
210 #[serde(rename = "Tesla V100-SXM2-32GB")]
212 TeslaV100Sxm2_32Gb,
213 #[serde(rename = "NVIDIA RTX 4000 SFF Ada Generation")]
215 NvidiaRtx4000SffAda,
216 #[serde(rename = "NVIDIA RTX 5000 Ada Generation")]
218 NvidiaRtx5000Ada,
219 #[serde(rename = "NVIDIA GeForce RTX 5090")]
221 NvidiaGeForceRtx5090,
222 #[serde(rename = "NVIDIA A30")]
224 NvidiaA30,
225 #[serde(rename = "NVIDIA GeForce RTX 4080")]
227 NvidiaGeForceRtx4080,
228 #[serde(rename = "NVIDIA GeForce RTX 5080")]
230 NvidiaGeForceRtx5080,
231 #[serde(rename = "NVIDIA GeForce RTX 3090 Ti")]
233 NvidiaGeForceRtx3090Ti,
234 #[serde(rename = "NVIDIA B200")]
236 NvidiaB200,
237 #[default]
239 #[serde(other)]
240 Unknown,
241}
242
243impl std::fmt::Display for GpuTypeId {
244 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
245 let s = match self {
246 Self::Unknown => "Unknown",
247 Self::NvidiaGeForceRtx4090 => "NVIDIA GeForce RTX 4090",
248 Self::NvidiaA40 => "NVIDIA A40",
249 Self::NvidiaRtxA5000 => "NVIDIA RTX A5000",
250 Self::NvidiaGeForceRtx3090 => "NVIDIA GeForce RTX 3090",
251 Self::NvidiaRtxA4500 => "NVIDIA RTX A4500",
252 Self::NvidiaRtxA6000 => "NVIDIA RTX A6000",
253 Self::NvidiaL40S => "NVIDIA L40S",
254 Self::NvidiaL4 => "NVIDIA L4",
255 Self::NvidiaH100_80GbHbm3 => "NVIDIA H100 80GB HBM3",
256 Self::NvidiaRtx4000Ada => "NVIDIA RTX 4000 Ada Generation",
257 Self::NvidiaA100_80GbPcie => "NVIDIA A100 80GB PCIe",
258 Self::NvidiaA100Sxm4_80Gb => "NVIDIA A100-SXM4-80GB",
259 Self::NvidiaA100Sxm4_40Gb => "NVIDIA A100-SXM4-40GB",
260 Self::NvidiaRtxA4000 => "NVIDIA RTX A4000",
261 Self::NvidiaRtx6000Ada => "NVIDIA RTX 6000 Ada Generation",
262 Self::NvidiaRtx2000Ada => "NVIDIA RTX 2000 Ada Generation",
263 Self::NvidiaH200 => "NVIDIA H200",
264 Self::NvidiaL40 => "NVIDIA L40",
265 Self::NvidiaH100Nvl => "NVIDIA H100 NVL",
266 Self::NvidiaH100Pcie => "NVIDIA H100 PCIe",
267 Self::NvidiaGeForceRtx3080Ti => "NVIDIA GeForce RTX 3080 Ti",
268 Self::NvidiaGeForceRtx3080 => "NVIDIA GeForce RTX 3080",
269 Self::NvidiaGeForceRtx3070 => "NVIDIA GeForce RTX 3070",
270 Self::TeslaV100Pcie16Gb => "Tesla V100-PCIE-16GB",
271 Self::TeslaV100Pcie32Gb => "Tesla V100-PCIE-32GB",
272 Self::TeslaT4 => "Tesla T4",
273 Self::AmdInstinctMi300XOam => "AMD Instinct MI300X OAM",
274 Self::NvidiaRtxA2000 => "NVIDIA RTX A2000",
275 Self::NvidiaRtxA30 => "NVIDIA RTX A30",
276 Self::TeslaV100Fhhl16Gb => "Tesla V100-FHHL-16GB",
277 Self::NvidiaGeForceRtx4080Super => "NVIDIA GeForce RTX 4080 SUPER",
278 Self::TeslaV100Sxm2_16Gb => "Tesla V100-SXM2-16GB",
279 Self::NvidiaGeForceRtx4070Ti => "NVIDIA GeForce RTX 4070 Ti",
280 Self::TeslaV100Sxm2_32Gb => "Tesla V100-SXM2-32GB",
281 Self::NvidiaRtx4000SffAda => "NVIDIA RTX 4000 SFF Ada Generation",
282 Self::NvidiaRtx5000Ada => "NVIDIA RTX 5000 Ada Generation",
283 Self::NvidiaGeForceRtx5090 => "NVIDIA GeForce RTX 5090",
284 Self::NvidiaA30 => "NVIDIA A30",
285 Self::NvidiaGeForceRtx4080 => "NVIDIA GeForce RTX 4080",
286 Self::NvidiaGeForceRtx5080 => "NVIDIA GeForce RTX 5080",
287 Self::NvidiaGeForceRtx3090Ti => "NVIDIA GeForce RTX 3090 Ti",
288 Self::NvidiaB200 => "NVIDIA B200",
289 };
290 write!(f, "{}", s)
291 }
292}
293
294#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
300#[serde(rename_all = "lowercase")]
301pub enum CpuFlavorId {
302 Cpu3c,
304 Cpu3g,
306 Cpu3m,
308 Cpu5c,
310 Cpu5g,
312 Cpu5m,
314 #[default]
316 #[serde(other)]
317 Unknown,
318}
319
320impl std::fmt::Display for CpuFlavorId {
321 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
322 let s = match self {
323 Self::Unknown => "unknown",
324 Self::Cpu3c => "cpu3c",
325 Self::Cpu3g => "cpu3g",
326 Self::Cpu3m => "cpu3m",
327 Self::Cpu5c => "cpu5c",
328 Self::Cpu5g => "cpu5g",
329 Self::Cpu5m => "cpu5m",
330 };
331 write!(f, "{}", s)
332 }
333}
334
335#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
341pub enum DataCenterId {
342 #[serde(rename = "EU-RO-1")]
344 EuRo1,
345 #[serde(rename = "CA-MTL-1")]
347 CaMtl1,
348 #[serde(rename = "EU-SE-1")]
350 EuSe1,
351 #[serde(rename = "US-IL-1")]
353 UsIl1,
354 #[serde(rename = "EUR-IS-1")]
356 EurIs1,
357 #[serde(rename = "EU-CZ-1")]
359 EuCz1,
360 #[serde(rename = "US-TX-3")]
362 UsTx3,
363 #[serde(rename = "EUR-IS-2")]
365 EurIs2,
366 #[serde(rename = "US-KS-2")]
368 UsKs2,
369 #[serde(rename = "US-GA-2")]
371 UsGa2,
372 #[serde(rename = "US-WA-1")]
374 UsWa1,
375 #[serde(rename = "US-TX-1")]
377 UsTx1,
378 #[serde(rename = "CA-MTL-3")]
380 CaMtl3,
381 #[serde(rename = "EU-NL-1")]
383 EuNl1,
384 #[serde(rename = "US-TX-4")]
386 UsTx4,
387 #[serde(rename = "US-CA-2")]
389 UsCa2,
390 #[serde(rename = "US-NC-1")]
392 UsNc1,
393 #[serde(rename = "OC-AU-1")]
395 OcAu1,
396 #[serde(rename = "US-DE-1")]
398 UsDe1,
399 #[serde(rename = "EUR-IS-3")]
401 EurIs3,
402 #[serde(rename = "CA-MTL-2")]
404 CaMtl2,
405 #[serde(rename = "AP-JP-1")]
407 ApJp1,
408 #[serde(rename = "EUR-NO-1")]
410 EurNo1,
411 #[serde(rename = "EU-FR-1")]
413 EuFr1,
414 #[serde(rename = "US-KS-3")]
416 UsKs3,
417 #[serde(rename = "US-GA-1")]
419 UsGa1,
420 #[serde(rename = "AP-IN-1")]
422 ApIn1,
423 #[serde(rename = "US-MD-1")]
425 UsMd1,
426 #[default]
428 #[serde(other)]
429 Unknown,
430}
431
432impl std::fmt::Display for DataCenterId {
433 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
434 let s = match self {
435 Self::Unknown => "Unknown",
436 Self::EuRo1 => "EU-RO-1",
437 Self::CaMtl1 => "CA-MTL-1",
438 Self::EuSe1 => "EU-SE-1",
439 Self::UsIl1 => "US-IL-1",
440 Self::EurIs1 => "EUR-IS-1",
441 Self::EuCz1 => "EU-CZ-1",
442 Self::UsTx3 => "US-TX-3",
443 Self::EurIs2 => "EUR-IS-2",
444 Self::UsKs2 => "US-KS-2",
445 Self::UsGa2 => "US-GA-2",
446 Self::UsWa1 => "US-WA-1",
447 Self::UsTx1 => "US-TX-1",
448 Self::CaMtl3 => "CA-MTL-3",
449 Self::EuNl1 => "EU-NL-1",
450 Self::UsTx4 => "US-TX-4",
451 Self::UsCa2 => "US-CA-2",
452 Self::UsNc1 => "US-NC-1",
453 Self::OcAu1 => "OC-AU-1",
454 Self::UsDe1 => "US-DE-1",
455 Self::EurIs3 => "EUR-IS-3",
456 Self::CaMtl2 => "CA-MTL-2",
457 Self::ApJp1 => "AP-JP-1",
458 Self::EurNo1 => "EUR-NO-1",
459 Self::EuFr1 => "EU-FR-1",
460 Self::UsKs3 => "US-KS-3",
461 Self::UsGa1 => "US-GA-1",
462 Self::ApIn1 => "AP-IN-1",
463 Self::UsMd1 => "US-MD-1",
464 };
465 write!(f, "{}", s)
466 }
467}
468
469#[derive(Debug, Clone, Serialize, Deserialize)]
475#[serde(rename_all = "camelCase")]
476pub struct GpuInfo {
477 pub id: String,
479 pub count: i32,
481 pub display_name: String,
483 pub secure_price: f64,
485 pub community_price: f64,
487 pub one_month_price: f64,
489 pub three_month_price: f64,
491 pub six_month_price: f64,
493 pub one_week_price: f64,
495 pub community_spot_price: f64,
497 pub secure_spot_price: f64,
499}
500
501#[derive(Debug, Clone, Serialize, Deserialize)]
506#[serde(rename_all = "camelCase")]
507pub struct CpuType {
508 pub id: String,
510 pub display_name: String,
512 pub cores: f64,
514 pub threads_per_core: f64,
516 pub group_id: String,
518}
519
520#[derive(Debug, Clone, Serialize, Deserialize)]
526#[serde(rename_all = "camelCase")]
527pub struct Machine {
528 pub min_pod_gpu_count: Option<i32>,
530 pub gpu_type_id: Option<String>,
532 pub gpu_type: Option<GpuInfo>,
534 pub cpu_count: Option<i32>,
536 pub cpu_type_id: Option<String>,
538 pub cpu_type: Option<CpuType>,
540 #[serde(default)]
542 pub location: String,
543 #[serde(default)]
545 pub data_center_id: String,
546 pub disk_throughput_m_bps: Option<i32>,
548 pub max_download_speed_mbps: Option<i32>,
550 pub max_upload_speed_mbps: Option<i32>,
552 #[serde(default)]
554 pub support_public_ip: bool,
555 #[serde(default)]
557 pub secure_cloud: bool,
558 pub maintenance_start: Option<String>,
560 pub maintenance_end: Option<String>,
562 pub maintenance_note: Option<String>,
564 pub note: Option<String>,
566 #[serde(default)]
568 pub cost_per_hr: f64,
569 pub current_price_per_gpu: Option<f64>,
571 pub gpu_available: Option<i32>,
573 pub gpu_display_name: Option<String>,
575}
576
577#[derive(Debug, Clone, Serialize, Deserialize)]
583#[serde(rename_all = "camelCase")]
584pub struct SavingsPlan {
585 pub cost_per_hr: f64,
587 pub end_time: String,
589 pub gpu_type_id: String,
591 pub id: String,
593 pub pod_id: String,
595 pub start_time: String,
597}
598
599#[derive(Debug, Clone, Serialize, Deserialize)]
605#[serde(rename_all = "camelCase")]
606pub struct NetworkVolume {
607 pub id: String,
609 pub name: String,
611 pub size: i32,
613 pub data_center_id: String,
615}
616
617pub type EnvVars = HashMap<String, String>;
622
623pub type PortMappings = HashMap<String, i32>;
628
629#[cfg(test)]
630mod tests {
631 use super::*;
632
633 #[test]
634 fn test_machine_deserialization_from_empty_json() {
635 let m: Machine = serde_json::from_str("{}").expect("empty machine should work");
636 assert_eq!(m.location, "");
637 assert_eq!(m.data_center_id, "");
638 assert!(!m.support_public_ip);
639 assert!(!m.secure_cloud);
640 assert_eq!(m.cost_per_hr, 0.0);
641 }
642}