0.2.4: add description and update description

This commit is contained in:
mbecker20
2023-03-01 08:13:07 +00:00
parent 39eceb745b
commit 5a2a1a3d98
20 changed files with 169 additions and 34 deletions

30
Cargo.lock generated
View File

@@ -734,7 +734,7 @@ dependencies = [
[[package]] [[package]]
name = "core" name = "core"
version = "0.2.2" version = "0.2.4"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async_timing_util", "async_timing_util",
@@ -753,7 +753,7 @@ dependencies = [
"hmac", "hmac",
"jwt", "jwt",
"monitor_helpers", "monitor_helpers",
"monitor_types 0.2.2", "monitor_types 0.2.4",
"mungos", "mungos",
"periphery_client", "periphery_client",
"serde", "serde",
@@ -987,10 +987,10 @@ checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb"
[[package]] [[package]]
name = "db_client" name = "db_client"
version = "0.2.2" version = "0.2.4"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"monitor_types 0.2.2", "monitor_types 0.2.4",
"mungos", "mungos",
] ]
@@ -1853,12 +1853,12 @@ dependencies = [
[[package]] [[package]]
name = "monitor_client" name = "monitor_client"
version = "0.2.2" version = "0.2.4"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"envy", "envy",
"futures-util", "futures-util",
"monitor_types 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "monitor_types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
"reqwest", "reqwest",
"serde", "serde",
"serde_derive", "serde_derive",
@@ -1870,11 +1870,11 @@ dependencies = [
[[package]] [[package]]
name = "monitor_helpers" name = "monitor_helpers"
version = "0.2.2" version = "0.2.4"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"axum", "axum",
"monitor_types 0.2.2", "monitor_types 0.2.4",
"rand", "rand",
"serde", "serde",
"serde_json", "serde_json",
@@ -1883,7 +1883,7 @@ dependencies = [
[[package]] [[package]]
name = "monitor_periphery" name = "monitor_periphery"
version = "0.2.2" version = "0.2.4"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async_timing_util", "async_timing_util",
@@ -1895,7 +1895,7 @@ dependencies = [
"envy", "envy",
"futures", "futures",
"monitor_helpers", "monitor_helpers",
"monitor_types 0.2.2", "monitor_types 0.2.4",
"run_command", "run_command",
"serde", "serde",
"serde_derive", "serde_derive",
@@ -1908,7 +1908,7 @@ dependencies = [
[[package]] [[package]]
name = "monitor_types" name = "monitor_types"
version = "0.2.2" version = "0.2.4"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bollard", "bollard",
@@ -1925,9 +1925,9 @@ dependencies = [
[[package]] [[package]]
name = "monitor_types" name = "monitor_types"
version = "0.2.2" version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72e8b62148932ce7c499f16a7f0053dd9bf61ae97f66b62c0a3161203d8ca508" checksum = "891189d5f49168915fd4c81f4e59d8fdd937008a59431831f28de3d5f8cf2af2"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bollard", "bollard",
@@ -2183,11 +2183,11 @@ checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
[[package]] [[package]]
name = "periphery_client" name = "periphery_client"
version = "0.2.2" version = "0.2.4"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"futures-util", "futures-util",
"monitor_types 0.2.2", "monitor_types 0.2.4",
"reqwest", "reqwest",
"serde", "serde",
"serde_json", "serde_json",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "core" name = "core"
version = "0.2.2" version = "0.2.4"
edition = "2021" edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View File

@@ -1,20 +1,21 @@
use anyhow::Context; use anyhow::{anyhow, Context};
use axum::{ use axum::{
body::Body, body::Body,
extract::Path, extract::Path,
http::{Request, StatusCode}, http::{Request, StatusCode},
middleware, middleware,
routing::get, routing::{get, post},
Extension, Json, Router, Extension, Json, Router,
}; };
use futures_util::Future; use futures_util::Future;
use helpers::handle_anyhow_error; use helpers::handle_anyhow_error;
use mungos::Deserialize; use mungos::{doc, Deserialize};
use types::User; use types::{PermissionLevel, UpdateTarget, User};
use typeshare::typeshare;
use crate::{ use crate::{
auth::{auth_request, JwtExtension, RequestUserExtension}, auth::{auth_request, JwtExtension, RequestUser, RequestUserExtension},
state::StateExtension, state::{State, StateExtension},
}; };
pub mod build; pub mod build;
@@ -27,6 +28,13 @@ pub mod secret;
pub mod server; pub mod server;
pub mod update; pub mod update;
#[typeshare]
#[derive(Deserialize)]
struct UpdateDescriptionBody {
target: UpdateTarget,
description: String,
}
pub fn router() -> Router { pub fn router() -> Router {
Router::new() Router::new()
.route( .route(
@@ -56,6 +64,19 @@ pub fn router() -> Router {
.to_string() .to_string()
}), }),
) )
.route(
"/update_description",
post(
|state: StateExtension,
user: RequestUserExtension,
body: Json<UpdateDescriptionBody>| async move {
state
.update_description(&body.target, &body.description, &user)
.await
.map_err(handle_anyhow_error)
},
),
)
.route("/users", get(get_users)) .route("/users", get(get_users))
.nest("/build", build::router()) .nest("/build", build::router())
.nest("/deployment", deployment::router()) .nest("/deployment", deployment::router())
@@ -128,3 +149,57 @@ where
.map_err(handle_anyhow_error)?; .map_err(handle_anyhow_error)?;
Ok(res) Ok(res)
} }
impl State {
pub async fn update_description(
&self,
target: &UpdateTarget,
description: &str,
user: &RequestUser,
) -> anyhow::Result<()> {
match target {
UpdateTarget::Build(id) => {
self.get_build_check_permissions(id, user, PermissionLevel::Update)
.await?;
self.db
.builds
.update_one::<()>(id, mungos::Update::Set(doc! { "description": description }))
.await?;
}
UpdateTarget::Deployment(id) => {
self.get_deployment_check_permissions(id, user, PermissionLevel::Update)
.await?;
self.db
.builds
.update_one::<()>(id, mungos::Update::Set(doc! { "description": description }))
.await?;
}
UpdateTarget::Server(id) => {
self.get_server_check_permissions(id, user, PermissionLevel::Update)
.await?;
self.db
.builds
.update_one::<()>(id, mungos::Update::Set(doc! { "description": description }))
.await?;
}
UpdateTarget::Group(id) => {
self.get_group_check_permissions(id, user, PermissionLevel::Update)
.await?;
self.db
.builds
.update_one::<()>(id, mungos::Update::Set(doc! { "description": description }))
.await?;
}
UpdateTarget::Procedure(id) => {
self.get_procedure_check_permissions(id, user, PermissionLevel::Update)
.await?;
self.db
.builds
.update_one::<()>(id, mungos::Update::Set(doc! { "description": description }))
.await?;
}
_ => return Err(anyhow!("invalid target: {target:?}")),
}
Ok(())
}
}

View File

@@ -78,7 +78,6 @@ impl State {
} }
let futures = servers.unwrap().into_iter().map(|server| async move { let futures = servers.unwrap().into_iter().map(|server| async move {
let _ = self.periphery.image_prune(&server).await; let _ = self.periphery.image_prune(&server).await;
let _ = self.periphery.container_prune(&server).await;
}); });
join_all(futures).await; join_all(futures).await;
} }

