civo_rs/
kubernetes.rs

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     /// Lists all Kubernetes clusters.
236    ///
237    /// # Examples
238    /// ```rust
239    /// let client = new_civo_client("API_KEY", "REGION");
240    /// let clusters = client.list_kubernetes_clusters().await;
241    /// ```
242    ///
243    /// # Returns
244    ///
245    /// A `Result` containing a `PaginatedKubernetesClusters` struct on success, or an `Error` on failure.
246    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     /// Retrieves a single Kubernetes cluster by ID.
255    ///
256    /// # Examples
257    /// ```
258    /// let client = new_civo_client("API_KEY", "REGION");
259    /// let cluster = client.get_kubernetes_cluster("CLUSTER_ID").await;
260    /// ```
261    ///
262    /// # Arguments
263    ///
264    /// * `id` - The ID of the cluster to retrieve.
265    ///
266    /// # Returns
267    ///
268    /// A `Result` containing a `KubernetesCluster` struct on success, or an `Error` on failure.
269    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     /// Creates a new Kubernetes cluster with a specified configuration.
279    ///
280    /// # Examples
281    /// ```
282    /// let client = new_civo_client("API_KEY", "REGION");
283    /// let cluster_config = KubernetesClusterConfig { ... };
284    /// let cluster = client.new_kubernetes_cluster(cluster_config).await;
285    /// ```
286    ///
287    /// # Arguments
288    ///
289    /// * `kc` - The `KubernetesClusterConfig` struct containing the configuration for the new cluster.
290    ///
291    /// # Returns
292    ///
293    /// A `Result` containing a `KubernetesCluster` struct on success, or an `HTTPError` on failure.
294    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    /// Creates a new simple Kubernetes cluster with a specified configuration.
305    /// This function provides the bare minimum options to get a cluster running on civo and is sufficient for most use cases.
306    ///
307    /// # Examples
308    /// ```
309    /// let client = new_civo_client("API_KEY", "REGION");
310    /// let cluster_config = SimpleClusterConfig { ... };
311    /// let cluster = client.new_simple_kubernetes_cluster(cluster_config).await;
312    /// ```
313    ///
314    /// # Arguments
315    ///
316    /// * `kc` - The `SimpleClusterConfig` struct containing the configuration for the new cluster.
317    ///
318    /// # Returns
319    ///
320    /// A `Result` containing a `KubernetesCluster` struct on success, or an `HTTPError` on failure.
321    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    /// Deletes a Kubernetes cluster by ID.
332    ///
333    /// # Examples
334    /// ```
335    /// let client = new_civo_client("API_KEY", "REGION");
336    /// let response = client.delete_kubernetes_cluster("CLUSTER_ID").await;
337    /// ```
338    ///
339    /// # Arguments
340    ///
341    /// * `cluster_id` - The ID of the cluster to delete.
342    ///
343    /// # Returns
344    ///
345    /// A `Result` containing a `SimpleResponse` struct on success, or an `HTTPError` on failure.
346    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    /// Retrieves a list of available Kubernetes versions.
355    ///
356    /// # Examples
357    /// ```
358    /// let client = new_civo_client("API_KEY", "REGION");
359    /// let versions = client.get_kubernetes_versions().await;
360    /// ```
361    ///
362    /// # Returns
363    ///
364    /// A `Result` containing a vector of `KubernetesVersion` structs on success, or an `Error` on failure.
365    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}