github.com/kubeshop/testkube@v1.17.23/pkg/triggers/lease.go (about)

     1  package triggers
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  )
     7  
     8  func (s *Service) runLeaseChecker(ctx context.Context, leaseChan chan<- bool) {
     9  	ticker := time.NewTicker(s.leaseCheckInterval)
    10  	s.logger.Debugf("trigger service: starting lease checker")
    11  
    12  	s.logger.Info("trigger service: waiting for lease")
    13  
    14  	// check for lease immediately on startup instead of waiting for first ticker iteration
    15  	s.leaseCheckerIteration(ctx, leaseChan)
    16  
    17  	for {
    18  		select {
    19  		case <-ctx.Done():
    20  			s.logger.Infof("trigger service: stopping lease checker component")
    21  			return
    22  		case <-ticker.C:
    23  			s.leaseCheckerIteration(ctx, leaseChan)
    24  		}
    25  	}
    26  }
    27  
    28  func (s *Service) leaseCheckerIteration(ctx context.Context, leaseChan chan<- bool) {
    29  	leased, err := s.leaseBackend.TryAcquire(ctx, s.identifier, s.clusterID)
    30  	if err != nil {
    31  		s.logger.Errorf("error checking and setting lease: %v", err)
    32  	}
    33  	leaseChan <- leased
    34  }
    35  
    36  type Lease struct {
    37  	Identifier string    `bson:"identifier"`
    38  	ClusterID  string    `bson:"cluster_id"`
    39  	AcquiredAt time.Time `bson:"acquired_at"`
    40  	RenewedAt  time.Time `bson:"renewed_at"`
    41  }
    42  
    43  func NewLease(identifier, clusterID string) *Lease {
    44  	return &Lease{
    45  		Identifier: identifier,
    46  		ClusterID:  clusterID,
    47  		AcquiredAt: time.Now(),
    48  		RenewedAt:  time.Now(),
    49  	}
    50  }