use kube::CustomResource;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(CustomResource, Clone, Debug, Deserialize, Serialize, JsonSchema)]
#[kube(
group = "modelexpress.nvidia.com",
version = "v1alpha1",
kind = "ModelCacheEntry",
plural = "modelcacheentries",
shortname = "mxcache",
namespaced,
status = "ModelCacheEntryStatus"
)]
pub struct ModelCacheEntrySpec {
#[serde(rename = "modelName")]
pub model_name: String,
pub provider: String,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize, JsonSchema)]
pub struct ModelCacheEntryStatus {
#[serde(default)]
pub phase: String,
#[serde(rename = "createdAt", default)]
pub created_at: Option<String>,
#[serde(rename = "lastUsedAt", default)]
pub last_used_at: Option<String>,
#[serde(default)]
pub message: Option<String>,
}
pub mod phase {
pub const DOWNLOADING: &str = "Downloading";
pub const DOWNLOADED: &str = "Downloaded";
pub const ERROR: &str = "Error";
}
#[cfg(test)]
#[allow(clippy::expect_used)]
mod tests {
use super::*;
#[test]
fn spec_roundtrips_through_json() {
let spec = ModelCacheEntrySpec {
model_name: "meta-llama/Llama-3.1-70B".to_string(),
provider: "HuggingFace".to_string(),
};
let json = serde_json::to_string(&spec).expect("serialize");
assert!(json.contains("\"modelName\":\"meta-llama/Llama-3.1-70B\""));
let back: ModelCacheEntrySpec = serde_json::from_str(&json).expect("deserialize");
assert_eq!(back.model_name, spec.model_name);
assert_eq!(back.provider, spec.provider);
}
#[test]
fn status_default_is_empty() {
let status = ModelCacheEntryStatus::default();
assert_eq!(status.phase, "");
assert!(status.created_at.is_none());
assert!(status.last_used_at.is_none());
assert!(status.message.is_none());
}
}