From c207ccee0526dfc0bcebd75b47da91f81f5feeba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Levilain?= Date: Thu, 26 Oct 2023 23:31:40 +0200 Subject: [PATCH] fix(shulker-operator): assert valid cluster ref before reconciling (#184) --- .../src/reconcilers/cluster_ref.rs | 18 ++++++++++++++++++ .../src/reconcilers/minecraft_server/mod.rs | 12 +++++++++++- .../reconcilers/minecraft_server_fleet/mod.rs | 12 +++++++++++- .../shulker-operator/src/reconcilers/mod.rs | 4 ++++ .../src/reconcilers/proxy_fleet/mod.rs | 12 +++++++++++- 5 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 packages/shulker-operator/src/reconcilers/cluster_ref.rs diff --git a/packages/shulker-operator/src/reconcilers/cluster_ref.rs b/packages/shulker-operator/src/reconcilers/cluster_ref.rs new file mode 100644 index 00000000..89ec1015 --- /dev/null +++ b/packages/shulker-operator/src/reconcilers/cluster_ref.rs @@ -0,0 +1,18 @@ +use kube::{Api, Client}; +use shulker_crds::v1alpha1::minecraft_cluster::{MinecraftCluster, MinecraftClusterRef}; + +use super::{ReconcilerError, Result}; + +pub async fn resolve_cluster_ref( + client: &Client, + namespace: &str, + cluster_ref: &MinecraftClusterRef, +) -> Result { + let clusters_api: Api = Api::namespaced(client.clone(), namespace); + let cluster = clusters_api + .get(&cluster_ref.name) + .await + .map_err(|e| ReconcilerError::InvalidClusterRef(cluster_ref.name.clone(), e))?; + + Ok(cluster) +} diff --git a/packages/shulker-operator/src/reconcilers/minecraft_server/mod.rs b/packages/shulker-operator/src/reconcilers/minecraft_server/mod.rs index 9bf34444..4b9be521 100644 --- a/packages/shulker-operator/src/reconcilers/minecraft_server/mod.rs +++ b/packages/shulker-operator/src/reconcilers/minecraft_server/mod.rs @@ -17,7 +17,10 @@ use shulker_crds::{ use self::{config_map::ConfigMapBuilder, gameserver::GameServerBuilder}; -use super::{builder::reconcile_builder, status::patch_status, ReconcilerError, Result}; +use super::{ + builder::reconcile_builder, cluster_ref::resolve_cluster_ref, status::patch_status, + ReconcilerError, Result, +}; pub mod config_map; pub mod gameserver; @@ -39,6 +42,13 @@ impl MinecraftServerReconciler { api: Api, minecraft_server: Arc, ) -> Result { + resolve_cluster_ref( + &self.client, + &minecraft_server.namespace().unwrap(), + &minecraft_server.spec.cluster_ref, + ) + .await?; + reconcile_builder(&self.config_map_builder, minecraft_server.as_ref()).await?; let gameserver = reconcile_builder(&self.gameserver_builder, minecraft_server.as_ref()).await?; diff --git a/packages/shulker-operator/src/reconcilers/minecraft_server_fleet/mod.rs b/packages/shulker-operator/src/reconcilers/minecraft_server_fleet/mod.rs index 8a8b2374..31b0e5ab 100644 --- a/packages/shulker-operator/src/reconcilers/minecraft_server_fleet/mod.rs +++ b/packages/shulker-operator/src/reconcilers/minecraft_server_fleet/mod.rs @@ -19,7 +19,10 @@ use self::{ config_map::ConfigMapBuilder, fleet::FleetBuilder, fleet_autoscaler::FleetAutoscalerBuilder, }; -use super::{builder::reconcile_builder, status::patch_status, ReconcilerError, Result}; +use super::{ + builder::reconcile_builder, cluster_ref::resolve_cluster_ref, status::patch_status, + ReconcilerError, Result, +}; mod config_map; mod fleet; @@ -43,6 +46,13 @@ impl MinecraftServerFleetReconciler { api: Api, minecraft_server_fleet: Arc, ) -> Result { + resolve_cluster_ref( + &self.client, + &minecraft_server_fleet.namespace().unwrap(), + &minecraft_server_fleet.spec.cluster_ref, + ) + .await?; + reconcile_builder(&self.config_map_builder, minecraft_server_fleet.as_ref()).await?; let fleet = reconcile_builder(&self.fleet_builder, minecraft_server_fleet.as_ref()).await?; reconcile_builder( diff --git a/packages/shulker-operator/src/reconcilers/mod.rs b/packages/shulker-operator/src/reconcilers/mod.rs index e7d4f748..9f4f9433 100644 --- a/packages/shulker-operator/src/reconcilers/mod.rs +++ b/packages/shulker-operator/src/reconcilers/mod.rs @@ -1,6 +1,7 @@ use thiserror::Error; pub mod builder; +mod cluster_ref; pub mod minecraft_cluster; pub mod minecraft_server; pub mod minecraft_server_fleet; @@ -18,6 +19,9 @@ pub enum ReconcilerError { #[error("failed to delete stale resource: {0}")] FailedToDeleteStale(#[source] kube::Error), + #[error("failed to resolve cluster ref: {1}")] + InvalidClusterRef(String, #[source] kube::Error), + #[error("builder {0} failed to build resource: {1}")] BuilderError(&'static str, #[source] anyhow::Error), } diff --git a/packages/shulker-operator/src/reconcilers/proxy_fleet/mod.rs b/packages/shulker-operator/src/reconcilers/proxy_fleet/mod.rs index 99dfcdd9..702ead3f 100644 --- a/packages/shulker-operator/src/reconcilers/proxy_fleet/mod.rs +++ b/packages/shulker-operator/src/reconcilers/proxy_fleet/mod.rs @@ -20,7 +20,10 @@ use self::{ service::ServiceBuilder, }; -use super::{builder::reconcile_builder, status::patch_status, ReconcilerError, Result}; +use super::{ + builder::reconcile_builder, cluster_ref::resolve_cluster_ref, status::patch_status, + ReconcilerError, Result, +}; mod config_map; mod fleet; @@ -46,6 +49,13 @@ impl ProxyFleetReconciler { api: Api, proxy_fleet: Arc, ) -> Result { + resolve_cluster_ref( + &self.client, + &proxy_fleet.namespace().unwrap(), + &proxy_fleet.spec.cluster_ref, + ) + .await?; + reconcile_builder(&self.config_map_builder, proxy_fleet.as_ref()).await?; reconcile_builder(&self.service_builder, proxy_fleet.as_ref()).await?; let fleet = reconcile_builder(&self.fleet_builder, proxy_fleet.as_ref()).await?;