Add monitor plugin loading
Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
parent
1005d1dba9
commit
ddbeb9f936
4 changed files with 88 additions and 6 deletions
|
@ -104,7 +104,11 @@ func main() {
|
||||||
if err := serveDebugAPI(); err != nil {
|
if err := serveDebugAPI(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
runtimes, err := loadRuntimes()
|
monitor, err := loadMonitor()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
runtimes, err := loadRuntimes(monitor)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -237,7 +241,7 @@ func resolveContentStore() (*content.Store, error) {
|
||||||
return content.NewStore(cp)
|
return content.NewStore(cp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadRuntimes() (map[string]containerd.Runtime, error) {
|
func loadRuntimes(monitor plugin.ContainerMonitor) (map[string]containerd.Runtime, error) {
|
||||||
o := make(map[string]containerd.Runtime)
|
o := make(map[string]containerd.Runtime)
|
||||||
for name, rr := range plugin.Registrations() {
|
for name, rr := range plugin.Registrations() {
|
||||||
if rr.Type != plugin.RuntimePlugin {
|
if rr.Type != plugin.RuntimePlugin {
|
||||||
|
@ -248,6 +252,7 @@ func loadRuntimes() (map[string]containerd.Runtime, error) {
|
||||||
Root: conf.Root,
|
Root: conf.Root,
|
||||||
State: conf.State,
|
State: conf.State,
|
||||||
Context: log.WithModule(global, fmt.Sprintf("runtime-%s", name)),
|
Context: log.WithModule(global, fmt.Sprintf("runtime-%s", name)),
|
||||||
|
Monitor: monitor,
|
||||||
}
|
}
|
||||||
if rr.Config != nil {
|
if rr.Config != nil {
|
||||||
if err := conf.decodePlugin(name, rr.Config); err != nil {
|
if err := conf.decodePlugin(name, rr.Config); err != nil {
|
||||||
|
@ -264,6 +269,30 @@ func loadRuntimes() (map[string]containerd.Runtime, error) {
|
||||||
return o, nil
|
return o, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func loadMonitor() (plugin.ContainerMonitor, error) {
|
||||||
|
var monitors []plugin.ContainerMonitor
|
||||||
|
for name, m := range plugin.Registrations() {
|
||||||
|
if m.Type != plugin.ContainerMonitorPlugin {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
log.G(global).Infof("loading monitor plugin %q...", name)
|
||||||
|
ic := &plugin.InitContext{
|
||||||
|
Root: conf.Root,
|
||||||
|
State: conf.State,
|
||||||
|
Context: log.WithModule(global, fmt.Sprintf("monitor-%s", name)),
|
||||||
|
}
|
||||||
|
mm, err := m.Init(ic)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
monitors = append(monitors, mm.(plugin.ContainerMonitor))
|
||||||
|
}
|
||||||
|
if len(monitors) == 0 {
|
||||||
|
return plugin.NewNoopMonitor(), nil
|
||||||
|
}
|
||||||
|
return plugin.NewMultiContainerMonitor(monitors...), nil
|
||||||
|
}
|
||||||
|
|
||||||
func loadSnapshotter(store *content.Store) (snapshot.Snapshotter, error) {
|
func loadSnapshotter(store *content.Store) (snapshot.Snapshotter, error) {
|
||||||
for name, sr := range plugin.Registrations() {
|
for name, sr := range plugin.Registrations() {
|
||||||
if sr.Type != plugin.SnapshotPlugin {
|
if sr.Type != plugin.SnapshotPlugin {
|
||||||
|
|
|
@ -32,7 +32,3 @@ type State interface {
|
||||||
// Pid is the main process id for the container
|
// Pid is the main process id for the container
|
||||||
Pid() uint32
|
Pid() uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
type ContainerMonitor interface {
|
|
||||||
Monitor(context.Context, Container) error
|
|
||||||
}
|
|
||||||
|
|
54
plugin/monitor.go
Normal file
54
plugin/monitor.go
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
package plugin
|
||||||
|
|
||||||
|
import "github.com/docker/containerd"
|
||||||
|
|
||||||
|
// ContainerMonitor provides an interface for monitoring of containers within containerd
|
||||||
|
type ContainerMonitor interface {
|
||||||
|
// Monitor adds the provided container to the monitor
|
||||||
|
Monitor(containerd.Container) error
|
||||||
|
// Stop stops and removes the provided container from the monitor
|
||||||
|
Stop(containerd.Container) error
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMultiContainerMonitor(monitors ...ContainerMonitor) ContainerMonitor {
|
||||||
|
return &multiContainerMonitor{
|
||||||
|
monitors: monitors,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewNoopMonitor() ContainerMonitor {
|
||||||
|
return &noopContainerMonitor{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type noopContainerMonitor struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (mm *noopContainerMonitor) Monitor(c containerd.Container) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (mm *noopContainerMonitor) Stop(c containerd.Container) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type multiContainerMonitor struct {
|
||||||
|
monitors []ContainerMonitor
|
||||||
|
}
|
||||||
|
|
||||||
|
func (mm *multiContainerMonitor) Monitor(c containerd.Container) error {
|
||||||
|
for _, m := range mm.monitors {
|
||||||
|
if err := m.Monitor(c); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (mm *multiContainerMonitor) Stop(c containerd.Container) error {
|
||||||
|
for _, m := range mm.monitors {
|
||||||
|
if err := m.Stop(c); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -18,6 +18,7 @@ const (
|
||||||
RuntimePlugin PluginType = iota + 1
|
RuntimePlugin PluginType = iota + 1
|
||||||
GRPCPlugin
|
GRPCPlugin
|
||||||
SnapshotPlugin
|
SnapshotPlugin
|
||||||
|
ContainerMonitorPlugin
|
||||||
)
|
)
|
||||||
|
|
||||||
type Registration struct {
|
type Registration struct {
|
||||||
|
@ -26,6 +27,7 @@ type Registration struct {
|
||||||
Init func(*InitContext) (interface{}, error)
|
Init func(*InitContext) (interface{}, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(@crosbymichael): how to we keep this struct from growing but support dependency injection for loaded plugins?
|
||||||
type InitContext struct {
|
type InitContext struct {
|
||||||
Root string
|
Root string
|
||||||
State string
|
State string
|
||||||
|
@ -34,6 +36,7 @@ type InitContext struct {
|
||||||
Snapshotter snapshot.Snapshotter
|
Snapshotter snapshot.Snapshotter
|
||||||
Config interface{}
|
Config interface{}
|
||||||
Context context.Context
|
Context context.Context
|
||||||
|
Monitor ContainerMonitor
|
||||||
}
|
}
|
||||||
|
|
||||||
type Service interface {
|
type Service interface {
|
||||||
|
|
Loading…
Add table
Reference in a new issue