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 }