Skip to content

Commit 2cfe66b

Browse files
⚠️ Promote v1beta2 conditions (#12066)
* Promote v1beta2 conditions, deprecate failureReason and Message, promote new replica counters * Fix conversions * Run generators * Fix controllers * Address feedback * Handle contract version for control plane replica counters * More feedback * Fix unit test * More feedback * Always reset auto converted conditions * Move KCP to the v1beta2 contract
1 parent 59130fa commit 2cfe66b

File tree

155 files changed

+9977
-6027
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

155 files changed

+9977
-6027
lines changed

.golangci.yml

+2-5
Original file line numberDiff line numberDiff line change
@@ -273,13 +273,10 @@ issues:
273273
- linters:
274274
- staticcheck
275275
text: "SA1019: (mhc|m)(.Spec.MaxUnhealthy|.Spec.UnhealthyRange) is deprecated"
276-
# Deprecations for FailureMessage, FailureReason, UnavailableReplicas and FullyLabeledReplicas
276+
# v1Beta1 deprecated fields
277277
- linters:
278278
- staticcheck
279-
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."
280-
- linters:
281-
- staticcheck
282-
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."
279+
text: "SA1019: .*\\.Deprecated\\.V1Beta1.* is deprecated"
283280
# Specific exclude rules for deprecated packages that are still part of the codebase. These
284281
# should be removed as the referenced deprecated packages are removed from the project.
285282
- linters:

api/addons/v1beta1/conversion.go

+69
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,12 @@ limitations under the License.
1717
package v1beta1
1818

1919
import (
20+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
21+
apimachineryconversion "k8s.io/apimachinery/pkg/conversion"
2022
"sigs.k8s.io/controller-runtime/pkg/conversion"
2123

2224
addonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta2"
25+
clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1"
2326
)
2427

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

4649
return Convert_v1beta2_ClusterResourceSetBinding_To_v1beta1_ClusterResourceSetBinding(src, dst, nil)
4750
}
51+
52+
func Convert_v1beta2_ClusterResourceSetStatus_To_v1beta1_ClusterResourceSetStatus(in *addonsv1.ClusterResourceSetStatus, out *ClusterResourceSetStatus, s apimachineryconversion.Scope) error {
53+
if err := autoConvert_v1beta2_ClusterResourceSetStatus_To_v1beta1_ClusterResourceSetStatus(in, out, s); err != nil {
54+
return err
55+
}
56+
57+
// Reset conditions from autogenerated conversions
58+
// NOTE: v1beta2 conditions should not be automatically be converted into legacy conditions (v1beta1).
59+
out.Conditions = nil
60+
61+
// Retrieve legacy conditions (v1beta1) from the deprecated field.
62+
if in.Deprecated != nil && in.Deprecated.V1Beta1 != nil {
63+
if in.Deprecated.V1Beta1.Conditions != nil {
64+
clusterv1beta1.Convert_v1beta2_Deprecated_V1Beta1_Conditions_To_v1beta1_Conditions(&in.Deprecated.V1Beta1.Conditions, &out.Conditions)
65+
}
66+
}
67+
68+
// Move new conditions (v1beta2) to the v1beta2 field.
69+
if in.Conditions == nil {
70+
return nil
71+
}
72+
out.V1Beta2 = &ClusterResourceSetV1Beta2Status{}
73+
out.V1Beta2.Conditions = in.Conditions
74+
return nil
75+
}
76+
77+
func Convert_v1beta1_ClusterResourceSetStatus_To_v1beta2_ClusterResourceSetStatus(in *ClusterResourceSetStatus, out *addonsv1.ClusterResourceSetStatus, s apimachineryconversion.Scope) error {
78+
if err := autoConvert_v1beta1_ClusterResourceSetStatus_To_v1beta2_ClusterResourceSetStatus(in, out, s); err != nil {
79+
return err
80+
}
81+
82+
// Reset conditions from autogenerated conversions
83+
// NOTE: v1beta1 conditions should not be automatically be converted into v1beta2 conditions.
84+
out.Conditions = nil
85+
86+
// Retrieve new conditions (v1beta2) from the v1beta2 field.
87+
if in.V1Beta2 != nil {
88+
out.Conditions = in.V1Beta2.Conditions
89+
}
90+
91+
// Move legacy conditions (v1beta1) to the deprecated field.
92+
if in.Conditions == nil {
93+
return nil
94+
}
95+
96+
if out.Deprecated == nil {
97+
out.Deprecated = &addonsv1.ClusterResourceSetDeprecatedStatus{}
98+
}
99+
if out.Deprecated.V1Beta1 == nil {
100+
out.Deprecated.V1Beta1 = &addonsv1.ClusterResourceSetV1Beta1DeprecatedStatus{}
101+
}
102+
if in.Conditions != nil {
103+
clusterv1beta1.Convert_v1beta1_Conditions_To_v1beta2_Deprecated_V1Beta1_Conditions(&in.Conditions, &out.Deprecated.V1Beta1.Conditions)
104+
}
105+
return nil
106+
}
107+
108+
// 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)
109+
110+
func Convert_v1_Condition_To_v1beta1_Condition(in *metav1.Condition, out *clusterv1beta1.Condition, s apimachineryconversion.Scope) error {
111+
return clusterv1beta1.Convert_v1_Condition_To_v1beta1_Condition(in, out, s)
112+
}
113+
114+
func Convert_v1beta1_Condition_To_v1_Condition(in *clusterv1beta1.Condition, out *metav1.Condition, s apimachineryconversion.Scope) error {
115+
return clusterv1beta1.Convert_v1beta1_Condition_To_v1_Condition(in, out, s)
116+
}

