From 97550ca16e872d34676e64955ea2aa560fc2790e Mon Sep 17 00:00:00 2001 From: Ian Stanton Date: Tue, 17 Dec 2024 16:09:54 -0500 Subject: [PATCH 1/2] Only delete ingress objects if stopped Signed-off-by: Ian Stanton --- tembo-operator/src/cloudnativepg/hibernate.rs | 167 +++++++++--------- 1 file changed, 86 insertions(+), 81 deletions(-) diff --git a/tembo-operator/src/cloudnativepg/hibernate.rs b/tembo-operator/src/cloudnativepg/hibernate.rs index 18722af4c..a1803821d 100644 --- a/tembo-operator/src/cloudnativepg/hibernate.rs +++ b/tembo-operator/src/cloudnativepg/hibernate.rs @@ -146,100 +146,105 @@ pub async fn reconcile_cluster_hibernation(cdb: &CoreDB, ctx: &Arc) -> } } - // Remove IngressRoutes for stopped instances - let ingress_route_api: Api = Api::namespaced(ctx.client.clone(), &namespace); - if let Err(err) = delete_ingress_route(ingress_route_api.clone(), &namespace, &name).await { - warn!( - "Error deleting app service IngressRoute for {}: {}", - cdb.name_any(), - err - ); - return Err(Action::requeue(Duration::from_secs(300))); - } - - let metrics_ing_route_name = format!("{}-metrics", cdb.name_any().as_str()); - if let Err(err) = delete_ingress_route( - ingress_route_api.clone(), - &namespace, - &metrics_ing_route_name, - ) - .await - { - warn!( - "Error deleting metrics IngressRoute for {}: {}", - cdb.name_any(), - err - ); - return Err(Action::requeue(Duration::from_secs(300))); - } + if cdb.spec.stop { + // Remove IngressRoutes for stopped instances + let ingress_route_api: Api = Api::namespaced(ctx.client.clone(), &namespace); + if let Err(err) = delete_ingress_route(ingress_route_api.clone(), &namespace, &name).await { + warn!( + "Error deleting app service IngressRoute for {}: {}", + cdb.name_any(), + err + ); + return Err(Action::requeue(Duration::from_secs(300))); + } - // Remove IngressRouteTCP route for stopped instances - let ingress_route_tcp_api = Api::namespaced(ctx.client.clone(), &namespace); - let prefix_read_only = format!("{}-ro-0", cdb.name_any().as_str()); - if let Err(err) = - delete_ingress_route_tcp(ingress_route_tcp_api.clone(), &namespace, &prefix_read_only).await - { - warn!( - "Error deleting postgres IngressRouteTCP for {}: {}", - cdb.name_any(), - err - ); - return Err(Action::requeue(Duration::from_secs(300))); - } + let metrics_ing_route_name = format!("{}-metrics", cdb.name_any().as_str()); + if let Err(err) = delete_ingress_route( + ingress_route_api.clone(), + &namespace, + &metrics_ing_route_name, + ) + .await + { + warn!( + "Error deleting metrics IngressRoute for {}: {}", + cdb.name_any(), + err + ); + return Err(Action::requeue(Duration::from_secs(300))); + } - let prefix_read_write = format!("{}-rw-0", cdb.name_any().as_str()); - if let Err(err) = delete_ingress_route_tcp( - ingress_route_tcp_api.clone(), - &namespace, - &prefix_read_write, - ) - .await - { - warn!( - "Error deleting postgres IngressRouteTCP for {}: {}", - cdb.name_any(), - err - ); - return Err(Action::requeue(Duration::from_secs(300))); - } + // Remove IngressRouteTCP route for stopped instances + let ingress_route_tcp_api = Api::namespaced(ctx.client.clone(), &namespace); + let prefix_read_only = format!("{}-ro-0", cdb.name_any().as_str()); + if let Err(err) = + delete_ingress_route_tcp(ingress_route_tcp_api.clone(), &namespace, &prefix_read_only) + .await + { + warn!( + "Error deleting postgres IngressRouteTCP for {}: {}", + cdb.name_any(), + err + ); + return Err(Action::requeue(Duration::from_secs(300))); + } - let prefix_pooler = format!("{}-pooler-0", cdb.name_any().as_str()); - if let Err(err) = - delete_ingress_route_tcp(ingress_route_tcp_api.clone(), &namespace, &prefix_pooler).await - { - warn!( - "Error deleting pooler IngressRouteTCP for {}: {}", - cdb.name_any(), - err - ); - return Err(Action::requeue(Duration::from_secs(300))); - } + let prefix_read_write = format!("{}-rw-0", cdb.name_any().as_str()); + if let Err(err) = delete_ingress_route_tcp( + ingress_route_tcp_api.clone(), + &namespace, + &prefix_read_write, + ) + .await + { + warn!( + "Error deleting postgres IngressRouteTCP for {}: {}", + cdb.name_any(), + err + ); + return Err(Action::requeue(Duration::from_secs(300))); + } - let ferret_ing = format!("{}-fdb-api", cdb.name_any().as_str()); - if let Err(err) = - delete_ingress_route_tcp(ingress_route_tcp_api.clone(), &namespace, &ferret_ing).await - { - warn!( - "Error deleting ferretdb IngressRouteTCP for {}: {}", - cdb.name_any(), - err - ); - return Err(Action::requeue(Duration::from_secs(300))); - } + let prefix_pooler = format!("{}-pooler-0", cdb.name_any().as_str()); + if let Err(err) = + delete_ingress_route_tcp(ingress_route_tcp_api.clone(), &namespace, &prefix_pooler) + .await + { + warn!( + "Error deleting pooler IngressRouteTCP for {}: {}", + cdb.name_any(), + err + ); + return Err(Action::requeue(Duration::from_secs(300))); + } - let extra_domain_names = cdb.spec.extra_domains_rw.clone().unwrap_or_default(); - if !extra_domain_names.is_empty() { - let prefix_extra = format!("extra-{}-rw", cdb.name_any().as_str()); + let ferret_ing = format!("{}-fdb-api", cdb.name_any().as_str()); if let Err(err) = - delete_ingress_route_tcp(ingress_route_tcp_api.clone(), &namespace, &prefix_extra).await + delete_ingress_route_tcp(ingress_route_tcp_api.clone(), &namespace, &ferret_ing).await { warn!( - "Error deleting extra postgres IngressRouteTCP for {}: {}", + "Error deleting ferretdb IngressRouteTCP for {}: {}", cdb.name_any(), err ); return Err(Action::requeue(Duration::from_secs(300))); } + + let extra_domain_names = cdb.spec.extra_domains_rw.clone().unwrap_or_default(); + if !extra_domain_names.is_empty() { + let prefix_extra = format!("extra-{}-rw", cdb.name_any().as_str()); + if let Err(err) = + delete_ingress_route_tcp(ingress_route_tcp_api.clone(), &namespace, &prefix_extra) + .await + { + warn!( + "Error deleting extra postgres IngressRouteTCP for {}: {}", + cdb.name_any(), + err + ); + return Err(Action::requeue(Duration::from_secs(300))); + } + } } // Stop CNPG reconciliation for hibernated instances. From 826162944b87e205586036325f1b080fa99cf9be Mon Sep 17 00:00:00 2001 From: Ian Stanton Date: Tue, 17 Dec 2024 17:22:54 -0500 Subject: [PATCH 2/2] Fix app svc test Signed-off-by: Ian Stanton --- tembo-operator/tests/integration_tests.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tembo-operator/tests/integration_tests.rs b/tembo-operator/tests/integration_tests.rs index 6b09ae28c..2a632a9e6 100644 --- a/tembo-operator/tests/integration_tests.rs +++ b/tembo-operator/tests/integration_tests.rs @@ -4369,19 +4369,19 @@ CREATE EVENT TRIGGER pgrst_watch assert!(service_items.is_empty()); // should be no Services - // ingress must be gone + // There should be 1 IngressRoute left (metrics) let ingresses: Vec = - list_resources(client.clone(), cdb_name, &namespace, &default_params, 0) + list_resources(client.clone(), cdb_name, &namespace, &default_params, 1) .await .unwrap(); - assert_eq!(ingresses.len(), 0); + assert_eq!(ingresses.len(), 1); - // Assert IngressRouteTCP is gone + // There should be 1 IngressRouteTCP left (postgres) let ingresses_tcp: Vec = - list_resources(client.clone(), cdb_name, &namespace, &default_params, 0) + list_resources(client.clone(), cdb_name, &namespace, &default_params, 1) .await .unwrap(); - assert_eq!(ingresses_tcp.len(), 0); + assert_eq!(ingresses_tcp.len(), 1); // CLEANUP TEST // Cleanup CoreDB