fix(k8s_anywhere): Ensure k3d cluster is started before use

- Refactor k3d cluster management to explicitly start the cluster.
- Introduce `start_cluster` function to ensure cluster is running before operations.
- Improve error handling and logging during cluster startup.
- Update `create_cluster` and other related functions to utilize the new startup mechanism.
- Enhance reliability and prevent potential issues caused by an uninitialized cluster.
- Add `run_k3d_command` to handle k3d commands with logging and error handling.
This commit is contained in:
2025-04-25 11:32:02 -04:00
parent 23971ecd7c
commit 22752960f9
5 changed files with 81 additions and 30 deletions

View File

@@ -116,17 +116,22 @@ impl K8sAnywhereTopology {
info!("Starting K8sAnywhere installation");
self.try_install_k3d().await?;
let k3d_score = self.get_k3d_installation_score();
match k3d_rs::K3d::new(k3d_score.installation_path, Some(k3d_score.cluster_name))
.get_client()
.await
{
Ok(client) => Ok(Some(K8sState {
// I feel like having to rely on the k3d_rs crate here is a smell
// I think we should have a way to interact more deeply with scores/interpret. Maybe the
// K3DInstallationScore should expose a method to get_client ? Not too sure what would be a
// good implementation due to the stateful nature of the k3d thing. Which is why I went
// with this solution for now
let k3d = k3d_rs::K3d::new(k3d_score.installation_path, Some(k3d_score.cluster_name));
let state = match k3d.get_client().await {
Ok(client) => K8sState {
_client: K8sClient::new(client),
_source: K8sSource::LocalK3d,
message: "Successfully installed K3D cluster and acquired client".to_string(),
})),
},
Err(_) => todo!(),
}
};
Ok(Some(state))
}
}
@@ -154,7 +159,7 @@ struct K8sAnywhereConfig {
#[async_trait]
impl Topology for K8sAnywhereTopology {
fn name(&self) -> &str {
todo!()
"K8sAnywhereTopology"
}
async fn ensure_ready(&self) -> Result<Outcome, InterpretError> {