diff --git a/openstack_cli/src/load_balancer/v2/amphorae/list.rs b/openstack_cli/src/load_balancer/v2/amphorae/list.rs index d95b1d414..b6bff5d84 100644 --- a/openstack_cli/src/load_balancer/v2/amphorae/list.rs +++ b/openstack_cli/src/load_balancer/v2/amphorae/list.rs @@ -61,7 +61,67 @@ pub struct AmphoraesCommand { /// Query parameters #[derive(Args)] -struct QueryParameters {} +struct QueryParameters { + #[arg(help_heading = "Query parameters", long)] + cached_zone: Option, + + #[arg(help_heading = "Query parameters", long)] + cert_busy: Option, + + #[arg(help_heading = "Query parameters", long)] + cert_expiration: Option, + + #[arg(help_heading = "Query parameters", long)] + compute_flavor: Option, + + #[arg(help_heading = "Query parameters", long)] + compute_id: Option, + + #[arg(help_heading = "Query parameters", long)] + created_at: Option, + + #[arg(help_heading = "Query parameters", long)] + ha_ip: Option, + + #[arg(help_heading = "Query parameters", long)] + ha_port_id: Option, + + #[arg(help_heading = "Query parameters", long)] + id: Option, + + #[arg(help_heading = "Query parameters", long)] + image_id: Option, + + #[arg(help_heading = "Query parameters", long)] + lb_network_ip: Option, + + #[arg(help_heading = "Query parameters", long)] + loadbalancer_id: Option, + + #[arg(help_heading = "Query parameters", long)] + role: Option, + + #[arg(help_heading = "Query parameters", long)] + status: Option, + + #[arg(help_heading = "Query parameters", long)] + updated_at: Option, + + #[arg(help_heading = "Query parameters", long)] + vrrp_id: Option, + + #[arg(help_heading = "Query parameters", long)] + vrrp_interface: Option, + + #[arg(help_heading = "Query parameters", long)] + vrrp_ip: Option, + + #[arg(help_heading = "Query parameters", long)] + vrrp_port_id: Option, + + #[arg(help_heading = "Query parameters", long)] + vrrp_priority: Option, +} /// Path parameters #[derive(Args)] @@ -209,10 +269,70 @@ impl AmphoraesCommand { let op = OutputProcessor::from_args(parsed_args); op.validate_args(parsed_args)?; - let ep_builder = list::Request::builder(); + let mut ep_builder = list::Request::builder(); // Set path parameters // Set query parameters + if let Some(val) = &self.query.id { + ep_builder.id(val); + } + if let Some(val) = &self.query.loadbalancer_id { + ep_builder.loadbalancer_id(val); + } + if let Some(val) = &self.query.compute_id { + ep_builder.compute_id(val); + } + if let Some(val) = &self.query.lb_network_ip { + ep_builder.lb_network_ip(val); + } + if let Some(val) = &self.query.vrrp_ip { + ep_builder.vrrp_ip(val); + } + if let Some(val) = &self.query.ha_ip { + ep_builder.ha_ip(val); + } + if let Some(val) = &self.query.vrrp_port_id { + ep_builder.vrrp_port_id(val); + } + if let Some(val) = &self.query.ha_port_id { + ep_builder.ha_port_id(val); + } + if let Some(val) = &self.query.cert_expiration { + ep_builder.cert_expiration(val); + } + if let Some(val) = &self.query.cert_busy { + ep_builder.cert_busy(val); + } + if let Some(val) = &self.query.role { + ep_builder.role(val); + } + if let Some(val) = &self.query.status { + ep_builder.status(val); + } + if let Some(val) = &self.query.vrrp_interface { + ep_builder.vrrp_interface(val); + } + if let Some(val) = &self.query.vrrp_id { + ep_builder.vrrp_id(val); + } + if let Some(val) = &self.query.vrrp_priority { + ep_builder.vrrp_priority(val); + } + if let Some(val) = &self.query.cached_zone { + ep_builder.cached_zone(val); + } + if let Some(val) = &self.query.created_at { + ep_builder.created_at(val); + } + if let Some(val) = &self.query.updated_at { + ep_builder.updated_at(val); + } + if let Some(val) = &self.query.image_id { + ep_builder.image_id(val); + } + if let Some(val) = &self.query.compute_flavor { + ep_builder.compute_flavor(val); + } // Set body parameters let ep = ep_builder diff --git a/openstack_cli/src/load_balancer/v2/availability_zone/list.rs b/openstack_cli/src/load_balancer/v2/availability_zone/list.rs index 4da6404fb..bcf2a9596 100644 --- a/openstack_cli/src/load_balancer/v2/availability_zone/list.rs +++ b/openstack_cli/src/load_balancer/v2/availability_zone/list.rs @@ -50,7 +50,19 @@ pub struct AvailabilityZonesCommand { /// Query parameters #[derive(Args)] -struct QueryParameters {} +struct QueryParameters { + #[arg(help_heading = "Query parameters", long)] + availability_zone_profile_id: Option, + + #[arg(help_heading = "Query parameters", long)] + description: Option, + + #[arg(help_heading = "Query parameters", long)] + name: Option, + + #[arg(help_heading = "Query parameters", long)] + status: Option, +} /// Path parameters #[derive(Args)] @@ -87,10 +99,22 @@ impl AvailabilityZonesCommand { let op = OutputProcessor::from_args(parsed_args); op.validate_args(parsed_args)?; - let ep_builder = list::Request::builder(); + let mut ep_builder = list::Request::builder(); // Set path parameters // Set query parameters + if let Some(val) = &self.query.name { + ep_builder.name(val); + } + if let Some(val) = &self.query.description { + ep_builder.description(val); + } + if let Some(val) = &self.query.availability_zone_profile_id { + ep_builder.availability_zone_profile_id(val); + } + if let Some(val) = &self.query.status { + ep_builder.status(val); + } // Set body parameters let ep = ep_builder diff --git a/openstack_cli/src/load_balancer/v2/availability_zone_profile/list.rs b/openstack_cli/src/load_balancer/v2/availability_zone_profile/list.rs index cf2b1b530..77479508a 100644 --- a/openstack_cli/src/load_balancer/v2/availability_zone_profile/list.rs +++ b/openstack_cli/src/load_balancer/v2/availability_zone_profile/list.rs @@ -50,7 +50,19 @@ pub struct AvailabilityZoneProfilesCommand { /// Query parameters #[derive(Args)] -struct QueryParameters {} +struct QueryParameters { + #[arg(help_heading = "Query parameters", long)] + availability_zone_data: Option, + + #[arg(help_heading = "Query parameters", long)] + id: Option, + + #[arg(help_heading = "Query parameters", long)] + name: Option, + + #[arg(help_heading = "Query parameters", long)] + provider_name: Option, +} /// Path parameters #[derive(Args)] @@ -87,10 +99,22 @@ impl AvailabilityZoneProfilesCommand { let op = OutputProcessor::from_args(parsed_args); op.validate_args(parsed_args)?; - let ep_builder = list::Request::builder(); + let mut ep_builder = list::Request::builder(); // Set path parameters // Set query parameters + if let Some(val) = &self.query.id { + ep_builder.id(val); + } + if let Some(val) = &self.query.name { + ep_builder.name(val); + } + if let Some(val) = &self.query.provider_name { + ep_builder.provider_name(val); + } + if let Some(val) = &self.query.availability_zone_data { + ep_builder.availability_zone_data(val); + } // Set body parameters let ep = ep_builder diff --git a/openstack_cli/src/load_balancer/v2/flavor/list.rs b/openstack_cli/src/load_balancer/v2/flavor/list.rs index 088bf90f3..896e715fc 100644 --- a/openstack_cli/src/load_balancer/v2/flavor/list.rs +++ b/openstack_cli/src/load_balancer/v2/flavor/list.rs @@ -50,7 +50,22 @@ pub struct FlavorsCommand { /// Query parameters #[derive(Args)] -struct QueryParameters {} +struct QueryParameters { + #[arg(help_heading = "Query parameters", long)] + description: Option, + + #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)] + enabled: Option, + + #[arg(help_heading = "Query parameters", long)] + flavor_profile_id: Option, + + #[arg(help_heading = "Query parameters", long)] + id: Option, + + #[arg(help_heading = "Query parameters", long)] + name: Option, +} /// Path parameters #[derive(Args)] @@ -91,10 +106,25 @@ impl FlavorsCommand { let op = OutputProcessor::from_args(parsed_args); op.validate_args(parsed_args)?; - let ep_builder = list::Request::builder(); + let mut ep_builder = list::Request::builder(); // Set path parameters // Set query parameters + if let Some(val) = &self.query.id { + ep_builder.id(val); + } + if let Some(val) = &self.query.name { + ep_builder.name(val); + } + if let Some(val) = &self.query.description { + ep_builder.description(val); + } + if let Some(val) = &self.query.flavor_profile_id { + ep_builder.flavor_profile_id(val); + } + if let Some(val) = &self.query.enabled { + ep_builder.enabled(*val); + } // Set body parameters let ep = ep_builder diff --git a/openstack_cli/src/load_balancer/v2/flavor_profile/list.rs b/openstack_cli/src/load_balancer/v2/flavor_profile/list.rs index 8fddc50f8..72443925d 100644 --- a/openstack_cli/src/load_balancer/v2/flavor_profile/list.rs +++ b/openstack_cli/src/load_balancer/v2/flavor_profile/list.rs @@ -51,7 +51,19 @@ pub struct FlavorProfilesCommand { /// Query parameters #[derive(Args)] -struct QueryParameters {} +struct QueryParameters { + #[arg(help_heading = "Query parameters", long)] + flavor_data: Option, + + #[arg(help_heading = "Query parameters", long)] + id: Option, + + #[arg(help_heading = "Query parameters", long)] + name: Option, + + #[arg(help_heading = "Query parameters", long)] + provider_name: Option, +} /// Path parameters #[derive(Args)] @@ -80,10 +92,22 @@ impl FlavorProfilesCommand { let op = OutputProcessor::from_args(parsed_args); op.validate_args(parsed_args)?; - let ep_builder = list::Request::builder(); + let mut ep_builder = list::Request::builder(); // Set path parameters // Set query parameters + if let Some(val) = &self.query.id { + ep_builder.id(val); + } + if let Some(val) = &self.query.name { + ep_builder.name(val); + } + if let Some(val) = &self.query.provider_name { + ep_builder.provider_name(val); + } + if let Some(val) = &self.query.flavor_data { + ep_builder.flavor_data(val); + } // Set body parameters let ep = ep_builder diff --git a/openstack_cli/src/load_balancer/v2/healthmonitor/list.rs b/openstack_cli/src/load_balancer/v2/healthmonitor/list.rs index cb6b78abe..d8032ced5 100644 --- a/openstack_cli/src/load_balancer/v2/healthmonitor/list.rs +++ b/openstack_cli/src/load_balancer/v2/healthmonitor/list.rs @@ -31,10 +31,14 @@ use crate::OpenStackCliError; use crate::OutputConfig; use crate::StructTable; +use eyre::OptionExt; +use openstack_sdk::api::find_by_name; +use openstack_sdk::api::identity::v3::project::find as find_project; use openstack_sdk::api::load_balancer::v2::healthmonitor::list; use openstack_sdk::api::QueryAsync; use serde_json::Value; use structable_derive::StructTable; +use tracing::warn; /// Lists all health monitors for the project. /// @@ -62,7 +66,139 @@ pub struct HealthmonitorsCommand { /// Query parameters #[derive(Args)] -struct QueryParameters {} +struct QueryParameters { + /// The type of health monitor. + /// + #[arg(help_heading = "Query parameters", long, value_parser = ["HTTP","HTTPS","PING","SCTP","TCP","TLS-HELLO","UDP-CONNECT"])] + _type: Option, + + /// The administrative state of the resource + /// + #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)] + admin_state_up: Option, + + /// The UTC date and timestamp when the resource was created. + /// + #[arg(help_heading = "Query parameters", long)] + created_at: Option, + + /// The time, in seconds, between sending probes to members. + /// + #[arg(help_heading = "Query parameters", long)] + delay: Option, + + /// A human-readable description for the resource. + /// + #[arg(help_heading = "Query parameters", long)] + description: Option, + + /// The list of HTTP status codes expected in response from the member to + /// declare it healthy. + /// + #[arg(help_heading = "Query parameters", long)] + expected_codes: Option, + + /// The HTTP method that the health monitor uses for requests. + /// + #[arg(help_heading = "Query parameters", long, value_parser = ["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"])] + http_method: Option, + + /// The ID of the resource + /// + #[arg(help_heading = "Query parameters", long)] + id: Option, + + /// The number of successful checks before changing the operating status of + /// the member to ONLINE. A valid value is from 1 to 10. + /// + #[arg(help_heading = "Query parameters", long)] + max_retries: Option, + + /// The number of allowed check failures before changing the operating + /// status of the member to ERROR. A valid value is from 1 to 10. + /// + #[arg(help_heading = "Query parameters", long)] + max_retries_down: Option, + + /// Human-readable name of the resource. + /// + #[arg(help_heading = "Query parameters", long)] + name: Option, + + /// Return the list of entities that do not have one or more of the given + /// tags. + /// + #[arg(help_heading = "Query parameters", long)] + not_tags: Option, + + /// Return the list of entities that do not have at least one of the given + /// tags. + /// + #[arg(help_heading = "Query parameters", long)] + not_tags_any: Option, + + /// The operating status of the resource. + /// + #[arg(help_heading = "Query parameters", long, value_parser = ["DEGRADED","DRAINING","ERROR","NO_MONITOR","OFFLINE","ONLINE"])] + operating_status: Option, + + /// The ID of the pool. + /// + #[arg(help_heading = "Query parameters", long)] + pool_id: Option, + + /// Project resource for which the operation should be performed. + #[command(flatten)] + project: ProjectInput, + + /// The provisioning status of the resource. + /// + #[arg(help_heading = "Query parameters", long, value_parser = ["ACTIVE","DELETED","ERROR","PENDING_CREATE","PENDING_DELETE","PENDING_UPDATE"])] + provisioning_status: Option, + + /// Return the list of entities that have this tag or tags. + /// + #[arg(help_heading = "Query parameters", long)] + tags: Option, + + /// Return the list of entities that have one or more of the given tags. + /// + #[arg(help_heading = "Query parameters", long)] + tags_any: Option, + + /// The maximum time, in seconds, that a monitor waits to connect before it + /// times out. + /// + #[arg(help_heading = "Query parameters", long)] + timeout: Option, + + /// The UTC date and timestamp when the resource was last updated. + /// + #[arg(help_heading = "Query parameters", long)] + updated_at: Option, + + /// The HTTP URL path of the request sent by the monitor to test the health + /// of a backend member. Must be a string that begins with a forward slash + /// (/). + /// + #[arg(help_heading = "Query parameters", long)] + url_path: Option, +} + +/// Project input select group +#[derive(Args)] +#[group(required = false, multiple = false)] +struct ProjectInput { + /// Project Name. + #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_NAME")] + project_name: Option, + /// Project ID. + #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_ID")] + project_id: Option, + /// Current project. + #[arg(long, help_heading = "Path parameters", action = clap::ArgAction::SetTrue)] + current_project: bool, +} /// Path parameters #[derive(Args)] @@ -229,10 +365,114 @@ impl HealthmonitorsCommand { let op = OutputProcessor::from_args(parsed_args); op.validate_args(parsed_args)?; - let ep_builder = list::Request::builder(); + let mut ep_builder = list::Request::builder(); // Set path parameters // Set query parameters + if let Some(val) = &self.query.id { + ep_builder.id(val); + } + if let Some(val) = &self.query.description { + ep_builder.description(val); + } + if let Some(val) = &self.query.name { + ep_builder.name(val); + } + if let Some(id) = &self.query.project.project_id { + // project_id is passed. No need to lookup + ep_builder.project_id(id); + } else if let Some(name) = &self.query.project.project_name { + // project_name is passed. Need to lookup resource + let mut sub_find_builder = find_project::Request::builder(); + warn!("Querying project by name (because of `--project-name` parameter passed) may not be definite. This may fail in which case parameter `--project-id` should be used instead."); + + sub_find_builder.id(name); + let find_ep = sub_find_builder + .build() + .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?; + let find_data: serde_json::Value = find_by_name(find_ep).query_async(client).await?; + // Try to extract resource id + match find_data.get("id") { + Some(val) => match val.as_str() { + Some(id_str) => { + ep_builder.project_id(id_str.to_owned()); + } + None => { + return Err(OpenStackCliError::ResourceAttributeNotString( + serde_json::to_string(&val)?, + )) + } + }, + None => { + return Err(OpenStackCliError::ResourceAttributeMissing( + "id".to_string(), + )) + } + }; + } else if self.query.project.current_project { + ep_builder.project_id( + client + .get_auth_info() + .ok_or_eyre("Cannot determine current authentication information")? + .token + .user + .id, + ); + } + if let Some(val) = &self.query.admin_state_up { + ep_builder.admin_state_up(*val); + } + if let Some(val) = &self.query.created_at { + ep_builder.created_at(val); + } + if let Some(val) = &self.query.updated_at { + ep_builder.updated_at(val); + } + if let Some(val) = &self.query.delay { + ep_builder.delay(*val); + } + if let Some(val) = &self.query.expected_codes { + ep_builder.expected_codes(val); + } + if let Some(val) = &self.query.http_method { + ep_builder.http_method(val); + } + if let Some(val) = &self.query.max_retries { + ep_builder.max_retries(*val); + } + if let Some(val) = &self.query.max_retries_down { + ep_builder.max_retries_down(*val); + } + if let Some(val) = &self.query.pool_id { + ep_builder.pool_id(val); + } + if let Some(val) = &self.query.timeout { + ep_builder.timeout(*val); + } + if let Some(val) = &self.query._type { + ep_builder._type(val); + } + if let Some(val) = &self.query.url_path { + ep_builder.url_path(val); + } + if let Some(val) = &self.query.provisioning_status { + ep_builder.provisioning_status(val); + } + if let Some(val) = &self.query.operating_status { + ep_builder.operating_status(val); + } + if let Some(val) = &self.query.tags { + ep_builder.tags(val); + } + if let Some(val) = &self.query.tags_any { + ep_builder.tags_any(val); + } + if let Some(val) = &self.query.not_tags { + ep_builder.not_tags(val); + } + if let Some(val) = &self.query.not_tags_any { + ep_builder.not_tags_any(val); + } // Set body parameters let ep = ep_builder diff --git a/openstack_cli/src/load_balancer/v2/l7policy/list.rs b/openstack_cli/src/load_balancer/v2/l7policy/list.rs index 1d6409e42..f918f20f4 100644 --- a/openstack_cli/src/load_balancer/v2/l7policy/list.rs +++ b/openstack_cli/src/load_balancer/v2/l7policy/list.rs @@ -31,10 +31,14 @@ use crate::OpenStackCliError; use crate::OutputConfig; use crate::StructTable; +use eyre::OptionExt; +use openstack_sdk::api::find_by_name; +use openstack_sdk::api::identity::v3::project::find as find_project; use openstack_sdk::api::load_balancer::v2::l7policy::list; use openstack_sdk::api::QueryAsync; use serde_json::Value; use structable_derive::StructTable; +use tracing::warn; /// Lists all L7 policies for the project. /// @@ -62,7 +66,59 @@ pub struct L7PoliciesCommand { /// Query parameters #[derive(Args)] -struct QueryParameters {} +struct QueryParameters { + #[arg(help_heading = "Query parameters", long)] + action: Option, + + #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)] + admin_state_up: Option, + + #[arg(help_heading = "Query parameters", long)] + description: Option, + + #[arg(help_heading = "Query parameters", long)] + listener_id: Option, + + #[arg(help_heading = "Query parameters", long)] + name: Option, + + #[arg(help_heading = "Query parameters", long)] + operating_status: Option, + + #[arg(help_heading = "Query parameters", long)] + position: Option, + + /// Project resource for which the operation should be performed. + #[command(flatten)] + project: ProjectInput, + + #[arg(help_heading = "Query parameters", long)] + provisioning_status: Option, + + #[arg(help_heading = "Query parameters", long)] + redirect_pool_id: Option, + + #[arg(help_heading = "Query parameters", long)] + redirect_prefix: Option, + + #[arg(help_heading = "Query parameters", long)] + redirect_url: Option, +} + +/// Project input select group +#[derive(Args)] +#[group(required = false, multiple = false)] +struct ProjectInput { + /// Project Name. + #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_NAME")] + project_name: Option, + /// Project ID. + #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_ID")] + project_id: Option, + /// Current project. + #[arg(long, help_heading = "Path parameters", action = clap::ArgAction::SetTrue)] + current_project: bool, +} /// Path parameters #[derive(Args)] @@ -211,10 +267,84 @@ impl L7PoliciesCommand { let op = OutputProcessor::from_args(parsed_args); op.validate_args(parsed_args)?; - let ep_builder = list::Request::builder(); + let mut ep_builder = list::Request::builder(); // Set path parameters // Set query parameters + if let Some(val) = &self.query.action { + ep_builder.action(val); + } + if let Some(val) = &self.query.description { + ep_builder.description(val); + } + if let Some(val) = &self.query.listener_id { + ep_builder.listener_id(val); + } + if let Some(val) = &self.query.name { + ep_builder.name(val); + } + if let Some(val) = &self.query.position { + ep_builder.position(val); + } + if let Some(val) = &self.query.redirect_pool_id { + ep_builder.redirect_pool_id(val); + } + if let Some(val) = &self.query.redirect_url { + ep_builder.redirect_url(val); + } + if let Some(val) = &self.query.provisioning_status { + ep_builder.provisioning_status(val); + } + if let Some(val) = &self.query.operating_status { + ep_builder.operating_status(val); + } + if let Some(val) = &self.query.redirect_prefix { + ep_builder.redirect_prefix(val); + } + if let Some(id) = &self.query.project.project_id { + // project_id is passed. No need to lookup + ep_builder.project_id(id); + } else if let Some(name) = &self.query.project.project_name { + // project_name is passed. Need to lookup resource + let mut sub_find_builder = find_project::Request::builder(); + warn!("Querying project by name (because of `--project-name` parameter passed) may not be definite. This may fail in which case parameter `--project-id` should be used instead."); + + sub_find_builder.id(name); + let find_ep = sub_find_builder + .build() + .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?; + let find_data: serde_json::Value = find_by_name(find_ep).query_async(client).await?; + // Try to extract resource id + match find_data.get("id") { + Some(val) => match val.as_str() { + Some(id_str) => { + ep_builder.project_id(id_str.to_owned()); + } + None => { + return Err(OpenStackCliError::ResourceAttributeNotString( + serde_json::to_string(&val)?, + )) + } + }, + None => { + return Err(OpenStackCliError::ResourceAttributeMissing( + "id".to_string(), + )) + } + }; + } else if self.query.project.current_project { + ep_builder.project_id( + client + .get_auth_info() + .ok_or_eyre("Cannot determine current authentication information")? + .token + .user + .id, + ); + } + if let Some(val) = &self.query.admin_state_up { + ep_builder.admin_state_up(*val); + } // Set body parameters let ep = ep_builder diff --git a/openstack_cli/src/load_balancer/v2/l7policy/rule/list.rs b/openstack_cli/src/load_balancer/v2/l7policy/rule/list.rs index 429197f80..a2038a6ef 100644 --- a/openstack_cli/src/load_balancer/v2/l7policy/rule/list.rs +++ b/openstack_cli/src/load_balancer/v2/l7policy/rule/list.rs @@ -31,10 +31,14 @@ use crate::OpenStackCliError; use crate::OutputConfig; use crate::StructTable; +use eyre::OptionExt; +use openstack_sdk::api::find_by_name; +use openstack_sdk::api::identity::v3::project::find as find_project; use openstack_sdk::api::load_balancer::v2::l7policy::rule::list; use openstack_sdk::api::QueryAsync; use serde_json::Value; use structable_derive::StructTable; +use tracing::warn; /// Lists all L7 rules for the project. /// @@ -62,7 +66,56 @@ pub struct RulesCommand { /// Query parameters #[derive(Args)] -struct QueryParameters {} +struct QueryParameters { + #[arg(help_heading = "Query parameters", long)] + _type: Option, + + #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)] + admin_state_up: Option, + + #[arg(help_heading = "Query parameters", long)] + compare_type: Option, + + #[arg(help_heading = "Query parameters", long)] + created_at: Option, + + #[arg(help_heading = "Query parameters", long)] + invert: Option, + + #[arg(help_heading = "Query parameters", long)] + key: Option, + + #[arg(help_heading = "Query parameters", long)] + operating_status: Option, + + /// Project resource for which the operation should be performed. + #[command(flatten)] + project: ProjectInput, + + #[arg(help_heading = "Query parameters", long)] + provisioning_status: Option, + + #[arg(help_heading = "Query parameters", long)] + rule_value: Option, + + #[arg(help_heading = "Query parameters", long)] + updated_at: Option, +} + +/// Project input select group +#[derive(Args)] +#[group(required = false, multiple = false)] +struct ProjectInput { + /// Project Name. + #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_NAME")] + project_name: Option, + /// Project ID. + #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_ID")] + project_id: Option, + /// Current project. + #[arg(long, help_heading = "Path parameters", action = clap::ArgAction::SetTrue)] + current_project: bool, +} /// Path parameters #[derive(Args)] @@ -190,6 +243,77 @@ impl RulesCommand { // Set path parameters ep_builder.l7policy_id(&self.path.l7policy_id); // Set query parameters + if let Some(val) = &self.query.compare_type { + ep_builder.compare_type(val); + } + if let Some(val) = &self.query.created_at { + ep_builder.created_at(val); + } + if let Some(val) = &self.query.invert { + ep_builder.invert(val); + } + if let Some(val) = &self.query.key { + ep_builder.key(val); + } + if let Some(id) = &self.query.project.project_id { + // project_id is passed. No need to lookup + ep_builder.project_id(id); + } else if let Some(name) = &self.query.project.project_name { + // project_name is passed. Need to lookup resource + let mut sub_find_builder = find_project::Request::builder(); + warn!("Querying project by name (because of `--project-name` parameter passed) may not be definite. This may fail in which case parameter `--project-id` should be used instead."); + + sub_find_builder.id(name); + let find_ep = sub_find_builder + .build() + .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?; + let find_data: serde_json::Value = find_by_name(find_ep).query_async(client).await?; + // Try to extract resource id + match find_data.get("id") { + Some(val) => match val.as_str() { + Some(id_str) => { + ep_builder.project_id(id_str.to_owned()); + } + None => { + return Err(OpenStackCliError::ResourceAttributeNotString( + serde_json::to_string(&val)?, + )) + } + }, + None => { + return Err(OpenStackCliError::ResourceAttributeMissing( + "id".to_string(), + )) + } + }; + } else if self.query.project.current_project { + ep_builder.project_id( + client + .get_auth_info() + .ok_or_eyre("Cannot determine current authentication information")? + .token + .user + .id, + ); + } + if let Some(val) = &self.query.provisioning_status { + ep_builder.provisioning_status(val); + } + if let Some(val) = &self.query._type { + ep_builder._type(val); + } + if let Some(val) = &self.query.updated_at { + ep_builder.updated_at(val); + } + if let Some(val) = &self.query.rule_value { + ep_builder.rule_value(val); + } + if let Some(val) = &self.query.operating_status { + ep_builder.operating_status(val); + } + if let Some(val) = &self.query.admin_state_up { + ep_builder.admin_state_up(*val); + } // Set body parameters let ep = ep_builder diff --git a/openstack_cli/src/load_balancer/v2/listener/list.rs b/openstack_cli/src/load_balancer/v2/listener/list.rs index e5d5c0ec7..a12884fb5 100644 --- a/openstack_cli/src/load_balancer/v2/listener/list.rs +++ b/openstack_cli/src/load_balancer/v2/listener/list.rs @@ -31,10 +31,14 @@ use crate::OpenStackCliError; use crate::OutputConfig; use crate::StructTable; +use eyre::OptionExt; +use openstack_sdk::api::find_by_name; +use openstack_sdk::api::identity::v3::project::find as find_project; use openstack_sdk::api::load_balancer::v2::listener::list; use openstack_sdk::api::QueryAsync; use serde_json::Value; use structable_derive::StructTable; +use tracing::warn; /// Lists all listeners for the project. /// @@ -62,7 +66,169 @@ pub struct ListenersCommand { /// Query parameters #[derive(Args)] -struct QueryParameters {} +struct QueryParameters { + /// The administrative state of the resource + /// + #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)] + admin_state_up: Option, + + /// A list of ALPN protocols. Available protocols: http/1.0, http/1.1, h2 + /// + #[arg(help_heading = "Query parameters", long)] + alpn_protocols: Option, + + /// The maximum number of connections permitted for this listener. Default + /// value is -1 which represents infinite connections or a default value + /// defined by the provider driver. + /// + #[arg(help_heading = "Query parameters", long)] + connection_limit: Option, + + /// The UTC date and timestamp when the resource was created. + /// + #[arg(help_heading = "Query parameters", long)] + created_at: Option, + + /// The ID of the pool used by the listener if no L7 policies match. + /// + #[arg(help_heading = "Query parameters", long)] + default_pool_id: Option, + + /// A human-readable description for the resource. + /// + #[arg(help_heading = "Query parameters", long)] + description: Option, + + /// Defines whether the includeSubDomains directive should be added to the + /// Strict-Transport-Security HTTP response header. + /// + #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)] + hsts_include_subdomains: Option, + + /// The value of the max_age directive for the Strict-Transport-Security + /// HTTP response header. + /// + #[arg(help_heading = "Query parameters", long)] + hsts_max_age: Option, + + /// Defines whether the preload directive should be added to the + /// Strict-Transport-Security HTTP response header. + /// + #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)] + hsts_preload: Option, + + /// The ID of the resource + /// + #[arg(help_heading = "Query parameters", long)] + id: Option, + + /// Load balancer ID + /// + #[arg(help_heading = "Query parameters", long)] + load_balancer_id: Option, + + /// Human-readable name of the resource. + /// + #[arg(help_heading = "Query parameters", long)] + name: Option, + + /// Return the list of entities that do not have one or more of the given + /// tags. + /// + #[arg(help_heading = "Query parameters", long)] + not_tags: Option, + + /// Return the list of entities that do not have at least one of the given + /// tags. + /// + #[arg(help_heading = "Query parameters", long)] + not_tags_any: Option, + + /// The operating status of the resource. + /// + #[arg(help_heading = "Query parameters", long, value_parser = ["DEGRADED","DRAINING","ERROR","NO_MONITOR","OFFLINE","ONLINE"])] + operating_status: Option, + + /// Project resource for which the operation should be performed. + #[command(flatten)] + project: ProjectInput, + + /// The protocol for the resource. + /// + #[arg(help_heading = "Query parameters", long, value_parser = ["HTTP","HTTPS","PROMETHEUS","SCTP","TCP","TERMINATED_HTTPS","UDP"])] + protocol: Option, + + /// The protocol port number for the resource. + /// + #[arg(help_heading = "Query parameters", long)] + protocol_port: Option, + + /// The provisioning status of the resource. + /// + #[arg(help_heading = "Query parameters", long, value_parser = ["ACTIVE","DELETED","ERROR","PENDING_CREATE","PENDING_DELETE","PENDING_UPDATE"])] + provisioning_status: Option, + + /// Return the list of entities that have this tag or tags. + /// + #[arg(help_heading = "Query parameters", long)] + tags: Option, + + /// Return the list of entities that have one or more of the given tags. + /// + #[arg(help_heading = "Query parameters", long)] + tags_any: Option, + + /// Frontend client inactivity timeout in milliseconds. + /// + #[arg(help_heading = "Query parameters", long)] + timeout_client_data: Option, + + /// Backend member connection timeout in milliseconds. + /// + #[arg(help_heading = "Query parameters", long)] + timeout_member_connect: Option, + + /// Backend member inactivity timeout in milliseconds. + /// + #[arg(help_heading = "Query parameters", long)] + timeout_member_data: Option, + + /// Time, in milliseconds, to wait for additional TCP packets for content + /// inspection. + /// + #[arg(help_heading = "Query parameters", long)] + timeout_tcp_inspect: Option, + + /// List of ciphers in OpenSSL format + /// + #[arg(help_heading = "Query parameters", long)] + tls_ciphers: Option, + + /// A list of TLS protocol versions. + /// + #[arg(help_heading = "Query parameters", long)] + tls_versions: Option, + + /// The UTC date and timestamp when the resource was last updated. + /// + #[arg(help_heading = "Query parameters", long)] + updated_at: Option, +} + +/// Project input select group +#[derive(Args)] +#[group(required = false, multiple = false)] +struct ProjectInput { + /// Project Name. + #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_NAME")] + project_name: Option, + /// Project ID. + #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_ID")] + project_id: Option, + /// Current project. + #[arg(long, help_heading = "Path parameters", action = clap::ArgAction::SetTrue)] + current_project: bool, +} /// Path parameters #[derive(Args)] @@ -349,10 +515,132 @@ impl ListenersCommand { let op = OutputProcessor::from_args(parsed_args); op.validate_args(parsed_args)?; - let ep_builder = list::Request::builder(); + let mut ep_builder = list::Request::builder(); // Set path parameters // Set query parameters + if let Some(val) = &self.query.id { + ep_builder.id(val); + } + if let Some(val) = &self.query.description { + ep_builder.description(val); + } + if let Some(val) = &self.query.name { + ep_builder.name(val); + } + if let Some(id) = &self.query.project.project_id { + // project_id is passed. No need to lookup + ep_builder.project_id(id); + } else if let Some(name) = &self.query.project.project_name { + // project_name is passed. Need to lookup resource + let mut sub_find_builder = find_project::Request::builder(); + warn!("Querying project by name (because of `--project-name` parameter passed) may not be definite. This may fail in which case parameter `--project-id` should be used instead."); + + sub_find_builder.id(name); + let find_ep = sub_find_builder + .build() + .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?; + let find_data: serde_json::Value = find_by_name(find_ep).query_async(client).await?; + // Try to extract resource id + match find_data.get("id") { + Some(val) => match val.as_str() { + Some(id_str) => { + ep_builder.project_id(id_str.to_owned()); + } + None => { + return Err(OpenStackCliError::ResourceAttributeNotString( + serde_json::to_string(&val)?, + )) + } + }, + None => { + return Err(OpenStackCliError::ResourceAttributeMissing( + "id".to_string(), + )) + } + }; + } else if self.query.project.current_project { + ep_builder.project_id( + client + .get_auth_info() + .ok_or_eyre("Cannot determine current authentication information")? + .token + .user + .id, + ); + } + if let Some(val) = &self.query.connection_limit { + ep_builder.connection_limit(val); + } + if let Some(val) = &self.query.default_pool_id { + ep_builder.default_pool_id(val); + } + if let Some(val) = &self.query.protocol { + ep_builder.protocol(val); + } + if let Some(val) = &self.query.protocol_port { + ep_builder.protocol_port(*val); + } + if let Some(val) = &self.query.created_at { + ep_builder.created_at(val); + } + if let Some(val) = &self.query.updated_at { + ep_builder.updated_at(val); + } + if let Some(val) = &self.query.load_balancer_id { + ep_builder.load_balancer_id(val); + } + if let Some(val) = &self.query.timeout_client_data { + ep_builder.timeout_client_data(*val); + } + if let Some(val) = &self.query.timeout_member_connect { + ep_builder.timeout_member_connect(*val); + } + if let Some(val) = &self.query.timeout_member_data { + ep_builder.timeout_member_data(*val); + } + if let Some(val) = &self.query.timeout_tcp_inspect { + ep_builder.timeout_tcp_inspect(*val); + } + if let Some(val) = &self.query.tls_ciphers { + ep_builder.tls_ciphers(val); + } + if let Some(val) = &self.query.tls_versions { + ep_builder.tls_versions(val); + } + if let Some(val) = &self.query.alpn_protocols { + ep_builder.alpn_protocols(val); + } + if let Some(val) = &self.query.hsts_max_age { + ep_builder.hsts_max_age(*val); + } + if let Some(val) = &self.query.admin_state_up { + ep_builder.admin_state_up(*val); + } + if let Some(val) = &self.query.hsts_include_subdomains { + ep_builder.hsts_include_subdomains(*val); + } + if let Some(val) = &self.query.hsts_preload { + ep_builder.hsts_preload(*val); + } + if let Some(val) = &self.query.provisioning_status { + ep_builder.provisioning_status(val); + } + if let Some(val) = &self.query.operating_status { + ep_builder.operating_status(val); + } + if let Some(val) = &self.query.tags { + ep_builder.tags(val); + } + if let Some(val) = &self.query.tags_any { + ep_builder.tags_any(val); + } + if let Some(val) = &self.query.not_tags { + ep_builder.not_tags(val); + } + if let Some(val) = &self.query.not_tags_any { + ep_builder.not_tags_any(val); + } // Set body parameters let ep = ep_builder diff --git a/openstack_cli/src/load_balancer/v2/loadbalancer/list.rs b/openstack_cli/src/load_balancer/v2/loadbalancer/list.rs index 97cc4337c..90c9d987c 100644 --- a/openstack_cli/src/load_balancer/v2/loadbalancer/list.rs +++ b/openstack_cli/src/load_balancer/v2/loadbalancer/list.rs @@ -31,10 +31,14 @@ use crate::OpenStackCliError; use crate::OutputConfig; use crate::StructTable; +use eyre::OptionExt; +use openstack_sdk::api::find_by_name; +use openstack_sdk::api::identity::v3::project::find as find_project; use openstack_sdk::api::load_balancer::v2::loadbalancer::list; use openstack_sdk::api::QueryAsync; use serde_json::Value; use structable_derive::StructTable; +use tracing::warn; /// Lists all load balancers for the project. /// @@ -62,7 +66,113 @@ pub struct LoadbalancersCommand { /// Query parameters #[derive(Args)] -struct QueryParameters {} +struct QueryParameters { + /// An availability zone name. + /// + #[arg(help_heading = "Query parameters", long)] + availability_zone: Option, + + /// A human-readable description for the resource. + /// + #[arg(help_heading = "Query parameters", long)] + description: Option, + + /// The ID of the flavor. + /// + #[arg(help_heading = "Query parameters", long)] + flavor_id: Option, + + /// The ID of the resource + /// + #[arg(help_heading = "Query parameters", long)] + id: Option, + + /// Human-readable name of the resource. + /// + #[arg(help_heading = "Query parameters", long)] + name: Option, + + /// Return the list of entities that do not have one or more of the given + /// tags. + /// + #[arg(help_heading = "Query parameters", long)] + not_tags: Option, + + /// Return the list of entities that do not have at least one of the given + /// tags. + /// + #[arg(help_heading = "Query parameters", long)] + not_tags_any: Option, + + /// The operating status of the resource. + /// + #[arg(help_heading = "Query parameters", long, value_parser = ["DEGRADED","DRAINING","ERROR","NO_MONITOR","OFFLINE","ONLINE"])] + operating_status: Option, + + /// Project resource for which the operation should be performed. + #[command(flatten)] + project: ProjectInput, + + /// Provider name for the load balancer. + /// + #[arg(help_heading = "Query parameters", long)] + provider: Option, + + /// The provisioning status of the resource. + /// + #[arg(help_heading = "Query parameters", long, value_parser = ["ACTIVE","DELETED","ERROR","PENDING_CREATE","PENDING_DELETE","PENDING_UPDATE"])] + provisioning_status: Option, + + /// Return the list of entities that have this tag or tags. + /// + #[arg(help_heading = "Query parameters", long)] + tags: Option, + + /// Return the list of entities that have one or more of the given tags. + /// + #[arg(help_heading = "Query parameters", long)] + tags_any: Option, + + /// The IP address of the Virtual IP (VIP). + /// + #[arg(help_heading = "Query parameters", long)] + vip_address: Option, + + /// The ID of the network for the Virtual IP (VIP). + /// + #[arg(help_heading = "Query parameters", long)] + vip_network_id: Option, + + /// The ID of the Virtual IP (VIP) port. + /// + #[arg(help_heading = "Query parameters", long)] + vip_port_id: Option, + + /// The ID of the QoS Policy which will apply to the Virtual IP (VIP). + /// + #[arg(help_heading = "Query parameters", long)] + vip_qos_policy_id: Option, + + /// The ID of the subnet for the Virtual IP (VIP). + /// + #[arg(help_heading = "Query parameters", long)] + vip_subnet_id: Option, +} + +/// Project input select group +#[derive(Args)] +#[group(required = false, multiple = false)] +struct ProjectInput { + /// Project Name. + #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_NAME")] + project_name: Option, + /// Project ID. + #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_ID")] + project_id: Option, + /// Current project. + #[arg(long, help_heading = "Path parameters", action = clap::ArgAction::SetTrue)] + current_project: bool, +} /// Path parameters #[derive(Args)] @@ -233,10 +343,102 @@ impl LoadbalancersCommand { let op = OutputProcessor::from_args(parsed_args); op.validate_args(parsed_args)?; - let ep_builder = list::Request::builder(); + let mut ep_builder = list::Request::builder(); // Set path parameters // Set query parameters + if let Some(val) = &self.query.description { + ep_builder.description(val); + } + if let Some(val) = &self.query.name { + ep_builder.name(val); + } + if let Some(val) = &self.query.id { + ep_builder.id(val); + } + if let Some(id) = &self.query.project.project_id { + // project_id is passed. No need to lookup + ep_builder.project_id(id); + } else if let Some(name) = &self.query.project.project_name { + // project_name is passed. Need to lookup resource + let mut sub_find_builder = find_project::Request::builder(); + warn!("Querying project by name (because of `--project-name` parameter passed) may not be definite. This may fail in which case parameter `--project-id` should be used instead."); + + sub_find_builder.id(name); + let find_ep = sub_find_builder + .build() + .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?; + let find_data: serde_json::Value = find_by_name(find_ep).query_async(client).await?; + // Try to extract resource id + match find_data.get("id") { + Some(val) => match val.as_str() { + Some(id_str) => { + ep_builder.project_id(id_str.to_owned()); + } + None => { + return Err(OpenStackCliError::ResourceAttributeNotString( + serde_json::to_string(&val)?, + )) + } + }, + None => { + return Err(OpenStackCliError::ResourceAttributeMissing( + "id".to_string(), + )) + } + }; + } else if self.query.project.current_project { + ep_builder.project_id( + client + .get_auth_info() + .ok_or_eyre("Cannot determine current authentication information")? + .token + .user + .id, + ); + } + if let Some(val) = &self.query.flavor_id { + ep_builder.flavor_id(val); + } + if let Some(val) = &self.query.provider { + ep_builder.provider(val); + } + if let Some(val) = &self.query.vip_address { + ep_builder.vip_address(val); + } + if let Some(val) = &self.query.vip_network_id { + ep_builder.vip_network_id(val); + } + if let Some(val) = &self.query.vip_port_id { + ep_builder.vip_port_id(val); + } + if let Some(val) = &self.query.vip_subnet_id { + ep_builder.vip_subnet_id(val); + } + if let Some(val) = &self.query.vip_qos_policy_id { + ep_builder.vip_qos_policy_id(val); + } + if let Some(val) = &self.query.availability_zone { + ep_builder.availability_zone(val); + } + if let Some(val) = &self.query.provisioning_status { + ep_builder.provisioning_status(val); + } + if let Some(val) = &self.query.operating_status { + ep_builder.operating_status(val); + } + if let Some(val) = &self.query.tags { + ep_builder.tags(val); + } + if let Some(val) = &self.query.tags_any { + ep_builder.tags_any(val); + } + if let Some(val) = &self.query.not_tags { + ep_builder.not_tags(val); + } + if let Some(val) = &self.query.not_tags_any { + ep_builder.not_tags_any(val); + } // Set body parameters let ep = ep_builder diff --git a/openstack_cli/src/load_balancer/v2/pool/list.rs b/openstack_cli/src/load_balancer/v2/pool/list.rs index a6390da9a..8f2e48ab0 100644 --- a/openstack_cli/src/load_balancer/v2/pool/list.rs +++ b/openstack_cli/src/load_balancer/v2/pool/list.rs @@ -31,10 +31,14 @@ use crate::OpenStackCliError; use crate::OutputConfig; use crate::StructTable; +use eyre::OptionExt; +use openstack_sdk::api::find_by_name; +use openstack_sdk::api::identity::v3::project::find as find_project; use openstack_sdk::api::load_balancer::v2::pool::list; use openstack_sdk::api::QueryAsync; use serde_json::Value; use structable_derive::StructTable; +use tracing::warn; /// Lists all pools for the project. /// @@ -62,7 +66,106 @@ pub struct PoolsCommand { /// Query parameters #[derive(Args)] -struct QueryParameters {} +struct QueryParameters { + /// The administrative state of the resource + /// + #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)] + admin_state_up: Option, + + /// A list of ALPN protocols. Available protocols: http/1.0, http/1.1, h2 + /// + #[arg(help_heading = "Query parameters", long)] + alpn_protocols: Option, + + /// The UTC date and timestamp when the resource was created. + /// + #[arg(help_heading = "Query parameters", long)] + created_at: Option, + + /// A human-readable description for the resource. + /// + #[arg(help_heading = "Query parameters", long)] + description: Option, + + /// The ID of the resource + /// + #[arg(help_heading = "Query parameters", long)] + id: Option, + + /// Human-readable name of the resource. + /// + #[arg(help_heading = "Query parameters", long)] + name: Option, + + /// Return the list of entities that do not have one or more of the given + /// tags. + /// + #[arg(help_heading = "Query parameters", long)] + not_tags: Option, + + /// Return the list of entities that do not have at least one of the given + /// tags. + /// + #[arg(help_heading = "Query parameters", long)] + not_tags_any: Option, + + /// The operating status of the resource. + /// + #[arg(help_heading = "Query parameters", long, value_parser = ["DEGRADED","DRAINING","ERROR","NO_MONITOR","OFFLINE","ONLINE"])] + operating_status: Option, + + /// Project resource for which the operation should be performed. + #[command(flatten)] + project: ProjectInput, + + /// The provisioning status of the resource. + /// + #[arg(help_heading = "Query parameters", long, value_parser = ["ACTIVE","DELETED","ERROR","PENDING_CREATE","PENDING_DELETE","PENDING_UPDATE"])] + provisioning_status: Option, + + /// Return the list of entities that have this tag or tags. + /// + #[arg(help_heading = "Query parameters", long)] + tags: Option, + + /// Return the list of entities that have one or more of the given tags. + /// + #[arg(help_heading = "Query parameters", long)] + tags_any: Option, + + /// List of ciphers in OpenSSL format + /// + #[arg(help_heading = "Query parameters", long)] + tls_ciphers: Option, + + #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)] + tls_enabled: Option, + + /// A list of TLS protocol versions. + /// + #[arg(help_heading = "Query parameters", long)] + tls_versions: Option, + + /// The UTC date and timestamp when the resource was last updated. + /// + #[arg(help_heading = "Query parameters", long)] + updated_at: Option, +} + +/// Project input select group +#[derive(Args)] +#[group(required = false, multiple = false)] +struct ProjectInput { + /// Project Name. + #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_NAME")] + project_name: Option, + /// Project ID. + #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_ID")] + project_id: Option, + /// Current project. + #[arg(long, help_heading = "Path parameters", action = clap::ArgAction::SetTrue)] + current_project: bool, +} /// Path parameters #[derive(Args)] @@ -265,10 +368,99 @@ impl PoolsCommand { let op = OutputProcessor::from_args(parsed_args); op.validate_args(parsed_args)?; - let ep_builder = list::Request::builder(); + let mut ep_builder = list::Request::builder(); // Set path parameters // Set query parameters + if let Some(val) = &self.query.id { + ep_builder.id(val); + } + if let Some(val) = &self.query.description { + ep_builder.description(val); + } + if let Some(val) = &self.query.name { + ep_builder.name(val); + } + if let Some(id) = &self.query.project.project_id { + // project_id is passed. No need to lookup + ep_builder.project_id(id); + } else if let Some(name) = &self.query.project.project_name { + // project_name is passed. Need to lookup resource + let mut sub_find_builder = find_project::Request::builder(); + warn!("Querying project by name (because of `--project-name` parameter passed) may not be definite. This may fail in which case parameter `--project-id` should be used instead."); + + sub_find_builder.id(name); + let find_ep = sub_find_builder + .build() + .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?; + let find_data: serde_json::Value = find_by_name(find_ep).query_async(client).await?; + // Try to extract resource id + match find_data.get("id") { + Some(val) => match val.as_str() { + Some(id_str) => { + ep_builder.project_id(id_str.to_owned()); + } + None => { + return Err(OpenStackCliError::ResourceAttributeNotString( + serde_json::to_string(&val)?, + )) + } + }, + None => { + return Err(OpenStackCliError::ResourceAttributeMissing( + "id".to_string(), + )) + } + }; + } else if self.query.project.current_project { + ep_builder.project_id( + client + .get_auth_info() + .ok_or_eyre("Cannot determine current authentication information")? + .token + .user + .id, + ); + } + if let Some(val) = &self.query.admin_state_up { + ep_builder.admin_state_up(*val); + } + if let Some(val) = &self.query.created_at { + ep_builder.created_at(val); + } + if let Some(val) = &self.query.updated_at { + ep_builder.updated_at(val); + } + if let Some(val) = &self.query.tls_enabled { + ep_builder.tls_enabled(*val); + } + if let Some(val) = &self.query.tls_ciphers { + ep_builder.tls_ciphers(val); + } + if let Some(val) = &self.query.tls_versions { + ep_builder.tls_versions(val); + } + if let Some(val) = &self.query.alpn_protocols { + ep_builder.alpn_protocols(val); + } + if let Some(val) = &self.query.provisioning_status { + ep_builder.provisioning_status(val); + } + if let Some(val) = &self.query.operating_status { + ep_builder.operating_status(val); + } + if let Some(val) = &self.query.tags { + ep_builder.tags(val); + } + if let Some(val) = &self.query.tags_any { + ep_builder.tags_any(val); + } + if let Some(val) = &self.query.not_tags { + ep_builder.not_tags(val); + } + if let Some(val) = &self.query.not_tags_any { + ep_builder.not_tags_any(val); + } // Set body parameters let ep = ep_builder diff --git a/openstack_cli/src/load_balancer/v2/pool/member/list.rs b/openstack_cli/src/load_balancer/v2/pool/member/list.rs index a19300937..ef1a4c536 100644 --- a/openstack_cli/src/load_balancer/v2/pool/member/list.rs +++ b/openstack_cli/src/load_balancer/v2/pool/member/list.rs @@ -31,10 +31,14 @@ use crate::OpenStackCliError; use crate::OutputConfig; use crate::StructTable; +use eyre::OptionExt; +use openstack_sdk::api::find_by_name; +use openstack_sdk::api::identity::v3::project::find as find_project; use openstack_sdk::api::load_balancer::v2::pool::member::list; use openstack_sdk::api::QueryAsync; use serde_json::Value; use structable_derive::StructTable; +use tracing::warn; /// Lists all members for the project. /// @@ -62,7 +66,124 @@ pub struct MembersCommand { /// Query parameters #[derive(Args)] -struct QueryParameters {} +struct QueryParameters { + /// The IP address of the backend member server. + /// + #[arg(help_heading = "Query parameters", long)] + address: Option, + + /// The administrative state of the resource + /// + #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)] + admin_state_up: Option, + + /// Is the member a backup? + /// + #[arg(action=clap::ArgAction::Set, help_heading = "Query parameters", long)] + backup: Option, + + /// The UTC date and timestamp when the resource was created. + /// + #[arg(help_heading = "Query parameters", long)] + created_at: Option, + + /// A human-readable description for the resource. + /// + #[arg(help_heading = "Query parameters", long)] + description: Option, + + /// The ID of the resource + /// + #[arg(help_heading = "Query parameters", long)] + id: Option, + + /// An alternate IP address used for health monitoring a backend member. + /// + #[arg(help_heading = "Query parameters", long)] + monitor_address: Option, + + /// An alternate protocol port used for health monitoring a backend member. + /// + #[arg(help_heading = "Query parameters", long)] + monitor_port: Option, + + /// Human-readable name of the resource. + /// + #[arg(help_heading = "Query parameters", long)] + name: Option, + + /// Return the list of entities that do not have one or more of the given + /// tags. + /// + #[arg(help_heading = "Query parameters", long)] + not_tags: Option, + + /// Return the list of entities that do not have at least one of the given + /// tags. + /// + #[arg(help_heading = "Query parameters", long)] + not_tags_any: Option, + + /// The operating status of the resource. + /// + #[arg(help_heading = "Query parameters", long, value_parser = ["DEGRADED","DRAINING","ERROR","NO_MONITOR","OFFLINE","ONLINE"])] + operating_status: Option, + + /// Project resource for which the operation should be performed. + #[command(flatten)] + project: ProjectInput, + + /// The protocol port number the backend member server is listening on. + /// + #[arg(help_heading = "Query parameters", long)] + protocol_port: Option, + + /// The provisioning status of the resource. + /// + #[arg(help_heading = "Query parameters", long, value_parser = ["ACTIVE","DELETED","ERROR","PENDING_CREATE","PENDING_DELETE","PENDING_UPDATE"])] + provisioning_status: Option, + + /// The subnet ID the member service is accessible from. + /// + #[arg(help_heading = "Query parameters", long)] + subnet_id: Option, + + /// Return the list of entities that have this tag or tags. + /// + #[arg(help_heading = "Query parameters", long)] + tags: Option, + + /// Return the list of entities that have one or more of the given tags. + /// + #[arg(help_heading = "Query parameters", long)] + tags_any: Option, + + /// The UTC date and timestamp when the resource was last updated. + /// + #[arg(help_heading = "Query parameters", long)] + updated_at: Option, + + /// The weight of a member determines the portion of requests or + /// connections it services compared to the other members of the pool. + /// + #[arg(help_heading = "Query parameters", long)] + weight: Option, +} + +/// Project input select group +#[derive(Args)] +#[group(required = false, multiple = false)] +struct ProjectInput { + /// Project Name. + #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_NAME")] + project_name: Option, + /// Project ID. + #[arg(long, help_heading = "Path parameters", value_name = "PROJECT_ID")] + project_id: Option, + /// Current project. + #[arg(long, help_heading = "Path parameters", action = clap::ArgAction::SetTrue)] + current_project: bool, +} /// Path parameters #[derive(Args)] @@ -212,6 +333,104 @@ impl MembersCommand { // Set path parameters ep_builder.pool_id(&self.path.pool_id); // Set query parameters + if let Some(val) = &self.query.id { + ep_builder.id(val); + } + if let Some(val) = &self.query.description { + ep_builder.description(val); + } + if let Some(val) = &self.query.name { + ep_builder.name(val); + } + if let Some(id) = &self.query.project.project_id { + // project_id is passed. No need to lookup + ep_builder.project_id(id); + } else if let Some(name) = &self.query.project.project_name { + // project_name is passed. Need to lookup resource + let mut sub_find_builder = find_project::Request::builder(); + warn!("Querying project by name (because of `--project-name` parameter passed) may not be definite. This may fail in which case parameter `--project-id` should be used instead."); + + sub_find_builder.id(name); + let find_ep = sub_find_builder + .build() + .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?; + let find_data: serde_json::Value = find_by_name(find_ep).query_async(client).await?; + // Try to extract resource id + match find_data.get("id") { + Some(val) => match val.as_str() { + Some(id_str) => { + ep_builder.project_id(id_str.to_owned()); + } + None => { + return Err(OpenStackCliError::ResourceAttributeNotString( + serde_json::to_string(&val)?, + )) + } + }, + None => { + return Err(OpenStackCliError::ResourceAttributeMissing( + "id".to_string(), + )) + } + }; + } else if self.query.project.current_project { + ep_builder.project_id( + client + .get_auth_info() + .ok_or_eyre("Cannot determine current authentication information")? + .token + .user + .id, + ); + } + if let Some(val) = &self.query.admin_state_up { + ep_builder.admin_state_up(*val); + } + if let Some(val) = &self.query.created_at { + ep_builder.created_at(val); + } + if let Some(val) = &self.query.updated_at { + ep_builder.updated_at(val); + } + if let Some(val) = &self.query.address { + ep_builder.address(val); + } + if let Some(val) = &self.query.protocol_port { + ep_builder.protocol_port(*val); + } + if let Some(val) = &self.query.subnet_id { + ep_builder.subnet_id(val); + } + if let Some(val) = &self.query.weight { + ep_builder.weight(*val); + } + if let Some(val) = &self.query.monitor_address { + ep_builder.monitor_address(val); + } + if let Some(val) = &self.query.monitor_port { + ep_builder.monitor_port(val); + } + if let Some(val) = &self.query.backup { + ep_builder.backup(*val); + } + if let Some(val) = &self.query.provisioning_status { + ep_builder.provisioning_status(val); + } + if let Some(val) = &self.query.operating_status { + ep_builder.operating_status(val); + } + if let Some(val) = &self.query.tags { + ep_builder.tags(val); + } + if let Some(val) = &self.query.tags_any { + ep_builder.tags_any(val); + } + if let Some(val) = &self.query.not_tags { + ep_builder.not_tags(val); + } + if let Some(val) = &self.query.not_tags_any { + ep_builder.not_tags_any(val); + } // Set body parameters let ep = ep_builder diff --git a/openstack_cli/src/load_balancer/v2/provider/list.rs b/openstack_cli/src/load_balancer/v2/provider/list.rs index 222ecd1ae..386a2ae8b 100644 --- a/openstack_cli/src/load_balancer/v2/provider/list.rs +++ b/openstack_cli/src/load_balancer/v2/provider/list.rs @@ -56,7 +56,13 @@ pub struct ProvidersCommand { /// Query parameters #[derive(Args)] -struct QueryParameters {} +struct QueryParameters { + #[arg(help_heading = "Query parameters", long)] + description: Option, + + #[arg(help_heading = "Query parameters", long)] + name: Option, +} /// Path parameters #[derive(Args)] @@ -89,10 +95,16 @@ impl ProvidersCommand { let op = OutputProcessor::from_args(parsed_args); op.validate_args(parsed_args)?; - let ep_builder = list::Request::builder(); + let mut ep_builder = list::Request::builder(); // Set path parameters // Set query parameters + if let Some(val) = &self.query.description { + ep_builder.description(val); + } + if let Some(val) = &self.query.name { + ep_builder.name(val); + } // Set body parameters let ep = ep_builder diff --git a/openstack_sdk/src/api/load_balancer/v2/amphorae/list.rs b/openstack_sdk/src/api/load_balancer/v2/amphorae/list.rs index e9f409b46..e8127ecd1 100644 --- a/openstack_sdk/src/api/load_balancer/v2/amphorae/list.rs +++ b/openstack_sdk/src/api/load_balancer/v2/amphorae/list.rs @@ -32,20 +32,82 @@ use http::{HeaderMap, HeaderName, HeaderValue}; use crate::api::rest_endpoint_prelude::*; +use std::borrow::Cow; + #[derive(Builder, Debug, Clone)] #[builder(setter(strip_option))] -pub struct Request { +pub struct Request<'a> { + #[builder(default, setter(into))] + cached_zone: Option>, + + #[builder(default, setter(into))] + cert_busy: Option>, + + #[builder(default, setter(into))] + cert_expiration: Option>, + + #[builder(default, setter(into))] + compute_flavor: Option>, + + #[builder(default, setter(into))] + compute_id: Option>, + + #[builder(default, setter(into))] + created_at: Option>, + + #[builder(default, setter(into))] + ha_ip: Option>, + + #[builder(default, setter(into))] + ha_port_id: Option>, + + #[builder(default, setter(into))] + id: Option>, + + #[builder(default, setter(into))] + image_id: Option>, + + #[builder(default, setter(into))] + lb_network_ip: Option>, + + #[builder(default, setter(into))] + loadbalancer_id: Option>, + + #[builder(default, setter(into))] + role: Option>, + + #[builder(default, setter(into))] + status: Option>, + + #[builder(default, setter(into))] + updated_at: Option>, + + #[builder(default, setter(into))] + vrrp_id: Option>, + + #[builder(default, setter(into))] + vrrp_interface: Option>, + + #[builder(default, setter(into))] + vrrp_ip: Option>, + + #[builder(default, setter(into))] + vrrp_port_id: Option>, + + #[builder(default, setter(into))] + vrrp_priority: Option>, + #[builder(setter(name = "_headers"), default, private)] _headers: Option, } -impl Request { +impl<'a> Request<'a> { /// Create a builder for the endpoint. - pub fn builder() -> RequestBuilder { + pub fn builder() -> RequestBuilder<'a> { RequestBuilder::default() } } -impl RequestBuilder { +impl<'a> RequestBuilder<'a> { /// Add a single header to the Amphorae. pub fn header(&mut self, header_name: &'static str, header_value: &'static str) -> &mut Self where { @@ -70,7 +132,7 @@ where { } } -impl RestEndpoint for Request { +impl<'a> RestEndpoint for Request<'a> { fn method(&self) -> http::Method { http::Method::GET } @@ -80,7 +142,29 @@ impl RestEndpoint for Request { } fn parameters(&self) -> QueryParams { - QueryParams::default() + let mut params = QueryParams::default(); + params.push_opt("id", self.id.as_ref()); + params.push_opt("loadbalancer_id", self.loadbalancer_id.as_ref()); + params.push_opt("compute_id", self.compute_id.as_ref()); + params.push_opt("lb_network_ip", self.lb_network_ip.as_ref()); + params.push_opt("vrrp_ip", self.vrrp_ip.as_ref()); + params.push_opt("ha_ip", self.ha_ip.as_ref()); + params.push_opt("vrrp_port_id", self.vrrp_port_id.as_ref()); + params.push_opt("ha_port_id", self.ha_port_id.as_ref()); + params.push_opt("cert_expiration", self.cert_expiration.as_ref()); + params.push_opt("cert_busy", self.cert_busy.as_ref()); + params.push_opt("role", self.role.as_ref()); + params.push_opt("status", self.status.as_ref()); + params.push_opt("vrrp_interface", self.vrrp_interface.as_ref()); + params.push_opt("vrrp_id", self.vrrp_id.as_ref()); + params.push_opt("vrrp_priority", self.vrrp_priority.as_ref()); + params.push_opt("cached_zone", self.cached_zone.as_ref()); + params.push_opt("created_at", self.created_at.as_ref()); + params.push_opt("updated_at", self.updated_at.as_ref()); + params.push_opt("image_id", self.image_id.as_ref()); + params.push_opt("compute_flavor", self.compute_flavor.as_ref()); + + params } fn service_type(&self) -> ServiceType { diff --git a/openstack_sdk/src/api/load_balancer/v2/availability_zone/list.rs b/openstack_sdk/src/api/load_balancer/v2/availability_zone/list.rs index 2d5306ed1..c0be028c1 100644 --- a/openstack_sdk/src/api/load_balancer/v2/availability_zone/list.rs +++ b/openstack_sdk/src/api/load_balancer/v2/availability_zone/list.rs @@ -22,20 +22,34 @@ use http::{HeaderMap, HeaderName, HeaderValue}; use crate::api::rest_endpoint_prelude::*; +use std::borrow::Cow; + #[derive(Builder, Debug, Clone)] #[builder(setter(strip_option))] -pub struct Request { +pub struct Request<'a> { + #[builder(default, setter(into))] + availability_zone_profile_id: Option>, + + #[builder(default, setter(into))] + description: Option>, + + #[builder(default, setter(into))] + name: Option>, + + #[builder(default, setter(into))] + status: Option>, + #[builder(setter(name = "_headers"), default, private)] _headers: Option, } -impl Request { +impl<'a> Request<'a> { /// Create a builder for the endpoint. - pub fn builder() -> RequestBuilder { + pub fn builder() -> RequestBuilder<'a> { RequestBuilder::default() } } -impl RequestBuilder { +impl<'a> RequestBuilder<'a> { /// Add a single header to the Availability_Zone. pub fn header(&mut self, header_name: &'static str, header_value: &'static str) -> &mut Self where { @@ -60,7 +74,7 @@ where { } } -impl RestEndpoint for Request { +impl<'a> RestEndpoint for Request<'a> { fn method(&self) -> http::Method { http::Method::GET } @@ -70,7 +84,16 @@ impl RestEndpoint for Request { } fn parameters(&self) -> QueryParams { - QueryParams::default() + let mut params = QueryParams::default(); + params.push_opt("name", self.name.as_ref()); + params.push_opt("description", self.description.as_ref()); + params.push_opt( + "availability_zone_profile_id", + self.availability_zone_profile_id.as_ref(), + ); + params.push_opt("status", self.status.as_ref()); + + params } fn service_type(&self) -> ServiceType { diff --git a/openstack_sdk/src/api/load_balancer/v2/availability_zone_profile/find.rs b/openstack_sdk/src/api/load_balancer/v2/availability_zone_profile/find.rs index f6a97f7e6..a42e43536 100644 --- a/openstack_sdk/src/api/load_balancer/v2/availability_zone_profile/find.rs +++ b/openstack_sdk/src/api/load_balancer/v2/availability_zone_profile/find.rs @@ -69,7 +69,7 @@ where { impl<'a> Findable for Request<'a> { type G = Get::Request<'a>; - type L = List::Request; + type L = List::Request<'a>; fn get_ep(&self) -> Get::Request<'a> { let mut ep = Get::Request::builder(); ep.id(self.id.clone()); @@ -78,7 +78,7 @@ impl<'a> Findable for Request<'a> { } ep.build().unwrap() } - fn list_ep(&self) -> List::Request { + fn list_ep(&self) -> List::Request<'a> { let mut ep = List::Request::builder(); if let Some(headers) = &self._headers { ep.headers(headers.iter().map(|(k, v)| (Some(k.clone()), v.clone()))); diff --git a/openstack_sdk/src/api/load_balancer/v2/availability_zone_profile/list.rs b/openstack_sdk/src/api/load_balancer/v2/availability_zone_profile/list.rs index 93f604557..45eb2fc81 100644 --- a/openstack_sdk/src/api/load_balancer/v2/availability_zone_profile/list.rs +++ b/openstack_sdk/src/api/load_balancer/v2/availability_zone_profile/list.rs @@ -22,20 +22,34 @@ use http::{HeaderMap, HeaderName, HeaderValue}; use crate::api::rest_endpoint_prelude::*; +use std::borrow::Cow; + #[derive(Builder, Debug, Clone)] #[builder(setter(strip_option))] -pub struct Request { +pub struct Request<'a> { + #[builder(default, setter(into))] + availability_zone_data: Option>, + + #[builder(default, setter(into))] + id: Option>, + + #[builder(default, setter(into))] + name: Option>, + + #[builder(default, setter(into))] + provider_name: Option>, + #[builder(setter(name = "_headers"), default, private)] _headers: Option, } -impl Request { +impl<'a> Request<'a> { /// Create a builder for the endpoint. - pub fn builder() -> RequestBuilder { + pub fn builder() -> RequestBuilder<'a> { RequestBuilder::default() } } -impl RequestBuilder { +impl<'a> RequestBuilder<'a> { /// Add a single header to the Availability_Zone_Profile. pub fn header(&mut self, header_name: &'static str, header_value: &'static str) -> &mut Self where { @@ -60,7 +74,7 @@ where { } } -impl RestEndpoint for Request { +impl<'a> RestEndpoint for Request<'a> { fn method(&self) -> http::Method { http::Method::GET } @@ -70,7 +84,16 @@ impl RestEndpoint for Request { } fn parameters(&self) -> QueryParams { - QueryParams::default() + let mut params = QueryParams::default(); + params.push_opt("id", self.id.as_ref()); + params.push_opt("name", self.name.as_ref()); + params.push_opt("provider_name", self.provider_name.as_ref()); + params.push_opt( + "availability_zone_data", + self.availability_zone_data.as_ref(), + ); + + params } fn service_type(&self) -> ServiceType { diff --git a/openstack_sdk/src/api/load_balancer/v2/flavor/find.rs b/openstack_sdk/src/api/load_balancer/v2/flavor/find.rs index ef59330c2..be5bf1173 100644 --- a/openstack_sdk/src/api/load_balancer/v2/flavor/find.rs +++ b/openstack_sdk/src/api/load_balancer/v2/flavor/find.rs @@ -69,7 +69,7 @@ where { impl<'a> Findable for Request<'a> { type G = Get::Request<'a>; - type L = List::Request; + type L = List::Request<'a>; fn get_ep(&self) -> Get::Request<'a> { let mut ep = Get::Request::builder(); ep.id(self.id.clone()); @@ -78,7 +78,7 @@ impl<'a> Findable for Request<'a> { } ep.build().unwrap() } - fn list_ep(&self) -> List::Request { + fn list_ep(&self) -> List::Request<'a> { let mut ep = List::Request::builder(); if let Some(headers) = &self._headers { ep.headers(headers.iter().map(|(k, v)| (Some(k.clone()), v.clone()))); diff --git a/openstack_sdk/src/api/load_balancer/v2/flavor/list.rs b/openstack_sdk/src/api/load_balancer/v2/flavor/list.rs index 98f51950c..90abe683e 100644 --- a/openstack_sdk/src/api/load_balancer/v2/flavor/list.rs +++ b/openstack_sdk/src/api/load_balancer/v2/flavor/list.rs @@ -22,20 +22,37 @@ use http::{HeaderMap, HeaderName, HeaderValue}; use crate::api::rest_endpoint_prelude::*; +use std::borrow::Cow; + #[derive(Builder, Debug, Clone)] #[builder(setter(strip_option))] -pub struct Request { +pub struct Request<'a> { + #[builder(default, setter(into))] + description: Option>, + + #[builder(default)] + enabled: Option, + + #[builder(default, setter(into))] + flavor_profile_id: Option>, + + #[builder(default, setter(into))] + id: Option>, + + #[builder(default, setter(into))] + name: Option>, + #[builder(setter(name = "_headers"), default, private)] _headers: Option, } -impl Request { +impl<'a> Request<'a> { /// Create a builder for the endpoint. - pub fn builder() -> RequestBuilder { + pub fn builder() -> RequestBuilder<'a> { RequestBuilder::default() } } -impl RequestBuilder { +impl<'a> RequestBuilder<'a> { /// Add a single header to the Flavor. pub fn header(&mut self, header_name: &'static str, header_value: &'static str) -> &mut Self where { @@ -60,7 +77,7 @@ where { } } -impl RestEndpoint for Request { +impl<'a> RestEndpoint for Request<'a> { fn method(&self) -> http::Method { http::Method::GET } @@ -70,7 +87,14 @@ impl RestEndpoint for Request { } fn parameters(&self) -> QueryParams { - QueryParams::default() + let mut params = QueryParams::default(); + params.push_opt("id", self.id.as_ref()); + params.push_opt("name", self.name.as_ref()); + params.push_opt("description", self.description.as_ref()); + params.push_opt("flavor_profile_id", self.flavor_profile_id.as_ref()); + params.push_opt("enabled", self.enabled); + + params } fn service_type(&self) -> ServiceType { diff --git a/openstack_sdk/src/api/load_balancer/v2/flavor_profile/find.rs b/openstack_sdk/src/api/load_balancer/v2/flavor_profile/find.rs index ce633c59b..109709ccd 100644 --- a/openstack_sdk/src/api/load_balancer/v2/flavor_profile/find.rs +++ b/openstack_sdk/src/api/load_balancer/v2/flavor_profile/find.rs @@ -69,7 +69,7 @@ where { impl<'a> Findable for Request<'a> { type G = Get::Request<'a>; - type L = List::Request; + type L = List::Request<'a>; fn get_ep(&self) -> Get::Request<'a> { let mut ep = Get::Request::builder(); ep.id(self.id.clone()); @@ -78,7 +78,7 @@ impl<'a> Findable for Request<'a> { } ep.build().unwrap() } - fn list_ep(&self) -> List::Request { + fn list_ep(&self) -> List::Request<'a> { let mut ep = List::Request::builder(); if let Some(headers) = &self._headers { ep.headers(headers.iter().map(|(k, v)| (Some(k.clone()), v.clone()))); diff --git a/openstack_sdk/src/api/load_balancer/v2/flavor_profile/list.rs b/openstack_sdk/src/api/load_balancer/v2/flavor_profile/list.rs index 379493e38..e6f31f338 100644 --- a/openstack_sdk/src/api/load_balancer/v2/flavor_profile/list.rs +++ b/openstack_sdk/src/api/load_balancer/v2/flavor_profile/list.rs @@ -22,20 +22,34 @@ use http::{HeaderMap, HeaderName, HeaderValue}; use crate::api::rest_endpoint_prelude::*; +use std::borrow::Cow; + #[derive(Builder, Debug, Clone)] #[builder(setter(strip_option))] -pub struct Request { +pub struct Request<'a> { + #[builder(default, setter(into))] + flavor_data: Option>, + + #[builder(default, setter(into))] + id: Option>, + + #[builder(default, setter(into))] + name: Option>, + + #[builder(default, setter(into))] + provider_name: Option>, + #[builder(setter(name = "_headers"), default, private)] _headers: Option, } -impl Request { +impl<'a> Request<'a> { /// Create a builder for the endpoint. - pub fn builder() -> RequestBuilder { + pub fn builder() -> RequestBuilder<'a> { RequestBuilder::default() } } -impl RequestBuilder { +impl<'a> RequestBuilder<'a> { /// Add a single header to the Flavor_Profile. pub fn header(&mut self, header_name: &'static str, header_value: &'static str) -> &mut Self where { @@ -60,7 +74,7 @@ where { } } -impl RestEndpoint for Request { +impl<'a> RestEndpoint for Request<'a> { fn method(&self) -> http::Method { http::Method::GET } @@ -70,7 +84,13 @@ impl RestEndpoint for Request { } fn parameters(&self) -> QueryParams { - QueryParams::default() + let mut params = QueryParams::default(); + params.push_opt("id", self.id.as_ref()); + params.push_opt("name", self.name.as_ref()); + params.push_opt("provider_name", self.provider_name.as_ref()); + params.push_opt("flavor_data", self.flavor_data.as_ref()); + + params } fn service_type(&self) -> ServiceType { diff --git a/openstack_sdk/src/api/load_balancer/v2/healthmonitor/find.rs b/openstack_sdk/src/api/load_balancer/v2/healthmonitor/find.rs index fe9b3074a..8ee071d47 100644 --- a/openstack_sdk/src/api/load_balancer/v2/healthmonitor/find.rs +++ b/openstack_sdk/src/api/load_balancer/v2/healthmonitor/find.rs @@ -69,7 +69,7 @@ where { impl<'a> Findable for Request<'a> { type G = Get::Request<'a>; - type L = List::Request; + type L = List::Request<'a>; fn get_ep(&self) -> Get::Request<'a> { let mut ep = Get::Request::builder(); ep.id(self.id.clone()); @@ -78,7 +78,7 @@ impl<'a> Findable for Request<'a> { } ep.build().unwrap() } - fn list_ep(&self) -> List::Request { + fn list_ep(&self) -> List::Request<'a> { let mut ep = List::Request::builder(); if let Some(headers) = &self._headers { ep.headers(headers.iter().map(|(k, v)| (Some(k.clone()), v.clone()))); diff --git a/openstack_sdk/src/api/load_balancer/v2/healthmonitor/list.rs b/openstack_sdk/src/api/load_balancer/v2/healthmonitor/list.rs index ca383fc6a..21e79b9d2 100644 --- a/openstack_sdk/src/api/load_balancer/v2/healthmonitor/list.rs +++ b/openstack_sdk/src/api/load_balancer/v2/healthmonitor/list.rs @@ -32,20 +32,140 @@ use http::{HeaderMap, HeaderName, HeaderValue}; use crate::api::rest_endpoint_prelude::*; +use std::borrow::Cow; + #[derive(Builder, Debug, Clone)] #[builder(setter(strip_option))] -pub struct Request { +pub struct Request<'a> { + /// The type of health monitor. + /// + #[builder(default, setter(into))] + _type: Option>, + + /// The administrative state of the resource + /// + #[builder(default)] + admin_state_up: Option, + + /// The UTC date and timestamp when the resource was created. + /// + #[builder(default, setter(into))] + created_at: Option>, + + /// The time, in seconds, between sending probes to members. + /// + #[builder(default)] + delay: Option, + + /// A human-readable description for the resource. + /// + #[builder(default, setter(into))] + description: Option>, + + /// The list of HTTP status codes expected in response from the member to + /// declare it healthy. + /// + #[builder(default, setter(into))] + expected_codes: Option>, + + /// The HTTP method that the health monitor uses for requests. + /// + #[builder(default, setter(into))] + http_method: Option>, + + /// The ID of the resource + /// + #[builder(default, setter(into))] + id: Option>, + + /// The number of successful checks before changing the operating status of + /// the member to ONLINE. A valid value is from 1 to 10. + /// + #[builder(default)] + max_retries: Option, + + /// The number of allowed check failures before changing the operating + /// status of the member to ERROR. A valid value is from 1 to 10. + /// + #[builder(default)] + max_retries_down: Option, + + /// Human-readable name of the resource. + /// + #[builder(default, setter(into))] + name: Option>, + + /// Return the list of entities that do not have one or more of the given + /// tags. + /// + #[builder(default, setter(into))] + not_tags: Option>, + + /// Return the list of entities that do not have at least one of the given + /// tags. + /// + #[builder(default, setter(into))] + not_tags_any: Option>, + + /// The operating status of the resource. + /// + #[builder(default, setter(into))] + operating_status: Option>, + + /// The ID of the pool. + /// + #[builder(default, setter(into))] + pool_id: Option>, + + /// The ID of the project owning this resource. + /// + #[builder(default, setter(into))] + project_id: Option>, + + /// The provisioning status of the resource. + /// + #[builder(default, setter(into))] + provisioning_status: Option>, + + /// Return the list of entities that have this tag or tags. + /// + #[builder(default, setter(into))] + tags: Option>, + + /// Return the list of entities that have one or more of the given tags. + /// + #[builder(default, setter(into))] + tags_any: Option>, + + /// The maximum time, in seconds, that a monitor waits to connect before it + /// times out. + /// + #[builder(default)] + timeout: Option, + + /// The UTC date and timestamp when the resource was last updated. + /// + #[builder(default, setter(into))] + updated_at: Option>, + + /// The HTTP URL path of the request sent by the monitor to test the health + /// of a backend member. Must be a string that begins with a forward slash + /// (/). + /// + #[builder(default, setter(into))] + url_path: Option>, + #[builder(setter(name = "_headers"), default, private)] _headers: Option, } -impl Request { +impl<'a> Request<'a> { /// Create a builder for the endpoint. - pub fn builder() -> RequestBuilder { + pub fn builder() -> RequestBuilder<'a> { RequestBuilder::default() } } -impl RequestBuilder { +impl<'a> RequestBuilder<'a> { /// Add a single header to the Healthmonitor. pub fn header(&mut self, header_name: &'static str, header_value: &'static str) -> &mut Self where { @@ -70,7 +190,7 @@ where { } } -impl RestEndpoint for Request { +impl<'a> RestEndpoint for Request<'a> { fn method(&self) -> http::Method { http::Method::GET } @@ -80,7 +200,31 @@ impl RestEndpoint for Request { } fn parameters(&self) -> QueryParams { - QueryParams::default() + let mut params = QueryParams::default(); + params.push_opt("id", self.id.as_ref()); + params.push_opt("description", self.description.as_ref()); + params.push_opt("name", self.name.as_ref()); + params.push_opt("project_id", self.project_id.as_ref()); + params.push_opt("admin_state_up", self.admin_state_up); + params.push_opt("created_at", self.created_at.as_ref()); + params.push_opt("updated_at", self.updated_at.as_ref()); + params.push_opt("delay", self.delay); + params.push_opt("expected_codes", self.expected_codes.as_ref()); + params.push_opt("http_method", self.http_method.as_ref()); + params.push_opt("max_retries", self.max_retries); + params.push_opt("max_retries_down", self.max_retries_down); + params.push_opt("pool_id", self.pool_id.as_ref()); + params.push_opt("timeout", self.timeout); + params.push_opt("type", self._type.as_ref()); + params.push_opt("url_path", self.url_path.as_ref()); + params.push_opt("provisioning_status", self.provisioning_status.as_ref()); + params.push_opt("operating_status", self.operating_status.as_ref()); + params.push_opt("tags", self.tags.as_ref()); + params.push_opt("tags-any", self.tags_any.as_ref()); + params.push_opt("not-tags", self.not_tags.as_ref()); + params.push_opt("not-tags-any", self.not_tags_any.as_ref()); + + params } fn service_type(&self) -> ServiceType { diff --git a/openstack_sdk/src/api/load_balancer/v2/l7policy/find.rs b/openstack_sdk/src/api/load_balancer/v2/l7policy/find.rs index c60eb44ee..8b4946a81 100644 --- a/openstack_sdk/src/api/load_balancer/v2/l7policy/find.rs +++ b/openstack_sdk/src/api/load_balancer/v2/l7policy/find.rs @@ -69,7 +69,7 @@ where { impl<'a> Findable for Request<'a> { type G = Get::Request<'a>; - type L = List::Request; + type L = List::Request<'a>; fn get_ep(&self) -> Get::Request<'a> { let mut ep = Get::Request::builder(); ep.id(self.id.clone()); @@ -78,7 +78,7 @@ impl<'a> Findable for Request<'a> { } ep.build().unwrap() } - fn list_ep(&self) -> List::Request { + fn list_ep(&self) -> List::Request<'a> { let mut ep = List::Request::builder(); if let Some(headers) = &self._headers { ep.headers(headers.iter().map(|(k, v)| (Some(k.clone()), v.clone()))); diff --git a/openstack_sdk/src/api/load_balancer/v2/l7policy/list.rs b/openstack_sdk/src/api/load_balancer/v2/l7policy/list.rs index 89580eada..8eda303c8 100644 --- a/openstack_sdk/src/api/load_balancer/v2/l7policy/list.rs +++ b/openstack_sdk/src/api/load_balancer/v2/l7policy/list.rs @@ -32,20 +32,58 @@ use http::{HeaderMap, HeaderName, HeaderValue}; use crate::api::rest_endpoint_prelude::*; +use std::borrow::Cow; + #[derive(Builder, Debug, Clone)] #[builder(setter(strip_option))] -pub struct Request { +pub struct Request<'a> { + #[builder(default, setter(into))] + action: Option>, + + #[builder(default)] + admin_state_up: Option, + + #[builder(default, setter(into))] + description: Option>, + + #[builder(default, setter(into))] + listener_id: Option>, + + #[builder(default, setter(into))] + name: Option>, + + #[builder(default, setter(into))] + operating_status: Option>, + + #[builder(default, setter(into))] + position: Option>, + + #[builder(default, setter(into))] + project_id: Option>, + + #[builder(default, setter(into))] + provisioning_status: Option>, + + #[builder(default, setter(into))] + redirect_pool_id: Option>, + + #[builder(default, setter(into))] + redirect_prefix: Option>, + + #[builder(default, setter(into))] + redirect_url: Option>, + #[builder(setter(name = "_headers"), default, private)] _headers: Option, } -impl Request { +impl<'a> Request<'a> { /// Create a builder for the endpoint. - pub fn builder() -> RequestBuilder { + pub fn builder() -> RequestBuilder<'a> { RequestBuilder::default() } } -impl RequestBuilder { +impl<'a> RequestBuilder<'a> { /// Add a single header to the L7Policy. pub fn header(&mut self, header_name: &'static str, header_value: &'static str) -> &mut Self where { @@ -70,7 +108,7 @@ where { } } -impl RestEndpoint for Request { +impl<'a> RestEndpoint for Request<'a> { fn method(&self) -> http::Method { http::Method::GET } @@ -80,7 +118,21 @@ impl RestEndpoint for Request { } fn parameters(&self) -> QueryParams { - QueryParams::default() + let mut params = QueryParams::default(); + params.push_opt("action", self.action.as_ref()); + params.push_opt("description", self.description.as_ref()); + params.push_opt("listener_id", self.listener_id.as_ref()); + params.push_opt("name", self.name.as_ref()); + params.push_opt("position", self.position.as_ref()); + params.push_opt("redirect_pool_id", self.redirect_pool_id.as_ref()); + params.push_opt("redirect_url", self.redirect_url.as_ref()); + params.push_opt("provisioning_status", self.provisioning_status.as_ref()); + params.push_opt("operating_status", self.operating_status.as_ref()); + params.push_opt("redirect_prefix", self.redirect_prefix.as_ref()); + params.push_opt("project_id", self.project_id.as_ref()); + params.push_opt("admin_state_up", self.admin_state_up); + + params } fn service_type(&self) -> ServiceType { diff --git a/openstack_sdk/src/api/load_balancer/v2/l7policy/rule/list.rs b/openstack_sdk/src/api/load_balancer/v2/l7policy/rule/list.rs index e88e1a319..4f6e0f228 100644 --- a/openstack_sdk/src/api/load_balancer/v2/l7policy/rule/list.rs +++ b/openstack_sdk/src/api/load_balancer/v2/l7policy/rule/list.rs @@ -37,12 +37,45 @@ use std::borrow::Cow; #[derive(Builder, Debug, Clone)] #[builder(setter(strip_option))] pub struct Request<'a> { + #[builder(default, setter(into))] + _type: Option>, + + #[builder(default)] + admin_state_up: Option, + + #[builder(default, setter(into))] + compare_type: Option>, + + #[builder(default, setter(into))] + created_at: Option>, + + #[builder(default, setter(into))] + invert: Option>, + + #[builder(default, setter(into))] + key: Option>, + /// l7policy_id parameter for /// /v2/lbaas/l7policies/{l7policy_id}/rules/{rule_id} API /// #[builder(default, setter(into))] l7policy_id: Cow<'a, str>, + #[builder(default, setter(into))] + operating_status: Option>, + + #[builder(default, setter(into))] + project_id: Option>, + + #[builder(default, setter(into))] + provisioning_status: Option>, + + #[builder(default, setter(into))] + rule_value: Option>, + + #[builder(default, setter(into))] + updated_at: Option>, + #[builder(setter(name = "_headers"), default, private)] _headers: Option, } @@ -92,7 +125,20 @@ impl<'a> RestEndpoint for Request<'a> { } fn parameters(&self) -> QueryParams { - QueryParams::default() + let mut params = QueryParams::default(); + params.push_opt("compare_type", self.compare_type.as_ref()); + params.push_opt("created_at", self.created_at.as_ref()); + params.push_opt("invert", self.invert.as_ref()); + params.push_opt("key", self.key.as_ref()); + params.push_opt("project_id", self.project_id.as_ref()); + params.push_opt("provisioning_status", self.provisioning_status.as_ref()); + params.push_opt("type", self._type.as_ref()); + params.push_opt("updated_at", self.updated_at.as_ref()); + params.push_opt("rule_value", self.rule_value.as_ref()); + params.push_opt("operating_status", self.operating_status.as_ref()); + params.push_opt("admin_state_up", self.admin_state_up); + + params } fn service_type(&self) -> ServiceType { diff --git a/openstack_sdk/src/api/load_balancer/v2/listener/find.rs b/openstack_sdk/src/api/load_balancer/v2/listener/find.rs index 91724a704..c60806282 100644 --- a/openstack_sdk/src/api/load_balancer/v2/listener/find.rs +++ b/openstack_sdk/src/api/load_balancer/v2/listener/find.rs @@ -69,7 +69,7 @@ where { impl<'a> Findable for Request<'a> { type G = Get::Request<'a>; - type L = List::Request; + type L = List::Request<'a>; fn get_ep(&self) -> Get::Request<'a> { let mut ep = Get::Request::builder(); ep.id(self.id.clone()); @@ -78,7 +78,7 @@ impl<'a> Findable for Request<'a> { } ep.build().unwrap() } - fn list_ep(&self) -> List::Request { + fn list_ep(&self) -> List::Request<'a> { let mut ep = List::Request::builder(); if let Some(headers) = &self._headers { ep.headers(headers.iter().map(|(k, v)| (Some(k.clone()), v.clone()))); diff --git a/openstack_sdk/src/api/load_balancer/v2/listener/list.rs b/openstack_sdk/src/api/load_balancer/v2/listener/list.rs index 01a69ae37..5fc6dcc2b 100644 --- a/openstack_sdk/src/api/load_balancer/v2/listener/list.rs +++ b/openstack_sdk/src/api/load_balancer/v2/listener/list.rs @@ -32,20 +32,170 @@ use http::{HeaderMap, HeaderName, HeaderValue}; use crate::api::rest_endpoint_prelude::*; +use std::borrow::Cow; + #[derive(Builder, Debug, Clone)] #[builder(setter(strip_option))] -pub struct Request { +pub struct Request<'a> { + /// The administrative state of the resource + /// + #[builder(default)] + admin_state_up: Option, + + /// A list of ALPN protocols. Available protocols: http/1.0, http/1.1, h2 + /// + #[builder(default, setter(into))] + alpn_protocols: Option>, + + /// The maximum number of connections permitted for this listener. Default + /// value is -1 which represents infinite connections or a default value + /// defined by the provider driver. + /// + #[builder(default, setter(into))] + connection_limit: Option>, + + /// The UTC date and timestamp when the resource was created. + /// + #[builder(default, setter(into))] + created_at: Option>, + + /// The ID of the pool used by the listener if no L7 policies match. + /// + #[builder(default, setter(into))] + default_pool_id: Option>, + + /// A human-readable description for the resource. + /// + #[builder(default, setter(into))] + description: Option>, + + /// Defines whether the includeSubDomains directive should be added to the + /// Strict-Transport-Security HTTP response header. + /// + #[builder(default)] + hsts_include_subdomains: Option, + + /// The value of the max_age directive for the Strict-Transport-Security + /// HTTP response header. + /// + #[builder(default)] + hsts_max_age: Option, + + /// Defines whether the preload directive should be added to the + /// Strict-Transport-Security HTTP response header. + /// + #[builder(default)] + hsts_preload: Option, + + /// The ID of the resource + /// + #[builder(default, setter(into))] + id: Option>, + + /// Load balancer ID + /// + #[builder(default, setter(into))] + load_balancer_id: Option>, + + /// Human-readable name of the resource. + /// + #[builder(default, setter(into))] + name: Option>, + + /// Return the list of entities that do not have one or more of the given + /// tags. + /// + #[builder(default, setter(into))] + not_tags: Option>, + + /// Return the list of entities that do not have at least one of the given + /// tags. + /// + #[builder(default, setter(into))] + not_tags_any: Option>, + + /// The operating status of the resource. + /// + #[builder(default, setter(into))] + operating_status: Option>, + + /// The ID of the project owning this resource. + /// + #[builder(default, setter(into))] + project_id: Option>, + + /// The protocol for the resource. + /// + #[builder(default, setter(into))] + protocol: Option>, + + /// The protocol port number for the resource. + /// + #[builder(default)] + protocol_port: Option, + + /// The provisioning status of the resource. + /// + #[builder(default, setter(into))] + provisioning_status: Option>, + + /// Return the list of entities that have this tag or tags. + /// + #[builder(default, setter(into))] + tags: Option>, + + /// Return the list of entities that have one or more of the given tags. + /// + #[builder(default, setter(into))] + tags_any: Option>, + + /// Frontend client inactivity timeout in milliseconds. + /// + #[builder(default)] + timeout_client_data: Option, + + /// Backend member connection timeout in milliseconds. + /// + #[builder(default)] + timeout_member_connect: Option, + + /// Backend member inactivity timeout in milliseconds. + /// + #[builder(default)] + timeout_member_data: Option, + + /// Time, in milliseconds, to wait for additional TCP packets for content + /// inspection. + /// + #[builder(default)] + timeout_tcp_inspect: Option, + + /// List of ciphers in OpenSSL format + /// + #[builder(default, setter(into))] + tls_ciphers: Option>, + + /// A list of TLS protocol versions. + /// + #[builder(default, setter(into))] + tls_versions: Option>, + + /// The UTC date and timestamp when the resource was last updated. + /// + #[builder(default, setter(into))] + updated_at: Option>, + #[builder(setter(name = "_headers"), default, private)] _headers: Option, } -impl Request { +impl<'a> Request<'a> { /// Create a builder for the endpoint. - pub fn builder() -> RequestBuilder { + pub fn builder() -> RequestBuilder<'a> { RequestBuilder::default() } } -impl RequestBuilder { +impl<'a> RequestBuilder<'a> { /// Add a single header to the Listener. pub fn header(&mut self, header_name: &'static str, header_value: &'static str) -> &mut Self where { @@ -70,7 +220,7 @@ where { } } -impl RestEndpoint for Request { +impl<'a> RestEndpoint for Request<'a> { fn method(&self) -> http::Method { http::Method::GET } @@ -80,7 +230,37 @@ impl RestEndpoint for Request { } fn parameters(&self) -> QueryParams { - QueryParams::default() + let mut params = QueryParams::default(); + params.push_opt("id", self.id.as_ref()); + params.push_opt("description", self.description.as_ref()); + params.push_opt("name", self.name.as_ref()); + params.push_opt("project_id", self.project_id.as_ref()); + params.push_opt("connection_limit", self.connection_limit.as_ref()); + params.push_opt("default_pool_id", self.default_pool_id.as_ref()); + params.push_opt("protocol", self.protocol.as_ref()); + params.push_opt("protocol_port", self.protocol_port); + params.push_opt("created_at", self.created_at.as_ref()); + params.push_opt("updated_at", self.updated_at.as_ref()); + params.push_opt("load_balancer_id", self.load_balancer_id.as_ref()); + params.push_opt("timeout_client_data", self.timeout_client_data); + params.push_opt("timeout_member_connect", self.timeout_member_connect); + params.push_opt("timeout_member_data", self.timeout_member_data); + params.push_opt("timeout_tcp_inspect", self.timeout_tcp_inspect); + params.push_opt("tls_ciphers", self.tls_ciphers.as_ref()); + params.push_opt("tls_versions", self.tls_versions.as_ref()); + params.push_opt("alpn_protocols", self.alpn_protocols.as_ref()); + params.push_opt("hsts_max_age", self.hsts_max_age); + params.push_opt("admin_state_up", self.admin_state_up); + params.push_opt("hsts_include_subdomains", self.hsts_include_subdomains); + params.push_opt("hsts_preload", self.hsts_preload); + params.push_opt("provisioning_status", self.provisioning_status.as_ref()); + params.push_opt("operating_status", self.operating_status.as_ref()); + params.push_opt("tags", self.tags.as_ref()); + params.push_opt("tags-any", self.tags_any.as_ref()); + params.push_opt("not-tags", self.not_tags.as_ref()); + params.push_opt("not-tags-any", self.not_tags_any.as_ref()); + + params } fn service_type(&self) -> ServiceType { diff --git a/openstack_sdk/src/api/load_balancer/v2/loadbalancer/find.rs b/openstack_sdk/src/api/load_balancer/v2/loadbalancer/find.rs index dfbd72e69..a0e96089d 100644 --- a/openstack_sdk/src/api/load_balancer/v2/loadbalancer/find.rs +++ b/openstack_sdk/src/api/load_balancer/v2/loadbalancer/find.rs @@ -69,7 +69,7 @@ where { impl<'a> Findable for Request<'a> { type G = Get::Request<'a>; - type L = List::Request; + type L = List::Request<'a>; fn get_ep(&self) -> Get::Request<'a> { let mut ep = Get::Request::builder(); ep.id(self.id.clone()); @@ -78,7 +78,7 @@ impl<'a> Findable for Request<'a> { } ep.build().unwrap() } - fn list_ep(&self) -> List::Request { + fn list_ep(&self) -> List::Request<'a> { let mut ep = List::Request::builder(); if let Some(headers) = &self._headers { ep.headers(headers.iter().map(|(k, v)| (Some(k.clone()), v.clone()))); diff --git a/openstack_sdk/src/api/load_balancer/v2/loadbalancer/list.rs b/openstack_sdk/src/api/load_balancer/v2/loadbalancer/list.rs index a0d52acc5..b64e8d612 100644 --- a/openstack_sdk/src/api/load_balancer/v2/loadbalancer/list.rs +++ b/openstack_sdk/src/api/load_balancer/v2/loadbalancer/list.rs @@ -32,20 +32,114 @@ use http::{HeaderMap, HeaderName, HeaderValue}; use crate::api::rest_endpoint_prelude::*; +use std::borrow::Cow; + #[derive(Builder, Debug, Clone)] #[builder(setter(strip_option))] -pub struct Request { +pub struct Request<'a> { + /// An availability zone name. + /// + #[builder(default, setter(into))] + availability_zone: Option>, + + /// A human-readable description for the resource. + /// + #[builder(default, setter(into))] + description: Option>, + + /// The ID of the flavor. + /// + #[builder(default, setter(into))] + flavor_id: Option>, + + /// The ID of the resource + /// + #[builder(default, setter(into))] + id: Option>, + + /// Human-readable name of the resource. + /// + #[builder(default, setter(into))] + name: Option>, + + /// Return the list of entities that do not have one or more of the given + /// tags. + /// + #[builder(default, setter(into))] + not_tags: Option>, + + /// Return the list of entities that do not have at least one of the given + /// tags. + /// + #[builder(default, setter(into))] + not_tags_any: Option>, + + /// The operating status of the resource. + /// + #[builder(default, setter(into))] + operating_status: Option>, + + /// The ID of the project owning this resource. + /// + #[builder(default, setter(into))] + project_id: Option>, + + /// Provider name for the load balancer. + /// + #[builder(default, setter(into))] + provider: Option>, + + /// The provisioning status of the resource. + /// + #[builder(default, setter(into))] + provisioning_status: Option>, + + /// Return the list of entities that have this tag or tags. + /// + #[builder(default, setter(into))] + tags: Option>, + + /// Return the list of entities that have one or more of the given tags. + /// + #[builder(default, setter(into))] + tags_any: Option>, + + /// The IP address of the Virtual IP (VIP). + /// + #[builder(default, setter(into))] + vip_address: Option>, + + /// The ID of the network for the Virtual IP (VIP). + /// + #[builder(default, setter(into))] + vip_network_id: Option>, + + /// The ID of the Virtual IP (VIP) port. + /// + #[builder(default, setter(into))] + vip_port_id: Option>, + + /// The ID of the QoS Policy which will apply to the Virtual IP (VIP). + /// + #[builder(default, setter(into))] + vip_qos_policy_id: Option>, + + /// The ID of the subnet for the Virtual IP (VIP). + /// + #[builder(default, setter(into))] + vip_subnet_id: Option>, + #[builder(setter(name = "_headers"), default, private)] _headers: Option, } -impl Request { +impl<'a> Request<'a> { /// Create a builder for the endpoint. - pub fn builder() -> RequestBuilder { + pub fn builder() -> RequestBuilder<'a> { RequestBuilder::default() } } -impl RequestBuilder { +impl<'a> RequestBuilder<'a> { /// Add a single header to the Loadbalancer. pub fn header(&mut self, header_name: &'static str, header_value: &'static str) -> &mut Self where { @@ -70,7 +164,7 @@ where { } } -impl RestEndpoint for Request { +impl<'a> RestEndpoint for Request<'a> { fn method(&self) -> http::Method { http::Method::GET } @@ -80,7 +174,27 @@ impl RestEndpoint for Request { } fn parameters(&self) -> QueryParams { - QueryParams::default() + let mut params = QueryParams::default(); + params.push_opt("description", self.description.as_ref()); + params.push_opt("name", self.name.as_ref()); + params.push_opt("id", self.id.as_ref()); + params.push_opt("project_id", self.project_id.as_ref()); + params.push_opt("flavor_id", self.flavor_id.as_ref()); + params.push_opt("provider", self.provider.as_ref()); + params.push_opt("vip_address", self.vip_address.as_ref()); + params.push_opt("vip_network_id", self.vip_network_id.as_ref()); + params.push_opt("vip_port_id", self.vip_port_id.as_ref()); + params.push_opt("vip_subnet_id", self.vip_subnet_id.as_ref()); + params.push_opt("vip_qos_policy_id", self.vip_qos_policy_id.as_ref()); + params.push_opt("availability_zone", self.availability_zone.as_ref()); + params.push_opt("provisioning_status", self.provisioning_status.as_ref()); + params.push_opt("operating_status", self.operating_status.as_ref()); + params.push_opt("tags", self.tags.as_ref()); + params.push_opt("tags-any", self.tags_any.as_ref()); + params.push_opt("not-tags", self.not_tags.as_ref()); + params.push_opt("not-tags-any", self.not_tags_any.as_ref()); + + params } fn service_type(&self) -> ServiceType { diff --git a/openstack_sdk/src/api/load_balancer/v2/pool/find.rs b/openstack_sdk/src/api/load_balancer/v2/pool/find.rs index 337a2d907..7af472dc4 100644 --- a/openstack_sdk/src/api/load_balancer/v2/pool/find.rs +++ b/openstack_sdk/src/api/load_balancer/v2/pool/find.rs @@ -69,7 +69,7 @@ where { impl<'a> Findable for Request<'a> { type G = Get::Request<'a>; - type L = List::Request; + type L = List::Request<'a>; fn get_ep(&self) -> Get::Request<'a> { let mut ep = Get::Request::builder(); ep.id(self.id.clone()); @@ -78,7 +78,7 @@ impl<'a> Findable for Request<'a> { } ep.build().unwrap() } - fn list_ep(&self) -> List::Request { + fn list_ep(&self) -> List::Request<'a> { let mut ep = List::Request::builder(); if let Some(headers) = &self._headers { ep.headers(headers.iter().map(|(k, v)| (Some(k.clone()), v.clone()))); diff --git a/openstack_sdk/src/api/load_balancer/v2/pool/list.rs b/openstack_sdk/src/api/load_balancer/v2/pool/list.rs index 16ef560aa..ee524624a 100644 --- a/openstack_sdk/src/api/load_balancer/v2/pool/list.rs +++ b/openstack_sdk/src/api/load_balancer/v2/pool/list.rs @@ -32,20 +32,107 @@ use http::{HeaderMap, HeaderName, HeaderValue}; use crate::api::rest_endpoint_prelude::*; +use std::borrow::Cow; + #[derive(Builder, Debug, Clone)] #[builder(setter(strip_option))] -pub struct Request { +pub struct Request<'a> { + /// The administrative state of the resource + /// + #[builder(default)] + admin_state_up: Option, + + /// A list of ALPN protocols. Available protocols: http/1.0, http/1.1, h2 + /// + #[builder(default, setter(into))] + alpn_protocols: Option>, + + /// The UTC date and timestamp when the resource was created. + /// + #[builder(default, setter(into))] + created_at: Option>, + + /// A human-readable description for the resource. + /// + #[builder(default, setter(into))] + description: Option>, + + /// The ID of the resource + /// + #[builder(default, setter(into))] + id: Option>, + + /// Human-readable name of the resource. + /// + #[builder(default, setter(into))] + name: Option>, + + /// Return the list of entities that do not have one or more of the given + /// tags. + /// + #[builder(default, setter(into))] + not_tags: Option>, + + /// Return the list of entities that do not have at least one of the given + /// tags. + /// + #[builder(default, setter(into))] + not_tags_any: Option>, + + /// The operating status of the resource. + /// + #[builder(default, setter(into))] + operating_status: Option>, + + /// The ID of the project owning this resource. + /// + #[builder(default, setter(into))] + project_id: Option>, + + /// The provisioning status of the resource. + /// + #[builder(default, setter(into))] + provisioning_status: Option>, + + /// Return the list of entities that have this tag or tags. + /// + #[builder(default, setter(into))] + tags: Option>, + + /// Return the list of entities that have one or more of the given tags. + /// + #[builder(default, setter(into))] + tags_any: Option>, + + /// List of ciphers in OpenSSL format + /// + #[builder(default, setter(into))] + tls_ciphers: Option>, + + #[builder(default)] + tls_enabled: Option, + + /// A list of TLS protocol versions. + /// + #[builder(default, setter(into))] + tls_versions: Option>, + + /// The UTC date and timestamp when the resource was last updated. + /// + #[builder(default, setter(into))] + updated_at: Option>, + #[builder(setter(name = "_headers"), default, private)] _headers: Option, } -impl Request { +impl<'a> Request<'a> { /// Create a builder for the endpoint. - pub fn builder() -> RequestBuilder { + pub fn builder() -> RequestBuilder<'a> { RequestBuilder::default() } } -impl RequestBuilder { +impl<'a> RequestBuilder<'a> { /// Add a single header to the Pool. pub fn header(&mut self, header_name: &'static str, header_value: &'static str) -> &mut Self where { @@ -70,7 +157,7 @@ where { } } -impl RestEndpoint for Request { +impl<'a> RestEndpoint for Request<'a> { fn method(&self) -> http::Method { http::Method::GET } @@ -80,7 +167,26 @@ impl RestEndpoint for Request { } fn parameters(&self) -> QueryParams { - QueryParams::default() + let mut params = QueryParams::default(); + params.push_opt("id", self.id.as_ref()); + params.push_opt("description", self.description.as_ref()); + params.push_opt("name", self.name.as_ref()); + params.push_opt("project_id", self.project_id.as_ref()); + params.push_opt("admin_state_up", self.admin_state_up); + params.push_opt("created_at", self.created_at.as_ref()); + params.push_opt("updated_at", self.updated_at.as_ref()); + params.push_opt("tls_enabled", self.tls_enabled); + params.push_opt("tls_ciphers", self.tls_ciphers.as_ref()); + params.push_opt("tls_versions", self.tls_versions.as_ref()); + params.push_opt("alpn_protocols", self.alpn_protocols.as_ref()); + params.push_opt("provisioning_status", self.provisioning_status.as_ref()); + params.push_opt("operating_status", self.operating_status.as_ref()); + params.push_opt("tags", self.tags.as_ref()); + params.push_opt("tags-any", self.tags_any.as_ref()); + params.push_opt("not-tags", self.not_tags.as_ref()); + params.push_opt("not-tags-any", self.not_tags_any.as_ref()); + + params } fn service_type(&self) -> ServiceType { diff --git a/openstack_sdk/src/api/load_balancer/v2/pool/member/list.rs b/openstack_sdk/src/api/load_balancer/v2/pool/member/list.rs index e31fb52cd..2ac979c0d 100644 --- a/openstack_sdk/src/api/load_balancer/v2/pool/member/list.rs +++ b/openstack_sdk/src/api/load_balancer/v2/pool/member/list.rs @@ -37,11 +37,114 @@ use std::borrow::Cow; #[derive(Builder, Debug, Clone)] #[builder(setter(strip_option))] pub struct Request<'a> { + /// The IP address of the backend member server. + /// + #[builder(default, setter(into))] + address: Option>, + + /// The administrative state of the resource + /// + #[builder(default)] + admin_state_up: Option, + + /// Is the member a backup? + /// + #[builder(default)] + backup: Option, + + /// The UTC date and timestamp when the resource was created. + /// + #[builder(default, setter(into))] + created_at: Option>, + + /// A human-readable description for the resource. + /// + #[builder(default, setter(into))] + description: Option>, + + /// The ID of the resource + /// + #[builder(default, setter(into))] + id: Option>, + + /// An alternate IP address used for health monitoring a backend member. + /// + #[builder(default, setter(into))] + monitor_address: Option>, + + /// An alternate protocol port used for health monitoring a backend member. + /// + #[builder(default, setter(into))] + monitor_port: Option>, + + /// Human-readable name of the resource. + /// + #[builder(default, setter(into))] + name: Option>, + + /// Return the list of entities that do not have one or more of the given + /// tags. + /// + #[builder(default, setter(into))] + not_tags: Option>, + + /// Return the list of entities that do not have at least one of the given + /// tags. + /// + #[builder(default, setter(into))] + not_tags_any: Option>, + + /// The operating status of the resource. + /// + #[builder(default, setter(into))] + operating_status: Option>, + /// pool_id parameter for /v2/lbaas/pools/{pool_id}/members/{member_id} API /// #[builder(default, setter(into))] pool_id: Cow<'a, str>, + /// The ID of the project owning this resource. + /// + #[builder(default, setter(into))] + project_id: Option>, + + /// The protocol port number the backend member server is listening on. + /// + #[builder(default)] + protocol_port: Option, + + /// The provisioning status of the resource. + /// + #[builder(default, setter(into))] + provisioning_status: Option>, + + /// The subnet ID the member service is accessible from. + /// + #[builder(default, setter(into))] + subnet_id: Option>, + + /// Return the list of entities that have this tag or tags. + /// + #[builder(default, setter(into))] + tags: Option>, + + /// Return the list of entities that have one or more of the given tags. + /// + #[builder(default, setter(into))] + tags_any: Option>, + + /// The UTC date and timestamp when the resource was last updated. + /// + #[builder(default, setter(into))] + updated_at: Option>, + + /// The weight of a member determines the portion of requests or + /// connections it services compared to the other members of the pool. + /// + #[builder(default)] + weight: Option, + #[builder(setter(name = "_headers"), default, private)] _headers: Option, } @@ -91,7 +194,29 @@ impl<'a> RestEndpoint for Request<'a> { } fn parameters(&self) -> QueryParams { - QueryParams::default() + let mut params = QueryParams::default(); + params.push_opt("id", self.id.as_ref()); + params.push_opt("description", self.description.as_ref()); + params.push_opt("name", self.name.as_ref()); + params.push_opt("project_id", self.project_id.as_ref()); + params.push_opt("admin_state_up", self.admin_state_up); + params.push_opt("created_at", self.created_at.as_ref()); + params.push_opt("updated_at", self.updated_at.as_ref()); + params.push_opt("address", self.address.as_ref()); + params.push_opt("protocol_port", self.protocol_port); + params.push_opt("subnet_id", self.subnet_id.as_ref()); + params.push_opt("weight", self.weight); + params.push_opt("monitor_address", self.monitor_address.as_ref()); + params.push_opt("monitor_port", self.monitor_port.as_ref()); + params.push_opt("backup", self.backup); + params.push_opt("provisioning_status", self.provisioning_status.as_ref()); + params.push_opt("operating_status", self.operating_status.as_ref()); + params.push_opt("tags", self.tags.as_ref()); + params.push_opt("tags-any", self.tags_any.as_ref()); + params.push_opt("not-tags", self.not_tags.as_ref()); + params.push_opt("not-tags-any", self.not_tags_any.as_ref()); + + params } fn service_type(&self) -> ServiceType { diff --git a/openstack_sdk/src/api/load_balancer/v2/provider/list.rs b/openstack_sdk/src/api/load_balancer/v2/provider/list.rs index a7bb14a21..a7a296b8f 100644 --- a/openstack_sdk/src/api/load_balancer/v2/provider/list.rs +++ b/openstack_sdk/src/api/load_balancer/v2/provider/list.rs @@ -27,20 +27,28 @@ use http::{HeaderMap, HeaderName, HeaderValue}; use crate::api::rest_endpoint_prelude::*; +use std::borrow::Cow; + #[derive(Builder, Debug, Clone)] #[builder(setter(strip_option))] -pub struct Request { +pub struct Request<'a> { + #[builder(default, setter(into))] + description: Option>, + + #[builder(default, setter(into))] + name: Option>, + #[builder(setter(name = "_headers"), default, private)] _headers: Option, } -impl Request { +impl<'a> Request<'a> { /// Create a builder for the endpoint. - pub fn builder() -> RequestBuilder { + pub fn builder() -> RequestBuilder<'a> { RequestBuilder::default() } } -impl RequestBuilder { +impl<'a> RequestBuilder<'a> { /// Add a single header to the Provider. pub fn header(&mut self, header_name: &'static str, header_value: &'static str) -> &mut Self where { @@ -65,7 +73,7 @@ where { } } -impl RestEndpoint for Request { +impl<'a> RestEndpoint for Request<'a> { fn method(&self) -> http::Method { http::Method::GET } @@ -75,7 +83,11 @@ impl RestEndpoint for Request { } fn parameters(&self) -> QueryParams { - QueryParams::default() + let mut params = QueryParams::default(); + params.push_opt("description", self.description.as_ref()); + params.push_opt("name", self.name.as_ref()); + + params } fn service_type(&self) -> ServiceType { diff --git a/openstack_tui/.config/config.json5 b/openstack_tui/.config/config.json5 index 82b513ff7..1efd2d08c 100644 --- a/openstack_tui/.config/config.json5 +++ b/openstack_tui/.config/config.json5 @@ -78,6 +78,7 @@ }, "LoadBalancers": { "y": { "action": "DescribeApiResponse", "description": "YAML"}, + "l": { "action": "ShowLoadBalancerListeners", "description": "Listeners"}, }, "LoadBalancerListeners": { "y": { "action": "DescribeApiResponse", "description": "YAML"}, @@ -85,6 +86,7 @@ "LoadBalancerPools": { "y": { "action": "DescribeApiResponse", "description": "YAML"}, "": { "action": "ShowLoadBalancerPoolMembers", "description": "Members"}, + "h": { "action": "ShowLoadBalancerPoolHealthMonitors", "description": "HealthMonitors"}, }, "LoadBalancerPoolMembers": { "y": { "action": "DescribeApiResponse", "description": "YAML"}, diff --git a/openstack_tui/src/action.rs b/openstack_tui/src/action.rs index 6ad8f72c4..dc76c6288 100644 --- a/openstack_tui/src/action.rs +++ b/openstack_tui/src/action.rs @@ -153,12 +153,16 @@ pub enum Action { ShowLoadBalancerListeners, /// Set LB Pool filters SetLoadBalancerPoolFilters(cloud_types::LoadBalancerPoolFilters), + /// Show LB Listener Pools + ShowLoadBalancerListenerPools, /// Set LB Member filters SetLoadBalancerPoolMemberFilters(cloud_types::LoadBalancerPoolMemberFilters), /// Show LB Pool members ShowLoadBalancerPoolMembers, /// Set LB Healthmonitor filters SetLoadBalancerHealthMonitorFilters(cloud_types::LoadBalancerHealthMonitorFilters), + /// Show LB Listener Pools + ShowLoadBalancerPoolHealthMonitors, // Network (neutron) /// Set Security group filters diff --git a/openstack_tui/src/cloud_worker/load_balancer.rs b/openstack_tui/src/cloud_worker/load_balancer.rs index f296a86f1..bf9b7fbe6 100644 --- a/openstack_tui/src/cloud_worker/load_balancer.rs +++ b/openstack_tui/src/cloud_worker/load_balancer.rs @@ -109,10 +109,9 @@ impl LoadBalancerExt for Cloud { async fn get_listeners(&mut self, filters: &LoadBalancerListenerFilters) -> Result> { if let Some(session) = &self.cloud { let ep = - //openstack_sdk::api::load_balancer::v2::listener::list::RequestBuilder::try_from( - // filters, - //)? - openstack_sdk::api::load_balancer::v2::listener::list::RequestBuilder::default() + openstack_sdk::api::load_balancer::v2::listener::list::RequestBuilder::try_from( + filters, + )? .build()?; let res: Vec = ep.query_async(session).await?; @@ -121,9 +120,11 @@ impl LoadBalancerExt for Cloud { Ok(Vec::new()) } - async fn get_load_balancers(&mut self, _filters: &LoadBalancerFilters) -> Result> { + async fn get_load_balancers(&mut self, filters: &LoadBalancerFilters) -> Result> { if let Some(session) = &self.cloud { - let ep = openstack_sdk::api::load_balancer::v2::loadbalancer::list::Request::builder() + let ep = openstack_sdk::api::load_balancer::v2::loadbalancer::list::RequestBuilder::try_from( + filters, + )? .build()?; let res: Vec = ep.query_async(session).await?; @@ -134,11 +135,10 @@ impl LoadBalancerExt for Cloud { async fn get_pools(&mut self, filters: &LoadBalancerPoolFilters) -> Result> { if let Some(session) = &self.cloud { - //let ep = openstack_sdk::api::load_balancer::v2::pool::list::RequestBuilder::try_from( - // filters, - //)? - let ep = openstack_sdk::api::load_balancer::v2::pool::list::RequestBuilder::default() - .build()?; + let ep = openstack_sdk::api::load_balancer::v2::pool::list::RequestBuilder::try_from( + filters, + )? + .build()?; let res: Vec = ep.query_async(session).await?; return Ok(res); @@ -169,10 +169,9 @@ impl LoadBalancerExt for Cloud { ) -> Result> { if let Some(session) = &self.cloud { let ep = - //openstack_sdk::api::load_balancer::v2::healthmonitor::list::RequestBuilder::try_from( - // filters, - //)? - openstack_sdk::api::load_balancer::v2::healthmonitor::list::RequestBuilder::default() + openstack_sdk::api::load_balancer::v2::healthmonitor::list::RequestBuilder::try_from( + filters, + )? .build()?; let res: Vec = ep.query_async(session).await?; diff --git a/openstack_tui/src/cloud_worker/load_balancer/types.rs b/openstack_tui/src/cloud_worker/load_balancer/types.rs index 5722426d7..3dc8738e1 100644 --- a/openstack_tui/src/cloud_worker/load_balancer/types.rs +++ b/openstack_tui/src/cloud_worker/load_balancer/types.rs @@ -26,6 +26,19 @@ impl fmt::Display for LoadBalancerFilters { } } +impl TryFrom<&LoadBalancerFilters> + for openstack_sdk::api::load_balancer::v2::loadbalancer::list::RequestBuilder<'_> +{ + type Error = eyre::Report; + + fn try_from(_value: &LoadBalancerFilters) -> Result { + let ep_builder = + openstack_sdk::api::load_balancer::v2::loadbalancer::list::Request::builder(); + + Ok(ep_builder) + } +} + #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct LoadBalancerListenerFilters { pub loadbalancer_id: Option, @@ -48,57 +61,71 @@ impl fmt::Display for LoadBalancerListenerFilters { } } -// impl TryFrom<&LoadBalancerListenerFilters> -// for openstack_sdk::api::load_balancer::v2::listener::list::RequestBuilder<'_> -// { -// type Error = eyre::Report; -// -// fn try_from(value: &LoadBalancerListenerFilters) -> Result { -// let ep_builder = openstack_sdk::api::load_balancer::v2::listener::list::Request::builder(); -// -// if let Some(_lb_id) = &value.loadbalancer_id { -// // TODO -// //ep_builder.loadbalancer_id(lb_id.clone()); -// } -// -// Ok(ep_builder) -// } -// } +impl TryFrom<&LoadBalancerListenerFilters> + for openstack_sdk::api::load_balancer::v2::listener::list::RequestBuilder<'_> +{ + type Error = eyre::Report; + + fn try_from(value: &LoadBalancerListenerFilters) -> Result { + let mut ep_builder = + openstack_sdk::api::load_balancer::v2::listener::list::Request::builder(); + + if let Some(lb_id) = &value.loadbalancer_id { + ep_builder.load_balancer_id(lb_id.clone()); + } + + Ok(ep_builder) + } +} #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct LoadBalancerPoolFilters { - //pub loadbalancer_id: Option, - //pub loadbalancer_name: Option, + // pub loadbalancer_id: Option, + // pub loadbalancer_name: Option, + // pub listener_id: Option, + // pub listener_name: Option, } impl fmt::Display for LoadBalancerPoolFilters { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "") - //let mut parts: Vec = Vec::new(); - //if self.loadbalancer_id.is_some() || self.loadbalancer_name.is_some() { - // parts.push(format!( - // "lb: {}", - // self.loadbalancer_name - // .as_ref() - // .or(self.loadbalancer_id.as_ref()) - // .unwrap_or(&String::new()) - // )); - //} - //write!(f, "{}", parts.join(",")) + let parts: Vec = Vec::new(); + // if self.loadbalancer_id.is_some() || self.loadbalancer_name.is_some() { + // parts.push(format!( + // "lb: {}", + // self.loadbalancer_name + // .as_ref() + // .or(self.loadbalancer_id.as_ref()) + // .unwrap_or(&String::new()) + // )); + // } + // if self.listener_id.is_some() || self.listener_name.is_some() { + // parts.push(format!( + // "lsnr: {}", + // self.listener_name + // .as_ref() + // .or(self.listener_id.as_ref()) + // .unwrap_or(&String::new()) + // )); + // } + write!(f, "{}", parts.join(",")) } } -// impl TryFrom<&LoadBalancerPoolFilters> -// for openstack_sdk::api::load_balancer::v2::pool::list::RequestBuilder<'_> -// { -// type Error = eyre::Report; -// -// fn try_from(_value: &LoadBalancerPoolFilters) -> Result { -// let ep_builder = openstack_sdk::api::load_balancer::v2::pool::list::Request::builder(); -// -// Ok(ep_builder) -// } -// } +impl TryFrom<&LoadBalancerPoolFilters> + for openstack_sdk::api::load_balancer::v2::pool::list::RequestBuilder<'_> +{ + type Error = eyre::Report; + + fn try_from(_value: &LoadBalancerPoolFilters) -> Result { + let ep_builder = openstack_sdk::api::load_balancer::v2::pool::list::Request::builder(); + + // if let Some(val) = &value.loadbalancer_id { + // ep_builder.load_balancer_id(val.clone()); + // } + + Ok(ep_builder) + } +} #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct LoadBalancerPoolMemberFilters { @@ -134,36 +161,39 @@ impl TryFrom<&LoadBalancerPoolMemberFilters> #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct LoadBalancerHealthMonitorFilters { - //pub loadbalancer_id: Option, - //pub loadbalancer_name: Option, + pub pool_id: Option, + pub pool_name: Option, } impl fmt::Display for LoadBalancerHealthMonitorFilters { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "") - //let mut parts: Vec = Vec::new(); - //if self.loadbalancer_id.is_some() || self.loadbalancer_name.is_some() { - // parts.push(format!( - // "lb: {}", - // self.loadbalancer_name - // .as_ref() - // .or(self.loadbalancer_id.as_ref()) - // .unwrap_or(&String::new()) - // )); - //} - //write!(f, "{}", parts.join(",")) + let mut parts: Vec = Vec::new(); + if self.pool_id.is_some() || self.pool_id.is_some() { + parts.push(format!( + "pool: {}", + self.pool_name + .as_ref() + .or(self.pool_id.as_ref()) + .unwrap_or(&String::new()) + )); + } + write!(f, "{}", parts.join(",")) } } -// impl TryFrom<&LoadBalancerHealthMonitorFilters> -// for openstack_sdk::api::load_balancer::v2::healthmonitor::list::RequestBuilder<'_> -// { -// type Error = eyre::Report; -// -// fn try_from(_value: &LoadBalancerHealthMonitorFilters) -> Result { -// let ep_builder = -// openstack_sdk::api::load_balancer::v2::healthmonitor::list::Request::builder(); -// -// Ok(ep_builder) -// } -// } +impl TryFrom<&LoadBalancerHealthMonitorFilters> + for openstack_sdk::api::load_balancer::v2::healthmonitor::list::RequestBuilder<'_> +{ + type Error = eyre::Report; + + fn try_from(value: &LoadBalancerHealthMonitorFilters) -> Result { + let mut ep_builder = + openstack_sdk::api::load_balancer::v2::healthmonitor::list::Request::builder(); + + if let Some(val) = &value.pool_id { + ep_builder.pool_id(val.clone()); + } + + Ok(ep_builder) + } +} diff --git a/openstack_tui/src/components/load_balancer/loadbalancers.rs b/openstack_tui/src/components/load_balancer/loadbalancers.rs index 97ec9dd60..32ecc2641 100644 --- a/openstack_tui/src/components/load_balancer/loadbalancers.rs +++ b/openstack_tui/src/components/load_balancer/loadbalancers.rs @@ -21,7 +21,7 @@ use tokio::sync::mpsc::UnboundedSender; use crate::{ action::Action, - cloud_worker::types::{ApiRequest, LoadBalancerFilters}, + cloud_worker::types::{ApiRequest, LoadBalancerFilters, LoadBalancerListenerFilters}, components::{table_view::TableViewComponentBase, Component}, config::Config, error::TuiError, @@ -94,6 +94,28 @@ impl Component for LoadBalancers<'_> { self.get_filters().clone(), )))); } + Action::ShowLoadBalancerListeners => { + // only if we are currently in the right mode + if current_mode == Mode::LoadBalancers { + // and have command_tx + if let Some(command_tx) = self.get_command_tx() { + // and have a selected entry + if let Some(selected_entry) = self.get_selected() { + // send action to set SecurityGroupRulesFilters + command_tx.send(Action::SetLoadBalancerListenerFilters( + LoadBalancerListenerFilters { + loadbalancer_id: Some(selected_entry.id.clone()), + loadbalancer_name: Some(selected_entry.name.clone()), + }, + ))?; + return Ok(Some(Action::Mode { + mode: Mode::LoadBalancerListeners, + stack: true, + })); + } + } + } + } // Action::DeleteLoadBalancer => { // // only if we are currently in the right mode // if current_mode == Mode::LoadBalancerLoadBalancers { diff --git a/openstack_tui/src/components/load_balancer/pools.rs b/openstack_tui/src/components/load_balancer/pools.rs index bda86f435..9f24e1a07 100644 --- a/openstack_tui/src/components/load_balancer/pools.rs +++ b/openstack_tui/src/components/load_balancer/pools.rs @@ -21,7 +21,10 @@ use tokio::sync::mpsc::UnboundedSender; use crate::{ action::Action, - cloud_worker::types::{ApiRequest, LoadBalancerPoolFilters, LoadBalancerPoolMemberFilters}, + cloud_worker::types::{ + ApiRequest, LoadBalancerHealthMonitorFilters, LoadBalancerPoolFilters, + LoadBalancerPoolMemberFilters, + }, components::{table_view::TableViewComponentBase, Component}, config::Config, error::TuiError, @@ -115,6 +118,27 @@ impl Component for LoadBalancerPools<'_> { } } } + Action::ShowLoadBalancerPoolHealthMonitors => { + // only if we are currently in the expected mode + if current_mode == Mode::LoadBalancerPools { + // and have command_tx + if let Some(command_tx) = self.get_command_tx() { + // and have a selected entry + if let Some(group_row) = self.get_selected() { + command_tx.send(Action::SetLoadBalancerHealthMonitorFilters( + LoadBalancerHealthMonitorFilters { + pool_id: Some(group_row.id.clone()), + pool_name: Some(group_row.name.clone()), + }, + ))?; + return Ok(Some(Action::Mode { + mode: Mode::LoadBalancerHealthMonitors, + stack: true, + })); + } + } + } + } // Action::DeleteLoadBalancer => { // // only if we are currently in the right mode // if current_mode == Mode::LoadBalancerLoadBalancers {