Skip to content

Commit 89e4aae

Browse files
committed
Preserve crd conversion config and update crds if present
Signed-off-by: Tamal Saha <[email protected]>
1 parent d0e01cd commit 89e4aae

File tree

2 files changed

+70
-6
lines changed

2 files changed

+70
-6
lines changed

apiextensions/kubernetes.go

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,34 @@ func RegisterCRDs(client crd_cs.Interface, crds []*CustomResourceDefinition) err
4949
context.TODO(),
5050
client,
5151
crd.V1.Name,
52-
func(in *crdv1.CustomResourceDefinition) *crdv1.CustomResourceDefinition {
53-
in.Labels = meta_util.OverwriteKeys(in.Labels, crd.V1.Labels)
54-
in.Annotations = meta_util.OverwriteKeys(in.Annotations, crd.V1.Annotations)
52+
transform(crd),
53+
metav1.UpdateOptions{},
54+
)
55+
if err != nil && !kerr.IsAlreadyExists(err) {
56+
return err
57+
}
58+
}
59+
return WaitForCRDReady(client, crds)
60+
}
61+
62+
func UpdateCRDs(client crd_cs.Interface, crds []*CustomResourceDefinition) error {
63+
for _, crd := range crds {
64+
// Use crd v1 for k8s >= 1.16, if available
65+
// ref: https://github.com/kubernetes/kubernetes/issues/91395
66+
if crd.V1 == nil {
67+
gvr := schema.GroupVersionResource{
68+
Group: crd.V1beta1.Spec.Group,
69+
Version: crd.V1beta1.Spec.Versions[0].Name,
70+
Resource: crd.V1beta1.Spec.Names.Plural,
71+
}
72+
return fmt.Errorf("missing V1 definition for %s", gvr)
73+
}
5574

56-
in.Spec = crd.V1.Spec
57-
return in
58-
},
75+
_, _, err := v1.UpdateCustomResourceDefinitionIfPresent(
76+
context.TODO(),
77+
client,
78+
crd.V1.Name,
79+
transform(crd),
5980
metav1.UpdateOptions{},
6081
)
6182
if err != nil && !kerr.IsAlreadyExists(err) {
@@ -65,6 +86,21 @@ func RegisterCRDs(client crd_cs.Interface, crds []*CustomResourceDefinition) err
6586
return WaitForCRDReady(client, crds)
6687
}
6788

89+
func transform(crd *CustomResourceDefinition) func(in *crdv1.CustomResourceDefinition) *crdv1.CustomResourceDefinition {
90+
return func(in *crdv1.CustomResourceDefinition) *crdv1.CustomResourceDefinition {
91+
in.Labels = meta_util.OverwriteKeys(in.Labels, crd.V1.Labels)
92+
in.Annotations = meta_util.OverwriteKeys(in.Annotations, crd.V1.Annotations)
93+
94+
conversion := in.Spec.Conversion
95+
in.Spec = crd.V1.Spec
96+
// preserve conversion
97+
if in.Spec.Conversion == nil && conversion != nil {
98+
in.Spec.Conversion = conversion
99+
}
100+
return in
101+
}
102+
}
103+
68104
func WaitForCRDReady(client crd_cs.Interface, crds []*CustomResourceDefinition) error {
69105
err := wait.PollUntilContextTimeout(context.Background(), 3*time.Second, 5*time.Minute, false, func(ctx context.Context) (bool, error) {
70106
for _, crd := range crds {

apiextensions/v1/crd.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,34 @@ func CreateOrUpdateCustomResourceDefinition(
6767
return cur, kutil.VerbUpdated, nil
6868
}
6969

70+
func UpdateCustomResourceDefinitionIfPresent(
71+
ctx context.Context,
72+
c cs.Interface,
73+
name string,
74+
transform func(in *api.CustomResourceDefinition) *api.CustomResourceDefinition,
75+
opts metav1.UpdateOptions,
76+
) (*api.CustomResourceDefinition, kutil.VerbType, error) {
77+
_, err := c.ApiextensionsV1().CustomResourceDefinitions().Get(ctx, name, metav1.GetOptions{})
78+
if kerr.IsNotFound(err) {
79+
return transform(&api.CustomResourceDefinition{
80+
TypeMeta: metav1.TypeMeta{
81+
APIVersion: api.SchemeGroupVersion.String(),
82+
Kind: "CustomResourceDefinition",
83+
},
84+
ObjectMeta: metav1.ObjectMeta{
85+
Name: name,
86+
},
87+
}), kutil.VerbUnchanged, nil
88+
} else if err != nil {
89+
return nil, kutil.VerbUnchanged, err
90+
}
91+
cur, err := TryUpdateCustomResourceDefinition(ctx, c, name, transform, opts)
92+
if err != nil {
93+
return nil, kutil.VerbUnchanged, err
94+
}
95+
return cur, kutil.VerbUpdated, nil
96+
}
97+
7098
func TryUpdateCustomResourceDefinition(
7199
ctx context.Context,
72100
c cs.Interface,

0 commit comments

Comments
 (0)