make server a builder type

This commit is contained in:
mbecker20
2023-08-07 01:06:20 -04:00
parent d5f2ae7871
commit 37becd9327
9 changed files with 62 additions and 127 deletions

View File

@@ -44,6 +44,7 @@ impl State {
security_group_ids,
key_pair_name,
assign_public_ip,
..
}: &AwsBuilderConfig,
) -> anyhow::Result<Ec2Instance> {
let instance_type = InstanceType::from(instance_type.as_str());

View File

@@ -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,
}
}

View File

@@ -439,9 +439,7 @@ impl Resolve<GetAvailableNetworks, RequestUser> for State {
.request(requests::GetNetworkList {})
.await
.context("failed to get accounts from periphery")?;
let res = GetAvailableNetworksResponse {
networks
};
let res = GetAvailableNetworksResponse { networks };
Ok(res)
}
}

View File

@@ -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<CreateBuild, RequestUser> for State {
user: RequestUser,
) -> anyhow::Result<Build> {
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<CopyBuild, RequestUser> 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<UpdateBuild, RequestUser> 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 {

View File

@@ -270,6 +270,7 @@ impl StateResource<Builder> for State {
async fn to_list_item(&self, builder: Builder) -> anyhow::Result<BuilderListItem> {
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)),
};

View File

@@ -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()
},

View File

@@ -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(),
}
}
}

View File

@@ -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<ServerBuilderConfig>")]
pub type _PartialServerBuilderConfig = PartialServerBuilderConfig;
#[typeshare(serialized_as = "Partial<AwsBuilderConfig>")]
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<PartialBuilderConfig> 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<PartialBuilderConfig> 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<String>,
pub key_pair_name: String,
pub assign_public_ip: bool,
#[serde(default)]
pub github_accounts: Vec<String>,
#[serde(default)]
pub docker_accounts: Vec<String>,
}
fn aws_default_region() -> String {
@@ -102,18 +138,3 @@ fn aws_default_instance_type() -> String {
fn aws_default_volume_gb() -> i32 {
20
}
impl From<PartialAwsBuilderConfig> 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(),
}
}
}

View File

@@ -67,4 +67,4 @@ pub struct CreateNetwork {
pub struct DeleteNetwork {
pub id: String,
pub name: String,
}
}