forked from github-starred/komodo
* dockerfile builds use latest rust 1.96.0 * bump rust and js dependencies * deploy 2.3.0-dev-1 * omnisearch clear on close option (default true), fix omnisearch border radius cutting off search input * fix resource description responsive overflow in some screen size * kill process group * Start wiring through shell timeout / external cancel options * deploy 2.3.0-dev-2 * implement CommandOptions (timeout / cancel ability) throughout shell usage * Add timeouts to read child commands * deploy 2.3.0-dev-3 * remove periphery custom_timeout option, it doesn't function as timeout as expected * customize command timeouts * Ensure git is installed for clear error message * deploy 2.3.0-dev-4 * deploy 2.3.0-dev-5 * deploy 2.3.0-dev-6 * swarm completed in roadmap * unnecessary line * Komodo v2 march 2026 * remove debub container ports logs * remove log view console log * Fix deployment tabs disappear * align other resource store tab per resource id * disable terminal tab when attached to swarm * List All Docker Containers supports wildcard container name matching * improve container pagination situation * deploy 2.3.0-dev-7 * fix container data table search slowness * deploy 2.3.0-dev-8 * ListAllStackServices, add stack services to omni search, All containers filter by tags (based on server) * deploy 2.3.0-dev-9 * service icon correct size * list all containers / services support filtering by state * get latest image digest timeout 10s * deploy 2.3.0-dev-10 * send keepalive pings on user websockets to survive idle proxy timeouts (#1486) * bump mantine and other UI deps * deploy 2.3.0-dev-11 * fix containers page server filter * show server config always if no swarms exist * DeleteTerminal: fix incoming stack / deployment names to ids internally * single builder distribute to multiple specified servers * deploy 2.3.0-dev-12 * fix server type builder config comment * fix builder toml server_ids => server/s * sync: fix alerter resources / except_resources using ids instead of names * fix multi server builder resource page header * deploy 2.3.0-dev-13 * fix builder resource header with multiple servers styling * run dkf -> dku * white background favicon + gen resources schema * feat: break out cache/buffers and ZFS ARC from used memory (#1489) * deploy 2.3.0-dev-14 * onmisearch improve finding containers / services * refine service / container search * deploy 2.3.0-dev-15 * deploy 2.3.0-dev-16 * bump mogh auth server, remove authors from cargo toml in line with newer spec * deploy 2.3.0-dev-17 * improve selection of available building server, works when multiple builds sent simultaneously * deploy 2.3.0-dev-18 * show stack services even when down * improve stack services view when down * deploy 2.3.0-dev-19 * mogh ui 0.7.0 including login page back button if already logged in * deploy 2.3.0-dev-20 * fix containers pagination boundary * fix update permissions on swarm * deploy 2.3.0-dev-21 * skip alerting check on initial server cache refresh after startup * deploy 2.3.0-dev-22 * Fix build - deployment flow when build doesn't publish semver image tags * move check button to left of update available button * omnisearch containers only fetch when query types * Add cancel procedure / action apis * add procedure / action cancel buttons * deploy 2.3.0-dev-23 * Execution error * useIsCancelling hook for better state conveyance * fmt mem module * allow all builders build to cancel during build * deploy 2.3.0-dev-24 * bump rust to 1.96.1 * tweak ui index.html * build webhook cancel build before triggering another - better behavior for back-to-back pushes * deploy 2.3.0-dev-25 * De-vendor container apis from Docker * deploy 2.3.0-dev-26 * startup support for pagination * implement limit / page on the list routes * swarm pagination and add swarm read support to cli * use Option for limit * resource selector and omni search using pagination / search * deploy 2.3.0-dev-27 * update available disable action state polling in small * resources page support pagination * fix Image bug, improve resources page debounce * fix omni missing ! * procedure failure update log provides link to view failed update * fix omni search link ids with brute force query * improve command error message formatting * fix dashboard query for right resources * attach linked resource names in addition to ids for efficient usage with pagination * fix pagination bugs and improve pagination efficiency * some brute force pagination fixes still with limit: 0 * deploy 2.3.0-dev-28 * replace limit: 0 server query with proper search based multi selector * list api support filtering by state, use with dashboard active table * Fix state filter pagination and create terminal limit: 0 queries * deploy 2.3.0-dev-29 * deployment / stack filter by swarm id * deploy 2.3.0-dev-30 * improve database query efficiency on large resource sets * fix ListFull not filtering by query states * fix the list permits respect resource.base_permission * use saturating mul in skip computations * Fix list all containers / stack services - tags query, terms case insensitive * deploy 2.3.0-dev-31 * api based list resource sorting which works with pagination * ui implement server side table sort * fix cli usage * deploy 2.3.0-dev-32 * ensure required refetch intervals are still passed for data freshness * omni search services before containers * add Deployment custom_name configuration to set specific container name * GetResourceMatchingContainer fix empty container passed check * validate conatiner / docker compatible names protect against injection * track deployment deployed name for smooth swarm service renaming behavior * deploy 2.3.0-dev-33 * batch executions support filtering by tag * fix clippy lint * improve tag multi selector matching resource sync config * deploy 2.3.0-dev-34 * fix containers page networks / volumes wrapping * use enum cmp for sorting by state * container page uses api based sort * move list stack methods * deploy 2.3.0-dev-35 * stack / deployment state sorting prefers update available shown first * ensure name is always fallback sort * deploy 2.3.0-dev-36 * fix Source sorting for stacks, builds, syncs * deploy 2.3.0-dev-37 * keepPreviousData method to prevent lots of loading flashes * omni search tweaks / fixes * fix clear on close * paginated schedules * for efficient schedule sort * paginated terminals * fix terminals cli * fix clippy lint * deploy 2.3.0-dev-38 * configurable default pagination, including 0 (no pagination) * deploy 2.3.0-dev-39 * omnisearch use keepPreviousData * Fix omni search auto highlight first item * drop resource action guard / reset action state before pushing updates to clients for requery * deploy 2.3.0-dev-40 * builder instance type use divided children * default pagination limit 50 * UI: useDebouncedTermSearch hook * stats page * deploy 2.3.0-dev-41 * page description tweak * dashboard tables show template query mode * fix stats page legend over tooltip * setup-periphery.py: add "--core-public-keys" command line argument (#1524) * only log core public keys if provided * fix terminal execute echo colliding with output sentinels (#1522) Build the execute command as a single physical line so the PTY's local echo cannot reproduce a bare sentinel line before the real output. The `printf` format strings now use literal `\n` escapes (which printf expands) instead of embedded newline bytes, keeping the emitted output byte-identical while making the echoed command one line. Closes #1289 Claude-Session: https://claude.ai/code/session_01M1ZTEJFKv3BAW36VmBwe2v Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * deploy 2.3.0-dev-42 * nowrap on server stats containers table * improve Resources tabs with pagination support and multi select executions * allow simultaneous server container execs * Container page batch executions * use controlled selection state for resources for proper clearing selection state after delete * deploy 2.3.0-dev-43 * server docker resources multi select * server docker tabs move execute button * fix: log webhook branch-mismatch skips at debug instead of warn (#1528) Git providers send push webhooks for every branch and Komodo filters them server side (docs: Automate > Webhooks > Branch Filtering), so a push to a non-matching branch is routine operation, not a failure. It was surfaced through the generic 'Failed at running webhook' warn, indistinguishable from genuine failures, and a repo with active bot branches (e.g. Renovate) produces hundreds of these warns per day. Rename ExtractBranch::verify_branch to branch_matches, returning Ok(false) on a mismatch (logged at debug) so handlers skip quietly, matching the existing silent webhook_enabled=false skip. Branch EXTRACTION failures (e.g. a ref-less payload on a named-branch listener) still return Err and reach the warn, preserving the misconfiguration signal. * fix: parse compose config before sanitizing so secret replacers cannot corrupt service detection (#1529) Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Co-authored-by: Maxwell Becker <49575486+mbecker20@users.noreply.github.com> * clean up fix compose parse / sanitize ordering * deploy 2.3.0-dev-44 * user permissioning fix search * Fix GetHistoricalServerStats pagination * server stats list (avoiding lots of queries) and server side sorting by stats (cpu, mem, disk) * fix clippy lint * deploy 2.3.0-dev-45 * fix ui build after monaco bump * load average chart first in stats * Fix deployment build version selector * remove build version console log * provide logical core count, update load to reflect * deploy 2.3.0-dev-46 * add basic reporting functionality * Add / fix shell escaping for periphery commands * safe stdin token and prevent args passed through resource names on shell * deploy 2.3.0-dev-47 * Delete only batch executions just use delete button * add New / batch executions to dashboard tables * rust 1.97.1 * deploy 2.3.0-dev-48 * default key reporting.key * default reporting.key * redeploy on build for all running unhealthy states (rebuild to fix eg restarting issue) * resource updates query memo missing buildId in deps * deploy 2.3.0-dev-49 * Fix reporting signature * deploy 2.3.0-dev-50 --------- Co-authored-by: Remco Jongschaap <hey@dougley.com> Co-authored-by: ChanningHe <52875777+ChanningHe@users.noreply.github.com> Co-authored-by: Amos Shapira <amos.shapira@gmail.com> Co-authored-by: Matt Van Horn <mvanhorn@users.noreply.github.com> Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Christopher Plieger <917744+cplieger@users.noreply.github.com>
233 lines
5.8 KiB
Rust
233 lines
5.8 KiB
Rust
use std::time::Duration;
|
|
|
|
use colored::Colorize;
|
|
use futures_util::{StreamExt, stream::FuturesUnordered};
|
|
use komodo_client::{
|
|
api::execute::{
|
|
BatchExecutionResponse, BatchExecutionResponseItem, Execution,
|
|
},
|
|
entities::{resource_link, update::Update},
|
|
};
|
|
|
|
use crate::config::cli_config;
|
|
|
|
enum ExecutionResult {
|
|
Single(Box<Update>),
|
|
Batch(BatchExecutionResponse),
|
|
}
|
|
|
|
pub async fn handle(
|
|
execution: &Execution,
|
|
yes: bool,
|
|
) -> anyhow::Result<()> {
|
|
if matches!(execution, Execution::None(_)) {
|
|
println!("Got 'none' execution. Doing nothing...");
|
|
tokio::time::sleep(Duration::from_secs(3)).await;
|
|
println!("Finished doing nothing. Exiting...");
|
|
std::process::exit(0);
|
|
}
|
|
|
|
println!("\n{}: Execution", "Mode".dimmed());
|
|
|
|
macro_rules! handle_execution {
|
|
(
|
|
execute: [$($ExecVariant:ident),* $(,)?],
|
|
batch: [$($BatchVariant:ident),* $(,)?],
|
|
) => {{
|
|
// Print data
|
|
match execution {
|
|
$(Execution::$ExecVariant(data) => println!("{}: {data:?}", "Data".dimmed()),)*
|
|
$(Execution::$BatchVariant(data) => println!("{}: {data:?}", "Data".dimmed()),)*
|
|
Execution::CommitSync(data) => println!("{}: {data:?}", "Data".dimmed()),
|
|
Execution::Sleep(data) => println!("{}: {data:?}", "Data".dimmed()),
|
|
Execution::None(data) => println!("{}: {data:?}", "Data".dimmed()),
|
|
}
|
|
|
|
$crate::command::wait_for_enter("run execution", yes)?;
|
|
|
|
info!("Running Execution...");
|
|
|
|
let client = $crate::command::komodo_client().await?;
|
|
|
|
// Execute and get result
|
|
match execution.clone() {
|
|
$(
|
|
Execution::$ExecVariant(request) => client
|
|
.execute(request)
|
|
.await
|
|
.map(|u| ExecutionResult::Single(u.into())),
|
|
)*
|
|
$(
|
|
Execution::$BatchVariant(request) => {
|
|
client.execute(request).await.map(ExecutionResult::Batch)
|
|
}
|
|
)*
|
|
Execution::CommitSync(request) => client
|
|
.write(request)
|
|
.await
|
|
.map(|u| ExecutionResult::Single(u.into())),
|
|
Execution::Sleep(request) => {
|
|
let duration =
|
|
Duration::from_millis(request.duration_ms as u64);
|
|
tokio::time::sleep(duration).await;
|
|
println!("Finished sleeping!");
|
|
std::process::exit(0)
|
|
}
|
|
Execution::None(_) => unreachable!(),
|
|
}
|
|
}};
|
|
}
|
|
|
|
let res = handle_execution!(
|
|
execute: [
|
|
RunAction,
|
|
CancelAction,
|
|
RunProcedure,
|
|
CancelProcedure,
|
|
RunBuild,
|
|
CancelBuild,
|
|
Deploy,
|
|
PullDeployment,
|
|
StartDeployment,
|
|
RestartDeployment,
|
|
PauseDeployment,
|
|
UnpauseDeployment,
|
|
StopDeployment,
|
|
DestroyDeployment,
|
|
CloneRepo,
|
|
PullRepo,
|
|
BuildRepo,
|
|
CancelRepoBuild,
|
|
StartContainer,
|
|
RestartContainer,
|
|
PauseContainer,
|
|
UnpauseContainer,
|
|
StopContainer,
|
|
DestroyContainer,
|
|
StartAllContainers,
|
|
RestartAllContainers,
|
|
PauseAllContainers,
|
|
UnpauseAllContainers,
|
|
StopAllContainers,
|
|
PruneContainers,
|
|
DeleteNetwork,
|
|
PruneNetworks,
|
|
DeleteImage,
|
|
PruneImages,
|
|
DeleteVolume,
|
|
PruneVolumes,
|
|
PruneDockerBuilders,
|
|
PruneBuildx,
|
|
PruneSystem,
|
|
RunSync,
|
|
DeployStack,
|
|
DeployStackIfChanged,
|
|
PullStack,
|
|
StartStack,
|
|
RestartStack,
|
|
PauseStack,
|
|
UnpauseStack,
|
|
StopStack,
|
|
DestroyStack,
|
|
RunStackService,
|
|
TestAlerter,
|
|
SendAlert,
|
|
RemoveSwarmNodes,
|
|
UpdateSwarmNode,
|
|
RemoveSwarmStacks,
|
|
RemoveSwarmServices,
|
|
CreateSwarmConfig,
|
|
RotateSwarmConfig,
|
|
RemoveSwarmConfigs,
|
|
CreateSwarmSecret,
|
|
RotateSwarmSecret,
|
|
RemoveSwarmSecrets,
|
|
ClearRepoCache,
|
|
BackupCoreDatabase,
|
|
GlobalAutoUpdate,
|
|
RotateAllServerKeys,
|
|
RotateCoreKeys,
|
|
],
|
|
batch: [
|
|
BatchRunAction,
|
|
BatchRunProcedure,
|
|
BatchRunBuild,
|
|
BatchDeploy,
|
|
BatchDestroyDeployment,
|
|
BatchCloneRepo,
|
|
BatchPullRepo,
|
|
BatchBuildRepo,
|
|
BatchDeployStack,
|
|
BatchDeployStackIfChanged,
|
|
BatchPullStack,
|
|
BatchDestroyStack,
|
|
],
|
|
);
|
|
|
|
match res {
|
|
Ok(ExecutionResult::Single(update)) => {
|
|
poll_update_until_complete(&update).await
|
|
}
|
|
Ok(ExecutionResult::Batch(updates)) => {
|
|
let mut handles = updates
|
|
.iter()
|
|
.map(|update| async move {
|
|
match update {
|
|
BatchExecutionResponseItem::Ok(update) => {
|
|
poll_update_until_complete(update).await
|
|
}
|
|
BatchExecutionResponseItem::Err(e) => {
|
|
error!("{e:#?}");
|
|
Ok(())
|
|
}
|
|
}
|
|
})
|
|
.collect::<FuturesUnordered<_>>();
|
|
while let Some(res) = handles.next().await {
|
|
match res {
|
|
Ok(()) => {}
|
|
Err(e) => {
|
|
error!("{e:#?}");
|
|
}
|
|
}
|
|
}
|
|
Ok(())
|
|
}
|
|
Err(e) => {
|
|
error!("{e:#?}");
|
|
Ok(())
|
|
}
|
|
}
|
|
}
|
|
|
|
async fn poll_update_until_complete(
|
|
update: &Update,
|
|
) -> anyhow::Result<()> {
|
|
let link = if update.id.is_empty() {
|
|
let (resource_type, id) = update.target.extract_variant_id();
|
|
resource_link(&cli_config().host, resource_type, id)
|
|
} else {
|
|
format!("{}/updates/{}", cli_config().host, update.id)
|
|
};
|
|
println!("Link: '{}'", link.bold());
|
|
|
|
let client = super::komodo_client().await?;
|
|
|
|
let timer = tokio::time::Instant::now();
|
|
let update = client.poll_update_until_complete(&update.id).await?;
|
|
if update.success {
|
|
println!(
|
|
"FINISHED in {}: {}",
|
|
format!("{:.1?}", timer.elapsed()).bold(),
|
|
"EXECUTION SUCCESSFUL".green(),
|
|
);
|
|
} else {
|
|
eprintln!(
|
|
"FINISHED in {}: {}",
|
|
format!("{:.1?}", timer.elapsed()).bold(),
|
|
"EXECUTION FAILED".red(),
|
|
);
|
|
}
|
|
Ok(())
|
|
}
|