docker_api/api/
secret.rs

1//! Secrets are sensitive data that can be used by services. Swarm mode must be enabled for these endpoints to work.
2
3use crate::{
4    conn::{Headers, Payload},
5    models, Result,
6};
7
8impl_api_ty!(Secret => name);
9
10impl Secret {
11    impl_api_ep! { secret: Secret, resp
12        Inspect -> &format!("/secrets/{}", secret.name), models::Secret
13        Delete -> &format!("/secrets/{}", secret.name), ()
14    }
15    // TODO: add Secret::update
16}
17
18impl Secrets {
19    impl_api_ep! { __: Secret, resp
20        List -> "/secrets", models::Secret
21    }
22
23    api_doc! { Secret => Create
24    |
25    /// Create a new secret.
26    pub async fn create(&self, opts: &SecretCreateOpts) -> Result<Secret> {
27        use serde::Deserialize;
28        #[derive(Deserialize)]
29        struct SecretCreateResponse {
30            #[serde(rename = "Id")]
31            pub id: String,
32        }
33        self.docker
34            .post_json("/secrets/create", Payload::Json(opts.serialize_vec()?), Headers::none())
35            .await
36            .map(|resp: SecretCreateResponse| {
37                Secret::new(self.docker.clone(), resp.id)
38            })
39    }}
40}
41
42pub mod opts {
43    use crate::models::{Driver, Labels};
44    use crate::{Error, Result};
45    use containers_api::opts::{Filter, FilterItem};
46    use containers_api::{impl_filter_func, impl_opts_builder};
47    use serde::{Deserialize, Serialize};
48
49    impl_opts_builder!(url => SecretList);
50
51    pub enum SecretFilter {
52        /// The ID of the secret.
53        Id(String),
54        /// Label in the form of `label=key`
55        LabelKey(String),
56        /// Label in the form of `label=key=val`
57        Label(String, String),
58        /// The name of the secret.
59        Name(String),
60        Names(String),
61    }
62
63    impl Filter for SecretFilter {
64        fn query_item(&self) -> FilterItem {
65            use SecretFilter::*;
66            match &self {
67                Id(id) => FilterItem::new("id", id.to_owned()),
68                LabelKey(label) => FilterItem::new("label", label.to_owned()),
69                Label(key, val) => FilterItem::new("label", format!("{key}={val}")),
70                Name(name) => FilterItem::new("name", name.to_owned()),
71                Names(names) => FilterItem::new("names", names.to_owned()),
72            }
73        }
74    }
75
76    impl SecretListOptsBuilder {
77        impl_filter_func!(
78            /// Filter the list of filters by one of the variants of the enum.
79            SecretFilter
80        );
81    }
82
83    #[derive(Clone, Debug, Serialize, Deserialize)]
84    #[serde(rename_all = "PascalCase")]
85    /// Structure used to create a new secret with [`Secrets::create`](crate::Secrets::create).
86    pub struct SecretCreateOpts {
87        name: String,
88        labels: Labels,
89        data: String,
90        driver: Driver,
91        templating: Driver,
92    }
93
94    impl SecretCreateOpts {
95        /// Create a new secret with name and data. This function will take care of
96        /// encoding the secret's data as base64.
97        pub fn new<N, D>(name: N, data: D) -> Self
98        where
99            N: Into<String>,
100            D: AsRef<str>,
101        {
102            Self {
103                name: name.into(),
104                labels: Labels::new(),
105                data: base64::encode(data.as_ref()),
106                driver: Driver {
107                    name: "".into(),
108                    options: None,
109                },
110                templating: Driver {
111                    name: "".into(),
112                    options: None,
113                },
114            }
115        }
116
117        /// Set the driver of this secret.
118        pub fn set_driver(mut self, driver: Driver) -> Self {
119            self.driver = driver;
120            self
121        }
122
123        /// Set the templating driver of this secret.
124        pub fn set_templating(mut self, driver: Driver) -> Self {
125            self.templating = driver;
126            self
127        }
128
129        /// Add a label to this secret
130        pub fn add_label<K, V>(mut self, key: K, val: V) -> Self
131        where
132            K: Into<String>,
133            V: Into<String>,
134        {
135            self.labels.insert(key.into(), val.into());
136            self
137        }
138
139        pub fn serialize(&self) -> Result<String> {
140            serde_json::to_string(&self).map_err(Error::from)
141        }
142
143        pub fn serialize_vec(&self) -> Result<Vec<u8>> {
144            serde_json::to_vec(&self).map_err(Error::from)
145        }
146    }
147}
148
149pub use opts::*;