rust_control_plane/
snapshot.rs1pub 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}