Copy FuzzCRI from cncf/cncf-fuzzing
Signed-off-by: Kazuyoshi Kato <katokazu@amazon.com>
This commit is contained in:
		
							
								
								
									
										578
									
								
								pkg/cri/server/cri_fuzzer.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										578
									
								
								pkg/cri/server/cri_fuzzer.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,578 @@ | |||||||
|  | //go:build gofuzz | ||||||
|  | // +build gofuzz | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  |  | ||||||
|  |    Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |    you may not use this file except in compliance with the License. | ||||||
|  |    You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |        http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |    Unless required by applicable law or agreed to in writing, software | ||||||
|  |    distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |    See the License for the specific language governing permissions and | ||||||
|  |    limitations under the License. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | package server | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	golangruntime "runtime" | ||||||
|  | 	"strings" | ||||||
|  | 	"sync" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
|  | 	fuzz "github.com/AdaLogics/go-fuzz-headers" | ||||||
|  | 	"github.com/containerd/go-cni" | ||||||
|  |  | ||||||
|  | 	criconfig "github.com/containerd/containerd/pkg/cri/config" | ||||||
|  | 	servertesting "github.com/containerd/containerd/pkg/cri/server/testing" | ||||||
|  | 	containerstore "github.com/containerd/containerd/pkg/cri/store/container" | ||||||
|  | 	imagestore "github.com/containerd/containerd/pkg/cri/store/image" | ||||||
|  | 	"github.com/containerd/containerd/pkg/cri/store/label" | ||||||
|  | 	sandboxstore "github.com/containerd/containerd/pkg/cri/store/sandbox" | ||||||
|  | 	snapshotstore "github.com/containerd/containerd/pkg/cri/store/snapshot" | ||||||
|  | 	ostesting "github.com/containerd/containerd/pkg/os/testing" | ||||||
|  | 	"github.com/containerd/containerd/pkg/registrar" | ||||||
|  |  | ||||||
|  | 	"github.com/containerd/containerd" | ||||||
|  | 	_ "github.com/containerd/containerd/cmd/containerd/builtins" | ||||||
|  | 	"github.com/containerd/containerd/cmd/containerd/command" | ||||||
|  | 	runtime "k8s.io/cri-api/pkg/apis/runtime/v1" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var ( | ||||||
|  | 	// The APIs the fuzzer can call: | ||||||
|  | 	ops = map[int]string{ | ||||||
|  | 		0:  "createContainer", | ||||||
|  | 		1:  "removeContainer", | ||||||
|  | 		2:  "addSandboxes", | ||||||
|  | 		3:  "listContainers", | ||||||
|  | 		4:  "startContainer", | ||||||
|  | 		5:  "containerStats", | ||||||
|  | 		6:  "listContainerStats", | ||||||
|  | 		7:  "containerStatus", | ||||||
|  | 		8:  "stopContainer", | ||||||
|  | 		9:  "updateContainerResources", | ||||||
|  | 		10: "listImages", | ||||||
|  | 		11: "removeImages", | ||||||
|  | 		12: "imageStatus", | ||||||
|  | 		13: "imageFsInfo", | ||||||
|  | 		14: "listPodSandbox", | ||||||
|  | 		15: "portForward", | ||||||
|  | 		16: "removePodSandbox", | ||||||
|  | 		17: "runPodSandbox", | ||||||
|  | 		18: "podSandboxStatus", | ||||||
|  | 		19: "stopPodSandbox", | ||||||
|  | 		20: "status", | ||||||
|  | 		21: "updateRuntimeConfig", | ||||||
|  | 	} | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	defaultRoot    = "/var/lib/containerd" | ||||||
|  | 	defaultState   = "/tmp/containerd" | ||||||
|  | 	defaultAddress = "/tmp/containerd/containerd.sock" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var ( | ||||||
|  | 	initDaemon sync.Once | ||||||
|  |  | ||||||
|  | 	executionOrder []string | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func startDaemonForFuzzing(arguments []string) { | ||||||
|  | 	app := command.App() | ||||||
|  | 	_ = app.Run(arguments) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func startDaemon() { | ||||||
|  | 	args := []string{"--log-level", "debug"} | ||||||
|  | 	go func() { | ||||||
|  | 		// This is similar to invoking the | ||||||
|  | 		// containerd binary. | ||||||
|  | 		// See contrib/fuzz/oss_fuzz_build.sh | ||||||
|  | 		// for more info. | ||||||
|  | 		startDaemonForFuzzing(args) | ||||||
|  | 	}() | ||||||
|  | 	time.Sleep(time.Second * 4) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func printExecutions() { | ||||||
|  | 	if r := recover(); r != nil { | ||||||
|  | 		var err string | ||||||
|  | 		switch r.(type) { | ||||||
|  | 		case string: | ||||||
|  | 			err = r.(string) | ||||||
|  | 		case golangruntime.Error: | ||||||
|  | 			err = r.(golangruntime.Error).Error() | ||||||
|  | 		case error: | ||||||
|  | 			err = r.(error).Error() | ||||||
|  | 		default: | ||||||
|  | 			err = "uknown error type" | ||||||
|  | 		} | ||||||
|  | 		fmt.Println("Executions:") | ||||||
|  | 		for _, eo := range executionOrder { | ||||||
|  | 			fmt.Println(eo) | ||||||
|  | 		} | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // FuzzCRI implements a fuzzer that tests CRI APIs. | ||||||
|  | func FuzzCRI(data []byte) int { | ||||||
|  | 	initDaemon.Do(startDaemon) | ||||||
|  |  | ||||||
|  | 	executionOrder = make([]string, 0) | ||||||
|  |  | ||||||
|  | 	f := fuzz.NewConsumer(data) | ||||||
|  |  | ||||||
|  | 	client, err := containerd.New(defaultAddress) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	defer client.Close() | ||||||
|  |  | ||||||
|  | 	c, err := NewCRIService(criconfig.Config{}, client) | ||||||
|  | 	if err != nil { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	calls, err := f.GetInt() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	defer printExecutions() | ||||||
|  | 	for i := 0; i < calls%40; i++ { | ||||||
|  | 		op, err := f.GetInt() | ||||||
|  | 		if err != nil { | ||||||
|  | 			return 0 | ||||||
|  | 		} | ||||||
|  | 		opType := op % len(ops) | ||||||
|  |  | ||||||
|  | 		switch ops[opType] { | ||||||
|  | 		case "createContainer": | ||||||
|  | 			createContainerFuzz(c.(*criService), f) | ||||||
|  | 		case "removeContainer": | ||||||
|  | 			removeContainerFuzz(c.(*criService), f) | ||||||
|  | 		case "addSandboxes": | ||||||
|  | 			addSandboxesFuzz(c.(*criService), f) | ||||||
|  | 		case "listContainers": | ||||||
|  | 			listContainersFuzz(c.(*criService), f) | ||||||
|  | 		case "startContainer": | ||||||
|  | 			startContainerFuzz(c.(*criService), f) | ||||||
|  | 		case "containerStats": | ||||||
|  | 			containerStatsFuzz(c.(*criService), f) | ||||||
|  | 		case "listContainerStats": | ||||||
|  | 			listContainerStatsFuzz(c.(*criService), f) | ||||||
|  | 		case "containerStatus": | ||||||
|  | 			containerStatusFuzz(c.(*criService), f) | ||||||
|  | 		case "stopContainer": | ||||||
|  | 			stopContainerFuzz(c.(*criService), f) | ||||||
|  | 		case "updateContainerResources": | ||||||
|  | 			updateContainerResourcesFuzz(c.(*criService), f) | ||||||
|  | 		case "listImages": | ||||||
|  | 			listImagesFuzz(c.(*criService), f) | ||||||
|  | 		case "removeImages": | ||||||
|  | 			removeImagesFuzz(c.(*criService), f) | ||||||
|  | 		case "imageStatus": | ||||||
|  | 			imageStatusFuzz(c.(*criService), f) | ||||||
|  | 		case "imageFsInfo": | ||||||
|  | 			imageFsInfoFuzz(c.(*criService), f) | ||||||
|  | 		case "listPodSandbox": | ||||||
|  | 			listPodSandboxFuzz(c.(*criService), f) | ||||||
|  | 		case "portForward": | ||||||
|  | 			portForwardFuzz(c.(*criService), f) | ||||||
|  | 		case "removePodSandbox": | ||||||
|  | 			removePodSandboxFuzz(c.(*criService), f) | ||||||
|  | 		case "runPodSandbox": | ||||||
|  | 			runPodSandboxFuzz(c.(*criService), f) | ||||||
|  | 		case "podSandboxStatus": | ||||||
|  | 			podSandboxStatusFuzz(c.(*criService), f) | ||||||
|  | 		case "stopPodSandbox": | ||||||
|  | 			stopPodSandboxFuzz(c.(*criService), f) | ||||||
|  | 		case "status": | ||||||
|  | 			statusFuzz(c.(*criService), f) | ||||||
|  | 		case "updateRuntimeConfig": | ||||||
|  | 			updateRuntimeConfigFuzz(c.(*criService), f) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return 1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func logExecution(apiName, request string) { | ||||||
|  | 	var logString strings.Builder | ||||||
|  | 	logString.WriteString(fmt.Sprintf("Calling %s with \n %s \n\n", apiName, request)) | ||||||
|  | 	executionOrder = append(executionOrder, logString.String()) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // createContainerFuzz creates a CreateContainerRequest and passes | ||||||
|  | // it to c.CreateContainer | ||||||
|  | func createContainerFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.CreateContainerRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.CreateContainer(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.CreateContainer", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // removeContainerFuzz creates a RemoveContainerRequest and passes | ||||||
|  | // it to c.RemoveContainer | ||||||
|  | func removeContainerFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.RemoveContainerRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.RemoveContainer(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.RemoveContainer", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // addSandboxesFuzz creates a sandbox and adds it to the sandboxstore | ||||||
|  | func addSandboxesFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	quantity, err := f.GetInt() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	for i := 0; i < quantity%20; i++ { | ||||||
|  | 		newSandbox, err := getSandboxFuzz(f) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		err = c.sandboxStore.Add(newSandbox) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // getSandboxFuzz creates a sandbox | ||||||
|  | func getSandboxFuzz(f *fuzz.ConsumeFuzzer) (sandboxstore.Sandbox, error) { | ||||||
|  | 	metadata := sandboxstore.Metadata{} | ||||||
|  | 	status := sandboxstore.Status{} | ||||||
|  | 	err := f.GenerateStruct(&metadata) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return sandboxstore.Sandbox{}, err | ||||||
|  | 	} | ||||||
|  | 	err = f.GenerateStruct(&status) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return sandboxstore.Sandbox{}, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	reqString := fmt.Sprintf("metadata: %+v\nstatus: %+v\n", metadata, status) | ||||||
|  | 	logExecution("sandboxstore.NewSandbox", reqString) | ||||||
|  |  | ||||||
|  | 	return sandboxstore.NewSandbox(metadata, status), nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // listContainersFuzz creates a ListContainersRequest and passes | ||||||
|  | // it to c.ListContainers | ||||||
|  | func listContainersFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.ListContainersRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.ListContainers(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.ListContainers", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // startContainerFuzz creates a StartContainerRequest and passes | ||||||
|  | // it to c.StartContainer | ||||||
|  | func startContainerFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.StartContainerRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.StartContainer(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.StartContainer", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // containerStatsFuzz creates a ContainerStatsRequest and passes | ||||||
|  | // it to c.ContainerStats | ||||||
|  | func containerStatsFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.ContainerStatsRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.ContainerStats(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.ContainerStats", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // listContainerStatsFuzz creates a ListContainerStatsRequest and | ||||||
|  | // passes it to c.ListContainerStats | ||||||
|  | func listContainerStatsFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.ListContainerStatsRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.ListContainerStats(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.ListContainerStats", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // containerStatusFuzz creates a ContainerStatusRequest and passes | ||||||
|  | // it to c.ContainerStatus | ||||||
|  | func containerStatusFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.ContainerStatusRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.ContainerStatus(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.ContainerStatus", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // stopContainerFuzz creates a StopContainerRequest and passes | ||||||
|  | // it to c.StopContainer | ||||||
|  | func stopContainerFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.StopContainerRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.StopContainer(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.StopContainer", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // updateContainerResourcesFuzz creates a UpdateContainerResourcesRequest | ||||||
|  | // and passes it to c.UpdateContainerResources | ||||||
|  | func updateContainerResourcesFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.UpdateContainerResourcesRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.UpdateContainerResources(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.UpdateContainerResources", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // listImagesFuzz creates a ListImagesRequest and passes it to | ||||||
|  | // c.ListImages | ||||||
|  | func listImagesFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.ListImagesRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.ListImages(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.ListImages", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // removeImagesFuzz creates a RemoveImageRequest and passes it to | ||||||
|  | // c.RemoveImage | ||||||
|  | func removeImagesFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.RemoveImageRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.RemoveImage(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.RemoveImage", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // imageStatusFuzz creates an ImageStatusRequest and passes it to | ||||||
|  | // c.ImageStatus | ||||||
|  | func imageStatusFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.ImageStatusRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.ImageStatus(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.ImageStatus", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // imageFsInfoFuzz creates an ImageFsInfoRequest and passes it to | ||||||
|  | // c.ImageFsInfo | ||||||
|  | func imageFsInfoFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.ImageFsInfoRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.ImageFsInfo(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.ImageFsInfo", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // listPodSandboxFuzz creates a ListPodSandboxRequest and passes | ||||||
|  | // it to c.ListPodSandbox | ||||||
|  | func listPodSandboxFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.ListPodSandboxRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.ListPodSandbox(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.ListPodSandbox", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // portForwardFuzz creates a PortForwardRequest and passes it to | ||||||
|  | // c.PortForward | ||||||
|  | func portForwardFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.PortForwardRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.PortForward(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.PortForward", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // removePodSandboxFuzz creates a RemovePodSandboxRequest and | ||||||
|  | // passes it to c.RemovePodSandbox | ||||||
|  | func removePodSandboxFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.RemovePodSandboxRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.RemovePodSandbox(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.RemovePodSandbox", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // runPodSandboxFuzz creates a RunPodSandboxRequest and passes | ||||||
|  | // it to c.RunPodSandbox | ||||||
|  | func runPodSandboxFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.RunPodSandboxRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.RunPodSandbox(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.RunPodSandbox", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // podSandboxStatusFuzz creates a PodSandboxStatusRequest and | ||||||
|  | // passes it to | ||||||
|  | func podSandboxStatusFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.PodSandboxStatusRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.PodSandboxStatus(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.PodSandboxStatus", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // stopPodSandboxFuzz creates a StopPodSandboxRequest and passes | ||||||
|  | // it to c.StopPodSandbox | ||||||
|  | func stopPodSandboxFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.StopPodSandboxRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.StopPodSandbox(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.StopPodSandbox", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // statusFuzz creates a StatusRequest and passes it to c.Status | ||||||
|  | func statusFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.StatusRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.Status(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.Status", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func updateRuntimeConfigFuzz(c *criService, f *fuzz.ConsumeFuzzer) error { | ||||||
|  | 	r := &runtime.UpdateRuntimeConfigRequest{} | ||||||
|  | 	err := f.GenerateStruct(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	_, _ = c.UpdateRuntimeConfig(context.Background(), r) | ||||||
|  | 	reqString := fmt.Sprintf("%+v", r) | ||||||
|  | 	logExecution("c.UpdateRuntimeConfig", reqString) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // This creates a container directly in the store. | ||||||
|  | func getContainer(f *fuzz.ConsumeFuzzer) (containerstore.Container, error) { | ||||||
|  | 	metadata := containerstore.Metadata{} | ||||||
|  | 	status := containerstore.Status{} | ||||||
|  |  | ||||||
|  | 	err := f.GenerateStruct(&metadata) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return containerstore.Container{}, err | ||||||
|  | 	} | ||||||
|  | 	err = f.GenerateStruct(&status) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return containerstore.Container{}, err | ||||||
|  | 	} | ||||||
|  | 	container, err := containerstore.NewContainer(metadata, containerstore.WithFakeStatus(status)) | ||||||
|  | 	return container, err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func newTestCRIServiceForFuzzing(f *fuzz.ConsumeFuzzer) *criService { | ||||||
|  | 	labels := label.NewStore() | ||||||
|  |  | ||||||
|  | 	return &criService{ | ||||||
|  | 		config:             testConfig, | ||||||
|  | 		imageFSPath:        testImageFSPath, | ||||||
|  | 		os:                 ostesting.NewFakeOS(), | ||||||
|  | 		sandboxStore:       sandboxstore.NewStore(labels), | ||||||
|  | 		imageStore:         imagestore.NewStore(nil), | ||||||
|  | 		snapshotStore:      snapshotstore.NewStore(), | ||||||
|  | 		sandboxNameIndex:   registrar.NewRegistrar(), | ||||||
|  | 		containerStore:     containerstore.NewStore(labels), | ||||||
|  | 		containerNameIndex: registrar.NewRegistrar(), | ||||||
|  | 		netPlugin: map[string]cni.CNI{ | ||||||
|  | 			defaultNetworkPlugin: servertesting.NewFakeCNIPlugin(), | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -37,28 +37,11 @@ import ( | |||||||
| 	"github.com/containerd/containerd/pkg/registrar" | 	"github.com/containerd/containerd/pkg/registrar" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const ( |  | ||||||
| 	testRootDir  = "/test/root" |  | ||||||
| 	testStateDir = "/test/state" |  | ||||||
| 	// Use an image id as test sandbox image to avoid image name resolve. |  | ||||||
| 	// TODO(random-liu): Change this to image name after we have complete image |  | ||||||
| 	// management unit test framework. |  | ||||||
| 	testSandboxImage = "sha256:c75bebcdd211f41b3a460c7bf82970ed6c75acaab9cd4c9a4e125b03ca113798" |  | ||||||
| 	testImageFSPath  = "/test/image/fs/path" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // newTestCRIService creates a fake criService for test. | // newTestCRIService creates a fake criService for test. | ||||||
| func newTestCRIService() *criService { | func newTestCRIService() *criService { | ||||||
| 	labels := label.NewStore() | 	labels := label.NewStore() | ||||||
| 	return &criService{ | 	return &criService{ | ||||||
| 		config: criconfig.Config{ | 		config:             testConfig, | ||||||
| 			RootDir:  testRootDir, |  | ||||||
| 			StateDir: testStateDir, |  | ||||||
| 			PluginConfig: criconfig.PluginConfig{ |  | ||||||
| 				SandboxImage:                     testSandboxImage, |  | ||||||
| 				TolerateMissingHugetlbController: true, |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 		imageFSPath:        testImageFSPath, | 		imageFSPath:        testImageFSPath, | ||||||
| 		os:                 ostesting.NewFakeOS(), | 		os:                 ostesting.NewFakeOS(), | ||||||
| 		sandboxStore:       sandboxstore.NewStore(labels), | 		sandboxStore:       sandboxstore.NewStore(labels), | ||||||
|   | |||||||
							
								
								
									
										38
									
								
								pkg/cri/server/test_config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								pkg/cri/server/test_config.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  |  | ||||||
|  |    Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |    you may not use this file except in compliance with the License. | ||||||
|  |    You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |        http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |    Unless required by applicable law or agreed to in writing, software | ||||||
|  |    distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |    See the License for the specific language governing permissions and | ||||||
|  |    limitations under the License. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | package server | ||||||
|  |  | ||||||
|  | import criconfig "github.com/containerd/containerd/pkg/cri/config" | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	testRootDir  = "/test/root" | ||||||
|  | 	testStateDir = "/test/state" | ||||||
|  | 	// Use an image id as test sandbox image to avoid image name resolve. | ||||||
|  | 	// TODO(random-liu): Change this to image name after we have complete image | ||||||
|  | 	// management unit test framework. | ||||||
|  | 	testSandboxImage = "sha256:c75bebcdd211f41b3a460c7bf82970ed6c75acaab9cd4c9a4e125b03ca113798" | ||||||
|  | 	testImageFSPath  = "/test/image/fs/path" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var testConfig = criconfig.Config{ | ||||||
|  | 	RootDir:  testRootDir, | ||||||
|  | 	StateDir: testStateDir, | ||||||
|  | 	PluginConfig: criconfig.PluginConfig{ | ||||||
|  | 		SandboxImage:                     testSandboxImage, | ||||||
|  | 		TolerateMissingHugetlbController: true, | ||||||
|  | 	}, | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Kazuyoshi Kato
					Kazuyoshi Kato