github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/pkg/controller/rsm/transformer_deletion.go (about) 1 /* 2 Copyright (C) 2022-2023 ApeCloud Co., Ltd 3 4 This file is part of KubeBlocks project 5 6 This program is free software: you can redistribute it and/or modify 7 it under the terms of the GNU Affero General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU Affero General Public License for more details. 15 16 You should have received a copy of the GNU Affero General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 package rsm 21 22 import ( 23 corev1 "k8s.io/api/core/v1" 24 25 "github.com/1aal/kubeblocks/pkg/controller/graph" 26 "github.com/1aal/kubeblocks/pkg/controller/model" 27 ) 28 29 // ObjectDeletionTransformer handles object and its secondary resources' deletion 30 type ObjectDeletionTransformer struct{} 31 32 var _ graph.Transformer = &ObjectDeletionTransformer{} 33 34 func (t *ObjectDeletionTransformer) Transform(ctx graph.TransformContext, dag *graph.DAG) error { 35 transCtx, _ := ctx.(*rsmTransformContext) 36 obj := transCtx.rsm 37 if !model.IsObjectDeleting(obj) { 38 return nil 39 } 40 41 graphCli, _ := transCtx.Client.(model.GraphClient) 42 // list all objects owned by this primary obj in cache, and delete them all 43 // there is chance that objects leak occurs because of cache stale 44 // ignore the problem currently 45 // TODO: GC the leaked objects 46 ml := getLabels(obj) 47 snapshot, err := model.ReadCacheSnapshot(transCtx, obj, ml, deletionKinds()...) 48 if err != nil { 49 return err 50 } 51 for _, object := range snapshot { 52 // don't delete cm that not created by rsm 53 if cm, ok := object.(*corev1.ConfigMap); ok && cm.Name != getEnvConfigMapName(obj.Name) { 54 continue 55 } 56 graphCli.Delete(dag, object) 57 } 58 graphCli.Delete(dag, obj) 59 60 // fast return, that is stopping the plan.Build() stage and jump to plan.Execute() directly 61 return graph.ErrPrematureStop 62 }