Merge pull request #3072 from crosbymichael/v2opts

Fix runtime v2 option handling
This commit is contained in:
Phil Estes 2019-03-06 14:27:02 -05:00 committed by GitHub
commit 04b2e5bbf7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 70 additions and 31 deletions

View File

@ -229,7 +229,9 @@ func (c *container) NewTask(ctx context.Context, ioCreate cio.Creator, opts ...N
}) })
} }
} }
var info TaskInfo info := TaskInfo{
runtime: r.Runtime.Name,
}
for _, o := range opts { for _, o := range opts {
if err := o(ctx, c.client, &info); err != nil { if err := o(ctx, c.client, &info); err != nil {
return nil, err return nil, err

View File

@ -461,7 +461,7 @@ func TestCRWithImagePath(t *testing.T) {
defer os.RemoveAll(crDir) defer os.RemoveAll(crDir)
imagePath := filepath.Join(crDir, "cr") imagePath := filepath.Join(crDir, "cr")
// checkpoint task // checkpoint task
if _, err := task.Checkpoint(ctx, WithCheckpointImagePath(client.runtime, imagePath)); err != nil { if _, err := task.Checkpoint(ctx, WithCheckpointImagePath(imagePath)); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -485,7 +485,7 @@ func TestCRWithImagePath(t *testing.T) {
} }
defer ncontainer.Delete(ctx, WithSnapshotCleanup) defer ncontainer.Delete(ctx, WithSnapshotCleanup)
ntask, err := ncontainer.NewTask(ctx, empty(), WithRestoreImagePath(client.runtime, imagePath)) ntask, err := ncontainer.NewTask(ctx, empty(), WithRestoreImagePath(imagePath))
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

27
task.go
View File

@ -43,7 +43,7 @@ import (
google_protobuf "github.com/gogo/protobuf/types" google_protobuf "github.com/gogo/protobuf/types"
digest "github.com/opencontainers/go-digest" digest "github.com/opencontainers/go-digest"
is "github.com/opencontainers/image-spec/specs-go" is "github.com/opencontainers/image-spec/specs-go"
"github.com/opencontainers/image-spec/specs-go/v1" v1 "github.com/opencontainers/image-spec/specs-go/v1"
specs "github.com/opencontainers/runtime-spec/specs-go" specs "github.com/opencontainers/runtime-spec/specs-go"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
@ -117,6 +117,13 @@ type CheckpointTaskInfo struct {
ParentCheckpoint digest.Digest ParentCheckpoint digest.Digest
// Options hold runtime specific settings for checkpointing a task // Options hold runtime specific settings for checkpointing a task
Options interface{} Options interface{}
runtime string
}
// Runtime name for the container
func (i *CheckpointTaskInfo) Runtime() string {
return i.runtime
} }
// CheckpointTaskOpts allows the caller to set checkpoint options // CheckpointTaskOpts allows the caller to set checkpoint options
@ -131,6 +138,12 @@ type TaskInfo struct {
RootFS []mount.Mount RootFS []mount.Mount
// Options hold runtime specific settings for task creation // Options hold runtime specific settings for task creation
Options interface{} Options interface{}
runtime string
}
// Runtime name for the container
func (i *TaskInfo) Runtime() string {
return i.runtime
} }
// Task is the executable object within containerd // Task is the executable object within containerd
@ -401,11 +414,17 @@ func (t *task) Checkpoint(ctx context.Context, opts ...CheckpointTaskOpts) (Imag
return nil, err return nil, err
} }
defer done(ctx) defer done(ctx)
cr, err := t.client.ContainerService().Get(ctx, t.id)
if err != nil {
return nil, err
}
request := &tasks.CheckpointTaskRequest{ request := &tasks.CheckpointTaskRequest{
ContainerID: t.id, ContainerID: t.id,
} }
var i CheckpointTaskInfo i := CheckpointTaskInfo{
runtime: cr.Runtime.Name,
}
for _, o := range opts { for _, o := range opts {
if err := o(&i); err != nil { if err := o(&i); err != nil {
return nil, err return nil, err
@ -428,10 +447,6 @@ func (t *task) Checkpoint(ctx context.Context, opts ...CheckpointTaskOpts) (Imag
return nil, err return nil, err
} }
defer t.Resume(ctx) defer t.Resume(ctx)
cr, err := t.client.ContainerService().Get(ctx, t.id)
if err != nil {
return nil, err
}
index := v1.Index{ index := v1.Index{
Versioned: is.Versioned{ Versioned: is.Versioned{
SchemaVersion: 2, SchemaVersion: 2,

View File

@ -92,9 +92,9 @@ func WithCheckpointName(name string) CheckpointTaskOpts {
} }
// WithCheckpointImagePath sets image path for checkpoint option // WithCheckpointImagePath sets image path for checkpoint option
func WithCheckpointImagePath(rt, path string) CheckpointTaskOpts { func WithCheckpointImagePath(path string) CheckpointTaskOpts {
return func(r *CheckpointTaskInfo) error { return func(r *CheckpointTaskInfo) error {
if CheckRuntime(rt, "io.containerd.runc") { if CheckRuntime(r.Runtime(), "io.containerd.runc") {
if r.Options == nil { if r.Options == nil {
r.Options = &options.CheckpointOptions{} r.Options = &options.CheckpointOptions{}
} }
@ -118,9 +118,9 @@ func WithCheckpointImagePath(rt, path string) CheckpointTaskOpts {
} }
// WithRestoreImagePath sets image path for create option // WithRestoreImagePath sets image path for create option
func WithRestoreImagePath(rt, path string) NewTaskOpts { func WithRestoreImagePath(path string) NewTaskOpts {
return func(ctx context.Context, c *Client, ti *TaskInfo) error { return func(ctx context.Context, c *Client, ti *TaskInfo) error {
if CheckRuntime(rt, "io.containerd.runc") { if CheckRuntime(ti.Runtime(), "io.containerd.runc") {
if ti.Options == nil { if ti.Options == nil {
ti.Options = &options.Options{} ti.Options = &options.Options{}
} }

View File

@ -22,12 +22,23 @@ import (
"context" "context"
"github.com/containerd/containerd/runtime/linux/runctypes" "github.com/containerd/containerd/runtime/linux/runctypes"
"github.com/containerd/containerd/runtime/v2/runc/options"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
// WithNoNewKeyring causes tasks not to be created with a new keyring for secret storage. // WithNoNewKeyring causes tasks not to be created with a new keyring for secret storage.
// There is an upper limit on the number of keyrings in a linux system // There is an upper limit on the number of keyrings in a linux system
func WithNoNewKeyring(ctx context.Context, c *Client, ti *TaskInfo) error { func WithNoNewKeyring(ctx context.Context, c *Client, ti *TaskInfo) error {
if CheckRuntime(ti.Runtime(), "io.containerd.runc") {
if ti.Options == nil {
ti.Options = &options.Options{}
}
opts, ok := ti.Options.(*options.Options)
if !ok {
return errors.New("invalid v2 shim create options format")
}
opts.NoNewKeyring = true
} else {
if ti.Options == nil { if ti.Options == nil {
ti.Options = &runctypes.CreateOptions{} ti.Options = &runctypes.CreateOptions{}
} }
@ -35,23 +46,34 @@ func WithNoNewKeyring(ctx context.Context, c *Client, ti *TaskInfo) error {
if !ok { if !ok {
return errors.New("could not cast TaskInfo Options to CreateOptions") return errors.New("could not cast TaskInfo Options to CreateOptions")
} }
opts.NoNewKeyring = true opts.NoNewKeyring = true
}
return nil return nil
} }
// WithNoPivotRoot instructs the runtime not to you pivot_root // WithNoPivotRoot instructs the runtime not to you pivot_root
func WithNoPivotRoot(_ context.Context, _ *Client, info *TaskInfo) error { func WithNoPivotRoot(_ context.Context, _ *Client, ti *TaskInfo) error {
if info.Options == nil { if CheckRuntime(ti.Runtime(), "io.containerd.runc") {
info.Options = &runctypes.CreateOptions{ if ti.Options == nil {
ti.Options = &options.Options{}
}
opts, ok := ti.Options.(*options.Options)
if !ok {
return errors.New("invalid v2 shim create options format")
}
opts.NoPivotRoot = true
} else {
if ti.Options == nil {
ti.Options = &runctypes.CreateOptions{
NoPivotRoot: true, NoPivotRoot: true,
} }
return nil return nil
} }
opts, ok := info.Options.(*runctypes.CreateOptions) opts, ok := ti.Options.(*runctypes.CreateOptions)
if !ok { if !ok {
return errors.New("invalid options type, expected runctypes.CreateOptions") return errors.New("invalid options type, expected runctypes.CreateOptions")
} }
opts.NoPivotRoot = true opts.NoPivotRoot = true
}
return nil return nil
} }