View File

@@ -9,6 +9,7 @@ export type PermissionsMap = Record<string, PermissionLevel>;
export interface Action { export interface Action {
_id?: string; _id?: string;
name: string; name: string;
description?: string;
path: string; path: string;
command: string; command: string;
server_ids?: string[]; server_ids?: string[];
@@ -22,6 +23,7 @@ export interface Action {
export interface Build { export interface Build {
_id?: string; _id?: string;
name: string; name: string;
description?: string;
permissions?: PermissionsMap; permissions?: PermissionsMap;
server_id?: string; server_id?: string;
aws_config?: AwsBuilderBuildConfig; aws_config?: AwsBuilderBuildConfig;
@@ -94,6 +96,7 @@ export interface AmiAccounts {
export interface Deployment { export interface Deployment {
_id?: string; _id?: string;
name: string; name: string;
description?: string;
server_id: string; server_id: string;
permissions?: PermissionsMap; permissions?: PermissionsMap;
docker_run_args: DockerRunArgs; docker_run_args: DockerRunArgs;
@@ -164,6 +167,7 @@ export interface DockerContainerStats {
export interface Group { export interface Group {
_id?: string; _id?: string;
name: string; name: string;
description?: string;
permissions?: PermissionsMap; permissions?: PermissionsMap;
builds: string[]; builds: string[];
deployments: string[]; deployments: string[];
@@ -192,6 +196,7 @@ export interface UserCredentials {
export interface Procedure { export interface Procedure {
_id?: string; _id?: string;
name: string; name: string;
description?: string;
stages?: ProcedureStage[]; stages?: ProcedureStage[];
webhook_branches?: string[]; webhook_branches?: string[];
permissions?: PermissionsMap; permissions?: PermissionsMap;
@@ -207,6 +212,7 @@ export interface ProcedureStage {
export interface Server { export interface Server {
_id?: string; _id?: string;
name: string; name: string;
description?: string;
address: string; address: string;
permissions?: PermissionsMap; permissions?: PermissionsMap;
enabled: boolean; enabled: boolean;

View File

@@ -43,6 +43,7 @@ import {
ModifyUserCreateServerBody, ModifyUserCreateServerBody,
ModifyUserEnabledBody, ModifyUserEnabledBody,
PermissionsUpdateBody, PermissionsUpdateBody,
UpdateDescriptionBody,
} from "./client_types"; } from "./client_types";
import { generateQuery, QueryObject } from "./helpers"; import { generateQuery, QueryObject } from "./helpers";
@@ -111,7 +112,7 @@ export class Client {
} }
} }
get_username(user_id: string): Promise<string> { get_username(user_id: string): Promise<string> {
return this.get(`/api/username/${user_id}`); return this.get(`/api/username/${user_id}`);
} }
@@ -124,7 +125,11 @@ export class Client {
} }
get_github_webhook_base_url(): Promise<string> { get_github_webhook_base_url(): Promise<string> {
return this.get("/api/github_webhook_base_url") return this.get("/api/github_webhook_base_url");
}
update_description(body: UpdateDescriptionBody): Promise<undefined> {
return this.post("/api/update_description", body);
} }
// deployment // deployment

View File

@@ -2,7 +2,7 @@
Generated by typeshare 1.0.0 Generated by typeshare 1.0.0
*/ */
import { PermissionLevel, PermissionsTarget } from "../types"; import { PermissionLevel, PermissionsTarget, UpdateTarget } from "../types";
export interface CreateBuildBody { export interface CreateBuildBody {
name: string; name: string;
@@ -37,6 +37,11 @@ export interface CreateGroupBody {
name: string; name: string;
} }
export interface UpdateDescriptionBody {
target: UpdateTarget;
description: string;
}
export interface PermissionsUpdateBody { export interface PermissionsUpdateBody {
user_id: string; user_id: string;
permission: PermissionLevel; permission: PermissionLevel;

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "db_client" name = "db_client"
version = "0.2.2" version = "0.2.4"
edition = "2021" edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "monitor_helpers" name = "monitor_helpers"
version = "0.2.2" version = "0.2.4"
edition = "2021" edition = "2021"
authors = ["MoghTech"] authors = ["MoghTech"]
description = "helpers used as dependency for mogh tech monitor" description = "helpers used as dependency for mogh tech monitor"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "monitor_client" name = "monitor_client"
version = "0.2.2" version = "0.2.4"
edition = "2021" edition = "2021"
authors = ["MoghTech"] authors = ["MoghTech"]
description = "a client to interact with the monitor system" description = "a client to interact with the monitor system"
@@ -9,7 +9,7 @@ license = "GPL-3.0-or-later"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
monitor_types = "0.2.2" monitor_types = "0.2.4"
# monitor_types = { path = "../types" } # monitor_types = { path = "../types" }
reqwest = { version = "0.11", features = ["json"] } reqwest = { version = "0.11", features = ["json"] }
tokio-tungstenite = { version = "0.18", features=["native-tls"] } tokio-tungstenite = { version = "0.18", features=["native-tls"] }

View File

@@ -10,6 +10,7 @@ pub use futures_util;
pub use tokio_tungstenite; pub use tokio_tungstenite;
pub use monitor_types as types; pub use monitor_types as types;
use types::UpdateTarget;
mod build; mod build;
mod deployment; mod deployment;
@@ -146,6 +147,19 @@ impl MonitorClient {
.context("failed at call to get_github_webhook_base_url") .context("failed at call to get_github_webhook_base_url")
} }
pub async fn update_description(
&self,
target: UpdateTarget,
description: &str,
) -> anyhow::Result<()> {
self.post(
"/api/update_description",
json!({ "target": target, "description": description }),
)
.await
.context("failed at call to update_description")
}
async fn get<R: DeserializeOwned>( async fn get<R: DeserializeOwned>(
&self, &self,
endpoint: &str, endpoint: &str,

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "periphery_client" name = "periphery_client"
version = "0.2.2" version = "0.2.4"
edition = "2021" edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "monitor_types" name = "monitor_types"
version = "0.2.2" version = "0.2.4"
edition = "2021" edition = "2021"
authors = ["MoghTech"] authors = ["MoghTech"]
description = "types for the mogh tech monitor" description = "types for the mogh tech monitor"

View File

@@ -23,6 +23,11 @@ pub struct Action {
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))] #[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub name: String, pub name: String,
#[serde(default)]
#[builder(default)]
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub description: String,
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))] #[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub path: String, pub path: String,

View File

@@ -27,6 +27,11 @@ pub struct Build {
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))] #[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub name: String, pub name: String,
#[serde(default)]
#[builder(default)]
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub description: String,
#[serde(default)] #[serde(default)]
#[diff(attr(#[serde(skip_serializing)]))] #[diff(attr(#[serde(skip_serializing)]))]
#[builder(setter(skip))] #[builder(setter(skip))]

View File

@@ -24,6 +24,11 @@ pub struct Deployment {
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))] #[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub name: String, // must be formatted to be compat with docker pub name: String, // must be formatted to be compat with docker
#[serde(default)]
#[builder(default)]
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub description: String,
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))] #[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub server_id: String, pub server_id: String,

View File

@@ -23,6 +23,11 @@ pub struct Group {
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))] #[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub name: String, pub name: String,
#[serde(default)]
#[builder(default)]
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub description: String,
#[serde(default)] #[serde(default)]
#[diff(attr(#[serde(skip_serializing)]))] #[diff(attr(#[serde(skip_serializing)]))]
#[builder(setter(skip))] #[builder(setter(skip))]

View File

@@ -23,6 +23,11 @@ pub struct Procedure {
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))] #[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub name: String, pub name: String,
#[serde(default)]
#[builder(default)]
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub description: String,
#[serde(default)] #[serde(default)]
#[builder(default)] #[builder(default)]
#[diff(attr(#[serde(skip_serializing_if = "vec_diff_no_change")]))] #[diff(attr(#[serde(skip_serializing_if = "vec_diff_no_change")]))]

