diff --git a/cmd/containerd/command/config_linux.go b/cmd/containerd/command/config_linux.go index 48b535239..111410ad6 100644 --- a/cmd/containerd/command/config_linux.go +++ b/cmd/containerd/command/config_linux.go @@ -30,5 +30,7 @@ func defaultConfig() *srvconfig.Config { MaxRecvMsgSize: defaults.DefaultMaxRecvMsgSize, MaxSendMsgSize: defaults.DefaultMaxSendMsgSize, }, + DisabledPlugins: []string{}, + RequiredPlugins: []string{}, } } diff --git a/cmd/containerd/command/config_unsupported.go b/cmd/containerd/command/config_unsupported.go index 3b14250d4..c19ab1ee7 100644 --- a/cmd/containerd/command/config_unsupported.go +++ b/cmd/containerd/command/config_unsupported.go @@ -34,5 +34,7 @@ func defaultConfig() *srvconfig.Config { Level: "info", Address: defaults.DefaultDebugAddress, }, + DisabledPlugins: []string{}, + RequiredPlugins: []string{}, } } diff --git a/cmd/containerd/command/config_windows.go b/cmd/containerd/command/config_windows.go index 48b535239..111410ad6 100644 --- a/cmd/containerd/command/config_windows.go +++ b/cmd/containerd/command/config_windows.go @@ -30,5 +30,7 @@ func defaultConfig() *srvconfig.Config { MaxRecvMsgSize: defaults.DefaultMaxRecvMsgSize, MaxSendMsgSize: defaults.DefaultMaxSendMsgSize, }, + DisabledPlugins: []string{}, + RequiredPlugins: []string{}, } } diff --git a/services/server/config/config.go b/services/server/config/config.go index 25edf19a1..3b1a4fd25 100644 --- a/services/server/config/config.go +++ b/services/server/config/config.go @@ -39,6 +39,9 @@ type Config struct { // DisabledPlugins are IDs of plugins to disable. Disabled plugins won't be // initialized and started. 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 map[string]toml.Primitive `toml:"plugins"` // OOMScore adjust the containerd's oom score diff --git a/services/server/server.go b/services/server/server.go index 38ffb0756..4d6e3a058 100644 --- a/services/server/server.go +++ b/services/server/server.go @@ -107,7 +107,11 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) { config: config, } initialized = plugin.NewPluginSet() + required = make(map[string]struct{}) ) + for _, r := range config.RequiredPlugins { + required[r] = struct{}{} + } for _, p := range plugins { id := p.URI() log.G(ctx).WithField("type", p.Type).Infof("loading plugin %q...", id) @@ -142,8 +146,12 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) { } else { 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 } + delete(required, p.ID) // check for grpc services that should be registered with the server if src, ok := instance.(plugin.Service); ok { grpcServices = append(grpcServices, src) @@ -153,6 +161,14 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) { } 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 for _, service := range grpcServices { if err := service.Register(grpcServer); err != nil {