From c9aec771ea747c4ea596085cf523bd44bec8bf99 Mon Sep 17 00:00:00 2001 From: xeniape Date: Thu, 12 Mar 2026 14:41:46 +0100 Subject: [PATCH 01/30] feat: Add uninstall demo/stack feature --- Cargo.lock | 33 ++++ Cargo.toml | 2 + rust/stackable-cockpit/Cargo.toml | 1 + .../src/platform/demo/params.rs | 12 ++ .../src/platform/demo/spec.rs | 133 ++++++++++++-- .../src/platform/manifests.rs | 85 +++++++-- .../src/platform/stack/params.rs | 11 +- .../src/platform/stack/spec.rs | 136 +++++++++++++-- .../stackable-cockpit/src/utils/k8s/client.rs | 164 +++++++++++++++++- rust/stackablectl/Cargo.toml | 1 + rust/stackablectl/src/cmds/demo.rs | 144 +++++++++++++-- rust/stackablectl/src/cmds/stack.rs | 130 ++++++++++++-- 12 files changed, 784 insertions(+), 68 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3beb471e..f6582858 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -871,6 +871,18 @@ version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abd57806937c9cc163efc8ea3910e00a62e2aeb0b8119f1793a978088f8f6b04" +[[package]] +name = "dialoguer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" +dependencies = [ + "console", + "shell-words", + "tempfile", + "zeroize", +] + [[package]] name = "digest" version = "0.10.7" @@ -3323,6 +3335,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shell-words" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" + [[package]] name = "shlex" version = "1.3.0" @@ -3454,6 +3472,7 @@ version = "0.0.0-dev" dependencies = [ "bcrypt", "clap", + "either", "futures", "helm-sys", "indexmap 2.11.4", @@ -3627,6 +3646,7 @@ dependencies = [ "clap_complete", "clap_complete_nushell", "comfy-table", + "dialoguer", "directories", "dotenvy", "futures", @@ -3728,6 +3748,19 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "tempfile" +version = "3.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +dependencies = [ + "fastrand", + "getrandom 0.3.4", + "once_cell", + "rustix 1.1.2", + "windows-sys 0.61.2", +] + [[package]] name = "tera" version = "1.20.0" diff --git a/Cargo.toml b/Cargo.toml index e36ec2f1..595c0130 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,8 +28,10 @@ clap = { version = "4.5", features = ["derive", "env"] } clap_complete = "4.5" clap_complete_nushell = "4.5" comfy-table = { version = "7.1", features = ["custom_styling"] } +dialoguer = "0.12.0" directories = "5.0" dotenvy = "0.15" +either = "1.15.0" futures = "0.3" indexmap = { version = "2.2", features = ["serde"] } indicatif = "0.18" diff --git a/rust/stackable-cockpit/Cargo.toml b/rust/stackable-cockpit/Cargo.toml index dcd0c3eb..222a69d3 100644 --- a/rust/stackable-cockpit/Cargo.toml +++ b/rust/stackable-cockpit/Cargo.toml @@ -17,6 +17,7 @@ helm-sys = { path = "../helm-sys" } bcrypt.workspace = true clap.workspace = true +either.workspace = true indexmap.workspace = true k8s-openapi.workspace = true kube.workspace = true diff --git a/rust/stackable-cockpit/src/platform/demo/params.rs b/rust/stackable-cockpit/src/platform/demo/params.rs index 5cb337de..a5556219 100644 --- a/rust/stackable-cockpit/src/platform/demo/params.rs +++ b/rust/stackable-cockpit/src/platform/demo/params.rs @@ -3,6 +3,8 @@ use stackable_operator::kvp::Labels; use crate::platform::operator::ChartSourceType; pub struct DemoInstallParameters { + pub demo_name: String, + pub operator_namespace: String, pub demo_namespace: String, @@ -14,3 +16,13 @@ pub struct DemoInstallParameters { pub labels: Labels, pub chart_source: ChartSourceType, } + +pub struct DemoUninstallParameters { + pub demo_name: String, + + pub operator_namespace: String, + pub demo_namespace: String, + + pub skip_operators: bool, + pub skip_crds: bool +} diff --git a/rust/stackable-cockpit/src/platform/demo/spec.rs b/rust/stackable-cockpit/src/platform/demo/spec.rs index 6c4c5589..f8623db4 100644 --- a/rust/stackable-cockpit/src/platform/demo/spec.rs +++ b/rust/stackable-cockpit/src/platform/demo/spec.rs @@ -1,3 +1,4 @@ +use kube::api::{ApiResource, GroupVersionKind}; use serde::{Deserialize, Serialize}; use snafu::{OptionExt, ResultExt, Snafu}; use tracing::{Span, debug, info, instrument, warn}; @@ -9,13 +10,13 @@ use crate::{ common::manifest::ManifestSpec, platform::{ cluster::{ResourceRequests, ResourceRequestsError}, - demo::DemoInstallParameters, + demo::{DemoInstallParameters, DemoUninstallParameters}, manifests::{self, InstallManifestsExt}, release::ReleaseList, - stack::{self, StackInstallParameters, StackList}, + stack::{self, StackInstallParameters, StackList, StackSpec}, }, utils::{ - k8s::Client, + k8s::{self, Client}, params::{ IntoParameters, IntoParametersError, Parameter, RawParameter, RawParameterParseError, }, @@ -47,8 +48,18 @@ pub enum Error { #[snafu(display("failed to install stack"))] InstallStack { source: stack::Error }, + /// This error indicates that the release failed to uninstall. + #[snafu(display("failed to uninstall release"))] + UninstallRelease { source: stack::Error }, + #[snafu(display("failed to install stack manifests"))] InstallManifests { source: manifests::Error }, + + #[snafu(display("failed to uninstall Helm manifests"))] + UninstallHelmManifests { source: manifests::Error }, + + #[snafu(display("failed to delete object"))] + DeleteObject { source: k8s::Error }, } impl InstallManifestsExt for DemoSpec {} @@ -159,7 +170,6 @@ impl DemoSpec { labels: install_parameters.stack_labels.clone(), skip_release: install_parameters.skip_release, stack_name: self.stack.clone(), - demo_name: None, chart_source: install_parameters.chart_source.clone(), }; @@ -178,32 +188,133 @@ impl DemoSpec { .await } + #[instrument(skip_all, fields( + demo_name = %uninstall_parameters.demo_name, + demo_namespace = %uninstall_parameters.demo_namespace, + stack_name = %self.stack, + ))] + pub async fn uninstall( + &self, + release_list: ReleaseList, + uninstall_parameters: DemoUninstallParameters, + client: &Client, + transfer_client: &xfer::Client, + stack: StackSpec, + ) -> Result<(), Error> { + // Uninstall Helm Charts + let parameters = &mut Vec::new() + .into_params(self.parameters.clone()) + .context(ParseParametersSnafu)?; + + // We add the DEMO parameter, so that demos can use that to render e.g. the demo label + parameters.insert("DEMO".to_owned(), uninstall_parameters.demo_name.clone()); + + Self::uninstall_helm_manifests( + &self.manifests, + parameters, + &uninstall_parameters.demo_namespace.to_owned(), + transfer_client, + ) + .await + .context(UninstallHelmManifestsSnafu)?; + + let stack_parameters = &mut Vec::new() + .into_params(stack.parameters.clone()) + .context(ParseParametersSnafu)?; + + // We add the STACK parameter, so that stacks can use that to render e.g. the stack label + stack_parameters.insert("STACK".to_owned(), self.stack.clone()); + + Self::uninstall_helm_manifests( + &stack.manifests, + stack_parameters, + &uninstall_parameters.demo_namespace.to_owned(), + transfer_client, + ) + .await + .context(UninstallHelmManifestsSnafu)?; + + // Delete demo namespace + client + .delete_object( + &uninstall_parameters.demo_namespace, + &ApiResource::from_gvk(&GroupVersionKind { + group: "".to_owned(), + version: "v1".to_owned(), + kind: "Namespace".to_owned(), + }), + None, + ) + .await + .context(DeleteObjectSnafu)?; + + // Delete remaining objects not namespace scoped + client + .delete_all_objects_with_label("stackable.tech/demo", &uninstall_parameters.demo_name, None) + .await + .context(DeleteObjectSnafu)?; + + // Delete operators and the operator namespace + if !uninstall_parameters.skip_operators { + stack + .uninstall_release(release_list, &uninstall_parameters.operator_namespace) + .await + .context(UninstallReleaseSnafu)?; + + client + .delete_object( + &uninstall_parameters.operator_namespace, + &ApiResource::from_gvk(&GroupVersionKind { + group: "".to_owned(), + version: "v1".to_owned(), + kind: "Namespace".to_owned(), + }), + None, + ) + .await + .context(DeleteObjectSnafu)?; + } + + // Delete CRDs + if !uninstall_parameters.skip_crds { + client + .delete_crds_with_group_suffix("stackable.tech") + .await + .context(DeleteObjectSnafu)?; + } + + Ok(()) + } + #[instrument(skip_all, fields( stack_name = %self.stack, - operator_namespace = %install_params.operator_namespace, - demo_namespace = %install_params.demo_namespace, + operator_namespace = %install_parameters.operator_namespace, + demo_namespace = %install_parameters.demo_namespace, indicatif.pb_show = true ))] async fn prepare_manifests( &self, - install_params: DemoInstallParameters, + install_parameters: DemoInstallParameters, client: &Client, transfer_client: &xfer::Client, ) -> Result<(), Error> { info!("Installing demo manifests"); Span::current().pb_set_message("Installing manifests"); - let params = install_params + let mut parameters = install_parameters .parameters .to_owned() .into_params(&self.parameters) .context(ParseParametersSnafu)?; + // We add the DEMO parameter, so that demos can use that to render e.g. the demo label + parameters.insert("DEMO".to_owned(), install_parameters.demo_name); + Self::install_manifests( &self.manifests, - ¶ms, - &install_params.demo_namespace, - install_params.labels, + ¶meters, + &install_parameters.demo_namespace, + install_parameters.labels, client, transfer_client, ) diff --git a/rust/stackable-cockpit/src/platform/manifests.rs b/rust/stackable-cockpit/src/platform/manifests.rs index 15fcf306..1a43d1d2 100644 --- a/rust/stackable-cockpit/src/platform/manifests.rs +++ b/rust/stackable-cockpit/src/platform/manifests.rs @@ -40,7 +40,7 @@ pub enum Error { repo_name: String, }, - /// This error indicates that the Hlm wrapper failed to install the Helm + /// This error indicates that the Helm wrapper failed to install the Helm /// release. #[snafu(display("failed to install Helm release {release_name}"))] InstallHelmRelease { @@ -48,6 +48,14 @@ pub enum Error { source: helm::Error, }, + /// This error indicates that the Helm wrapper failed to uninstall the Helm + /// release. + #[snafu(display("failed to uninstall Helm chart"))] + UninstallHelmRelease { + release_name: String, + source: helm::Error, + }, + /// This error indicates that Helm chart options could not be serialized /// into YAML. #[snafu(display("failed to serialize Helm chart options"))] @@ -86,24 +94,12 @@ pub trait InstallManifestsExt { for manifest in manifests { let parameters = parameters.clone(); - let labels = labels.clone(); match manifest { ManifestSpec::HelmChart(helm_file) => { debug!(helm_file, "Installing manifest from Helm chart"); - // Read Helm chart YAML and apply templating - let helm_file = helm_file.into_path_or_url().context(ParsePathOrUrlSnafu { - path_or_url: helm_file.clone(), - })?; - - let helm_chart: helm::Chart = transfer_client - .get( - &helm_file, - &Template::new(¶meters).then(Yaml::default()), - ) - .await - .context(FileTransferSnafu)?; + let helm_chart = get_helmchart(helm_file, transfer_client, ¶meters).await?; info!(helm_chart.name, helm_chart.version, "Installing Helm chart",); @@ -162,4 +158,65 @@ pub trait InstallManifestsExt { Ok(()) } + + #[instrument(skip_all, fields(%namespace, indicatif.pb_show = true))] + #[allow(async_fn_in_trait)] + async fn uninstall_helm_manifests( + manifests: &[ManifestSpec], + parameters: &mut HashMap, + namespace: &str, + transfer_client: &xfer::Client, + ) -> Result<(), Error> { + debug!("Uninstalling Helm manifests"); + Span::current().pb_set_message("Uninstalling Helm charts"); + + // We add the NAMESPACE parameter, so that stacks/demos can use that to render e.g. the + // fqdn service names [which contain the namespace]. + parameters.insert("NAMESPACE".to_owned(), namespace.to_owned()); + + for manifest in manifests { + match manifest { + ManifestSpec::HelmChart(helm_file) => { + debug!(helm_file, "Uninstalling manifest from Helm chart"); + + let helm_chart = get_helmchart(helm_file, transfer_client, parameters).await?; + + info!( + helm_chart.name, + helm_chart.version, "Uninstalling Helm chart", + ); + + helm::uninstall_release(&helm_chart.release_name, namespace, true).context( + UninstallHelmReleaseSnafu { + release_name: &helm_chart.release_name, + }, + )?; + } + ManifestSpec::PlainYaml(_) => {} + } + } + + Ok(()) + } +} + +pub async fn get_helmchart( + helm_file: &str, + transfer_client: &xfer::Client, + parameters: &HashMap, +) -> Result { + // Read Helm chart YAML and apply templating + let helm_file_location = helm_file.into_path_or_url().context(ParsePathOrUrlSnafu { + path_or_url: helm_file, + })?; + + let helmchart = transfer_client + .get( + &helm_file_location, + &Template::new(parameters).then(Yaml::default()), + ) + .await + .context(FileTransferSnafu)?; + + Ok(helmchart) } diff --git a/rust/stackable-cockpit/src/platform/stack/params.rs b/rust/stackable-cockpit/src/platform/stack/params.rs index 39eb12ed..b9b74d39 100644 --- a/rust/stackable-cockpit/src/platform/stack/params.rs +++ b/rust/stackable-cockpit/src/platform/stack/params.rs @@ -4,7 +4,6 @@ use crate::platform::operator::ChartSourceType; #[derive(Debug)] pub struct StackInstallParameters { - pub demo_name: Option, pub stack_name: String, pub operator_namespace: String, @@ -15,3 +14,13 @@ pub struct StackInstallParameters { pub labels: Labels, pub chart_source: ChartSourceType, } + +pub struct StackUninstallParameters { + pub stack_name: String, + + pub operator_namespace: String, + pub stack_namespace: String, + + pub skip_operators: bool, + pub skip_crds: bool +} diff --git a/rust/stackable-cockpit/src/platform/stack/spec.rs b/rust/stackable-cockpit/src/platform/stack/spec.rs index c5fd2939..4a8b4199 100644 --- a/rust/stackable-cockpit/src/platform/stack/spec.rs +++ b/rust/stackable-cockpit/src/platform/stack/spec.rs @@ -1,3 +1,4 @@ +use kube::api::{ApiResource, GroupVersionKind}; use serde::{Deserialize, Serialize}; use snafu::{OptionExt, ResultExt, Snafu}; use tracing::{Span, debug, info, instrument, log::warn}; @@ -13,10 +14,10 @@ use crate::{ namespace, operator::ChartSourceType, release, - stack::StackInstallParameters, + stack::{StackInstallParameters, StackUninstallParameters}, }, utils::{ - k8s::Client, + k8s::{self, Client}, params::{ IntoParameters, IntoParametersError, Parameter, RawParameter, RawParameterParseError, }, @@ -44,6 +45,10 @@ pub enum Error { #[snafu(display("failed to install release"))] InstallRelease { source: release::Error }, + /// This error indicates that the release failed to uninstall. + #[snafu(display("failed to uninstall release"))] + UninstallRelease { source: release::Error }, + #[snafu(display("stack resource requests error"), context(false))] StackResourceRequests { source: ResourceRequestsError }, @@ -63,6 +68,12 @@ pub enum Error { #[snafu(display("failed to install stack manifests"))] InstallManifests { source: manifests::Error }, + + #[snafu(display("failed to uninstall Helm manifests"))] + UninstallHelmManifests { source: manifests::Error }, + + #[snafu(display("failed to delete object"))] + DeleteObject { source: k8s::Error }, } /// This struct describes a stack with the v2 spec @@ -70,7 +81,7 @@ pub enum Error { #[serde(rename_all = "camelCase")] #[cfg_attr(feature = "openapi", derive(ToSchema))] pub struct StackSpec { - /// A short description of the demo + /// A short description of the stack pub description: String, /// The release used by the stack, e.g. 23.4 @@ -149,10 +160,7 @@ impl StackSpec { // TODO (Techassi): Can we get rid of the release list and just use the release spec instead #[instrument(skip_all, fields( stack_name = %install_parameters.stack_name, - // NOTE (@NickLarsenNZ): Option doesn't impl Display, so we need to call - // display for the inner type if it exists. Otherwise we gte the Debug - // impl for the whole Option. - demo_name = install_parameters.demo_name.as_ref().map(tracing::field::display), + stack_namespace = %install_parameters.stack_namespace, ))] pub async fn install( &self, @@ -176,7 +184,6 @@ impl StackSpec { self.install_release( release_list, &install_parameters.operator_namespace, - &install_parameters.stack_namespace, &install_parameters.chart_source, ) .await?; @@ -195,12 +202,90 @@ impl StackSpec { .await } + #[instrument(skip_all, fields( + stack_name = %uninstall_parameters.stack_name, + stack_namespace = %uninstall_parameters.stack_namespace, + ))] + pub async fn uninstall( + &self, + release_list: release::ReleaseList, + uninstall_parameters: StackUninstallParameters, + client: &Client, + transfer_client: &xfer::Client, + ) -> Result<(), Error> { + // Uninstall Helm Charts + let parameters = &mut Vec::new() + .into_params(self.parameters.clone()) + .context(ParseParametersSnafu)?; + + // We add the STACK parameter, so that stacks can use that to render e.g. the stack label + parameters.insert("STACK".to_owned(), uninstall_parameters.stack_name.clone()); + + Self::uninstall_helm_manifests( + &self.manifests, + parameters, + &uninstall_parameters.stack_namespace.to_owned(), + transfer_client, + ) + .await + .context(UninstallHelmManifestsSnafu)?; + + // Delete stack namespace + client + .delete_object( + &uninstall_parameters.stack_namespace, + &ApiResource::from_gvk(&GroupVersionKind { + group: "".to_owned(), + version: "v1".to_owned(), + kind: "Namespace".to_owned(), + }), + None, + ) + .await + .context(DeleteObjectSnafu)?; + + // Delete remaining objects not namespace scoped + client + .delete_all_objects_with_label("stackable.tech/stack", &uninstall_parameters.stack_name, None) + .await + .context(DeleteObjectSnafu)?; + + // Delete operators and the operator namespace + if !uninstall_parameters.skip_operators { + self + .uninstall_release(release_list, &uninstall_parameters.operator_namespace) + .await?; + + client + .delete_object( + &uninstall_parameters.operator_namespace, + &ApiResource::from_gvk(&GroupVersionKind { + group: "".to_owned(), + version: "v1".to_owned(), + kind: "Namespace".to_owned(), + }), + None, + ) + .await + .context(DeleteObjectSnafu)?; + } + + // Delete CRDs + if !uninstall_parameters.skip_crds { + client + .delete_crds_with_group_suffix("stackable.tech") + .await + .context(DeleteObjectSnafu)?; + } + + Ok(()) + } + #[instrument(skip_all, fields(release = %self.release, %operator_namespace, indicatif.pb_show = true))] pub async fn install_release( &self, release_list: release::ReleaseList, operator_namespace: &str, - _namespace: &str, // TODO (@NickLarsenNZ): remove this field chart_source: &ChartSourceType, ) -> Result<(), Error> { info!(self.release, "Trying to install release"); @@ -220,27 +305,52 @@ impl StackSpec { .context(InstallReleaseSnafu) } + #[instrument(skip_all, fields(release = %self.release, %operator_namespace, indicatif.pb_show = true))] + pub async fn uninstall_release( + &self, + release_list: release::ReleaseList, + operator_namespace: &str, + ) -> Result<(), Error> { + info!(self.release, "Trying to uninstall release"); + Span::current().pb_set_message("Uninstalling operators"); + + // Get the release by name + let release = release_list + .get(&self.release) + .context(NoSuchReleaseSnafu { + name: self.release.clone(), + })?; + + // Uninstall the release + release + .uninstall(&self.operators, &[], operator_namespace) + .context(UninstallReleaseSnafu) + } + #[instrument(skip_all, fields(indicatif.pb_show = true))] pub async fn prepare_manifests( &self, - install_params: StackInstallParameters, + install_parameters: StackInstallParameters, client: &Client, transfer_client: &xfer::Client, ) -> Result<(), Error> { info!("Installing stack manifests"); Span::current().pb_set_message("Installing manifests"); - let parameters = install_params + let mut parameters = install_parameters .parameters .to_owned() .into_params(&self.parameters) .context(ParseParametersSnafu)?; + // We add the STACK parameter, so that stacks can use that to render e.g. the stack label + parameters.insert("STACK".to_owned(), install_parameters.stack_name); + Self::install_manifests( &self.manifests, ¶meters, - &install_params.stack_namespace, - install_params.labels, + &install_parameters.stack_namespace, + install_parameters.labels, client, transfer_client, ) diff --git a/rust/stackable-cockpit/src/utils/k8s/client.rs b/rust/stackable-cockpit/src/utils/k8s/client.rs index d7b5ccee..1f7ada20 100644 --- a/rust/stackable-cockpit/src/utils/k8s/client.rs +++ b/rust/stackable-cockpit/src/utils/k8s/client.rs @@ -1,19 +1,26 @@ use std::{collections::BTreeMap, string::FromUtf8Error}; -use k8s_openapi::api::{ - apps::v1::{Deployment, StatefulSet}, - core::v1::{Endpoints, Namespace, Node, Secret, Service}, +use k8s_openapi::{ + api::{ + apps::v1::{Deployment, StatefulSet}, + core::v1::{Endpoints, Namespace, Node, Secret, Service}, + }, + apiextensions_apiserver::pkg::apis::apiextensions::v1::CustomResourceDefinition, }; use kube::{ Api, Discovery, ResourceExt, - api::{ListParams, Patch, PatchParams, PostParams}, + api::{DeleteParams, ListParams, Patch, PatchParams, PostParams}, core::{DynamicObject, GroupVersionKind, ObjectList, ObjectMeta, TypeMeta}, - discovery::{ApiCapabilities, ApiResource, Scope}, + discovery::{self, ApiCapabilities, ApiResource, Scope}, }; +use reqwest::StatusCode; use serde::Deserialize; use snafu::{OptionExt, ResultExt, Snafu}; use stackable_operator::{commons::listener::Listener, kvp::Labels}; -use tokio::sync::RwLock; +use tokio::{ + sync::RwLock, + time::{self, sleep}, +}; use tracing::{Span, info, instrument}; use tracing_indicatif::{indicatif_eprintln, span_ext::IndicatifSpanExt as _}; @@ -44,6 +51,9 @@ pub enum Error { gvk: GroupVersionKind, }, + #[snafu(display("failed to delete object"))] + KubeClientDelete { source: kube::error::Error }, + #[snafu(display("failed to deserialize YAML data"))] DeserializeYaml { source: serde_yaml::Error }, @@ -234,6 +244,28 @@ impl Client { Ok(()) } + /// Deletes CRDs for the given group suffix + pub async fn delete_crds_with_group_suffix(&self, group_suffix: &str) -> Result<()> { + let api_client = Api::::all(self.client.clone()); + + for crd in api_client + .list(&ListParams::default()) + .await + .context(KubeClientFetchSnafu)? + { + if crd.spec.group.ends_with(group_suffix) { + if let Some(name) = crd.metadata.name { + api_client + .delete(&name, &DeleteParams::default()) + .await + .context(KubeClientDeleteSnafu)?; + } + } + } + + Ok(()) + } + /// Lists objects by looking up a GVK via the discovery. It returns an /// optional list of dynamic objects. The method returns [`Ok(None)`] /// if the client was unable to resolve the GVK. An error is returned @@ -284,6 +316,116 @@ impl Client { )) } + /// Deletes all objects with a given label in the provided namespace. + /// If no namespace is provided, deletes all clusterwide objects with the given label. + pub async fn delete_all_objects_with_label( + &self, + label_key: &str, + label_value: &str, + namespace: Option<&str>, + ) -> Result<(), Error> { + let api_resources = self + .get_api_resources() + .await + .into_iter() + .filter(|(_, capability)| { + capability.supports_operation(discovery::verbs::LIST) + && match namespace { + Some(_) => capability.scope == kube::discovery::Scope::Namespaced, + None => capability.scope == kube::discovery::Scope::Cluster, + } + }); + + for (api_resource, _) in api_resources { + let objects = self + .list_objects( + &GroupVersionKind { + group: api_resource.group.clone(), + version: api_resource.version.clone(), + kind: api_resource.kind.clone(), + }, + namespace, + ) + .await?; + + if let Some(objectlist) = objects { + for object in objectlist { + if let Some(value) = object.labels().get(label_key) { + if value.eq(label_value) { + self.delete_object( + &object.metadata.name.unwrap(), + &api_resource, + object.metadata.namespace.as_deref(), + ) + .await?; + } + } + } + } + } + + Ok(()) + } + + #[instrument(skip_all, fields(indicatif.pb_show = true))] + pub async fn delete_object( + &self, + object_name: &str, + api_resource: &ApiResource, + namespace: Option<&str>, + ) -> Result<(), Error> { + let object_api = match namespace { + Some(namespace) => { + Api::::namespaced_with(self.client.clone(), namespace, api_resource) + } + None => Api::::all_with(self.client.clone(), api_resource), + }; + + let mut delete_request = object_api + .delete(object_name, &DeleteParams::foreground()) + .await; + + // Wait for object to be deleted + // Otherwise might result in race condition scenarios + while let Ok(delete_status) = delete_request { + match delete_status { + // Left side of Either, when deletion is in progress + either::Either::Left(_) => { + Span::current() + .pb_set_message(&format!("Deleting {} {}", api_resource.kind, object_name)); + // Short sleep to reduce number of requests + sleep(time::Duration::from_millis(600)).await; + // Resend request to get deletion status + delete_request = object_api + .delete(object_name, &DeleteParams::foreground()) + .await; + } + // Right side of Either, when deletion is done + either::Either::Right(_) => { + return Ok(()); + } + } + } + + if let Err(error) = delete_request { + match error { + kube::Error::Api(ref error_response) => { + // If object is already deleted/gone, delete operation is done + if error_response.code == StatusCode::NOT_FOUND.as_u16() { + return Ok(()); + } else { + return Err(error).context(KubeClientDeleteSnafu); + } + } + _ => { + return Err(error).context(KubeClientDeleteSnafu); + } + } + } + + Ok(()) + } + /// Lists [`Service`]s by matching labels. The Services can be matched by /// the product labels. [`ListParamsExt`] provides a utility function to /// create [`ListParams`] based on a product name and optional instance @@ -479,6 +621,16 @@ impl Client { endpoints_api.get(name).await.context(KubeClientFetchSnafu) } + pub async fn get_api_resources(&self) -> Vec<(ApiResource, ApiCapabilities)> { + let mut api_resources = Vec::new(); + + for group in self.discovery.read().await.groups() { + api_resources.append(group.recommended_resources().as_mut()); + } + + api_resources + } + /// Try to resolve the given [`GroupVersionKind`]. In case the resolution fails a discovery is run to pull in new /// GVKs that are not present in the [`Discovery`] cache. Afterwards a normal resolution is issued. async fn resolve_gvk( diff --git a/rust/stackablectl/Cargo.toml b/rust/stackablectl/Cargo.toml index fe216fa0..780e9e79 100644 --- a/rust/stackablectl/Cargo.toml +++ b/rust/stackablectl/Cargo.toml @@ -17,6 +17,7 @@ clap_complete.workspace = true clap_complete_nushell.workspace = true clap.workspace = true comfy-table.workspace = true +dialoguer.workspace = true directories.workspace = true dotenvy.workspace = true indexmap.workspace = true diff --git a/rust/stackablectl/src/cmds/demo.rs b/rust/stackablectl/src/cmds/demo.rs index 513a33f9..612de14c 100644 --- a/rust/stackablectl/src/cmds/demo.rs +++ b/rust/stackablectl/src/cmds/demo.rs @@ -5,12 +5,13 @@ use comfy_table::{ ContentArrangement, Row, Table, presets::{NOTHING, UTF8_FULL}, }; +use dialoguer::Confirm; use snafu::{OptionExt as _, ResultExt, Snafu, ensure}; use stackable_cockpit::{ common::list, constants::{DEFAULT_NAMESPACE, DEFAULT_OPERATOR_NAMESPACE}, platform::{ - demo::{self, DemoInstallParameters}, + demo::{self, DemoInstallParameters, DemoUninstallParameters}, operator::ChartSourceType, release, stack, }, @@ -20,9 +21,11 @@ use stackable_cockpit::{ }, xfer, }; -use stackable_operator::kvp::{LabelError, Labels}; +use stackable_operator::{ + kvp::{LabelError, Labels}, +}; use tracing::{Span, debug, info, instrument}; -use tracing_indicatif::span_ext::IndicatifSpanExt as _; +use tracing_indicatif::{self, span_ext::IndicatifSpanExt as _}; use crate::{ args::{CommonClusterArgs, CommonClusterArgsError, CommonNamespaceArgs}, @@ -52,6 +55,11 @@ pub enum DemoCommands { /// Install a specific demo #[command(aliases(["i", "in"]))] Install(DemoInstallArgs), + + /// Uninstall a specific stack. Caution: This will delete the provided stack namespace, + /// the operators and provided operator namespace, and all Stackable CRDs + #[command(aliases(["u", "un"]))] + Uninstall(DemoUninstallArgs), } #[derive(Debug, Args)] @@ -117,7 +125,17 @@ to specify operator versions." } #[derive(Debug, Args)] -pub struct DemoUninstallArgs {} +pub struct DemoUninstallArgs { + /// Demo to uninstall + demo_name: String, + + #[command(flatten)] + namespaces: CommonNamespaceArgs, + + /// Skip uninstalling Stackable operators and CRDs + #[arg(long)] + skip_operators_and_crds: bool, +} #[derive(Debug, Snafu)] pub enum CmdError { @@ -154,6 +172,15 @@ pub enum CmdError { demo_name: String, }, + #[snafu(display("failed to confirm user input"))] + ConfirmDialog { source: dialoguer::Error }, + + #[snafu(display("failed to uninstall demo {demo_name:?}"))] + UninstallDemo { + source: demo::Error, + demo_name: String, + }, + #[snafu(display("failed to build labels for demo resources"))] BuildLabels { source: LabelError }, @@ -210,6 +237,9 @@ impl DemoArgs { DemoCommands::Install(args) => { install_cmd(args, cli, list, &transfer_client, &release_branch).await } + DemoCommands::Uninstall(args) => { + uninstall_cmd(args, cli, list, &transfer_client, &release_branch).await + } } } } @@ -334,7 +364,7 @@ async fn install_cmd( release_branch: &str, ) -> Result { info!(demo_name = %args.demo_name, "Installing demo"); - Span::current().pb_set_message("Installing demo"); + Span::current().pb_set_message(&format!("Installing demo {}", args.demo_name)); // Init result output and progress output let mut output = Cli::result(); @@ -378,9 +408,37 @@ async fn install_cmd( .parse_insert(("stackable.tech/stack", &demo.stack)) .context(BuildLabelsSnafu)?; + // `stackablectl demo uninstall` relies on namespace deletion, suggest installing in a non-default namespace + // It should still be possible to skip that if either uninstall is not needed + // or installing an older version of the demo which only supports the 'default' namespace + let demo_namespace = tracing_indicatif::suspend_tracing_indicatif( + || -> Result { + if args.namespaces.namespace == DEFAULT_NAMESPACE { + if Confirm::new() + .with_prompt( + format!( + "Demos installed in the '{DEFAULT_NAMESPACE}' namespace cannot be deleted with stackablectl. Install the demo in the '{demo_namespace}' namespace instead?", + demo_namespace = args.demo_name.clone()) + ) + .default(true) + .interact() + .context(ConfirmDialogSnafu)? { + // User selected to install in suggested namespace + Ok(args.demo_name.clone()) + } else { + // User selected to install in default namespace + Ok(args.namespaces.namespace.clone()) + } + } else { + Ok(args.namespaces.namespace.clone()) + } + }, + )?; + let install_parameters = DemoInstallParameters { + demo_name: args.demo_name.clone(), operator_namespace: args.namespaces.operator_namespace.clone(), - demo_namespace: args.namespaces.namespace.clone(), + demo_namespace: demo_namespace.clone(), stack_parameters: args.stack_parameters.clone(), parameters: args.parameters.clone(), skip_release: args.skip_release, @@ -415,11 +473,8 @@ async fn install_cmd( let stacklet_cmd = format!( "stackablectl stacklet list{option}", - option = if args.namespaces.namespace != DEFAULT_NAMESPACE { - format!( - " --namespace {namespace}", - namespace = args.namespaces.namespace - ) + option = if demo_namespace != DEFAULT_NAMESPACE { + format!(" --namespace {namespace}", namespace = demo_namespace) } else { "".into() } @@ -435,3 +490,70 @@ async fn install_cmd( Ok(output.render()) } + +#[instrument(skip_all, fields( + demo_name = %args.demo_name, + %release_branch, + indicatif.pb_show = true +))] +async fn uninstall_cmd( + args: &DemoUninstallArgs, + cli: &Cli, + list: demo::List, + transfer_client: &xfer::Client, + release_branch: &str, +) -> Result { + info!(demo_name = %args.demo_name, "Uninstalling demo"); + Span::current().pb_set_message(&format!("Uninstalling demo {}", args.demo_name)); + + // Init result output and progress output + let mut output = Cli::result(); + + let demo = list.get(&args.demo_name).ok_or(CmdError::NoSuchDemo { + name: args.demo_name.clone(), + })?; + + let stack_files = cli + .get_stack_files(release_branch) + .context(PathOrUrlParseSnafu)?; + let stack_list = stack::StackList::build(&stack_files, transfer_client) + .await + .context(BuildListSnafu)?; + + // Get the stack spec based on the name defined in the demo spec + let stack = stack_list.get(&demo.stack).context(NoSuchStackSnafu { + name: demo.stack.clone(), + })?; + + let client = Client::new().await.context(KubeClientCreateSnafu)?; + + let release_files = cli.get_release_files().context(PathOrUrlParseSnafu)?; + let release_list = release::ReleaseList::build(&release_files, transfer_client) + .await + .context(BuildListSnafu)?; + + demo.uninstall( + release_list, + DemoUninstallParameters { + demo_name: args.demo_name.clone(), + operator_namespace: args.namespaces.operator_namespace.clone(), + demo_namespace: args.namespaces.namespace.clone(), + skip_operators: args.skip_operators_and_crds.clone(), + skip_crds: args.skip_operators_and_crds.clone(), + }, + &client, + transfer_client, + stack.to_owned(), + ) + .await + .context(UninstallDemoSnafu { + demo_name: args.demo_name.clone(), + })?; + + output.with_output(format!( + "Uninstalled demo {demo_name:?}", + demo_name = args.demo_name + )); + + Ok(output.render()) +} diff --git a/rust/stackablectl/src/cmds/stack.rs b/rust/stackablectl/src/cmds/stack.rs index 3912f713..22137ad9 100644 --- a/rust/stackablectl/src/cmds/stack.rs +++ b/rust/stackablectl/src/cmds/stack.rs @@ -5,6 +5,7 @@ use comfy_table::{ ContentArrangement, Table, presets::{NOTHING, UTF8_FULL}, }; +use dialoguer::Confirm; use snafu::{OptionExt as _, ResultExt, Snafu, ensure}; use stackable_cockpit::{ common::list, @@ -12,7 +13,7 @@ use stackable_cockpit::{ platform::{ operator::ChartSourceType, release, - stack::{self, StackInstallParameters}, + stack::{self, StackInstallParameters, StackUninstallParameters}, }, utils::{ k8s::{self, Client}, @@ -20,7 +21,9 @@ use stackable_cockpit::{ }, xfer, }; -use stackable_operator::kvp::{LabelError, Labels}; +use stackable_operator::{ + kvp::{LabelError, Labels}, +}; use tracing::{Span, debug, info, instrument}; use tracing_indicatif::span_ext::IndicatifSpanExt as _; @@ -52,6 +55,11 @@ pub enum StackCommands { /// Install a specific stack #[command(aliases(["i", "in"]))] Install(StackInstallArgs), + + /// Uninstall a specific stack. Caution: This will delete the provided stack namespace, + /// the operators and provided operator namespace, and all Stackable CRDs + #[command(aliases(["u", "un"]))] + Uninstall(StackUninstallArgs), } #[derive(Debug, Args)] @@ -71,7 +79,7 @@ pub struct StackDescribeArgs { #[derive(Debug, Args)] pub struct StackInstallArgs { - /// Name of the stack to describe + /// Name of the stack to install stack_name: String, /// Skip the installation of the release during the stack install process @@ -112,6 +120,19 @@ Use \"stackablectl stack describe \" to list available parameters for eac namespaces: CommonNamespaceArgs, } +#[derive(Debug, Args)] +pub struct StackUninstallArgs { + /// Name of the stack to uninstall + stack_name: String, + + #[command(flatten)] + namespaces: CommonNamespaceArgs, + + /// Skip uninstalling Stackable operators and CRDs + #[arg(long)] + skip_operators_and_crds: bool, +} + #[derive(Debug, Snafu)] pub enum CmdError { #[snafu(display("path/url parse error"))] @@ -142,6 +163,16 @@ pub enum CmdError { stack_name: String, }, + #[snafu(display("failed to confirm user input"))] + ConfirmDialog { source: dialoguer::Error }, + + #[snafu(display("failed to uninstall stack {stack_name:?}"))] + UninstallStack { + #[snafu(source(from(stack::Error, Box::new)))] + source: Box, + stack_name: String, + }, + #[snafu(display("failed to build labels for stack resources"))] BuildLabels { source: LabelError }, @@ -197,6 +228,9 @@ impl StackArgs { StackCommands::Install(args) => { install_cmd(args, cli, stack_list, &transfer_client).await } + StackCommands::Uninstall(args) => { + uninstall_cmd(args, cli, stack_list, &transfer_client).await + } } } } @@ -321,7 +355,7 @@ async fn install_cmd( transfer_client: &xfer::Client, ) -> Result { info!(stack_name = %args.stack_name, "Installing stack"); - Span::current().pb_set_message("Installing stack"); + Span::current().pb_set_message(&format!("Installing stack {}", args.stack_name)); let files = cli.get_release_files().context(PathOrUrlParseSnafu)?; let release_list = release::ReleaseList::build(&files, transfer_client) @@ -349,13 +383,39 @@ async fn install_cmd( ]) .context(BuildLabelsSnafu)?; + // `stackablectl stack uninstall` relies on namespace deletion, suggest installing in a non-default namespace + // It should still be possible to skip that if either uninstall is not needed + // or installing an older version of the stack which only supports the 'default' namespace + let stack_namespace = tracing_indicatif::suspend_tracing_indicatif( + || -> Result { + if args.namespaces.namespace == DEFAULT_NAMESPACE { + if Confirm::new() + .with_prompt( + format!( + "Stacks installed in the '{DEFAULT_NAMESPACE}' namespace cannot be deleted with stackablectl. Install the stack in the '{stack_namespace}' namespace instead?", + stack_namespace = args.stack_name.clone()) + ) + .default(true) + .interact() + .context(ConfirmDialogSnafu)? { + // User selected to install in suggested namespace + Ok(args.stack_name.clone()) + } else { + // User selected to install in default namespace + Ok(args.namespaces.namespace.clone()) + } + } else { + Ok(args.namespaces.namespace.clone()) + } + }, + )?; + let install_parameters = StackInstallParameters { operator_namespace: args.namespaces.operator_namespace.clone(), - stack_namespace: args.namespaces.namespace.clone(), - stack_name: args.stack_name.clone(), + stack_namespace: stack_namespace.clone(), + stack_name: stack_namespace.clone(), parameters: args.parameters.clone(), skip_release: args.skip_release, - demo_name: None, labels, chart_source: ChartSourceType::from(cli.chart_type()), }; @@ -381,11 +441,8 @@ async fn install_cmd( let stacklet_cmd = format!( "stackablectl stacklet list{option}", - option = if args.namespaces.namespace != DEFAULT_NAMESPACE { - format!( - " --namespace {namespace}", - namespace = args.namespaces.namespace - ) + option = if stack_namespace != DEFAULT_NAMESPACE { + format!(" --namespace {namespace}", namespace = stack_namespace) } else { "".into() } @@ -404,3 +461,52 @@ async fn install_cmd( None => Ok("No such stack".into()), } } + +#[instrument(skip(cli, stack_list, transfer_client), fields(indicatif.pb_show = true))] +async fn uninstall_cmd( + args: &StackUninstallArgs, + cli: &Cli, + stack_list: stack::StackList, + transfer_client: &xfer::Client, +) -> Result { + info!(stack_name = %args.stack_name, "Uninstalling stack"); + Span::current().pb_set_message(&format!("Uninstalling stack {}", args.stack_name)); + + match stack_list.get(&args.stack_name) { + Some(stack) => { + let mut output = Cli::result(); + let client = Client::new().await.context(KubeClientCreateSnafu)?; + + let files = cli.get_release_files().context(PathOrUrlParseSnafu)?; + let release_list = release::ReleaseList::build(&files, transfer_client) + .await + .context(BuildListSnafu)?; + + stack + .uninstall( + release_list, + StackUninstallParameters { + stack_name: args.stack_name.clone(), + operator_namespace: args.namespaces.operator_namespace.clone(), + stack_namespace: args.namespaces.namespace.clone(), + skip_operators: args.skip_operators_and_crds.clone(), + skip_crds: args.skip_operators_and_crds.clone(), + }, + &client, + transfer_client, + ) + .await + .context(UninstallStackSnafu { + stack_name: args.stack_name.clone(), + })?; + + output.with_output(format!( + "Uninstalled stack {stack_name:?}", + stack_name = args.stack_name + )); + + Ok(output.render()) + } + None => Ok("No such stack".into()), + } +} From 5b366b4fb82d7884d0af5ebd18d9d8ee3e6533af Mon Sep 17 00:00:00 2001 From: xeniape Date: Thu, 12 Mar 2026 15:07:23 +0100 Subject: [PATCH 02/30] changelog, some fixes after merge, cargo clippy --- Cargo.lock | 2 +- .../src/platform/demo/params.rs | 2 +- .../src/platform/demo/spec.rs | 8 ++++++-- .../src/platform/stack/params.rs | 2 +- .../src/platform/stack/spec.rs | 11 +++++++---- .../stackable-cockpit/src/utils/k8s/client.rs | 19 +++++++++++-------- rust/stackablectl/CHANGELOG.md | 5 +++++ rust/stackablectl/src/cmds/demo.rs | 8 +++----- rust/stackablectl/src/cmds/stack.rs | 8 +++----- 9 files changed, 38 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ccbb806a..d7e66122 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3861,7 +3861,7 @@ dependencies = [ "fastrand", "getrandom 0.3.4", "once_cell", - "rustix 1.1.2", + "rustix", "windows-sys 0.61.2", ] diff --git a/rust/stackable-cockpit/src/platform/demo/params.rs b/rust/stackable-cockpit/src/platform/demo/params.rs index 051b03c0..33958bdd 100644 --- a/rust/stackable-cockpit/src/platform/demo/params.rs +++ b/rust/stackable-cockpit/src/platform/demo/params.rs @@ -26,5 +26,5 @@ pub struct DemoUninstallParameters { pub demo_namespace: String, pub skip_operators: bool, - pub skip_crds: bool + pub skip_crds: bool, } diff --git a/rust/stackable-cockpit/src/platform/demo/spec.rs b/rust/stackable-cockpit/src/platform/demo/spec.rs index 842c5166..69f86af6 100644 --- a/rust/stackable-cockpit/src/platform/demo/spec.rs +++ b/rust/stackable-cockpit/src/platform/demo/spec.rs @@ -1,6 +1,6 @@ -use kube::api::{ApiResource, GroupVersionKind}; use serde::{Deserialize, Serialize}; use snafu::{OptionExt, ResultExt, Snafu}; +use stackable_operator::kube::api::{ApiResource, GroupVersionKind}; use tracing::{Span, debug, info, instrument, warn}; use tracing_indicatif::span_ext::IndicatifSpanExt as _; #[cfg(feature = "openapi")] @@ -251,7 +251,11 @@ impl DemoSpec { // Delete remaining objects not namespace scoped client - .delete_all_objects_with_label("stackable.tech/demo", &uninstall_parameters.demo_name, None) + .delete_all_objects_with_label( + "stackable.tech/demo", + &uninstall_parameters.demo_name, + None, + ) .await .context(DeleteObjectSnafu)?; diff --git a/rust/stackable-cockpit/src/platform/stack/params.rs b/rust/stackable-cockpit/src/platform/stack/params.rs index 3ae01e2d..500b9c72 100644 --- a/rust/stackable-cockpit/src/platform/stack/params.rs +++ b/rust/stackable-cockpit/src/platform/stack/params.rs @@ -24,5 +24,5 @@ pub struct StackUninstallParameters { pub stack_namespace: String, pub skip_operators: bool, - pub skip_crds: bool + pub skip_crds: bool, } diff --git a/rust/stackable-cockpit/src/platform/stack/spec.rs b/rust/stackable-cockpit/src/platform/stack/spec.rs index 35fbd893..b3260323 100644 --- a/rust/stackable-cockpit/src/platform/stack/spec.rs +++ b/rust/stackable-cockpit/src/platform/stack/spec.rs @@ -1,7 +1,7 @@ -use kube::api::{ApiResource, GroupVersionKind}; use serde::{Deserialize, Serialize}; use serde_yaml::Mapping; use snafu::{OptionExt, ResultExt, Snafu}; +use stackable_operator::kube::api::{ApiResource, GroupVersionKind}; use tracing::{Span, debug, info, instrument, log::warn}; use tracing_indicatif::span_ext::IndicatifSpanExt as _; #[cfg(feature = "openapi")] @@ -248,14 +248,17 @@ impl StackSpec { // Delete remaining objects not namespace scoped client - .delete_all_objects_with_label("stackable.tech/stack", &uninstall_parameters.stack_name, None) + .delete_all_objects_with_label( + "stackable.tech/stack", + &uninstall_parameters.stack_name, + None, + ) .await .context(DeleteObjectSnafu)?; // Delete operators and the operator namespace if !uninstall_parameters.skip_operators { - self - .uninstall_release(release_list, &uninstall_parameters.operator_namespace) + self.uninstall_release(release_list, &uninstall_parameters.operator_namespace) .await?; client diff --git a/rust/stackable-cockpit/src/utils/k8s/client.rs b/rust/stackable-cockpit/src/utils/k8s/client.rs index 2b5fe857..330f293b 100644 --- a/rust/stackable-cockpit/src/utils/k8s/client.rs +++ b/rust/stackable-cockpit/src/utils/k8s/client.rs @@ -3,24 +3,27 @@ use std::{collections::BTreeMap, string::FromUtf8Error}; use reqwest::StatusCode; use serde::Deserialize; use snafu::{OptionExt, ResultExt, Snafu}; -use tokio::{ - sync::RwLock, - time::{self, sleep}, -}; use stackable_operator::{ crd::listener::v1alpha1::Listener, - k8s_openapi::api::{ - apps::v1::{Deployment, StatefulSet}, - core::v1::{Endpoints, Namespace, Node, Secret, Service}, + k8s_openapi::{ + api::{ + apps::v1::{Deployment, StatefulSet}, + core::v1::{Endpoints, Namespace, Node, Secret, Service}, + }, + apiextensions_apiserver::pkg::apis::apiextensions::v1::CustomResourceDefinition, }, kube::{ self, Api, Discovery, ResourceExt, api::{DeleteParams, ListParams, Patch, PatchParams, PostParams}, core::{DynamicObject, GroupVersionKind, ObjectList, ObjectMeta, TypeMeta}, - discovery::{ApiCapabilities, ApiResource, Scope}, + discovery::{self, ApiCapabilities, ApiResource, Scope}, }, kvp::Labels, }; +use tokio::{ + sync::RwLock, + time::{self, sleep}, +}; use tracing::{Span, info, instrument}; use tracing_indicatif::{indicatif_eprintln, span_ext::IndicatifSpanExt as _}; diff --git a/rust/stackablectl/CHANGELOG.md b/rust/stackablectl/CHANGELOG.md index 989981b9..6f76d624 100644 --- a/rust/stackablectl/CHANGELOG.md +++ b/rust/stackablectl/CHANGELOG.md @@ -4,12 +4,17 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added + +- Add `uninstall` subcommand for `demo`/`stack` commands ([#429]). + ### Changed - Bump Rust to `1.93.0` as well as dependencies ([#426]). - Bump Go to `1.26.0` as well as dependencies ([#426]). [#426]: https://github.com/stackabletech/stackable-cockpit/pull/426 +[#429]: https://github.com/stackabletech/stackable-cockpit/pull/429 ## [1.2.2] - 2025-12-03 diff --git a/rust/stackablectl/src/cmds/demo.rs b/rust/stackablectl/src/cmds/demo.rs index d8c35760..b05d059d 100644 --- a/rust/stackablectl/src/cmds/demo.rs +++ b/rust/stackablectl/src/cmds/demo.rs @@ -21,9 +21,7 @@ use stackable_cockpit::{ }, xfer, }; -use stackable_operator::{ - kvp::{LabelError, Labels}, -}; +use stackable_operator::kvp::{LabelError, Labels}; use tracing::{Span, debug, info, instrument}; use tracing_indicatif::{self, span_ext::IndicatifSpanExt as _}; @@ -548,8 +546,8 @@ async fn uninstall_cmd( demo_name: args.demo_name.clone(), operator_namespace: args.namespaces.operator_namespace.clone(), demo_namespace: args.namespaces.namespace.clone(), - skip_operators: args.skip_operators_and_crds.clone(), - skip_crds: args.skip_operators_and_crds.clone(), + skip_operators: args.skip_operators_and_crds, + skip_crds: args.skip_operators_and_crds, }, &client, transfer_client, diff --git a/rust/stackablectl/src/cmds/stack.rs b/rust/stackablectl/src/cmds/stack.rs index 0aca57b3..0c371bf0 100644 --- a/rust/stackablectl/src/cmds/stack.rs +++ b/rust/stackablectl/src/cmds/stack.rs @@ -21,9 +21,7 @@ use stackable_cockpit::{ }, xfer, }; -use stackable_operator::{ - kvp::{LabelError, Labels}, -}; +use stackable_operator::kvp::{LabelError, Labels}; use tracing::{Span, debug, info, instrument}; use tracing_indicatif::span_ext::IndicatifSpanExt as _; @@ -499,8 +497,8 @@ async fn uninstall_cmd( stack_name: args.stack_name.clone(), operator_namespace: args.namespaces.operator_namespace.clone(), stack_namespace: args.namespaces.namespace.clone(), - skip_operators: args.skip_operators_and_crds.clone(), - skip_crds: args.skip_operators_and_crds.clone(), + skip_operators: args.skip_operators_and_crds, + skip_crds: args.skip_operators_and_crds, }, &client, transfer_client, From d6dc693e1ab337b94af5ffdd0804c26d1581f947 Mon Sep 17 00:00:00 2001 From: xeniape Date: Thu, 12 Mar 2026 15:33:38 +0100 Subject: [PATCH 03/30] pre-commit fixes --- extra/completions/_stackablectl | 120 +++++++- extra/completions/stackablectl.bash | 458 +++++++++++++++++++++++++++- extra/completions/stackablectl.elv | 72 +++++ extra/completions/stackablectl.fish | 130 +++++--- extra/completions/stackablectl.nu | 82 ++++- 5 files changed, 812 insertions(+), 50 deletions(-) diff --git a/extra/completions/_stackablectl b/extra/completions/_stackablectl index abba1406..e60dcaae 100644 --- a/extra/completions/_stackablectl +++ b/extra/completions/_stackablectl @@ -672,7 +672,40 @@ repo\:"index.yaml-based repositories\: resolution (dev, test, stable) is based o '--help[Print help (see more with '\''--help'\'')]' \ '-V[Print version]' \ '--version[Print version]' \ -':stack_name -- Name of the stack to describe:_default' \ +':stack_name -- Name of the stack to install:_default' \ +&& ret=0 +;; +(uninstall) +_arguments "${_arguments_options[@]}" : \ +'--operator-namespace=[Namespace where the operators are deployed]:OPERATOR_NAMESPACE:_default' \ +'--operator-ns=[Namespace where the operators are deployed]:OPERATOR_NAMESPACE:_default' \ +'-n+[Namespace where the stacks or demos are deployed]:NAMESPACE:_default' \ +'--namespace=[Namespace where the stacks or demos are deployed]:NAMESPACE:_default' \ +'--product-ns=[Namespace where the stacks or demos are deployed]:NAMESPACE:_default' \ +'--release=[Target a specific Stackable release]:RELEASE:_default' \ +'-l+[Log level this application uses]:LOG_LEVEL:_default' \ +'--log-level=[Log level this application uses]:LOG_LEVEL:_default' \ +'*-d+[Provide one or more additional (custom) demo file(s)]:DEMO_FILE:_files' \ +'*--demo-file=[Provide one or more additional (custom) demo file(s)]:DEMO_FILE:_files' \ +'*-s+[Provide one or more additional (custom) stack file(s)]:STACK_FILE:_files' \ +'*--stack-file=[Provide one or more additional (custom) stack file(s)]:STACK_FILE:_files' \ +'*-r+[Provide one or more additional (custom) release file(s)]:RELEASE_FILE:_files' \ +'*--release-file=[Provide one or more additional (custom) release file(s)]:RELEASE_FILE:_files' \ +'-f+[Path to a Helm values file that will be used for the installation of operators]:VALUES_FILE:_files' \ +'--operator-values=[Path to a Helm values file that will be used for the installation of operators]:VALUES_FILE:_files' \ +'--helm-repo-stable=[Provide a custom Helm stable repository URL]:URL:_urls' \ +'--helm-repo-test=[Provide a custom Helm test repository URL]:URL:_urls' \ +'--helm-repo-dev=[Provide a custom Helm dev repository URL]:URL:_urls' \ +'--chart-source=[Source the charts from either a OCI registry or from index.yaml-based repositories]:CHART_SOURCE:((oci\:"OCI registry" +repo\:"index.yaml-based repositories\: resolution (dev, test, stable) is based on the version and thus will be operator-specific"))' \ +'--listener-class-preset=[Choose the ListenerClass preset (\`none\`, \`ephemeral-nodes\` or \`stable-nodes\`)]:LISTENER_CLASS_PRESET:(none stable-nodes ephemeral-nodes)' \ +'--skip-operators-and-crds[Skip uninstalling Stackable operators and CRDs]' \ +'--no-cache[Do not cache the remote (default) demo, stack and release files]' \ +'-h[Print help (see more with '\''--help'\'')]' \ +'--help[Print help (see more with '\''--help'\'')]' \ +'-V[Print version]' \ +'--version[Print version]' \ +':stack_name -- Name of the stack to uninstall:_default' \ && ret=0 ;; (help) @@ -699,6 +732,10 @@ _arguments "${_arguments_options[@]}" : \ _arguments "${_arguments_options[@]}" : \ && ret=0 ;; +(uninstall) +_arguments "${_arguments_options[@]}" : \ +&& ret=0 +;; (help) _arguments "${_arguments_options[@]}" : \ && ret=0 @@ -988,6 +1025,39 @@ repo\:"index.yaml-based repositories\: resolution (dev, test, stable) is based o ':DEMO -- Demo to install:_default' \ && ret=0 ;; +(uninstall) +_arguments "${_arguments_options[@]}" : \ +'--operator-namespace=[Namespace where the operators are deployed]:OPERATOR_NAMESPACE:_default' \ +'--operator-ns=[Namespace where the operators are deployed]:OPERATOR_NAMESPACE:_default' \ +'-n+[Namespace where the stacks or demos are deployed]:NAMESPACE:_default' \ +'--namespace=[Namespace where the stacks or demos are deployed]:NAMESPACE:_default' \ +'--product-ns=[Namespace where the stacks or demos are deployed]:NAMESPACE:_default' \ +'--release=[Target a specific Stackable release]:RELEASE:_default' \ +'-l+[Log level this application uses]:LOG_LEVEL:_default' \ +'--log-level=[Log level this application uses]:LOG_LEVEL:_default' \ +'*-d+[Provide one or more additional (custom) demo file(s)]:DEMO_FILE:_files' \ +'*--demo-file=[Provide one or more additional (custom) demo file(s)]:DEMO_FILE:_files' \ +'*-s+[Provide one or more additional (custom) stack file(s)]:STACK_FILE:_files' \ +'*--stack-file=[Provide one or more additional (custom) stack file(s)]:STACK_FILE:_files' \ +'*-r+[Provide one or more additional (custom) release file(s)]:RELEASE_FILE:_files' \ +'*--release-file=[Provide one or more additional (custom) release file(s)]:RELEASE_FILE:_files' \ +'-f+[Path to a Helm values file that will be used for the installation of operators]:VALUES_FILE:_files' \ +'--operator-values=[Path to a Helm values file that will be used for the installation of operators]:VALUES_FILE:_files' \ +'--helm-repo-stable=[Provide a custom Helm stable repository URL]:URL:_urls' \ +'--helm-repo-test=[Provide a custom Helm test repository URL]:URL:_urls' \ +'--helm-repo-dev=[Provide a custom Helm dev repository URL]:URL:_urls' \ +'--chart-source=[Source the charts from either a OCI registry or from index.yaml-based repositories]:CHART_SOURCE:((oci\:"OCI registry" +repo\:"index.yaml-based repositories\: resolution (dev, test, stable) is based on the version and thus will be operator-specific"))' \ +'--listener-class-preset=[Choose the ListenerClass preset (\`none\`, \`ephemeral-nodes\` or \`stable-nodes\`)]:LISTENER_CLASS_PRESET:(none stable-nodes ephemeral-nodes)' \ +'--skip-operators-and-crds[Skip uninstalling Stackable operators and CRDs]' \ +'--no-cache[Do not cache the remote (default) demo, stack and release files]' \ +'-h[Print help (see more with '\''--help'\'')]' \ +'--help[Print help (see more with '\''--help'\'')]' \ +'-V[Print version]' \ +'--version[Print version]' \ +':demo_name -- Demo to uninstall:_default' \ +&& ret=0 +;; (help) _arguments "${_arguments_options[@]}" : \ ":: :_stackablectl__demo__help_commands" \ @@ -1012,6 +1082,10 @@ _arguments "${_arguments_options[@]}" : \ _arguments "${_arguments_options[@]}" : \ && ret=0 ;; +(uninstall) +_arguments "${_arguments_options[@]}" : \ +&& ret=0 +;; (help) _arguments "${_arguments_options[@]}" : \ && ret=0 @@ -1568,6 +1642,10 @@ _arguments "${_arguments_options[@]}" : \ (install) _arguments "${_arguments_options[@]}" : \ && ret=0 +;; +(uninstall) +_arguments "${_arguments_options[@]}" : \ +&& ret=0 ;; esac ;; @@ -1620,6 +1698,10 @@ _arguments "${_arguments_options[@]}" : \ (install) _arguments "${_arguments_options[@]}" : \ && ret=0 +;; +(uninstall) +_arguments "${_arguments_options[@]}" : \ +&& ret=0 ;; esac ;; @@ -1866,6 +1948,7 @@ _stackablectl__demo_commands() { 'list:List available demos' \ 'describe:Print out detailed demo information' \ 'install:Install a specific demo' \ +'uninstall:Uninstall a specific stack. Caution\: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' \ 'help:Print this message or the help of the given subcommand(s)' \ ) _describe -t commands 'stackablectl demo commands' commands "$@" @@ -1881,6 +1964,7 @@ _stackablectl__demo__help_commands() { 'list:List available demos' \ 'describe:Print out detailed demo information' \ 'install:Install a specific demo' \ +'uninstall:Uninstall a specific stack. Caution\: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' \ 'help:Print this message or the help of the given subcommand(s)' \ ) _describe -t commands 'stackablectl demo help commands' commands "$@" @@ -1905,6 +1989,11 @@ _stackablectl__demo__help__list_commands() { local commands; commands=() _describe -t commands 'stackablectl demo help list commands' commands "$@" } +(( $+functions[_stackablectl__demo__help__uninstall_commands] )) || +_stackablectl__demo__help__uninstall_commands() { + local commands; commands=() + _describe -t commands 'stackablectl demo help uninstall commands' commands "$@" +} (( $+functions[_stackablectl__demo__install_commands] )) || _stackablectl__demo__install_commands() { local commands; commands=() @@ -1915,6 +2004,11 @@ _stackablectl__demo__list_commands() { local commands; commands=() _describe -t commands 'stackablectl demo list commands' commands "$@" } +(( $+functions[_stackablectl__demo__uninstall_commands] )) || +_stackablectl__demo__uninstall_commands() { + local commands; commands=() + _describe -t commands 'stackablectl demo uninstall commands' commands "$@" +} (( $+functions[_stackablectl__experimental-debug_commands] )) || _stackablectl__experimental-debug_commands() { local commands; commands=() @@ -1996,6 +2090,7 @@ _stackablectl__help__demo_commands() { 'list:List available demos' \ 'describe:Print out detailed demo information' \ 'install:Install a specific demo' \ +'uninstall:Uninstall a specific stack. Caution\: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' \ ) _describe -t commands 'stackablectl help demo commands' commands "$@" } @@ -2014,6 +2109,11 @@ _stackablectl__help__demo__list_commands() { local commands; commands=() _describe -t commands 'stackablectl help demo list commands' commands "$@" } +(( $+functions[_stackablectl__help__demo__uninstall_commands] )) || +_stackablectl__help__demo__uninstall_commands() { + local commands; commands=() + _describe -t commands 'stackablectl help demo uninstall commands' commands "$@" +} (( $+functions[_stackablectl__help__experimental-debug_commands] )) || _stackablectl__help__experimental-debug_commands() { local commands; commands=() @@ -2102,6 +2202,7 @@ _stackablectl__help__stack_commands() { 'list:List available stacks' \ 'describe:Describe a specific stack' \ 'install:Install a specific stack' \ +'uninstall:Uninstall a specific stack. Caution\: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' \ ) _describe -t commands 'stackablectl help stack commands' commands "$@" } @@ -2120,6 +2221,11 @@ _stackablectl__help__stack__list_commands() { local commands; commands=() _describe -t commands 'stackablectl help stack list commands' commands "$@" } +(( $+functions[_stackablectl__help__stack__uninstall_commands] )) || +_stackablectl__help__stack__uninstall_commands() { + local commands; commands=() + _describe -t commands 'stackablectl help stack uninstall commands' commands "$@" +} (( $+functions[_stackablectl__help__stacklet_commands] )) || _stackablectl__help__stacklet_commands() { local commands; commands=( @@ -2314,6 +2420,7 @@ _stackablectl__stack_commands() { 'list:List available stacks' \ 'describe:Describe a specific stack' \ 'install:Install a specific stack' \ +'uninstall:Uninstall a specific stack. Caution\: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' \ 'help:Print this message or the help of the given subcommand(s)' \ ) _describe -t commands 'stackablectl stack commands' commands "$@" @@ -2329,6 +2436,7 @@ _stackablectl__stack__help_commands() { 'list:List available stacks' \ 'describe:Describe a specific stack' \ 'install:Install a specific stack' \ +'uninstall:Uninstall a specific stack. Caution\: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' \ 'help:Print this message or the help of the given subcommand(s)' \ ) _describe -t commands 'stackablectl stack help commands' commands "$@" @@ -2353,6 +2461,11 @@ _stackablectl__stack__help__list_commands() { local commands; commands=() _describe -t commands 'stackablectl stack help list commands' commands "$@" } +(( $+functions[_stackablectl__stack__help__uninstall_commands] )) || +_stackablectl__stack__help__uninstall_commands() { + local commands; commands=() + _describe -t commands 'stackablectl stack help uninstall commands' commands "$@" +} (( $+functions[_stackablectl__stack__install_commands] )) || _stackablectl__stack__install_commands() { local commands; commands=() @@ -2363,6 +2476,11 @@ _stackablectl__stack__list_commands() { local commands; commands=() _describe -t commands 'stackablectl stack list commands' commands "$@" } +(( $+functions[_stackablectl__stack__uninstall_commands] )) || +_stackablectl__stack__uninstall_commands() { + local commands; commands=() + _describe -t commands 'stackablectl stack uninstall commands' commands "$@" +} (( $+functions[_stackablectl__stacklet_commands] )) || _stackablectl__stacklet_commands() { local commands; commands=( diff --git a/extra/completions/stackablectl.bash b/extra/completions/stackablectl.bash index be0544fa..13c0028a 100644 --- a/extra/completions/stackablectl.bash +++ b/extra/completions/stackablectl.bash @@ -112,6 +112,9 @@ _stackablectl() { stackablectl__demo,list) cmd="stackablectl__demo__list" ;; + stackablectl__demo,uninstall) + cmd="stackablectl__demo__uninstall" + ;; stackablectl__demo__help,describe) cmd="stackablectl__demo__help__describe" ;; @@ -124,6 +127,9 @@ _stackablectl() { stackablectl__demo__help,list) cmd="stackablectl__demo__help__list" ;; + stackablectl__demo__help,uninstall) + cmd="stackablectl__demo__help__uninstall" + ;; stackablectl__help,cache) cmd="stackablectl__help__cache" ;; @@ -184,6 +190,9 @@ _stackablectl() { stackablectl__help__demo,list) cmd="stackablectl__help__demo__list" ;; + stackablectl__help__demo,uninstall) + cmd="stackablectl__help__demo__uninstall" + ;; stackablectl__help__operator,describe) cmd="stackablectl__help__operator__describe" ;; @@ -223,6 +232,9 @@ _stackablectl() { stackablectl__help__stack,list) cmd="stackablectl__help__stack__list" ;; + stackablectl__help__stack,uninstall) + cmd="stackablectl__help__stack__uninstall" + ;; stackablectl__help__stacklet,credentials) cmd="stackablectl__help__stacklet__credentials" ;; @@ -316,6 +328,9 @@ _stackablectl() { stackablectl__stack,list) cmd="stackablectl__stack__list" ;; + stackablectl__stack,uninstall) + cmd="stackablectl__stack__uninstall" + ;; stackablectl__stack__help,describe) cmd="stackablectl__stack__help__describe" ;; @@ -328,6 +343,9 @@ _stackablectl() { stackablectl__stack__help,list) cmd="stackablectl__stack__help__list" ;; + stackablectl__stack__help,uninstall) + cmd="stackablectl__stack__help__uninstall" + ;; stackablectl__stacklet,credentials) cmd="stackablectl__stacklet__credentials" ;; @@ -2139,7 +2157,7 @@ _stackablectl() { return 0 ;; stackablectl__demo) - opts="-l -d -s -r -f -h -V --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version list describe install help" + opts="-l -d -s -r -f -h -V --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version list describe install uninstall help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -2479,7 +2497,7 @@ _stackablectl() { return 0 ;; stackablectl__demo__help) - opts="list describe install help" + opts="list describe install uninstall help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -2548,6 +2566,20 @@ _stackablectl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; + stackablectl__demo__help__uninstall) + opts="" + if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; stackablectl__demo__install) opts="-c -n -l -d -s -r -f -h -V --skip-release --stack-parameters --parameters --cluster --cluster-name --cluster-nodes --cluster-cp-nodes --operator-ns --operator-namespace --product-ns --namespace --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version " if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then @@ -2936,6 +2968,192 @@ _stackablectl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; + stackablectl__demo__uninstall) + opts="-n -l -d -s -r -f -h -V --operator-ns --operator-namespace --product-ns --namespace --skip-operators-and-crds --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version " + if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + --operator-namespace) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --operator-ns) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --namespace) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --product-ns) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -n) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --release) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --log-level) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -l) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --demo-file) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -d) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --stack-file) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -s) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --release-file) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -r) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --operator-values) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -f) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --helm-repo-stable) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --helm-repo-test) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --helm-repo-dev) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --chart-source) + COMPREPLY=($(compgen -W "oci repo" -- "${cur}")) + return 0 + ;; + --listener-class-preset) + COMPREPLY=($(compgen -W "none stable-nodes ephemeral-nodes" -- "${cur}")) + return 0 + ;; + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; stackablectl__experimental__debug) opts="-n -c -l -d -s -r -f -h -V --namespace --container --image --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version [CMD]..." if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then @@ -3259,7 +3477,7 @@ _stackablectl() { return 0 ;; stackablectl__help__demo) - opts="list describe install" + opts="list describe install uninstall" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -3314,6 +3532,20 @@ _stackablectl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; + stackablectl__help__demo__uninstall) + opts="" + if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; stackablectl__help__experimental__debug) opts="" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then @@ -3511,7 +3743,7 @@ _stackablectl() { return 0 ;; stackablectl__help__stack) - opts="list describe install" + opts="list describe install uninstall" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -3566,6 +3798,20 @@ _stackablectl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; + stackablectl__help__stack__uninstall) + opts="" + if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; stackablectl__help__stacklet) opts="credentials list" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then @@ -5937,7 +6183,7 @@ _stackablectl() { return 0 ;; stackablectl__stack) - opts="-l -d -s -r -f -h -V --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version list describe install help" + opts="-l -d -s -r -f -h -V --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version list describe install uninstall help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -6277,7 +6523,7 @@ _stackablectl() { return 0 ;; stackablectl__stack__help) - opts="list describe install help" + opts="list describe install uninstall help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -6346,6 +6592,20 @@ _stackablectl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; + stackablectl__stack__help__uninstall) + opts="" + if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; stackablectl__stack__install) opts="-c -n -l -d -s -r -f -h -V --skip-release --stack-parameters --parameters --cluster --cluster-name --cluster-nodes --cluster-cp-nodes --operator-ns --operator-namespace --product-ns --namespace --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version " if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then @@ -6734,6 +6994,192 @@ _stackablectl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; + stackablectl__stack__uninstall) + opts="-n -l -d -s -r -f -h -V --operator-ns --operator-namespace --product-ns --namespace --skip-operators-and-crds --release --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version " + if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + --operator-namespace) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --operator-ns) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --namespace) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --product-ns) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -n) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --release) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --log-level) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -l) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --demo-file) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -d) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --stack-file) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -s) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --release-file) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -r) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --operator-values) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + -f) + local oldifs + if [ -n "${IFS+x}" ]; then + oldifs="$IFS" + fi + IFS=$'\n' + COMPREPLY=($(compgen -f "${cur}")) + if [ -n "${oldifs+x}" ]; then + IFS="$oldifs" + fi + if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then + compopt -o filenames + fi + return 0 + ;; + --helm-repo-stable) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --helm-repo-test) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --helm-repo-dev) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --chart-source) + COMPREPLY=($(compgen -W "oci repo" -- "${cur}")) + return 0 + ;; + --listener-class-preset) + COMPREPLY=($(compgen -W "none stable-nodes ephemeral-nodes" -- "${cur}")) + return 0 + ;; + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; stackablectl__stacklet) opts="-l -d -s -r -f -h -V --log-level --no-cache --demo-file --stack-file --release-file --operator-values --helm-repo-stable --helm-repo-test --helm-repo-dev --chart-source --listener-class-preset --help --version credentials list help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then diff --git a/extra/completions/stackablectl.elv b/extra/completions/stackablectl.elv index e98558e7..4faf691a 100644 --- a/extra/completions/stackablectl.elv +++ b/extra/completions/stackablectl.elv @@ -430,6 +430,7 @@ set edit:completion:arg-completer[stackablectl] = {|@words| cand list 'List available stacks' cand describe 'Describe a specific stack' cand install 'Install a specific stack' + cand uninstall 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' cand help 'Print this message or the help of the given subcommand(s)' } &'stackablectl;stack;list'= { @@ -518,10 +519,40 @@ set edit:completion:arg-completer[stackablectl] = {|@words| cand -V 'Print version' cand --version 'Print version' } + &'stackablectl;stack;uninstall'= { + cand --operator-namespace 'Namespace where the operators are deployed' + cand --operator-ns 'Namespace where the operators are deployed' + cand -n 'Namespace where the stacks or demos are deployed' + cand --namespace 'Namespace where the stacks or demos are deployed' + cand --product-ns 'Namespace where the stacks or demos are deployed' + cand --release 'Target a specific Stackable release' + cand -l 'Log level this application uses' + cand --log-level 'Log level this application uses' + cand -d 'Provide one or more additional (custom) demo file(s)' + cand --demo-file 'Provide one or more additional (custom) demo file(s)' + cand -s 'Provide one or more additional (custom) stack file(s)' + cand --stack-file 'Provide one or more additional (custom) stack file(s)' + cand -r 'Provide one or more additional (custom) release file(s)' + cand --release-file 'Provide one or more additional (custom) release file(s)' + cand -f 'Path to a Helm values file that will be used for the installation of operators' + cand --operator-values 'Path to a Helm values file that will be used for the installation of operators' + cand --helm-repo-stable 'Provide a custom Helm stable repository URL' + cand --helm-repo-test 'Provide a custom Helm test repository URL' + cand --helm-repo-dev 'Provide a custom Helm dev repository URL' + cand --chart-source 'Source the charts from either a OCI registry or from index.yaml-based repositories' + cand --listener-class-preset 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' + cand --skip-operators-and-crds 'Skip uninstalling Stackable operators and CRDs' + cand --no-cache 'Do not cache the remote (default) demo, stack and release files' + cand -h 'Print help (see more with ''--help'')' + cand --help 'Print help (see more with ''--help'')' + cand -V 'Print version' + cand --version 'Print version' + } &'stackablectl;stack;help'= { cand list 'List available stacks' cand describe 'Describe a specific stack' cand install 'Install a specific stack' + cand uninstall 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' cand help 'Print this message or the help of the given subcommand(s)' } &'stackablectl;stack;help;list'= { @@ -530,6 +561,8 @@ set edit:completion:arg-completer[stackablectl] = {|@words| } &'stackablectl;stack;help;install'= { } + &'stackablectl;stack;help;uninstall'= { + } &'stackablectl;stack;help;help'= { } &'stackablectl;stacklet'= { @@ -646,6 +679,7 @@ set edit:completion:arg-completer[stackablectl] = {|@words| cand list 'List available demos' cand describe 'Print out detailed demo information' cand install 'Install a specific demo' + cand uninstall 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' cand help 'Print this message or the help of the given subcommand(s)' } &'stackablectl;demo;list'= { @@ -734,10 +768,40 @@ set edit:completion:arg-completer[stackablectl] = {|@words| cand -V 'Print version' cand --version 'Print version' } + &'stackablectl;demo;uninstall'= { + cand --operator-namespace 'Namespace where the operators are deployed' + cand --operator-ns 'Namespace where the operators are deployed' + cand -n 'Namespace where the stacks or demos are deployed' + cand --namespace 'Namespace where the stacks or demos are deployed' + cand --product-ns 'Namespace where the stacks or demos are deployed' + cand --release 'Target a specific Stackable release' + cand -l 'Log level this application uses' + cand --log-level 'Log level this application uses' + cand -d 'Provide one or more additional (custom) demo file(s)' + cand --demo-file 'Provide one or more additional (custom) demo file(s)' + cand -s 'Provide one or more additional (custom) stack file(s)' + cand --stack-file 'Provide one or more additional (custom) stack file(s)' + cand -r 'Provide one or more additional (custom) release file(s)' + cand --release-file 'Provide one or more additional (custom) release file(s)' + cand -f 'Path to a Helm values file that will be used for the installation of operators' + cand --operator-values 'Path to a Helm values file that will be used for the installation of operators' + cand --helm-repo-stable 'Provide a custom Helm stable repository URL' + cand --helm-repo-test 'Provide a custom Helm test repository URL' + cand --helm-repo-dev 'Provide a custom Helm dev repository URL' + cand --chart-source 'Source the charts from either a OCI registry or from index.yaml-based repositories' + cand --listener-class-preset 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' + cand --skip-operators-and-crds 'Skip uninstalling Stackable operators and CRDs' + cand --no-cache 'Do not cache the remote (default) demo, stack and release files' + cand -h 'Print help (see more with ''--help'')' + cand --help 'Print help (see more with ''--help'')' + cand -V 'Print version' + cand --version 'Print version' + } &'stackablectl;demo;help'= { cand list 'List available demos' cand describe 'Print out detailed demo information' cand install 'Install a specific demo' + cand uninstall 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' cand help 'Print this message or the help of the given subcommand(s)' } &'stackablectl;demo;help;list'= { @@ -746,6 +810,8 @@ set edit:completion:arg-completer[stackablectl] = {|@words| } &'stackablectl;demo;help;install'= { } + &'stackablectl;demo;help;uninstall'= { + } &'stackablectl;demo;help;help'= { } &'stackablectl;completions'= { @@ -1119,6 +1185,7 @@ set edit:completion:arg-completer[stackablectl] = {|@words| cand list 'List available stacks' cand describe 'Describe a specific stack' cand install 'Install a specific stack' + cand uninstall 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' } &'stackablectl;help;stack;list'= { } @@ -1126,6 +1193,8 @@ set edit:completion:arg-completer[stackablectl] = {|@words| } &'stackablectl;help;stack;install'= { } + &'stackablectl;help;stack;uninstall'= { + } &'stackablectl;help;stacklet'= { cand credentials 'Display credentials for a stacklet' cand list 'List deployed stacklets' @@ -1138,6 +1207,7 @@ set edit:completion:arg-completer[stackablectl] = {|@words| cand list 'List available demos' cand describe 'Print out detailed demo information' cand install 'Install a specific demo' + cand uninstall 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' } &'stackablectl;help;demo;list'= { } @@ -1145,6 +1215,8 @@ set edit:completion:arg-completer[stackablectl] = {|@words| } &'stackablectl;help;demo;install'= { } + &'stackablectl;help;demo;uninstall'= { + } &'stackablectl;help;completions'= { cand bash 'Generate shell completions for Bash' cand elvish 'Generate shell completions for Elvish' diff --git a/extra/completions/stackablectl.fish b/extra/completions/stackablectl.fish index ba0bb555..d60c7d99 100644 --- a/extra/completions/stackablectl.fish +++ b/extra/completions/stackablectl.fish @@ -306,27 +306,28 @@ complete -c stackablectl -n "__fish_stackablectl_using_subcommand release; and _ complete -c stackablectl -n "__fish_stackablectl_using_subcommand release; and __fish_seen_subcommand_from help" -f -a "uninstall" -d 'Uninstall a release' complete -c stackablectl -n "__fish_stackablectl_using_subcommand release; and __fish_seen_subcommand_from help" -f -a "upgrade" -d 'Upgrade a release' complete -c stackablectl -n "__fish_stackablectl_using_subcommand release; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -l release -d 'Target a specific Stackable release' -r -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -s l -l log-level -d 'Log level this application uses' -r -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -s s -l stack-file -d 'Provide one or more additional (custom) stack file(s)' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -s r -l release-file -d 'Provide one or more additional (custom) release file(s)' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -s f -l operator-values -d 'Path to a Helm values file that will be used for the installation of operators' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -l helm-repo-stable -d 'Provide a custom Helm stable repository URL' -r -f -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -l helm-repo-test -d 'Provide a custom Helm test repository URL' -r -f -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -l helm-repo-dev -d 'Provide a custom Helm dev repository URL' -r -f -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -l chart-source -d 'Source the charts from either a OCI registry or from index.yaml-based repositories' -r -f -a "oci\t'OCI registry' -repo\t'index.yaml-based repositories: resolution (dev, test, stable) is based on the version and thus will be operator-specific'" -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -l listener-class-preset -d 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' -r -f -a "none\t'' -stable-nodes\t'' -ephemeral-nodes\t''" -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -s V -l version -d 'Print version' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -f -a "list" -d 'List available stacks' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -f -a "describe" -d 'Describe a specific stack' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -f -a "install" -d 'Install a specific stack' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -l release -d 'Target a specific Stackable release' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -s l -l log-level -d 'Log level this application uses' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -s s -l stack-file -d 'Provide one or more additional (custom) stack file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -s r -l release-file -d 'Provide one or more additional (custom) release file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -s f -l operator-values -d 'Path to a Helm values file that will be used for the installation of operators' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -l helm-repo-stable -d 'Provide a custom Helm stable repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -l helm-repo-test -d 'Provide a custom Helm test repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -l helm-repo-dev -d 'Provide a custom Helm dev repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -l chart-source -d 'Source the charts from either a OCI registry or from index.yaml-based repositories' -r -f -a "oci\t'OCI registry' +repo\t'index.yaml-based repositories: resolution (dev, test, stable) is based on the version and thus will be operator-specific'" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -l listener-class-preset -d 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' -r -f -a "none\t'' +stable-nodes\t'' +ephemeral-nodes\t''" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -s h -l help -d 'Print help (see more with \'--help\')' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -s V -l version -d 'Print version' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "list" -d 'List available stacks' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "describe" -d 'Describe a specific stack' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "install" -d 'Install a specific stack' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "uninstall" -d 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from list" -s o -l output -r -f -a "plain\t'Print output formatted as plain text' table\t'Print output formatted as a table' json\t'Print output formatted as JSON' @@ -396,9 +397,30 @@ complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __f complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from install" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from install" -s h -l help -d 'Print help (see more with \'--help\')' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from install" -s V -l version -d 'Print version' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l operator-namespace -l operator-ns -d 'Namespace where the operators are deployed' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s n -l namespace -l product-ns -d 'Namespace where the stacks or demos are deployed' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l release -d 'Target a specific Stackable release' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s l -l log-level -d 'Log level this application uses' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s s -l stack-file -d 'Provide one or more additional (custom) stack file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s r -l release-file -d 'Provide one or more additional (custom) release file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s f -l operator-values -d 'Path to a Helm values file that will be used for the installation of operators' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l helm-repo-stable -d 'Provide a custom Helm stable repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l helm-repo-test -d 'Provide a custom Helm test repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l helm-repo-dev -d 'Provide a custom Helm dev repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l chart-source -d 'Source the charts from either a OCI registry or from index.yaml-based repositories' -r -f -a "oci\t'OCI registry' +repo\t'index.yaml-based repositories: resolution (dev, test, stable) is based on the version and thus will be operator-specific'" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l listener-class-preset -d 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' -r -f -a "none\t'' +stable-nodes\t'' +ephemeral-nodes\t''" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l skip-operators-and-crds -d 'Skip uninstalling Stackable operators and CRDs' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s h -l help -d 'Print help (see more with \'--help\')' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from uninstall" -s V -l version -d 'Print version' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from help" -f -a "list" -d 'List available stacks' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from help" -f -a "describe" -d 'Describe a specific stack' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from help" -f -a "install" -d 'Install a specific stack' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from help" -f -a "uninstall" -d 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stack; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stacklet; and not __fish_seen_subcommand_from credentials list help" -s l -l log-level -d 'Log level this application uses' -r complete -c stackablectl -n "__fish_stackablectl_using_subcommand stacklet; and not __fish_seen_subcommand_from credentials list help" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F @@ -461,27 +483,28 @@ complete -c stackablectl -n "__fish_stackablectl_using_subcommand stacklet; and complete -c stackablectl -n "__fish_stackablectl_using_subcommand stacklet; and __fish_seen_subcommand_from help" -f -a "credentials" -d 'Display credentials for a stacklet' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stacklet; and __fish_seen_subcommand_from help" -f -a "list" -d 'List deployed stacklets' complete -c stackablectl -n "__fish_stackablectl_using_subcommand stacklet; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -l release -d 'Target a specific Stackable release' -r -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -s l -l log-level -d 'Log level this application uses' -r -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -s s -l stack-file -d 'Provide one or more additional (custom) stack file(s)' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -s r -l release-file -d 'Provide one or more additional (custom) release file(s)' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -s f -l operator-values -d 'Path to a Helm values file that will be used for the installation of operators' -r -F -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -l helm-repo-stable -d 'Provide a custom Helm stable repository URL' -r -f -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -l helm-repo-test -d 'Provide a custom Helm test repository URL' -r -f -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -l helm-repo-dev -d 'Provide a custom Helm dev repository URL' -r -f -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -l chart-source -d 'Source the charts from either a OCI registry or from index.yaml-based repositories' -r -f -a "oci\t'OCI registry' -repo\t'index.yaml-based repositories: resolution (dev, test, stable) is based on the version and thus will be operator-specific'" -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -l listener-class-preset -d 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' -r -f -a "none\t'' -stable-nodes\t'' -ephemeral-nodes\t''" -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -s V -l version -d 'Print version' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -f -a "list" -d 'List available demos' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -f -a "describe" -d 'Print out detailed demo information' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -f -a "install" -d 'Install a specific demo' -complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -l release -d 'Target a specific Stackable release' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -s l -l log-level -d 'Log level this application uses' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -s s -l stack-file -d 'Provide one or more additional (custom) stack file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -s r -l release-file -d 'Provide one or more additional (custom) release file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -s f -l operator-values -d 'Path to a Helm values file that will be used for the installation of operators' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -l helm-repo-stable -d 'Provide a custom Helm stable repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -l helm-repo-test -d 'Provide a custom Helm test repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -l helm-repo-dev -d 'Provide a custom Helm dev repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -l chart-source -d 'Source the charts from either a OCI registry or from index.yaml-based repositories' -r -f -a "oci\t'OCI registry' +repo\t'index.yaml-based repositories: resolution (dev, test, stable) is based on the version and thus will be operator-specific'" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -l listener-class-preset -d 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' -r -f -a "none\t'' +stable-nodes\t'' +ephemeral-nodes\t''" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -s h -l help -d 'Print help (see more with \'--help\')' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -s V -l version -d 'Print version' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "list" -d 'List available demos' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "describe" -d 'Print out detailed demo information' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "install" -d 'Install a specific demo' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "uninstall" -d 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and not __fish_seen_subcommand_from list describe install uninstall help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from list" -s o -l output -r -f -a "plain\t'Print output formatted as plain text' table\t'Print output formatted as a table' json\t'Print output formatted as JSON' @@ -551,9 +574,30 @@ complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fi complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from install" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from install" -s h -l help -d 'Print help (see more with \'--help\')' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from install" -s V -l version -d 'Print version' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l operator-namespace -l operator-ns -d 'Namespace where the operators are deployed' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s n -l namespace -l product-ns -d 'Namespace where the stacks or demos are deployed' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l release -d 'Target a specific Stackable release' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s l -l log-level -d 'Log level this application uses' -r +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s s -l stack-file -d 'Provide one or more additional (custom) stack file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s r -l release-file -d 'Provide one or more additional (custom) release file(s)' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s f -l operator-values -d 'Path to a Helm values file that will be used for the installation of operators' -r -F +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l helm-repo-stable -d 'Provide a custom Helm stable repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l helm-repo-test -d 'Provide a custom Helm test repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l helm-repo-dev -d 'Provide a custom Helm dev repository URL' -r -f +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l chart-source -d 'Source the charts from either a OCI registry or from index.yaml-based repositories' -r -f -a "oci\t'OCI registry' +repo\t'index.yaml-based repositories: resolution (dev, test, stable) is based on the version and thus will be operator-specific'" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l listener-class-preset -d 'Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`)' -r -f -a "none\t'' +stable-nodes\t'' +ephemeral-nodes\t''" +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l skip-operators-and-crds -d 'Skip uninstalling Stackable operators and CRDs' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -l no-cache -d 'Do not cache the remote (default) demo, stack and release files' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s h -l help -d 'Print help (see more with \'--help\')' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from uninstall" -s V -l version -d 'Print version' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from help" -f -a "list" -d 'List available demos' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from help" -f -a "describe" -d 'Print out detailed demo information' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from help" -f -a "install" -d 'Install a specific demo' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from help" -f -a "uninstall" -d 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' complete -c stackablectl -n "__fish_stackablectl_using_subcommand demo; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' complete -c stackablectl -n "__fish_stackablectl_using_subcommand completions; and not __fish_seen_subcommand_from bash elvish fish nushell zsh help" -s l -l log-level -d 'Log level this application uses' -r complete -c stackablectl -n "__fish_stackablectl_using_subcommand completions; and not __fish_seen_subcommand_from bash elvish fish nushell zsh help" -s d -l demo-file -d 'Provide one or more additional (custom) demo file(s)' -r -F @@ -796,11 +840,13 @@ complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fi complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from stack" -f -a "list" -d 'List available stacks' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from stack" -f -a "describe" -d 'Describe a specific stack' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from stack" -f -a "install" -d 'Install a specific stack' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from stack" -f -a "uninstall" -d 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from stacklet" -f -a "credentials" -d 'Display credentials for a stacklet' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from stacklet" -f -a "list" -d 'List deployed stacklets' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from demo" -f -a "list" -d 'List available demos' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from demo" -f -a "describe" -d 'Print out detailed demo information' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from demo" -f -a "install" -d 'Install a specific demo' +complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from demo" -f -a "uninstall" -d 'Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from completions" -f -a "bash" -d 'Generate shell completions for Bash' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from completions" -f -a "elvish" -d 'Generate shell completions for Elvish' complete -c stackablectl -n "__fish_stackablectl_using_subcommand help; and __fish_seen_subcommand_from completions" -f -a "fish" -d 'Generate shell completions for Fish' diff --git a/extra/completions/stackablectl.nu b/extra/completions/stackablectl.nu index ee82490f..b5b95011 100644 --- a/extra/completions/stackablectl.nu +++ b/extra/completions/stackablectl.nu @@ -573,7 +573,39 @@ module completions { --listener-class-preset: string@"nu-complete stackablectl stack install listener_class_preset" # Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`) --help(-h) # Print help (see more with '--help') --version(-V) # Print version - stack_name: string # Name of the stack to describe + stack_name: string # Name of the stack to install + ] + + def "nu-complete stackablectl stack uninstall chart_source" [] { + [ "oci" "repo" ] + } + + def "nu-complete stackablectl stack uninstall listener_class_preset" [] { + [ "none" "stable-nodes" "ephemeral-nodes" ] + } + + # Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + export extern "stackablectl stack uninstall" [ + --operator-namespace: string # Namespace where the operators are deployed + --operator-ns: string # Namespace where the operators are deployed + --namespace(-n): string # Namespace where the stacks or demos are deployed + --product-ns: string # Namespace where the stacks or demos are deployed + --skip-operators-and-crds # Skip uninstalling Stackable operators and CRDs + --release: string # Target a specific Stackable release + --log-level(-l): string # Log level this application uses + --no-cache # Do not cache the remote (default) demo, stack and release files + --demo-file(-d): path # Provide one or more additional (custom) demo file(s) + --stack-file(-s): path # Provide one or more additional (custom) stack file(s) + --release-file(-r): path # Provide one or more additional (custom) release file(s) + --operator-values(-f): path # Path to a Helm values file that will be used for the installation of operators + --helm-repo-stable: string # Provide a custom Helm stable repository URL + --helm-repo-test: string # Provide a custom Helm test repository URL + --helm-repo-dev: string # Provide a custom Helm dev repository URL + --chart-source: string@"nu-complete stackablectl stack uninstall chart_source" # Source the charts from either a OCI registry or from index.yaml-based repositories + --listener-class-preset: string@"nu-complete stackablectl stack uninstall listener_class_preset" # Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`) + --help(-h) # Print help (see more with '--help') + --version(-V) # Print version + stack_name: string # Name of the stack to uninstall ] # Print this message or the help of the given subcommand(s) @@ -592,6 +624,10 @@ module completions { export extern "stackablectl stack help install" [ ] + # Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + export extern "stackablectl stack help uninstall" [ + ] + # Print this message or the help of the given subcommand(s) export extern "stackablectl stack help help" [ ] @@ -830,6 +866,38 @@ module completions { DEMO: string # Demo to install ] + def "nu-complete stackablectl demo uninstall chart_source" [] { + [ "oci" "repo" ] + } + + def "nu-complete stackablectl demo uninstall listener_class_preset" [] { + [ "none" "stable-nodes" "ephemeral-nodes" ] + } + + # Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + export extern "stackablectl demo uninstall" [ + --operator-namespace: string # Namespace where the operators are deployed + --operator-ns: string # Namespace where the operators are deployed + --namespace(-n): string # Namespace where the stacks or demos are deployed + --product-ns: string # Namespace where the stacks or demos are deployed + --skip-operators-and-crds # Skip uninstalling Stackable operators and CRDs + --release: string # Target a specific Stackable release + --log-level(-l): string # Log level this application uses + --no-cache # Do not cache the remote (default) demo, stack and release files + --demo-file(-d): path # Provide one or more additional (custom) demo file(s) + --stack-file(-s): path # Provide one or more additional (custom) stack file(s) + --release-file(-r): path # Provide one or more additional (custom) release file(s) + --operator-values(-f): path # Path to a Helm values file that will be used for the installation of operators + --helm-repo-stable: string # Provide a custom Helm stable repository URL + --helm-repo-test: string # Provide a custom Helm test repository URL + --helm-repo-dev: string # Provide a custom Helm dev repository URL + --chart-source: string@"nu-complete stackablectl demo uninstall chart_source" # Source the charts from either a OCI registry or from index.yaml-based repositories + --listener-class-preset: string@"nu-complete stackablectl demo uninstall listener_class_preset" # Choose the ListenerClass preset (`none`, `ephemeral-nodes` or `stable-nodes`) + --help(-h) # Print help (see more with '--help') + --version(-V) # Print version + demo_name: string # Demo to uninstall + ] + # Print this message or the help of the given subcommand(s) export extern "stackablectl demo help" [ ] @@ -846,6 +914,10 @@ module completions { export extern "stackablectl demo help install" [ ] + # Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + export extern "stackablectl demo help uninstall" [ + ] + # Print this message or the help of the given subcommand(s) export extern "stackablectl demo help help" [ ] @@ -1281,6 +1353,10 @@ module completions { export extern "stackablectl help stack install" [ ] + # Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + export extern "stackablectl help stack uninstall" [ + ] + # Interact with deployed stacklets, which are bundles of resources and containers required to run the product export extern "stackablectl help stacklet" [ ] @@ -1309,6 +1385,10 @@ module completions { export extern "stackablectl help demo install" [ ] + # Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + export extern "stackablectl help demo uninstall" [ + ] + # Generate shell completions for this tool export extern "stackablectl help completions" [ ] From f80624a0fa77e7291303f60726a8b7e5bb2d4888 Mon Sep 17 00:00:00 2001 From: xeniape Date: Thu, 12 Mar 2026 16:11:55 +0100 Subject: [PATCH 04/30] pre-commit fix --- docs/modules/stackablectl/partials/commands/demo.adoc | 9 +++++---- docs/modules/stackablectl/partials/commands/stack.adoc | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/modules/stackablectl/partials/commands/demo.adoc b/docs/modules/stackablectl/partials/commands/demo.adoc index c5b2d39b..21f5b844 100644 --- a/docs/modules/stackablectl/partials/commands/demo.adoc +++ b/docs/modules/stackablectl/partials/commands/demo.adoc @@ -6,10 +6,11 @@ Interact with demos, which are end-to-end usage demonstrations of the Stackable Usage: stackablectl demo [OPTIONS] Commands: - list List available demos - describe Print out detailed demo information - install Install a specific demo - help Print this message or the help of the given subcommand(s) + list List available demos + describe Print out detailed demo information + install Install a specific demo + uninstall Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + help Print this message or the help of the given subcommand(s) Options: -l, --log-level diff --git a/docs/modules/stackablectl/partials/commands/stack.adoc b/docs/modules/stackablectl/partials/commands/stack.adoc index 639b1621..9bc0a561 100644 --- a/docs/modules/stackablectl/partials/commands/stack.adoc +++ b/docs/modules/stackablectl/partials/commands/stack.adoc @@ -6,10 +6,11 @@ Interact with stacks, which are ready-to-use product combinations Usage: stackablectl stack [OPTIONS] Commands: - list List available stacks - describe Describe a specific stack - install Install a specific stack - help Print this message or the help of the given subcommand(s) + list List available stacks + describe Describe a specific stack + install Install a specific stack + uninstall Uninstall a specific stack. Caution: This will delete the provided stack namespace, the operators and provided operator namespace, and all Stackable CRDs + help Print this message or the help of the given subcommand(s) Options: -l, --log-level From 1066138927669e26e98ee4e00c5178934beec310 Mon Sep 17 00:00:00 2001 From: xeniape Date: Thu, 12 Mar 2026 16:30:37 +0100 Subject: [PATCH 05/30] regenerate-nix --- Cargo.nix | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 2 deletions(-) diff --git a/Cargo.nix b/Cargo.nix index d5a81ad2..22030b86 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -2838,6 +2838,42 @@ rec { }; resolvedDefaultFeatures = [ "alloc" "default" ]; }; + "dialoguer" = rec { + crateName = "dialoguer"; + version = "0.12.0"; + edition = "2021"; + sha256 = "15mdq2cp838yiq9fs1jkhvskixvlqz5p8f8dipkn88xz06sh9w95"; + dependencies = [ + { + name = "console"; + packageId = "console"; + } + { + name = "shell-words"; + packageId = "shell-words"; + } + { + name = "tempfile"; + packageId = "tempfile"; + optional = true; + } + { + name = "zeroize"; + packageId = "zeroize"; + optional = true; + } + ]; + features = { + "default" = [ "editor" "password" ]; + "editor" = [ "tempfile" ]; + "fuzzy-matcher" = [ "dep:fuzzy-matcher" ]; + "fuzzy-select" = [ "fuzzy-matcher" ]; + "password" = [ "zeroize" ]; + "tempfile" = [ "dep:tempfile" ]; + "zeroize" = [ "dep:zeroize" ]; + }; + resolvedDefaultFeatures = [ "default" "editor" "password" "tempfile" "zeroize" ]; + }; "digest" = rec { crateName = "digest"; version = "0.10.7"; @@ -3382,7 +3418,7 @@ rec { "js" = [ "std" "getrandom" ]; "std" = [ "alloc" ]; }; - resolvedDefaultFeatures = [ "alloc" "std" ]; + resolvedDefaultFeatures = [ "alloc" "default" "std" ]; }; "find-msvc-tools" = rec { crateName = "find-msvc-tools"; @@ -10238,7 +10274,7 @@ rec { "thread" = [ "linux-raw-sys/prctl" ]; "use-libc" = [ "libc_errno" "libc" ]; }; - resolvedDefaultFeatures = [ "alloc" "std" "stdio" "termios" ]; + resolvedDefaultFeatures = [ "alloc" "default" "fs" "std" "stdio" "termios" ]; }; "rustls" = rec { crateName = "rustls"; @@ -11268,6 +11304,20 @@ rec { "loom" = [ "dep:loom" ]; }; }; + "shell-words" = rec { + crateName = "shell-words"; + version = "1.1.1"; + edition = "2015"; + sha256 = "0xzd5p53xl0ndnk63r0by52rhdrh6pd37szfxszkg73zb6ffcvyw"; + libName = "shell_words"; + authors = [ + "Tomasz MiÄ…sko " + ]; + features = { + "default" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; "shlex" = rec { crateName = "shlex"; version = "1.3.0"; @@ -11657,6 +11707,10 @@ rec { packageId = "clap"; features = [ "derive" "env" ]; } + { + name = "either"; + packageId = "either"; + } { name = "futures"; packageId = "futures"; @@ -12423,6 +12477,10 @@ rec { packageId = "comfy-table"; features = [ "custom_styling" ]; } + { + name = "dialoguer"; + packageId = "dialoguer"; + } { name = "directories"; packageId = "directories"; @@ -12741,6 +12799,54 @@ rec { }; resolvedDefaultFeatures = [ "default" "proc-macro" ]; }; + "tempfile" = rec { + crateName = "tempfile"; + version = "3.23.0"; + edition = "2021"; + sha256 = "05igl2gml6z6i2va1bv49f9f1wb3f752c2i63lvlb9s2vxxwfc9d"; + authors = [ + "Steven Allen " + "The Rust Project Developers" + "Ashley Mannix " + "Jason White " + ]; + dependencies = [ + { + name = "fastrand"; + packageId = "fastrand"; + } + { + name = "getrandom"; + packageId = "getrandom 0.3.4"; + optional = true; + usesDefaultFeatures = false; + target = { target, features }: ((target."unix" or false) || (target."windows" or false) || ("wasi" == target."os" or null)); + } + { + name = "once_cell"; + packageId = "once_cell"; + usesDefaultFeatures = false; + features = [ "std" ]; + } + { + name = "rustix"; + packageId = "rustix"; + target = { target, features }: ((target."unix" or false) || ("wasi" == target."os" or null)); + features = [ "fs" ]; + } + { + name = "windows-sys"; + packageId = "windows-sys 0.61.2"; + target = { target, features }: (target."windows" or false); + features = [ "Win32_Storage_FileSystem" "Win32_Foundation" ]; + } + ]; + features = { + "default" = [ "getrandom" ]; + "getrandom" = [ "dep:getrandom" ]; + }; + resolvedDefaultFeatures = [ "default" "getrandom" ]; + }; "tera" = rec { crateName = "tera"; version = "1.20.1"; From 0e0658f39a3be0385e803010b461f02ce23d91d0 Mon Sep 17 00:00:00 2001 From: xeniape Date: Mon, 23 Mar 2026 15:49:28 +0100 Subject: [PATCH 06/30] adjustments after main merge --- rust/stackable-cockpit/src/platform/demo/spec.rs | 7 +++---- rust/stackable-cockpit/src/platform/manifests.rs | 8 +------- rust/stackable-cockpit/src/platform/stack/spec.rs | 9 +++++---- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/rust/stackable-cockpit/src/platform/demo/spec.rs b/rust/stackable-cockpit/src/platform/demo/spec.rs index 7e816cd5..c2e348e6 100644 --- a/rust/stackable-cockpit/src/platform/demo/spec.rs +++ b/rust/stackable-cockpit/src/platform/demo/spec.rs @@ -313,15 +313,14 @@ impl DemoSpec { .into_params(&self.parameters) .context(ParseParametersSnafu)?; - // We add the DEMO parameter, so that demos can use that to render e.g. the demo label - parameters.insert("DEMO".to_owned(), install_parameters.demo_name.clone()); + // We add the STACK and DEMO parameter, so that demos can use that to render e.g. the demo label + parameters.insert("STACK".to_owned(), install_parameters.stack_name); + parameters.insert("DEMO".to_owned(), install_parameters.demo_name); Self::install_manifests( &self.manifests, ¶meters, &install_parameters.demo_namespace, - &install_parameters.stack_name, - Some(&install_parameters.demo_name), install_parameters.labels, client, transfer_client, diff --git a/rust/stackable-cockpit/src/platform/manifests.rs b/rust/stackable-cockpit/src/platform/manifests.rs index b00a13b2..62cae9b3 100644 --- a/rust/stackable-cockpit/src/platform/manifests.rs +++ b/rust/stackable-cockpit/src/platform/manifests.rs @@ -73,13 +73,11 @@ pub enum Error { pub trait InstallManifestsExt { // TODO (Techassi): This step shouldn't care about templating the manifests nor fetching them from remote #[instrument(skip_all, fields(%namespace, indicatif.pb_show = true))] - #[allow(clippy::too_many_arguments, async_fn_in_trait)] + #[allow(async_fn_in_trait)] async fn install_manifests( manifests: &[ManifestSpec], parameters: &HashMap, namespace: &str, - stack_name: &str, - demo_name: Option<&str>, labels: Labels, client: &Client, transfer_client: &xfer::Client, @@ -93,10 +91,6 @@ pub trait InstallManifestsExt { // We need some additional templating capabilities, e.g. the namespace, so that stacks/demos // can use that to render e.g. the fqdn service names [which contain the namespace]. parameters.insert("NAMESPACE".to_owned(), namespace.to_owned()); - parameters.insert("STACK".to_owned(), stack_name.into()); - if let Some(demo_name) = demo_name { - parameters.insert("DEMO".to_owned(), demo_name.into()); - } for manifest in manifests { let parameters = parameters.clone(); diff --git a/rust/stackable-cockpit/src/platform/stack/spec.rs b/rust/stackable-cockpit/src/platform/stack/spec.rs index 248f3f75..0929a23f 100644 --- a/rust/stackable-cockpit/src/platform/stack/spec.rs +++ b/rust/stackable-cockpit/src/platform/stack/spec.rs @@ -355,15 +355,16 @@ impl StackSpec { .into_params(&self.parameters) .context(ParseParametersSnafu)?; - // We add the STACK parameter, so that stacks can use that to render e.g. the stack label - parameters.insert("STACK".to_owned(), install_parameters.stack_name.clone()); + // We add the STACK and optionally DEMO parameter, so that stacks can use that to render e.g. the stack label + parameters.insert("STACK".to_owned(), install_parameters.stack_name); + if let Some(demo_name) = install_parameters.demo_name { + parameters.insert("DEMO".to_owned(), demo_name); + } Self::install_manifests( &self.manifests, ¶meters, &install_parameters.stack_namespace, - &install_parameters.stack_name, - install_parameters.demo_name.as_deref(), install_parameters.labels, client, transfer_client, From 9f9b923538018e27a6b19785db418fef7af409bf Mon Sep 17 00:00:00 2001 From: xeniape Date: Mon, 23 Mar 2026 16:00:13 +0100 Subject: [PATCH 07/30] further uninstall adjustments --- rust/stackable-cockpit/src/platform/demo/spec.rs | 3 ++- rust/stackable-cockpit/src/platform/stack/params.rs | 4 ++++ rust/stackable-cockpit/src/platform/stack/spec.rs | 5 ++++- rust/stackablectl/src/cmds/stack.rs | 2 ++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/rust/stackable-cockpit/src/platform/demo/spec.rs b/rust/stackable-cockpit/src/platform/demo/spec.rs index c2e348e6..153a03bd 100644 --- a/rust/stackable-cockpit/src/platform/demo/spec.rs +++ b/rust/stackable-cockpit/src/platform/demo/spec.rs @@ -224,8 +224,9 @@ impl DemoSpec { .into_params(stack.parameters.clone()) .context(ParseParametersSnafu)?; - // We add the STACK parameter, so that stacks can use that to render e.g. the stack label + // We add the STACK and DEMO parameter, so that stacks can use that to render e.g. the stack label stack_parameters.insert("STACK".to_owned(), self.stack.clone()); + stack_parameters.insert("DEMO".to_owned(), uninstall_parameters.demo_name.clone()); Self::uninstall_helm_manifests( &stack.manifests, diff --git a/rust/stackable-cockpit/src/platform/stack/params.rs b/rust/stackable-cockpit/src/platform/stack/params.rs index 4f2247db..5e89ef34 100644 --- a/rust/stackable-cockpit/src/platform/stack/params.rs +++ b/rust/stackable-cockpit/src/platform/stack/params.rs @@ -25,6 +25,10 @@ pub struct StackInstallParameters { pub struct StackUninstallParameters { pub stack_name: String, + /// Optional name of the demo, which is only present in case this stack is uninstalled as part of + /// a demo. This is unset in case a stack is uninstalled directly. + pub demo_name: Option, + pub operator_namespace: String, pub stack_namespace: String, diff --git a/rust/stackable-cockpit/src/platform/stack/spec.rs b/rust/stackable-cockpit/src/platform/stack/spec.rs index 0929a23f..38e67f28 100644 --- a/rust/stackable-cockpit/src/platform/stack/spec.rs +++ b/rust/stackable-cockpit/src/platform/stack/spec.rs @@ -220,8 +220,11 @@ impl StackSpec { .into_params(self.parameters.clone()) .context(ParseParametersSnafu)?; - // We add the STACK parameter, so that stacks can use that to render e.g. the stack label + // We add the STACK and optionally DEMO parameter, so that stacks can use that to render e.g. the stack label parameters.insert("STACK".to_owned(), uninstall_parameters.stack_name.clone()); + if let Some(demo_name) = uninstall_parameters.demo_name { + parameters.insert("DEMO".to_owned(), demo_name); + } Self::uninstall_helm_manifests( &self.manifests, diff --git a/rust/stackablectl/src/cmds/stack.rs b/rust/stackablectl/src/cmds/stack.rs index 53fec484..ee75dbc2 100644 --- a/rust/stackablectl/src/cmds/stack.rs +++ b/rust/stackablectl/src/cmds/stack.rs @@ -497,6 +497,8 @@ async fn uninstall_cmd( release_list, StackUninstallParameters { stack_name: args.stack_name.clone(), + // There is no demo when uninstalling only a stack + demo_name: None, operator_namespace: args.namespaces.operator_namespace.clone(), stack_namespace: args.namespaces.namespace.clone(), skip_operators: args.skip_operators_and_crds, From 7da2228fef2419b4a8dbd4486a86015544796786 Mon Sep 17 00:00:00 2001 From: xeniape Date: Mon, 23 Mar 2026 19:30:05 +0100 Subject: [PATCH 08/30] small word fix --- rust/stackablectl/src/cmds/demo.rs | 2 +- rust/stackablectl/src/cmds/stack.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/stackablectl/src/cmds/demo.rs b/rust/stackablectl/src/cmds/demo.rs index f5da47ec..35afeaee 100644 --- a/rust/stackablectl/src/cmds/demo.rs +++ b/rust/stackablectl/src/cmds/demo.rs @@ -419,7 +419,7 @@ async fn install_cmd( if Confirm::new() .with_prompt( format!( - "Demos installed in the '{DEFAULT_NAMESPACE}' namespace cannot be deleted with stackablectl. Install the demo in the '{demo_namespace}' namespace instead?", + "Demos installed in the '{DEFAULT_NAMESPACE}' namespace cannot be uninstalled with stackablectl. Install the demo in the '{demo_namespace}' namespace instead?", demo_namespace = args.demo_name.clone()) ) .default(true) diff --git a/rust/stackablectl/src/cmds/stack.rs b/rust/stackablectl/src/cmds/stack.rs index ee75dbc2..a3958e7b 100644 --- a/rust/stackablectl/src/cmds/stack.rs +++ b/rust/stackablectl/src/cmds/stack.rs @@ -394,7 +394,7 @@ async fn install_cmd( if Confirm::new() .with_prompt( format!( - "Stacks installed in the '{DEFAULT_NAMESPACE}' namespace cannot be deleted with stackablectl. Install the stack in the '{stack_namespace}' namespace instead?", + "Stacks installed in the '{DEFAULT_NAMESPACE}' namespace cannot be uninstalled with stackablectl. Install the stack in the '{stack_namespace}' namespace instead?", stack_namespace = args.stack_name.clone()) ) .default(true) From 70fd483a7d60a94464496cb5bfc399830021f5d3 Mon Sep 17 00:00:00 2001 From: xeniape Date: Tue, 24 Mar 2026 11:15:22 +0100 Subject: [PATCH 09/30] cargo update --- Cargo.lock | 90 ++++++++++++++++++++------------- Cargo.nix | 142 ++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 154 insertions(+), 78 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dbaab950..bbc135e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -194,9 +194,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.16.1" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bffc006df10ac2a68c83692d734a465f8ee6c5b384d8545a636f81d858f4bf" +checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" dependencies = [ "aws-lc-sys", "zeroize", @@ -204,9 +204,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4321e568ed89bb5a7d291a7f37997c2c0df89809d7b6d12062c81ddb54aa782e" +checksum = "1fa7e52a4c5c547c741610a2c6f123f3881e409b714cd27e6798ef020c514f0a" dependencies = [ "cc", "cmake", @@ -1770,9 +1770,9 @@ checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +checksum = "d8e7418f59cc01c88316161279a7f665217ae316b388e58a0d10e29f54f1e5eb" dependencies = [ "memchr", "serde", @@ -1804,9 +1804,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "java-properties" @@ -1869,7 +1869,7 @@ dependencies = [ "cesu8", "cfg-if", "combine", - "jni-sys", + "jni-sys 0.3.1", "log", "thiserror 1.0.69", "walkdir", @@ -1878,9 +1878,31 @@ dependencies = [ [[package]] name = "jni-sys" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] [[package]] name = "jobserver" @@ -2309,9 +2331,9 @@ dependencies = [ [[package]] name = "opentelemetry-otlp" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2366db2dca4d2ad033cad11e6ee42844fd727007af5ad04a1730f4cb8163bf" +checksum = "1f69cd6acbb9af919df949cd1ec9e5e7fdc2ef15d234b6b795aaa525cc02f71f" dependencies = [ "http", "opentelemetry", @@ -3166,9 +3188,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.9" +version = "0.103.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" dependencies = [ "aws-lc-rs", "ring", @@ -3357,9 +3379,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +checksum = "876ac351060d4f882bb1032b6369eb0aef79ad9df1ea8bc404874d8cc3d0cd98" dependencies = [ "serde_core", ] @@ -3853,12 +3875,12 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.23.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.2", "once_cell", "rustix", "windows-sys 0.61.2", @@ -4077,9 +4099,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.0.7+spec-1.1.0" +version = "1.1.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd28d57d8a6f6e458bc0b8784f8fdcc4b99a437936056fa122cb234f18656a96" +checksum = "f8195ca05e4eb728f4ba94f3e3291661320af739c4e43779cbdfae82ab239fcc" dependencies = [ "indexmap", "serde_core", @@ -4092,18 +4114,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.0.1+spec-1.1.0" +version = "1.1.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9" +checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.25.5+spec-1.1.0" +version = "0.25.8+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca1a40644a28bce036923f6a431df0b34236949d111cc07cb6dca830c9ef2e1" +checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" dependencies = [ "indexmap", "toml_datetime", @@ -4113,18 +4135,18 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.10+spec-1.1.0" +version = "1.1.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" +checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" dependencies = [ "winnow", ] [[package]] name = "toml_writer" -version = "1.0.7+spec-1.1.0" +version = "1.1.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17aaa1c6e3dc22b1da4b6bba97d066e354c7945cac2f7852d4e4e7ca7a6b56d" +checksum = "d282ade6016312faf3e41e57ebbba0c073e4056dab1232ab1cb624199648f8ed" [[package]] name = "tonic" @@ -5183,18 +5205,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.42" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" +checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.42" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" +checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.nix b/Cargo.nix index 48b92da0..1968492a 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -600,10 +600,10 @@ rec { }; "aws-lc-rs" = rec { crateName = "aws-lc-rs"; - version = "1.16.1"; + version = "1.16.2"; edition = "2021"; - links = "aws_lc_rs_1_16_1_sys"; - sha256 = "1gzlb3c82vv3b9adi15kqpk8wps699rjssc3ijkc42pidl0grgwl"; + links = "aws_lc_rs_1_16_2_sys"; + sha256 = "1z6i8qs0xjnzvslxnkhvywzzwfkafb1s4nrpg3f2k1nii4i92m50"; libName = "aws_lc_rs"; authors = [ "AWS-LibCrypto" @@ -635,10 +635,10 @@ rec { }; "aws-lc-sys" = rec { crateName = "aws-lc-sys"; - version = "0.38.0"; + version = "0.39.0"; edition = "2021"; - links = "aws_lc_0_38_0"; - sha256 = "0bkqm9adn7f8c8hd3dnp16cgh39cgjckfzqs55ymmfw9xmlfa8a3"; + links = "aws_lc_0_39_0"; + sha256 = "02jga4605vwqcxzd4k3ikd01x27k4gqwd8hh2rs7qm2w9hmfb9qz"; build = "builder/main.rs"; libName = "aws_lc_sys"; authors = [ @@ -666,6 +666,7 @@ rec { features = { "bindgen" = [ "dep:bindgen" ]; "default" = [ "all-bindings" ]; + "fips" = [ "dep:bindgen" ]; "ssl" = [ "bindgen" "all-bindings" ]; }; resolvedDefaultFeatures = [ "prebuilt-nasm" ]; @@ -5629,9 +5630,9 @@ rec { }; "iri-string" = rec { crateName = "iri-string"; - version = "0.7.10"; + version = "0.7.11"; edition = "2021"; - sha256 = "06kk3a5jz576p7vrpf7zz9jv3lrgcyp7pczcblcxdnryg3q3h4y9"; + sha256 = "1sz5y5a9zqhh1n5fb25k2vipl8b5yskpj4hn2s1wh0fcb67l3ryq"; libName = "iri_string"; authors = [ "YOSHIOKA Takuma " @@ -5712,9 +5713,9 @@ rec { }; "itoa" = rec { crateName = "itoa"; - version = "1.0.17"; + version = "1.0.18"; edition = "2021"; - sha256 = "1lh93xydrdn1g9x547bd05g0d3hra7pd1k4jfd2z1pl1h5hwdv4j"; + sha256 = "10jnd1vpfkb8kj38rlkn2a6k02afvj3qmw054dfpzagrpl6achlg"; authors = [ "David Tolnay " ]; @@ -5911,7 +5912,7 @@ rec { } { name = "jni-sys"; - packageId = "jni-sys"; + packageId = "jni-sys 0.3.1"; } { name = "log"; @@ -5940,14 +5941,64 @@ rec { "libloading" = [ "dep:libloading" ]; }; }; - "jni-sys" = rec { + "jni-sys 0.3.1" = rec { crateName = "jni-sys"; - version = "0.3.0"; - edition = "2015"; - sha256 = "0c01zb9ygvwg9wdx2fii2d39myzprnpqqhy7yizxvjqp5p04pbwf"; + version = "0.3.1"; + edition = "2021"; + sha256 = "0n1j8fbz081w1igfrpc79n6vgm7h3ik34nziy5fjgq5nz7hm59j1"; + libName = "jni_sys"; + authors = [ + "Steven Fackler " + ]; + dependencies = [ + { + name = "jni-sys"; + packageId = "jni-sys 0.4.1"; + rename = "jni_sys_04"; + } + ]; + features = { + }; + resolvedDefaultFeatures = [ "default" ]; + }; + "jni-sys 0.4.1" = rec { + crateName = "jni-sys"; + version = "0.4.1"; + edition = "2021"; + sha256 = "1wlahx6f2zhczdjqyn8mk7kshb8x5vsd927sn3lvw41rrf47ldy6"; libName = "jni_sys"; authors = [ "Steven Fackler " + "Robert Bragg " + ]; + dependencies = [ + { + name = "jni-sys-macros"; + packageId = "jni-sys-macros"; + } + ]; + + }; + "jni-sys-macros" = rec { + crateName = "jni-sys-macros"; + version = "0.4.1"; + edition = "2021"; + sha256 = "0r32gbabrak15a7p487765b5wc0jcna2yv88mk6m1zjqyi1bkh1q"; + procMacro = true; + libName = "jni_sys_macros"; + authors = [ + "Robert Bragg " + ]; + dependencies = [ + { + name = "quote"; + packageId = "quote"; + } + { + name = "syn"; + packageId = "syn 2.0.117"; + features = [ "full" ]; + } ]; }; @@ -7463,9 +7514,9 @@ rec { }; "opentelemetry-otlp" = rec { crateName = "opentelemetry-otlp"; - version = "0.31.0"; + version = "0.31.1"; edition = "2021"; - sha256 = "1gv3h75z8c0p9b85mbq7f1rgsi18wip1xlfa6g82lkfa5pdnc8vs"; + sha256 = "07zp0b62b9dajnvvcd6j2ppw5zg7wp4ixka9z6fr3bxrrdmcss8z"; libName = "opentelemetry_otlp"; dependencies = [ { @@ -7577,6 +7628,9 @@ rec { "serde_json" = [ "dep:serde_json" ]; "serialize" = [ "serde" "serde_json" ]; "tls" = [ "tonic/tls-ring" ]; + "tls-aws-lc" = [ "tonic/tls-aws-lc" ]; + "tls-provider-agnostic" = [ "tonic/_tls-any" ]; + "tls-ring" = [ "tonic/tls-ring" ]; "tls-roots" = [ "tls" "tonic/tls-native-roots" ]; "tls-webpki-roots" = [ "tls" "tonic/tls-webpki-roots" ]; "tokio" = [ "dep:tokio" ]; @@ -10540,9 +10594,9 @@ rec { }; "rustls-webpki" = rec { crateName = "rustls-webpki"; - version = "0.103.9"; + version = "0.103.10"; edition = "2021"; - sha256 = "0lwg1nnyv7pp2lfwwjhy81bxm233am99jnsp3iymdhd6k8827pyp"; + sha256 = "1vyipcdbazvhl6kyi1m8n0bg98sk25iv12bby2xcly653awb4cyz"; libName = "webpki"; dependencies = [ { @@ -11122,9 +11176,9 @@ rec { }; "serde_spanned" = rec { crateName = "serde_spanned"; - version = "1.0.4"; - edition = "2021"; - sha256 = "0xkp0qdzams5sqwndbw3xrhf4c0bb5r46w2ywkp1aqsdb8ggkfzq"; + version = "1.1.0"; + edition = "2024"; + sha256 = "166ds31qqkc70k28pspiknnpkvqaxdln6aq3n4mqhkqd0r8w6sl7"; dependencies = [ { name = "serde_core"; @@ -12796,9 +12850,9 @@ rec { }; "tempfile" = rec { crateName = "tempfile"; - version = "3.23.0"; + version = "3.27.0"; edition = "2021"; - sha256 = "05igl2gml6z6i2va1bv49f9f1wb3f752c2i63lvlb9s2vxxwfc9d"; + sha256 = "1gblhnyfjsbg9wjg194n89wrzah7jy3yzgnyzhp56f3v9jd7wj9j"; authors = [ "Steven Allen " "The Rust Project Developers" @@ -12812,7 +12866,7 @@ rec { } { name = "getrandom"; - packageId = "getrandom 0.3.4"; + packageId = "getrandom 0.4.2"; optional = true; usesDefaultFeatures = false; target = { target, features }: ((target."unix" or false) || (target."windows" or false) || ("wasi" == target."os" or null)); @@ -13586,9 +13640,9 @@ rec { }; "toml" = rec { crateName = "toml"; - version = "1.0.7+spec-1.1.0"; - edition = "2021"; - sha256 = "15kaclc4y8yb4ahny19ng51rmff4vj7lyy5qq25lavkgi9yxaa6x"; + version = "1.1.0+spec-1.1.0"; + edition = "2024"; + sha256 = "1k4z4fmq5bnzrdwkgr6477vhlck12qly7wwlpbs2idsfbsh5q6gq"; dependencies = [ { name = "indexmap"; @@ -13650,9 +13704,9 @@ rec { }; "toml_datetime" = rec { crateName = "toml_datetime"; - version = "1.0.1+spec-1.1.0"; - edition = "2021"; - sha256 = "1sgk7zc6x187iib7kj1nzn44mp0zrk9hgii69rbar35m3ms0wclv"; + version = "1.1.0+spec-1.1.0"; + edition = "2024"; + sha256 = "13qrb6d5cnsq5gm7b7v081vhddhzx2km51safy1ss0vy65y1l9cp"; dependencies = [ { name = "serde_core"; @@ -13671,9 +13725,9 @@ rec { }; "toml_edit" = rec { crateName = "toml_edit"; - version = "0.25.5+spec-1.1.0"; - edition = "2021"; - sha256 = "1qgjkq687jkdrc3wq4fi95lj6d0bvwqs9xi3d41wx2x28h3a98cc"; + version = "0.25.8+spec-1.1.0"; + edition = "2024"; + sha256 = "0g0zdxh1wawc0v3hch7lpli2admvsww6hzk4y2gpzi463n7z7gqn"; dependencies = [ { name = "indexmap"; @@ -13706,9 +13760,9 @@ rec { }; "toml_parser" = rec { crateName = "toml_parser"; - version = "1.0.10+spec-1.1.0"; - edition = "2021"; - sha256 = "081lsv63zphnff9ssb0yjavcc82sblvj808rvwb4h76kxx5mpwkx"; + version = "1.1.0+spec-1.1.0"; + edition = "2024"; + sha256 = "04a0pfm9hp18mhk2lrm85fkia5ya2f5grf7r9nq7wq33wcgg2d13"; dependencies = [ { name = "winnow"; @@ -13726,9 +13780,9 @@ rec { }; "toml_writer" = rec { crateName = "toml_writer"; - version = "1.0.7+spec-1.1.0"; - edition = "2021"; - sha256 = "0vdmlskpqkjf5n2zghna8mwlqdbf0ryskfxnlhfjphixdqfalypi"; + version = "1.1.0+spec-1.1.0"; + edition = "2024"; + sha256 = "1vgq92b1j95n3jmk44mbdl2y8wy0l2xynmqywkrzl4k307kav0nj"; features = { "default" = [ "std" ]; "std" = [ "alloc" ]; @@ -18356,9 +18410,9 @@ rec { }; "zerocopy" = rec { crateName = "zerocopy"; - version = "0.8.42"; + version = "0.8.47"; edition = "2021"; - sha256 = "1qq50mj06rds2iac197kpkdlvgql1j3vvm82gy5qayladxqqnmzj"; + sha256 = "11zdl3708210fsiax93qbvw8kiadg9lnzriw26xg44g35c32mfzg"; authors = [ "Joshua Liebow-Feeser " "Jack Wrenn " @@ -18392,9 +18446,9 @@ rec { }; "zerocopy-derive" = rec { crateName = "zerocopy-derive"; - version = "0.8.42"; + version = "0.8.47"; edition = "2021"; - sha256 = "0bx010zlchg4y8xixvkb4c74634j7ypnbpl7cqjdcfsdxacc0v3y"; + sha256 = "12dbrk2w8mszdq9v01ls930bi446iyk4llggxrx8whalkckcg2qf"; procMacro = true; libName = "zerocopy_derive"; authors = [ From c187cffe1ea0784c57ab7fe0925e0a3bde9320e3 Mon Sep 17 00:00:00 2001 From: xeniape Date: Tue, 24 Mar 2026 14:21:14 +0100 Subject: [PATCH 10/30] add documentation --- .../stackablectl/pages/commands/demo.adoc | 29 ++++++++++++++- .../stackablectl/pages/commands/stack.adoc | 36 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/docs/modules/stackablectl/pages/commands/demo.adoc b/docs/modules/stackablectl/pages/commands/demo.adoc index 074cd0cd..e5b66450 100644 --- a/docs/modules/stackablectl/pages/commands/demo.adoc +++ b/docs/modules/stackablectl/pages/commands/demo.adoc @@ -159,4 +159,31 @@ $ stackablectl stacklets list == Uninstalling a Demo -Currently, there is no support for uninstalling a demo again. However, this functionality will come soon. +To uninstall a demo, you can run the following command, specifying the namespace the demo was installed in. + +[source,console] +---- +$ stackablectl demo uninstall trino-taxi-data -n + +---- + +[NOTE] +==== +The uninstall command deletes the namespace the demo was installed in. Therefore it is not possible to uninstall demos in the `default` namespace. +==== + +[WARNING] +==== +Currently, some resources deployed by the demo are either still lingering after the deletion process or need to be deleted before running the uninstall command. + +* All demos + ** MutatingWebhookConfiguration `restarter-sts-enricher.stackable.tech` is not deleted +* end-to-end-security, argo-cd-git-ops, hbase-hdfs-load-cycling-data, jupyterhub-pyspark-hdfs-anomaly-detection-taxi-data + ** ClusterroleBinding `hdfs-clusterrolebinding-nodes` is not deleted +* argo-cd-git-ops + ** Delete the ArgoCD Applications `airflow`, `airflow-postgres`, `minio`, and `sealed-secrets` + ** Then you can delete the namespaces `stackable-airflow`, `minio`, and `sealed-secrets` + ** Delete the ArgoCD ApplicationSet `stackable-operators` and wait for ArgoCD to delete the Applications of that ApplicationSet + ** Only after deleting the above, run the `stackablectl demo uninstall` command, otherwise the deletion might get stuck + ** `*.argoproj.io` CRDs and `sealedsecrets.bitnami.com` CRD are not deleted +==== diff --git a/docs/modules/stackablectl/pages/commands/stack.adoc b/docs/modules/stackablectl/pages/commands/stack.adoc index 27c9049b..ccbface6 100644 --- a/docs/modules/stackablectl/pages/commands/stack.adoc +++ b/docs/modules/stackablectl/pages/commands/stack.adoc @@ -89,3 +89,39 @@ Installed stack logging Use "stackablectl operator installed" to display the installed operators Use "stackablectl stacklet list" to display the installed stacklets ---- + +== Uninstalling a Stack + +To uninstall a stack, you can run the following command, specifying the namespace the stack was installed in. + +[source,console] +---- +$ stackablectl stack uninstall logging -n + +---- + +[NOTE] +==== +The uninstall command deletes the namespace the stack was installed in. Therefore it is not possible to uninstall stacks in the `default` namespace. +==== + +[WARNING] +==== +Currently, some resources deployed by the stack are either still lingering after the deletion process or need to be deleted before running the uninstall command. + +* All stacks + ** MutatingWebhookConfiguration `restarter-sts-enricher.stackable.tech` is not deleted +* argo-cd-git-ops, hdfs-hbase, jupyterhub-pyspark-hdfs + ** ClusterroleBinding `hdfs-clusterrolebinding-nodes` is not deleted +* argo-cd-git-ops + ** Delete the ArgoCD Applications `airflow`, `airflow-postgres`, `minio`, and `sealed-secrets` + ** Then you can delete the namespaces `stackable-airflow`, `minio`, and `sealed-secrets` + ** Delete the ArgoCD ApplicationSet `stackable-operators` and wait for ArgoCD to delete the Applications of that ApplicationSet + ** Only after deleting the above, run the `stackablectl stack uninstall` command, otherwise the deletion might get stuck + ** `*.argoproj.io` CRDs and `sealedsecrets.bitnami.com` CRD are not deleted +* monitoring + ** `*.monitoring.coreos.com` CRDs are not deleted +* observability + ** Delete OpenTelemetryCollector `otel-collector-grpc-external` and `otel-collector-grpc` + ** Only after deleting the above, run the `stackablectl stack uninstall` command, otherwise the deletion might get stuck +==== From e71437a43e81f089a83c97e6210ea3b071dc82fe Mon Sep 17 00:00:00 2001 From: xeniape Date: Wed, 25 Mar 2026 14:47:10 +0100 Subject: [PATCH 11/30] delete namespace function --- .../src/platform/demo/spec.rs | 21 ++----------------- .../src/platform/stack/spec.rs | 21 ++----------------- .../stackable-cockpit/src/utils/k8s/client.rs | 14 +++++++++++++ 3 files changed, 18 insertions(+), 38 deletions(-) diff --git a/rust/stackable-cockpit/src/platform/demo/spec.rs b/rust/stackable-cockpit/src/platform/demo/spec.rs index 153a03bd..90c1562b 100644 --- a/rust/stackable-cockpit/src/platform/demo/spec.rs +++ b/rust/stackable-cockpit/src/platform/demo/spec.rs @@ -1,6 +1,5 @@ use serde::{Deserialize, Serialize}; use snafu::{OptionExt, ResultExt, Snafu}; -use stackable_operator::kube::api::{ApiResource, GroupVersionKind}; use tracing::{Span, debug, info, instrument, warn}; use tracing_indicatif::span_ext::IndicatifSpanExt as _; #[cfg(feature = "openapi")] @@ -239,15 +238,7 @@ impl DemoSpec { // Delete demo namespace client - .delete_object( - &uninstall_parameters.demo_namespace, - &ApiResource::from_gvk(&GroupVersionKind { - group: "".to_owned(), - version: "v1".to_owned(), - kind: "Namespace".to_owned(), - }), - None, - ) + .delete_namespace(uninstall_parameters.demo_namespace) .await .context(DeleteObjectSnafu)?; @@ -269,15 +260,7 @@ impl DemoSpec { .context(UninstallReleaseSnafu)?; client - .delete_object( - &uninstall_parameters.operator_namespace, - &ApiResource::from_gvk(&GroupVersionKind { - group: "".to_owned(), - version: "v1".to_owned(), - kind: "Namespace".to_owned(), - }), - None, - ) + .delete_namespace(uninstall_parameters.operator_namespace) .await .context(DeleteObjectSnafu)?; } diff --git a/rust/stackable-cockpit/src/platform/stack/spec.rs b/rust/stackable-cockpit/src/platform/stack/spec.rs index 38e67f28..ce5821d8 100644 --- a/rust/stackable-cockpit/src/platform/stack/spec.rs +++ b/rust/stackable-cockpit/src/platform/stack/spec.rs @@ -1,7 +1,6 @@ use serde::{Deserialize, Serialize}; use serde_yaml::Mapping; use snafu::{OptionExt, ResultExt, Snafu}; -use stackable_operator::kube::api::{ApiResource, GroupVersionKind}; use tracing::{Span, debug, info, instrument, log::warn}; use tracing_indicatif::span_ext::IndicatifSpanExt as _; #[cfg(feature = "openapi")] @@ -237,15 +236,7 @@ impl StackSpec { // Delete stack namespace client - .delete_object( - &uninstall_parameters.stack_namespace, - &ApiResource::from_gvk(&GroupVersionKind { - group: "".to_owned(), - version: "v1".to_owned(), - kind: "Namespace".to_owned(), - }), - None, - ) + .delete_namespace(uninstall_parameters.stack_namespace) .await .context(DeleteObjectSnafu)?; @@ -265,15 +256,7 @@ impl StackSpec { .await?; client - .delete_object( - &uninstall_parameters.operator_namespace, - &ApiResource::from_gvk(&GroupVersionKind { - group: "".to_owned(), - version: "v1".to_owned(), - kind: "Namespace".to_owned(), - }), - None, - ) + .delete_namespace(uninstall_parameters.operator_namespace) .await .context(DeleteObjectSnafu)?; } diff --git a/rust/stackable-cockpit/src/utils/k8s/client.rs b/rust/stackable-cockpit/src/utils/k8s/client.rs index 330f293b..c75300ba 100644 --- a/rust/stackable-cockpit/src/utils/k8s/client.rs +++ b/rust/stackable-cockpit/src/utils/k8s/client.rs @@ -601,6 +601,20 @@ impl Client { Ok(()) } + /// Deletes a [`Namespace`] with `name` in the cluster. + pub async fn delete_namespace(&self, name: String) -> Result<()> { + self.delete_object( + &name, + &ApiResource::from_gvk(&GroupVersionKind { + group: "".to_owned(), + version: "v1".to_owned(), + kind: "Namespace".to_owned(), + }), + None, + ) + .await + } + /// Creates a [`Namespace`] only if not already present in the current cluster. pub async fn create_namespace_if_needed(&self, name: String) -> Result<()> { if self.get_namespace(&name).await?.is_none() { From 4d1ff73659e054c07a72e7780d86d224f774c1fe Mon Sep 17 00:00:00 2001 From: xeniape Date: Wed, 25 Mar 2026 15:12:18 +0100 Subject: [PATCH 12/30] use Label struct for label --- rust/stackable-cockpit/src/platform/demo/spec.rs | 8 ++++++-- rust/stackable-cockpit/src/platform/stack/spec.rs | 8 ++++++-- rust/stackable-cockpit/src/utils/k8s/client.rs | 9 ++++----- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/rust/stackable-cockpit/src/platform/demo/spec.rs b/rust/stackable-cockpit/src/platform/demo/spec.rs index 90c1562b..fbed97e6 100644 --- a/rust/stackable-cockpit/src/platform/demo/spec.rs +++ b/rust/stackable-cockpit/src/platform/demo/spec.rs @@ -1,5 +1,6 @@ use serde::{Deserialize, Serialize}; use snafu::{OptionExt, ResultExt, Snafu}; +use stackable_operator::kvp::{Label, LabelError}; use tracing::{Span, debug, info, instrument, warn}; use tracing_indicatif::span_ext::IndicatifSpanExt as _; #[cfg(feature = "openapi")] @@ -59,6 +60,9 @@ pub enum Error { #[snafu(display("failed to delete object"))] DeleteObject { source: k8s::Error }, + + #[snafu(display("failed to build label"))] + BuildLabel { source: LabelError }, } impl InstallManifestsExt for DemoSpec {} @@ -245,8 +249,8 @@ impl DemoSpec { // Delete remaining objects not namespace scoped client .delete_all_objects_with_label( - "stackable.tech/demo", - &uninstall_parameters.demo_name, + Label::try_from(("stackable.tech/demo", &uninstall_parameters.demo_name)) + .context(BuildLabelSnafu)?, None, ) .await diff --git a/rust/stackable-cockpit/src/platform/stack/spec.rs b/rust/stackable-cockpit/src/platform/stack/spec.rs index ce5821d8..e70116a7 100644 --- a/rust/stackable-cockpit/src/platform/stack/spec.rs +++ b/rust/stackable-cockpit/src/platform/stack/spec.rs @@ -1,6 +1,7 @@ use serde::{Deserialize, Serialize}; use serde_yaml::Mapping; use snafu::{OptionExt, ResultExt, Snafu}; +use stackable_operator::kvp::{Label, LabelError}; use tracing::{Span, debug, info, instrument, log::warn}; use tracing_indicatif::span_ext::IndicatifSpanExt as _; #[cfg(feature = "openapi")] @@ -74,6 +75,9 @@ pub enum Error { #[snafu(display("failed to delete object"))] DeleteObject { source: k8s::Error }, + + #[snafu(display("failed to build label"))] + BuildLabel { source: LabelError }, } /// This struct describes a stack with the v2 spec @@ -243,8 +247,8 @@ impl StackSpec { // Delete remaining objects not namespace scoped client .delete_all_objects_with_label( - "stackable.tech/stack", - &uninstall_parameters.stack_name, + Label::try_from(("stackable.tech/stack", &uninstall_parameters.stack_name)) + .context(BuildLabelSnafu)?, None, ) .await diff --git a/rust/stackable-cockpit/src/utils/k8s/client.rs b/rust/stackable-cockpit/src/utils/k8s/client.rs index c75300ba..141fcb3d 100644 --- a/rust/stackable-cockpit/src/utils/k8s/client.rs +++ b/rust/stackable-cockpit/src/utils/k8s/client.rs @@ -18,7 +18,7 @@ use stackable_operator::{ core::{DynamicObject, GroupVersionKind, ObjectList, ObjectMeta, TypeMeta}, discovery::{self, ApiCapabilities, ApiResource, Scope}, }, - kvp::Labels, + kvp::{Label, Labels}, }; use tokio::{ sync::RwLock, @@ -323,8 +323,7 @@ impl Client { /// If no namespace is provided, deletes all clusterwide objects with the given label. pub async fn delete_all_objects_with_label( &self, - label_key: &str, - label_value: &str, + label: Label, namespace: Option<&str>, ) -> Result<(), Error> { let api_resources = self @@ -353,8 +352,8 @@ impl Client { if let Some(objectlist) = objects { for object in objectlist { - if let Some(value) = object.labels().get(label_key) { - if value.eq(label_value) { + if let Some(value) = object.labels().get(&label.key().to_string()) { + if value.eq(&label.value().to_string()) { self.delete_object( &object.metadata.name.unwrap(), &api_resource, From 6d0edefb548f5b286c2aba0442e8f810930574a9 Mon Sep 17 00:00:00 2001 From: xeniape Date: Wed, 25 Mar 2026 15:30:54 +0100 Subject: [PATCH 13/30] rename function --- rust/stackable-cockpit/src/platform/manifests.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rust/stackable-cockpit/src/platform/manifests.rs b/rust/stackable-cockpit/src/platform/manifests.rs index 62cae9b3..e2e1a02b 100644 --- a/rust/stackable-cockpit/src/platform/manifests.rs +++ b/rust/stackable-cockpit/src/platform/manifests.rs @@ -99,7 +99,8 @@ pub trait InstallManifestsExt { ManifestSpec::HelmChart(helm_file) => { debug!(helm_file, "Installing manifest from Helm chart"); - let helm_chart = get_helmchart(helm_file, transfer_client, ¶meters).await?; + let helm_chart = + get_helm_chart(helm_file, transfer_client, ¶meters).await?; info!(helm_chart.name, helm_chart.version, "Installing Helm chart",); @@ -179,7 +180,7 @@ pub trait InstallManifestsExt { ManifestSpec::HelmChart(helm_file) => { debug!(helm_file, "Uninstalling manifest from Helm chart"); - let helm_chart = get_helmchart(helm_file, transfer_client, parameters).await?; + let helm_chart = get_helm_chart(helm_file, transfer_client, parameters).await?; info!( helm_chart.name, @@ -200,7 +201,7 @@ pub trait InstallManifestsExt { } } -pub async fn get_helmchart( +pub async fn get_helm_chart( helm_file: &str, transfer_client: &xfer::Client, parameters: &HashMap, From 2367a889cf8f79fe5c9a9b49a02dc7367f32c741 Mon Sep 17 00:00:00 2001 From: xeniape Date: Wed, 25 Mar 2026 15:36:00 +0100 Subject: [PATCH 14/30] code readability --- rust/stackable-cockpit/src/utils/k8s/client.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/rust/stackable-cockpit/src/utils/k8s/client.rs b/rust/stackable-cockpit/src/utils/k8s/client.rs index 141fcb3d..6aac1fc7 100644 --- a/rust/stackable-cockpit/src/utils/k8s/client.rs +++ b/rust/stackable-cockpit/src/utils/k8s/client.rs @@ -331,11 +331,14 @@ impl Client { .await .into_iter() .filter(|(_, capability)| { - capability.supports_operation(discovery::verbs::LIST) - && match namespace { - Some(_) => capability.scope == kube::discovery::Scope::Namespaced, - None => capability.scope == kube::discovery::Scope::Cluster, - } + let listing_supported = capability.supports_operation(discovery::verbs::LIST); + + let scope_matching = match namespace { + Some(_) => capability.scope == kube::discovery::Scope::Namespaced, + None => capability.scope == kube::discovery::Scope::Cluster, + }; + + listing_supported && scope_matching }); for (api_resource, _) in api_resources { From 1a005268ea043781551ce4a0f78fb1f0ce96744a Mon Sep 17 00:00:00 2001 From: xeniape Date: Wed, 25 Mar 2026 15:41:31 +0100 Subject: [PATCH 15/30] reduce nesting --- .../stackable-cockpit/src/utils/k8s/client.rs | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/rust/stackable-cockpit/src/utils/k8s/client.rs b/rust/stackable-cockpit/src/utils/k8s/client.rs index 6aac1fc7..b0ca69d7 100644 --- a/rust/stackable-cockpit/src/utils/k8s/client.rs +++ b/rust/stackable-cockpit/src/utils/k8s/client.rs @@ -353,17 +353,19 @@ impl Client { ) .await?; - if let Some(objectlist) = objects { - for object in objectlist { - if let Some(value) = object.labels().get(&label.key().to_string()) { - if value.eq(&label.value().to_string()) { - self.delete_object( - &object.metadata.name.unwrap(), - &api_resource, - object.metadata.namespace.as_deref(), - ) - .await?; - } + let Some(object_list) = objects else { + continue; + }; + + for object in object_list { + if let Some(value) = object.labels().get(&label.key().to_string()) { + if value.eq(&label.value().to_string()) { + self.delete_object( + &object.metadata.name.unwrap(), + &api_resource, + object.metadata.namespace.as_deref(), + ) + .await?; } } } From 043f0f19b569d8cec9353092c759cd718cd89767 Mon Sep 17 00:00:00 2001 From: xeniape Date: Thu, 26 Mar 2026 11:34:17 +0100 Subject: [PATCH 16/30] delete object refactoring --- .../stackable-cockpit/src/utils/k8s/client.rs | 73 +++++-------------- 1 file changed, 20 insertions(+), 53 deletions(-) diff --git a/rust/stackable-cockpit/src/utils/k8s/client.rs b/rust/stackable-cockpit/src/utils/k8s/client.rs index b0ca69d7..79f53385 100644 --- a/rust/stackable-cockpit/src/utils/k8s/client.rs +++ b/rust/stackable-cockpit/src/utils/k8s/client.rs @@ -1,6 +1,5 @@ use std::{collections::BTreeMap, string::FromUtf8Error}; -use reqwest::StatusCode; use serde::Deserialize; use snafu::{OptionExt, ResultExt, Snafu}; use stackable_operator::{ @@ -20,10 +19,7 @@ use stackable_operator::{ }, kvp::{Label, Labels}, }; -use tokio::{ - sync::RwLock, - time::{self, sleep}, -}; +use tokio::sync::RwLock; use tracing::{Span, info, instrument}; use tracing_indicatif::{indicatif_eprintln, span_ext::IndicatifSpanExt as _}; @@ -55,7 +51,9 @@ pub enum Error { }, #[snafu(display("failed to delete object"))] - KubeClientDelete { source: kube::error::Error }, + KubeRuntimeDelete { + source: kube::runtime::wait::delete::Error, + }, #[snafu(display("failed to deserialize YAML data"))] DeserializeYaml { source: serde_yaml::Error }, @@ -258,10 +256,13 @@ impl Client { { if crd.spec.group.ends_with(group_suffix) { if let Some(name) = crd.metadata.name { - api_client - .delete(&name, &DeleteParams::default()) - .await - .context(KubeClientDeleteSnafu)?; + kube::runtime::wait::delete::delete_and_finalize( + api_client.clone(), + &name, + &DeleteParams::default(), + ) + .await + .context(KubeRuntimeDeleteSnafu)?; } } } @@ -381,6 +382,8 @@ impl Client { api_resource: &ApiResource, namespace: Option<&str>, ) -> Result<(), Error> { + Span::current().pb_set_message(&format!("Deleting {} {}", api_resource.kind, object_name)); + let object_api = match namespace { Some(namespace) => { Api::::namespaced_with(self.client.clone(), namespace, api_resource) @@ -388,49 +391,13 @@ impl Client { None => Api::::all_with(self.client.clone(), api_resource), }; - let mut delete_request = object_api - .delete(object_name, &DeleteParams::foreground()) - .await; - - // Wait for object to be deleted - // Otherwise might result in race condition scenarios - while let Ok(delete_status) = delete_request { - match delete_status { - // Left side of Either, when deletion is in progress - either::Either::Left(_) => { - Span::current() - .pb_set_message(&format!("Deleting {} {}", api_resource.kind, object_name)); - // Short sleep to reduce number of requests - sleep(time::Duration::from_millis(600)).await; - // Resend request to get deletion status - delete_request = object_api - .delete(object_name, &DeleteParams::foreground()) - .await; - } - // Right side of Either, when deletion is done - either::Either::Right(_) => { - return Ok(()); - } - } - } - - if let Err(error) = delete_request { - match error { - kube::Error::Api(ref error_response) => { - // If object is already deleted/gone, delete operation is done - if error_response.code == StatusCode::NOT_FOUND.as_u16() { - return Ok(()); - } else { - return Err(error).context(KubeClientDeleteSnafu); - } - } - _ => { - return Err(error).context(KubeClientDeleteSnafu); - } - } - } - - Ok(()) + kube::runtime::wait::delete::delete_and_finalize( + object_api, + object_name, + &DeleteParams::foreground(), + ) + .await + .context(KubeRuntimeDeleteSnafu) } /// Lists [`Service`]s by matching labels. The Services can be matched by From 7dfe50e19cedb050f8d73dd73021f9ee32e421bc Mon Sep 17 00:00:00 2001 From: xeniape Date: Thu, 26 Mar 2026 11:38:27 +0100 Subject: [PATCH 17/30] small docs adjustment --- docs/modules/stackablectl/pages/commands/demo.adoc | 2 +- docs/modules/stackablectl/pages/commands/stack.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/modules/stackablectl/pages/commands/demo.adoc b/docs/modules/stackablectl/pages/commands/demo.adoc index e5b66450..330cfe7f 100644 --- a/docs/modules/stackablectl/pages/commands/demo.adoc +++ b/docs/modules/stackablectl/pages/commands/demo.adoc @@ -178,7 +178,7 @@ Currently, some resources deployed by the demo are either still lingering after * All demos ** MutatingWebhookConfiguration `restarter-sts-enricher.stackable.tech` is not deleted -* end-to-end-security, argo-cd-git-ops, hbase-hdfs-load-cycling-data, jupyterhub-pyspark-hdfs-anomaly-detection-taxi-data +* All demos using HDFS ** ClusterroleBinding `hdfs-clusterrolebinding-nodes` is not deleted * argo-cd-git-ops ** Delete the ArgoCD Applications `airflow`, `airflow-postgres`, `minio`, and `sealed-secrets` diff --git a/docs/modules/stackablectl/pages/commands/stack.adoc b/docs/modules/stackablectl/pages/commands/stack.adoc index ccbface6..f5b63c21 100644 --- a/docs/modules/stackablectl/pages/commands/stack.adoc +++ b/docs/modules/stackablectl/pages/commands/stack.adoc @@ -111,7 +111,7 @@ Currently, some resources deployed by the stack are either still lingering after * All stacks ** MutatingWebhookConfiguration `restarter-sts-enricher.stackable.tech` is not deleted -* argo-cd-git-ops, hdfs-hbase, jupyterhub-pyspark-hdfs +* All stacks using HDFS ** ClusterroleBinding `hdfs-clusterrolebinding-nodes` is not deleted * argo-cd-git-ops ** Delete the ArgoCD Applications `airflow`, `airflow-postgres`, `minio`, and `sealed-secrets` From d794c7e4a7243734986b367be4e5de8bee3c81cf Mon Sep 17 00:00:00 2001 From: xeniape Date: Thu, 26 Mar 2026 11:39:43 +0100 Subject: [PATCH 18/30] Revert "small docs adjustment" This reverts commit 7dfe50e19cedb050f8d73dd73021f9ee32e421bc. --- docs/modules/stackablectl/pages/commands/demo.adoc | 2 +- docs/modules/stackablectl/pages/commands/stack.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/modules/stackablectl/pages/commands/demo.adoc b/docs/modules/stackablectl/pages/commands/demo.adoc index 330cfe7f..e5b66450 100644 --- a/docs/modules/stackablectl/pages/commands/demo.adoc +++ b/docs/modules/stackablectl/pages/commands/demo.adoc @@ -178,7 +178,7 @@ Currently, some resources deployed by the demo are either still lingering after * All demos ** MutatingWebhookConfiguration `restarter-sts-enricher.stackable.tech` is not deleted -* All demos using HDFS +* end-to-end-security, argo-cd-git-ops, hbase-hdfs-load-cycling-data, jupyterhub-pyspark-hdfs-anomaly-detection-taxi-data ** ClusterroleBinding `hdfs-clusterrolebinding-nodes` is not deleted * argo-cd-git-ops ** Delete the ArgoCD Applications `airflow`, `airflow-postgres`, `minio`, and `sealed-secrets` diff --git a/docs/modules/stackablectl/pages/commands/stack.adoc b/docs/modules/stackablectl/pages/commands/stack.adoc index f5b63c21..ccbface6 100644 --- a/docs/modules/stackablectl/pages/commands/stack.adoc +++ b/docs/modules/stackablectl/pages/commands/stack.adoc @@ -111,7 +111,7 @@ Currently, some resources deployed by the stack are either still lingering after * All stacks ** MutatingWebhookConfiguration `restarter-sts-enricher.stackable.tech` is not deleted -* All stacks using HDFS +* argo-cd-git-ops, hdfs-hbase, jupyterhub-pyspark-hdfs ** ClusterroleBinding `hdfs-clusterrolebinding-nodes` is not deleted * argo-cd-git-ops ** Delete the ArgoCD Applications `airflow`, `airflow-postgres`, `minio`, and `sealed-secrets` From 5574319c2cb43a5d2723d0c48451a623a9c16a39 Mon Sep 17 00:00:00 2001 From: Xenia Date: Thu, 26 Mar 2026 12:50:54 +0100 Subject: [PATCH 19/30] Update rust/stackablectl/src/cmds/demo.rs Co-authored-by: Techassi --- rust/stackablectl/src/cmds/demo.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/stackablectl/src/cmds/demo.rs b/rust/stackablectl/src/cmds/demo.rs index 35afeaee..44c971b7 100644 --- a/rust/stackablectl/src/cmds/demo.rs +++ b/rust/stackablectl/src/cmds/demo.rs @@ -419,7 +419,7 @@ async fn install_cmd( if Confirm::new() .with_prompt( format!( - "Demos installed in the '{DEFAULT_NAMESPACE}' namespace cannot be uninstalled with stackablectl. Install the demo in the '{demo_namespace}' namespace instead?", + "Demos installed in the {DEFAULT_NAMESPACE:?} namespace cannot be uninstalled with stackablectl. Install the demo in the {demo_namespace:?} namespace instead?", demo_namespace = args.demo_name.clone()) ) .default(true) From 1bc08a251a21f9a5b8e4b7faa470d0e5179a74ea Mon Sep 17 00:00:00 2001 From: xeniape Date: Thu, 26 Mar 2026 12:58:27 +0100 Subject: [PATCH 20/30] stackspec in uninstall refactoring --- rust/stackable-cockpit/src/platform/demo/spec.rs | 9 +++++++-- rust/stackablectl/src/cmds/demo.rs | 10 +--------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/rust/stackable-cockpit/src/platform/demo/spec.rs b/rust/stackable-cockpit/src/platform/demo/spec.rs index fbed97e6..ae38bab6 100644 --- a/rust/stackable-cockpit/src/platform/demo/spec.rs +++ b/rust/stackable-cockpit/src/platform/demo/spec.rs @@ -13,7 +13,7 @@ use crate::{ demo::{DemoInstallParameters, DemoUninstallParameters}, manifests::{self, InstallManifestsExt}, release::ReleaseList, - stack::{self, StackInstallParameters, StackList, StackSpec}, + stack::{self, StackInstallParameters, StackList}, }, utils::{ k8s::{self, Client}, @@ -200,12 +200,17 @@ impl DemoSpec { ))] pub async fn uninstall( &self, + stack_list: StackList, release_list: ReleaseList, uninstall_parameters: DemoUninstallParameters, client: &Client, transfer_client: &xfer::Client, - stack: StackSpec, ) -> Result<(), Error> { + // Get the stack spec based on the name defined in the demo spec + let stack = stack_list.get(&self.stack).context(NoSuchStackSnafu { + name: self.stack.clone(), + })?; + // Uninstall Helm Charts let parameters = &mut Vec::new() .into_params(self.parameters.clone()) diff --git a/rust/stackablectl/src/cmds/demo.rs b/rust/stackablectl/src/cmds/demo.rs index 44c971b7..eda81ccb 100644 --- a/rust/stackablectl/src/cmds/demo.rs +++ b/rust/stackablectl/src/cmds/demo.rs @@ -147,9 +147,6 @@ pub enum CmdError { #[snafu(display("no demo with name {name:?}"))] NoSuchDemo { name: String }, - #[snafu(display("no stack with name {name:?}"))] - NoSuchStack { name: String }, - #[snafu(display("no release {release:?}"))] NoSuchRelease { release: String }, @@ -529,11 +526,6 @@ async fn uninstall_cmd( .await .context(BuildListSnafu)?; - // Get the stack spec based on the name defined in the demo spec - let stack = stack_list.get(&demo.stack).context(NoSuchStackSnafu { - name: demo.stack.clone(), - })?; - let client = Client::new().await.context(KubeClientCreateSnafu)?; let release_files = cli.get_release_files().context(PathOrUrlParseSnafu)?; @@ -542,6 +534,7 @@ async fn uninstall_cmd( .context(BuildListSnafu)?; demo.uninstall( + stack_list, release_list, DemoUninstallParameters { demo_name: args.demo_name.clone(), @@ -552,7 +545,6 @@ async fn uninstall_cmd( }, &client, transfer_client, - stack.to_owned(), ) .await .context(UninstallDemoSnafu { From 0f3cf7f557d651f1d9b1d9f6ee365e6da7ff4499 Mon Sep 17 00:00:00 2001 From: xeniape Date: Thu, 26 Mar 2026 13:53:18 +0100 Subject: [PATCH 21/30] confirm dialog for canceling delete, refactor install confim dialog --- rust/stackablectl/src/cmds/demo.rs | 65 ++++++++++++++++++++--------- rust/stackablectl/src/cmds/stack.rs | 64 ++++++++++++++++++++-------- 2 files changed, 92 insertions(+), 37 deletions(-) diff --git a/rust/stackablectl/src/cmds/demo.rs b/rust/stackablectl/src/cmds/demo.rs index eda81ccb..3329dff6 100644 --- a/rust/stackablectl/src/cmds/demo.rs +++ b/rust/stackablectl/src/cmds/demo.rs @@ -410,10 +410,13 @@ async fn install_cmd( // `stackablectl demo uninstall` relies on namespace deletion, suggest installing in a non-default namespace // It should still be possible to skip that if either uninstall is not needed // or installing an older version of the demo which only supports the 'default' namespace - let demo_namespace = tracing_indicatif::suspend_tracing_indicatif( - || -> Result { - if args.namespaces.namespace == DEFAULT_NAMESPACE { - if Confirm::new() + let demo_namespace; + + if args.namespaces.namespace == DEFAULT_NAMESPACE { + // Ask to install in a non-default namespace, currently suggesting the demo name as namespace name + let use_non_default_namespace = tracing_indicatif::suspend_tracing_indicatif( + || -> Result { + Confirm::new() .with_prompt( format!( "Demos installed in the {DEFAULT_NAMESPACE:?} namespace cannot be uninstalled with stackablectl. Install the demo in the {demo_namespace:?} namespace instead?", @@ -421,18 +424,18 @@ async fn install_cmd( ) .default(true) .interact() - .context(ConfirmDialogSnafu)? { - // User selected to install in suggested namespace - Ok(args.demo_name.clone()) - } else { - // User selected to install in default namespace - Ok(args.namespaces.namespace.clone()) - } - } else { - Ok(args.namespaces.namespace.clone()) - } - }, - )?; + .context(ConfirmDialogSnafu) + }, + )?; + + if use_non_default_namespace { + demo_namespace = args.demo_name.clone(); + } else { + demo_namespace = args.namespaces.namespace.clone(); + } + } else { + demo_namespace = args.namespaces.namespace.clone(); + } let values_file = cli.get_values_file().context(PathOrUrlParseSnafu)?; let operator_values = load_operator_values(values_file.as_ref(), transfer_client) @@ -509,12 +512,36 @@ async fn uninstall_cmd( transfer_client: &xfer::Client, release_branch: &str, ) -> Result { - info!(demo_name = %args.demo_name, "Uninstalling demo"); - Span::current().pb_set_message(&format!("Uninstalling demo {}", args.demo_name)); - // Init result output and progress output let mut output = Cli::result(); + let proceed_with_uninstall = tracing_indicatif::suspend_tracing_indicatif( + || -> Result { + Confirm::new() + .with_prompt( + format!( + "Uninstalling the demo {demo_name:?} will delete the {demo_namespace:?} namespace. This action cannot be undone. Proceed?", + demo_name = args.demo_name.clone(), + demo_namespace = args.namespaces.namespace.clone()) + ) + .default(true) + .interact() + .context(ConfirmDialogSnafu) + }, + )?; + + if !proceed_with_uninstall { + output.with_output(format!( + "Uninstalling demo {demo_name:?} canceled", + demo_name = args.demo_name.clone() + )); + + return Ok(output.render()); + } + + info!(demo_name = %args.demo_name, "Uninstalling demo"); + Span::current().pb_set_message(&format!("Uninstalling demo {}", args.demo_name)); + let demo = list.get(&args.demo_name).ok_or(CmdError::NoSuchDemo { name: args.demo_name.clone(), })?; diff --git a/rust/stackablectl/src/cmds/stack.rs b/rust/stackablectl/src/cmds/stack.rs index a3958e7b..2bd649a3 100644 --- a/rust/stackablectl/src/cmds/stack.rs +++ b/rust/stackablectl/src/cmds/stack.rs @@ -388,29 +388,32 @@ async fn install_cmd( // `stackablectl stack uninstall` relies on namespace deletion, suggest installing in a non-default namespace // It should still be possible to skip that if either uninstall is not needed // or installing an older version of the stack which only supports the 'default' namespace - let stack_namespace = tracing_indicatif::suspend_tracing_indicatif( - || -> Result { - if args.namespaces.namespace == DEFAULT_NAMESPACE { - if Confirm::new() + let stack_namespace; + + if args.namespaces.namespace == DEFAULT_NAMESPACE { + // Ask to install in a non-default namespace, currently suggesting the stack name as namespace name + let use_non_default_namespace = tracing_indicatif::suspend_tracing_indicatif( + || -> Result { + Confirm::new() .with_prompt( format!( - "Stacks installed in the '{DEFAULT_NAMESPACE}' namespace cannot be uninstalled with stackablectl. Install the stack in the '{stack_namespace}' namespace instead?", + "Stacks installed in the {DEFAULT_NAMESPACE:?} namespace cannot be uninstalled with stackablectl. Install the stack in the {stack_namespace:?} namespace instead?", stack_namespace = args.stack_name.clone()) ) .default(true) .interact() - .context(ConfirmDialogSnafu)? { - // User selected to install in suggested namespace - Ok(args.stack_name.clone()) - } else { - // User selected to install in default namespace - Ok(args.namespaces.namespace.clone()) - } - } else { - Ok(args.namespaces.namespace.clone()) - } - }, - )?; + .context(ConfirmDialogSnafu) + }, + )?; + + if use_non_default_namespace { + stack_namespace = args.stack_name.clone(); + } else { + stack_namespace = args.namespaces.namespace.clone(); + } + } else { + stack_namespace = args.namespaces.namespace.clone(); + } let values_file = cli.get_values_file().context(PathOrUrlParseSnafu)?; let operator_values = load_operator_values(values_file.as_ref(), transfer_client) @@ -479,12 +482,37 @@ async fn uninstall_cmd( stack_list: stack::StackList, transfer_client: &xfer::Client, ) -> Result { + let mut output = Cli::result(); + + let proceed_with_uninstall = tracing_indicatif::suspend_tracing_indicatif( + || -> Result { + Confirm::new() + .with_prompt( + format!( + "Uninstalling the stack {stack_name:?} will delete the {stack_namespace:?} namespace. This action cannot be undone. Proceed?", + stack_name = args.stack_name.clone(), + stack_namespace = args.namespaces.namespace.clone()) + ) + .default(true) + .interact() + .context(ConfirmDialogSnafu) + }, + )?; + + if !proceed_with_uninstall { + output.with_output(format!( + "Uninstalling stack {stack_name:?} canceled", + stack_name = args.stack_name.clone() + )); + + return Ok(output.render()); + } + info!(stack_name = %args.stack_name, "Uninstalling stack"); Span::current().pb_set_message(&format!("Uninstalling stack {}", args.stack_name)); match stack_list.get(&args.stack_name) { Some(stack) => { - let mut output = Cli::result(); let client = Client::new().await.context(KubeClientCreateSnafu)?; let files = cli.get_release_files().context(PathOrUrlParseSnafu)?; From 506fbcf8446671fb8121e91d2f60c1d152097480 Mon Sep 17 00:00:00 2001 From: xeniape Date: Mon, 30 Mar 2026 14:13:54 +0200 Subject: [PATCH 22/30] function comment for helm uninstall --- rust/stackable-cockpit/src/platform/manifests.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rust/stackable-cockpit/src/platform/manifests.rs b/rust/stackable-cockpit/src/platform/manifests.rs index e2e1a02b..6e5dd45d 100644 --- a/rust/stackable-cockpit/src/platform/manifests.rs +++ b/rust/stackable-cockpit/src/platform/manifests.rs @@ -160,6 +160,9 @@ pub trait InstallManifestsExt { Ok(()) } + /// This function only handles uninstalling Helm Charts + /// + /// To delete objects installed through other manifests use [`Client::delete_namespace`] or [`Client::delete_all_objects_with_label`] instead. #[instrument(skip_all, fields(%namespace, indicatif.pb_show = true))] #[allow(async_fn_in_trait)] async fn uninstall_helm_manifests( @@ -193,7 +196,9 @@ pub trait InstallManifestsExt { }, )?; } - ManifestSpec::PlainYaml(_) => {} + ManifestSpec::PlainYaml(_) => { + // This function only handles uninstalling Helm Charts + } } } From a6e2febe025c480e1040ec3ea48b3a1ef5c57bba Mon Sep 17 00:00:00 2001 From: xeniape Date: Mon, 30 Mar 2026 14:20:19 +0200 Subject: [PATCH 23/30] rename variable --- rust/stackable-cockpit/src/utils/k8s/client.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/stackable-cockpit/src/utils/k8s/client.rs b/rust/stackable-cockpit/src/utils/k8s/client.rs index 79f53385..e4ec0619 100644 --- a/rust/stackable-cockpit/src/utils/k8s/client.rs +++ b/rust/stackable-cockpit/src/utils/k8s/client.rs @@ -334,12 +334,12 @@ impl Client { .filter(|(_, capability)| { let listing_supported = capability.supports_operation(discovery::verbs::LIST); - let scope_matching = match namespace { + let capability_scope_matches = match namespace { Some(_) => capability.scope == kube::discovery::Scope::Namespaced, None => capability.scope == kube::discovery::Scope::Cluster, }; - listing_supported && scope_matching + listing_supported && capability_scope_matches }); for (api_resource, _) in api_resources { From 18e7f70d9b70c11c265327734d96a274acc5594a Mon Sep 17 00:00:00 2001 From: xeniape Date: Mon, 30 Mar 2026 15:19:13 +0200 Subject: [PATCH 24/30] refactor namespace confirmation --- rust/stackablectl/src/cmds/demo.rs | 31 +++++++++++++++-------------- rust/stackablectl/src/cmds/stack.rs | 28 ++++++++++++++------------ 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/rust/stackablectl/src/cmds/demo.rs b/rust/stackablectl/src/cmds/demo.rs index 3329dff6..d4a824a3 100644 --- a/rust/stackablectl/src/cmds/demo.rs +++ b/rust/stackablectl/src/cmds/demo.rs @@ -410,23 +410,23 @@ async fn install_cmd( // `stackablectl demo uninstall` relies on namespace deletion, suggest installing in a non-default namespace // It should still be possible to skip that if either uninstall is not needed // or installing an older version of the demo which only supports the 'default' namespace - let demo_namespace; + let non_default_namespace_confirmation = || -> Result { + // Ask to install in a non-default namespace, currently suggesting the demo name as namespace name + Confirm::new() + .with_prompt( + format!( + "Demos installed in the {DEFAULT_NAMESPACE:?} namespace cannot be uninstalled with stackablectl. Install the demo in the {demo_namespace:?} namespace instead?", + demo_namespace = args.demo_name.clone()) + ) + .default(true) + .interact() + .context(ConfirmDialogSnafu) + }; + let demo_namespace; if args.namespaces.namespace == DEFAULT_NAMESPACE { - // Ask to install in a non-default namespace, currently suggesting the demo name as namespace name - let use_non_default_namespace = tracing_indicatif::suspend_tracing_indicatif( - || -> Result { - Confirm::new() - .with_prompt( - format!( - "Demos installed in the {DEFAULT_NAMESPACE:?} namespace cannot be uninstalled with stackablectl. Install the demo in the {demo_namespace:?} namespace instead?", - demo_namespace = args.demo_name.clone()) - ) - .default(true) - .interact() - .context(ConfirmDialogSnafu) - }, - )?; + let use_non_default_namespace = + tracing_indicatif::suspend_tracing_indicatif(non_default_namespace_confirmation)?; if use_non_default_namespace { demo_namespace = args.demo_name.clone(); @@ -434,6 +434,7 @@ async fn install_cmd( demo_namespace = args.namespaces.namespace.clone(); } } else { + // User provided a non-default namespace with command argument demo_namespace = args.namespaces.namespace.clone(); } diff --git a/rust/stackablectl/src/cmds/stack.rs b/rust/stackablectl/src/cmds/stack.rs index 2bd649a3..40c59478 100644 --- a/rust/stackablectl/src/cmds/stack.rs +++ b/rust/stackablectl/src/cmds/stack.rs @@ -388,22 +388,23 @@ async fn install_cmd( // `stackablectl stack uninstall` relies on namespace deletion, suggest installing in a non-default namespace // It should still be possible to skip that if either uninstall is not needed // or installing an older version of the stack which only supports the 'default' namespace - let stack_namespace; + let non_default_namespace_confirmation = || -> Result { + // Ask to install in a non-default namespace, currently suggesting the stack name as namespace name + Confirm::new() + .with_prompt( + format!( + "Stacks installed in the {DEFAULT_NAMESPACE:?} namespace cannot be uninstalled with stackablectl. Install the stack in the {stack_namespace:?} namespace instead?", + stack_namespace = args.stack_name.clone()) + ) + .default(true) + .interact() + .context(ConfirmDialogSnafu) + }; + let stack_namespace; if args.namespaces.namespace == DEFAULT_NAMESPACE { - // Ask to install in a non-default namespace, currently suggesting the stack name as namespace name let use_non_default_namespace = tracing_indicatif::suspend_tracing_indicatif( - || -> Result { - Confirm::new() - .with_prompt( - format!( - "Stacks installed in the {DEFAULT_NAMESPACE:?} namespace cannot be uninstalled with stackablectl. Install the stack in the {stack_namespace:?} namespace instead?", - stack_namespace = args.stack_name.clone()) - ) - .default(true) - .interact() - .context(ConfirmDialogSnafu) - }, + non_default_namespace_confirmation, )?; if use_non_default_namespace { @@ -412,6 +413,7 @@ async fn install_cmd( stack_namespace = args.namespaces.namespace.clone(); } } else { + // User provided a non-default namespace with command argument stack_namespace = args.namespaces.namespace.clone(); } From ad7dd15154661713698f4b58e80a5b31f5438bc2 Mon Sep 17 00:00:00 2001 From: xeniape Date: Mon, 30 Mar 2026 15:30:05 +0200 Subject: [PATCH 25/30] add stack parameter on demo uninstall --- rust/stackable-cockpit/src/platform/demo/spec.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rust/stackable-cockpit/src/platform/demo/spec.rs b/rust/stackable-cockpit/src/platform/demo/spec.rs index ae38bab6..e8d7fc72 100644 --- a/rust/stackable-cockpit/src/platform/demo/spec.rs +++ b/rust/stackable-cockpit/src/platform/demo/spec.rs @@ -216,7 +216,8 @@ impl DemoSpec { .into_params(self.parameters.clone()) .context(ParseParametersSnafu)?; - // We add the DEMO parameter, so that demos can use that to render e.g. the demo label + // We add the STACK and DEMO parameter, so that demos can use that to render e.g. the demo label + parameters.insert("STACK".to_owned(), self.stack.clone()); parameters.insert("DEMO".to_owned(), uninstall_parameters.demo_name.clone()); Self::uninstall_helm_manifests( From ba64478210b2b6a7f9a4d9d1625fb397df00d79e Mon Sep 17 00:00:00 2001 From: Xenia Date: Mon, 30 Mar 2026 16:34:04 +0200 Subject: [PATCH 26/30] Update rust/stackable-cockpit/src/utils/k8s/client.rs Co-authored-by: Techassi --- rust/stackable-cockpit/src/utils/k8s/client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/stackable-cockpit/src/utils/k8s/client.rs b/rust/stackable-cockpit/src/utils/k8s/client.rs index e4ec0619..1d713c2f 100644 --- a/rust/stackable-cockpit/src/utils/k8s/client.rs +++ b/rust/stackable-cockpit/src/utils/k8s/client.rs @@ -360,7 +360,7 @@ impl Client { for object in object_list { if let Some(value) = object.labels().get(&label.key().to_string()) { - if value.eq(&label.value().to_string()) { + if value.eq(label.value().deref()) { self.delete_object( &object.metadata.name.unwrap(), &api_resource, From a2fbb1cbef7e098f8d7a8a7febca4e415456e5f8 Mon Sep 17 00:00:00 2001 From: xeniape Date: Mon, 30 Mar 2026 16:37:49 +0200 Subject: [PATCH 27/30] import deref --- rust/stackable-cockpit/src/utils/k8s/client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/stackable-cockpit/src/utils/k8s/client.rs b/rust/stackable-cockpit/src/utils/k8s/client.rs index 1d713c2f..3257a9a5 100644 --- a/rust/stackable-cockpit/src/utils/k8s/client.rs +++ b/rust/stackable-cockpit/src/utils/k8s/client.rs @@ -1,4 +1,4 @@ -use std::{collections::BTreeMap, string::FromUtf8Error}; +use std::{collections::BTreeMap, ops::Deref, string::FromUtf8Error}; use serde::Deserialize; use snafu::{OptionExt, ResultExt, Snafu}; From cdbd185edd8a21b3270847cfa706a975870d617c Mon Sep 17 00:00:00 2001 From: xeniape Date: Wed, 1 Apr 2026 11:59:09 +0200 Subject: [PATCH 28/30] refactor namespace assignment --- rust/stackablectl/src/cmds/demo.rs | 18 ++++++++---------- rust/stackablectl/src/cmds/stack.rs | 20 +++++++++----------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/rust/stackablectl/src/cmds/demo.rs b/rust/stackablectl/src/cmds/demo.rs index d4a824a3..94ed8dc3 100644 --- a/rust/stackablectl/src/cmds/demo.rs +++ b/rust/stackablectl/src/cmds/demo.rs @@ -423,20 +423,18 @@ async fn install_cmd( .context(ConfirmDialogSnafu) }; - let demo_namespace; - if args.namespaces.namespace == DEFAULT_NAMESPACE { - let use_non_default_namespace = - tracing_indicatif::suspend_tracing_indicatif(non_default_namespace_confirmation)?; - - if use_non_default_namespace { - demo_namespace = args.demo_name.clone(); + let demo_namespace = if args.namespaces.namespace == DEFAULT_NAMESPACE { + if tracing_indicatif::suspend_tracing_indicatif(non_default_namespace_confirmation)? { + // User selected to install in suggested namespace + args.demo_name.clone() } else { - demo_namespace = args.namespaces.namespace.clone(); + // User selected to install in default namespace + args.namespaces.namespace.clone() } } else { // User provided a non-default namespace with command argument - demo_namespace = args.namespaces.namespace.clone(); - } + args.namespaces.namespace.clone() + }; let values_file = cli.get_values_file().context(PathOrUrlParseSnafu)?; let operator_values = load_operator_values(values_file.as_ref(), transfer_client) diff --git a/rust/stackablectl/src/cmds/stack.rs b/rust/stackablectl/src/cmds/stack.rs index 40c59478..d52b6c75 100644 --- a/rust/stackablectl/src/cmds/stack.rs +++ b/rust/stackablectl/src/cmds/stack.rs @@ -401,21 +401,19 @@ async fn install_cmd( .context(ConfirmDialogSnafu) }; - let stack_namespace; - if args.namespaces.namespace == DEFAULT_NAMESPACE { - let use_non_default_namespace = tracing_indicatif::suspend_tracing_indicatif( - non_default_namespace_confirmation, - )?; - - if use_non_default_namespace { - stack_namespace = args.stack_name.clone(); + let stack_namespace = if args.namespaces.namespace == DEFAULT_NAMESPACE { + if tracing_indicatif::suspend_tracing_indicatif(non_default_namespace_confirmation)? + { + // User selected to install in suggested namespace + args.stack_name.clone() } else { - stack_namespace = args.namespaces.namespace.clone(); + // User selected to install in default namespace + args.namespaces.namespace.clone() } } else { // User provided a non-default namespace with command argument - stack_namespace = args.namespaces.namespace.clone(); - } + args.namespaces.namespace.clone() + }; let values_file = cli.get_values_file().context(PathOrUrlParseSnafu)?; let operator_values = load_operator_values(values_file.as_ref(), transfer_client) From 30f6d96e943b15ac9cb25d07c1c1749e3ad447b9 Mon Sep 17 00:00:00 2001 From: xeniape Date: Wed, 1 Apr 2026 12:19:11 +0200 Subject: [PATCH 29/30] refactor namespace deletion function --- rust/stackable-cockpit/src/utils/k8s/client.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/rust/stackable-cockpit/src/utils/k8s/client.rs b/rust/stackable-cockpit/src/utils/k8s/client.rs index 3257a9a5..611a2496 100644 --- a/rust/stackable-cockpit/src/utils/k8s/client.rs +++ b/rust/stackable-cockpit/src/utils/k8s/client.rs @@ -574,16 +574,17 @@ impl Client { /// Deletes a [`Namespace`] with `name` in the cluster. pub async fn delete_namespace(&self, name: String) -> Result<()> { - self.delete_object( + let namespace_api: Api = Api::all(self.client.clone()); + + kube::runtime::wait::delete::delete_and_finalize( + namespace_api, &name, - &ApiResource::from_gvk(&GroupVersionKind { - group: "".to_owned(), - version: "v1".to_owned(), - kind: "Namespace".to_owned(), - }), - None, + &DeleteParams::foreground(), ) .await + .context(KubeRuntimeDeleteSnafu)?; + + Ok(()) } /// Creates a [`Namespace`] only if not already present in the current cluster. From 55eeceb5fbe4079a3c8aa6014a7cb8171bcfa084 Mon Sep 17 00:00:00 2001 From: xeniape Date: Tue, 7 Apr 2026 13:30:03 +0200 Subject: [PATCH 30/30] bump operator-rs and use deref on label key --- Cargo.lock | 256 ++++++------ Cargo.nix | 364 +++++++++--------- Cargo.toml | 2 +- crate-hashes.json | 14 +- .../stackable-cockpit/src/utils/k8s/client.rs | 2 +- 5 files changed, 318 insertions(+), 320 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 651cc6d5..7dc555b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -414,9 +414,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" -version = "1.2.57" +version = "1.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" +checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" dependencies = [ "find-msvc-tools", "jobserver", @@ -587,9 +587,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] @@ -1103,9 +1103,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "find-msvc-tools" @@ -1489,9 +1489,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ "atomic-waker", "bytes", @@ -1504,7 +1504,6 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -1590,12 +1589,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -1603,9 +1603,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -1616,9 +1616,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -1630,15 +1630,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -1650,15 +1650,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -1720,9 +1720,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" dependencies = [ "equivalent", "hashbrown 0.16.1", @@ -1770,9 +1770,9 @@ checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e7418f59cc01c88316161279a7f665217ae316b388e58a0d10e29f54f1e5eb" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" dependencies = [ "memchr", "serde", @@ -1916,10 +1916,12 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] @@ -1975,11 +1977,11 @@ dependencies = [ [[package]] name = "k8s-version" version = "0.1.3" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#7486017f60827d1d769d7bf17bf56adb21f8bb02" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#a4a204b0696a696b9a49c930703037dd124e876d" dependencies = [ "darling", "regex", - "snafu 0.8.9", + "snafu 0.9.0", ] [[package]] @@ -2100,9 +2102,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.183" +version = "0.2.184" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" [[package]] name = "libloading" @@ -2122,9 +2124,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" +checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" dependencies = [ "libc", ] @@ -2137,9 +2139,9 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "litrs" @@ -2223,9 +2225,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi", @@ -2253,9 +2255,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-traits" @@ -2599,12 +2601,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "portable-atomic" version = "1.13.1" @@ -2622,9 +2618,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -3026,9 +3022,9 @@ dependencies = [ [[package]] name = "roff" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf2048e0e979efb2ca7b91c4f1a8d77c91853e9b987c94c555668a8994915ad" +checksum = "323c417e1d9665a65b263ec744ba09030cfb277e9daa0b018a4ab62e57bc8189" [[package]] name = "rstest" @@ -3095,9 +3091,9 @@ dependencies = [ [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc_version" @@ -3294,9 +3290,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" dependencies = [ "serde", "serde_core", @@ -3379,9 +3375,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876ac351060d4f882bb1032b6369eb0aef79ad9df1ea8bc404874d8cc3d0cd98" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] @@ -3466,9 +3462,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "siphasher" @@ -3642,9 +3638,10 @@ dependencies = [ [[package]] name = "stackable-operator" -version = "0.108.0" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#7486017f60827d1d769d7bf17bf56adb21f8bb02" +version = "0.109.0" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#a4a204b0696a696b9a49c930703037dd124e876d" dependencies = [ + "base64", "clap", "const_format", "delegate", @@ -3659,13 +3656,14 @@ dependencies = [ "k8s-openapi", "kube", "product-config", + "rand 0.9.2", "regex", "schemars", "semver", "serde", "serde_json", "serde_yaml", - "snafu 0.8.9", + "snafu 0.9.0", "stackable-operator-derive", "stackable-shared", "stackable-telemetry", @@ -3681,7 +3679,7 @@ dependencies = [ [[package]] name = "stackable-operator-derive" version = "0.3.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#7486017f60827d1d769d7bf17bf56adb21f8bb02" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#a4a204b0696a696b9a49c930703037dd124e876d" dependencies = [ "darling", "proc-macro2", @@ -3692,7 +3690,7 @@ dependencies = [ [[package]] name = "stackable-shared" version = "0.1.0" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#7486017f60827d1d769d7bf17bf56adb21f8bb02" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#a4a204b0696a696b9a49c930703037dd124e876d" dependencies = [ "jiff", "k8s-openapi", @@ -3701,15 +3699,15 @@ dependencies = [ "semver", "serde", "serde_yaml", - "snafu 0.8.9", + "snafu 0.9.0", "strum", "time", ] [[package]] name = "stackable-telemetry" -version = "0.6.2" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#7486017f60827d1d769d7bf17bf56adb21f8bb02" +version = "0.6.3" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#a4a204b0696a696b9a49c930703037dd124e876d" dependencies = [ "axum", "clap", @@ -3720,7 +3718,7 @@ dependencies = [ "opentelemetry-semantic-conventions", "opentelemetry_sdk", "pin-project", - "snafu 0.8.9", + "snafu 0.9.0", "strum", "tokio", "tower", @@ -3732,21 +3730,21 @@ dependencies = [ [[package]] name = "stackable-versioned" -version = "0.8.3" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#7486017f60827d1d769d7bf17bf56adb21f8bb02" +version = "0.9.0" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#a4a204b0696a696b9a49c930703037dd124e876d" dependencies = [ "schemars", "serde", "serde_json", "serde_yaml", - "snafu 0.8.9", + "snafu 0.9.0", "stackable-versioned-macros", ] [[package]] name = "stackable-versioned-macros" -version = "0.8.3" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#7486017f60827d1d769d7bf17bf56adb21f8bb02" +version = "0.9.0" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#a4a204b0696a696b9a49c930703037dd124e876d" dependencies = [ "convert_case", "convert_case_extras", @@ -4000,9 +3998,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -4025,9 +4023,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.50.0" +version = "1.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +checksum = "2bd1c4c0fc4a7ab90fc15ef6daaa3ec3b893f004f915f2392557ed23237820cd" dependencies = [ "bytes", "libc", @@ -4041,9 +4039,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -4099,9 +4097,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.1.0+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8195ca05e4eb728f4ba94f3e3291661320af739c4e43779cbdfae82ab239fcc" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" dependencies = [ "indexmap", "serde_core", @@ -4114,18 +4112,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.1.0+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.25.8+spec-1.1.0" +version = "0.25.10+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" +checksum = "a82418ca169e235e6c399a84e395ab6debeb3bc90edc959bf0f48647c6a32d1b" dependencies = [ "indexmap", "toml_datetime", @@ -4135,18 +4133,18 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.1.0+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ "winnow", ] [[package]] name = "toml_writer" -version = "1.1.0+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d282ade6016312faf3e41e57ebbba0c073e4056dab1232ab1cb624199648f8ed" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" [[package]] name = "tonic" @@ -4402,9 +4400,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-width" @@ -4516,9 +4514,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" dependencies = [ "getrandom 0.4.2", "js-sys", @@ -4613,9 +4611,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" dependencies = [ "cfg-if", "once_cell", @@ -4626,23 +4624,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.64" +version = "0.4.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +checksum = "03623de6905b7206edd0a75f69f747f134b7f0a2323392d664448bf2d3c5d87e" dependencies = [ - "cfg-if", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4650,9 +4644,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" dependencies = [ "bumpalo", "proc-macro2", @@ -4663,9 +4657,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" dependencies = [ "unicode-ident", ] @@ -4706,9 +4700,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.91" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" dependencies = [ "js-sys", "wasm-bindgen", @@ -5056,9 +5050,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" dependencies = [ "memchr", ] @@ -5153,9 +5147,9 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "xml" @@ -5182,9 +5176,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -5193,9 +5187,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -5205,18 +5199,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.47" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.47" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -5225,18 +5219,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -5252,9 +5246,9 @@ checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -5263,9 +5257,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -5274,9 +5268,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.nix b/Cargo.nix index 330918ed..8caed8de 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -1395,9 +1395,9 @@ rec { }; "cc" = rec { crateName = "cc"; - version = "1.2.57"; + version = "1.2.59"; edition = "2018"; - sha256 = "08q464b62d03zm7rgiixavkrh5lzfq18lwf884vgycj9735d23bs"; + sha256 = "10sjxshjiyvglpqnap8z8fqdggf9mnxm8dn5kwr8mli4cpnd795p"; authors = [ "Alex Crichton " ]; @@ -1937,9 +1937,9 @@ rec { }; "cmake" = rec { crateName = "cmake"; - version = "0.1.57"; + version = "0.1.58"; edition = "2021"; - sha256 = "0zgg10qgykig4nxyf7whrqfg7fkk0xfxhiavikmrndvbrm23qi3m"; + sha256 = "0y06zxw5sv1p5vvpp5rz1qwbrq7ccawrl09nqy5ahx1a5418mxy0"; authors = [ "Alex Crichton " ]; @@ -3402,9 +3402,9 @@ rec { }; "fastrand" = rec { crateName = "fastrand"; - version = "2.3.0"; + version = "2.4.1"; edition = "2018"; - sha256 = "1ghiahsw1jd68df895cy5h3gzwk30hndidn3b682zmshpgmrx41p"; + sha256 = "1mnqxxnxvd69ma9mczabpbbsgwlhd6l78yv3vd681453a9s247wz"; authors = [ "Stjepan Glavina " ]; @@ -4611,9 +4611,9 @@ rec { }; "hyper" = rec { crateName = "hyper"; - version = "1.8.1"; + version = "1.9.0"; edition = "2021"; - sha256 = "04cxr8j5y86bhxxlyqb8xkxjskpajk7cxwfzzk4v3my3a3rd9cia"; + sha256 = "1jmwbwqcaficskg76kq402gbymbnh2z4v99xwq3l5aa6n8bg16b2"; authors = [ "Sean McArthur " ]; @@ -4670,11 +4670,6 @@ rec { packageId = "pin-project-lite"; optional = true; } - { - name = "pin-utils"; - packageId = "pin-utils"; - optional = true; - } { name = "smallvec"; packageId = "smallvec"; @@ -4712,7 +4707,7 @@ rec { "client" = [ "dep:want" "dep:pin-project-lite" "dep:smallvec" ]; "ffi" = [ "dep:http-body-util" "dep:futures-util" ]; "full" = [ "client" "http1" "http2" "server" ]; - "http1" = [ "dep:atomic-waker" "dep:futures-channel" "dep:futures-core" "dep:httparse" "dep:itoa" "dep:pin-utils" ]; + "http1" = [ "dep:atomic-waker" "dep:futures-channel" "dep:futures-core" "dep:httparse" "dep:itoa" ]; "http2" = [ "dep:futures-channel" "dep:futures-core" "dep:h2" ]; "server" = [ "dep:httpdate" "dep:pin-project-lite" "dep:smallvec" ]; "tracing" = [ "dep:tracing" ]; @@ -5060,9 +5055,9 @@ rec { }; "icu_collections" = rec { crateName = "icu_collections"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "0hsblchsdl64q21qwrs4hvc2672jrf466zivbj1bwyv606bn8ssc"; + sha256 = "070r7xd0pynm0hnc1v2jzlbxka6wf50f81wybf9xg0y82v6x3119"; authors = [ "The ICU4X Project Developers" ]; @@ -5078,6 +5073,11 @@ rec { usesDefaultFeatures = false; features = [ "zerovec" ]; } + { + name = "utf8_iter"; + packageId = "utf8_iter"; + usesDefaultFeatures = false; + } { name = "yoke"; packageId = "yoke"; @@ -5105,9 +5105,9 @@ rec { }; "icu_locale_core" = rec { crateName = "icu_locale_core"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "1djvdc2f5ylmp1ymzv4gcnmq1s4hqfim9nxlcm173lsd01hpifpd"; + sha256 = "0a9cmin5w1x3bg941dlmgszn33qgq428k7qiqn5did72ndi9n8cj"; authors = [ "The ICU4X Project Developers" ]; @@ -5139,6 +5139,14 @@ rec { usesDefaultFeatures = false; } ]; + devDependencies = [ + { + name = "litemap"; + packageId = "litemap"; + usesDefaultFeatures = false; + features = [ "testing" ]; + } + ]; features = { "alloc" = [ "litemap/alloc" "tinystr/alloc" "writeable/alloc" "serde?/alloc" ]; "databake" = [ "dep:databake" "alloc" ]; @@ -5149,9 +5157,9 @@ rec { }; "icu_normalizer" = rec { crateName = "icu_normalizer"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "16dmn5596la2qm0r3vih0bzjfi0vx9a20yqjha6r1y3vnql8hv2z"; + sha256 = "1d7krxr0xpc4x9635k1100a24nh0nrc59n65j6yk6gbfkplmwvn5"; authors = [ "The ICU4X Project Developers" ]; @@ -5193,6 +5201,7 @@ rec { "compiled_data" = [ "dep:icu_normalizer_data" "icu_properties?/compiled_data" "icu_provider/baked" ]; "datagen" = [ "serde" "dep:databake" "icu_properties" "icu_collections/databake" "zerovec/databake" "icu_properties?/datagen" "icu_provider/export" ]; "default" = [ "compiled_data" "utf8_iter" "utf16_iter" ]; + "harfbuzz_traits" = [ "dep:harfbuzz-traits" ]; "icu_properties" = [ "dep:icu_properties" ]; "serde" = [ "dep:serde" "icu_collections/serde" "zerovec/serde" "icu_properties?/serde" "icu_provider/serde" ]; "utf16_iter" = [ "dep:utf16_iter" "dep:write16" ]; @@ -5202,9 +5211,9 @@ rec { }; "icu_normalizer_data" = rec { crateName = "icu_normalizer_data"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "02jnzizg6q75m41l6c13xc7nkc5q8yr1b728dcgfhpzw076wrvbs"; + sha256 = "0f5d5d5fhhr9937m2z6z38fzh6agf14z24kwlr6lyczafypf0fys"; authors = [ "The ICU4X Project Developers" ]; @@ -5212,9 +5221,9 @@ rec { }; "icu_properties" = rec { crateName = "icu_properties"; - version = "2.1.2"; + version = "2.2.0"; edition = "2021"; - sha256 = "1v3lbmhhi7i6jgw51ikjb1p50qh5rb67grlkdnkc63l7zq1gq2q2"; + sha256 = "1pkh3s837808cbwxvfagwc28cvwrz2d9h5rl02jwrhm51ryvdqxy"; authors = [ "The ICU4X Project Developers" ]; @@ -5259,6 +5268,7 @@ rec { "compiled_data" = [ "dep:icu_properties_data" "icu_provider/baked" ]; "datagen" = [ "serde" "dep:databake" "zerovec/databake" "icu_collections/databake" "icu_locale_core/databake" "zerotrie/databake" "icu_provider/export" ]; "default" = [ "compiled_data" ]; + "harfbuzz_traits" = [ "dep:harfbuzz-traits" ]; "serde" = [ "dep:serde" "icu_locale_core/serde" "zerovec/serde" "icu_collections/serde" "icu_provider/serde" "zerotrie/serde" ]; "unicode_bidi" = [ "dep:unicode-bidi" ]; }; @@ -5266,9 +5276,9 @@ rec { }; "icu_properties_data" = rec { crateName = "icu_properties_data"; - version = "2.1.2"; + version = "2.2.0"; edition = "2021"; - sha256 = "1bvpkh939rgzrjfdb7hz47v4wijngk0snmcgrnpwc9fpz162jv31"; + sha256 = "052awny0qwkbcbpd5jg2cd7vl5ry26pq4hz1nfsgf10c3qhbnawf"; authors = [ "The ICU4X Project Developers" ]; @@ -5276,9 +5286,9 @@ rec { }; "icu_provider" = rec { crateName = "icu_provider"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "0576b7dizgyhpfa74kacv86y4g1p7v5ffd6c56kf1q82rvq2r5l5"; + sha256 = "08dl8pxbwr8zsz4c5vphqb7xw0hykkznwi4rw7bk6pwb3krlr70k"; authors = [ "The ICU4X Project Developers" ]; @@ -5468,9 +5478,9 @@ rec { }; "indexmap" = rec { crateName = "indexmap"; - version = "2.13.0"; + version = "2.13.1"; edition = "2021"; - sha256 = "05qh5c4h2hrnyypphxpwflk45syqbzvqsvvyxg43mp576w2ff53p"; + sha256 = "1zs2af09vgdaix8qzhi3bd12zpn5za7pbc6v0cc0q2ryrfws5a25"; dependencies = [ { name = "equivalent"; @@ -5630,9 +5640,9 @@ rec { }; "iri-string" = rec { crateName = "iri-string"; - version = "0.7.11"; + version = "0.7.12"; edition = "2021"; - sha256 = "1sz5y5a9zqhh1n5fb25k2vipl8b5yskpj4hn2s1wh0fcb67l3ryq"; + sha256 = "082fpx6c5ghvmqpwxaf2b268m47z2ic3prajqbmi1s1qpfj5kri5"; libName = "iri_string"; authors = [ "YOSHIOKA Takuma " @@ -6027,14 +6037,26 @@ rec { }; "js-sys" = rec { crateName = "js-sys"; - version = "0.3.91"; + version = "0.3.94"; edition = "2021"; - sha256 = "171rzgq33wc1nxkgnvhlqqwwnrifs13mg3jjpjj5nf1z0yvib5xl"; + sha256 = "1nb4fr7c78mrrdhmg04nbac1zvd5z3panvqka8sy30nfh3py411f"; libName = "js_sys"; authors = [ "The wasm-bindgen Developers" ]; dependencies = [ + { + name = "cfg-if"; + packageId = "cfg-if"; + optional = true; + } + { + name = "futures-util"; + packageId = "futures-util"; + optional = true; + usesDefaultFeatures = false; + features = [ "std" ]; + } { name = "once_cell"; packageId = "once_cell"; @@ -6048,9 +6070,11 @@ rec { ]; features = { "default" = [ "std" "unsafe-eval" ]; + "futures" = [ "dep:cfg-if" "dep:futures-util" ]; + "futures-core-03-stream" = [ "futures" "dep:futures-core" ]; "std" = [ "wasm-bindgen/std" ]; }; - resolvedDefaultFeatures = [ "default" "std" "unsafe-eval" ]; + resolvedDefaultFeatures = [ "default" "futures" "std" "unsafe-eval" ]; }; "json-patch" = rec { crateName = "json-patch"; @@ -6219,7 +6243,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7486017f60827d1d769d7bf17bf56adb21f8bb02"; + rev = "a4a204b0696a696b9a49c930703037dd124e876d"; sha256 = "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2"; }; libName = "k8s_version"; @@ -6238,7 +6262,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.8.9"; + packageId = "snafu 0.9.0"; } ]; features = { @@ -6855,9 +6879,9 @@ rec { }; "libc" = rec { crateName = "libc"; - version = "0.2.183"; + version = "0.2.184"; edition = "2021"; - sha256 = "17c9gyia7rrzf9gsssvk3vq9ca2jp6rh32fsw6ciarpn5djlddmm"; + sha256 = "1bz4525m7lwzr63iidh7lp9ppz2c9va1pn6fyjh5wsp1ajjd5xa8"; authors = [ "The Rust Project Developers" ]; @@ -6910,9 +6934,9 @@ rec { }; "libredox" = rec { crateName = "libredox"; - version = "0.1.14"; + version = "0.1.15"; edition = "2021"; - sha256 = "02p3pxlqf54znf1jhiyyjs0i4caf8ckrd5l8ygs4i6ba3nfy6i0p"; + sha256 = "022g34brmdis15kji0w9kla6xk6098xvs416ihgnn92isj7z9nvx"; authors = [ "4lDO2 <4lDO2@protonmail.com>" ]; @@ -6956,9 +6980,9 @@ rec { }; "litemap" = rec { crateName = "litemap"; - version = "0.8.1"; + version = "0.8.2"; edition = "2021"; - sha256 = "0xsy8pfp9s802rsj1bq2ys2kbk1g36w5dr3gkfip7gphb5x60wv3"; + sha256 = "1w7628bc7wwcxc4n4s5kw0610xk06710nh2hn5kwwk2wa91z9nlj"; authors = [ "The ICU4X Project Developers" ]; @@ -7181,9 +7205,9 @@ rec { }; "mio" = rec { crateName = "mio"; - version = "1.1.1"; + version = "1.2.0"; edition = "2021"; - sha256 = "1z2phpalqbdgihrcjp8y09l3kgq6309jnhnr6h11l9s7mnqcm6x6"; + sha256 = "1hanrh4fwsfkdqdaqfidz48zz1wdix23zwn3r2x78am0garfbdsh"; authors = [ "Carl Lerche " "Thomas de Zeeuw " @@ -7193,17 +7217,7 @@ rec { { name = "libc"; packageId = "libc"; - target = { target, features }: ("hermit" == target."os" or null); - } - { - name = "libc"; - packageId = "libc"; - target = { target, features }: ("wasi" == target."os" or null); - } - { - name = "libc"; - packageId = "libc"; - target = { target, features }: (target."unix" or false); + target = { target, features }: ((target."unix" or false) || ("hermit" == target."os" or null) || ("wasi" == target."os" or null)); } { name = "wasi"; @@ -7280,9 +7294,9 @@ rec { }; "num-conv" = rec { crateName = "num-conv"; - version = "0.2.0"; + version = "0.2.1"; edition = "2021"; - sha256 = "0l4hj7lp8zbb9am4j3p7vlcv47y9bbazinvnxx9zjhiwkibyr5yg"; + sha256 = "0rqrr29brafaa2za352pbmhkk556n7f8z9rrkgmjp1idvdl3fry6"; libName = "num_conv"; authors = [ "Jacob Pratt " @@ -8341,17 +8355,6 @@ rec { sha256 = "1kfmwvs271si96zay4mm8887v5khw0c27jc9srw1a75ykvgj54x8"; libName = "pin_project_lite"; - }; - "pin-utils" = rec { - crateName = "pin-utils"; - version = "0.1.0"; - edition = "2018"; - sha256 = "117ir7vslsl2z1a7qzhws4pd01cg2d3338c47swjyvqv2n60v1wb"; - libName = "pin_utils"; - authors = [ - "Josef Brandl " - ]; - }; "portable-atomic" = rec { crateName = "portable-atomic"; @@ -8387,9 +8390,9 @@ rec { }; "potential_utf" = rec { crateName = "potential_utf"; - version = "0.1.4"; + version = "0.1.5"; edition = "2021"; - sha256 = "0xxg0pkfpq299wvwln409z4fk80rbv55phh3f1jhjajy5x1ljfdp"; + sha256 = "0r0518fr32xbkgzqap509s3r60cr0iancsg9j1jgf37cyz7b20q1"; authors = [ "The ICU4X Project Developers" ]; @@ -9978,9 +9981,9 @@ rec { }; "roff" = rec { crateName = "roff"; - version = "1.1.0"; + version = "1.1.1"; edition = "2024"; - sha256 = "1b8m96cshs2nam6ck1xrx59iijbpild4y75rlwngp7lp1s709wnv"; + sha256 = "12c1pibjxdjai80hpalxgqkzn30316x49iry4rdscrcn3mz42g1j"; }; "rstest" = rec { @@ -10192,9 +10195,9 @@ rec { }; "rustc-hash" = rec { crateName = "rustc-hash"; - version = "2.1.1"; + version = "2.1.2"; edition = "2021"; - sha256 = "03gz5lvd9ghcwsal022cgkq67dmimcgdjghfb5yb5d352ga06xrm"; + sha256 = "1gjdc5bw9982cj176jvgz9rrqf9xvr1q1ddpzywf5qhs7yzhlc4l"; libName = "rustc_hash"; authors = [ "The Rust Project Developers" @@ -10916,9 +10919,9 @@ rec { }; "semver" = rec { crateName = "semver"; - version = "1.0.27"; - edition = "2018"; - sha256 = "1qmi3akfrnqc2hfkdgcxhld5bv961wbk8my3ascv5068mc5fnryp"; + version = "1.0.28"; + edition = "2021"; + sha256 = "1kaimrpy876bcgi8bfj0qqfxk77zm9iz2zhn1hp9hj685z854y4a"; authors = [ "David Tolnay " ]; @@ -11176,9 +11179,9 @@ rec { }; "serde_spanned" = rec { crateName = "serde_spanned"; - version = "1.1.0"; + version = "1.1.1"; edition = "2024"; - sha256 = "166ds31qqkc70k28pspiknnpkvqaxdln6aq3n4mqhkqd0r8w6sl7"; + sha256 = "09jzk7i6wihn3d8i3wi4j4n98ghi93c3b8m8k64nxq0ijn3vaqk6"; dependencies = [ { name = "serde_core"; @@ -11409,9 +11412,9 @@ rec { }; "simd-adler32" = rec { crateName = "simd-adler32"; - version = "0.3.8"; + version = "0.3.9"; edition = "2018"; - sha256 = "18lx2gdgislabbvlgw5q3j5ssrr77v8kmkrxaanp3liimp2sc873"; + sha256 = "0532ysdwcvzyp2bwpk8qz0hijplcdwpssr5gy5r7qwqqy5z5qgbh"; libName = "simd_adler32"; authors = [ "Marvin Countryman " @@ -11989,12 +11992,12 @@ rec { }; "stackable-operator" = rec { crateName = "stackable-operator"; - version = "0.108.0"; + version = "0.109.0"; edition = "2024"; workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7486017f60827d1d769d7bf17bf56adb21f8bb02"; + rev = "a4a204b0696a696b9a49c930703037dd124e876d"; sha256 = "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2"; }; libName = "stackable_operator"; @@ -12002,6 +12005,10 @@ rec { "Stackable GmbH " ]; dependencies = [ + { + name = "base64"; + packageId = "base64"; + } { name = "clap"; packageId = "clap"; @@ -12065,6 +12072,10 @@ rec { name = "product-config"; packageId = "product-config"; } + { + name = "rand"; + packageId = "rand 0.9.2"; + } { name = "regex"; packageId = "regex"; @@ -12093,7 +12104,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.8.9"; + packageId = "snafu 0.9.0"; } { name = "stackable-operator-derive"; @@ -12161,7 +12172,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7486017f60827d1d769d7bf17bf56adb21f8bb02"; + rev = "a4a204b0696a696b9a49c930703037dd124e876d"; sha256 = "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2"; }; procMacro = true; @@ -12196,7 +12207,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7486017f60827d1d769d7bf17bf56adb21f8bb02"; + rev = "a4a204b0696a696b9a49c930703037dd124e876d"; sha256 = "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2"; }; libName = "stackable_shared"; @@ -12241,7 +12252,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.8.9"; + packageId = "snafu 0.9.0"; } { name = "strum"; @@ -12272,12 +12283,12 @@ rec { }; "stackable-telemetry" = rec { crateName = "stackable-telemetry"; - version = "0.6.2"; + version = "0.6.3"; edition = "2024"; workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7486017f60827d1d769d7bf17bf56adb21f8bb02"; + rev = "a4a204b0696a696b9a49c930703037dd124e876d"; sha256 = "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2"; }; libName = "stackable_telemetry"; @@ -12329,7 +12340,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.8.9"; + packageId = "snafu 0.9.0"; } { name = "strum"; @@ -12382,12 +12393,12 @@ rec { }; "stackable-versioned" = rec { crateName = "stackable-versioned"; - version = "0.8.3"; + version = "0.9.0"; edition = "2024"; workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7486017f60827d1d769d7bf17bf56adb21f8bb02"; + rev = "a4a204b0696a696b9a49c930703037dd124e876d"; sha256 = "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2"; }; libName = "stackable_versioned"; @@ -12415,7 +12426,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.8.9"; + packageId = "snafu 0.9.0"; } { name = "stackable-versioned-macros"; @@ -12426,12 +12437,12 @@ rec { }; "stackable-versioned-macros" = rec { crateName = "stackable-versioned-macros"; - version = "0.8.3"; + version = "0.9.0"; edition = "2024"; workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7486017f60827d1d769d7bf17bf56adb21f8bb02"; + rev = "a4a204b0696a696b9a49c930703037dd124e876d"; sha256 = "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2"; }; procMacro = true; @@ -13229,9 +13240,9 @@ rec { }; "tinystr" = rec { crateName = "tinystr"; - version = "0.8.2"; + version = "0.8.3"; edition = "2021"; - sha256 = "0sa8z88axdsf088hgw5p4xcyi6g3w3sgbb6qdp81bph9bk2fkls2"; + sha256 = "0vfr8x285w6zsqhna0a9jyhylwiafb2kc8pj2qaqaahw48236cn8"; authors = [ "The ICU4X Project Developers" ]; @@ -13299,9 +13310,9 @@ rec { }; "tokio" = rec { crateName = "tokio"; - version = "1.50.0"; + version = "1.51.0"; edition = "2021"; - sha256 = "0bc2c5kd57p2xd4l6hagb0bkrp798k5vw0f3xzzwy0sf6ws5xb97"; + sha256 = "1k90g0ij7vap4lwz45gr0kq97f637smdmxjyq47vjyjazk0c9l9b"; authors = [ "Tokio Contributors " ]; @@ -13317,6 +13328,12 @@ rec { optional = true; target = { target, features }: ((target."tokio_unstable" or false) && ("linux" == target."os" or null)); } + { + name = "libc"; + packageId = "libc"; + optional = true; + target = { target, features }: ("wasi" == target."os" or null); + } { name = "libc"; packageId = "libc"; @@ -13351,7 +13368,7 @@ rec { name = "socket2"; packageId = "socket2"; optional = true; - target = { target, features }: (!(builtins.elem "wasm" target."family")); + target = { target, features }: ((!(builtins.elem "wasm" target."family")) || (("wasi" == target."os" or null) && (!("p1" == target."env" or null)))); features = [ "all" ]; } { @@ -13409,9 +13426,9 @@ rec { }; "tokio-macros" = rec { crateName = "tokio-macros"; - version = "2.6.1"; + version = "2.7.0"; edition = "2021"; - sha256 = "172nwz3s7mmh266hb8l5xdnc7v9kqahisppqhinfd75nz3ps4maw"; + sha256 = "15m4f37mdafs0gg36sh0rskm1i768lb7zmp8bw67kaxr3avnqniq"; procMacro = true; libName = "tokio_macros"; authors = [ @@ -13640,9 +13657,9 @@ rec { }; "toml" = rec { crateName = "toml"; - version = "1.1.0+spec-1.1.0"; + version = "1.1.2+spec-1.1.0"; edition = "2024"; - sha256 = "1k4z4fmq5bnzrdwkgr6477vhlck12qly7wwlpbs2idsfbsh5q6gq"; + sha256 = "1vpggpamqhw4852kic7465zsidczsla06wz6friqkkfbhigd3ww1"; dependencies = [ { name = "indexmap"; @@ -13704,9 +13721,9 @@ rec { }; "toml_datetime" = rec { crateName = "toml_datetime"; - version = "1.1.0+spec-1.1.0"; + version = "1.1.1+spec-1.1.0"; edition = "2024"; - sha256 = "13qrb6d5cnsq5gm7b7v081vhddhzx2km51safy1ss0vy65y1l9cp"; + sha256 = "1mws2mkkf46l7inn77azhm0vdwxngv9vsbhbl0ah33p2c9gzcr9i"; dependencies = [ { name = "serde_core"; @@ -13725,9 +13742,9 @@ rec { }; "toml_edit" = rec { crateName = "toml_edit"; - version = "0.25.8+spec-1.1.0"; + version = "0.25.10+spec-1.1.0"; edition = "2024"; - sha256 = "0g0zdxh1wawc0v3hch7lpli2admvsww6hzk4y2gpzi463n7z7gqn"; + sha256 = "06rdlg34g1ply2drbp0fr4xypsvdmfay714s75n5w8wy2v51h958"; dependencies = [ { name = "indexmap"; @@ -13760,9 +13777,9 @@ rec { }; "toml_parser" = rec { crateName = "toml_parser"; - version = "1.1.0+spec-1.1.0"; + version = "1.1.2+spec-1.1.0"; edition = "2024"; - sha256 = "04a0pfm9hp18mhk2lrm85fkia5ya2f5grf7r9nq7wq33wcgg2d13"; + sha256 = "09kmzc55a0j21whm290wlf5a8b18a0qc87a1s8sncrckc6wfkax2"; dependencies = [ { name = "winnow"; @@ -13780,9 +13797,9 @@ rec { }; "toml_writer" = rec { crateName = "toml_writer"; - version = "1.1.0+spec-1.1.0"; + version = "1.1.1+spec-1.1.0"; edition = "2024"; - sha256 = "1vgq92b1j95n3jmk44mbdl2y8wy0l2xynmqywkrzl4k307kav0nj"; + sha256 = "1nwjhvvrxz8f4ck1qi4xcz2x9qhpci37nrknhxxf9sqk22dsyvbm"; features = { "default" = [ "std" ]; "std" = [ "alloc" ]; @@ -14787,9 +14804,9 @@ rec { }; "unicode-segmentation" = rec { crateName = "unicode-segmentation"; - version = "1.12.0"; + version = "1.13.2"; edition = "2018"; - sha256 = "14qla2jfx74yyb9ds3d2mpwpa4l4lzb9z57c6d2ba511458z5k7n"; + sha256 = "135a26m4a0wj319gcw28j6a5aqvz00jmgwgmcs6szgxjf942facn"; libName = "unicode_segmentation"; authors = [ "kwantam " @@ -15141,9 +15158,9 @@ rec { }; "uuid" = rec { crateName = "uuid"; - version = "1.22.0"; + version = "1.23.0"; edition = "2021"; - sha256 = "0dvsfn44sddhyhlhk7m3i559wyb125h86799fm5abky0067kr3d6"; + sha256 = "1nbrzkdhwr4clshsks7flc2jq6lavjrsx65hyn63c9dd5vsbdj2s"; authors = [ "Ashley Mannix" "Dylan DPC" @@ -15418,9 +15435,9 @@ rec { }; "wasm-bindgen" = rec { crateName = "wasm-bindgen"; - version = "0.2.114"; + version = "0.2.117"; edition = "2021"; - sha256 = "13nkhw552hpllrrmkd2x9y4bmcxr82kdpky2n667kqzcq6jzjck5"; + sha256 = "1c6hi55mq70546hrvrx7wa27sn3yvf04gg6hf8riwn8mnhdzql85"; libName = "wasm_bindgen"; authors = [ "The wasm-bindgen Developers" @@ -15469,62 +15486,38 @@ rec { }; "wasm-bindgen-futures" = rec { crateName = "wasm-bindgen-futures"; - version = "0.4.64"; + version = "0.4.67"; edition = "2021"; - sha256 = "1f3xnr40wwims4zhvh119dhwmffz4h4x82cffi118ri878mm5ig9"; + sha256 = "0znqqp9z52s4ckb94crjlbqbfd7i8zvnjpx7s3nhcwjvj3k3sqh3"; libName = "wasm_bindgen_futures"; authors = [ "The wasm-bindgen Developers" ]; dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if"; - } - { - name = "futures-util"; - packageId = "futures-util"; - optional = true; - usesDefaultFeatures = false; - features = [ "std" ]; - } { name = "js-sys"; packageId = "js-sys"; usesDefaultFeatures = false; - } - { - name = "once_cell"; - packageId = "once_cell"; - usesDefaultFeatures = false; + features = [ "futures" ]; } { name = "wasm-bindgen"; packageId = "wasm-bindgen"; usesDefaultFeatures = false; } - { - name = "web-sys"; - packageId = "web-sys"; - usesDefaultFeatures = false; - target = { target, features }: (builtins.elem "atomics" targetFeatures); - features = [ "MessageEvent" "Worker" ]; - } ]; features = { "default" = [ "std" ]; - "futures-core" = [ "dep:futures-core" ]; - "futures-core-03-stream" = [ "futures-core" ]; - "futures-util" = [ "dep:futures-util" ]; - "std" = [ "wasm-bindgen/std" "js-sys/std" "web-sys/std" "futures-util" ]; + "futures-core-03-stream" = [ "js-sys/futures-core-03-stream" ]; + "std" = [ "wasm-bindgen/std" "js-sys/std" ]; }; - resolvedDefaultFeatures = [ "default" "futures-util" "std" ]; + resolvedDefaultFeatures = [ "default" "std" ]; }; "wasm-bindgen-macro" = rec { crateName = "wasm-bindgen-macro"; - version = "0.2.114"; + version = "0.2.117"; edition = "2021"; - sha256 = "1rhq9kkl7n0zjrag9p25xsi4aabpgfkyf02zn4xv6pqhrw7xb8hq"; + sha256 = "1gl6gqy60khhyqv354m0kmgk541sass8kzymxim7hi6zbaizkgbz"; procMacro = true; libName = "wasm_bindgen_macro"; authors = [ @@ -15546,9 +15539,9 @@ rec { }; "wasm-bindgen-macro-support" = rec { crateName = "wasm-bindgen-macro-support"; - version = "0.2.114"; + version = "0.2.117"; edition = "2021"; - sha256 = "1qriqqjpn922kv5c7f7627fj823k5aifv06j2gvwsiy5map4rkh3"; + sha256 = "1wlza8xdr18cac2wm3ahxdwx1nnqa01m0d3jf3kd9dmsy8z6kafw"; libName = "wasm_bindgen_macro_support"; authors = [ "The wasm-bindgen Developers" @@ -15582,10 +15575,10 @@ rec { }; "wasm-bindgen-shared" = rec { crateName = "wasm-bindgen-shared"; - version = "0.2.114"; + version = "0.2.117"; edition = "2021"; links = "wasm_bindgen"; - sha256 = "05lc6w64jxlk4wk8rjci4z61lhx2ams90la27a41gvi3qaw2d8vm"; + sha256 = "0frxrdi1w0cswv8v7n1972hd23nbwm8hr7a2dhdq8bbd59l9l4ir"; libName = "wasm_bindgen_shared"; authors = [ "The wasm-bindgen Developers" @@ -15710,9 +15703,9 @@ rec { }; "web-sys" = rec { crateName = "web-sys"; - version = "0.3.91"; + version = "0.3.94"; edition = "2021"; - sha256 = "1y91r8f4dy4iqgrr03swdzqffz6wmllrgninp8kgpaq4n5xs2jw5"; + sha256 = "02nxnhv349r2gcy8w71cjj6nimww1g2zy20y8r4hhbxi75z04w6d"; libName = "web_sys"; authors = [ "The wasm-bindgen Developers" @@ -16202,7 +16195,7 @@ rec { "default" = [ "std" ]; "std" = [ "wasm-bindgen/std" "js-sys/std" ]; }; - resolvedDefaultFeatures = [ "AbortController" "AbortSignal" "Blob" "BlobPropertyBag" "Event" "EventTarget" "File" "FormData" "Headers" "MessageEvent" "ReadableStream" "Request" "RequestCache" "RequestCredentials" "RequestInit" "RequestMode" "Response" "ServiceWorkerGlobalScope" "Window" "Worker" "WorkerGlobalScope" "default" "std" ]; + resolvedDefaultFeatures = [ "AbortController" "AbortSignal" "Blob" "BlobPropertyBag" "EventTarget" "File" "FormData" "Headers" "ReadableStream" "Request" "RequestCache" "RequestCredentials" "RequestInit" "RequestMode" "Response" "ServiceWorkerGlobalScope" "Window" "WorkerGlobalScope" "default" "std" ]; }; "web-time" = rec { crateName = "web-time"; @@ -17922,9 +17915,9 @@ rec { }; "winnow" = rec { crateName = "winnow"; - version = "1.0.0"; + version = "1.0.1"; edition = "2021"; - sha256 = "1n67gx8mg2b6r2z54zwbrb6qsfbdsar1lvafsfaajr3jcvj8h3m9"; + sha256 = "1dbji1bwviy08pl74f2qw2m4w9hc4p3vyl3lfj05jdydy59w1nh9"; dependencies = [ { name = "memchr"; @@ -18258,9 +18251,9 @@ rec { }; "writeable" = rec { crateName = "writeable"; - version = "0.6.2"; + version = "0.6.3"; edition = "2021"; - sha256 = "1fg08y97n6vk7l0rnjggw3xyrii6dcqg54wqaxldrlk98zdy1pcy"; + sha256 = "1i54d13h9bpap2hf13xcry1s4lxh7ap3923g8f3c0grd7c9fbyhz"; authors = [ "The ICU4X Project Developers" ]; @@ -18344,9 +18337,9 @@ rec { }; "yoke" = rec { crateName = "yoke"; - version = "0.8.1"; + version = "0.8.2"; edition = "2021"; - sha256 = "0m29dm0bf5iakxgma0bj6dbmc3b8qi9b1vaw9sa76kdqmz3fbmkj"; + sha256 = "1jprcs7a98a5whvfs6r3jvfh1nnfp6zyijl7y4ywmn88lzywbs5b"; authors = [ "Manish Goregaokar " ]; @@ -18379,9 +18372,9 @@ rec { }; "yoke-derive" = rec { crateName = "yoke-derive"; - version = "0.8.1"; + version = "0.8.2"; edition = "2021"; - sha256 = "0pbyja133jnng4mrhimzdq4a0y26421g734ybgz8wsgbfhl0andn"; + sha256 = "13l5y5sz4lqm7rmyakjbh6vwgikxiql51xfff9hq2j485hk4r16y"; procMacro = true; libName = "yoke_derive"; authors = [ @@ -18410,9 +18403,9 @@ rec { }; "zerocopy" = rec { crateName = "zerocopy"; - version = "0.8.47"; + version = "0.8.48"; edition = "2021"; - sha256 = "11zdl3708210fsiax93qbvw8kiadg9lnzriw26xg44g35c32mfzg"; + sha256 = "1sb8plax8jbrsng1jdval7bdhk7hhrx40dz3hwh074k6knzkgm7f"; authors = [ "Joshua Liebow-Feeser " "Jack Wrenn " @@ -18446,9 +18439,9 @@ rec { }; "zerocopy-derive" = rec { crateName = "zerocopy-derive"; - version = "0.8.47"; + version = "0.8.48"; edition = "2021"; - sha256 = "12dbrk2w8mszdq9v01ls930bi446iyk4llggxrx8whalkckcg2qf"; + sha256 = "1m5s0g92cxggqc74j83k1priz24k3z93sj5gadppd20p9c4cvqvh"; procMacro = true; libName = "zerocopy_derive"; authors = [ @@ -18481,9 +18474,9 @@ rec { }; "zerofrom" = rec { crateName = "zerofrom"; - version = "0.1.6"; + version = "0.1.7"; edition = "2021"; - sha256 = "19dyky67zkjichsb7ykhv0aqws3q0jfvzww76l66c19y6gh45k2h"; + sha256 = "1py40in4rirc9q8w36q67pld0zk8ssg024xhh0cncxgal7ra3yk9"; authors = [ "Manish Goregaokar " ]; @@ -18503,9 +18496,9 @@ rec { }; "zerofrom-derive" = rec { crateName = "zerofrom-derive"; - version = "0.1.6"; + version = "0.1.7"; edition = "2021"; - sha256 = "00l5niw7c1b0lf1vhvajpjmcnbdp2vn96jg4nmkhq2db0rp5s7np"; + sha256 = "18c4wsnznhdxx6m80piil1lbyszdiwsshgjrybqcm4b6qic22lqi"; procMacro = true; libName = "zerofrom_derive"; authors = [ @@ -18551,9 +18544,9 @@ rec { }; "zerotrie" = rec { crateName = "zerotrie"; - version = "0.2.3"; + version = "0.2.4"; edition = "2021"; - sha256 = "0lbqznlqazmrwwzslw0ci7p3pqxykrbfhq29npj0gmb2amxc2n9a"; + sha256 = "1gr0pkcn3qsr6in6iixqyp0vbzwf2j1jzyvh7yl2yydh3p9m548g"; authors = [ "The ICU4X Project Developers" ]; @@ -18578,7 +18571,9 @@ rec { } ]; features = { + "alloc" = [ "zerovec?/alloc" ]; "databake" = [ "dep:databake" "zerovec?/databake" ]; + "dense" = [ "dep:zerovec" ]; "litemap" = [ "dep:litemap" "alloc" ]; "serde" = [ "dep:serde_core" "dep:litemap" "alloc" "litemap/serde" "zerovec?/serde" ]; "yoke" = [ "dep:yoke" ]; @@ -18589,9 +18584,9 @@ rec { }; "zerovec" = rec { crateName = "zerovec"; - version = "0.11.5"; + version = "0.11.6"; edition = "2021"; - sha256 = "00m0p47k2g9mkv505hky5xh3r6ps7v8qc0dy4pspg542jj972a3c"; + sha256 = "0fdjsy6b31q9i0d73sl7xjd12xadbwi45lkpfgqnmasrqg5i3ych"; authors = [ "The ICU4X Project Developers" ]; @@ -18614,11 +18609,20 @@ rec { usesDefaultFeatures = false; } ]; + devDependencies = [ + { + name = "yoke"; + packageId = "yoke"; + usesDefaultFeatures = false; + features = [ "derive" ]; + } + ]; features = { "alloc" = [ "serde?/alloc" ]; "databake" = [ "dep:databake" ]; "derive" = [ "dep:zerovec-derive" ]; "hashmap" = [ "dep:twox-hash" "alloc" ]; + "schemars" = [ "dep:schemars" "alloc" ]; "serde" = [ "dep:serde" ]; "yoke" = [ "dep:yoke" ]; }; @@ -18626,9 +18630,9 @@ rec { }; "zerovec-derive" = rec { crateName = "zerovec-derive"; - version = "0.11.2"; + version = "0.11.3"; edition = "2021"; - sha256 = "1wsig4h5j7a1scd5hrlnragnazjny9qjc44hancb6p6a76ay7p7a"; + sha256 = "0m85qj92mmfvhjra6ziqky5b1p4kcmp5069k7kfadp5hr8jw8pb2"; procMacro = true; libName = "zerovec_derive"; authors = [ diff --git a/Cargo.toml b/Cargo.toml index 25e2e0f6..68985380 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -51,7 +51,7 @@ serde_json = "1.0" serde_yaml = "0.9" sha2 = "0.10" snafu = { version = "0.9", features = ["futures"] } -stackable-operator = { git = "https://github.com/stackabletech/operator-rs.git", tag = "stackable-operator-0.108.0", default-features = false, features = ["crds", "kube-ws"] } +stackable-operator = { git = "https://github.com/stackabletech/operator-rs.git", tag = "stackable-operator-0.109.0", default-features = false, features = ["crds", "kube-ws"] } tera = "1.20" termion = "4.0" tokio = { version = "1.38", features = ["rt-multi-thread", "macros", "fs", "process", "io-std"] } diff --git a/crate-hashes.json b/crate-hashes.json index e1706bc4..5ad3e870 100644 --- a/crate-hashes.json +++ b/crate-hashes.json @@ -4,12 +4,12 @@ "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube-derive@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube-runtime@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#k8s-version@0.1.3": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#stackable-operator-derive@0.3.1": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#stackable-operator@0.108.0": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#stackable-shared@0.1.0": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#stackable-telemetry@0.6.2": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#stackable-versioned-macros@0.8.3": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.108.0#stackable-versioned@0.8.3": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#k8s-version@0.1.3": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#stackable-operator-derive@0.3.1": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#stackable-operator@0.109.0": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#stackable-shared@0.1.0": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#stackable-telemetry@0.6.3": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#stackable-versioned-macros@0.9.0": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.109.0#stackable-versioned@0.9.0": "1fgc7i8rhq1nl9m4s69sbfiywy2jx4narpynvm3g54vd5yd4c6m2", "git+https://github.com/stackabletech/product-config.git?tag=0.8.0#product-config@0.8.0": "1dz70kapm2wdqcr7ndyjji0lhsl98bsq95gnb2lw487wf6yr7987" } \ No newline at end of file diff --git a/rust/stackable-cockpit/src/utils/k8s/client.rs b/rust/stackable-cockpit/src/utils/k8s/client.rs index 611a2496..03819d49 100644 --- a/rust/stackable-cockpit/src/utils/k8s/client.rs +++ b/rust/stackable-cockpit/src/utils/k8s/client.rs @@ -359,7 +359,7 @@ impl Client { }; for object in object_list { - if let Some(value) = object.labels().get(&label.key().to_string()) { + if let Some(value) = object.labels().get(label.key().deref()) { if value.eq(label.value().deref()) { self.delete_object( &object.metadata.name.unwrap(),