1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
use crate::{apis::coredb_types::CoreDB, Context, Error};
use k8s_openapi::api::core::v1::Service;
use kube::{api::ListParams, Api, ResourceExt};
use std::sync::Arc;
use tracing::{debug, error};

// Delete the postgres-exporter service from the cluster
pub async fn delete_postgres_exporter_service(
    cdb: &CoreDB,
    ctx: Arc<Context>,
) -> Result<(), Error> {
    let client = ctx.client.clone();
    let ns = cdb.namespace().unwrap();
    let service_api: Api<Service> = Api::namespaced(client, &ns);

    // Define the label selector based on your service labels
    let label_selector =
        "app=postgres-exporter,component=metrics,coredb.io/name=".to_owned() + &cdb.name_any();
    let lp = ListParams::default().labels(&label_selector);

    // List services with specified labels
    let services = service_api.list(&lp).await?;

    // Delete the service
    for service in services {
        if let Some(service_name) = service.metadata.name {
            match service_api.delete(&service_name, &Default::default()).await {
                Ok(_) => {
                    debug!(
                        "Deleted Service: {}, for instance {}",
                        service_name,
                        cdb.name_any()
                    );
                }
                Err(e) => {
                    error!(
                        "Error deleting Service: {}, for instance {}",
                        e,
                        cdb.name_any()
                    );
                    return Err(Error::KubeError(e));
                }
            }
        } else {
            println!("Found a service without a name, skipping...");
        }
    }

    Ok(())
}

// #[instrument(skip(cdb, ctx), fields(instance_name = %cdb.name_any()))]
// pub async fn reconcile_prometheus_exporter_service(cdb: &CoreDB, ctx: Arc<Context>) -> Result<(), Error> {
//     let client = ctx.client.clone();
//     let ns = cdb.namespace().unwrap();
//     let name = cdb.name_any() + "-metrics";
//     let svc_api: Api<Service> = Api::namespaced(client, &ns);
//     let oref = cdb.controller_owner_ref(&()).unwrap();
//
//     if !(cdb.spec.postgresExporterEnabled) {
//         // check if service exists and delete it
//         let _o = svc_api.delete(&name, &Default::default()).await;
//         return Ok(());
//     }
//
//     let mut selector_labels: BTreeMap<String, String> = BTreeMap::new();
//     selector_labels.insert("app".to_owned(), "postgres-exporter".to_string());
//     selector_labels.insert("coredb.io/name".to_owned(), cdb.name_any());
//     selector_labels.insert("component".to_owned(), "metrics".to_string());
//
//     let mut labels = selector_labels.clone();
//     labels.insert("component".to_owned(), "metrics".to_owned());
//
//     let metrics_svc: Service = Service {
//         metadata: ObjectMeta {
//             name: Some(name.to_owned()),
//             namespace: Some(ns.to_owned()),
//             labels: Some(labels),
//             owner_references: Some(vec![oref]),
//             ..ObjectMeta::default()
//         },
//         spec: Some(ServiceSpec {
//             ports: Some(vec![ServicePort {
//                 port: 80,
//                 name: Some("metrics".to_string()),
//                 target_port: Some(IntOrString::String("metrics".to_string())),
//                 ..ServicePort::default()
//             }]),
//             selector: Some(selector_labels),
//             ..ServiceSpec::default()
//         }),
//         ..Service::default()
//     };
//
//     let ps = PatchParams::apply("cntrlr").force();
//     let _o = svc_api
//         .patch(&name, &ps, &Patch::Apply(&metrics_svc))
//         .await
//         .map_err(Error::KubeError)?;
//
//     Ok(())
// }