From 7359ff5caa46e4795db7c58ec9a34baeda881219 Mon Sep 17 00:00:00 2001 From: libmonsoon-dev <39344422+libmonsoon-dev@users.noreply.github.com> Date: Tue, 19 Nov 2024 15:00:45 +0300 Subject: [PATCH] Improved CRDs Installer (#528) Signed-off-by: Daniil Stepanenko Co-authored-by: Daniil Stepanenko --- pkg/addon-operator/ensure_crds.go | 44 +++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/pkg/addon-operator/ensure_crds.go b/pkg/addon-operator/ensure_crds.go index d5019ad5..a442117d 100644 --- a/pkg/addon-operator/ensure_crds.go +++ b/pkg/addon-operator/ensure_crds.go @@ -105,6 +105,50 @@ func (cp *CRDsInstaller) Run(ctx context.Context) *multierror.Error { return result } +func (cp *CRDsInstaller) DeleteCRDs(ctx context.Context, crdsToDelete []string) ([]string, error) { + var deletedCRDs []string + // delete crds listed in crdsToDelete if there are no related custom resources in the cluster + for _, crdName := range crdsToDelete { + deleteCRD := true + crd, err := cp.getCRDFromCluster(ctx, crdName) + if err != nil { + if !apierrors.IsNotFound(err) { + return nil, fmt.Errorf("error occurred during %s CRD clean up: %w", crdName, err) + } + continue + } + + for _, version := range crd.Spec.Versions { + if !version.Storage { + continue + } + + gvr := schema.GroupVersionResource{ + Group: crd.Spec.Group, + Version: version.Name, + Resource: crd.Spec.Names.Plural, + } + list, err := cp.k8sClient.Resource(gvr).List(ctx, apimachineryv1.ListOptions{}) + if err != nil { + return nil, fmt.Errorf("error occurred listing %s CRD objects of version %s: %w", crdName, version.Name, err) + } + if len(list.Items) > 0 { + deleteCRD = false + break + } + } + + if deleteCRD { + err := cp.k8sClient.Resource(crdGVR).Delete(ctx, crdName, apimachineryv1.DeleteOptions{}) + if err != nil { + return nil, fmt.Errorf("error occurred deleting %s CRD: %w", crdName, err) + } + deletedCRDs = append(deletedCRDs, crdName) + } + } + return deletedCRDs, nil +} + func (cp *CRDsInstaller) processCRD(ctx context.Context, crdFilePath string) error { crdFileReader, err := os.Open(crdFilePath) if err != nil {