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
68
69
70
71
72
73
74
75
76
77
78
79
80
//! Module to manage nomad jobs
//!

use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::hash::Hash;

#[derive(Debug, Eq, PartialEq, Hash, Deserialize, Serialize)]
pub enum RunningStatus {
    Queued,
    Complete,
    Failed,
    Running,
    Starting,
    Lost,
    Pending,
    Dead,
}

#[allow(non_snake_case)]
#[derive(Debug, Deserialize, Serialize)]
pub struct Job {
    pub ID: String,
    pub ParentID: String,
    pub Namespace: String,
    pub Datacenters: Vec<String>,
    pub MultiRegion: Option<String>,
    pub Type: String,
    pub Priority: isize,
    pub Periodic: bool,
    pub ParameterizedJob: bool,
    pub Stop: bool,
    pub Status: String,
    pub StatusDescription: String,
    pub JobSummary: JobSummary,
    pub CreateIndex: u16,
    pub ModifyIndex: u16,
    pub JobModifyIndex: u16,
    pub SubmitTime: u128,
}

#[allow(non_snake_case)]
#[derive(Debug, Deserialize, Serialize)]
pub struct JobSummary {
    pub JobID: String,
    pub Namespace: String,
    pub Summary: HashMap<String, HashMap<RunningStatus, isize>>,
    pub Children: HashMap<RunningStatus, u16>,
    pub CreateIndex: u16,
    pub ModifyIndex: u16,
}

#[cfg(test)]
mod test {
    use super::*;
    use std::fs::File;

    #[test]
    fn test_job_from_str() {
        let file = File::open("./tests/jobs_response.json").unwrap();

        let job: Job = serde_json::from_reader(file).unwrap();

        // Test select attributes
        assert_eq!(job.ID, "example".to_string());
        assert_eq!(job.Datacenters, ["dc1".to_string()]);
        assert_eq!(job.Priority, 50);
        assert_eq!(job.ParameterizedJob, false);

        assert_eq!(
            job.JobSummary
                .Summary
                .get("cache")
                .unwrap()
                .get(&RunningStatus::Running)
                .unwrap(),
            &1
        );
    }
}