@@ -6,6 +6,9 @@ package cmd
6
6
7
7
import (
8
8
"context"
9
+ "os"
10
+ "os/signal"
11
+ "syscall"
9
12
"time"
10
13
11
14
"github.com/elastic/elastic-agent-libs/logp"
@@ -29,3 +32,50 @@ func (a upgradeInstallationModifier) Cleanup(log *logger.Logger, topDirPath, cur
29
32
func (a upgradeInstallationModifier ) Rollback (ctx context.Context , log * logger.Logger , c client.Client , topDirPath , prevVersionedHome , prevHash string ) error {
30
33
return upgrade .Rollback (ctx , log , c , topDirPath , prevVersionedHome , prevHash )
31
34
}
35
+
36
+ func watch (ctx context.Context , tilGrace time.Duration , errorCheckInterval time.Duration , log * logger.Logger ) error {
37
+ errChan := make (chan error )
38
+
39
+ ctx , cancel := context .WithCancel (ctx )
40
+
41
+ //cleanup
42
+ defer func () {
43
+ cancel ()
44
+ close (errChan )
45
+ }()
46
+
47
+ agtWatcher := upgrade .NewAgentWatcher (errChan , log , errorCheckInterval )
48
+ go agtWatcher .Run (ctx )
49
+
50
+ signals := make (chan os.Signal , 1 )
51
+ signal .Notify (signals , syscall .SIGINT , syscall .SIGTERM )
52
+
53
+ graceTimer := time .NewTimer (tilGrace )
54
+ defer graceTimer .Stop ()
55
+
56
+ return watchLoop (ctx , log , signals , errChan , graceTimer .C )
57
+ }
58
+
59
+ func watchLoop (ctx context.Context , log * logger.Logger , signals <- chan os.Signal , errChan <- chan error , graceTimer <- chan time.Time ) error {
60
+ for {
61
+ select {
62
+ case s := <- signals :
63
+ log .Infof ("received signal: (%d): %v during watch" , s , s )
64
+ if s == syscall .SIGINT || s == syscall .SIGTERM {
65
+ log .Infof ("received signal: (%d): %v. Exiting watch" , s , s )
66
+ return ErrWatchCancelled
67
+ }
68
+ continue
69
+ case <- ctx .Done ():
70
+ return nil
71
+ // grace period passed, agent is considered stable
72
+ case <- graceTimer :
73
+ log .Info ("Grace period passed, not watching" )
74
+ return nil
75
+ // Agent in degraded state.
76
+ case err := <- errChan :
77
+ log .Errorf ("Agent Error detected: %s" , err .Error ())
78
+ return err
79
+ }
80
+ }
81
+ }
0 commit comments