diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 70c2cb1d7..d2026ec8b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -322,6 +322,22 @@ jobs: sudo GOPATH=$GOPATH GOPROXY=$GOPROXY TEST_RUNTIME=$TEST_RUNTIME RUNC_FLAVOR=$RUNC_FLAVOR TESTFLAGS_PARALLEL=1 make integration EXTRA_TESTFLAGS=-no-criu working-directory: src/github.com/containerd/containerd + # CRIU wouldn't work with overlay snapshotter yet. + # See https://github.com/containerd/containerd/pull/4708#issuecomment-724322294. + - name: CRIU Integration + env: + GOPROXY: direct + TEST_RUNTIME: ${{ matrix.runtime }} + RUNC_FLAVOR: ${{ matrix.runc }} + # crun doesn't have "checkpoint" command. + if: ${{ matrix.runc == 'runc' }} + run: | + sudo GOPATH=$GOPATH GOPROXY=$GOPROXY \ + TEST_RUNTIME=$TEST_RUNTIME RUNC_FLAVOR=$RUNC_FLAVOR TESTFLAGS_PARALLEL=1 \ + TEST_SNAPSHOTTER=native \ + make integration EXTRA_TESTFLAGS='-run TestCheckpoint' + working-directory: src/github.com/containerd/containerd + - name: CRI Integration Test env: TEST_RUNTIME: ${{ matrix.runtime }} diff --git a/integration/client/client_test.go b/integration/client/client_test.go index 670a56ff8..9f23d8e92 100644 --- a/integration/client/client_test.go +++ b/integration/client/client_test.go @@ -50,6 +50,7 @@ var ( noCriu bool supportsCriu bool testNamespace = "testing" + testSnapshotter = DefaultSnapshotter ctrdStdioFilePath string ctrd = &daemon{} @@ -132,11 +133,30 @@ func TestMain(m *testing.M) { // allow comparison with containerd under test log.G(ctx).WithFields(logrus.Fields{ - "version": version.Version, - "revision": version.Revision, - "runtime": os.Getenv("TEST_RUNTIME"), + "version": version.Version, + "revision": version.Revision, + "runtime": os.Getenv("TEST_RUNTIME"), + "snapshotter": os.Getenv("TEST_SNAPSHOTTER"), }).Info("running tests against containerd") + snapshotter := DefaultSnapshotter + if ss := os.Getenv("TEST_SNAPSHOTTER"); ss != "" { + snapshotter = ss + } + + ns, ok := namespaces.Namespace(ctx) + if !ok { + fmt.Fprintln(os.Stderr, "error getting namespace") + os.Exit(1) + } + err = client.NamespaceService().SetLabel(ctx, ns, defaults.DefaultSnapshotterNSLabel, snapshotter) + if err != nil { + fmt.Fprintf(os.Stderr, "error setting %s's default snapshotter as %s: %s\n", ns, snapshotter, err) + os.Exit(1) + } + + testSnapshotter = snapshotter + // pull a seed image log.G(ctx).WithField("image", testImage).Info("start to pull seed image") if _, err = client.Pull(ctx, testImage, WithPullUnpack); err != nil { @@ -285,7 +305,7 @@ func TestImagePullWithDiscardContent(t *testing.T) { t.Fatalf("there is no layers in the target image(parent: %v)", img.Target()) } var ( - sn = client.SnapshotService("") + sn = client.SnapshotService(testSnapshotter) chain []digest.Digest ) for i, dgst := range layers { diff --git a/integration/client/container_checkpoint_test.go b/integration/client/container_checkpoint_test.go index 193ceaee7..930b6991b 100644 --- a/integration/client/container_checkpoint_test.go +++ b/integration/client/container_checkpoint_test.go @@ -414,7 +414,7 @@ func TestCheckpointLeaveRunning(t *testing.T) { <-statusC } -func TestCRWithImagePath(t *testing.T) { +func TestCheckpointRestoreWithImagePath(t *testing.T) { if !supportsCriu { t.Skip("system does not have criu installed") } diff --git a/pkg/process/init.go b/pkg/process/init.go index 2a2ade1d3..a9462384f 100644 --- a/pkg/process/init.go +++ b/pkg/process/init.go @@ -193,11 +193,15 @@ func (p *Init) createCheckpointedState(r *CreateConfig, pidFile *pidFile) error ParentPath: r.ParentCheckpoint, }, PidFile: pidFile.Path(), - IO: p.io.IO(), NoPivot: p.NoPivotRoot, Detach: true, NoSubreaper: true, } + + if p.io != nil { + opts.IO = p.io.IO() + } + p.initState = &createdCheckpointState{ p: p, opts: opts, diff --git a/runtime/v2/runc/container.go b/runtime/v2/runc/container.go index c72f31413..cdfb0874f 100644 --- a/runtime/v2/runc/container.go +++ b/runtime/v2/runc/container.go @@ -49,7 +49,7 @@ func NewContainer(ctx context.Context, platform stdio.Platform, r *task.CreateTa } var opts options.Options - if r.Options != nil { + if r.Options != nil && r.Options.GetTypeUrl() != "" { v, err := typeurl.UnmarshalAny(r.Options) if err != nil { return nil, err