Compare commits

...

2 Commits

Author SHA1 Message Date
mbecker20
5dee16a100 0.3.3 add default term signal and timeout to deployment 2023-05-01 08:28:12 +00:00
mbecker20
35f3bcdf2f update core version 2023-05-01 03:05:51 +00:00
17 changed files with 246 additions and 117 deletions

34
Cargo.lock generated
View File

@@ -804,7 +804,7 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
[[package]]
name = "core"
version = "0.3.0"
version = "0.3.3"
dependencies = [
"anyhow",
"async_timing_util",
@@ -824,7 +824,7 @@ dependencies = [
"jwt",
"merge_config_files",
"monitor_helpers",
"monitor_types 0.3.2",
"monitor_types 0.3.3",
"mungos",
"periphery_client",
"serde",
@@ -1058,10 +1058,10 @@ checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb"
[[package]]
name = "db_client"
version = "0.3.2"
version = "0.3.3"
dependencies = [
"anyhow",
"monitor_types 0.3.2",
"monitor_types 0.3.3",
"mungos",
]
@@ -1934,12 +1934,12 @@ dependencies = [
[[package]]
name = "monitor_cli"
version = "0.3.2"
version = "0.3.3"
dependencies = [
"async_timing_util",
"clap",
"colored",
"monitor_types 0.3.2",
"monitor_types 0.3.3",
"rand",
"run_command",
"serde",
@@ -1951,12 +1951,12 @@ dependencies = [
[[package]]
name = "monitor_client"
version = "0.3.2"
version = "0.3.3"
dependencies = [
"anyhow",
"envy",
"futures-util",
"monitor_types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
"monitor_types 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
"reqwest",
"serde",
"serde_derive",
@@ -1968,11 +1968,11 @@ dependencies = [
[[package]]
name = "monitor_helpers"
version = "0.3.2"
version = "0.3.3"
dependencies = [
"anyhow",
"axum",
"monitor_types 0.3.2",
"monitor_types 0.3.3",
"rand",
"serde",
"serde_json",
@@ -1981,7 +1981,7 @@ dependencies = [
[[package]]
name = "monitor_periphery"
version = "0.3.2"
version = "0.3.3"
dependencies = [
"anyhow",
"async_timing_util",
@@ -1994,7 +1994,7 @@ dependencies = [
"futures",
"merge_config_files",
"monitor_helpers",
"monitor_types 0.3.2",
"monitor_types 0.3.3",
"parse_csl",
"run_command",
"serde",
@@ -2009,7 +2009,7 @@ dependencies = [
[[package]]
name = "monitor_types"
version = "0.3.2"
version = "0.3.3"
dependencies = [
"anyhow",
"bollard",
@@ -2026,9 +2026,9 @@ dependencies = [
[[package]]
name = "monitor_types"
version = "0.3.2"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b50f6e811dc59b9f19b13b58bee4636f6f1bee2815d9c05f523b530284db75d"
checksum = "812da979965797618e2eb338da005a5ec2658d621f17af2cf26d15be3b2ff59e"
dependencies = [
"anyhow",
"bollard",
@@ -2275,11 +2275,11 @@ checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
[[package]]
name = "periphery_client"
version = "0.3.2"
version = "0.3.3"
dependencies = [
"anyhow",
"futures-util",
"monitor_types 0.3.2",
"monitor_types 0.3.3",
"reqwest",
"serde",
"serde_json",

View File

@@ -1,6 +1,6 @@
[package]
name = "monitor_cli"
version = "0.3.2"
version = "0.3.3"
edition = "2021"
authors = ["MoghTech"]
description = "monitor cli | tools to setup monitor system"

View File

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

View File

@@ -578,6 +578,9 @@ impl State {
update.id = self.add_update(update.clone()).await?;
let stop_signal = stop_signal.unwrap_or(deployment.termination_signal).into();
let stop_time = stop_time.unwrap_or(deployment.termination_timeout).into();
let deploy_log = match self
.periphery
.deploy(&server, &deployment, stop_signal, stop_time)
@@ -716,6 +719,9 @@ impl State {
};
update.id = self.add_update(update.clone()).await?;
let stop_signal = stop_signal.unwrap_or(deployment.termination_signal).into();
let stop_time = stop_time.unwrap_or(deployment.termination_timeout).into();
let log = self
.periphery
.container_stop(&server, &deployment.name, stop_signal, stop_time)
@@ -792,6 +798,9 @@ impl State {
};
update.id = self.add_update(update.clone()).await?;
let stop_signal = stop_signal.unwrap_or(deployment.termination_signal).into();
let stop_time = stop_time.unwrap_or(deployment.termination_timeout).into();
let log = self
.periphery
.container_remove(&server, &deployment.name, stop_signal, stop_time)

View File

@@ -1,4 +1,12 @@
import { Component, Match, Setter, Show, Switch, createSignal } from "solid-js";
import {
Component,
Match,
Setter,
Show,
Signal,
Switch,
createSignal,
} from "solid-js";
import { client } from "../..";
import { useAppState } from "../../state/StateProvider";
import { useUser } from "../../state/UserProvider";
@@ -13,10 +21,12 @@ import { combineClasses } from "../../util/helpers";
import { A, useParams } from "@solidjs/router";
import {
DockerContainerState,
Operation,
PermissionLevel,
ServerStatus,
TerminationSignal,
TerminationSignalLabel,
UpdateStatus,
} from "../../types";
import ConfirmMenuButton from "../shared/ConfirmMenuButton";
import Selector from "../shared/menu/Selector";
@@ -164,18 +174,12 @@ const Build: Component = () => {
};
const Deploy: Component<{ redeploy?: boolean }> = (p) => {
// const { deployments } = useAppState();
const params = useParams();
// const deployment = () => deployments.get(params.id)!;
const actions = useActionStates();
const { deployments } = useAppState();
const deployment = () => deployments.get(params.id);
const name = () => deployment()?.deployment.name;
const [termSignalLabel, setTermSignalLabel] =
createSignal<TerminationSignalLabel>({
signal: "default" as TerminationSignal,
label: "",
});
const [termSignalLabel, setTermSignalLabel] = useTermSignalLabel();
return (
<Show
when={!actions.deploying}
@@ -235,11 +239,7 @@ const RemoveContainer = () => {
const actions = useActionStates();
const { deployments } = useAppState();
const name = () => deployments.get(params.id)?.deployment.name;
const [termSignalLabel, setTermSignalLabel] =
createSignal<TerminationSignalLabel>({
signal: "default" as TerminationSignal,
label: "",
});
const [termSignalLabel, setTermSignalLabel] = useTermSignalLabel();
return (
<Show
when={!actions.removing}
@@ -316,11 +316,7 @@ const Stop = () => {
const actions = useActionStates();
const { deployments } = useAppState();
const name = () => deployments.get(params.id)?.deployment.name;
const [termSignalLabel, setTermSignalLabel] =
createSignal<TerminationSignalLabel>({
signal: "default" as TerminationSignal,
label: "",
});
const [termSignalLabel, setTermSignalLabel] = useTermSignalLabel();
return (
<Show
when={!actions.stopping}
@@ -336,9 +332,7 @@ const Stop = () => {
class="orange"
onConfirm={() => {
client.stop_container(params.id, {
stop_signal: ((termSignalLabel().signal as any) === "default"
? undefined
: termSignalLabel().signal) as TerminationSignal,
stop_signal: termSignalLabel().signal,
});
}}
title="stop container"
@@ -434,7 +428,7 @@ const TermSignalSelector: Component<{
<Show
when={
deployment()?.state === DockerContainerState.Running &&
(deployment()?.deployment.term_signal_labels?.length || 0) > 0
(deployment()?.deployment.term_signal_labels?.length || 0) > 1
}
>
<Flex
@@ -446,10 +440,7 @@ const TermSignalSelector: Component<{
<Selector
targetClass="blue"
selected={p.termSignalLabel}
items={[
{ signal: "default", label: "" },
...(deployment()?.deployment.term_signal_labels || []),
]}
items={deployment()?.deployment.term_signal_labels || []}
itemMap={({ signal, label }) => (
<Flex gap="0.5rem" alignItems="center">
<div>{signal}</div>
@@ -458,9 +449,7 @@ const TermSignalSelector: Component<{
</Show>
</Flex>
)}
onSelect={(signal) =>
p.setTermSignalLabel(signal as TerminationSignalLabel)
}
onSelect={(signal) => p.setTermSignalLabel(signal)}
position="bottom right"
/>
</Flex>
@@ -468,4 +457,28 @@ const TermSignalSelector: Component<{
);
};
function useTermSignalLabel(): Signal<TerminationSignalLabel> {
const params = useParams();
const { deployments, ws } = useAppState();
const deployment = () => deployments.get(params.id)?.deployment;
const term_signal = () =>
deployment()?.termination_signal || TerminationSignal.SigTerm;
const default_term_signal_label = () => ({
signal: term_signal(),
label:
deployment()?.term_signal_labels?.find(
({ signal }) => signal === term_signal()
)?.label || "",
});
const [label, setLabel] = createSignal<TerminationSignalLabel>(
default_term_signal_label()
);
ws.subscribe([Operation.UpdateDeployment], (update) => {
if (update.status === UpdateStatus.Complete) {
setTimeout(() => setLabel(default_term_signal_label()), 100);
}
});
return [label, setLabel];
}
export default Actions;

View File

@@ -22,7 +22,7 @@ import SimpleTabs from "../../../shared/tabs/SimpleTabs";
import ExtraArgs from "./container/ExtraArgs";
import WebhookUrl from "./container/WebhookUrl";
import RedeployOnBuild from "./container/RedeployOnBuild";
import TerminationSignals from "./container/TerminationSignals";
import TerminationSignals, { DefaultTerminationSignal, DefaultTerminationTimeout } from "./termination/TerminationSignals";
const Config: Component<{}> = () => {
const { deployment, reset, save, userCanUpdate } = useConfig();
@@ -42,7 +42,6 @@ const Config: Component<{}> = () => {
<Grid class="config-items scroller" placeItems="start center">
<Image />
<DockerAccount />
<TerminationSignals />
<Network />
<Restart />
<Env />
@@ -57,6 +56,19 @@ const Config: Component<{}> = () => {
</Grid>
),
},
{
title: "termination",
element: () => (
<Grid class="config-items" placeItems="start center" style={{ "margin-bottom": "" }}>
<TerminationSignals />
<DefaultTerminationSignal />
<DefaultTerminationTimeout />
<Show when={isMobile()}>
<div style={{ height: "1rem" }} />
</Show>
</Grid>
),
},
(userCanUpdate() || deployment.repo ? true : false) && {
title: "frontend",
element: () => (

View File

@@ -7,6 +7,8 @@ import { TERM_SIGNALS } from "../../../Deployment";
import { TerminationSignal } from "../../../../../types";
import Input from "../../../../shared/Input";
import Menu from "../../../../shared/menu/Menu";
import Selector from "../../../../shared/menu/Selector";
import { pushNotification } from "../../../../..";
const TerminationSignals: Component<{}> = (p) => {
const { deployment, setDeployment, userCanUpdate } = useConfig();
@@ -33,7 +35,7 @@ const TerminationSignals: Component<{}> = (p) => {
<Grid class="config-item shadow">
<Flex alignItems="center" justifyContent="space-between">
<h1>termination signals</h1>
<Show when={userCanUpdate()}>
<Show when={userCanUpdate() && signals_to_add().length > 0}>
<Menu
show={menuOpen()}
close={() => setMenuOpen(false)}
@@ -90,3 +92,65 @@ const TerminationSignals: Component<{}> = (p) => {
};
export default TerminationSignals;
export const DefaultTerminationSignal: Component<{}> = () => {
const { deployment, setDeployment, userCanUpdate } = useConfig();
const term_signal = () =>
deployment.termination_signal || TerminationSignal.SigTerm;
const selected = () => ({
signal: term_signal(),
label:
deployment.term_signal_labels?.find(
({ signal }) => signal === term_signal()
)?.label || "",
});
return (
<Show when={deployment.term_signal_labels?.length || 0 > 0}>
<Flex
class="config-item shadow"
alignItems="center"
justifyContent="space-between"
>
<h1>default termination signal</h1>
<Selector
disabled={!userCanUpdate()}
targetClass="blue"
selected={selected()}
items={deployment.term_signal_labels || []}
onSelect={({ signal }) => setDeployment("termination_signal", signal)}
itemMap={({ signal }) => signal}
/>
</Flex>
</Show>
);
};
export const DefaultTerminationTimeout: Component<{}> = () => {
const { deployment, setDeployment, userCanUpdate } = useConfig();
return (
<Flex
class="config-item shadow"
alignItems="center"
justifyContent="space-between"
>
<h1>termination timeout</h1>
<div style={{ position: "relative" }}>
<Input
disabled={!userCanUpdate()}
style={{ width: "10rem" }}
placeholder="10"
value={deployment.termination_timeout}
onConfirm={(value) => {
const val = Number(value);
if (val) {
setDeployment("termination_timeout", val);
} else {
pushNotification("bad", "timeout must be number");
}
}}
/>
<div class="dimmed" style={{ position: "absolute", right: "1rem", top: "50%", transform: "translateY(-50%)" }}>seconds</div>
</div>
</Flex>
);
};

View File

@@ -106,6 +106,8 @@ export interface Deployment {
skip_secret_interp?: boolean;
docker_run_args: DockerRunArgs;
term_signal_labels?: TerminationSignalLabel[];
termination_signal?: TerminationSignal;
termination_timeout?: number;
build_id?: string;
redeploy_on_build?: boolean;
build_version?: Version;

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
[package]
name = "monitor_client"
version = "0.3.2"
version = "0.3.3"
edition = "2021"
authors = ["MoghTech"]
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
[dependencies]
monitor_types = "0.3.2"
monitor_types = "0.3.3"
# monitor_types = { path = "../types" }
reqwest = { version = "0.11", features = ["json"] }
tokio-tungstenite = { version = "0.18", features=["native-tls"] }

View File

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

View File

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

View File

@@ -46,11 +46,21 @@ pub struct Deployment {
#[diff(attr(#[serde(skip_serializing_if = "docker_run_args_diff_no_change")]))]
pub docker_run_args: DockerRunArgs,
#[serde(default)]
#[builder(default)]
#[serde(default = "default_term_signal_labels")]
#[builder(default = "vec![TerminationSignalLabel::default()]")]
#[diff(attr(#[serde(skip_serializing_if = "vec_diff_no_change")]))]
pub term_signal_labels: Vec<TerminationSignalLabel>,
#[serde(default)]
#[builder(default)]
#[diff(attr(#[serde(skip_serializing_if = "termination_signal_diff_no_change")]))]
pub termination_signal: TerminationSignal,
#[serde(default = "default_termination_timeout")]
#[builder(default = "10")]
#[diff(attr(#[serde(skip_serializing_if = "i32_diff_no_change")]))]
pub termination_timeout: i32,
#[builder(default)]
#[diff(attr(#[serde(skip_serializing_if = "option_diff_no_change")]))]
pub build_id: Option<String>,
@@ -99,6 +109,14 @@ pub struct Deployment {
pub updated_at: String,
}
fn default_termination_timeout() -> i32 {
10
}
fn default_term_signal_labels() -> Vec<TerminationSignalLabel> {
vec![TerminationSignalLabel::default()]
}
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct DeploymentWithContainerState {

View File

@@ -13,6 +13,10 @@ pub fn f32_diff_no_change(f32_diff: &f32) -> bool {
*f32_diff == 0.0
}
pub fn i32_diff_no_change(i32_diff: &i32) -> bool {
*i32_diff == 0
}
pub fn option_diff_no_change<T: Diff>(option_diff: &OptionDiff<T>) -> bool
where
<T as Diff>::Repr: PartialEq,

View File

@@ -1,6 +1,6 @@
[package]
name = "monitor_periphery"
version = "0.3.2"
version = "0.3.3"
edition = "2021"
authors = ["MoghTech"]
description = "monitor periphery binary"

View File

@@ -17,74 +17,81 @@ use tests::*;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let monitor = config::load().await;
println!("\nstarting tests\n");
let start_ts = unix_timestamp_ms();
let server = monitor
.list_servers(None)
.await?
.pop()
.ok_or(anyhow!("no servers"))?;
let build = BuildBuilder::default()
.name("monitor_core".into())
.server_id(server.server.id.clone().into())
.repo("mbecker20/monitor".to_string().into())
.branch("main".to_string().into())
.docker_build_args(
DockerBuildArgs {
build_path: ".".into(),
dockerfile_path: "core/Dockerfile".to_string().into(),
..Default::default()
}
.into(),
)
.pre_build(
Command {
path: "frontend".into(),
command: "yarn && yarn build".into(),
}
.into(),
)
let d = DeploymentBuilder::default()
.name(String::from("test"))
.server_id(String::from("any"))
.build()?;
let build = monitor.create_full_build(&build).await?;
println!("{d:#?}");
println!("{build:#?}");
// let monitor = config::load().await;
let build_update = monitor.build(&build.id).await?;
// println!("\nstarting tests\n");
println!("{build_update:#?}");
// let start_ts = unix_timestamp_ms();
let deployment = DeploymentBuilder::default()
.name("monitor_core_1".into())
.server_id(server.server.id.clone())
.build_id(build.id.clone().into())
.docker_run_args(
DockerRunArgsBuilder::default()
.volumes(vec![Conversion {
local: "/home/max/.monitor/core.config.toml".into(),
container: "/config/config.toml".into(),
}])
.build()?,
)
.build()?;
// let server = monitor
// .list_servers(None)
// .await?
// .pop()
// .ok_or(anyhow!("no servers"))?;
let deployment = monitor.create_full_deployment(&deployment).await?;
// let build = BuildBuilder::default()
// .name("monitor_core".into())
// .server_id(server.server.id.clone().into())
// .repo("mbecker20/monitor".to_string().into())
// .branch("main".to_string().into())
// .docker_build_args(
// DockerBuildArgs {
// build_path: ".".into(),
// dockerfile_path: "core/Dockerfile".to_string().into(),
// ..Default::default()
// }
// .into(),
// )
// .pre_build(
// Command {
// path: "frontend".into(),
// command: "yarn && yarn build".into(),
// }
// .into(),
// )
// .build()?;
println!("{deployment:#?}");
// let build = monitor.create_full_build(&build).await?;
let deploy_update = monitor.deploy_container(&deployment.id).await?;
// println!("{build:#?}");
println!("{deploy_update:#?}");
// let build_update = monitor.build(&build.id).await?;
let update = test_aws_build(&monitor).await?;
// println!("{build_update:#?}");
let end_ts = unix_timestamp_ms();
let finished_in = (end_ts - start_ts) as f64 / 1000.0;
println!("\nfinished in {finished_in} s");
// let deployment = DeploymentBuilder::default()
// .name("monitor_core_1".into())
// .server_id(server.server.id.clone())
// .build_id(build.id.clone().into())
// .docker_run_args(
// DockerRunArgsBuilder::default()
// .volumes(vec![Conversion {
// local: "/home/max/.monitor/core.config.toml".into(),
// container: "/config/config.toml".into(),
// }])
// .build()?,
// )
// .build()?;
// let deployment = monitor.create_full_deployment(&deployment).await?;
// println!("{deployment:#?}");
// let deploy_update = monitor.deploy_container(&deployment.id).await?;
// println!("{deploy_update:#?}");
// let update = test_aws_build(&monitor).await?;
// let end_ts = unix_timestamp_ms();
// let finished_in = (end_ts - start_ts) as f64 / 1000.0;
// println!("\nfinished in {finished_in} s");
Ok(())
}