Add support for required plugins.

Signed-off-by: Lantao Liu <lantaol@google.com>
This commit is contained in:
Lantao Liu 2019-04-08 18:03:39 -07:00
parent 2741dbe2c1
commit 4b3b99ea11
5 changed files with 25 additions and 0 deletions

View File

@ -30,5 +30,7 @@ func defaultConfig() *srvconfig.Config {
MaxRecvMsgSize: defaults.DefaultMaxRecvMsgSize, MaxRecvMsgSize: defaults.DefaultMaxRecvMsgSize,
MaxSendMsgSize: defaults.DefaultMaxSendMsgSize, MaxSendMsgSize: defaults.DefaultMaxSendMsgSize,
}, },
DisabledPlugins: []string{},
RequiredPlugins: []string{},
} }
} }

View File

@ -34,5 +34,7 @@ func defaultConfig() *srvconfig.Config {
Level: "info", Level: "info",
Address: defaults.DefaultDebugAddress, Address: defaults.DefaultDebugAddress,
}, },
DisabledPlugins: []string{},
RequiredPlugins: []string{},
} }
} }

View File

@ -30,5 +30,7 @@ func defaultConfig() *srvconfig.Config {
MaxRecvMsgSize: defaults.DefaultMaxRecvMsgSize, MaxRecvMsgSize: defaults.DefaultMaxRecvMsgSize,
MaxSendMsgSize: defaults.DefaultMaxSendMsgSize, MaxSendMsgSize: defaults.DefaultMaxSendMsgSize,
}, },
DisabledPlugins: []string{},
RequiredPlugins: []string{},
} }
} }

View File

@ -39,6 +39,9 @@ type Config struct {
// DisabledPlugins are IDs of plugins to disable. Disabled plugins won't be // DisabledPlugins are IDs of plugins to disable. Disabled plugins won't be
// initialized and started. // initialized and started.
DisabledPlugins []string `toml:"disabled_plugins"` DisabledPlugins []string `toml:"disabled_plugins"`
// RequiredPlugins are IDs of required plugins. Containerd exits if any
// required plugin doesn't exist or fails to be initialized or started.
RequiredPlugins []string `toml:"required_plugins"`
// Plugins provides plugin specific configuration for the initialization of a plugin // Plugins provides plugin specific configuration for the initialization of a plugin
Plugins map[string]toml.Primitive `toml:"plugins"` Plugins map[string]toml.Primitive `toml:"plugins"`
// OOMScore adjust the containerd's oom score // OOMScore adjust the containerd's oom score

View File

@ -100,7 +100,11 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) {
config: config, config: config,
} }
initialized = plugin.NewPluginSet() initialized = plugin.NewPluginSet()
required = make(map[string]struct{})
) )
for _, r := range config.RequiredPlugins {
required[r] = struct{}{}
}
for _, p := range plugins { for _, p := range plugins {
id := p.URI() id := p.URI()
log.G(ctx).WithField("type", p.Type).Infof("loading plugin %q...", id) log.G(ctx).WithField("type", p.Type).Infof("loading plugin %q...", id)
@ -135,14 +139,26 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) {
} else { } else {
log.G(ctx).WithError(err).Warnf("failed to load plugin %s", id) log.G(ctx).WithError(err).Warnf("failed to load plugin %s", id)
} }
if _, ok := required[p.ID]; ok {
return nil, errors.Wrapf(err, "load required plugin %s", id)
}
continue continue
} }
delete(required, p.ID)
// check for grpc services that should be registered with the server // check for grpc services that should be registered with the server
if service, ok := instance.(plugin.Service); ok { if service, ok := instance.(plugin.Service); ok {
services = append(services, service) services = append(services, service)
} }
s.plugins = append(s.plugins, result) s.plugins = append(s.plugins, result)
} }
if len(required) != 0 {
var missing []string
for id := range required {
missing = append(missing, id)
}
return nil, errors.Errorf("required plugin %s not included", missing)
}
// register services after all plugins have been initialized // register services after all plugins have been initialized
for _, service := range services { for _, service := range services {
if err := service.Register(rpc); err != nil { if err := service.Register(rpc); err != nil {