@@ -25,10 +25,12 @@ import (
2525 "os"
2626 "path/filepath"
2727
28+ apierrors "k8s.io/apimachinery/pkg/api/errors"
2829 apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
2930 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3031 "k8s.io/apimachinery/pkg/runtime"
3132 "k8s.io/apimachinery/pkg/runtime/serializer"
33+ "k8s.io/apimachinery/pkg/types"
3234 "k8s.io/klog/v2"
3335 ctrl "sigs.k8s.io/controller-runtime"
3436 "sigs.k8s.io/controller-runtime/pkg/client"
@@ -202,14 +204,29 @@ func installCRDs(ctx context.Context, client client.Client, crdPath, mode string
202204 return fmt .Errorf ("unexpected type from %s, expected CustomResourceDefinition but got %s" , path , gvk )
203205 }
204206
205- // Create or update using the typed CRD.
206- existingCRD := & apiextensionsv1.CustomResourceDefinition {
207+ var existingCRD apiextensionsv1.CustomResourceDefinition
208+ if err := client .Get (ctx , types.NamespacedName {Name : crd .Name }, & existingCRD ); err != nil {
209+ if ! apierrors .IsNotFound (err ) {
210+ return fmt .Errorf ("failed to get existing CRD %s: %w" , crd .Name , err )
211+ }
212+ }
213+
214+ labels := existingCRD .GetLabels ()
215+ if labels != nil {
216+ if _ , exists := labels ["addonmanager.kubernetes.io/mode" ]; exists {
217+ klog .Infof ("CRD %s is still managed by the addon manager, skipping installation" , crd .Name )
218+ continue
219+ }
220+ }
221+
222+ // Reset existing CRD to create or update it.
223+ existingCRD = apiextensionsv1.CustomResourceDefinition {
207224 ObjectMeta : metav1.ObjectMeta {
208225 Name : crd .Name ,
209226 },
210227 }
211228
212- createOrUpdateRes , err := controllerutil .CreateOrUpdate (ctx , client , existingCRD , func () error {
229+ createOrUpdateRes , err := controllerutil .CreateOrUpdate (ctx , client , & existingCRD , func () error {
213230 // Copy spec from our decoded CRD to the object we're creating/updating.
214231 existingCRD .Spec = crd .Spec
215232 existingCRD .SetLabels (crd .Labels )
0 commit comments