diff --git a/bin/core/src/cloud/aws.rs b/bin/core/src/cloud/aws.rs index 6c96297c9..0b7f1ca49 100644 --- a/bin/core/src/cloud/aws.rs +++ b/bin/core/src/cloud/aws.rs @@ -44,6 +44,7 @@ impl State { security_group_ids, key_pair_name, assign_public_ip, + .. }: &AwsBuilderConfig, ) -> anyhow::Result { let instance_type = InstanceType::from(instance_type.as_str()); diff --git a/bin/core/src/requests/execute/build.rs b/bin/core/src/requests/execute/build.rs index ee8664b3a..70c715fbc 100644 --- a/bin/core/src/requests/execute/build.rs +++ b/bin/core/src/requests/execute/build.rs @@ -6,7 +6,7 @@ use futures::future::join_all; use monitor_types::{ all_logs_success, entities::{ - build::{Build, BuildBuilderConfig}, + build::Build, builder::{AwsBuilderConfig, Builder, BuilderConfig}, deployment::DockerContainerState, server::Server, @@ -218,12 +218,16 @@ impl State { build: &Build, update: &mut Update, ) -> anyhow::Result<(PeripheryClient, BuildCleanupData)> { - match &build.config.builder { - BuildBuilderConfig::Server { server_id } => { - if server_id.is_empty() { + if build.config.builder_id.is_empty() { + return Err(anyhow!("")); + } + let builder: Builder = self.get_resource(&build.config.builder_id).await?; + match builder.config { + BuilderConfig::Server(config) => { + if config.id.is_empty() { return Err(anyhow!("build has not configured a builder")); } - let server: Server = self.get_resource(server_id).await?; + let server: Server = self.get_resource(&config.id).await?; let periphery = self.periphery_client(&server); Ok(( periphery, @@ -232,15 +236,7 @@ impl State { }, )) } - BuildBuilderConfig::Builder { builder_id } => { - if builder_id.is_empty() { - return Err(anyhow!("build has not configured a builder")); - } - let builder: Builder = self.get_resource(builder_id).await?; - match builder.config { - BuilderConfig::Aws(config) => self.get_aws_builder(build, config, update).await, - } - } + BuilderConfig::Aws(config) => self.get_aws_builder(build, config, update).await, } } diff --git a/bin/core/src/requests/read/server.rs b/bin/core/src/requests/read/server.rs index 7ee5dc244..28aa32704 100644 --- a/bin/core/src/requests/read/server.rs +++ b/bin/core/src/requests/read/server.rs @@ -439,9 +439,7 @@ impl Resolve for State { .request(requests::GetNetworkList {}) .await .context("failed to get accounts from periphery")?; - let res = GetAvailableNetworksResponse { - networks - }; + let res = GetAvailableNetworksResponse { networks }; Ok(res) } } diff --git a/bin/core/src/requests/write/build.rs b/bin/core/src/requests/write/build.rs index d9efa9d59..4ac234643 100644 --- a/bin/core/src/requests/write/build.rs +++ b/bin/core/src/requests/write/build.rs @@ -2,9 +2,8 @@ use anyhow::{anyhow, Context}; use async_trait::async_trait; use monitor_types::{ entities::{ - build::{Build, BuildBuilderConfig}, + build::Build, builder::Builder, - server::Server, update::{Log, UpdateStatus}, Operation, PermissionLevel, }, @@ -30,27 +29,8 @@ impl Resolve for State { user: RequestUser, ) -> anyhow::Result { let name = to_monitor_name(&name); - if let Some(builder) = &config.builder { - match builder { - BuildBuilderConfig::Server { server_id } => { - let _: Server = self.get_resource_check_permissions( - server_id, - &user, - PermissionLevel::Update, - ) - .await - .context("cannot create build on this server. user must have update permissions on the server.")?; - } - BuildBuilderConfig::Builder { builder_id } => { - let _: Builder = self.get_resource_check_permissions( - builder_id, - &user, - PermissionLevel::Read, - ) - .await - .context("cannot create build using this builder. user must have at least read permissions on the builder.")?; - } - } + if let Some(builder_id) = &config.builder_id { + let _: Builder = self.get_resource_check_permissions(builder_id, &user, PermissionLevel::Read).await.context("cannot create build using this builder. user must have at least read permissions on the builder.")?; } let start_ts = monitor_timestamp(); let build = Build { @@ -105,26 +85,7 @@ impl Resolve for State { } = self .get_resource_check_permissions(&id, &user, PermissionLevel::Update) .await?; - match &config.builder { - BuildBuilderConfig::Server { server_id } => { - let _: Server = self.get_resource_check_permissions( - server_id, - &user, - PermissionLevel::Update, - ) - .await - .context("cannot create build on this server. user must have update permissions on the server.")?; - } - BuildBuilderConfig::Builder { builder_id } => { - let _: Builder = self.get_resource_check_permissions( - builder_id, - &user, - PermissionLevel::Read, - ) - .await - .context("cannot create build using this builder. user must have at least read permissions on the builder.")?; - } - } + let _: Builder = self.get_resource_check_permissions(&config.builder_id, &user, PermissionLevel::Read).await.context("cannot create build using this builder. user must have at least read permissions on the builder.")?; let start_ts = monitor_timestamp(); let build = Build { id: Default::default(), @@ -219,27 +180,8 @@ impl Resolve for State { .await?; let inner = || async move { - if let Some(builder) = &config.builder { - match builder { - BuildBuilderConfig::Server { server_id } => { - let _: Server = self.get_resource_check_permissions( - server_id, - &user, - PermissionLevel::Update, - ) - .await - .context("cannot create build on this server. user must have update permissions on the server.")?; - } - BuildBuilderConfig::Builder { builder_id } => { - let _: Builder = self.get_resource_check_permissions( - builder_id, - &user, - PermissionLevel::Read, - ) - .await - .context("cannot create build using this builder. user must have at least read permissions on the builder.")?; - } - } + if let Some(builder_id) = &config.builder_id { + let _: Builder = self.get_resource_check_permissions(builder_id, &user, PermissionLevel::Read).await.context("cannot create build using this builder. user must have at least read permissions on the builder.")?; } if let Some(build_args) = &mut config.build_args { diff --git a/bin/core/src/resource.rs b/bin/core/src/resource.rs index f84d17e34..f4fc7fe1b 100644 --- a/bin/core/src/resource.rs +++ b/bin/core/src/resource.rs @@ -270,6 +270,7 @@ impl StateResource for State { async fn to_list_item(&self, builder: Builder) -> anyhow::Result { let (provider, instance_type) = match builder.config { + BuilderConfig::Server(config) => ("server".to_string(), Some(config.id)), BuilderConfig::Aws(config) => ("aws ec2".to_string(), Some(config.instance_type)), }; diff --git a/bin/tests/src/core.rs b/bin/tests/src/core.rs index 050c951f2..a2f300f1d 100644 --- a/bin/tests/src/core.rs +++ b/bin/tests/src/core.rs @@ -1,10 +1,6 @@ use monitor_client::MonitorClient; use monitor_types::{ - entities::{ - build::{BuildBuilderConfig, PartialBuildConfig}, - repo::PartialRepoConfig, - server::PartialServerConfig, - }, + entities::{build::PartialBuildConfig, repo::PartialRepoConfig, server::PartialServerConfig}, requests::{execute, read, write}, }; use serde::Deserialize; @@ -59,10 +55,7 @@ async fn create_build(monitor: &MonitorClient) -> anyhow::Result<()> { config: PartialBuildConfig { repo: "mbecker20/monitor".to_string().into(), branch: "next".to_string().into(), - builder: BuildBuilderConfig::Server { - server_id: server_id.clone(), - } - .into(), + builder_id: Default::default(), dockerfile_path: "bin/core/Dockerfile".to_string().into(), ..Default::default() }, diff --git a/lib/types/src/entities/build.rs b/lib/types/src/entities/build.rs index e1817b1f8..61d65f46f 100644 --- a/lib/types/src/entities/build.rs +++ b/lib/types/src/entities/build.rs @@ -1,9 +1,7 @@ use derive_builder::Builder; -use derive_variants::EnumVariants; use mungos::mongodb::bson::doc; use partial_derive2::Partial; use serde::{Deserialize, Serialize}; -use strum_macros::{Display, EnumString}; use typeshare::typeshare; use crate::I64; @@ -25,7 +23,9 @@ pub struct BuildInfo { #[skip_serializing_none] #[partial_from] pub struct BuildConfig { - pub builder: BuildBuilderConfig, + #[serde(default)] + #[builder(default)] + pub builder_id: String, #[serde(default)] #[builder(default)] @@ -101,20 +101,3 @@ pub struct BuildActionState { pub building: bool, pub updating: bool, } - -#[typeshare] -#[derive(Serialize, Deserialize, Debug, Clone, EnumVariants)] -#[variant_derive(Serialize, Deserialize, Debug, Clone, Copy, Display, EnumString)] -#[serde(tag = "type", content = "params")] -pub enum BuildBuilderConfig { - Server { server_id: String }, - Builder { builder_id: String }, -} - -impl Default for BuildBuilderConfig { - fn default() -> Self { - Self::Server { - server_id: Default::default(), - } - } -} diff --git a/lib/types/src/entities/builder.rs b/lib/types/src/entities/builder.rs index 031f59518..63959721a 100644 --- a/lib/types/src/entities/builder.rs +++ b/lib/types/src/entities/builder.rs @@ -19,9 +19,13 @@ pub type _PartialBuilderConfig = PartialBuilderConfig; #[variant_derive(Serialize, Deserialize, Debug, Clone, Copy, Display, EnumString)] #[serde(tag = "type", content = "params")] pub enum BuilderConfig { + Server(ServerBuilderConfig), Aws(AwsBuilderConfig), } +#[typeshare(serialized_as = "Partial")] +pub type _PartialServerBuilderConfig = PartialServerBuilderConfig; + #[typeshare(serialized_as = "Partial")] pub type _PartialAwsBuilderConfig = PartialAwsBuilderConfig; @@ -30,12 +34,14 @@ pub type _PartialAwsBuilderConfig = PartialAwsBuilderConfig; #[variant_derive(Serialize, Deserialize, Debug, Clone, Copy, Display, EnumString)] #[serde(tag = "type", content = "params")] pub enum PartialBuilderConfig { + Server(_PartialServerBuilderConfig), Aws(_PartialAwsBuilderConfig), } impl From for BuilderConfig { fn from(value: PartialBuilderConfig) -> BuilderConfig { match value { + PartialBuilderConfig::Server(server) => BuilderConfig::Server(server.into()), PartialBuilderConfig::Aws(builder) => BuilderConfig::Aws(builder.into()), } } @@ -44,6 +50,15 @@ impl From for BuilderConfig { impl BuilderConfig { pub fn merge_partial(self, partial: PartialBuilderConfig) -> BuilderConfig { match partial { + PartialBuilderConfig::Server(partial) => match self { + BuilderConfig::Server(config) => { + let config = ServerBuilderConfig { + id: partial.id.unwrap_or(config.id), + }; + BuilderConfig::Server(config) + } + _ => BuilderConfig::Server(partial.into()), + }, PartialBuilderConfig::Aws(partial) => match self { BuilderConfig::Aws(config) => { let config = AwsBuilderConfig { @@ -59,9 +74,12 @@ impl BuilderConfig { assign_public_ip: partial .assign_public_ip .unwrap_or(config.assign_public_ip), + github_accounts: partial.github_accounts.unwrap_or(config.github_accounts), + docker_accounts: partial.docker_accounts.unwrap_or(config.docker_accounts), }; BuilderConfig::Aws(config) - } // _ => BuilderConfig::AwsBuilder(partial.into()), + } + _ => BuilderConfig::Aws(partial.into()), }, } } @@ -71,17 +89,30 @@ impl BuilderConfig { #[derive(Serialize, Deserialize, Debug, Clone, Builder, Partial)] #[partial_derive(Serialize, Deserialize, Debug, Clone, Default)] #[skip_serializing_none] +#[partial_from] +pub struct ServerBuilderConfig { + pub id: String, +} + +#[typeshare] +#[derive(Serialize, Deserialize, Debug, Clone, Builder, Partial)] +#[partial_derive(Serialize, Deserialize, Debug, Clone, Default)] +#[skip_serializing_none] +#[partial_from] pub struct AwsBuilderConfig { #[serde(default = "aws_default_region")] #[builder(default = "aws_default_region()")] + #[partial_default(aws_default_region())] pub region: String, #[serde(default = "aws_default_instance_type")] #[builder(default = "aws_default_instance_type()")] + #[partial_default(aws_default_instance_type())] pub instance_type: String, #[serde(default = "aws_default_volume_gb")] #[builder(default = "aws_default_volume_gb()")] + #[partial_default(aws_default_volume_gb())] pub volume_gb: i32, pub ami_id: String, @@ -89,6 +120,11 @@ pub struct AwsBuilderConfig { pub security_group_ids: Vec, pub key_pair_name: String, pub assign_public_ip: bool, + + #[serde(default)] + pub github_accounts: Vec, + #[serde(default)] + pub docker_accounts: Vec, } fn aws_default_region() -> String { @@ -102,18 +138,3 @@ fn aws_default_instance_type() -> String { fn aws_default_volume_gb() -> i32 { 20 } - -impl From for AwsBuilderConfig { - fn from(value: PartialAwsBuilderConfig) -> AwsBuilderConfig { - AwsBuilderConfig { - region: value.region.unwrap_or(aws_default_region()), - instance_type: value.instance_type.unwrap_or(aws_default_instance_type()), - volume_gb: value.volume_gb.unwrap_or(aws_default_volume_gb()), - ami_id: value.ami_id.unwrap_or_default(), - subnet_id: value.subnet_id.unwrap_or_default(), - security_group_ids: value.security_group_ids.unwrap_or_default(), - key_pair_name: value.key_pair_name.unwrap_or_default(), - assign_public_ip: value.assign_public_ip.unwrap_or_default(), - } - } -} diff --git a/lib/types/src/requests/write/server.rs b/lib/types/src/requests/write/server.rs index 63f58810b..5c98f5be3 100644 --- a/lib/types/src/requests/write/server.rs +++ b/lib/types/src/requests/write/server.rs @@ -67,4 +67,4 @@ pub struct CreateNetwork { pub struct DeleteNetwork { pub id: String, pub name: String, -} \ No newline at end of file +}