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
use std::collections::HashMap;

use serde::{Deserialize, Serialize};

use crate::models::alloc_deployment_status::AllocDeploymentStatus;
use crate::models::allocated_resources::AllocatedResources;
use crate::models::allocation_metric::AllocationMetric;
use crate::models::desired_transition::DesiredTransition;
use crate::models::job::Job;
use crate::models::reschedule_tracker::RescheduleTracker;
use crate::models::resources::Resources;
use crate::models::task_state::TaskState;

#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct Allocation {
    #[serde(alias = "ID")]
    pub id: Option<String>,
    pub namespace: Option<String>,
    #[serde(alias = "EvalID")]
    pub eval_id: Option<String>,
    pub name: Option<String>,
    #[serde(alias = "NodeID")]
    pub node_id: Option<String>,
    pub node_name: Option<String>,
    #[serde(alias = "JobID")]
    pub job_id: Option<String>,
    pub job: Option<Job>,
    pub task_group: Option<String>,
    pub resources: Option<Resources>,
    pub task_resources: Option<HashMap<String, Resources>>,
    pub allocated_resources: Option<AllocatedResources>,
    pub services: Option<HashMap<String, String>>,
    pub metrics: Option<AllocationMetric>,
    pub desired_status: Option<String>,
    pub desired_description: Option<String>,
    pub desired_transition: Option<DesiredTransition>,
    pub client_status: Option<String>,
    pub client_description: Option<String>,
    pub task_states: Option<HashMap<String, TaskState>>,
    #[serde(alias = "DeploymentID")]
    pub deployment_id: Option<String>,
    pub deployment_status: Option<AllocDeploymentStatus>,
    #[serde(alias = "FollowupEvalID")]
    pub followup_eval_id: Option<String>,
    pub previous_allocation: Option<String>,
    pub next_allocation: Option<String>,
    pub reschedule_tracker: Option<RescheduleTracker>,
    pub preempted_allocations: Option<Vec<String>>,
    pub preempted_by_allocation: Option<String>,
    pub create_index: Option<i32>,
    pub modify_index: Option<i32>,
    pub alloc_modify_index: Option<i32>,
    pub create_time: Option<i64>,
    pub modify_time: Option<i64>,
}

impl Allocation {
    pub fn get_task_state(&self, name: &str) -> Option<&TaskState> {
        match self.task_states {
            Some(ref state) => match state.get(name) {
                Some(task_state) => Some(task_state),
                None => None,
            },
            None => None,
        }
    }
}