spacegate_config/service/k8s/
delete.rs1use k8s_gateway_api::{Gateway, HttpRoute};
2use k8s_openapi::api::core::v1::Secret;
3use kube::{api::DeleteParams, Api, ResourceExt as _};
4use spacegate_model::ext::k8s::crd::{http_spaceroute::HttpSpaceroute, sg_filter::SgFilter};
5
6use crate::{
7 service::{Delete, Retrieve as _},
8 BoxResult,
9};
10
11use super::{
12 convert::{filter_k8s_conv::PluginIdConv, gateway_k8s_conv::SgGatewayConv as _, route_k8s_conv::SgHttpRouteConv as _, ToTarget as _},
13 K8s,
14};
15
16impl Delete for K8s {
17 async fn delete_config_item_gateway(&self, gateway_name: &str) -> BoxResult<()> {
18 let gateway_api: Api<Gateway> = self.get_namespace_api();
19
20 if let Some(sg_gateway) = self.retrieve_config_item_gateway(gateway_name).await? {
21 let (gateway, secret, delete_plugin_ids) = sg_gateway.to_kube_gateway(&self.namespace);
22
23 if let Some(secret) = secret {
24 let secret_api: Api<Secret> = self.get_namespace_api();
25 secret_api.delete(&secret.name_any(), &DeleteParams::default()).await?;
26 }
27
28 for delete_plugin_id in delete_plugin_ids {
29 delete_plugin_id.remove_filter_target(gateway.to_target_ref(), self).await?;
30 }
31
32 gateway_api.delete(gateway_name, &DeleteParams::default()).await?;
33 }
34 Ok(())
35 }
36
37 async fn delete_config_item_route(&self, gateway_name: &str, route_name: &str) -> BoxResult<()> {
38 let http_spaceroute_api: Api<HttpSpaceroute> = self.get_namespace_api();
39 let httproute_api: Api<HttpRoute> = self.get_namespace_api();
40
41 if let Some(sg_http_route) = self.retrieve_config_item_route(gateway_name, route_name).await? {
42 let (route, delete_plugin_ids) = sg_http_route.to_kube_httproute(gateway_name, route_name, &self.namespace);
43 for delete_plugin_id in delete_plugin_ids {
44 delete_plugin_id.remove_filter_target(route.to_target_ref(), self).await?;
45 }
46 match http_spaceroute_api.delete(route_name, &DeleteParams::default()).await {
47 Ok(_) => Ok(()),
48 Err(f_e) => match httproute_api.delete(route_name, &DeleteParams::default()).await {
49 Ok(_) => Ok(()),
50 Err(s_e) => Err(format!("Failed to delete route {}: httpspaceroute: {}, httproute: {}", route_name, f_e, s_e).into()),
51 },
52 }
53 } else {
54 Ok(())
55 }
56 }
57
58 async fn delete_plugin(&self, id: &spacegate_model::PluginInstanceId) -> BoxResult<()> {
59 let filter_api: Api<SgFilter> = self.get_namespace_api();
60 if let Ok(filter) = filter_api.get(&id.name.to_raw_str()).await {
61 if filter.spec.target_refs.is_empty() {
62 filter_api.delete(&filter.name_any(), &DeleteParams::default()).await?;
63 } else {
64 return Err(format!(
65 "The filter have references [{}]",
66 filter.spec.target_refs.iter().map(|t| format!("{}", t)).collect::<Vec<String>>().join(", ")
67 )
68 .into());
69 }
70 }
71 Ok(())
72 }
73}