use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use validator::Validate;
pub const DEFAULT_RELEASE_MARGIN_PERCENT: u8 = 5;
#[derive(
Debug, Default, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema, Validate,
)]
pub struct QuotaConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[validate(range(min = 1, max = 100))]
pub max_resident_memory_percent: Option<u8>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[validate(range(min = 1, max = 100))]
pub max_disk_usage_percent: Option<u8>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[validate(range(max = 100))]
pub release_margin_percent: Option<u8>,
}
impl QuotaConfig {
pub fn limits(&self) -> QuotaLimits {
let Self {
enabled,
max_resident_memory_percent,
max_disk_usage_percent,
release_margin_percent,
} = *self;
if !enabled {
return QuotaLimits::default();
}
QuotaLimits {
max_resident_memory_percent,
max_disk_usage_percent,
release_margin_percent: release_margin_percent
.unwrap_or(DEFAULT_RELEASE_MARGIN_PERCENT),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct QuotaLimits {
pub max_resident_memory_percent: Option<u8>,
pub max_disk_usage_percent: Option<u8>,
pub release_margin_percent: u8,
}
impl Default for QuotaLimits {
fn default() -> Self {
QuotaLimits {
max_resident_memory_percent: None,
max_disk_usage_percent: None,
release_margin_percent: DEFAULT_RELEASE_MARGIN_PERCENT,
}
}
}