partial config from files first merged onto full config default before diff with remote

This commit is contained in:
mbecker20
2024-06-03 15:01:14 -07:00
parent 2460b5edf7
commit 03cad5b23b
11 changed files with 152 additions and 3 deletions

View File

@@ -28,13 +28,16 @@ pub struct ToUpdateItem<T> {
pub trait ResourceSync: Sized {
type Config: Clone
+ Default
+ Send
+ From<Self::PartialConfig>
+ PartialDiff<Self::PartialConfig, Self::ConfigDiff>
+ 'static;
type Info: Default + 'static;
type PartialConfig: std::fmt::Debug
+ Clone
+ Send
+ From<Self::Config>
+ From<Self::ConfigDiff>
+ Serialize
+ MaybeNone
@@ -158,6 +161,7 @@ pub trait ResourceSync: Sized {
}
}
/// Gets all the resources to update, logging along the way.
pub fn get_updates<Resource: ResourceSync>(
resources: Vec<ResourceToml<Resource::PartialConfig>>,
delete: bool,
@@ -179,6 +183,11 @@ pub fn get_updates<Resource: ResourceSync>(
for mut resource in resources {
match map.get(&resource.name) {
Some(original) => {
// First merge toml resource config (partial) onto default resource config.
// Makes sure things that aren't defined in toml (come through as None) actually get removed.
let config: Resource::Config = resource.config.into();
resource.config = config.into();
let diff = Resource::get_diff(
original.config.clone(),
resource.config,

View File

@@ -61,10 +61,27 @@ pub struct AlerterConfig {
pub endpoint: AlerterEndpoint,
}
impl AlerterConfig {
pub fn builder() -> AlerterConfigBuilder {
AlerterConfigBuilder::default()
}
}
fn default_enabled() -> bool {
true
}
impl Default for AlerterConfig {
fn default() -> Self {
Self {
enabled: default_enabled(),
alert_types: Default::default(),
resources: Default::default(),
endpoint: Default::default(),
}
}
}
// ENDPOINTS
#[typeshare]

View File

@@ -182,6 +182,30 @@ fn default_webhook_enabled() -> bool {
true
}
impl Default for BuildConfig {
fn default() -> Self {
Self {
builder_id: Default::default(),
skip_secret_interp: Default::default(),
version: Default::default(),
repo: Default::default(),
branch: default_branch(),
commit: Default::default(),
github_account: Default::default(),
docker_account: Default::default(),
docker_organization: Default::default(),
pre_build: Default::default(),
build_path: default_build_path(),
dockerfile_path: default_dockerfile_path(),
build_args: Default::default(),
labels: Default::default(),
extra_args: Default::default(),
use_buildx: Default::default(),
webhook_enabled: default_webhook_enabled(),
}
}
}
#[typeshare]
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize)]
pub struct BuildActionState {

View File

@@ -46,6 +46,12 @@ pub enum BuilderConfig {
Aws(AwsBuilderConfig),
}
impl Default for BuilderConfig {
fn default() -> Self {
Self::Aws(Default::default())
}
}
/// Partial representation of [BuilderConfig]
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, EnumVariants)]

View File

@@ -169,6 +169,30 @@ fn default_network() -> String {
String::from("host")
}
impl Default for DeploymentConfig {
fn default() -> Self {
Self {
server_id: Default::default(),
send_alerts: default_send_alerts(),
image: Default::default(),
skip_secret_interp: Default::default(),
redeploy_on_build: Default::default(),
term_signal_labels: default_term_signal_labels(),
termination_signal: Default::default(),
termination_timeout: default_termination_timeout(),
ports: Default::default(),
volumes: Default::default(),
environment: Default::default(),
labels: Default::default(),
network: default_network(),
restart: Default::default(),
command: Default::default(),
extra_args: Default::default(),
docker_account: Default::default(),
}
}
}
#[typeshare]
#[derive(
Serialize, Deserialize, Debug, Clone, PartialEq, EnumVariants,

View File

@@ -51,9 +51,7 @@ pub type _PartialProcedureConfig = PartialProcedureConfig;
/// Config for the [Procedure]
#[typeshare]
#[derive(
Debug, Clone, Default, Serialize, Deserialize, Partial, Builder,
)]
#[derive(Debug, Clone, Serialize, Deserialize, Partial, Builder)]
#[partial_derive(Debug, Clone, Default, Serialize, Deserialize)]
#[partial(skip_serializing_none, from, diff)]
pub struct ProcedureConfig {
@@ -69,10 +67,25 @@ pub struct ProcedureConfig {
pub webhook_enabled: bool,
}
impl ProcedureConfig {
pub fn builder() -> ProcedureConfigBuilder {
ProcedureConfigBuilder::default()
}
}
fn default_webhook_enabled() -> bool {
true
}
impl Default for ProcedureConfig {
fn default() -> Self {
Self {
stages: Default::default(),
webhook_enabled: default_webhook_enabled(),
}
}
}
/// A single stage of a procedure. Runs a list of executions in parallel.
#[typeshare]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
@@ -83,6 +96,7 @@ pub struct ProcedureStage {
#[serde(default = "default_enabled")]
pub enabled: bool,
/// The executions in the stage
#[serde(default)]
pub executions: Vec<EnabledExecution>,
}

View File

@@ -132,6 +132,21 @@ fn default_webhook_enabled() -> bool {
true
}
impl Default for RepoConfig {
fn default() -> Self {
Self {
server_id: Default::default(),
repo: Default::default(),
branch: default_branch(),
commit: Default::default(),
github_account: Default::default(),
on_clone: Default::default(),
on_pull: Default::default(),
webhook_enabled: default_webhook_enabled(),
}
}
}
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Copy, Default)]
pub struct RepoActionState {

View File

@@ -182,6 +182,28 @@ fn default_disk_critical() -> f64 {
95.0
}
impl Default for ServerConfig {
fn default() -> Self {
Self {
address: Default::default(),
enabled: default_enabled(),
stats_monitoring: default_stats_monitoring(),
auto_prune: default_auto_prune(),
send_unreachable_alerts: default_send_alerts(),
send_cpu_alerts: default_send_alerts(),
send_mem_alerts: default_send_alerts(),
send_disk_alerts: default_send_alerts(),
region: Default::default(),
cpu_warning: default_cpu_warning(),
cpu_critical: default_cpu_critical(),
mem_warning: default_mem_warning(),
mem_critical: default_mem_critical(),
disk_warning: default_disk_warning(),
disk_critical: default_disk_critical(),
}
}
}
/// Current pending actions on the server.
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Copy, Default)]

View File

@@ -65,6 +65,12 @@ pub struct AwsServerTemplateConfig {
pub volumes: Vec<AwsVolume>,
}
impl AwsServerTemplateConfig {
pub fn builder() -> AwsServerTemplateConfigBuilder {
AwsServerTemplateConfigBuilder::default()
}
}
fn default_region() -> String {
String::from("us-east-1")
}

View File

@@ -79,6 +79,12 @@ pub struct HetznerServerTemplateConfig {
pub port: i32,
}
impl HetznerServerTemplateConfig {
pub fn builder() -> HetznerServerTemplateConfigBuilder {
HetznerServerTemplateConfigBuilder::default()
}
}
fn default_port() -> i32 {
8120
}

View File

@@ -54,6 +54,12 @@ pub enum ServerTemplateConfig {
Hetzner(hetzner::HetznerServerTemplateConfig),
}
impl Default for ServerTemplateConfig {
fn default() -> Self {
Self::Aws(Default::default())
}
}
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, EnumVariants)]
#[variant_derive(