Make k8stenantmanager a oncecell

This commit is contained in:
Taha Hawa 2025-05-29 16:03:58 -04:00
parent 6490e5e82a
commit 7c809bf18a
3 changed files with 32 additions and 9 deletions

View File

@ -1,4 +1,4 @@
use std::{process::Command, sync::Arc}; use std::{io::Error, process::Command, sync::Arc};
use async_trait::async_trait; use async_trait::async_trait;
use inquire::Confirm; use inquire::Confirm;
@ -15,7 +15,11 @@ use crate::{
}; };
use super::{ use super::{
k8s::K8sClient, tenant::{k8s::K8sTenantManager, ResourceLimits, TenantConfig, TenantManager, TenantNetworkPolicy}, HelmCommand, K8sclient, Topology HelmCommand, K8sclient, Topology,
k8s::K8sClient,
tenant::{
ResourceLimits, TenantConfig, TenantManager, TenantNetworkPolicy, k8s::K8sTenantManager,
},
}; };
struct K8sState { struct K8sState {
@ -32,10 +36,9 @@ enum K8sSource {
pub struct K8sAnywhereTopology { pub struct K8sAnywhereTopology {
k8s_state: OnceCell<Option<K8sState>>, k8s_state: OnceCell<Option<K8sState>>,
tenant_manager: K8sTenantManager, tenant_manager: OnceCell<K8sTenantManager>,
} }
#[async_trait] #[async_trait]
impl K8sclient for K8sAnywhereTopology { impl K8sclient for K8sAnywhereTopology {
async fn k8s_client(&self) -> Result<Arc<K8sClient>, String> { async fn k8s_client(&self) -> Result<Arc<K8sClient>, String> {
@ -57,6 +60,7 @@ impl K8sAnywhereTopology {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
k8s_state: OnceCell::new(), k8s_state: OnceCell::new(),
tenant_manager: OnceCell::new(),
} }
} }
@ -165,6 +169,15 @@ impl K8sAnywhereTopology {
Ok(Some(state)) Ok(Some(state))
} }
fn get_k8s_tenant_manager(&self) -> Result<&K8sTenantManager, ExecutorError> {
match self.tenant_manager.get() {
Some(t) => Ok(t),
None => Err(ExecutorError::UnexpectedError(
"K8sTenantManager not available".to_string(),
)),
}
}
} }
struct K8sAnywhereConfig { struct K8sAnywhereConfig {
@ -219,7 +232,9 @@ impl HelmCommand for K8sAnywhereTopology {}
#[async_trait] #[async_trait]
impl TenantManager for K8sAnywhereTopology { impl TenantManager for K8sAnywhereTopology {
async fn provision_tenant(&self, config: &TenantConfig) -> Result<(), ExecutorError> { async fn provision_tenant(&self, config: &TenantConfig) -> Result<(), ExecutorError> {
self.tenant_manager.provision_tenant(config).await self.get_k8s_tenant_manager()?
.provision_tenant(config)
.await
} }
async fn update_tenant_resource_limits( async fn update_tenant_resource_limits(
@ -227,7 +242,9 @@ impl TenantManager for K8sAnywhereTopology {
tenant_name: &str, tenant_name: &str,
new_limits: &ResourceLimits, new_limits: &ResourceLimits,
) -> Result<(), ExecutorError> { ) -> Result<(), ExecutorError> {
self.tenant_manager.update_tenant_resource_limits(tenant_name, new_limits).await self.get_k8s_tenant_manager()?
.update_tenant_resource_limits(tenant_name, new_limits)
.await
} }
async fn update_tenant_network_policy( async fn update_tenant_network_policy(
@ -235,10 +252,14 @@ impl TenantManager for K8sAnywhereTopology {
tenant_name: &str, tenant_name: &str,
new_policy: &TenantNetworkPolicy, new_policy: &TenantNetworkPolicy,
) -> Result<(), ExecutorError> { ) -> Result<(), ExecutorError> {
self.tenant_manager.update_tenant_network_policy(tenant_name, new_policy).await self.get_k8s_tenant_manager()?
.update_tenant_network_policy(tenant_name, new_policy)
.await
} }
async fn deprovision_tenant(&self, tenant_name: &str) -> Result<(), ExecutorError> { async fn deprovision_tenant(&self, tenant_name: &str) -> Result<(), ExecutorError> {
self.tenant_manager.deprovision_tenant(tenant_name).await self.get_k8s_tenant_manager()?
.deprovision_tenant(tenant_name)
.await
} }
} }

View File

@ -2,11 +2,13 @@ use std::sync::Arc;
use crate::{executors::ExecutorError, topology::k8s::K8sClient}; use crate::{executors::ExecutorError, topology::k8s::K8sClient};
use async_trait::async_trait; use async_trait::async_trait;
use derive_new::new;
use k8s_openapi::api::core::v1::Namespace; use k8s_openapi::api::core::v1::Namespace;
use serde_json::json; use serde_json::json;
use super::{ResourceLimits, TenantConfig, TenantManager, TenantNetworkPolicy}; use super::{ResourceLimits, TenantConfig, TenantManager, TenantNetworkPolicy};
#[derive(new)]
pub struct K8sTenantManager { pub struct K8sTenantManager {
k8s_client: Arc<K8sClient>, k8s_client: Arc<K8sClient>,
} }

View File

@ -1,5 +1,5 @@
mod manager;
pub mod k8s; pub mod k8s;
mod manager;
pub use manager::*; pub use manager::*;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};