containerd/cmd/containerd-shim/service.go

77 lines
1.8 KiB
Go
Raw Normal View History

package main
import (
"github.com/docker/containerd/api/shim"
"github.com/docker/containerd/utils"
"github.com/docker/docker/pkg/term"
google_protobuf "github.com/golang/protobuf/ptypes/empty"
"golang.org/x/net/context"
)
var emptyResponse = &google_protobuf.Empty{}
type service struct {
init *process
}
func (s *service) Create(ctx context.Context, r *shim.CreateRequest) (*shim.CreateResponse, error) {
process, err := newProcess(r.ID, r.Bundle, r.Runtime)
if err != nil {
return nil, err
}
s.init = process
if err := process.create(false); err != nil {
return nil, err
}
return &shim.CreateResponse{
Pid: uint32(process.pid()),
}, nil
}
func (s *service) Start(ctx context.Context, r *shim.StartRequest) (*google_protobuf.Empty, error) {
if err := s.init.start(); err != nil {
return nil, err
}
return emptyResponse, nil
}
func (s *service) Delete(ctx context.Context, r *shim.DeleteRequest) (*shim.DeleteResponse, error) {
// TODO: error when container has not stopped
err := s.init.killAll()
s.init.Wait()
if derr := s.init.delete(); err == nil {
err = derr
}
if cerr := s.init.Close(); err == nil {
err = cerr
}
return &shim.DeleteResponse{
ExitStatus: uint32(s.init.exitStatus),
}, err
}
func (s *service) Exec(ctx context.Context, r *shim.ExecRequest) (*shim.ExecResponse, error) {
return nil, nil
}
func (s *service) Pty(ctx context.Context, r *shim.PtyRequest) (*google_protobuf.Empty, error) {
if s.init.console == nil {
return emptyResponse, nil
}
ws := term.Winsize{
Width: uint16(r.Width),
Height: uint16(r.Height),
}
if err := term.SetWinsize(s.init.console.Fd(), &ws); err != nil {
return nil, err
}
return emptyResponse, nil
}
func (s *service) processExited(e utils.Exit) error {
if s.init.pid() == e.Pid {
s.init.setExited(e.Status)
}
return nil
}