use std::collections::HashMap;
use aerospike::{AdminPolicy, Client};
use crate::common;
async fn list_indexes(client: &Client, namespace: &str) -> Vec<HashMap<String, String>> {
let node = client
.cluster
.get_random_node()
.expect("no nodes available");
let cmd = format!("sindex-list:namespace={}", namespace);
let res = node
.info(&AdminPolicy::default(), &[&cmd])
.await
.expect("sindex info request failed");
let sindex_str = res.get(&cmd).map(String::as_str).unwrap_or("");
sindex_str
.split(';')
.map(|entry| {
entry
.split(':')
.filter(|kv| !kv.trim().is_empty())
.filter_map(|kv| kv.split_once('='))
.map(|(k, v)| (k.to_string(), v.to_string()))
.collect()
})
.collect()
}
async fn drop_indexes(client: &Client, namespace: &str) {
let policy = AdminPolicy::default();
for index in list_indexes(client, namespace).await {
if index.get("ns").map(String::as_str) != Some(namespace) {
continue;
}
let set = index.get("set").map(String::as_str).unwrap_or("");
let Some(name) = index.get("indexname") else {
continue;
};
match client.drop_index(&policy, namespace, set, name).await {
Ok(_) => println!("Success: Removing Namespace/Set/Index: {namespace}/{set}/{name}"),
Err(e) => {
println!("Failed: Removing Namespace/Set/Index: {namespace}/{set}/{name} ({e})")
}
}
}
}
async fn truncate_namespace(client: &Client, namespace: &str) {
match client
.truncate(&AdminPolicy::default(), namespace, "", 0)
.await
{
Ok(_) => println!("Success: Removing Namespace: {namespace}"),
Err(e) => println!("Failed: Removing Namespace: {namespace} ({e})"),
}
}
#[ignore]
#[aerospike_macro::test]
async fn cleanup_after_tests() {
let client = common::client().await;
let namespace = common::namespace();
drop_indexes(&client, namespace).await;
truncate_namespace(&client, namespace).await;
client.close().await.unwrap();
}