ffc4c570af
Signed-off-by: Ma Shimiao <mashimiao.fnst@cn.fujitsu.com>
70 lines
1.2 KiB
Go
70 lines
1.2 KiB
Go
package bundle
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/opencontainers/runtime-spec/specs-go"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
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) {
|
|
fi, err := os.Stat(path)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "failed to access %q", path)
|
|
}
|
|
if !fi.IsDir() {
|
|
return nil, errors.Errorf("%q is not a directory", path)
|
|
}
|
|
|
|
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)
|
|
}
|