mesa/ims/image/shasta/
http_client.rs

1use serde_json::Value;
2
3pub async fn get_raw(
4    shasta_token: &str,
5    shasta_base_url: &str,
6    shasta_root_cert: &[u8],
7    image_id_opt: Option<&str>,
8) -> Result<reqwest::Response, reqwest::Error> {
9    log::info!(
10        "Get IMS images '{}'",
11        image_id_opt.unwrap_or("all available")
12    );
13
14    let client_builder = reqwest::Client::builder()
15        .add_root_certificate(reqwest::Certificate::from_pem(shasta_root_cert)?);
16
17    // Build client
18    let client = if let Ok(socks5_env) = std::env::var("SOCKS5") {
19        // socks5 proxy
20        log::debug!("SOCKS5 enabled");
21        let socks5proxy = reqwest::Proxy::all(socks5_env)?;
22
23        // rest client to authenticate
24        client_builder.proxy(socks5proxy).build()?
25    } else {
26        client_builder.build()?
27    };
28
29    let api_url = if let Some(image_id) = image_id_opt {
30        shasta_base_url.to_owned() + "/ims/v3/images/" + image_id
31    } else {
32        shasta_base_url.to_owned() + "/ims/v3/images"
33    };
34
35    let response_rslt = client.get(api_url).bearer_auth(shasta_token).send().await;
36
37    match response_rslt {
38        Ok(response) => response.error_for_status(),
39        Err(error) => Err(error),
40    }
41}
42
43pub async fn get(
44    shasta_token: &str,
45    shasta_base_url: &str,
46    shasta_root_cert: &[u8],
47    image_id_opt: Option<&str>,
48) -> Result<Vec<Value>, reqwest::Error> {
49    let resp = get_raw(
50        shasta_token,
51        shasta_base_url,
52        shasta_root_cert,
53        image_id_opt,
54    )
55    .await?
56    .error_for_status()?;
57
58    let mut image_value_vec: Vec<Value> = if image_id_opt.is_some() {
59        [resp.json::<Value>().await?].to_vec()
60    } else {
61        resp.json().await?
62    };
63
64    // Sort images by creation time order ASC
65    image_value_vec.sort_by(|a, b| {
66        a["created"]
67            .as_str()
68            .unwrap()
69            .cmp(b["created"].as_str().unwrap())
70    });
71
72    Ok(image_value_vec)
73}
74
75pub async fn get_all(
76    shasta_token: &str,
77    shasta_base_url: &str,
78    shasta_root_cert: &[u8],
79) -> Result<Vec<Value>, reqwest::Error> {
80    get(shasta_token, shasta_base_url, shasta_root_cert, None).await
81}
82
83// Delete IMS image using CSM API. First does a "soft delete", then a "permanent deletion"
84// soft delete --> https://csm12-apidocs.svc.cscs.ch/paas/ims/operation/delete_v3_image/
85// permanent deletion --> https://csm12-apidocs.svc.cscs.ch/paas/ims/operation/delete_v3_deleted_image/
86pub async fn delete(
87    shasta_token: &str,
88    shasta_base_url: &str,
89    shasta_root_cert: &[u8],
90    image_id: &str,
91) -> Result<(), reqwest::Error> {
92    let client;
93
94    let client_builder = reqwest::Client::builder()
95        .add_root_certificate(reqwest::Certificate::from_pem(shasta_root_cert)?);
96
97    // Build client
98    if std::env::var("SOCKS5").is_ok() {
99        // socks5 proxy
100        log::debug!("SOCKS5 enabled");
101        let socks5proxy = reqwest::Proxy::all(std::env::var("SOCKS5").unwrap())?;
102
103        // rest client to authenticate
104        client = client_builder.proxy(socks5proxy).build()?;
105    } else {
106        client = client_builder.build()?;
107    }
108
109    // SOFT DELETION
110    let api_url = shasta_base_url.to_owned() + "/ims/v3/images/" + image_id;
111
112    client
113        .delete(api_url)
114        .bearer_auth(shasta_token)
115        .send()
116        .await?
117        .error_for_status()?;
118
119    // PERMANENT DELETION
120    let api_url = shasta_base_url.to_owned() + "/ims/v3/deleted/images/" + image_id;
121
122    client
123        .delete(api_url)
124        .bearer_auth(shasta_token)
125        .send()
126        .await?
127        .error_for_status()
128        .map(|_| ())
129}