Skip to content

Commit 63e0ecd

Browse files
authored
Merge pull request containerd#9152 from dmcgowan/cri-split-image-service
Split CRI image service from GRPC handler
2 parents a2f167e + 5a3d3f6 commit 63e0ecd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1054
-594
lines changed

cmd/containerd/builtins/cri.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ package builtins
2020

2121
import (
2222
_ "github.com/containerd/containerd/v2/pkg/cri"
23+
_ "github.com/containerd/containerd/v2/plugins/cri/images"
2324
)

contrib/fuzz/builtins.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
_ "github.com/containerd/containerd/v2/metadata/plugin"
2626
_ "github.com/containerd/containerd/v2/pkg/cri"
2727
_ "github.com/containerd/containerd/v2/pkg/nri/plugin"
28+
_ "github.com/containerd/containerd/v2/plugins/cri/images"
2829
_ "github.com/containerd/containerd/v2/plugins/imageverifier"
2930
_ "github.com/containerd/containerd/v2/plugins/sandbox"
3031
_ "github.com/containerd/containerd/v2/plugins/streaming"

contrib/fuzz/cri_fuzzer.go

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,13 @@ func printExecutions() {
8080
}
8181
}
8282

83-
func fuzzCRI(f *fuzz.ConsumeFuzzer, c server.CRIService) int {
83+
type fuzzCRIService interface {
84+
server.CRIService
85+
runtime.RuntimeServiceServer
86+
runtime.ImageServiceServer
87+
}
88+
89+
func fuzzCRI(f *fuzz.ConsumeFuzzer, c fuzzCRIService) int {
8490
executionOrder = make([]string, 0)
8591
defer printExecutions()
8692

@@ -157,7 +163,7 @@ func logExecution(apiName, request string) {
157163

158164
// createContainerFuzz creates a CreateContainerRequest and passes
159165
// it to c.CreateContainer
160-
func createContainerFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
166+
func createContainerFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
161167
r := &runtime.CreateContainerRequest{}
162168
err := f.GenerateStruct(r)
163169
if err != nil {
@@ -171,7 +177,7 @@ func createContainerFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
171177

172178
// removeContainerFuzz creates a RemoveContainerRequest and passes
173179
// it to c.RemoveContainer
174-
func removeContainerFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
180+
func removeContainerFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
175181
r := &runtime.RemoveContainerRequest{}
176182
err := f.GenerateStruct(r)
177183
if err != nil {
@@ -183,7 +189,7 @@ func removeContainerFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
183189
return nil
184190
}
185191

186-
func sandboxStore(cs server.CRIService) (*sandboxstore.Store, error) {
192+
func sandboxStore(cs fuzzCRIService) (*sandboxstore.Store, error) {
187193
var (
188194
ss *sandboxstore.Store
189195
err error
@@ -201,7 +207,7 @@ func sandboxStore(cs server.CRIService) (*sandboxstore.Store, error) {
201207
}
202208

203209
// addSandboxesFuzz creates a sandbox and adds it to the sandboxstore
204-
func addSandboxesFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
210+
func addSandboxesFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
205211
quantity, err := f.GetInt()
206212
if err != nil {
207213
return err
@@ -246,7 +252,7 @@ func getSandboxFuzz(f *fuzz.ConsumeFuzzer) (sandboxstore.Sandbox, error) {
246252

247253
// listContainersFuzz creates a ListContainersRequest and passes
248254
// it to c.ListContainers
249-
func listContainersFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
255+
func listContainersFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
250256
r := &runtime.ListContainersRequest{}
251257
err := f.GenerateStruct(r)
252258
if err != nil {
@@ -260,7 +266,7 @@ func listContainersFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
260266

261267
// startContainerFuzz creates a StartContainerRequest and passes
262268
// it to c.StartContainer
263-
func startContainerFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
269+
func startContainerFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
264270
r := &runtime.StartContainerRequest{}
265271
err := f.GenerateStruct(r)
266272
if err != nil {
@@ -274,7 +280,7 @@ func startContainerFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
274280

275281
// containerStatsFuzz creates a ContainerStatsRequest and passes
276282
// it to c.ContainerStats
277-
func containerStatsFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
283+
func containerStatsFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
278284
r := &runtime.ContainerStatsRequest{}
279285
err := f.GenerateStruct(r)
280286
if err != nil {
@@ -288,7 +294,7 @@ func containerStatsFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
288294

289295
// listContainerStatsFuzz creates a ListContainerStatsRequest and
290296
// passes it to c.ListContainerStats
291-
func listContainerStatsFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
297+
func listContainerStatsFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
292298
r := &runtime.ListContainerStatsRequest{}
293299
err := f.GenerateStruct(r)
294300
if err != nil {
@@ -302,7 +308,7 @@ func listContainerStatsFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
302308

303309
// containerStatusFuzz creates a ContainerStatusRequest and passes
304310
// it to c.ContainerStatus
305-
func containerStatusFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
311+
func containerStatusFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
306312
r := &runtime.ContainerStatusRequest{}
307313
err := f.GenerateStruct(r)
308314
if err != nil {
@@ -316,7 +322,7 @@ func containerStatusFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
316322

317323
// stopContainerFuzz creates a StopContainerRequest and passes
318324
// it to c.StopContainer
319-
func stopContainerFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
325+
func stopContainerFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
320326
r := &runtime.StopContainerRequest{}
321327
err := f.GenerateStruct(r)
322328
if err != nil {
@@ -330,7 +336,7 @@ func stopContainerFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
330336

331337
// updateContainerResourcesFuzz creates a UpdateContainerResourcesRequest
332338
// and passes it to c.UpdateContainerResources
333-
func updateContainerResourcesFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
339+
func updateContainerResourcesFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
334340
r := &runtime.UpdateContainerResourcesRequest{}
335341
err := f.GenerateStruct(r)
336342
if err != nil {
@@ -344,7 +350,7 @@ func updateContainerResourcesFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) er
344350

345351
// listImagesFuzz creates a ListImagesRequest and passes it to
346352
// c.ListImages
347-
func listImagesFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
353+
func listImagesFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
348354
r := &runtime.ListImagesRequest{}
349355
err := f.GenerateStruct(r)
350356
if err != nil {
@@ -358,7 +364,7 @@ func listImagesFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
358364

359365
// removeImagesFuzz creates a RemoveImageRequest and passes it to
360366
// c.RemoveImage
361-
func removeImagesFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
367+
func removeImagesFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
362368
r := &runtime.RemoveImageRequest{}
363369
err := f.GenerateStruct(r)
364370
if err != nil {
@@ -372,7 +378,7 @@ func removeImagesFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
372378

373379
// imageStatusFuzz creates an ImageStatusRequest and passes it to
374380
// c.ImageStatus
375-
func imageStatusFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
381+
func imageStatusFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
376382
r := &runtime.ImageStatusRequest{}
377383
err := f.GenerateStruct(r)
378384
if err != nil {
@@ -386,7 +392,7 @@ func imageStatusFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
386392

387393
// imageFsInfoFuzz creates an ImageFsInfoRequest and passes it to
388394
// c.ImageFsInfo
389-
func imageFsInfoFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
395+
func imageFsInfoFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
390396
r := &runtime.ImageFsInfoRequest{}
391397
err := f.GenerateStruct(r)
392398
if err != nil {
@@ -400,7 +406,7 @@ func imageFsInfoFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
400406

401407
// listPodSandboxFuzz creates a ListPodSandboxRequest and passes
402408
// it to c.ListPodSandbox
403-
func listPodSandboxFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
409+
func listPodSandboxFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
404410
r := &runtime.ListPodSandboxRequest{}
405411
err := f.GenerateStruct(r)
406412
if err != nil {
@@ -414,7 +420,7 @@ func listPodSandboxFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
414420

415421
// portForwardFuzz creates a PortForwardRequest and passes it to
416422
// c.PortForward
417-
func portForwardFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
423+
func portForwardFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
418424
r := &runtime.PortForwardRequest{}
419425
err := f.GenerateStruct(r)
420426
if err != nil {
@@ -428,7 +434,7 @@ func portForwardFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
428434

429435
// removePodSandboxFuzz creates a RemovePodSandboxRequest and
430436
// passes it to c.RemovePodSandbox
431-
func removePodSandboxFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
437+
func removePodSandboxFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
432438
r := &runtime.RemovePodSandboxRequest{}
433439
err := f.GenerateStruct(r)
434440
if err != nil {
@@ -442,7 +448,7 @@ func removePodSandboxFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
442448

443449
// runPodSandboxFuzz creates a RunPodSandboxRequest and passes
444450
// it to c.RunPodSandbox
445-
func runPodSandboxFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
451+
func runPodSandboxFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
446452
r := &runtime.RunPodSandboxRequest{}
447453
err := f.GenerateStruct(r)
448454
if err != nil {
@@ -456,7 +462,7 @@ func runPodSandboxFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
456462

457463
// podSandboxStatusFuzz creates a PodSandboxStatusRequest and
458464
// passes it to
459-
func podSandboxStatusFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
465+
func podSandboxStatusFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
460466
r := &runtime.PodSandboxStatusRequest{}
461467
err := f.GenerateStruct(r)
462468
if err != nil {
@@ -470,7 +476,7 @@ func podSandboxStatusFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
470476

471477
// stopPodSandboxFuzz creates a StopPodSandboxRequest and passes
472478
// it to c.StopPodSandbox
473-
func stopPodSandboxFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
479+
func stopPodSandboxFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
474480
r := &runtime.StopPodSandboxRequest{}
475481
err := f.GenerateStruct(r)
476482
if err != nil {
@@ -483,7 +489,7 @@ func stopPodSandboxFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
483489
}
484490

485491
// statusFuzz creates a StatusRequest and passes it to c.Status
486-
func statusFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
492+
func statusFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
487493
r := &runtime.StatusRequest{}
488494
err := f.GenerateStruct(r)
489495
if err != nil {
@@ -495,7 +501,7 @@ func statusFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
495501
return nil
496502
}
497503

498-
func updateRuntimeConfigFuzz(c server.CRIService, f *fuzz.ConsumeFuzzer) error {
504+
func updateRuntimeConfigFuzz(c fuzzCRIService, f *fuzz.ConsumeFuzzer) error {
499505
r := &runtime.UpdateRuntimeConfigRequest{}
500506
err := f.GenerateStruct(r)
501507
if err != nil {

contrib/fuzz/cri_server_fuzzer.go

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@ package fuzz
2020

2121
import (
2222
fuzz "github.com/AdaLogics/go-fuzz-headers"
23+
"google.golang.org/grpc"
24+
runtime "k8s.io/cri-api/pkg/apis/runtime/v1"
2325

2426
containerd "github.com/containerd/containerd/v2/client"
2527
"github.com/containerd/containerd/v2/oci"
2628
criconfig "github.com/containerd/containerd/v2/pkg/cri/config"
29+
"github.com/containerd/containerd/v2/pkg/cri/instrument"
2730
"github.com/containerd/containerd/v2/pkg/cri/server"
28-
"github.com/containerd/containerd/v2/pkg/cri/server/base"
2931
"github.com/containerd/containerd/v2/pkg/cri/server/images"
3032
)
3133

@@ -41,21 +43,40 @@ func FuzzCRIServer(data []byte) int {
4143
defer client.Close()
4244

4345
config := criconfig.Config{}
46+
imageConfig := criconfig.ImageConfig{}
4447

45-
criBase := &base.CRIBase{
46-
Config: config,
47-
BaseOCISpecs: map[string]*oci.Spec{},
48-
}
49-
50-
imageService, err := images.NewService(config, client)
48+
imageService, err := images.NewService(imageConfig, &images.CRIImageServiceOptions{
49+
Client: client,
50+
})
5151
if err != nil {
5252
panic(err)
5353
}
5454

55-
c, err := server.NewCRIService(criBase, imageService, client, nil)
55+
c, rs, err := server.NewCRIService(config, &server.CRIServiceOptions{
56+
ImageService: imageService,
57+
Client: client,
58+
BaseOCISpecs: map[string]*oci.Spec{},
59+
})
5660
if err != nil {
5761
panic(err)
5862
}
5963

60-
return fuzzCRI(f, c)
64+
return fuzzCRI(f, &service{
65+
CRIService: c,
66+
RuntimeServiceServer: rs,
67+
ImageServiceServer: imageService.GRPCService(),
68+
})
69+
}
70+
71+
type service struct {
72+
server.CRIService
73+
runtime.RuntimeServiceServer
74+
runtime.ImageServiceServer
75+
}
76+
77+
func (c *service) Register(s *grpc.Server) error {
78+
instrumented := instrument.NewService(c)
79+
runtime.RegisterRuntimeServiceServer(s, instrumented)
80+
runtime.RegisterImageServiceServer(s, instrumented)
81+
return nil
6182
}

integration/build_local_containerd_helper_test.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import (
3939
_ "github.com/containerd/containerd/v2/gc/scheduler"
4040
_ "github.com/containerd/containerd/v2/leases/plugin"
4141
_ "github.com/containerd/containerd/v2/metadata/plugin"
42+
_ "github.com/containerd/containerd/v2/plugins/cri/images"
4243
_ "github.com/containerd/containerd/v2/runtime/v2"
4344
_ "github.com/containerd/containerd/v2/runtime/v2/runc/options"
4445
_ "github.com/containerd/containerd/v2/services/containers"
@@ -53,7 +54,7 @@ import (
5354
_ "github.com/containerd/containerd/v2/services/tasks"
5455
_ "github.com/containerd/containerd/v2/services/version"
5556

56-
"github.com/stretchr/testify/assert"
57+
"github.com/stretchr/testify/require"
5758
)
5859

5960
var (
@@ -72,7 +73,7 @@ func buildLocalContainerdClient(t *testing.T, tmpDir string, tweakInitFn tweakPl
7273
// load plugins
7374
loadPluginOnce.Do(func() {
7475
loadedPlugins, loadedPluginsErr = ctrdsrv.LoadPlugins(ctx, &srvconfig.Config{})
75-
assert.NoError(t, loadedPluginsErr)
76+
require.NoError(t, loadedPluginsErr)
7677
})
7778

7879
// init plugins
@@ -104,7 +105,7 @@ func buildLocalContainerdClient(t *testing.T, tmpDir string, tweakInitFn tweakPl
104105
// load the plugin specific configuration if it is provided
105106
if p.Config != nil {
106107
pc, err := config.Decode(ctx, p.URI(), p.Config)
107-
assert.NoError(t, err)
108+
require.NoError(t, err)
108109

109110
initContext.Config = pc
110111
}
@@ -114,10 +115,10 @@ func buildLocalContainerdClient(t *testing.T, tmpDir string, tweakInitFn tweakPl
114115
}
115116

116117
result := p.Init(initContext)
117-
assert.NoError(t, initialized.Add(result))
118+
require.NoError(t, initialized.Add(result))
118119

119120
_, err := result.Instance()
120-
assert.NoError(t, err)
121+
require.NoError(t, err)
121122

122123
lastInitContext = initContext
123124
}
@@ -129,7 +130,7 @@ func buildLocalContainerdClient(t *testing.T, tmpDir string, tweakInitFn tweakPl
129130
containerd.WithInMemoryServices(lastInitContext),
130131
containerd.WithInMemorySandboxControllers(lastInitContext),
131132
)
132-
assert.NoError(t, err)
133+
require.NoError(t, err)
133134

134135
return client
135136
}

integration/image_load_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,10 @@ func TestImageLoad(t *testing.T) {
5555
t.Logf("load image in cri")
5656
ctr, err := exec.LookPath("ctr")
5757
require.NoError(t, err, "ctr should be installed, make sure you've run `make install-deps`")
58+
// Add --local=true option since currently the transfer service
59+
// does not provide enough progress to avoid timeout
5860
output, err = exec.Command(ctr, "-address="+containerdEndpoint,
59-
"-n=k8s.io", "images", "import", tar).CombinedOutput()
61+
"-n=k8s.io", "images", "import", "--local=true", tar).CombinedOutput()
6062
require.NoError(t, err, "output: %q", output)
6163

6264
t.Logf("make sure image is loaded")

0 commit comments

Comments
 (0)