diff --git a/linux/proc/deleted_state.go b/linux/proc/deleted_state.go index 6ef2cfb3e..fb2587804 100644 --- a/linux/proc/deleted_state.go +++ b/linux/proc/deleted_state.go @@ -6,7 +6,7 @@ import ( "context" "github.com/containerd/console" - shimapi "github.com/containerd/containerd/linux/shim/v1" + google_protobuf "github.com/gogo/protobuf/types" "github.com/pkg/errors" ) @@ -21,11 +21,11 @@ func (s *deletedState) Resume(ctx context.Context) error { return errors.Errorf("cannot resume a deleted process") } -func (s *deletedState) Update(context context.Context, r *shimapi.UpdateTaskRequest) error { +func (s *deletedState) Update(context context.Context, r *google_protobuf.Any) error { return errors.Errorf("cannot update a deleted process") } -func (s *deletedState) Checkpoint(ctx context.Context, r *shimapi.CheckpointTaskRequest) error { +func (s *deletedState) Checkpoint(ctx context.Context, r *CheckpointConfig) error { return errors.Errorf("cannot checkpoint a deleted process") } diff --git a/linux/proc/init.go b/linux/proc/init.go index 8a9aebd69..f24f92f7d 100644 --- a/linux/proc/init.go +++ b/linux/proc/init.go @@ -16,12 +16,12 @@ import ( "github.com/containerd/console" "github.com/containerd/containerd/linux/runctypes" - shimapi "github.com/containerd/containerd/linux/shim/v1" "github.com/containerd/containerd/log" "github.com/containerd/containerd/mount" "github.com/containerd/fifo" runc "github.com/containerd/go-runc" "github.com/containerd/typeurl" + google_protobuf "github.com/gogo/protobuf/types" specs "github.com/opencontainers/runtime-spec/specs-go" "github.com/pkg/errors" ) @@ -78,7 +78,7 @@ func NewRunc(root, path, namespace, runtime, criu string, systemd bool) *runc.Ru } // New returns a new init process -func New(context context.Context, path, workDir, runtimeRoot, namespace, criu string, systemdCgroup bool, platform Platform, r *shimapi.CreateTaskRequest) (*Init, error) { +func New(context context.Context, path, workDir, runtimeRoot, namespace, criu string, systemdCgroup bool, platform Platform, r *CreateConfig) (*Init, error) { var success bool var options runctypes.CreateOptions @@ -347,7 +347,7 @@ func (p *Init) Runtime() *runc.Runc { } // Exec returns a new exec'd process -func (p *Init) Exec(context context.Context, path string, r *shimapi.ExecProcessRequest) (Process, error) { +func (p *Init) Exec(context context.Context, path string, r *ExecConfig) (Process, error) { // process exec request var spec specs.Process if err := json.Unmarshal(r.Spec.Value, &spec); err != nil { @@ -372,7 +372,7 @@ func (p *Init) Exec(context context.Context, path string, r *shimapi.ExecProcess return e, nil } -func (p *Init) checkpoint(context context.Context, r *shimapi.CheckpointTaskRequest) error { +func (p *Init) checkpoint(context context.Context, r *CheckpointConfig) error { var options runctypes.CheckpointOptions if r.Options != nil { v, err := typeurl.UnmarshalAny(r.Options) @@ -405,9 +405,9 @@ func (p *Init) checkpoint(context context.Context, r *shimapi.CheckpointTaskRequ return nil } -func (p *Init) update(context context.Context, r *shimapi.UpdateTaskRequest) error { +func (p *Init) update(context context.Context, r *google_protobuf.Any) error { var resources specs.LinuxResources - if err := json.Unmarshal(r.Resources.Value, &resources); err != nil { + if err := json.Unmarshal(r.Value, &resources); err != nil { return err } return p.runtime.Update(context, p.id, &resources) diff --git a/linux/proc/init_state.go b/linux/proc/init_state.go index 9e36b786c..b5b398ec3 100644 --- a/linux/proc/init_state.go +++ b/linux/proc/init_state.go @@ -9,9 +9,9 @@ import ( "github.com/containerd/console" "github.com/containerd/containerd/errdefs" - shimapi "github.com/containerd/containerd/linux/shim/v1" "github.com/containerd/fifo" runc "github.com/containerd/go-runc" + google_protobuf "github.com/gogo/protobuf/types" "github.com/pkg/errors" ) @@ -20,8 +20,8 @@ type initState interface { Pause(context.Context) error Resume(context.Context) error - Update(context.Context, *shimapi.UpdateTaskRequest) error - Checkpoint(context.Context, *shimapi.CheckpointTaskRequest) error + Update(context.Context, *google_protobuf.Any) error + Checkpoint(context.Context, *CheckpointConfig) error } type createdState struct { @@ -56,14 +56,14 @@ func (s *createdState) Resume(ctx context.Context) error { return errors.Errorf("cannot resume task in created state") } -func (s *createdState) Update(context context.Context, r *shimapi.UpdateTaskRequest) error { +func (s *createdState) Update(context context.Context, r *google_protobuf.Any) error { s.p.mu.Lock() defer s.p.mu.Unlock() return s.p.update(context, r) } -func (s *createdState) Checkpoint(context context.Context, r *shimapi.CheckpointTaskRequest) error { +func (s *createdState) Checkpoint(context context.Context, r *CheckpointConfig) error { s.p.mu.Lock() defer s.p.mu.Unlock() @@ -146,14 +146,14 @@ func (s *createdCheckpointState) Resume(ctx context.Context) error { return errors.Errorf("cannot resume task in created state") } -func (s *createdCheckpointState) Update(context context.Context, r *shimapi.UpdateTaskRequest) error { +func (s *createdCheckpointState) Update(context context.Context, r *google_protobuf.Any) error { s.p.mu.Lock() defer s.p.mu.Unlock() return s.p.update(context, r) } -func (s *createdCheckpointState) Checkpoint(context context.Context, r *shimapi.CheckpointTaskRequest) error { +func (s *createdCheckpointState) Checkpoint(context context.Context, r *CheckpointConfig) error { s.p.mu.Lock() defer s.p.mu.Unlock() @@ -259,14 +259,14 @@ func (s *runningState) Resume(ctx context.Context) error { return errors.Errorf("cannot resume a running process") } -func (s *runningState) Update(context context.Context, r *shimapi.UpdateTaskRequest) error { +func (s *runningState) Update(context context.Context, r *google_protobuf.Any) error { s.p.mu.Lock() defer s.p.mu.Unlock() return s.p.update(context, r) } -func (s *runningState) Checkpoint(ctx context.Context, r *shimapi.CheckpointTaskRequest) error { +func (s *runningState) Checkpoint(ctx context.Context, r *CheckpointConfig) error { s.p.mu.Lock() defer s.p.mu.Unlock() @@ -345,14 +345,14 @@ func (s *pausedState) Resume(ctx context.Context) error { return s.transition("running") } -func (s *pausedState) Update(context context.Context, r *shimapi.UpdateTaskRequest) error { +func (s *pausedState) Update(context context.Context, r *google_protobuf.Any) error { s.p.mu.Lock() defer s.p.mu.Unlock() return s.p.update(context, r) } -func (s *pausedState) Checkpoint(ctx context.Context, r *shimapi.CheckpointTaskRequest) error { +func (s *pausedState) Checkpoint(ctx context.Context, r *CheckpointConfig) error { s.p.mu.Lock() defer s.p.mu.Unlock() @@ -427,14 +427,14 @@ func (s *stoppedState) Resume(ctx context.Context) error { return errors.Errorf("cannot resume a stopped container") } -func (s *stoppedState) Update(context context.Context, r *shimapi.UpdateTaskRequest) error { +func (s *stoppedState) Update(context context.Context, r *google_protobuf.Any) error { s.p.mu.Lock() defer s.p.mu.Unlock() return errors.Errorf("cannot update a stopped container") } -func (s *stoppedState) Checkpoint(ctx context.Context, r *shimapi.CheckpointTaskRequest) error { +func (s *stoppedState) Checkpoint(ctx context.Context, r *CheckpointConfig) error { s.p.mu.Lock() defer s.p.mu.Unlock() diff --git a/linux/proc/types.go b/linux/proc/types.go new file mode 100644 index 000000000..9055c25d1 --- /dev/null +++ b/linux/proc/types.go @@ -0,0 +1,37 @@ +package proc + +import ( + containerd_types "github.com/containerd/containerd/api/types" + google_protobuf "github.com/gogo/protobuf/types" +) + +// CreateConfig hold task creation configuration +type CreateConfig struct { + ID string + Bundle string + Runtime string + Rootfs []*containerd_types.Mount + Terminal bool + Stdin string + Stdout string + Stderr string + Checkpoint string + ParentCheckpoint string + Options *google_protobuf.Any +} + +// ExecConfig holds exec creation configuration +type ExecConfig struct { + ID string + Terminal bool + Stdin string + Stdout string + Stderr string + Spec *google_protobuf.Any +} + +// CheckpointConfig holds task checkpoint configuration +type CheckpointConfig struct { + Path string + Options *google_protobuf.Any +} diff --git a/linux/proc/utils.go b/linux/proc/utils.go index 8bedd554b..1197957b5 100644 --- a/linux/proc/utils.go +++ b/linux/proc/utils.go @@ -10,7 +10,6 @@ import ( "time" "github.com/containerd/containerd/errdefs" - shimapi "github.com/containerd/containerd/linux/shim/v1" runc "github.com/containerd/go-runc" "github.com/pkg/errors" "golang.org/x/sys/unix" @@ -81,6 +80,6 @@ func checkKillError(err error) error { return errors.Wrapf(err, "unknown error after kill") } -func hasNoIO(r *shimapi.CreateTaskRequest) bool { +func hasNoIO(r *CreateConfig) bool { return r.Stdin == "" && r.Stdout == "" && r.Stderr == "" } diff --git a/linux/shim/service.go b/linux/shim/service.go index 0347c0b37..31c054392 100644 --- a/linux/shim/service.go +++ b/linux/shim/service.go @@ -96,7 +96,19 @@ func (s *Service) Create(ctx context.Context, r *shimapi.CreateTaskRequest) (*sh s.config.Criu, s.config.SystemdCgroup, s.platform, - r, + &proc.CreateConfig{ + ID: r.ID, + Bundle: r.Bundle, + Runtime: r.Runtime, + Rootfs: r.Rootfs, + Terminal: r.Terminal, + Stdin: r.Stdin, + Stdout: r.Stdout, + Stderr: r.Stderr, + Checkpoint: r.Checkpoint, + ParentCheckpoint: r.ParentCheckpoint, + Options: r.Options, + }, ) if err != nil { return nil, errdefs.ToGRPC(err) @@ -185,7 +197,14 @@ func (s *Service) Exec(ctx context.Context, r *shimapi.ExecProcessRequest) (*goo return nil, errdefs.ToGRPCf(errdefs.ErrFailedPrecondition, "container must be created") } - process, err := p.(*proc.Init).Exec(ctx, s.config.Path, r) + process, err := p.(*proc.Init).Exec(ctx, s.config.Path, &proc.ExecConfig{ + ID: r.ID, + Terminal: r.Terminal, + Stdin: r.Stdin, + Stdout: r.Stdout, + Stderr: r.Stderr, + Spec: r.Spec, + }) if err != nil { return nil, errdefs.ToGRPC(err) } @@ -362,7 +381,10 @@ func (s *Service) Checkpoint(ctx context.Context, r *shimapi.CheckpointTaskReque if p == nil { return nil, errdefs.ToGRPCf(errdefs.ErrFailedPrecondition, "container must be created") } - if err := p.(*proc.Init).Checkpoint(ctx, r); err != nil { + if err := p.(*proc.Init).Checkpoint(ctx, &proc.CheckpointConfig{ + Path: r.Path, + Options: r.Options, + }); err != nil { return nil, errdefs.ToGRPC(err) } return empty, nil @@ -383,7 +405,7 @@ func (s *Service) Update(ctx context.Context, r *shimapi.UpdateTaskRequest) (*go if p == nil { return nil, errdefs.ToGRPCf(errdefs.ErrFailedPrecondition, "container must be created") } - if err := p.(*proc.Init).Update(ctx, r); err != nil { + if err := p.(*proc.Init).Update(ctx, r.Resources); err != nil { return nil, errdefs.ToGRPC(err) } return empty, nil diff --git a/linux/shim/service_unix.go b/linux/shim/service_unix.go index 6419e15cc..d4419e56a 100644 --- a/linux/shim/service_unix.go +++ b/linux/shim/service_unix.go @@ -3,13 +3,13 @@ package shim import ( + "context" "io" "sync" "syscall" "github.com/containerd/console" "github.com/containerd/fifo" - "golang.org/x/net/context" ) type unixPlatform struct {