diff --git a/pkg/cri/server/service.go b/pkg/cri/server/service.go index cfec64cd6..7b2e58df8 100644 --- a/pkg/cri/server/service.go +++ b/pkg/cri/server/service.go @@ -125,6 +125,8 @@ type criService struct { containerEventsChan chan runtime.ContainerEventResponse // nri is used to hook NRI into CRI request processing. nri *nri.API + // sbcontrollers are the configured sandbox controllers + sbControllers map[string]sandbox.Controller } // NewCRIService returns a new instance of CRIService @@ -136,6 +138,11 @@ func NewCRIService(config criconfig.Config, client *containerd.Client, nri *nri. return nil, fmt.Errorf("failed to find snapshotter %q", config.ContainerdConfig.Snapshotter) } + // TODO(dmcgowan): Get the full list directly from configured plugins + sbControllers := map[string]sandbox.Controller{ + string(criconfig.ModePodSandbox): client.SandboxController(string(criconfig.ModePodSandbox)), + string(criconfig.ModeShim): client.SandboxController(string(criconfig.ModeShim)), + } imageFSPaths := map[string]string{} for _, ociRuntime := range config.ContainerdConfig.Runtimes { // Can not use `c.RuntimeSnapshotter() yet, so hard-coding here.` @@ -144,6 +151,9 @@ func NewCRIService(config criconfig.Config, client *containerd.Client, nri *nri. imageFSPaths[snapshotter] = imageFSPath(config.ContainerdRootDir, snapshotter) log.L.Infof("Get image filesystem path %q for snapshotter %q", imageFSPaths[snapshotter], snapshotter) } + if _, ok := sbControllers[ociRuntime.Sandboxer]; !ok { + sbControllers[ociRuntime.Sandboxer] = client.SandboxController(ociRuntime.Sandboxer) + } } snapshotter := config.ContainerdConfig.Snapshotter imageFSPaths[snapshotter] = imageFSPath(config.ContainerdRootDir, snapshotter) @@ -166,6 +176,7 @@ func NewCRIService(config criconfig.Config, client *containerd.Client, nri *nri. sandboxNameIndex: registrar.NewRegistrar(), containerNameIndex: registrar.NewRegistrar(), netPlugin: make(map[string]cni.CNI), + sbControllers: sbControllers, } // TODO: figure out a proper channel size. @@ -206,8 +217,8 @@ func NewCRIService(config criconfig.Config, client *containerd.Client, nri *nri. return nil, err } - podSandboxController := c.client.SandboxController(string(criconfig.ModePodSandbox)).(*podsandbox.Controller) - podSandboxController.Init(config, client, c.sandboxStore, c.os, c, c.imageService, c.baseOCISpecs) + // Initialize pod sandbox controller + sbControllers[string(criconfig.ModePodSandbox)].(*podsandbox.Controller).Init(config, client, c.sandboxStore, c.os, c, c.imageService, c.baseOCISpecs) c.nri = nri @@ -360,7 +371,12 @@ func (c *criService) getSandboxController(config *runtime.PodSandboxConfig, runt return nil, fmt.Errorf("failed to get sandbox runtime: %w", err) } - return c.client.SandboxController(ociRuntime.Sandboxer), nil + controller, ok := c.sbControllers[ociRuntime.Sandboxer] + if !ok { + return nil, fmt.Errorf("no sandbox controller %s for runtime %s", ociRuntime.Sandboxer, runtimeHandler) + } + + return controller, nil } // imageFSPath returns containerd image filesystem path. diff --git a/pkg/cri/server/test_config.go b/pkg/cri/server/test_config.go index a0c637a14..d4450b10e 100644 --- a/pkg/cri/server/test_config.go +++ b/pkg/cri/server/test_config.go @@ -40,6 +40,7 @@ var testConfig = criconfig.Config{ "runc": { Type: "runc", Snapshotter: "overlayfs", + Sandboxer: "shim", }, }, },