Files
komodo/bin/cli/src/command/execute.rs
T
8708f0f600 2.3.0 (#1520)
* 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>
2026-07-29 15:08:28 -07:00

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