
This moves the shim's API and protos out of the containerd services package and into the linux runtime package. This is because the shim is an implementation detail of the linux runtime that we have and it is not a containerd user facing api. Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
92 lines
2.0 KiB
Go
92 lines
2.0 KiB
Go
// +build linux
|
|
|
|
package linux
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"io"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
client "github.com/containerd/containerd/linux/shim"
|
|
)
|
|
|
|
func loadBundle(path, namespace string) *bundle {
|
|
return &bundle{
|
|
path: path,
|
|
namespace: namespace,
|
|
}
|
|
}
|
|
|
|
// newBundle creates a new bundle on disk at the provided path for the given id
|
|
func newBundle(path, namespace, id string, spec []byte) (b *bundle, err error) {
|
|
if err := os.MkdirAll(path, 0700); err != nil {
|
|
return nil, err
|
|
}
|
|
path = filepath.Join(path, id)
|
|
defer func() {
|
|
if err != nil {
|
|
os.RemoveAll(path)
|
|
}
|
|
}()
|
|
if err := os.Mkdir(path, 0700); err != nil {
|
|
return nil, err
|
|
}
|
|
if err := os.Mkdir(filepath.Join(path, "rootfs"), 0700); err != nil {
|
|
return nil, err
|
|
}
|
|
f, err := os.Create(filepath.Join(path, configFilename))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer f.Close()
|
|
_, err = io.Copy(f, bytes.NewReader(spec))
|
|
return &bundle{
|
|
path: path,
|
|
namespace: namespace,
|
|
}, err
|
|
}
|
|
|
|
type bundle struct {
|
|
path string
|
|
namespace string
|
|
}
|
|
|
|
// NewShim connects to the shim managing the bundle and tasks
|
|
func (b *bundle) NewShim(ctx context.Context, binary string, remote bool) (*client.Client, error) {
|
|
opt := client.WithStart(binary)
|
|
if !remote {
|
|
opt = client.WithLocal
|
|
}
|
|
return client.New(ctx, client.Config{
|
|
Address: filepath.Join(b.path, "shim.sock"),
|
|
Path: b.path,
|
|
Namespace: b.namespace,
|
|
}, opt)
|
|
}
|
|
|
|
// Connect reconnects to an existing shim
|
|
func (b *bundle) Connect(ctx context.Context, remote bool) (*client.Client, error) {
|
|
opt := client.WithConnect
|
|
if !remote {
|
|
opt = client.WithLocal
|
|
}
|
|
return client.New(ctx, client.Config{
|
|
Address: filepath.Join(b.path, "shim.sock"),
|
|
Path: b.path,
|
|
Namespace: b.namespace,
|
|
}, opt)
|
|
}
|
|
|
|
// spec returns the spec written to the bundle
|
|
func (b *bundle) Spec() ([]byte, error) {
|
|
return ioutil.ReadFile(filepath.Join(b.path, configFilename))
|
|
}
|
|
|
|
// Delete deletes the bundle from disk
|
|
func (b *bundle) Delete() error {
|
|
return os.RemoveAll(b.path)
|
|
}
|