api/addons/v1beta1/conversion_test.go

+35-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,13 @@ limitations under the License.
1919
package v1beta1
2020

2121
import (
22+
"reflect"
2223
"testing"
2324

25+
fuzz "github.com/google/gofuzz"
26+
"k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
27+
runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer"
28+
2429
addonsv1 "sigs.k8s.io/cluster-api/api/addons/v1beta2"
2530
utilconversion "sigs.k8s.io/cluster-api/util/conversion"
2631
)
@@ -29,11 +34,39 @@ import (
2934

3035
func TestFuzzyConversion(t *testing.T) {
3136
t.Run("for ClusterResourceSet", utilconversion.FuzzTestFunc(utilconversion.FuzzTestFuncInput{
32-
Hub: &addonsv1.ClusterResourceSet{},
33-
Spoke: &ClusterResourceSet{},
37+
Hub: &addonsv1.ClusterResourceSet{},
38+
Spoke: &ClusterResourceSet{},
39+
FuzzerFuncs: []fuzzer.FuzzerFuncs{ClusterResourceSetFuzzFuncs},
3440
}))
3541
t.Run("for ClusterResourceSetBinding", utilconversion.FuzzTestFunc(utilconversion.FuzzTestFuncInput{
3642
Hub: &addonsv1.ClusterResourceSetBinding{},
3743
Spoke: &ClusterResourceSetBinding{},
3844
}))
3945
}
46+
47+
func ClusterResourceSetFuzzFuncs(_ runtimeserializer.CodecFactory) []interface{} {
48+
return []interface{}{
49+
hubClusterResourceSetStatus,
50+
spokeClusterResourceSetStatus,
51+
}
52+
}
53+
54+
func hubClusterResourceSetStatus(in *addonsv1.ClusterResourceSetStatus, c fuzz.Continue) {
55+
c.FuzzNoCustom(in)
56+
// Drop empty structs with only omit empty fields.
57+
if in.Deprecated != nil {
58+
if in.Deprecated.V1Beta1 == nil || reflect.DeepEqual(in.Deprecated.V1Beta1, &addonsv1.ClusterResourceSetV1Beta1DeprecatedStatus{}) {
59+
in.Deprecated = nil
60+
}
61+
}
62+
}
63+
64+
func spokeClusterResourceSetStatus(in *ClusterResourceSetStatus, c fuzz.Continue) {
65+
c.FuzzNoCustom(in)
66+
// Drop empty structs with only omit empty fields.
67+
if in.V1Beta2 != nil {
68+
if reflect.DeepEqual(in.V1Beta2, &ClusterResourceSetV1Beta2Status{}) {
69+
in.V1Beta2 = nil
70+
}
71+
}
72+
}

api/addons/v1beta1/zz_generated.conversion.go

+66-57
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)