github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/controllers/apps/transform_restore.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 apps 21 22 import ( 23 corev1 "k8s.io/api/core/v1" 24 "sigs.k8s.io/controller-runtime/pkg/client" 25 26 "github.com/1aal/kubeblocks/controllers/apps/components" 27 "github.com/1aal/kubeblocks/pkg/constant" 28 "github.com/1aal/kubeblocks/pkg/controller/graph" 29 "github.com/1aal/kubeblocks/pkg/controller/plan" 30 ictrlutil "github.com/1aal/kubeblocks/pkg/controllerutil" 31 ) 32 33 type RestoreTransformer struct { 34 client.Client 35 } 36 37 var _ graph.Transformer = &RestoreTransformer{} 38 39 func (t *RestoreTransformer) Transform(ctx graph.TransformContext, dag *graph.DAG) error { 40 transCtx, _ := ctx.(*clusterTransformContext) 41 cluster := transCtx.Cluster 42 clusterDef := transCtx.ClusterDef 43 clusterVer := transCtx.ClusterVer 44 reqCtx := ictrlutil.RequestCtx{ 45 Ctx: transCtx.Context, 46 Log: transCtx.Logger, 47 Recorder: transCtx.EventRecorder, 48 } 49 commitError := func(err error) error { 50 if ictrlutil.IsTargetError(err, ictrlutil.ErrorTypeNeedWaiting) { 51 transCtx.EventRecorder.Event(transCtx.Cluster, corev1.EventTypeNormal, string(ictrlutil.ErrorTypeNeedWaiting), err.Error()) 52 return graph.ErrPrematureStop 53 } 54 return err 55 } 56 for _, spec := range cluster.Spec.ComponentSpecs { 57 if cluster.Annotations[constant.RestoreFromBackupAnnotationKey] == "" { 58 continue 59 } 60 61 comp, err := components.NewComponent(reqCtx, t.Client, clusterDef, clusterVer, cluster, spec.Name, nil) 62 if err != nil { 63 return err 64 } 65 syncComp := comp.GetSynthesizedComponent() 66 restoreMGR := plan.NewRestoreManager(reqCtx.Ctx, t.Client, cluster, rscheme, nil, syncComp.Replicas, 0) 67 if err = restoreMGR.DoRestore(syncComp); err != nil { 68 return commitError(err) 69 } 70 } 71 return nil 72 }