github.com/oam-dev/kubevela@v1.9.11/pkg/resourcekeeper/delete.go (about)

     1  /*
     2  Copyright 2021 The KubeVela Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8  	http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package resourcekeeper
    18  
    19  import (
    20  	"context"
    21  
    22  	"github.com/pkg/errors"
    23  	kerrors "k8s.io/apimachinery/pkg/api/errors"
    24  	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
    25  
    26  	"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
    27  	"github.com/oam-dev/kubevela/pkg/auth"
    28  	"github.com/oam-dev/kubevela/pkg/multicluster"
    29  	"github.com/oam-dev/kubevela/pkg/oam"
    30  	"github.com/oam-dev/kubevela/pkg/resourcetracker"
    31  )
    32  
    33  // DeleteOption option for delete
    34  type DeleteOption interface {
    35  	ApplyToDeleteConfig(*deleteConfig)
    36  }
    37  
    38  type deleteConfig struct {
    39  	rtConfig
    40  }
    41  
    42  func newDeleteConfig(options ...DeleteOption) *deleteConfig {
    43  	cfg := &deleteConfig{}
    44  	for _, option := range options {
    45  		option.ApplyToDeleteConfig(cfg)
    46  	}
    47  	return cfg
    48  }
    49  
    50  // Delete delete resources
    51  func (h *resourceKeeper) Delete(ctx context.Context, manifests []*unstructured.Unstructured, options ...DeleteOption) (err error) {
    52  	h.ClearNamespaceForClusterScopedResources(manifests)
    53  	if err = h.AdmissionCheck(ctx, manifests); err != nil {
    54  		return err
    55  	}
    56  	for _, manifest := range manifests {
    57  		if manifest != nil {
    58  			_options := options
    59  			if h.garbageCollectPolicy != nil {
    60  				if strategy := h.garbageCollectPolicy.FindStrategy(manifest); strategy != nil {
    61  					_options = append(_options, GarbageCollectStrategyOption(*strategy))
    62  				}
    63  			}
    64  			cfg := newDeleteConfig(_options...)
    65  			if err = h.delete(ctx, manifest, cfg); err != nil {
    66  				return err
    67  			}
    68  		}
    69  	}
    70  	return nil
    71  }
    72  
    73  func (h *resourceKeeper) delete(ctx context.Context, manifest *unstructured.Unstructured, cfg *deleteConfig) (err error) {
    74  	// 1. mark manifests as deleted in resourcetracker
    75  	var rt *v1beta1.ResourceTracker
    76  	if cfg.useRoot || cfg.skipGC {
    77  		rt, err = h.getRootRT(ctx)
    78  	} else {
    79  		rt, err = h.getCurrentRT(ctx)
    80  	}
    81  	if err != nil {
    82  		return errors.Wrapf(err, "failed to get resourcetracker")
    83  	}
    84  	if err = resourcetracker.DeletedManifestInResourceTracker(multicluster.ContextInLocalCluster(ctx), h.Client, rt, manifest, false); err != nil {
    85  		return errors.Wrapf(err, "failed to delete resources in resourcetracker")
    86  	}
    87  	// 2. delete manifests
    88  	deleteCtx := multicluster.ContextWithClusterName(ctx, oam.GetCluster(manifest))
    89  	deleteCtx = auth.ContextWithUserInfo(deleteCtx, h.app)
    90  	if err = h.Client.Delete(deleteCtx, manifest); err != nil && !kerrors.IsNotFound(err) {
    91  		return errors.Wrapf(err, "cannot delete manifest, name: %s apiVersion: %s kind: %s", manifest.GetName(), manifest.GetAPIVersion(), manifest.GetKind())
    92  	}
    93  	return nil
    94  }