1use std::collections::HashMap;
2use crate::client::{CivoClient, SimpleResponse};
3use crate::errors::GenericError;
4use reqwest::Error;
5use serde::{Deserialize, Serialize};
6use crate::errors::HTTPError;
7
8
9
10#[derive(Serialize, Deserialize, Debug)]
11pub struct KubernetesInstance {
12 pub id: String ,
13 #[serde(default)]
14 pub hostname: String ,
15 #[serde(default)]
16 pub size: String ,
17 #[serde(default)]
18 pub region: String,
19 #[serde(default)]
20 pub source_type: String,
21 #[serde(default)]
22 pub source_id: String ,
23 #[serde(default)]
24 pub initial_user: String,
25 #[serde(default)]
26 pub initial_password: String,
27 #[serde(default)]
28 pub status: String,
29 #[serde(default)]
30 pub firewall_id: String,
31 #[serde(default)]
32 pub public_ip: String,
33 pub cpu_cores: i32,
34 pub ram_mb: i32 ,
35 #[serde(default)]
36 pub tags: String,
37 pub created_at: String ,
38 #[serde(default)]
39 pub civo_statsd_token: String
40}
41
42#[derive(Serialize, Deserialize, Debug)]
43pub struct KubernetesPool {
44 pub id: String,
45 pub count:i32,
46 pub size: String,
47 pub instance_names: Vec<String>,
48 pub instances: Vec<KubernetesInstance>
49}
50
51type ApplcationConfiguration = HashMap<String,String>;
52
53#[derive(Serialize, Deserialize, Debug)]
54pub struct KubernetesInstalledApplication {
55 pub application: String,
56 pub name: String ,
57 pub version: String,
58 pub dependencies: String,
59 pub maintainer: String,
60 pub description: String,
61 pub post_install: String,
62 pub installed: String,
63 pub url: String,
64 pub category: String,
65 pub update_at: String,
66 pub image_url: String,
67 pub plan: String,
68 pub configuration: HashMap<String,ApplcationConfiguration>
69}
70
71
72#[derive(Deserialize,Serialize,Debug)]
73pub struct K8scluster {
74 #[serde(default)]
75 pub id: String,
76 #[serde(default)]
77 pub name: Option<String>,
78 #[serde(default)]
79 pub generated_name: Option<String>,
80 #[serde(default)]
81 pub version: Option<String>,
82 #[serde(default)]
83 pub status: Option<String>,
84 #[serde(default)]
85 pub ready: bool ,
86 #[serde(default)]
87 pub num_target_node: Option<String>,
88 #[serde(default)]
89 pub built_at: Option<String>,
90 #[serde(default)]
91 pub kubeconfig: Option<String> ,
92 #[serde(default)]
93 pub kubnernetes_version: Option<String>,
94 #[serde(default)]
95 pub api_endpoint: Option<String>,
96 #[serde(default)]
97 pub master_ip: Option<String>,
98 #[serde(default)]
99 pub dns_entry: Option<String>,
100 #[serde(default)]
101 pub upgrade_to_available: Option<String>,
102 #[serde(default)]
103 pub legacy: Option<String>,
104 #[serde(default)]
105 pub network_id: Option<String>,
106 #[serde(default)]
107 pub namespace: Option<String>,
108 #[serde(default)]
109 pub tags: Option<String>,
110 #[serde(default)]
111 pub created_at: Option<String>,
112 #[serde(default)]
113 pub instances: Option<Vec<KubernetesInstance>>,
114 #[serde(default)]
115 pub pools: Option<Vec<KubernetesPool>>,
116 pub required_pools: Option<Vec<RequiredPools>>,
117 #[serde(default)]
118 pub installed_applications: Vec<KubernetesInstalledApplication>,
119 #[serde(default)]
120 pub firewall_id: Option<String>,
121 #[serde(default)]
122 pub cni_plugin: Option<String>,
123 #[serde(default)]
124 pub ccm_installed: Option<String>
125}
126
127#[derive(Deserialize,Serialize,Debug)]
128pub struct KubernetesCluster {
129 pub id: String,
130 pub name: String,
131 pub version: String,
132 pub status: String,
133 pub ready: bool,
134 pub num_target_nodes: u32,
135 pub target_nodes_size: String,
136 pub built_at: String,
137 pub kubernetes_version: String,
138 pub api_endpoint: String,
139 pub dns_entry: String,
140 pub created_at: String,
141 pub master_ip: String,
142 pub pools: Option<()>,
143 pub required_pools: Vec<RequiredPools>,
144 pub firewall_id: String,
145 pub master_ipv6: String,
146 pub network_id: String,
147 pub namespace: String,
148 pub size: String,
149 pub count: u32,
150 pub kubeconfig: Option<()>,
151 pub instances: Option<()>,
152 pub installed_applications: Option<()>,
153 pub ccm_installed: String,
154}
155
156#[derive(Deserialize,Serialize,Debug)]
157pub struct RequiredPools {
158 pub id: String,
159 pub size: String,
160 pub count: i32
161}
162
163#[derive(Deserialize,Serialize)]
164pub struct PaginatedKubernetesClusters {
165 pub page: i32,
166 pub per_page: i32,
167 pub items: Vec<KubernetesCluster>
168
169}
170
171pub trait ClusterConfig {
172 fn name(&self) -> &str;
173 fn region(&self) -> &str;
174 fn network_id(&self) -> &str;
175 fn firewall_rule(&self) -> &str;
176 fn pools(&self) -> &Vec<KubernetesPoolConfig>;
177}
178
179
180#[derive(Deserialize,Serialize)]
181pub struct KubernetesClusterConfig {
182 pub name: String ,
183 pub region: String,
184 #[serde(default)]
185 pub num_target_nodes: i32,
186 #[serde(default)]
187 pub target_node_size: String ,
188 #[serde(default)]
189 pub kubnernetes_version: String,
190 #[serde(default)]
191 pub node_destroy: String,
192 pub network_id: String,
193 #[serde(default)]
194 pub tags: String,
195 pub pools: Vec<KubernetesPoolConfig>,
196 #[serde(default)]
197 pub applications: String,
198 #[serde(default)]
199 pub instance_firewall: String,
200 pub firewall_rule: String,
201 #[serde(default)]
202 pub cni_plugin: String,
203}
204
205
206#[derive(Deserialize,Serialize)]
207pub struct SimpleClusterConfig {
208 pub name: String,
209 pub region: String,
210 pub network_id: String,
211 pub firewall_rule: String,
212 pub pools: Vec<KubernetesPoolConfig>
213}
214
215
216#[derive(Deserialize,Serialize)]
217pub struct KubernetesPoolConfig {
218 pub id: String,
219 pub count: i32,
220 pub size: String
221}
222#[derive(Deserialize,Serialize,Debug)]
223pub struct KubernetesVersion {
224 #[serde(default)]
225 pub version:String ,
226 #[serde(rename(serialize = "type", deserialize = "type"))]
227 #[serde(default)]
228 pub r#type: String,
229 #[serde(default)]
230 pub default: bool,
231}
232
233
234impl CivoClient {
235 pub async fn list_kubernetes_clusters(&self) -> Result<PaginatedKubernetesClusters,Error> {
247 let cluster_endpoint = self.prepare_client_url("/v2/kubernetes/clusters");
248 let resp = self.send_get_request(&cluster_endpoint.as_str()).await;
249 match resp {
250 Ok(clusters) => return Ok(clusters.json::<PaginatedKubernetesClusters>().await?),
251 Err(error) => return Err(error),
252 }
253 }
254 pub async fn get_kubernetes_cluster(&self, id: &str) -> Result<KubernetesCluster, Error> {
270 let cluster_plus_id = format!("/v2/kubernetes/cluster/{}", id);
271 let cluster_endopoint = self.prepare_client_url(&cluster_plus_id);
272 let resp = self.send_get_request(cluster_endopoint.as_str()).await;
273 match resp {
274 Ok(cluster) => return Ok(cluster.json::<KubernetesCluster>().await?),
275 Err(error) => return Err(error),
276 }
277 }
278 pub async fn new_kubernetes_cluster(&self, mut kc: KubernetesClusterConfig) -> Result<KubernetesCluster,HTTPError> {
295 kc.region = self.region.clone();
296 let cluster_enpoint = self.prepare_client_url("/v2/kubernetes/clusters");
297 let resp = self.send_post_request(cluster_enpoint,kc).await;
298 match resp {
299 Ok(cluster) => return Ok(cluster.json::<KubernetesCluster>().await.unwrap()),
300 Err(error) => return Err(error),
301
302 }
303 }
304 pub async fn new_simple_kubernetes_cluster(&self, mut kc: SimpleClusterConfig) -> Result<KubernetesCluster,HTTPError> {
322 kc.region = self.region.clone();
323 let cluster_enpoint = self.prepare_client_url("/v2/kubernetes/clusters");
324 let resp = self.send_post_request(cluster_enpoint,kc).await;
325 match resp {
326 Ok(cluster) => return Ok(cluster.json::<KubernetesCluster>().await.unwrap()),
327 Err(error) => return Err(error),
328
329 }
330 }
331 pub async fn delete_kubernetes_cluster(&self,cluster_id:&str) -> Result<SimpleResponse,HTTPError> {
347 let cluster_endpoint = self.prepare_client_url("/v2/kubernetes/cluster").join(&cluster_id);
348 let resp = self.send_delete_request(cluster_endpoint.unwrap().as_str()).await;
349 match resp {
350 Ok(simplresp) => Ok(simplresp.json::<SimpleResponse>().await.unwrap()),
351 Err(err) => Err(err),
352 }
353 }
354 pub async fn get_kubernetes_versions(&self) -> Result<Vec<KubernetesVersion>, Error> {
366 let versions_endopoint = self.prepare_client_url("/v2/kubernetes/versions");
367 let resp = self.send_get_request(versions_endopoint.as_str()).await;
368 match resp {
369 Ok(versions) => return Ok(versions.json::<Vec<KubernetesVersion>>().await?),
370 Err(error) => return Err(error),
371 }
372 }
373
374}