Start work on Container and Process model

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
Michael Crosby 2016-12-02 15:37:16 -08:00
parent 6641888667
commit 32bf0f69fd
38 changed files with 525 additions and 353 deletions

View file

@ -3,8 +3,8 @@ package execution
import (
"context"
"github.com/docker/containerd"
api "github.com/docker/containerd/api/execution"
"github.com/docker/containerd/execution"
"github.com/docker/containerd/executors"
)
@ -14,10 +14,7 @@ type Opts struct {
}
func New(o Opts) (*Service, error) {
executor, err := executors.Get(o.Runtime)(o.Root)
if err != nil {
return nil, err
}
executor := executors.Get(o.Runtime)(o.Root)
return &Service{
o: o,
executor: executor,
@ -26,7 +23,7 @@ func New(o Opts) (*Service, error) {
type Service struct {
o Opts
executor containerd.Executor
executor execution.Executor
}
func (s *Service) Create(ctx context.Context, r *api.CreateContainerRequest) (*api.CreateContainerResponse, error) {
@ -36,7 +33,7 @@ func (s *Service) Create(ctx context.Context, r *api.CreateContainerRequest) (*a
return nil, err
}
s.supervisor.Add(container.Process())
s.supervisor.Add(container.InitProcess())
return &api.CreateContainerResponse{
Container: toGRPCContainer(container),
@ -60,6 +57,123 @@ func (s *Service) List(ctx context.Context, r *api.ListContainerRequest) (*api.L
}
return r, nil
}
func (s *Service) Get(ctx context.Context, r *api.GetContainerRequest) (*api.GetContainerResponse, error) {
container, err := s.executor.Load(r.ID)
if err != nil {
return nil, err
}
return &api.GetContainerResponse{
Container: toGRPCContainer(container),
}, nil
}
func (s *Service) Update(ctx context.Context, r *api.UpdateContainerRequest) (*api.Empty, error) {
return nil, nil
}
func (s *Service) Pause(ctx context.Context, r *api.PauseContainerRequest) (*api.Empty, error) {
container, err := s.executor.Load(r.ID)
if err != nil {
return nil, err
}
return nil, container.Pause()
}
func (s *Service) Resume(ctx context.Context, r *api.ResumeContainerRequest) (*api.Empty, error) {
container, err := s.executor.Load(r.ID)
if err != nil {
return nil, err
}
return nil, container.Resume()
}
func (s *Service) CreateProcess(ctx context.Context, r *api.CreateProcessRequest) (*api.CreateProcessResponse, error) {
container, err := s.executor.Load(r.ID)
if err != nil {
return nil, err
}
process, err := container.CreateProcess(r.Process)
if err != nil {
return nil, err
}
s.supervisor.Add(process)
r.Process.Pid = process.Pid()
return &api.CreateProcessResponse{
Process: r.Process,
}, nil
}
// containerd managed execs + system pids forked in container
func (s *Service) GetProcess(ctx context.Context, r *api.GetProcessRequest) (*api.GetProcessResponse, error) {
container, err := s.executor.Load(r.ID)
if err != nil {
return nil, err
}
process, err := container.Process(r.ProcessId)
if err != nil {
return nil, err
}
return &api.GetProcessResponse{
Process: process,
}, nil
}
func (s *Service) StartProcess(ctx context.Context, r *api.StartProcessRequest) (*api.StartProcessResponse, error) {
container, err := s.executor.Load(r.ID)
if err != nil {
return nil, err
}
process, err := container.Process(r.Process.ID)
if err != nil {
return nil, err
}
if err := process.Start(); err != nil {
return nil, err
}
return &api.StartProcessRequest{
Process: process,
}, nil
}
func (s *Service) SignalProcess(ctx context.Context, r *api.SignalProcessRequest) (*api.Empty, error) {
container, err := s.executor.Load(r.ID)
if err != nil {
return nil, err
}
process, err := container.Process(r.Process.ID)
if err != nil {
return nil, err
}
return nil, process.Signal(r.Signal)
}
func (s *Service) DeleteProcess(ctx context.Context, r *api.DeleteProcessRequest) (*api.Empty, error) {
container, err := s.executor.Load(r.ID)
if err != nil {
return nil, err
}
if err := container.DeleteProcess(r.Process.ID); err != nil {
return nil, err
}
return nil, nil
}
func (s *Service) ListProcesses(ctx context.Context, r *api.ListProcessesRequest) (*api.ListProcessesResponse, error) {
container, err := s.executor.Load(r.ID)
if err != nil {
return nil, err
}
processes, err := container.Processes()
if err != nil {
return nil, err
}
return &api.ListProcessesResponse{
Processes: processes,
}, nil
}
var (
_ = (api.ExecutionServiceServer)(&Service{})