1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use serde::{Serialize, Deserialize};
use std::error::Error;
use reqwest::header::HeaderMap;
use crate::get_image_digest_dockerhub::get_digest_info_dockerhub;
#[allow(non_snake_case)]
#[derive(Serialize,Deserialize,Debug,Default)]
pub struct Manifest {
pub schemaVersion: i64,
pub mediaType: String,
pub config: Config,
pub layers: Vec<Layers>,
}
#[allow(non_snake_case)]
#[derive(Serialize,Deserialize,Debug,Default)]
pub struct Config {
pub digest: String,
pub mediaType: String,
pub size: i64,
}
#[allow(non_snake_case)]
#[derive(Serialize,Deserialize,Debug,Default)]
pub struct Layers {
pub digest: String,
pub mediaType: String,
pub size: i64,
}
pub async fn get_manifest_info_dockerhub(image_name:String,image_version:String,token:String) -> Result<Manifest, Box<dyn Error + Send>> {
let image_digest_1 = get_digest_info_dockerhub(image_name.clone(),image_version.clone()).await.unwrap();
let image_digest_2 = image_digest_1.images;
let mut image_digest = "".to_string();
for (_,v) in image_digest_2.iter().enumerate(){
if v.architecture == "amd64".to_string() {
image_digest = v.digest.clone();
break;
}
}
let url = format!("https://registry.hub.docker.com/v2/{}/manifests/{}",image_name.clone(),image_digest.clone());
let client = reqwest::Client::new();
let mut headers = HeaderMap::new();
headers.insert("Content-Type", "application/vnd.docker.distribution.manifest.v2+json".parse().unwrap());
headers.insert("Accept-Language", "zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6".parse().unwrap());
match client.get(url.clone()).bearer_auth(token.clone()).timeout(std::time::Duration::from_secs(10)).send().await {
Ok(r) => {
match r.json().await {
Ok(res) => Ok(res),
Err(e) => {
Err(Box::new(e))
}
}
},
Err(e) => {
Err(Box::new(e))
}
}
}