...
1 package lifecycle
2
3 import (
4 "context"
5 "fmt"
6
7 "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
8
9 v1etcd "edge-infra.dev/pkg/sds/etcd/operator/apis/etcdmember/v1"
10 "edge-infra.dev/pkg/sds/lib/etcd/client"
11 )
12
13
14
15
16
17 func (r *Reconciler) destroy(ctx context.Context, handlers *Handlers) error {
18
19
20 if err := handlers.member.DeleteRemote(ctx); err != nil {
21 return fmt.Errorf("failed to delete EtcdMember: %w", err)
22 }
23
24
25 if err := r.removeFromCluster(ctx, handlers); err != nil {
26 return fmt.Errorf("failed to remove member from etcd cluster: %w", err)
27 }
28
29
30 err := handlers.member.WithReconcileRemote(ctx, func(e *v1etcd.EtcdMember) {
31 controllerutil.RemoveFinalizer(e, v1etcd.Finalizer)
32 })
33 if err != nil {
34 return fmt.Errorf("failed to remove EtcdMember finalizer: %w", err)
35 }
36 r.Metrics.Custom.RecordEtcdMemberDelete(handlers.member.EtcdMember)
37 return nil
38 }
39
40
41 func (r *Reconciler) removeFromCluster(ctx context.Context, handlers *Handlers) error {
42 resp, err := r.EtcdRetryClient.SafeMemberList(ctx)
43 if err != nil {
44 return err
45 }
46
47
48 for _, m := range resp.Members {
49 if m.Name == handlers.member.Name || m.PeerURLs[0] == handlers.member.PeerURL() {
50 if _, err := r.EtcdRetryClient.SafeMemberRemove(ctx, m.ID); client.IgnoreMemberNotFound(err) != nil {
51 return err
52 }
53 }
54 }
55 return nil
56 }
57
View as plain text