use serde::{Deserialize, Serialize};
mod admission;
mod control;
mod events;
mod jobs;
mod records;
mod sizing;
pub use admission::{Admission, AdmissionPolicy, Basis, CpuAdmission, JobPeak, cores, cpus};
pub use control::{
Busy, Check, CheckStatus, ConfigCheck, ConfigFile, Doctor, PauseQuery, Paused, ReplaceQuery,
RunningJob,
};
pub use events::{Event, EventEnvelope, EventQuery};
pub use jobs::{
Bucket, CacheHistory, CacheHistoryQuery, CacheKind, CacheSize, CacheVolume, Caches, HostSample,
HostSampleQuery, HostSamples, Job, JobMetrics, JobPage, JobQuery, JobRunner, JobState,
JobSummary, LogQuery, LogSummary, Sample, SampleSeries, Stats, StatsQuery, StatsRow, Step,
Timeline,
};
pub use records::{
Record, RecordLimits, RecordNote, RecordRemoval, Records, RemoveRecordsQuery, RemovedRecords,
SHELL_PROTOCOL, ShellQuery,
};
pub use sizing::{
Advice, JobSizing, Peaks, ProfileSizing, Resize, Sizing, SizingChange, SizingQuery, Spread,
};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case", tag = "kind")]
pub enum Principal {
LocalOwner {
uid: u32,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Status {
pub version: String,
pub shutting_down: bool,
pub budget: Budget,
pub profiles: Vec<ProfileStatus>,
pub repositories: Vec<RepositoryStatus>,
#[serde(default)]
pub queued: Vec<QueuedJob>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Budget {
pub slice: String,
pub memory_max: Option<u64>,
pub memory_in_use: u64,
#[serde(default)]
pub admission: AdmissionPolicy,
#[serde(default)]
pub held: bool,
#[serde(default)]
pub mirror_memory: u64,
#[serde(default)]
pub seed_memory: Vec<SeedMemory>,
#[serde(default)]
pub shell_memory: Vec<ShellMemory>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cpu: Option<CpuBudget>,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct CpuBudget {
pub cpus: u64,
pub budget: u64,
pub in_use: u64,
pub held: bool,
}
impl CpuBudget {
pub fn line(&self) -> String {
let mut line = format!(
"CPU {} of {} CPUs reserved",
cores(self.in_use),
cores(self.budget)
);
if self.held {
line.push_str("; a job waits for CPU");
}
line
}
}
impl Budget {
pub fn admission_note(&self) -> Option<&'static str> {
match (self.admission, self.held) {
(AdmissionPolicy::Caps, _) => None,
(AdmissionPolicy::Measured, false) => Some("by predicted peaks"),
(AdmissionPolicy::Measured, true) => Some(
"by predicted peaks; the slice is past 90% of its MemoryMax, so no runner starts",
),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ShellMemory {
pub job: u64,
pub memory: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SeedMemory {
pub profile: String,
pub memory: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ProfileStatus {
pub name: String,
pub image: String,
pub cpus: u32,
pub memory: u64,
pub reseeding: bool,
pub slots: Vec<SlotStatus>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SlotStatus {
pub slot: usize,
pub runner: Option<RunnerStatus>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RunnerStatus {
pub repository: String,
pub name: String,
pub runner_id: u64,
pub container: String,
pub busy: bool,
pub started_at: u64,
#[serde(default)]
pub reserved: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RepositoryStatus {
pub name: String,
pub profile: String,
pub labels: Vec<String>,
pub paused: bool,
pub queued_jobs: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct QueuedJob {
pub id: u64,
pub repository: String,
pub run_id: u64,
pub run_attempt: u32,
pub workflow: Option<String>,
pub name: String,
pub branch: Option<String>,
pub url: Option<String>,
pub queued_at: u64,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct ShutdownRequest {
#[serde(default)]
pub force: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ErrorResponse {
pub message: String,
}