conclave/
manifests.rs

1/// Manifests:
2///
3/// These contain the intent for the system.
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7#[derive(PartialEq, Eq, Clone)]
8pub struct ReplicaSetId(String);
9
10impl From<&str> for ReplicaSetId {
11    fn from(s: &str) -> Self {
12        ReplicaSetId(s.to_string())
13    }
14}
15
16impl std::fmt::Display for ReplicaSetId {
17    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
18        write!(f, "{}", self.0)
19    }
20}
21
22impl std::fmt::Debug for ReplicaSetId {
23    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
24        write!(f, "ReplicaSetId({})", self.0)
25    }
26}
27
28impl serde::Serialize for ReplicaSetId {
29    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
30    where
31        S: serde::ser::Serializer,
32    {
33        self.0.serialize(serializer)
34    }
35}
36
37impl<'a> serde::Deserialize<'a> for ReplicaSetId {
38    fn deserialize<D>(deserializer: D) -> Result<ReplicaSetId, D::Error>
39    where
40        D: serde::de::Deserializer<'a>,
41    {
42        let s = String::deserialize(deserializer)?;
43        Ok(ReplicaSetId(s))
44    }
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
48pub struct Metadata {
49    pub name: String,
50    pub labels: HashMap<String, String>,
51}
52
53#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
54pub struct Manifest<T> {
55    pub metadata: Metadata,
56    pub spec: T,
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
60pub struct PodTemplate {
61    pub containers: Vec<ContainerSpec>,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
65pub enum Replicas {
66    Fixed(u32),
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
70pub struct ReplicaSetSpec {
71    pub replicas: Replicas,
72    pub pod_template: PodTemplate,
73}
74
75pub type ReplicaSetManifest = Manifest<ReplicaSetSpec>;
76
77#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
78pub struct ContainerSpec {
79    pub name: String,
80    pub image: String,
81    pub args: Vec<String>,
82    pub env: HashMap<String, String>,
83}