Permalink
Browse files

Add basic bundle, spec, and config types

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
1 parent 0808a5c commit dd39b4dcf0207681dc5374d5d0283ab909e81a98 @crosbymichael crosbymichael committed Dec 9, 2016
Showing with 150 additions and 0 deletions.
  1. +62 −0 bundle/bundle.go
  2. +18 −0 config.go
  3. +70 −0 specification/spec.go
View
@@ -0,0 +1,62 @@
+package bundle
+
+import (
+ "encoding/json"
+ "os"
+ "path/filepath"
+
+ "github.com/opencontainers/runtime-spec/specs-go"
+)
+
+const configName = "config.json"
+
+func New(path string, s *specs.Spec) (*Bundle, error) {
+ if err := os.Mkdir(path, 0700); err != nil {
+ return nil, err
+ }
+ b := &Bundle{
+ Path: path,
+ }
+ if err := os.Mkdir(filepath.Join(path, "rootfs"), 0700); err != nil {
+ b.Delete()
+ return nil, err
+ }
+ f, err := os.Create(filepath.Join(path, configName))
+ if err != nil {
+ b.Delete()
+ return nil, err
+ }
+ err = json.NewEncoder(f).Encode(s)
+ f.Close()
+ if err != nil {
+ b.Delete()
+ return nil, err
+ }
+ return b, nil
+}
+
+func Load(path string) (*Bundle, error) {
+ // TODO: do validation
+ return &Bundle{
+ Path: path,
+ }, nil
+}
+
+type Bundle struct {
+ Path string
+}
+
+func (b *Bundle) Config() (*specs.Spec, error) {
+ var s specs.Spec
+ f, err := os.Open(filepath.Join(b.Path, configName))
+ if err != nil {
+ return nil, err
+ }
+ err = json.NewDecoder(f).Decode(&s)
+ f.Close()
+ return &s, err
+}
+
+func (b *Bundle) Delete() error {
+ return os.RemoveAll(b.Path)
+}
View
@@ -0,0 +1,18 @@
+package containerd
+
+type Process struct {
+ Args []string
+ Env []string
+ Cwd string
+ Uid int
+ Gid int
+ TTY bool
+}
+
+type Config struct {
+ Process Process
+ Hostname string
+ Domain string
+ Labels map[string]string
+ StopSignal int
+}
View
@@ -0,0 +1,70 @@
+package specification
+
+import (
+ "runtime"
+
+ "github.com/docker/containerd"
+ "github.com/opencontainers/runtime-spec/specs-go"
+)
+
+var rwm = "rwm"
+
+func Default(config containerd.Config, mounts []containerd.Mount) *specs.Spec {
+ s := &specs.Spec{
+ Version: specs.Version,
+ Platform: specs.Platform{
+ OS: runtime.GOOS,
+ Arch: runtime.GOARCH,
+ },
+ Root: specs.Root{
+ Path: "rootfs",
+ Readonly: false,
+ },
+ Process: specs.Process{
+ Args: config.Process.Args,
+ Env: config.Process.Env,
+ Terminal: config.Process.TTY,
+ Cwd: config.Process.Cwd,
+ NoNewPrivileges: true,
+ },
+ Hostname: config.Hostname,
+ Linux: &specs.Linux{
+ Resources: &specs.LinuxResources{
+ Devices: []specs.LinuxDeviceCgroup{
+ {
+ Allow: false,
+ Access: &rwm,
+ },
+ },
+ },
+ Namespaces: []specs.LinuxNamespace{
+ {
+ Type: "pid",
+ },
+ {
+ Type: "ipc",
+ },
+ {
+ Type: "uts",
+ },
+ {
+ Type: "mount",
+ },
+ {
+ Type: "network",
+ },
+ },
+ },
+ Annotations: config.Labels,
+ }
+ // apply snapshot mounts
+ for _, m := range mounts {
+ s.Mounts = append(s.Mounts, specs.Mount{
+ Source: m.Source,
+ Destination: "/",
+ Type: m.Type,
+ Options: m.Options,
+ })
+ }
+ return s
+}

0 comments on commit dd39b4d

Please sign in to comment.