Merge pull request #7087 from kzys/fuzz-less-hacks
Remove hacks around contrib/fuzz
This commit is contained in:
commit
78c4d3de72
@ -23,6 +23,11 @@ issues:
|
|||||||
max-issues-per-linter: 0
|
max-issues-per-linter: 0
|
||||||
max-same-issues: 0
|
max-same-issues: 0
|
||||||
|
|
||||||
|
# Only using / doesn't work due to https://github.com/golangci/golangci-lint/issues/1398.
|
||||||
|
exclude-rules:
|
||||||
|
- path: 'cmd[\\/]containerd[\\/]builtins[\\/]'
|
||||||
|
text: "blank-imports:"
|
||||||
|
|
||||||
linters-settings:
|
linters-settings:
|
||||||
gosec:
|
gosec:
|
||||||
# The following issues surfaced when `gosec` linter
|
# The following issues surfaced when `gosec` linter
|
||||||
|
@ -17,6 +17,6 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package builtins
|
||||||
|
|
||||||
import _ "github.com/containerd/aufs/plugin"
|
import _ "github.com/containerd/aufs/plugin"
|
@ -17,6 +17,6 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package builtins
|
||||||
|
|
||||||
import _ "github.com/containerd/containerd/snapshots/btrfs/plugin"
|
import _ "github.com/containerd/containerd/snapshots/btrfs/plugin"
|
@ -14,7 +14,7 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package builtins
|
||||||
|
|
||||||
// register containerd builtins here
|
// register containerd builtins here
|
||||||
import (
|
import (
|
@ -14,6 +14,6 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package builtins
|
||||||
|
|
||||||
import _ "github.com/containerd/zfs/plugin"
|
import _ "github.com/containerd/zfs/plugin"
|
@ -14,7 +14,7 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package builtins
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/containerd/containerd/metrics/cgroups"
|
_ "github.com/containerd/containerd/metrics/cgroups"
|
@ -17,7 +17,7 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package builtins
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/containerd/containerd/snapshots/native/plugin"
|
_ "github.com/containerd/containerd/snapshots/native/plugin"
|
@ -14,7 +14,7 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package builtins
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/containerd/containerd/diff/lcow"
|
_ "github.com/containerd/containerd/diff/lcow"
|
@ -17,6 +17,6 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package builtins
|
||||||
|
|
||||||
import _ "github.com/containerd/containerd/snapshots/devmapper/plugin"
|
import _ "github.com/containerd/containerd/snapshots/devmapper/plugin"
|
@ -17,7 +17,7 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package builtins
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/containerd/containerd/tracing/plugin"
|
_ "github.com/containerd/containerd/tracing/plugin"
|
@ -17,6 +17,6 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package main
|
package builtins
|
||||||
|
|
||||||
import _ "github.com/containerd/zfs/plugin"
|
import _ "github.com/containerd/zfs/plugin"
|
@ -1,22 +0,0 @@
|
|||||||
//go:build (linux && !no_cri) || (windows && !no_cri) || (darwin && !no_cri)
|
|
||||||
// +build linux,!no_cri windows,!no_cri darwin,!no_cri
|
|
||||||
|
|
||||||
/*
|
|
||||||
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 main
|
|
||||||
|
|
||||||
import _ "github.com/containerd/containerd/pkg/cri"
|
|
@ -22,6 +22,9 @@ import (
|
|||||||
|
|
||||||
"github.com/containerd/containerd/cmd/containerd/command"
|
"github.com/containerd/containerd/cmd/containerd/command"
|
||||||
"github.com/containerd/containerd/pkg/seed"
|
"github.com/containerd/containerd/pkg/seed"
|
||||||
|
|
||||||
|
_ "github.com/containerd/containerd/cmd/containerd/builtins"
|
||||||
|
_ "github.com/containerd/containerd/pkg/cri"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -25,7 +25,7 @@ import (
|
|||||||
fuzz "github.com/AdaLogics/go-fuzz-headers"
|
fuzz "github.com/AdaLogics/go-fuzz-headers"
|
||||||
|
|
||||||
"github.com/containerd/containerd"
|
"github.com/containerd/containerd"
|
||||||
_ "github.com/containerd/containerd/cmd/containerd"
|
_ "github.com/containerd/containerd/cmd/containerd/builtins"
|
||||||
"github.com/containerd/containerd/cmd/containerd/command"
|
"github.com/containerd/containerd/cmd/containerd/command"
|
||||||
"github.com/containerd/containerd/namespaces"
|
"github.com/containerd/containerd/namespaces"
|
||||||
)
|
)
|
||||||
@ -40,6 +40,11 @@ var (
|
|||||||
initDaemon sync.Once
|
initDaemon sync.Once
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func startDaemonForFuzzing(arguments []string) {
|
||||||
|
app := command.App()
|
||||||
|
_ = app.Run(arguments)
|
||||||
|
}
|
||||||
|
|
||||||
func startDaemon() {
|
func startDaemon() {
|
||||||
args := []string{"--log-level", "debug"}
|
args := []string{"--log-level", "debug"}
|
||||||
go func() {
|
go func() {
|
||||||
@ -47,7 +52,7 @@ func startDaemon() {
|
|||||||
// containerd binary.
|
// containerd binary.
|
||||||
// See contrib/fuzz/oss_fuzz_build.sh
|
// See contrib/fuzz/oss_fuzz_build.sh
|
||||||
// for more info.
|
// for more info.
|
||||||
command.StartDaemonForFuzzing(args)
|
startDaemonForFuzzing(args)
|
||||||
}()
|
}()
|
||||||
time.Sleep(time.Second * 4)
|
time.Sleep(time.Second * 4)
|
||||||
}
|
}
|
||||||
|
@ -16,14 +16,16 @@
|
|||||||
set -o nounset
|
set -o nounset
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
set -o errexit
|
set -o errexit
|
||||||
|
set -x
|
||||||
|
|
||||||
IFS=$'\n'
|
IFS=$'\n'
|
||||||
|
|
||||||
compile_fuzzers() {
|
compile_fuzzers() {
|
||||||
local regex=$1
|
local regex=$1
|
||||||
local compile_fuzzer=$2
|
local compile_fuzzer=$2
|
||||||
|
local blocklist=$3
|
||||||
|
|
||||||
for line in $(git grep "$regex" | grep -v vendor)
|
for line in $(git grep --full-name "$regex" | grep -v -E "$blocklist")
|
||||||
do
|
do
|
||||||
if [[ "$line" =~ (.*)/.*:.*(Fuzz[A-Za-z0-9]+) ]]; then
|
if [[ "$line" =~ (.*)/.*:.*(Fuzz[A-Za-z0-9]+) ]]; then
|
||||||
local pkg=${BASH_REMATCH[1]}
|
local pkg=${BASH_REMATCH[1]}
|
||||||
@ -53,41 +55,15 @@ rm /root/go/pkg/mod/github.com/cilium/ebpf@v0.7.0/internal/btf/fuzz.go
|
|||||||
cd "$(dirname "${BASH_SOURCE[0]}")"
|
cd "$(dirname "${BASH_SOURCE[0]}")"
|
||||||
cd ../../
|
cd ../../
|
||||||
|
|
||||||
# Move all fuzzers that don't have the "fuzz" package out of this dir
|
|
||||||
mv contrib/fuzz/container_fuzzer.go integration/client/
|
|
||||||
|
|
||||||
rm -r vendor
|
rm -r vendor
|
||||||
|
|
||||||
|
|
||||||
# Change path of socket since OSS-fuzz does not grant access to /run
|
# Change path of socket since OSS-fuzz does not grant access to /run
|
||||||
sed -i 's/\/run\/containerd/\/tmp\/containerd/g' $SRC/containerd/defaults/defaults_unix.go
|
sed -i 's/\/run\/containerd/\/tmp\/containerd/g' $SRC/containerd/defaults/defaults_unix.go
|
||||||
|
|
||||||
# To build FuzzContainer2 we need to prepare a few things:
|
|
||||||
# We change the name of the cmd/containerd package
|
|
||||||
# so that we can import it.
|
|
||||||
# We furthermore add an exported function that is similar
|
|
||||||
# to cmd/containerd.main and call that instead of calling
|
|
||||||
# the containerd binary.
|
|
||||||
#
|
|
||||||
# In the fuzzer we import cmd/containerd as a low-maintenance
|
|
||||||
# way of initializing all the plugins.
|
|
||||||
# Make backup of cmd/containerd:
|
|
||||||
cp -r $SRC/containerd/cmd/containerd $SRC/cmd-containerd-backup
|
|
||||||
# Rename package:
|
|
||||||
find $SRC/containerd/cmd/containerd -type f -exec sed -i 's/package main/package mainfuzz/g' {} \;
|
|
||||||
# Add an exported function
|
|
||||||
sed -i -e '$afunc StartDaemonForFuzzing(arguments []string) {\n\tapp := App()\n\t_ = app.Run(arguments)\n}' $SRC/containerd/cmd/containerd/command/main.go
|
|
||||||
# Build fuzzer:
|
|
||||||
compile_go_fuzzer github.com/containerd/containerd/contrib/fuzz FuzzContainerdImport fuzz_containerd_import
|
|
||||||
# Reinstante backup of cmd/containerd:
|
|
||||||
mv $SRC/cmd-containerd-backup $SRC/containerd/cmd/containerd
|
|
||||||
|
|
||||||
# Compile more fuzzers
|
|
||||||
mv $SRC/containerd/filters/filter_test.go $SRC/containerd/filters/filter_test_fuzz.go
|
|
||||||
go get github.com/AdamKorcz/go-118-fuzz-build/utils
|
go get github.com/AdamKorcz/go-118-fuzz-build/utils
|
||||||
|
|
||||||
compile_fuzzers '^func Fuzz.*testing\.F' compile_native_go_fuzzer
|
compile_fuzzers '^func Fuzz.*testing\.F' compile_native_go_fuzzer vendor
|
||||||
compile_fuzzers '^func Fuzz.*data' compile_go_fuzzer
|
compile_fuzzers '^func Fuzz.*data' compile_go_fuzzer '(vendor|Integ)'
|
||||||
|
|
||||||
# The below fuzzers require more setup than the fuzzers above.
|
# The below fuzzers require more setup than the fuzzers above.
|
||||||
# We need the binaries from "make".
|
# We need the binaries from "make".
|
||||||
@ -122,6 +98,5 @@ for i in $( ls *_test.go ); do mv $i ./${i%.*}_fuzz.go; done
|
|||||||
# Remove windows test to avoid double declarations:
|
# Remove windows test to avoid double declarations:
|
||||||
rm ./client_windows_test_fuzz.go
|
rm ./client_windows_test_fuzz.go
|
||||||
rm ./helpers_windows_test_fuzz.go
|
rm ./helpers_windows_test_fuzz.go
|
||||||
compile_go_fuzzer github.com/containerd/containerd/integration/client FuzzCreateContainerNoTearDown fuzz_create_container_no_teardown
|
|
||||||
compile_go_fuzzer github.com/containerd/containerd/integration/client FuzzCreateContainerWithTearDown fuzz_create_container_with_teardown
|
compile_fuzzers '^func FuzzInteg.*data' compile_go_fuzzer vendor
|
||||||
compile_go_fuzzer github.com/containerd/containerd/integration/client FuzzNoTearDownWithDownload fuzz_no_teardown_with_download
|
|
||||||
|
@ -3,10 +3,13 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright The containerd Authors.
|
Copyright The containerd Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
@ -14,12 +17,6 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
To run this fuzzer, it must first be moved to
|
|
||||||
integration/client. OSS-fuzz does this automatically
|
|
||||||
everytime it builds the fuzzers.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -410,7 +407,7 @@ func doFuzz(data []byte, shouldTearDown bool) int {
|
|||||||
// This fuzzer is experimental for now and is being run
|
// This fuzzer is experimental for now and is being run
|
||||||
// continuously by OSS-fuzz to collect feedback on
|
// continuously by OSS-fuzz to collect feedback on
|
||||||
// its sustainability.
|
// its sustainability.
|
||||||
func FuzzNoTearDownWithDownload(data []byte) int {
|
func FuzzIntegNoTearDownWithDownload(data []byte) int {
|
||||||
if !haveInitialized {
|
if !haveInitialized {
|
||||||
shouldRestart := initInSteps()
|
shouldRestart := initInSteps()
|
||||||
if shouldRestart {
|
if shouldRestart {
|
||||||
@ -426,7 +423,7 @@ func FuzzNoTearDownWithDownload(data []byte) int {
|
|||||||
// with one minor distinction: One tears down the
|
// with one minor distinction: One tears down the
|
||||||
// daemon after each iteration whereas the other doesn't.
|
// daemon after each iteration whereas the other doesn't.
|
||||||
// The two fuzzers' performance will be compared over time.
|
// The two fuzzers' performance will be compared over time.
|
||||||
func FuzzCreateContainerNoTearDown(data []byte) int {
|
func FuzzIntegCreateContainerNoTearDown(data []byte) int {
|
||||||
if !haveInitialized {
|
if !haveInitialized {
|
||||||
err := updatePathEnv()
|
err := updatePathEnv()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -441,7 +438,7 @@ func FuzzCreateContainerNoTearDown(data []byte) int {
|
|||||||
// FuzzCreateContainerNoTearDown() except that
|
// FuzzCreateContainerNoTearDown() except that
|
||||||
// FuzzCreateContainerWithTearDown tears down the daemon
|
// FuzzCreateContainerWithTearDown tears down the daemon
|
||||||
// after each iteration.
|
// after each iteration.
|
||||||
func FuzzCreateContainerWithTearDown(data []byte) int {
|
func FuzzIntegCreateContainerWithTearDown(data []byte) int {
|
||||||
if !haveInitialized {
|
if !haveInitialized {
|
||||||
err := updatePathEnv()
|
err := updatePathEnv()
|
||||||
if err != nil {
|
if err != nil {
|
@ -19,8 +19,9 @@ require (
|
|||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a
|
||||||
)
|
)
|
||||||
|
|
||||||
|
require github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8 // indirect
|
|
||||||
github.com/Microsoft/go-winio v0.5.2 // indirect
|
github.com/Microsoft/go-winio v0.5.2 // indirect
|
||||||
github.com/blang/semver v3.5.1+incompatible // indirect
|
github.com/blang/semver v3.5.1+incompatible // indirect
|
||||||
github.com/cilium/ebpf v0.7.0 // indirect
|
github.com/cilium/ebpf v0.7.0 // indirect
|
||||||
|
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,
|
||||||
|
},
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user