rust_control_plane/
snapshot.rs

1pub mod type_url;
2
3use data_plane_api::envoy::config::cluster::v3::Cluster;
4use data_plane_api::envoy::config::core::v3::TypedExtensionConfig;
5use data_plane_api::envoy::config::endpoint::v3::ClusterLoadAssignment;
6use data_plane_api::envoy::config::listener::v3::Listener;
7use data_plane_api::envoy::config::route::v3::RouteConfiguration;
8use data_plane_api::envoy::config::route::v3::ScopedRouteConfiguration;
9use data_plane_api::envoy::extensions::transport_sockets::tls::v3::Secret;
10use data_plane_api::envoy::service::runtime::v3::Runtime;
11use data_plane_api::google::protobuf::Any;
12use prost::Message;
13use std::collections::HashMap;
14
15#[derive(Debug, Clone)]
16pub struct Snapshot {
17    pub resources: HashMap<String, Resources>,
18}
19
20impl Default for Snapshot {
21    fn default() -> Self {
22        Self::new()
23    }
24}
25
26impl Snapshot {
27    pub fn new() -> Self {
28        Self {
29            resources: HashMap::new(),
30        }
31    }
32
33    pub fn insert(&mut self, type_url: String, resources: Resources) {
34        self.resources.insert(type_url, resources);
35    }
36
37    pub fn version(&self, type_url: &str) -> &str {
38        self.resources
39            .get(type_url)
40            .map_or("", |resource| &resource.version)
41    }
42
43    pub fn resources(&self, type_url: &str) -> Option<&Resources> {
44        self.resources.get(type_url)
45    }
46}
47
48#[derive(Clone, Debug)]
49pub struct Resources {
50    pub version: String,
51    pub items: HashMap<String, Resource>,
52}
53
54impl Resources {
55    pub fn new(version: String) -> Self {
56        Self {
57            version,
58            items: HashMap::new(),
59        }
60    }
61}
62
63#[allow(clippy::large_enum_variant)]
64#[derive(Debug, Clone)]
65pub enum Resource {
66    Cluster(Cluster),
67    Endpoint(ClusterLoadAssignment),
68    Route(RouteConfiguration),
69    Listener(Listener),
70    Secret(Secret),
71    Runtime(Runtime),
72    ScopedRoute(ScopedRouteConfiguration),
73    ExtensionConfig(TypedExtensionConfig),
74}
75
76impl Resource {
77    pub fn into_any(&self) -> Any {
78        match self {
79            Resource::Cluster(cluster) => Any {
80                type_url: type_url::CLUSTER.to_string(),
81                value: cluster.encode_to_vec(),
82            },
83            Resource::Endpoint(endpoint) => Any {
84                type_url: type_url::ENDPOINT.to_string(),
85                value: endpoint.encode_to_vec(),
86            },
87            Resource::Route(route) => Any {
88                type_url: type_url::ROUTE.to_string(),
89                value: route.encode_to_vec(),
90            },
91            Resource::Listener(listener) => Any {
92                type_url: type_url::LISTENER.to_string(),
93                value: listener.encode_to_vec(),
94            },
95            Resource::Secret(secret) => Any {
96                type_url: type_url::SECRET.to_string(),
97                value: secret.encode_to_vec(),
98            },
99            Resource::Runtime(runtime) => Any {
100                type_url: type_url::RUNTIME.to_string(),
101                value: runtime.encode_to_vec(),
102            },
103            Resource::ScopedRoute(route) => Any {
104                type_url: type_url::SCOPED_ROUTE.to_string(),
105                value: route.encode_to_vec(),
106            },
107            Resource::ExtensionConfig(config) => Any {
108                type_url: type_url::EXTENSION_CONFIG.to_string(),
109                value: config.encode_to_vec(),
110            },
111        }
112    }
113}