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

     1  package triggers
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  	"time"
     7  
     8  	testtriggersv1 "github.com/kubeshop/testkube-operator/api/testtriggers/v1"
     9  )
    10  
    11  type statusKey string
    12  
    13  func newStatusKey(namespace, name string) statusKey {
    14  	return statusKey(fmt.Sprintf("%s/%s", namespace, name))
    15  }
    16  
    17  type triggerStatus struct {
    18  	testTrigger           *testtriggersv1.TestTrigger
    19  	lastExecutionStarted  *time.Time
    20  	lastExecutionFinished *time.Time
    21  	testExecutionIDs      []string
    22  	testSuiteExecutionIDs []string
    23  	sync.RWMutex
    24  }
    25  
    26  func newTriggerStatus(testTrigger *testtriggersv1.TestTrigger) *triggerStatus {
    27  	return &triggerStatus{testTrigger: testTrigger}
    28  }
    29  
    30  func (s *triggerStatus) hasActiveTests() bool {
    31  	defer s.RUnlock()
    32  
    33  	s.RLock()
    34  	return len(s.testExecutionIDs) > 0 || len(s.testSuiteExecutionIDs) > 0
    35  }
    36  
    37  func (s *triggerStatus) getExecutionIDs() []string {
    38  	defer s.RUnlock()
    39  
    40  	s.RLock()
    41  	executionIDs := make([]string, len(s.testExecutionIDs))
    42  	copy(executionIDs, s.testExecutionIDs)
    43  
    44  	return executionIDs
    45  }
    46  
    47  func (s *triggerStatus) getTestSuiteExecutionIDs() []string {
    48  	defer s.RUnlock()
    49  
    50  	s.RLock()
    51  	testSuiteExecutionIDs := make([]string, len(s.testSuiteExecutionIDs))
    52  	copy(testSuiteExecutionIDs, s.testSuiteExecutionIDs)
    53  
    54  	return testSuiteExecutionIDs
    55  }
    56  
    57  func (s *triggerStatus) start() {
    58  	defer s.Unlock()
    59  
    60  	s.Lock()
    61  	now := time.Now()
    62  	s.lastExecutionStarted = &now
    63  	s.lastExecutionFinished = nil
    64  }
    65  
    66  func (s *triggerStatus) addExecutionID(id string) {
    67  	defer s.Unlock()
    68  
    69  	s.Lock()
    70  	s.testExecutionIDs = append(s.testExecutionIDs, id)
    71  }
    72  
    73  func (s *triggerStatus) removeExecutionID(targetID string) {
    74  	defer s.Unlock()
    75  
    76  	s.Lock()
    77  	for i, id := range s.testExecutionIDs {
    78  		if id == targetID {
    79  			s.testExecutionIDs = append(s.testExecutionIDs[:i], s.testExecutionIDs[i+1:]...)
    80  		}
    81  	}
    82  }
    83  
    84  func (s *triggerStatus) addTestSuiteExecutionID(id string) {
    85  	defer s.Unlock()
    86  
    87  	s.Lock()
    88  	s.testSuiteExecutionIDs = append(s.testSuiteExecutionIDs, id)
    89  }
    90  
    91  func (s *triggerStatus) removeTestSuiteExecutionID(targetID string) {
    92  	defer s.Unlock()
    93  
    94  	s.Lock()
    95  	for i, id := range s.testSuiteExecutionIDs {
    96  		if id == targetID {
    97  			s.testSuiteExecutionIDs = append(s.testSuiteExecutionIDs[:i], s.testSuiteExecutionIDs[i+1:]...)
    98  		}
    99  	}
   100  }
   101  
   102  func (s *triggerStatus) done() {
   103  	defer s.Unlock()
   104  
   105  	s.Lock()
   106  	now := time.Now()
   107  	s.lastExecutionFinished = &now
   108  }
   109  
   110  func (s *Service) getStatusForTrigger(t *testtriggersv1.TestTrigger) *triggerStatus {
   111  	key := newStatusKey(t.Namespace, t.Name)
   112  	return s.triggerStatus[key]
   113  }