99 "fmt"
1010 "os"
1111 "sort"
12+ "sync"
1213
1314 "github.com/gofrs/uuid"
1415 "github.com/pkg/errors"
@@ -35,12 +36,15 @@ type Manager struct {
3536 registry * reload.Registry
3637 blacklist * xmanagement.ConfigBlacklist
3738 client * client.Client
39+ lock sync.Mutex
40+ status management.Status
41+ msg string
3842
3943 stopFunc func ()
4044}
4145
4246// NewFleetManager returns a X-Pack Beats Fleet Management manager.
43- func NewFleetManager (config * common.Config , registry * reload.Registry , beatUUID uuid.UUID ) (management.ConfigManager , error ) {
47+ func NewFleetManager (config * common.Config , registry * reload.Registry , beatUUID uuid.UUID ) (management.Manager , error ) {
4448 c := defaultConfig ()
4549 if config .Enabled () {
4650 if err := config .Unpack (& c ); err != nil {
@@ -51,7 +55,7 @@ func NewFleetManager(config *common.Config, registry *reload.Registry, beatUUID
5155}
5256
5357// NewFleetManagerWithConfig returns a X-Pack Beats Fleet Management manager.
54- func NewFleetManagerWithConfig (c * Config , registry * reload.Registry , beatUUID uuid.UUID ) (management.ConfigManager , error ) {
58+ func NewFleetManagerWithConfig (c * Config , registry * reload.Registry , beatUUID uuid.UUID ) (management.Manager , error ) {
5559 log := logp .NewLogger (management .DebugK )
5660
5761 m := & Manager {
@@ -122,38 +126,51 @@ func (cm *Manager) CheckRawConfig(cfg *common.Config) error {
122126 return nil
123127}
124128
129+ // UpdateStatus updates the manager with the current status for the beat.
130+ func (cm * Manager ) UpdateStatus (status management.Status , msg string ) {
131+ cm .lock .Lock ()
132+ defer cm .lock .Unlock ()
133+
134+ if cm .status != status || cm .msg != msg {
135+ cm .status = status
136+ cm .msg = msg
137+ cm .client .Status (statusToProtoStatus (status ), msg )
138+ cm .logger .Infof ("Status change to %s: %s" , status , msg )
139+ }
140+ }
141+
125142func (cm * Manager ) OnConfig (s string ) {
126- cm .client . Status ( proto . StateObserved_CONFIGURING , "Updating configuration" )
143+ cm .UpdateStatus ( management . Configuring , "Updating configuration" )
127144
128145 var configMap common.MapStr
129146 uconfig , err := common .NewConfigFrom (s )
130147 if err != nil {
131148 err = errors .Wrap (err , "config blocks unsuccessfully generated" )
132149 cm .logger .Error (err )
133- cm .client . Status ( proto . StateObserved_FAILED , err .Error ())
150+ cm .UpdateStatus ( management . Failed , err .Error ())
134151 return
135152 }
136153
137154 err = uconfig .Unpack (& configMap )
138155 if err != nil {
139156 err = errors .Wrap (err , "config blocks unsuccessfully generated" )
140157 cm .logger .Error (err )
141- cm .client . Status ( proto . StateObserved_FAILED , err .Error ())
158+ cm .UpdateStatus ( management . Failed , err .Error ())
142159 return
143160 }
144161
145162 blocks , err := cm .toConfigBlocks (configMap )
146163 if err != nil {
147164 err = errors .Wrap (err , "could not apply the configuration" )
148165 cm .logger .Error (err )
149- cm .client . Status ( proto . StateObserved_FAILED , err .Error ())
166+ cm .UpdateStatus ( management . Failed , err .Error ())
150167 return
151168 }
152169
153170 if errs := cm .apply (blocks ); ! errs .IsEmpty () {
154171 err = errors .Wrap (err , "could not apply the configuration" )
155172 cm .logger .Error (err )
156- cm .client . Status ( proto . StateObserved_FAILED , err .Error ())
173+ cm .UpdateStatus ( management . Failed , err .Error ())
157174 return
158175 }
159176
@@ -285,3 +302,25 @@ func (cm *Manager) toConfigBlocks(cfg common.MapStr) (api.ConfigBlocks, error) {
285302
286303 return res , nil
287304}
305+
306+ func statusToProtoStatus (status management.Status ) proto.StateObserved_Status {
307+ switch status {
308+ case management .Unknown :
309+ // unknown is reported as healthy, as the status is unknown
310+ return proto .StateObserved_HEALTHY
311+ case management .Starting :
312+ return proto .StateObserved_STARTING
313+ case management .Configuring :
314+ return proto .StateObserved_CONFIGURING
315+ case management .Running :
316+ return proto .StateObserved_HEALTHY
317+ case management .Degraded :
318+ return proto .StateObserved_DEGRADED
319+ case management .Failed :
320+ return proto .StateObserved_FAILED
321+ case management .Stopping :
322+ return proto .StateObserved_STOPPING
323+ }
324+ // unknown status, still reported as healthy
325+ return proto .StateObserved_HEALTHY
326+ }
0 commit comments