diff --git a/crates/admin-cli/src/cfg/runtime.rs b/crates/admin-cli/src/cfg/runtime.rs index 87e89c9081..173efd8164 100644 --- a/crates/admin-cli/src/cfg/runtime.rs +++ b/crates/admin-cli/src/cfg/runtime.rs @@ -18,6 +18,7 @@ use rpc::admin_cli::OutputFormat; use crate::cfg::cli_options::SortField; +use crate::errors::CarbideCliError; use crate::rpc::ApiClient; // RuntimeContext is context passed to all subcommand @@ -36,6 +37,15 @@ pub struct RuntimeConfig { pub format: OutputFormat, pub page_size: usize, pub extended: bool, - pub cloud_unsafe_op_enabled: bool, + pub cloud_unsafe_op: Option, pub sort_by: SortField, } + +impl RuntimeContext { + pub fn assert_cloud_unsafe_op_message(&self) -> Result<&str, CarbideCliError> { + self.config + .cloud_unsafe_op + .as_deref() + .ok_or(CarbideCliError::CloudUnsafeOp) + } +} diff --git a/crates/admin-cli/src/errors.rs b/crates/admin-cli/src/errors.rs index 4941974d34..df6943bdf3 100644 --- a/crates/admin-cli/src/errors.rs +++ b/crates/admin-cli/src/errors.rs @@ -36,6 +36,9 @@ pub enum CarbideCliError { #[error("Generic Error: {0}")] GenericError(String), + #[error("Operation not allowed due to potential inconsistencies with cloud database.")] + CloudUnsafeOp, + #[error("Cannot specify both {0} and {1}. Please provide only one.")] ChooseOneError(&'static str, &'static str), diff --git a/crates/admin-cli/src/instance/allocate/cmd.rs b/crates/admin-cli/src/instance/allocate/cmd.rs index b354f53d69..fa299b17c8 100644 --- a/crates/admin-cli/src/instance/allocate/cmd.rs +++ b/crates/admin-cli/src/instance/allocate/cmd.rs @@ -18,22 +18,17 @@ use std::collections::VecDeque; use super::args::Args; +use crate::cfg::runtime::RuntimeContext; use crate::errors::{CarbideCliError, CarbideCliResult}; -use crate::instance::common::GlobalOptions; use crate::machine; use crate::rpc::ApiClient; pub async fn allocate( api_client: &ApiClient, allocate_request: Args, - opts: GlobalOptions<'_>, + ctx: &RuntimeContext, ) -> CarbideCliResult<()> { - if opts.cloud_unsafe_op.is_none() { - return Err(CarbideCliError::GenericError( - "Operation not allowed due to potential inconsistencies with cloud database." - .to_owned(), - )); - } + let unsafe_op_msg = ctx.assert_cloud_unsafe_op_message()?; let number = allocate_request.number.unwrap_or(1); @@ -87,7 +82,7 @@ pub async fn allocate( machine, &allocate_request, &format!("{}_{}", allocate_request.prefix_name, i), - opts.cloud_unsafe_op.clone(), + Some(unsafe_op_msg.to_string()), ) .await?; requests.push(request); @@ -127,7 +122,7 @@ pub async fn allocate( machine, &allocate_request, &format!("{}_{}", allocate_request.prefix_name, i), - opts.cloud_unsafe_op.clone(), + Some(unsafe_op_msg.to_string()), ) .await { diff --git a/crates/admin-cli/src/instance/allocate/mod.rs b/crates/admin-cli/src/instance/allocate/mod.rs index c6ab663911..0fd4a03bbd 100644 --- a/crates/admin-cli/src/instance/allocate/mod.rs +++ b/crates/admin-cli/src/instance/allocate/mod.rs @@ -20,24 +20,13 @@ pub mod cmd; pub use args::Args; -use super::common::GlobalOptions; use crate::cfg::run::Run; use crate::cfg::runtime::RuntimeContext; use crate::errors::CarbideCliResult; impl Run for Args { async fn run(self, ctx: &mut RuntimeContext) -> CarbideCliResult<()> { - let opts = GlobalOptions { - format: ctx.config.format, - page_size: ctx.config.page_size, - sort_by: &ctx.config.sort_by, - cloud_unsafe_op: if ctx.config.cloud_unsafe_op_enabled { - Some("enabled".to_string()) - } else { - None - }, - }; - cmd::allocate(&ctx.api_client, self, opts).await?; + cmd::allocate(&ctx.api_client, self, ctx).await?; Ok(()) } } diff --git a/crates/admin-cli/src/instance/common.rs b/crates/admin-cli/src/instance/common.rs deleted file mode 100644 index b8c53cd055..0000000000 --- a/crates/admin-cli/src/instance/common.rs +++ /dev/null @@ -1,26 +0,0 @@ -/* - * SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use crate::cfg::cli_options::SortField; - -/// Global options passed to instance commands -pub struct GlobalOptions<'a> { - pub format: rpc::admin_cli::OutputFormat, - pub page_size: usize, - pub sort_by: &'a SortField, - pub cloud_unsafe_op: Option, -} diff --git a/crates/admin-cli/src/instance/mod.rs b/crates/admin-cli/src/instance/mod.rs index 3acbfcf291..822db66a9b 100644 --- a/crates/admin-cli/src/instance/mod.rs +++ b/crates/admin-cli/src/instance/mod.rs @@ -16,7 +16,6 @@ */ mod allocate; -pub(crate) mod common; mod reboot; mod release; mod show; diff --git a/crates/admin-cli/src/instance/release/cmd.rs b/crates/admin-cli/src/instance/release/cmd.rs index c22c21e662..0fbfb992d6 100644 --- a/crates/admin-cli/src/instance/release/cmd.rs +++ b/crates/admin-cli/src/instance/release/cmd.rs @@ -19,21 +19,16 @@ use ::rpc::forge::InstanceReleaseRequest; use carbide_uuid::instance::InstanceId; use super::args::Args; +use crate::cfg::runtime::RuntimeContext; use crate::errors::{CarbideCliError, CarbideCliResult}; -use crate::instance::common::GlobalOptions; use crate::rpc::ApiClient; pub async fn release( api_client: &ApiClient, release_request: Args, - opts: GlobalOptions<'_>, + ctx: &RuntimeContext, ) -> CarbideCliResult<()> { - if opts.cloud_unsafe_op.is_none() { - return Err(CarbideCliError::GenericError( - "Operation not allowed due to potential inconsistencies with cloud database." - .to_owned(), - )); - } + ctx.assert_cloud_unsafe_op_message()?; let mut instance_ids: Vec = Vec::new(); @@ -64,7 +59,7 @@ pub async fn release( Some(key), release_request.label_value, None, - opts.page_size, + ctx.config.page_size, ) .await?; if instances.instances.is_empty() { diff --git a/crates/admin-cli/src/instance/release/mod.rs b/crates/admin-cli/src/instance/release/mod.rs index cdcbbec165..57b1576da6 100644 --- a/crates/admin-cli/src/instance/release/mod.rs +++ b/crates/admin-cli/src/instance/release/mod.rs @@ -20,24 +20,13 @@ pub mod cmd; pub use args::Args; -use super::common::GlobalOptions; use crate::cfg::run::Run; use crate::cfg::runtime::RuntimeContext; use crate::errors::CarbideCliResult; impl Run for Args { async fn run(self, ctx: &mut RuntimeContext) -> CarbideCliResult<()> { - let opts = GlobalOptions { - format: ctx.config.format, - page_size: ctx.config.page_size, - sort_by: &ctx.config.sort_by, - cloud_unsafe_op: if ctx.config.cloud_unsafe_op_enabled { - Some("enabled".to_string()) - } else { - None - }, - }; - cmd::release(&ctx.api_client, self, opts).await?; + cmd::release(&ctx.api_client, self, ctx).await?; Ok(()) } } diff --git a/crates/admin-cli/src/instance/show/cmd.rs b/crates/admin-cli/src/instance/show/cmd.rs index d1ffc2eee2..56b30ffe83 100644 --- a/crates/admin-cli/src/instance/show/cmd.rs +++ b/crates/admin-cli/src/instance/show/cmd.rs @@ -28,6 +28,7 @@ use prettytable::{Table, row}; use super::args::Args; use crate::cfg::cli_options::SortField; +use crate::cfg::runtime::RuntimeContext; use crate::errors::{CarbideCliError, CarbideCliResult}; use crate::rpc::ApiClient; use crate::{async_write, async_writeln, invalid_machine_id}; @@ -484,27 +485,21 @@ async fn show_instance_details( Ok(()) } -pub async fn handle_show( - args: Args, - output_file: &mut Box, - output_format: &OutputFormat, - api_client: &ApiClient, - page_size: usize, - sort_by: &SortField, -) -> CarbideCliResult<()> { +pub async fn handle_show(args: Args, ctx: &mut RuntimeContext) -> CarbideCliResult<()> { if args.id.is_empty() { - let mut all_instances = api_client + let mut all_instances = ctx + .api_client .get_all_instances( args.tenant_org_id, args.vpc_id, args.label_key, args.label_value, args.instance_type_id, - page_size, + ctx.config.page_size, ) .await?; - match sort_by { + match ctx.config.sort_by { SortField::PrimaryId => all_instances.instances.sort_by_key(|instance| instance.id), SortField::State => all_instances.instances.sort_by(|i1, i2| { let tenant_status1 = i1 @@ -524,17 +519,17 @@ pub async fn handle_show( tenant_status1.cmp(&tenant_status2) }), } - match output_format { + match ctx.config.format { OutputFormat::Json => { async_writeln!( - output_file, + ctx.output_file, "{}", serde_json::to_string_pretty(&all_instances)? )?; } OutputFormat::AsciiTable => { let table = convert_instances_to_nice_table(all_instances); - async_write!(output_file, "{}", table)?; + async_write!(ctx.output_file, "{}", table)?; } OutputFormat::Csv => { return Err(CarbideCliError::NotImplemented( @@ -551,9 +546,9 @@ pub async fn handle_show( } show_instance_details( args.id, - output_file, - output_format, - api_client, + &mut ctx.output_file, + &ctx.config.format, + &ctx.api_client, args.extrainfo, ) .await?; diff --git a/crates/admin-cli/src/instance/show/mod.rs b/crates/admin-cli/src/instance/show/mod.rs index 807cedf53f..40d0e2b558 100644 --- a/crates/admin-cli/src/instance/show/mod.rs +++ b/crates/admin-cli/src/instance/show/mod.rs @@ -20,32 +20,13 @@ pub mod cmd; pub use args::Args; -use super::common::GlobalOptions; use crate::cfg::run::Run; use crate::cfg::runtime::RuntimeContext; use crate::errors::CarbideCliResult; impl Run for Args { async fn run(self, ctx: &mut RuntimeContext) -> CarbideCliResult<()> { - let opts = GlobalOptions { - format: ctx.config.format, - page_size: ctx.config.page_size, - sort_by: &ctx.config.sort_by, - cloud_unsafe_op: if ctx.config.cloud_unsafe_op_enabled { - Some("enabled".to_string()) - } else { - None - }, - }; - cmd::handle_show( - self, - &mut ctx.output_file, - &opts.format, - &ctx.api_client, - opts.page_size, - opts.sort_by, - ) - .await?; + cmd::handle_show(self, ctx).await?; Ok(()) } } diff --git a/crates/admin-cli/src/instance/update_ib_config/cmd.rs b/crates/admin-cli/src/instance/update_ib_config/cmd.rs index 352085a93a..f6d25f8e79 100644 --- a/crates/admin-cli/src/instance/update_ib_config/cmd.rs +++ b/crates/admin-cli/src/instance/update_ib_config/cmd.rs @@ -14,23 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - use super::args::Args; -use crate::errors::{CarbideCliError, CarbideCliResult}; -use crate::instance::common::GlobalOptions; +use crate::cfg::runtime::RuntimeContext; +use crate::errors::CarbideCliResult; use crate::rpc::ApiClient; pub async fn update_ib_config( api_client: &ApiClient, update_request: Args, - opts: GlobalOptions<'_>, + ctx: &RuntimeContext, ) -> CarbideCliResult<()> { - if opts.cloud_unsafe_op.is_none() { - return Err(CarbideCliError::GenericError( - "Operation not allowed due to potential inconsistencies with cloud database." - .to_owned(), - )); - } + let unsafe_op_msg = ctx.assert_cloud_unsafe_op_message()?; match api_client .update_instance_config_with( @@ -39,7 +33,7 @@ pub async fn update_ib_config( config.infiniband = Some(update_request.config); }, |_metadata| {}, - opts.cloud_unsafe_op, + Some(unsafe_op_msg.to_string()), ) .await { diff --git a/crates/admin-cli/src/instance/update_ib_config/mod.rs b/crates/admin-cli/src/instance/update_ib_config/mod.rs index 71199ba863..bc1d2d0089 100644 --- a/crates/admin-cli/src/instance/update_ib_config/mod.rs +++ b/crates/admin-cli/src/instance/update_ib_config/mod.rs @@ -20,24 +20,13 @@ pub mod cmd; pub use args::Args; -use super::common::GlobalOptions; use crate::cfg::run::Run; use crate::cfg::runtime::RuntimeContext; use crate::errors::CarbideCliResult; impl Run for Args { async fn run(self, ctx: &mut RuntimeContext) -> CarbideCliResult<()> { - let opts = GlobalOptions { - format: ctx.config.format, - page_size: ctx.config.page_size, - sort_by: &ctx.config.sort_by, - cloud_unsafe_op: if ctx.config.cloud_unsafe_op_enabled { - Some("enabled".to_string()) - } else { - None - }, - }; - cmd::update_ib_config(&ctx.api_client, self, opts).await?; + cmd::update_ib_config(&ctx.api_client, self, ctx).await?; Ok(()) } } diff --git a/crates/admin-cli/src/instance/update_nvlink_config/cmd.rs b/crates/admin-cli/src/instance/update_nvlink_config/cmd.rs index 4b41a9b05a..3606d68d09 100644 --- a/crates/admin-cli/src/instance/update_nvlink_config/cmd.rs +++ b/crates/admin-cli/src/instance/update_nvlink_config/cmd.rs @@ -14,23 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - use super::args::Args; -use crate::errors::{CarbideCliError, CarbideCliResult}; -use crate::instance::common::GlobalOptions; +use crate::cfg::runtime::RuntimeContext; +use crate::errors::CarbideCliResult; use crate::rpc::ApiClient; pub async fn update_nvlink_config( api_client: &ApiClient, update_request: Args, - opts: &GlobalOptions<'_>, + ctx: &RuntimeContext, ) -> CarbideCliResult<()> { - if opts.cloud_unsafe_op.is_none() { - return Err(CarbideCliError::GenericError( - "Operation not allowed due to potential inconsistencies with cloud database." - .to_owned(), - )); - } + let unsafe_op_msg = ctx.assert_cloud_unsafe_op_message()?; match api_client .update_instance_config_with( @@ -39,7 +33,7 @@ pub async fn update_nvlink_config( config.nvlink = Some(update_request.config.clone()); }, |_metadata| {}, - opts.cloud_unsafe_op.clone(), + Some(unsafe_op_msg.to_string()), ) .await { diff --git a/crates/admin-cli/src/instance/update_nvlink_config/mod.rs b/crates/admin-cli/src/instance/update_nvlink_config/mod.rs index f13a963906..16f97c0bfb 100644 --- a/crates/admin-cli/src/instance/update_nvlink_config/mod.rs +++ b/crates/admin-cli/src/instance/update_nvlink_config/mod.rs @@ -20,24 +20,13 @@ pub mod cmd; pub use args::Args; -use super::common::GlobalOptions; use crate::cfg::run::Run; use crate::cfg::runtime::RuntimeContext; use crate::errors::CarbideCliResult; impl Run for Args { async fn run(self, ctx: &mut RuntimeContext) -> CarbideCliResult<()> { - let opts = GlobalOptions { - format: ctx.config.format, - page_size: ctx.config.page_size, - sort_by: &ctx.config.sort_by, - cloud_unsafe_op: if ctx.config.cloud_unsafe_op_enabled { - Some("enabled".to_string()) - } else { - None - }, - }; - cmd::update_nvlink_config(&ctx.api_client, self, &opts).await?; + cmd::update_nvlink_config(&ctx.api_client, self, ctx).await?; Ok(()) } } diff --git a/crates/admin-cli/src/instance/update_os/cmd.rs b/crates/admin-cli/src/instance/update_os/cmd.rs index cfc80a7abe..dc38bbd565 100644 --- a/crates/admin-cli/src/instance/update_os/cmd.rs +++ b/crates/admin-cli/src/instance/update_os/cmd.rs @@ -16,21 +16,16 @@ */ use super::args::Args; -use crate::errors::{CarbideCliError, CarbideCliResult}; -use crate::instance::common::GlobalOptions; +use crate::cfg::runtime::RuntimeContext; +use crate::errors::CarbideCliResult; use crate::rpc::ApiClient; pub async fn update_os( api_client: &ApiClient, update_request: Args, - opts: GlobalOptions<'_>, + ctx: &RuntimeContext, ) -> CarbideCliResult<()> { - if opts.cloud_unsafe_op.is_none() { - return Err(CarbideCliError::GenericError( - "Operation not allowed due to potential inconsistencies with cloud database." - .to_owned(), - )); - } + let unsafe_op_msg = ctx.assert_cloud_unsafe_op_message()?; match api_client .update_instance_config_with( @@ -39,7 +34,7 @@ pub async fn update_os( config.os = Some(update_request.os); }, |_metadata| {}, - opts.cloud_unsafe_op, + Some(unsafe_op_msg.to_string()), ) .await { diff --git a/crates/admin-cli/src/instance/update_os/mod.rs b/crates/admin-cli/src/instance/update_os/mod.rs index defc6d1be4..2a420030ca 100644 --- a/crates/admin-cli/src/instance/update_os/mod.rs +++ b/crates/admin-cli/src/instance/update_os/mod.rs @@ -20,24 +20,13 @@ pub mod cmd; pub use args::Args; -use super::common::GlobalOptions; use crate::cfg::run::Run; use crate::cfg::runtime::RuntimeContext; use crate::errors::CarbideCliResult; impl Run for Args { async fn run(self, ctx: &mut RuntimeContext) -> CarbideCliResult<()> { - let opts = GlobalOptions { - format: ctx.config.format, - page_size: ctx.config.page_size, - sort_by: &ctx.config.sort_by, - cloud_unsafe_op: if ctx.config.cloud_unsafe_op_enabled { - Some("enabled".to_string()) - } else { - None - }, - }; - cmd::update_os(&ctx.api_client, self, opts).await?; + cmd::update_os(&ctx.api_client, self, ctx).await?; Ok(()) } } diff --git a/crates/admin-cli/src/instance/update_spx_config/cmd.rs b/crates/admin-cli/src/instance/update_spx_config/cmd.rs index c293d67d6b..a56bb47f83 100644 --- a/crates/admin-cli/src/instance/update_spx_config/cmd.rs +++ b/crates/admin-cli/src/instance/update_spx_config/cmd.rs @@ -16,21 +16,16 @@ */ use super::args::Args; -use crate::errors::{CarbideCliError, CarbideCliResult}; -use crate::instance::common::GlobalOptions; +use crate::cfg::runtime::RuntimeContext; +use crate::errors::CarbideCliResult; use crate::rpc::ApiClient; pub async fn update_spx_config( api_client: &ApiClient, update_request: Args, - opts: GlobalOptions<'_>, + ctx: &RuntimeContext, ) -> CarbideCliResult<()> { - if opts.cloud_unsafe_op.is_none() { - return Err(CarbideCliError::GenericError( - "Operation not allowed due to potential inconsistencies with cloud database." - .to_owned(), - )); - } + let unsafe_op_msg = ctx.assert_cloud_unsafe_op_message()?; match api_client .update_instance_config_with( @@ -39,7 +34,7 @@ pub async fn update_spx_config( config.spxconfig = Some(update_request.config); }, |_metadata| {}, - opts.cloud_unsafe_op, + Some(unsafe_op_msg.to_string()), ) .await { diff --git a/crates/admin-cli/src/instance/update_spx_config/mod.rs b/crates/admin-cli/src/instance/update_spx_config/mod.rs index e2e76ad679..bf96cf9840 100644 --- a/crates/admin-cli/src/instance/update_spx_config/mod.rs +++ b/crates/admin-cli/src/instance/update_spx_config/mod.rs @@ -20,24 +20,13 @@ pub mod cmd; pub use args::Args; -use super::common::GlobalOptions; use crate::cfg::run::Run; use crate::cfg::runtime::RuntimeContext; use crate::errors::CarbideCliResult; impl Run for Args { async fn run(self, ctx: &mut RuntimeContext) -> CarbideCliResult<()> { - let opts = GlobalOptions { - format: ctx.config.format, - page_size: ctx.config.page_size, - sort_by: &ctx.config.sort_by, - cloud_unsafe_op: if ctx.config.cloud_unsafe_op_enabled { - Some("enabled".to_string()) - } else { - None - }, - }; - cmd::update_spx_config(&ctx.api_client, self, opts).await?; + cmd::update_spx_config(&ctx.api_client, self, ctx).await?; Ok(()) } } diff --git a/crates/admin-cli/src/instance_type/disassociate/mod.rs b/crates/admin-cli/src/instance_type/disassociate/mod.rs index 927e2b17ce..8e2e6a85e0 100644 --- a/crates/admin-cli/src/instance_type/disassociate/mod.rs +++ b/crates/admin-cli/src/instance_type/disassociate/mod.rs @@ -26,6 +26,6 @@ use crate::errors::CarbideCliResult; impl Run for Args { async fn run(self, ctx: &mut RuntimeContext) -> CarbideCliResult<()> { - cmd::remove_association(self, ctx.config.cloud_unsafe_op_enabled, &ctx.api_client).await + cmd::remove_association(self, ctx.config.cloud_unsafe_op.is_some(), &ctx.api_client).await } } diff --git a/crates/admin-cli/src/jump/cmds.rs b/crates/admin-cli/src/jump/cmds.rs index 82e40b5296..f7e4953ba6 100644 --- a/crates/admin-cli/src/jump/cmds.rs +++ b/crates/admin-cli/src/jump/cmds.rs @@ -97,11 +97,7 @@ pub async fn jump(args: Cmd, ctx: &mut RuntimeContext) -> color_eyre::Result<()> label_value: None, instance_type_id: None, }, - &mut ctx.output_file, - &config_format, - &ctx.api_client, - ctx.config.page_size, - &ctx.config.sort_by, + ctx, ) .await? } @@ -228,11 +224,7 @@ pub async fn jump(args: Cmd, ctx: &mut RuntimeContext) -> color_eyre::Result<()> label_value: None, instance_type_id: None, }, - &mut ctx.output_file, - &ctx.config.format, - &ctx.api_client, - ctx.config.page_size, - &ctx.config.sort_by, + ctx, ) .await? } diff --git a/crates/admin-cli/src/main.rs b/crates/admin-cli/src/main.rs index 393d9a0dd2..a5234ff7dd 100644 --- a/crates/admin-cli/src/main.rs +++ b/crates/admin-cli/src/main.rs @@ -216,7 +216,7 @@ async fn main() -> color_eyre::Result<()> { format: config.format, page_size: config.internal_page_size, extended: config.extended, - cloud_unsafe_op_enabled: config.cloud_unsafe_op.is_some(), + cloud_unsafe_op: config.cloud_unsafe_op, sort_by: config.sort_by, }, output_file: get_output_file_or_stdout(config.output.as_deref()).await?, diff --git a/crates/admin-cli/src/network_segment/delete/cmd.rs b/crates/admin-cli/src/network_segment/delete/cmd.rs index 7a483c5ef1..4bd8897b6f 100644 --- a/crates/admin-cli/src/network_segment/delete/cmd.rs +++ b/crates/admin-cli/src/network_segment/delete/cmd.rs @@ -17,15 +17,10 @@ use super::args::Args; use crate::cfg::runtime::RuntimeContext; -use crate::errors::{CarbideCliError, CarbideCliResult}; +use crate::errors::CarbideCliResult; pub async fn handle_delete(args: Args, ctx: &mut RuntimeContext) -> CarbideCliResult<()> { - if !ctx.config.cloud_unsafe_op_enabled { - return Err(CarbideCliError::GenericError( - "Operation not allowed due to potential inconsistencies with cloud database." - .to_owned(), - )); - } + ctx.assert_cloud_unsafe_op_message()?; ctx.api_client.0.delete_network_segment(args).await?; Ok(()) }