Skip to content

Commit 8174a1a

Browse files
committed
fix(shulker-operator): properly use image overrides
1 parent cfe4f3f commit 8174a1a

File tree

4 files changed

+186
-40
lines changed

4 files changed

+186
-40
lines changed

packages/shulker-crds/src/schemas.rs

+7-26
Original file line numberDiff line numberDiff line change
@@ -13,40 +13,21 @@ pub struct TemplateSpec<T> {
1313
pub spec: T,
1414
}
1515

16-
#[derive(Deserialize, Serialize, Clone, Debug, JsonSchema)]
16+
#[derive(Deserialize, Serialize, Clone, Debug, JsonSchema, Default)]
1717
#[serde(rename_all = "camelCase")]
1818
pub struct ImageOverrideSpec {
1919
/// Complete name of the image, including the repository name
2020
/// and tag
21-
pub name: String,
21+
#[serde(skip_serializing_if = "Option::is_none")]
22+
pub name: Option<String>,
2223

2324
/// Policy about when to pull the image
24-
#[schemars(default = "ImageOverrideSpec::default_pull_policy")]
25-
#[schemars(schema_with = "ImageOverrideSpec::schema_pull_policy")]
26-
pub pull_policy: String,
25+
#[serde(skip_serializing_if = "Option::is_none")]
26+
pub pull_policy: Option<String>,
2727

2828
/// A list of secrets to use to pull the image
29-
pub image_pull_secrets: Vec<k8s_openapi::api::core::v1::LocalObjectReference>,
30-
}
31-
32-
#[cfg(not(tarpaulin_include))]
33-
impl ImageOverrideSpec {
34-
fn default_pull_policy() -> String {
35-
"IfNotPresent".to_string()
36-
}
37-
38-
fn schema_pull_policy(_: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema {
39-
schemars::schema::SchemaObject {
40-
instance_type: Some(schemars::schema::InstanceType::String.into()),
41-
enum_values: Some(vec![
42-
serde_json::Value::String("Always".to_string()),
43-
serde_json::Value::String("Never".to_string()),
44-
serde_json::Value::String("IfNotPresent".to_string()),
45-
]),
46-
..Default::default()
47-
}
48-
.into()
49-
}
29+
#[serde(skip_serializing_if = "Option::is_none")]
30+
pub image_pull_secrets: Option<Vec<k8s_openapi::api::core::v1::LocalObjectReference>>,
5031
}
5132

5233
#[derive(Deserialize, Serialize, Clone, Debug, JsonSchema)]

packages/shulker-kube-utils/src/lease.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ impl LeaseLock {
219219
} = lease.spec.as_ref().unwrap();
220220

221221
let utc_now = time::now();
222-
let lease_duration = Duration::seconds(lease_duration_seconds.unwrap() as i64);
222+
let lease_duration = Duration::try_seconds(lease_duration_seconds.unwrap() as i64).unwrap();
223223

224224
if let Some(MicroTime(time)) = renew_time {
225225
let renew_expire = time.checked_add_signed(lease_duration).unwrap();

packages/shulker-operator/src/reconcilers/minecraft_server/gameserver.rs

+85-7
Original file line numberDiff line numberDiff line change
@@ -260,12 +260,16 @@ impl<'a> GameServerBuilder {
260260

261261
if let Some(pod_overrides) = &minecraft_server.spec.pod_overrides {
262262
if let Some(image_overrides) = &pod_overrides.image {
263-
pod_spec.containers[0].image = Some(image_overrides.name.clone());
264-
pod_spec.containers[0].image_pull_policy =
265-
Some(image_overrides.pull_policy.clone());
263+
if let Some(name) = image_overrides.name.as_ref() {
264+
pod_spec.containers[0].image = Some(name.clone())
265+
}
266+
267+
if let Some(pull_policy) = image_overrides.pull_policy.as_ref() {
268+
pod_spec.containers[0].image_pull_policy = Some(pull_policy.clone())
269+
}
266270

267-
if let Some(image_pull_secrets) = pod_spec.image_pull_secrets.as_mut() {
268-
image_pull_secrets.append(&mut image_overrides.image_pull_secrets.clone());
271+
if let Some(image_pull_secrets) = image_overrides.image_pull_secrets.as_ref() {
272+
pod_spec.image_pull_secrets = Some(image_pull_secrets.clone())
269273
}
270274
}
271275

@@ -594,8 +598,10 @@ impl<'a> GameServerBuilder {
594598

595599
#[cfg(test)]
596600
mod tests {
597-
use k8s_openapi::api::core::v1::{EmptyDirVolumeSource, Volume, VolumeMount};
598-
use shulker_crds::resourceref::ResourceRefSpec;
601+
use k8s_openapi::api::core::v1::{
602+
EmptyDirVolumeSource, LocalObjectReference, Volume, VolumeMount,
603+
};
604+
use shulker_crds::{resourceref::ResourceRefSpec, schemas::ImageOverrideSpec};
599605
use shulker_kube_utils::reconcilers::builder::ResourceBuilder;
600606

601607
use crate::{
@@ -689,6 +695,78 @@ mod tests {
689695
)
690696
}
691697

698+
#[tokio::test]
699+
async fn get_pod_template_spec_contains_image_override() {
700+
// G
701+
let client = create_client_mock();
702+
let resourceref_resolver = ResourceRefResolver::new(client);
703+
let mut server = TEST_SERVER.clone();
704+
server.spec.pod_overrides.as_mut().unwrap().image = Some(ImageOverrideSpec {
705+
name: Some("my_better_image".to_string()),
706+
..ImageOverrideSpec::default()
707+
});
708+
let context = super::GameServerBuilderContext {
709+
cluster: &TEST_CLUSTER,
710+
agent_config: &AgentConfig {
711+
maven_repository: constants::SHULKER_PLUGIN_REPOSITORY.to_string(),
712+
version: constants::SHULKER_PLUGIN_VERSION.to_string(),
713+
},
714+
};
715+
716+
// W
717+
let pod_template = super::GameServerBuilder::get_pod_template_spec(
718+
&resourceref_resolver,
719+
&context,
720+
&server,
721+
)
722+
.await
723+
.unwrap();
724+
725+
// T
726+
assert_eq!(
727+
pod_template.spec.as_ref().unwrap().containers[0].image,
728+
Some("my_better_image".to_string())
729+
);
730+
}
731+
732+
#[tokio::test]
733+
async fn get_pod_template_spec_contains_image_pull_secrets() {
734+
// G
735+
let client = create_client_mock();
736+
let resourceref_resolver = ResourceRefResolver::new(client);
737+
let mut server = TEST_SERVER.clone();
738+
server.spec.pod_overrides.as_mut().unwrap().image = Some(ImageOverrideSpec {
739+
image_pull_secrets: Some(vec![LocalObjectReference {
740+
name: Some("my_pull_secret".to_string()),
741+
}]),
742+
..ImageOverrideSpec::default()
743+
});
744+
let context = super::GameServerBuilderContext {
745+
cluster: &TEST_CLUSTER,
746+
agent_config: &AgentConfig {
747+
maven_repository: constants::SHULKER_PLUGIN_REPOSITORY.to_string(),
748+
version: constants::SHULKER_PLUGIN_VERSION.to_string(),
749+
},
750+
};
751+
752+
// W
753+
let pod_template = super::GameServerBuilder::get_pod_template_spec(
754+
&resourceref_resolver,
755+
&context,
756+
&server,
757+
)
758+
.await
759+
.unwrap();
760+
761+
// T
762+
assert_eq!(
763+
pod_template.spec.as_ref().unwrap().image_pull_secrets,
764+
Some(vec![LocalObjectReference {
765+
name: Some("my_pull_secret".to_string())
766+
}])
767+
);
768+
}
769+
692770
#[tokio::test]
693771
async fn get_pod_template_spec_contains_volume_mounts() {
694772
// G

packages/shulker-operator/src/reconcilers/proxy_fleet/fleet.rs

+93-6
Original file line numberDiff line numberDiff line change
@@ -307,12 +307,16 @@ impl<'a> FleetBuilder {
307307

308308
if let Some(pod_overrides) = &proxy_fleet.spec.template.spec.pod_overrides {
309309
if let Some(image_overrides) = &pod_overrides.image {
310-
pod_spec.containers[0].image = Some(image_overrides.name.clone());
311-
pod_spec.containers[0].image_pull_policy =
312-
Some(image_overrides.pull_policy.clone());
310+
if let Some(name) = image_overrides.name.as_ref() {
311+
pod_spec.containers[0].image = Some(name.clone())
312+
}
313+
314+
if let Some(pull_policy) = image_overrides.pull_policy.as_ref() {
315+
pod_spec.containers[0].image_pull_policy = Some(pull_policy.clone())
316+
}
313317

314-
if let Some(image_pull_secrets) = pod_spec.image_pull_secrets.as_mut() {
315-
image_pull_secrets.append(&mut image_overrides.image_pull_secrets.clone());
318+
if let Some(image_pull_secrets) = image_overrides.image_pull_secrets.as_ref() {
319+
pod_spec.image_pull_secrets = Some(image_pull_secrets.clone())
316320
}
317321
}
318322

@@ -612,7 +616,10 @@ impl<'a> FleetBuilder {
612616

613617
#[cfg(test)]
614618
mod tests {
615-
use k8s_openapi::api::core::v1::{EmptyDirVolumeSource, Volume, VolumeMount};
619+
use k8s_openapi::api::core::v1::{
620+
EmptyDirVolumeSource, LocalObjectReference, Volume, VolumeMount,
621+
};
622+
use shulker_crds::schemas::ImageOverrideSpec;
616623
use shulker_kube_utils::reconcilers::builder::ResourceBuilder;
617624

618625
use crate::{
@@ -803,6 +810,86 @@ mod tests {
803810
)
804811
}
805812

813+
#[tokio::test]
814+
async fn get_pod_template_spec_contains_image_override() {
815+
// G
816+
let client = create_client_mock();
817+
let builder = super::FleetBuilder::new(client);
818+
let mut proxy_fleet = TEST_PROXY_FLEET.clone();
819+
proxy_fleet
820+
.spec
821+
.template
822+
.spec
823+
.pod_overrides
824+
.as_mut()
825+
.unwrap()
826+
.image = Some(ImageOverrideSpec {
827+
name: Some("my_better_image".to_string()),
828+
..ImageOverrideSpec::default()
829+
});
830+
let context = super::FleetBuilderContext {
831+
cluster: &TEST_CLUSTER,
832+
agent_config: &AgentConfig {
833+
maven_repository: constants::SHULKER_PLUGIN_REPOSITORY.to_string(),
834+
version: constants::SHULKER_PLUGIN_VERSION.to_string(),
835+
},
836+
};
837+
838+
// W
839+
let pod_template = builder
840+
.get_pod_template_spec(&context, &proxy_fleet)
841+
.await
842+
.unwrap();
843+
844+
// T
845+
assert_eq!(
846+
pod_template.spec.as_ref().unwrap().containers[0].image,
847+
Some("my_better_image".to_string())
848+
);
849+
}
850+
851+
#[tokio::test]
852+
async fn get_pod_template_spec_contains_image_pull_secrets() {
853+
// G
854+
let client = create_client_mock();
855+
let builder = super::FleetBuilder::new(client);
856+
let mut proxy_fleet = TEST_PROXY_FLEET.clone();
857+
proxy_fleet
858+
.spec
859+
.template
860+
.spec
861+
.pod_overrides
862+
.as_mut()
863+
.unwrap()
864+
.image = Some(ImageOverrideSpec {
865+
image_pull_secrets: Some(vec![LocalObjectReference {
866+
name: Some("my_pull_secret".to_string()),
867+
}]),
868+
..ImageOverrideSpec::default()
869+
});
870+
let context = super::FleetBuilderContext {
871+
cluster: &TEST_CLUSTER,
872+
agent_config: &AgentConfig {
873+
maven_repository: constants::SHULKER_PLUGIN_REPOSITORY.to_string(),
874+
version: constants::SHULKER_PLUGIN_VERSION.to_string(),
875+
},
876+
};
877+
878+
// W
879+
let pod_template = builder
880+
.get_pod_template_spec(&context, &proxy_fleet)
881+
.await
882+
.unwrap();
883+
884+
// T
885+
assert_eq!(
886+
pod_template.spec.as_ref().unwrap().image_pull_secrets,
887+
Some(vec![LocalObjectReference {
888+
name: Some("my_pull_secret".to_string())
889+
}])
890+
);
891+
}
892+
806893
#[tokio::test]
807894
async fn get_pod_template_spec_contains_volume_mounts() {
808895
// G

0 commit comments

Comments
 (0)