podman_api/api/
manifests.rs

1use crate::{
2    api::ApiResource,
3    conn::{Headers, Payload},
4    models, opts, Result,
5};
6
7use containers_api::url;
8
9impl_api_ty!(
10    Manifest => name
11);
12
13impl Manifest {
14    api_doc! {
15    Manifest => ExistsLibpod
16    |
17    /// Quick way to determine if a manifest exists by name or id.
18    ///
19    /// Examples:
20    ///
21    /// ```no_run
22    /// async {
23    ///     use podman_api::Podman;
24    ///     let podman = Podman::unix("/run/user/1000/podman/podman.sock");
25    ///
26    ///     match podman.manifests().get("some-manifest").exists().await {
27    ///         Ok(exists) => if exists {
28    ///             println!("manifest exists!");
29    ///         } else {
30    ///             println!("manifest doesn't exists!");
31    ///         },
32    ///         Err(e) => eprintln!("check failed: {}", e),
33    ///     }
34    /// };
35    /// ```
36    pub async fn exists(&self) -> Result<bool> {
37        self.podman
38            .resource_exists(ApiResource::Manifests, &self.name)
39            .await
40    }}
41
42    api_doc! {
43    Manifest => InspectLibpod
44    |
45    /// Display details about this manifest list.
46    ///
47    /// Examples:
48    ///
49    /// ```no_run
50    /// async {
51    ///     use podman_api::Podman;
52    ///     let podman = Podman::unix("/run/user/1000/podman/podman.sock");
53    ///
54    ///     match podman.manifests().get("my-manifest").inspect().await {
55    ///         Ok(info) => println!("{:?}", info),
56    ///         Err(e) => eprintln!("{}", e),
57    ///     }
58    /// };
59    /// ```
60    pub async fn inspect(&self) -> Result<models::Schema2List> {
61        self.podman
62            .get_json(&format!("/libpod/manifests/{}/json", &self.name))
63            .await
64    }}
65
66    api_doc! {
67    Manifest => AddLibpod
68    |
69    /// Add an image to this manifest list.
70    ///
71    /// Examples:
72    ///
73    /// ```no_run
74    /// async {
75    ///     use podman_api::Podman;
76    ///     use podman_api::opts::ManifestImageAddOpts;
77    ///     let podman = Podman::unix("/run/user/1000/podman/podman.sock");
78    ///
79    ///     let manifest = podman.manifests().get("my-manifest");
80    ///     match manifest
81    ///         .add_image(&ManifestImageAddOpts::builder().images(["centos"]).build())
82    ///         .await
83    ///     {
84    ///         Ok(id) => println!("{:?}", id),
85    ///         Err(e) => eprintln!("{}", e),
86    ///     }
87    /// };
88    /// ```
89    pub async fn add_image(&self, opts: &opts::ManifestImageAddOpts) -> Result<models::IdResponse> {
90        self.podman
91            .post_json(
92                &format!("/libpod/manifests/{}/add", &self.name),
93                Payload::Json(opts.serialize_vec()?),
94                Headers::none(),
95            )
96            .await
97    }}
98
99    api_doc! {
100    Manifest => DeleteLibpod
101    |
102    /// Remove an image digest from this manifest list.
103    ///
104    /// Examples:
105    ///
106    /// ```no_run
107    /// async {
108    ///     use podman_api::Podman;
109    ///     let podman = Podman::unix("/run/user/1000/podman/podman.sock");
110    ///
111    ///     match podman
112    ///       .manifests()
113    ///       .get("my-manifest")
114    ///       .remove_image("sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc")
115    ///       .await {
116    ///         Ok(report) => println!("{:?}", report),
117    ///         Err(e) => eprintln!("{}", e),
118    ///     }
119    /// };
120    /// ```
121    pub async fn remove_image(&self, digest: impl Into<String>) -> Result<models::ManifestRemoveReport> {
122        let ep = url::construct_ep(
123            format!("/libpod/manifests/{}", &self.name),
124            Some(url::encoded_pair("digest", digest.into())),
125        );
126
127        self.podman.delete_json(&ep).await
128    }}
129
130    api_doc! {
131    Manifest => PushLibpod
132    |
133    /// Push this manifest list to a registry.
134    ///
135    /// Examples:
136    ///
137    /// ```no_run
138    /// async {
139    ///     use podman_api::Podman;
140    ///     use podman_api::opts::ManifestPushOpts;
141    ///     let podman = Podman::unix("/run/user/1000/podman/podman.sock");
142    ///
143    ///     let manifest = podman.manifests().get("my-manifest");
144    ///     match manifest
145    ///         .push(&ManifestPushOpts::builder("some-registry.addr").all(true).build())
146    ///         .await
147    ///     {
148    ///         Ok(id) => println!("{:?}", id),
149    ///         Err(e) => eprintln!("{}", e),
150    ///     }
151    /// };
152    /// ```
153    pub async fn push(&self, opts: &opts::ManifestPushOpts) -> Result<models::IdResponse> {
154        let ep = url::construct_ep(
155            format!("/libpod/manifests/{}/push", &self.name),
156            opts.serialize(),
157        );
158        self.podman
159            .post_json(&ep, Payload::empty(), Headers::none())
160            .await
161    }}
162
163    api_doc! {
164    Manifest => DeleteLibpod
165    |
166    /// Delete this manifest list.
167    /// Examples:
168    ///
169    /// ```no_run
170    /// async {
171    ///     use podman_api::Podman;
172    ///     let podman = Podman::unix("/run/user/1000/podman/podman.sock");
173    ///
174    ///     if let Err(e) = podman.manifests().get("my-manifest").delete().await {
175    ///         eprintln!("{}", e);
176    ///     }
177    /// };
178    /// ```
179    pub async fn delete(&self) -> Result<()> {
180        self.podman
181            .delete(&format!("/libpod/manifests/{}", self.name))
182            .await
183            .map(|_| ())
184    }}
185}
186
187impl Manifests {
188    api_doc! {
189    Manifest => CreateLibpod
190    |
191    /// Create a manifest list.
192    ///
193    /// Examples:
194    ///
195    /// ```no_run
196    /// async {
197    ///     use podman_api::Podman;
198    ///     use podman_api::opts::ManifestCreateOpts;
199    ///     let podman = Podman::unix("/run/user/1000/podman/podman.sock");
200    ///
201    ///     match podman
202    ///         .manifests()
203    ///         .create(
204    ///             &ManifestCreateOpts::builder("my-manifest")
205    ///                 .images(["alpine"])
206    ///                 .build(),
207    ///         )
208    ///         .await
209    ///     {
210    ///         Ok(manifest) => { /* do something with the manifest */ }
211    ///         Err(e) => eprintln!("{}", e),
212    ///     }
213    /// };
214    /// ```
215    pub async fn create(&self, opts: &opts::ManifestCreateOpts) -> Result<Manifest> {
216        let ep = url::construct_ep(format!("/libpod/manifests/{}", opts.name()), opts.serialize());
217        self.podman
218            .post_json(&ep, Payload::empty(), Headers::none())
219            .await
220            .map(|resp: models::IdResponse| self.podman.manifests().get(resp.id))
221    }}
222}