dynamic: record deprecation for dynamic plugins

Signed-off-by: Samuel Karp <samuelkarp@google.com>
This commit is contained in:
Samuel Karp 2023-10-17 23:36:43 -07:00
parent 260e71abc4
commit 079383dbec
No known key found for this signature in database
GPG Key ID: 997C5A3CD3167CB5
5 changed files with 22 additions and 24 deletions

View File

@ -23,7 +23,7 @@ import "fmt"
// Load is currently only implemented on non-static, non-gccgo builds for amd64 // Load is currently only implemented on non-static, non-gccgo builds for amd64
// and arm64, and plugins must be built with the exact same version of Go as // and arm64, and plugins must be built with the exact same version of Go as
// containerd itself. // containerd itself.
func Load(path string) (err error) { func Load(path string) (loaded int, err error) {
defer func() { defer func() {
if v := recover(); v != nil { if v := recover(); v != nil {
rerr, ok := v.(error) rerr, ok := v.(error)

View File

@ -25,12 +25,13 @@ import (
"runtime" "runtime"
) )
// loadPlugins loads all plugins for the OS and Arch // loadPlugins loads all plugins for the OS and Arch that containerd is built
// that containerd is built for inside the provided path // for inside the provided path and returns the count of successfully-loaded
func loadPlugins(path string) error { // plugins
func loadPlugins(path string) (int, error) {
abs, err := filepath.Abs(path) abs, err := filepath.Abs(path)
if err != nil { if err != nil {
return err return 0, err
} }
pattern := filepath.Join(abs, fmt.Sprintf( pattern := filepath.Join(abs, fmt.Sprintf(
"*-%s-%s.%s", "*-%s-%s.%s",
@ -40,14 +41,16 @@ func loadPlugins(path string) error {
)) ))
libs, err := filepath.Glob(pattern) libs, err := filepath.Glob(pattern)
if err != nil { if err != nil {
return err return 0, err
} }
loaded := 0
for _, lib := range libs { for _, lib := range libs {
if _, err := plugin.Open(lib); err != nil { if _, err := plugin.Open(lib); err != nil {
return err return loaded, err
} }
loaded++
} }
return nil return loaded, nil
} }
// getLibExt returns a platform specific lib extension for // getLibExt returns a platform specific lib extension for

View File

@ -23,6 +23,6 @@ package dynamic
// - with gccgo: gccgo has no plugin support golang/go#36403 // - with gccgo: gccgo has no plugin support golang/go#36403
// - on static builds; https://github.com/containerd/containerd/commit/0d682e24a1ba8e93e5e54a73d64f7d256f87492f // - on static builds; https://github.com/containerd/containerd/commit/0d682e24a1ba8e93e5e54a73d64f7d256f87492f
// - on architectures other than amd64 and arm64 (other architectures need to be tested) // - on architectures other than amd64 and arm64 (other architectures need to be tested)
func loadPlugins(path string) error { func loadPlugins(path string) (int, error) {
return nil return 0, nil
} }

View File

@ -55,6 +55,7 @@ import (
"github.com/containerd/containerd/defaults" "github.com/containerd/containerd/defaults"
"github.com/containerd/containerd/diff" "github.com/containerd/containerd/diff"
diffproxy "github.com/containerd/containerd/diff/proxy" diffproxy "github.com/containerd/containerd/diff/proxy"
"github.com/containerd/containerd/pkg/deprecation"
"github.com/containerd/containerd/pkg/dialer" "github.com/containerd/containerd/pkg/dialer"
"github.com/containerd/containerd/pkg/timeout" "github.com/containerd/containerd/pkg/timeout"
"github.com/containerd/containerd/platforms" "github.com/containerd/containerd/platforms"
@ -356,7 +357,9 @@ func recordConfigDeprecations(ctx context.Context, config *srvconfig.Config, set
return return
} }
_ = warn // TODO(samuelkarp): placeholder for future use if config.PluginDir != "" { //nolint:staticcheck
warn.Emit(ctx, deprecation.GoPluginLibrary)
}
} }
// Server is the containerd main daemon // Server is the containerd main daemon
@ -459,13 +462,15 @@ func (s *Server) Wait() {
// of all plugins. // of all plugins.
func LoadPlugins(ctx context.Context, config *srvconfig.Config) ([]plugin.Registration, error) { func LoadPlugins(ctx context.Context, config *srvconfig.Config) ([]plugin.Registration, error) {
// load all plugins into containerd // load all plugins into containerd
path := config.PluginDir // nolint: staticcheck path := config.PluginDir //nolint:staticcheck
if path == "" { if path == "" {
path = filepath.Join(config.Root, "plugins") path = filepath.Join(config.Root, "plugins")
} }
log.G(ctx).Warning("`go_plugin` is deprecated, please use `external plugins` instead") if count, err := dynamic.Load(path); err != nil {
if err := dynamic.Load(path); err != nil {
return nil, err return nil, err
} else if count > 0 || config.PluginDir != "" { //nolint:staticcheck
config.PluginDir = path //nolint:staticcheck
log.G(ctx).Warningf("loaded %d dynamic plugins. `go_plugin` is deprecated, please use `external plugins` instead", count)
} }
// load additional plugins that don't automatically register themselves // load additional plugins that don't automatically register themselves
registry.Register(&plugin.Registration{ registry.Register(&plugin.Registration{

View File

@ -52,16 +52,6 @@ type Warning struct {
var _ Service = (*service)(nil) var _ Service = (*service)(nil)
func init() {
registry.Register(&plugin.Registration{
Type: plugins.InternalPlugin,
ID: "warning",
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
return &service{warnings: make(map[deprecation.Warning]time.Time)}, nil
},
})
}
type service struct { type service struct {
warnings map[deprecation.Warning]time.Time warnings map[deprecation.Warning]time.Time
m sync.RWMutex m sync.RWMutex