spacegate_config/service/k8s/
delete.rs

1use 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}