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}