-
Notifications
You must be signed in to change notification settings - Fork 4.9k
/
Copy pathmanagement.go
190 lines (157 loc) · 6.05 KB
/
management.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package management
import (
"sync"
"github.com/gofrs/uuid"
"github.com/elastic/beats/v7/libbeat/common/reload"
"github.com/elastic/beats/v7/libbeat/feature"
"github.com/elastic/elastic-agent-client/v7/pkg/client"
"github.com/elastic/elastic-agent-libs/config"
"github.com/elastic/elastic-agent-libs/logp"
)
// Status describes the current status of the beat.
type Status int
//go:generate stringer -type=Status
const (
// Unknown is initial status when none has been reported.
Unknown Status = iota
// Starting is status describing application is starting.
Starting
// Configuring is status describing application is configuring.
Configuring
// Running is status describing application is running.
Running
// Degraded is status describing application is degraded.
Degraded
// Failed is status describing application is failed. This status should
// only be used in the case the beat should stop running as the failure
// cannot be recovered.
Failed
// Stopping is status describing application is stopping.
Stopping
)
// Namespace is the feature namespace for queue definition.
var Namespace = "libbeat.management"
// DebugK used as key for all things central management
var DebugK = "centralmgmt"
var centralMgmtKey = "x-pack-cm"
// StatusReporter provides a method to update current status of the beat.
type StatusReporter interface {
// UpdateStatus called when the status of the beat has changed.
UpdateStatus(status Status, msg string)
}
// Manager interacts with the beat to provide status updates and to receive
// configurations.
type Manager interface {
StatusReporter
// Enabled returns true if manager is enabled.
Enabled() bool
// Start needs to invoked when the system is ready to receive an external configuration and
// also ready to start ingesting new events. The manager expects that all the reloadable and
// reloadable list are fixed for the whole lifetime of the manager.
//
// Notes: Adding dynamically new reloadable hooks at runtime can lead to inconsistency in the
// execution.
Start() error
// Stop when this method is called, the manager will stop receiving new actions, no more action
// will be propagated to the handlers and will not try to configure any reloadable parts.
// When the manager is stop the callback will be called to signal that the system can terminate.
//
// Calls to 'CheckRawConfig()' or 'SetPayload()' will be ignored after calling stop.
//
// Note: Stop will not call 'UnregisterAction()' automaticallty.
Stop()
// SetStopCallback accepts a function that need to be called when the manager want to shutdown the
// beats. This is needed when you want your beats to be gracefully shutdown remotely by the Elastic Agent
// when a policy doesn't need to run this beat.
SetStopCallback(f func())
// CheckRawConfig check settings are correct before launching the beat.
CheckRawConfig(cfg *config.C) error
// RegisterAction registers action handler with the client
RegisterAction(action client.Action)
// UnregisterAction unregisters action handler with the client
UnregisterAction(action client.Action)
// SetPayload Allows to add additional metadata to future requests made by the manager.
SetPayload(map[string]interface{})
}
// PluginFunc for creating FactoryFunc if it matches a config
type PluginFunc func(*config.C) FactoryFunc
// FactoryFunc for creating a config manager
type FactoryFunc func(*config.C, *reload.Registry, uuid.UUID) (Manager, error)
// Register a config manager
func Register(name string, fn PluginFunc, stability feature.Stability) {
f := feature.New(Namespace, name, fn, feature.MakeDetails(name, "", stability))
feature.MustRegister(f)
}
// Factory retrieves config manager constructor. If no one is registered
// it will create a nil manager
func Factory(cfg *config.C) FactoryFunc {
factories, err := feature.GlobalRegistry().LookupAll(Namespace)
if err != nil {
return nilFactory
}
for _, f := range factories {
if plugin, ok := f.Factory().(PluginFunc); ok {
if factory := plugin(cfg); factory != nil {
return factory
}
}
}
return nilFactory
}
type modeConfig struct {
Mode string `config:"mode" yaml:"mode"`
}
func defaultModeConfig() *modeConfig {
return &modeConfig{
Mode: centralMgmtKey,
}
}
// nilManager, fallback when no manager is present
type nilManager struct {
logger *logp.Logger
lock sync.Mutex
status Status
msg string
stopFunc func()
}
func nilFactory(*config.C, *reload.Registry, uuid.UUID) (Manager, error) {
log := logp.NewLogger("mgmt")
return &nilManager{
logger: log,
status: Unknown,
msg: "",
}, nil
}
func (*nilManager) SetStopCallback(func()) {}
func (*nilManager) Enabled() bool { return false }
func (*nilManager) Start() error { return nil }
func (*nilManager) Stop() {}
func (*nilManager) CheckRawConfig(cfg *config.C) error { return nil }
func (n *nilManager) UpdateStatus(status Status, msg string) {
n.lock.Lock()
defer n.lock.Unlock()
if n.status != status || n.msg != msg {
n.status = status
n.msg = msg
n.logger.Infof("Status change to %s: %s", status, msg)
}
}
func (n *nilManager) RegisterAction(action client.Action) {}
func (n *nilManager) UnregisterAction(action client.Action) {}
func (n *nilManager) SetPayload(map[string]interface{}) {}