...

Source file src/edge-infra.dev/pkg/sds/etcd/operator/internal/reconcilers/lifecycle/destroy.go

Documentation: edge-infra.dev/pkg/sds/etcd/operator/internal/reconcilers/lifecycle

     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  // destroy removes all traces of an EtcdMember. This includes
    14  // removing the member from the etcd cluster and then deleting the EtcdMember
    15  // object. Deleting the EtcdMember object will also delete the associated
    16  // secret for the EtcdMember due to the cascading delete behaviour.
    17  func (r *Reconciler) destroy(ctx context.Context, handlers *Handlers) error {
    18  	// delete the EtcdMember object from the API server incase the EtcdMember
    19  	// came in unhealthy but the deletion process had not been started yet
    20  	if err := handlers.member.DeleteRemote(ctx); err != nil {
    21  		return fmt.Errorf("failed to delete EtcdMember: %w", err)
    22  	}
    23  
    24  	// remove the member from the etcd cluster
    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  	// remove the finalizer so that the deletion completes
    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  // removeEtcdMember removes the current EtcdMember from the etcd cluster
    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  	// find the etcd member that matches the EtcdMember we are deleting
    47  	// and remove it from the etcd cluster
    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