From 5670a505df1d12e5b5b2745554eda93df3983ad2 Mon Sep 17 00:00:00 2001 From: Arnav Singh Date: Wed, 13 Dec 2023 14:20:44 -0800 Subject: [PATCH] Backport v1.29 changes to merge strategy of `PodSchedulingContextSpec::potential_nodes` and `ResourceClaimSchedulingStatus::unsuitable_nodes` --- .../src/fixups/upstream_bugs.rs | 70 ++++++++++++++++++- k8s-openapi-codegen/src/supported_version.rs | 5 ++ .../resource_claim_scheduling_status.rs | 2 +- .../v1alpha2/pod_scheduling_context_spec.rs | 2 +- .../resource_claim_scheduling_status.rs | 2 +- .../v1alpha2/pod_scheduling_context_spec.rs | 2 +- .../resource_claim_scheduling_status.rs | 2 +- 7 files changed, 78 insertions(+), 7 deletions(-) diff --git a/k8s-openapi-codegen/src/fixups/upstream_bugs.rs b/k8s-openapi-codegen/src/fixups/upstream_bugs.rs index 0fb659425..94bedee50 100644 --- a/k8s-openapi-codegen/src/fixups/upstream_bugs.rs +++ b/k8s-openapi-codegen/src/fixups/upstream_bugs.rs @@ -161,8 +161,8 @@ pub(crate) mod required_properties { } } -/// `Status` has extra group-version-kind entries than the original `"":v1:Status` that cause it to not be detected as a `Resource`. -/// Remove the extras. +// `Status` has extra group-version-kind entries than the original `"":v1:Status` that cause it to not be detected as a `Resource`. +// Remove the extras. pub(crate) fn status_extra_gvk(spec: &mut crate::swagger20::Spec) -> Result<(), crate::Error> { let definition_path = crate::swagger20::DefinitionPath("io.k8s.apimachinery.pkg.apis.meta.v1.Status".to_owned()); if let Some(definition) = spec.definitions.get_mut(&definition_path) { @@ -181,3 +181,69 @@ pub(crate) fn status_extra_gvk(spec: &mut crate::swagger20::Spec) -> Result<(), Err("never applied Status extra group-version-kinds override".into()) } + +// `PodSchedulingContextSpec` has `set` merge strategy in versions before v1.29 +// but v1.29 decided it would like clients to treat it as `atomic`. +// +// Ref: https://github.com/kubernetes/kubernetes/pull/119962 +pub(crate) fn pod_scheduling_context_spec_potential_nodes_merge_strategy(spec: &mut crate::swagger20::Spec) -> Result<(), crate::Error> { + let definition_path = crate::swagger20::DefinitionPath("io.k8s.api.resource.v1alpha2.PodSchedulingContextSpec".to_owned()); + if let Some(definition) = spec.definitions.get_mut(&definition_path) { + if let crate::swagger20::SchemaKind::Properties(properties) = &mut definition.kind { + if let Some(property) = properties.get_mut("potentialNodes") { + if let crate::swagger20::MergeType::List { strategy, .. } = &mut property.0.merge_type { + if *strategy == crate::swagger20::KubernetesListType::Set { + *strategy = crate::swagger20::KubernetesListType::Atomic; + return Ok(()); + } + } + } + } + } + + Err("never applied PodSchedulingContextSpec.potentialNodes merge strategy override".into()) +} + +// `ResourceClaimSchedulingStatus` has `set` merge strategy in versions before v1.29 +// but v1.29 decided it would like clients to treat it as `atomic`. +// +// Ref: https://github.com/kubernetes/kubernetes/pull/119962 +pub(crate) fn v1alpha1_resource_claim_scheduling_status_unsuitable_nodes_merge_strategy(spec: &mut crate::swagger20::Spec) -> Result<(), crate::Error> { + let definition_path = crate::swagger20::DefinitionPath("io.k8s.api.resource.v1alpha1.ResourceClaimSchedulingStatus".to_owned()); + if let Some(definition) = spec.definitions.get_mut(&definition_path) { + if let crate::swagger20::SchemaKind::Properties(properties) = &mut definition.kind { + if let Some(property) = properties.get_mut("unsuitableNodes") { + if let crate::swagger20::MergeType::List { strategy, .. } = &mut property.0.merge_type { + if *strategy == crate::swagger20::KubernetesListType::Set { + *strategy = crate::swagger20::KubernetesListType::Atomic; + return Ok(()); + } + } + } + } + } + + Err("never applied ResourceClaimSchedulingStatus.unsuitableNodes merge strategy override".into()) +} + +// `ResourceClaimSchedulingStatus` has `set` merge strategy in versions before v1.29 +// but v1.29 decided it would like clients to treat it as `atomic`. +// +// Ref: https://github.com/kubernetes/kubernetes/pull/119962 +pub(crate) fn v1alpha2_resource_claim_scheduling_status_unsuitable_nodes_merge_strategy(spec: &mut crate::swagger20::Spec) -> Result<(), crate::Error> { + let definition_path = crate::swagger20::DefinitionPath("io.k8s.api.resource.v1alpha2.ResourceClaimSchedulingStatus".to_owned()); + if let Some(definition) = spec.definitions.get_mut(&definition_path) { + if let crate::swagger20::SchemaKind::Properties(properties) = &mut definition.kind { + if let Some(property) = properties.get_mut("unsuitableNodes") { + if let crate::swagger20::MergeType::List { strategy, .. } = &mut property.0.merge_type { + if *strategy == crate::swagger20::KubernetesListType::Set { + *strategy = crate::swagger20::KubernetesListType::Atomic; + return Ok(()); + } + } + } + } + } + + Err("never applied ResourceClaimSchedulingStatus.unsuitableNodes merge strategy override".into()) +} diff --git a/k8s-openapi-codegen/src/supported_version.rs b/k8s-openapi-codegen/src/supported_version.rs index 560c79f64..94f57610b 100644 --- a/k8s-openapi-codegen/src/supported_version.rs +++ b/k8s-openapi-codegen/src/supported_version.rs @@ -71,6 +71,7 @@ impl SupportedVersion { crate::fixups::upstream_bugs::required_properties::alpha1_validating_admission_policy_binding_list, crate::fixups::upstream_bugs::required_properties::alpha1_validating_admission_policy_list, crate::fixups::upstream_bugs::status_extra_gvk, + crate::fixups::upstream_bugs::v1alpha1_resource_claim_scheduling_status_unsuitable_nodes_merge_strategy, ], SupportedVersion::V1_27 => &[ @@ -78,7 +79,9 @@ impl SupportedVersion { crate::fixups::upstream_bugs::optional_properties::eventsv1_event, crate::fixups::upstream_bugs::required_properties::alpha1_validating_admission_policy_binding_list, crate::fixups::upstream_bugs::required_properties::alpha1_validating_admission_policy_list, + crate::fixups::upstream_bugs::pod_scheduling_context_spec_potential_nodes_merge_strategy, crate::fixups::upstream_bugs::status_extra_gvk, + crate::fixups::upstream_bugs::v1alpha2_resource_claim_scheduling_status_unsuitable_nodes_merge_strategy, ], SupportedVersion::V1_28 => &[ @@ -88,7 +91,9 @@ impl SupportedVersion { crate::fixups::upstream_bugs::required_properties::alpha1_validating_admission_policy_list, crate::fixups::upstream_bugs::required_properties::beta1_validating_admission_policy_binding_list, crate::fixups::upstream_bugs::required_properties::beta1_validating_admission_policy_list, + crate::fixups::upstream_bugs::pod_scheduling_context_spec_potential_nodes_merge_strategy, crate::fixups::upstream_bugs::status_extra_gvk, + crate::fixups::upstream_bugs::v1alpha2_resource_claim_scheduling_status_unsuitable_nodes_merge_strategy, ], SupportedVersion::V1_29 => &[ diff --git a/src/v1_26/api/resource/v1alpha1/resource_claim_scheduling_status.rs b/src/v1_26/api/resource/v1alpha1/resource_claim_scheduling_status.rs index 034a60e1e..1a1fb44bb 100644 --- a/src/v1_26/api/resource/v1alpha1/resource_claim_scheduling_status.rs +++ b/src/v1_26/api/resource/v1alpha1/resource_claim_scheduling_status.rs @@ -15,7 +15,7 @@ pub struct ResourceClaimSchedulingStatus { impl crate::DeepMerge for ResourceClaimSchedulingStatus { fn merge_from(&mut self, other: Self) { crate::DeepMerge::merge_from(&mut self.name, other.name); - crate::merge_strategies::list::set(&mut self.unsuitable_nodes, other.unsuitable_nodes); + crate::merge_strategies::list::atomic(&mut self.unsuitable_nodes, other.unsuitable_nodes); } } diff --git a/src/v1_27/api/resource/v1alpha2/pod_scheduling_context_spec.rs b/src/v1_27/api/resource/v1alpha2/pod_scheduling_context_spec.rs index 88b3e0767..35e23770b 100644 --- a/src/v1_27/api/resource/v1alpha2/pod_scheduling_context_spec.rs +++ b/src/v1_27/api/resource/v1alpha2/pod_scheduling_context_spec.rs @@ -14,7 +14,7 @@ pub struct PodSchedulingContextSpec { impl crate::DeepMerge for PodSchedulingContextSpec { fn merge_from(&mut self, other: Self) { - crate::merge_strategies::list::set(&mut self.potential_nodes, other.potential_nodes); + crate::merge_strategies::list::atomic(&mut self.potential_nodes, other.potential_nodes); crate::DeepMerge::merge_from(&mut self.selected_node, other.selected_node); } } diff --git a/src/v1_27/api/resource/v1alpha2/resource_claim_scheduling_status.rs b/src/v1_27/api/resource/v1alpha2/resource_claim_scheduling_status.rs index d40e38cf1..ecef343c4 100644 --- a/src/v1_27/api/resource/v1alpha2/resource_claim_scheduling_status.rs +++ b/src/v1_27/api/resource/v1alpha2/resource_claim_scheduling_status.rs @@ -15,7 +15,7 @@ pub struct ResourceClaimSchedulingStatus { impl crate::DeepMerge for ResourceClaimSchedulingStatus { fn merge_from(&mut self, other: Self) { crate::DeepMerge::merge_from(&mut self.name, other.name); - crate::merge_strategies::list::set(&mut self.unsuitable_nodes, other.unsuitable_nodes); + crate::merge_strategies::list::atomic(&mut self.unsuitable_nodes, other.unsuitable_nodes); } } diff --git a/src/v1_28/api/resource/v1alpha2/pod_scheduling_context_spec.rs b/src/v1_28/api/resource/v1alpha2/pod_scheduling_context_spec.rs index 88b3e0767..35e23770b 100644 --- a/src/v1_28/api/resource/v1alpha2/pod_scheduling_context_spec.rs +++ b/src/v1_28/api/resource/v1alpha2/pod_scheduling_context_spec.rs @@ -14,7 +14,7 @@ pub struct PodSchedulingContextSpec { impl crate::DeepMerge for PodSchedulingContextSpec { fn merge_from(&mut self, other: Self) { - crate::merge_strategies::list::set(&mut self.potential_nodes, other.potential_nodes); + crate::merge_strategies::list::atomic(&mut self.potential_nodes, other.potential_nodes); crate::DeepMerge::merge_from(&mut self.selected_node, other.selected_node); } } diff --git a/src/v1_28/api/resource/v1alpha2/resource_claim_scheduling_status.rs b/src/v1_28/api/resource/v1alpha2/resource_claim_scheduling_status.rs index d40e38cf1..ecef343c4 100644 --- a/src/v1_28/api/resource/v1alpha2/resource_claim_scheduling_status.rs +++ b/src/v1_28/api/resource/v1alpha2/resource_claim_scheduling_status.rs @@ -15,7 +15,7 @@ pub struct ResourceClaimSchedulingStatus { impl crate::DeepMerge for ResourceClaimSchedulingStatus { fn merge_from(&mut self, other: Self) { crate::DeepMerge::merge_from(&mut self.name, other.name); - crate::merge_strategies::list::set(&mut self.unsuitable_nodes, other.unsuitable_nodes); + crate::merge_strategies::list::atomic(&mut self.unsuitable_nodes, other.unsuitable_nodes); } }