-
Notifications
You must be signed in to change notification settings - Fork 2
/
doguDeleteManager.go
93 lines (79 loc) · 3.51 KB
/
doguDeleteManager.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package controllers
import (
"context"
"fmt"
"k8s.io/client-go/kubernetes"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"sigs.k8s.io/controller-runtime/pkg/log"
cesregistry "github.com/cloudogu/cesapp-lib/registry"
k8sv1 "github.com/cloudogu/k8s-dogu-operator/api/v1"
cesreg "github.com/cloudogu/k8s-dogu-operator/controllers/cesregistry"
"github.com/cloudogu/k8s-dogu-operator/controllers/exec"
"github.com/cloudogu/k8s-dogu-operator/controllers/limit"
"github.com/cloudogu/k8s-dogu-operator/controllers/resource"
"github.com/cloudogu/k8s-dogu-operator/controllers/serviceaccount"
"github.com/cloudogu/k8s-dogu-operator/internal/cloudogu"
"github.com/cloudogu/k8s-host-change/pkg/alias"
)
const finalizerName = "dogu-finalizer"
// doguDeleteManager is a central unit in the process of handling the installation process of a custom dogu resource.
type doguDeleteManager struct {
client client.Client
localDoguFetcher cloudogu.LocalDoguFetcher
imageRegistry cloudogu.ImageRegistry
doguRegistrator cloudogu.DoguRegistrator
serviceAccountRemover cloudogu.ServiceAccountRemover
doguSecretHandler cloudogu.DoguSecretHandler
}
// NewDoguDeleteManager creates a new instance of doguDeleteManager.
func NewDoguDeleteManager(client client.Client, cesRegistry cesregistry.Registry) (*doguDeleteManager, error) {
resourceGenerator := resource.NewResourceGenerator(client.Scheme(), limit.NewDoguDeploymentLimitPatcher(cesRegistry), alias.NewHostAliasGenerator(cesRegistry.GlobalConfig()))
restConfig := ctrl.GetConfigOrDie()
clientSet, err := kubernetes.NewForConfig(restConfig)
if err != nil {
return nil, fmt.Errorf("failed to find cluster config: %w", err)
}
executor := exec.NewCommandExecutor(client, clientSet, clientSet.CoreV1().RESTClient())
return &doguDeleteManager{
client: client,
localDoguFetcher: cesreg.NewLocalDoguFetcher(cesRegistry.DoguRegistry()),
doguRegistrator: cesreg.NewCESDoguRegistrator(client, cesRegistry, resourceGenerator),
serviceAccountRemover: serviceaccount.NewRemover(cesRegistry, executor, client),
}, nil
}
// Delete deletes the given dogu along with all those Kubernetes resources that the dogu operator initially created.
func (m *doguDeleteManager) Delete(ctx context.Context, doguResource *k8sv1.Dogu) error {
logger := log.FromContext(ctx)
doguResource.Status = k8sv1.DoguStatus{Status: k8sv1.DoguStatusDeleting}
err := doguResource.Update(ctx, m.client)
if err != nil {
return fmt.Errorf("failed to update dogu status: %w", err)
}
logger.Info("Fetching dogu...")
dogu, err := m.localDoguFetcher.FetchInstalled(doguResource.Name)
if err != nil {
logger.Error(err, "failed to fetch installed dogu ")
}
if dogu != nil {
logger.Info("Delete service accounts...")
err = m.serviceAccountRemover.RemoveAll(ctx, dogu)
if err != nil {
logger.Error(err, "failed to remove service accounts")
}
logger.Info("Unregister dogu...")
err = m.doguRegistrator.UnregisterDogu(doguResource.Name)
if err != nil {
logger.Error(err, "failed to unregister dogu")
}
}
logger.Info("Remove finalizer...")
controllerutil.RemoveFinalizer(doguResource, finalizerName)
err = m.client.Update(ctx, doguResource)
if err != nil {
return fmt.Errorf("failed to update dogu: %w", err)
}
logger.Info(fmt.Sprintf("Dogu %s/%s has been : %s", doguResource.Namespace, doguResource.Name, controllerutil.OperationResultUpdated))
return nil
}