Add basic bundle, spec, and config types
Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
parent
0808a5c485
commit
dd39b4dcf0
3 changed files with 150 additions and 0 deletions
62
bundle/bundle.go
Normal file
62
bundle/bundle.go
Normal file
|
@ -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)
|
||||
}
|
18
config.go
Normal file
18
config.go
Normal file
|
@ -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
|
||||
}
|
70
specification/spec.go
Normal file
70
specification/spec.go
Normal file
|
@ -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
|
||||
}
|
Loading…
Reference in a new issue