Skip to content

⚠️ Promote v1beta2 conditions #12066

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
7 changes: 2 additions & 5 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -273,13 +273,10 @@ issues:
- linters:
- staticcheck
text: "SA1019: (mhc|m)(.Spec.MaxUnhealthy|.Spec.UnhealthyRange) is deprecated"
# Deprecations for FailureMessage, FailureReason, UnavailableReplicas and FullyLabeledReplicas
# v1Beta1 deprecated fields
- linters:
- staticcheck
text: "SA1019: .*\\.Status\\.(FailureMessage|FailureReason|UnavailableReplicas|FullyLabeledReplicas) is deprecated: This field is deprecated and is going to be removed in the next apiVersion. Please see https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240916-improve-status-in-CAPI-resources.md for more details."
- linters:
- staticcheck
text: "SA1019: newStatus.FullyLabeledReplicas is deprecated: This field is deprecated and is going to be removed in the next apiVersion. Please see https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240916-improve-status-in-CAPI-resources.md for more details."
text: "SA1019: .*\\.Deprecated\\.V1Beta1.* is deprecated"
# Specific exclude rules for deprecated packages that are still part of the codebase. These
# should be removed as the referenced deprecated packages are removed from the project.
- linters:
Expand Down
69 changes: 69 additions & 0 deletions api/addons/v1beta1/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,12 @@ limitations under the License.
package v1beta1

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
apimachineryconversion "k8s.io/apimachinery/pkg/conversion"
"sigs.k8s.io/controller-runtime/pkg/conversion"

addonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta2"
clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1"
)

func (src *ClusterResourceSet) ConvertTo(dstRaw conversion.Hub) error {
Expand All @@ -45,3 +48,69 @@ func (dst *ClusterResourceSetBinding) ConvertFrom(srcRaw conversion.Hub) error {

return Convert_v1beta2_ClusterResourceSetBinding_To_v1beta1_ClusterResourceSetBinding(src, dst, nil)
}

func Convert_v1beta2_ClusterResourceSetStatus_To_v1beta1_ClusterResourceSetStatus(in *addonsv1.ClusterResourceSetStatus, out *ClusterResourceSetStatus, s apimachineryconversion.Scope) error {
if err := autoConvert_v1beta2_ClusterResourceSetStatus_To_v1beta1_ClusterResourceSetStatus(in, out, s); err != nil {
return err
}

// Reset conditions from autogenerated conversions
// NOTE: v1beta2 conditions should not be automatically be converted into legacy conditions (v1beta1).
out.Conditions = nil

// Retrieve legacy conditions (v1beta1) from the deprecated field.
if in.Deprecated != nil && in.Deprecated.V1Beta1 != nil {
if in.Deprecated.V1Beta1.Conditions != nil {
clusterv1beta1.Convert_v1beta2_Deprecated_V1Beta1_Conditions_To_v1beta1_Conditions(&in.Deprecated.V1Beta1.Conditions, &out.Conditions)
}
}

// Move new conditions (v1beta2) to the v1beta2 field.
if in.Conditions == nil {
return nil
}
out.V1Beta2 = &ClusterResourceSetV1Beta2Status{}
out.V1Beta2.Conditions = in.Conditions
return nil
}

func Convert_v1beta1_ClusterResourceSetStatus_To_v1beta2_ClusterResourceSetStatus(in *ClusterResourceSetStatus, out *addonsv1.ClusterResourceSetStatus, s apimachineryconversion.Scope) error {
if err := autoConvert_v1beta1_ClusterResourceSetStatus_To_v1beta2_ClusterResourceSetStatus(in, out, s); err != nil {
return err
}

// Reset conditions from autogenerated conversions
// NOTE: v1beta1 conditions should not be automatically be converted into v1beta2 conditions.
out.Conditions = nil

// Retrieve new conditions (v1beta2) from the v1beta2 field.
if in.V1Beta2 != nil {
out.Conditions = in.V1Beta2.Conditions
}

// Move legacy conditions (v1beta1) to the deprecated field.
if in.Conditions == nil {
return nil
}

if out.Deprecated == nil {
out.Deprecated = &addonsv1.ClusterResourceSetDeprecatedStatus{}
}
if out.Deprecated.V1Beta1 == nil {
out.Deprecated.V1Beta1 = &addonsv1.ClusterResourceSetV1Beta1DeprecatedStatus{}
}
if in.Conditions != nil {
clusterv1beta1.Convert_v1beta1_Conditions_To_v1beta2_Deprecated_V1Beta1_Conditions(&in.Conditions, &out.Deprecated.V1Beta1.Conditions)
}
return nil
}

// Implement local conversion func because conversion-gen is not aware of conversion func in other packages (see https://github.com/kubernetes/code-generator/issues/94)

func Convert_v1_Condition_To_v1beta1_Condition(in *metav1.Condition, out *clusterv1beta1.Condition, s apimachineryconversion.Scope) error {
return clusterv1beta1.Convert_v1_Condition_To_v1beta1_Condition(in, out, s)
}

func Convert_v1beta1_Condition_To_v1_Condition(in *clusterv1beta1.Condition, out *metav1.Condition, s apimachineryconversion.Scope) error {
return clusterv1beta1.Convert_v1beta1_Condition_To_v1_Condition(in, out, s)
}
37 changes: 35 additions & 2 deletions api/addons/v1beta1/conversion_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,13 @@ limitations under the License.
package v1beta1

import (
"reflect"
"testing"

fuzz "github.com/google/gofuzz"
"k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer"

addonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta2"
utilconversion "sigs.k8s.io/cluster-api/util/conversion"
)
Expand All @@ -29,11 +34,39 @@ import (

func TestFuzzyConversion(t *testing.T) {
t.Run("for ClusterResourceSet", utilconversion.FuzzTestFunc(utilconversion.FuzzTestFuncInput{
Hub: &addonsv1.ClusterResourceSet{},
Spoke: &ClusterResourceSet{},
Hub: &addonsv1.ClusterResourceSet{},
Spoke: &ClusterResourceSet{},
FuzzerFuncs: []fuzzer.FuzzerFuncs{ClusterResourceSetFuzzFuncs},
}))
t.Run("for ClusterResourceSetBinding", utilconversion.FuzzTestFunc(utilconversion.FuzzTestFuncInput{
Hub: &addonsv1.ClusterResourceSetBinding{},
Spoke: &ClusterResourceSetBinding{},
}))
}

func ClusterResourceSetFuzzFuncs(_ runtimeserializer.CodecFactory) []interface{} {
return []interface{}{
hubClusterResourceSetStatus,
spokeClusterResourceSetStatus,
}
}

func hubClusterResourceSetStatus(in *addonsv1.ClusterResourceSetStatus, c fuzz.Continue) {
c.FuzzNoCustom(in)
// Drop empty structs with only omit empty fields.
if in.Deprecated != nil {
if in.Deprecated.V1Beta1 == nil || reflect.DeepEqual(in.Deprecated.V1Beta1, &addonsv1.ClusterResourceSetV1Beta1DeprecatedStatus{}) {
in.Deprecated = nil
}
}
}

func spokeClusterResourceSetStatus(in *ClusterResourceSetStatus, c fuzz.Continue) {
c.FuzzNoCustom(in)
// Drop empty structs with only omit empty fields.
if in.V1Beta2 != nil {
if reflect.DeepEqual(in.V1Beta2, &ClusterResourceSetV1Beta2Status{}) {
in.V1Beta2 = nil
}
}
}
123 changes: 66 additions & 57 deletions api/addons/v1beta1/zz_generated.conversion.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading