mirror of
https://github.com/moghtech/komodo.git
synced 2026-07-10 12:01:56 -05:00
make server a builder type
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)),
|
||||
};
|
||||
|
||||
|
||||
@@ -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()
|
||||
},
|
||||
|
||||
@@ -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(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,4 +67,4 @@ pub struct CreateNetwork {
|
||||
pub struct DeleteNetwork {
|
||||
pub id: String,
|
||||
pub name: String,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user