View File

@@ -26,6 +26,11 @@ pub struct Server {
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))] #[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub name: String, pub name: String,
#[serde(default)]
#[builder(default)]
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub description: String,
#[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))] #[diff(attr(#[serde(skip_serializing_if = "Option::is_none")]))]
pub address: String, pub address: String,
@@ -94,7 +99,7 @@ impl Default for Server {
address: Default::default(), address: Default::default(),
permissions: Default::default(), permissions: Default::default(),
enabled: true, enabled: true,
auto_prune: false, auto_prune: true,
to_notify: Default::default(), to_notify: Default::default(),
cpu_alert: default_cpu_alert(), cpu_alert: default_cpu_alert(),
mem_alert: default_mem_alert(), mem_alert: default_mem_alert(),
@@ -102,6 +107,7 @@ impl Default for Server {
stats_interval: Default::default(), stats_interval: Default::default(),
region: Default::default(), region: Default::default(),
instance_id: Default::default(), instance_id: Default::default(),
description: Default::default(),
created_at: Default::default(), created_at: Default::default(),
updated_at: Default::default(), updated_at: Default::default(),
} }

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "monitor_periphery" name = "monitor_periphery"
version = "0.2.2" version = "0.2.4"
edition = "2021" edition = "2021"
authors = ["MoghTech"] authors = ["MoghTech"]
description = "monitor periphery binary | run monitor periphery as system daemon" description = "monitor periphery binary | run monitor periphery as system daemon"