forked from NationTech/harmony
		
	feat: score for preparing rook ceph cluster to remove drive based on rook-ceph-osd deployment name added functions to K8sclient to be able to scale deployment to a desired replicaset number and get pod based on name and namespace
This commit is contained in:
		
							parent
							
								
									67f3a23071
								
							
						
					
					
						commit
						b43ca7c740
					
				| @ -17,6 +17,7 @@ use kube::{ | |||||||
| }; | }; | ||||||
| use log::{debug, error, trace}; | use log::{debug, error, trace}; | ||||||
| use serde::{Serialize, de::DeserializeOwned}; | use serde::{Serialize, de::DeserializeOwned}; | ||||||
|  | use serde_json::json; | ||||||
| use similar::TextDiff; | use similar::TextDiff; | ||||||
| 
 | 
 | ||||||
| #[derive(new, Clone)] | #[derive(new, Clone)] | ||||||
| @ -51,6 +52,38 @@ impl K8sClient { | |||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     pub async fn get_pod(&self, name: &str, namespace: Option<&str>) -> Result<Option<Pod>, Error> { | ||||||
|  |         let pods: Api<Pod> = if let Some(ns) = namespace { | ||||||
|  |             Api::namespaced(self.client.clone(), ns) | ||||||
|  |         } else { | ||||||
|  |             Api::default_namespaced(self.client.clone()) | ||||||
|  |         }; | ||||||
|  |         Ok(pods.get_opt(name).await?) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub async fn scale_deployment( | ||||||
|  |         &self, | ||||||
|  |         name: &str, | ||||||
|  |         namespace: Option<&str>, | ||||||
|  |         replicas: u32, | ||||||
|  |     ) -> Result<(), Error> { | ||||||
|  |         let deployments: Api<Deployment> = if let Some(ns) = namespace { | ||||||
|  |             Api::namespaced(self.client.clone(), ns) | ||||||
|  |         } else { | ||||||
|  |             Api::default_namespaced(self.client.clone()) | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         let patch = json!({ | ||||||
|  |             "spec": { | ||||||
|  |                 "replicas": replicas | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |         let pp = PatchParams::default(); | ||||||
|  |         let scale = Patch::Apply(&patch); | ||||||
|  |         deployments.patch_scale(name, &pp, &scale).await?; | ||||||
|  |         Ok(()) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     pub async fn wait_until_deployment_ready( |     pub async fn wait_until_deployment_ready( | ||||||
|         &self, |         &self, | ||||||
|         name: String, |         name: String, | ||||||
|  | |||||||
| @ -14,5 +14,6 @@ pub mod monitoring; | |||||||
| pub mod okd; | pub mod okd; | ||||||
| pub mod opnsense; | pub mod opnsense; | ||||||
| pub mod prometheus; | pub mod prometheus; | ||||||
|  | pub mod storage; | ||||||
| pub mod tenant; | pub mod tenant; | ||||||
| pub mod tftp; | pub mod tftp; | ||||||
|  | |||||||
| @ -0,0 +1,79 @@ | |||||||
|  | use std::process::Command; | ||||||
|  | 
 | ||||||
|  | use async_trait::async_trait; | ||||||
|  | use serde::Serialize; | ||||||
|  | 
 | ||||||
|  | use crate::{ | ||||||
|  |     data::{Id, Version}, | ||||||
|  |     interpret::{Interpret, InterpretError, InterpretName, InterpretStatus, Outcome}, | ||||||
|  |     inventory::Inventory, | ||||||
|  |     score::Score, | ||||||
|  |     topology::{K8sclient, Topology}, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #[derive(Debug, Clone, Serialize)] | ||||||
|  | pub struct PrepCephOsdReplacement { | ||||||
|  |     osd_name: String, | ||||||
|  |     rook_ceph_namespace: String, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl<T: Topology + K8sclient> Score<T> for PrepCephOsdReplacement { | ||||||
|  |     fn name(&self) -> String { | ||||||
|  |         format!("CephOsdReplacementScore") | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     #[doc(hidden)] | ||||||
|  |     fn create_interpret(&self) -> Box<dyn Interpret<T>> { | ||||||
|  |         Box::new(PrepCephOsdReplacementInterpret { | ||||||
|  |             score: self.clone(), | ||||||
|  |         }) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[derive(Debug, Clone)] | ||||||
|  | pub struct PrepCephOsdReplacementInterpret { | ||||||
|  |     score: PrepCephOsdReplacement, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[async_trait] | ||||||
|  | impl<T: Topology + K8sclient> Interpret<T> for PrepCephOsdReplacementInterpret { | ||||||
|  |     async fn execute( | ||||||
|  |         &self, | ||||||
|  |         _inventory: &Inventory, | ||||||
|  |         topology: &T, | ||||||
|  |     ) -> Result<Outcome, InterpretError> { | ||||||
|  |         let client = topology.k8s_client().await.unwrap(); | ||||||
|  |         client | ||||||
|  |             .scale_deployment( | ||||||
|  |                 &self.score.osd_name, | ||||||
|  |                 Some(&self.score.rook_ceph_namespace), | ||||||
|  |                 0, | ||||||
|  |             ) | ||||||
|  |             .await?; | ||||||
|  |         client | ||||||
|  |             .get_pod(&self.score.osd_name, Some(&self.score.rook_ceph_namespace)) | ||||||
|  |             .await?; | ||||||
|  | 
 | ||||||
|  |         Ok(Outcome::success( | ||||||
|  |             "Successfully prepared rook-ceph-cluster for disk replacement".to_string(), | ||||||
|  |         )) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn get_name(&self) -> InterpretName { | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn get_version(&self) -> Version { | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn get_status(&self) -> InterpretStatus { | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn get_children(&self) -> Vec<Id> { | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl PrepCephOsdReplacementInterpret {} | ||||||
							
								
								
									
										1
									
								
								harmony/src/modules/storage/ceph/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								harmony/src/modules/storage/ceph/mod.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | pub mod ceph_osd_replacement_score; | ||||||
							
								
								
									
										1
									
								
								harmony/src/modules/storage/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								harmony/src/modules/storage/mod.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | pub mod ceph; | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user