diff --git a/api/execution/execution.proto b/api/execution/execution.proto index 60e53e2..45e8396 100644 --- a/api/execution/execution.proto +++ b/api/execution/execution.proto @@ -38,3 +38,5 @@ message ListContainersRequest { message ListContainersResponse { repeated Container containers = 1; } + + diff --git a/cmd/containerd/main.go b/cmd/containerd/main.go index d4a0bd4..a19e702 100644 --- a/cmd/containerd/main.go +++ b/cmd/containerd/main.go @@ -13,6 +13,8 @@ import ( "github.com/Sirupsen/logrus" "github.com/docker/containerd" + api "github.com/docker/containerd/api/execution" + "github.com/docker/containerd/services/execution" metrics "github.com/docker/go-metrics" "github.com/urfave/cli" ) @@ -35,6 +37,16 @@ high performance container runtime Name: "debug", Usage: "enable debug output in logs", }, + cli.StringFlag{ + Name: "root", + Usage: "containerd state directory", + Value: "/run/containerd", + }, + cli.StringFlag{ + Name: "runtime", + Usage: "default runtime for execution", + Value: "runc", + }, cli.StringFlag{ Name: "socket, s", Usage: "socket path for containerd's GRPC server", @@ -69,7 +81,17 @@ high performance container runtime return err } + execService, err := execution.New(execution.Opts{ + Root: context.GlobalString("root"), + Runtime: context.GlobalString("runtime"), + }) + if err != nil { + return err + } + server := grpc.NewServer() + api.RegisterExecutionServiceServer(server, execService) + api.RegisterContainerServiceServer(server, execService) go serveGRPC(server, l) for s := range signals { diff --git a/execution.go b/execution.go deleted file mode 100644 index 3e7edce..0000000 --- a/execution.go +++ /dev/null @@ -1,13 +0,0 @@ -package containerd - -import "errors" - -var ErrProcessSet = errors.New("container process is already set") - -type Runtime interface { - Create(*Container) (ProcessDelegate, error) - Start(*Container) error - Delete(*Container) error - Exec(*Container, *Process) (ProcessDelegate, error) - Load(id string) (ProcessDelegate, error) -} diff --git a/executor.go b/executor.go new file mode 100644 index 0000000..4e8156d --- /dev/null +++ b/executor.go @@ -0,0 +1,15 @@ +package containerd + +import "errors" + +var ErrProcessSet = errors.New("container process is already set") + +type Executor interface { + List() ([]*Container, error) + Load(id string) (*Container, error) + + Create(CreateOpts) (*Container, error) + Start(string) error + Delete(string) error + Exec(string, *Process) (ProcessDelegate, error) +} diff --git a/executors/executors.go b/executors/executors.go new file mode 100644 index 0000000..374ce3f --- /dev/null +++ b/executors/executors.go @@ -0,0 +1,13 @@ +package executors + +import "github.com/docker/containerd" + +var executors = make(map[string]func() containerd.Executor) + +func Register(name string, e func() containerd.Executor) { + executors[name] = e +} + +func Get(name string) func() containerd.Executor { + return executors[name] +} diff --git a/execution/oci/oci.go b/executors/oci/oci.go similarity index 92% rename from execution/oci/oci.go rename to executors/oci/oci.go index 88bf452..2b5bca4 100644 --- a/execution/oci/oci.go +++ b/executors/oci/oci.go @@ -5,35 +5,28 @@ import ( "errors" "fmt" "io/ioutil" - "os" "os/exec" "path/filepath" "strconv" "time" "github.com/docker/containerd" + "github.com/docker/containerd/executors" ) var ErrRootEmpty = errors.New("oci: runtime root cannot be an empty string") -type Opts struct { - Name string - Root string - Args []string +func init() { + executors.Register("oci", New) + executors.Register("runc", New) } -func New(opts Opts) (*OCIRuntime, error) { - if opts.Root == "" { - return nil, ErrRootEmpty - } - if err := os.MkdirAll(opts.Root, 0711); err != nil { - return nil, err - } +func New() *OCIRuntime { return &OCIRuntime{ root: opts.Root, name: opts.Name, args: opts.Args, - }, nil + } } type OCIRuntime struct { diff --git a/execution/oci/process.go b/executors/oci/process.go similarity index 100% rename from execution/oci/process.go rename to executors/oci/process.go diff --git a/execution/shim/containerd-shim/console.go b/executors/shim/containerd-shim/console.go similarity index 100% rename from execution/shim/containerd-shim/console.go rename to executors/shim/containerd-shim/console.go diff --git a/execution/shim/containerd-shim/console_solaris.go b/executors/shim/containerd-shim/console_solaris.go similarity index 100% rename from execution/shim/containerd-shim/console_solaris.go rename to executors/shim/containerd-shim/console_solaris.go diff --git a/execution/shim/containerd-shim/example/config.json b/executors/shim/containerd-shim/example/config.json similarity index 100% rename from execution/shim/containerd-shim/example/config.json rename to executors/shim/containerd-shim/example/config.json diff --git a/execution/shim/containerd-shim/example/init/exit b/executors/shim/containerd-shim/example/init/exit similarity index 100% rename from execution/shim/containerd-shim/example/init/exit rename to executors/shim/containerd-shim/example/init/exit diff --git a/execution/shim/containerd-shim/example/init/pid b/executors/shim/containerd-shim/example/init/pid similarity index 100% rename from execution/shim/containerd-shim/example/init/pid rename to executors/shim/containerd-shim/example/init/pid diff --git a/execution/shim/containerd-shim/example/init/process.json b/executors/shim/containerd-shim/example/init/process.json similarity index 100% rename from execution/shim/containerd-shim/example/init/process.json rename to executors/shim/containerd-shim/example/init/process.json diff --git a/execution/shim/containerd-shim/example/init/resize b/executors/shim/containerd-shim/example/init/resize similarity index 100% rename from execution/shim/containerd-shim/example/init/resize rename to executors/shim/containerd-shim/example/init/resize diff --git a/execution/shim/containerd-shim/example/init/stderr b/executors/shim/containerd-shim/example/init/stderr similarity index 100% rename from execution/shim/containerd-shim/example/init/stderr rename to executors/shim/containerd-shim/example/init/stderr diff --git a/execution/shim/containerd-shim/example/init/stdin b/executors/shim/containerd-shim/example/init/stdin similarity index 100% rename from execution/shim/containerd-shim/example/init/stdin rename to executors/shim/containerd-shim/example/init/stdin diff --git a/execution/shim/containerd-shim/example/init/stdout b/executors/shim/containerd-shim/example/init/stdout similarity index 100% rename from execution/shim/containerd-shim/example/init/stdout rename to executors/shim/containerd-shim/example/init/stdout diff --git a/execution/shim/containerd-shim/example/logger/exit b/executors/shim/containerd-shim/example/logger/exit similarity index 100% rename from execution/shim/containerd-shim/example/logger/exit rename to executors/shim/containerd-shim/example/logger/exit diff --git a/execution/shim/containerd-shim/example/logger/pid b/executors/shim/containerd-shim/example/logger/pid similarity index 100% rename from execution/shim/containerd-shim/example/logger/pid rename to executors/shim/containerd-shim/example/logger/pid diff --git a/execution/shim/containerd-shim/example/logger/process.json b/executors/shim/containerd-shim/example/logger/process.json similarity index 100% rename from execution/shim/containerd-shim/example/logger/process.json rename to executors/shim/containerd-shim/example/logger/process.json diff --git a/execution/shim/containerd-shim/example/logger/resize b/executors/shim/containerd-shim/example/logger/resize similarity index 100% rename from execution/shim/containerd-shim/example/logger/resize rename to executors/shim/containerd-shim/example/logger/resize diff --git a/execution/shim/containerd-shim/example/logger/stderr b/executors/shim/containerd-shim/example/logger/stderr similarity index 100% rename from execution/shim/containerd-shim/example/logger/stderr rename to executors/shim/containerd-shim/example/logger/stderr diff --git a/execution/shim/containerd-shim/example/logger/stdin b/executors/shim/containerd-shim/example/logger/stdin similarity index 100% rename from execution/shim/containerd-shim/example/logger/stdin rename to executors/shim/containerd-shim/example/logger/stdin diff --git a/execution/shim/containerd-shim/example/logger/stdout b/executors/shim/containerd-shim/example/logger/stdout similarity index 100% rename from execution/shim/containerd-shim/example/logger/stdout rename to executors/shim/containerd-shim/example/logger/stdout diff --git a/execution/shim/containerd-shim/main.go b/executors/shim/containerd-shim/main.go similarity index 100% rename from execution/shim/containerd-shim/main.go rename to executors/shim/containerd-shim/main.go diff --git a/execution/shim/containerd-shim/process.go b/executors/shim/containerd-shim/process.go similarity index 100% rename from execution/shim/containerd-shim/process.go rename to executors/shim/containerd-shim/process.go diff --git a/execution/shim/containerd-shim/process_pdeathsig.go b/executors/shim/containerd-shim/process_pdeathsig.go similarity index 100% rename from execution/shim/containerd-shim/process_pdeathsig.go rename to executors/shim/containerd-shim/process_pdeathsig.go diff --git a/execution/shim/containerd-shim/process_pdeathsig_unsupported.go b/executors/shim/containerd-shim/process_pdeathsig_unsupported.go similarity index 100% rename from execution/shim/containerd-shim/process_pdeathsig_unsupported.go rename to executors/shim/containerd-shim/process_pdeathsig_unsupported.go diff --git a/execution/shim/process.go b/executors/shim/process.go similarity index 100% rename from execution/shim/process.go rename to executors/shim/process.go diff --git a/execution/shim/shim.go b/executors/shim/shim.go similarity index 100% rename from execution/shim/shim.go rename to executors/shim/shim.go diff --git a/services/execution/service.go b/services/execution/service.go new file mode 100644 index 0000000..7cbf85c --- /dev/null +++ b/services/execution/service.go @@ -0,0 +1,67 @@ +package execution + +import ( + "context" + + "github.com/docker/containerd" + api "github.com/docker/containerd/api/execution" + "github.com/docker/containerd/executors" +) + +type Opts struct { + Root string + Runtime string +} + +func New(o Opts) (*Service, error) { + executor, err := executors.Get(o.Runtime)(o.Root) + if err != nil { + return nil, err + } + return &Service{ + o: o, + executor: executor, + }, nil +} + +type Service struct { + o Opts + executor containerd.Executor +} + +func (s *Service) Create(ctx context.Context, r *api.CreateContainerRequest) (*api.CreateContainerResponse, error) { + // TODO: write io and bundle path to dir + container, err := s.executor.Create(r.ID, r.BundlePath, &IO{}) + if err != nil { + return nil, err + } + + s.supervisor.Add(container.Process()) + + return &api.CreateContainerResponse{ + Container: toGRPCContainer(container), + }, nil +} + +func (s *Service) Delete(ctx context.Context, r *api.DeleteContainerRequest) (*api.Empty, error) { + if err := s.executor.Delete(r.ID); err != nil { + return nil, err + } + return nil, nil +} + +func (s *Service) List(ctx context.Context, r *api.ListContainerRequest) (*api.ListContainerResponse, error) { + containers, err := s.executor.List() + if err != nil { + return nil, err + } + for _, c := range containers { + r.Containers = append(r.Containers, toGRPCContainer(c)) + } + return r, nil +} + +var ( + _ = (api.ExecutionServiceServer)(&Service{}) + _ = (api.ContainerServiceServer)(&Service{}) +)