mirror of https://github.com/docker/cli.git
349 lines
10 KiB
Go
349 lines
10 KiB
Go
|
package containerizedengine
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"context"
|
||
|
"syscall"
|
||
|
|
||
|
"github.com/containerd/containerd"
|
||
|
containerdtypes "github.com/containerd/containerd/api/types"
|
||
|
"github.com/containerd/containerd/cio"
|
||
|
"github.com/containerd/containerd/containers"
|
||
|
"github.com/containerd/containerd/content"
|
||
|
"github.com/containerd/containerd/oci"
|
||
|
prototypes "github.com/gogo/protobuf/types"
|
||
|
"github.com/opencontainers/go-digest"
|
||
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||
|
"github.com/opencontainers/runtime-spec/specs-go"
|
||
|
)
|
||
|
|
||
|
type (
|
||
|
fakeContainerdClient struct {
|
||
|
containersFunc func(ctx context.Context, filters ...string) ([]containerd.Container, error)
|
||
|
newContainerFunc func(ctx context.Context, id string, opts ...containerd.NewContainerOpts) (containerd.Container, error)
|
||
|
pullFunc func(ctx context.Context, ref string, opts ...containerd.RemoteOpt) (containerd.Image, error)
|
||
|
getImageFunc func(ctx context.Context, ref string) (containerd.Image, error)
|
||
|
contentStoreFunc func() content.Store
|
||
|
containerServiceFunc func() containers.Store
|
||
|
}
|
||
|
fakeContainer struct {
|
||
|
idFunc func() string
|
||
|
infoFunc func(context.Context) (containers.Container, error)
|
||
|
deleteFunc func(context.Context, ...containerd.DeleteOpts) error
|
||
|
newTaskFunc func(context.Context, cio.Creator, ...containerd.NewTaskOpts) (containerd.Task, error)
|
||
|
specFunc func(context.Context) (*oci.Spec, error)
|
||
|
taskFunc func(context.Context, cio.Attach) (containerd.Task, error)
|
||
|
imageFunc func(context.Context) (containerd.Image, error)
|
||
|
labelsFunc func(context.Context) (map[string]string, error)
|
||
|
setLabelsFunc func(context.Context, map[string]string) (map[string]string, error)
|
||
|
extensionsFunc func(context.Context) (map[string]prototypes.Any, error)
|
||
|
updateFunc func(context.Context, ...containerd.UpdateContainerOpts) error
|
||
|
}
|
||
|
fakeImage struct {
|
||
|
nameFunc func() string
|
||
|
targetFunc func() ocispec.Descriptor
|
||
|
unpackFunc func(context.Context, string) error
|
||
|
rootFSFunc func(ctx context.Context) ([]digest.Digest, error)
|
||
|
sizeFunc func(ctx context.Context) (int64, error)
|
||
|
configFunc func(ctx context.Context) (ocispec.Descriptor, error)
|
||
|
isUnpackedFunc func(context.Context, string) (bool, error)
|
||
|
contentStoreFunc func() content.Store
|
||
|
}
|
||
|
fakeTask struct {
|
||
|
idFunc func() string
|
||
|
pidFunc func() uint32
|
||
|
startFunc func(context.Context) error
|
||
|
deleteFunc func(context.Context, ...containerd.ProcessDeleteOpts) (*containerd.ExitStatus, error)
|
||
|
killFunc func(context.Context, syscall.Signal, ...containerd.KillOpts) error
|
||
|
waitFunc func(context.Context) (<-chan containerd.ExitStatus, error)
|
||
|
closeIOFunc func(context.Context, ...containerd.IOCloserOpts) error
|
||
|
resizeFunc func(ctx context.Context, w, h uint32) error
|
||
|
ioFunc func() cio.IO
|
||
|
statusFunc func(context.Context) (containerd.Status, error)
|
||
|
pauseFunc func(context.Context) error
|
||
|
resumeFunc func(context.Context) error
|
||
|
execFunc func(context.Context, string, *specs.Process, cio.Creator) (containerd.Process, error)
|
||
|
pidsFunc func(context.Context) ([]containerd.ProcessInfo, error)
|
||
|
checkpointFunc func(context.Context, ...containerd.CheckpointTaskOpts) (containerd.Image, error)
|
||
|
updateFunc func(context.Context, ...containerd.UpdateTaskOpts) error
|
||
|
loadProcessFunc func(context.Context, string, cio.Attach) (containerd.Process, error)
|
||
|
metricsFunc func(context.Context) (*containerdtypes.Metric, error)
|
||
|
}
|
||
|
|
||
|
testOutStream struct {
|
||
|
bytes.Buffer
|
||
|
}
|
||
|
)
|
||
|
|
||
|
func (w *fakeContainerdClient) Containers(ctx context.Context, filters ...string) ([]containerd.Container, error) {
|
||
|
if w.containersFunc != nil {
|
||
|
return w.containersFunc(ctx, filters...)
|
||
|
}
|
||
|
return []containerd.Container{}, nil
|
||
|
}
|
||
|
func (w *fakeContainerdClient) NewContainer(ctx context.Context, id string, opts ...containerd.NewContainerOpts) (containerd.Container, error) {
|
||
|
if w.newContainerFunc != nil {
|
||
|
return w.newContainerFunc(ctx, id, opts...)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (w *fakeContainerdClient) Pull(ctx context.Context, ref string, opts ...containerd.RemoteOpt) (containerd.Image, error) {
|
||
|
if w.pullFunc != nil {
|
||
|
return w.pullFunc(ctx, ref, opts...)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (w *fakeContainerdClient) GetImage(ctx context.Context, ref string) (containerd.Image, error) {
|
||
|
if w.getImageFunc != nil {
|
||
|
return w.getImageFunc(ctx, ref)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (w *fakeContainerdClient) ContentStore() content.Store {
|
||
|
if w.contentStoreFunc != nil {
|
||
|
return w.contentStoreFunc()
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
func (w *fakeContainerdClient) ContainerService() containers.Store {
|
||
|
if w.containerServiceFunc != nil {
|
||
|
return w.containerServiceFunc()
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
func (w *fakeContainerdClient) Close() error {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (c *fakeContainer) ID() string {
|
||
|
if c.idFunc != nil {
|
||
|
return c.idFunc()
|
||
|
}
|
||
|
return ""
|
||
|
}
|
||
|
func (c *fakeContainer) Info(ctx context.Context) (containers.Container, error) {
|
||
|
if c.infoFunc != nil {
|
||
|
return c.infoFunc(ctx)
|
||
|
}
|
||
|
return containers.Container{}, nil
|
||
|
}
|
||
|
func (c *fakeContainer) Delete(ctx context.Context, opts ...containerd.DeleteOpts) error {
|
||
|
if c.deleteFunc != nil {
|
||
|
return c.deleteFunc(ctx, opts...)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
func (c *fakeContainer) NewTask(ctx context.Context, ioc cio.Creator, opts ...containerd.NewTaskOpts) (containerd.Task, error) {
|
||
|
if c.newTaskFunc != nil {
|
||
|
return c.newTaskFunc(ctx, ioc, opts...)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (c *fakeContainer) Spec(ctx context.Context) (*oci.Spec, error) {
|
||
|
if c.specFunc != nil {
|
||
|
return c.specFunc(ctx)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (c *fakeContainer) Task(ctx context.Context, attach cio.Attach) (containerd.Task, error) {
|
||
|
if c.taskFunc != nil {
|
||
|
return c.taskFunc(ctx, attach)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (c *fakeContainer) Image(ctx context.Context) (containerd.Image, error) {
|
||
|
if c.imageFunc != nil {
|
||
|
return c.imageFunc(ctx)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (c *fakeContainer) Labels(ctx context.Context) (map[string]string, error) {
|
||
|
if c.labelsFunc != nil {
|
||
|
return c.labelsFunc(ctx)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (c *fakeContainer) SetLabels(ctx context.Context, labels map[string]string) (map[string]string, error) {
|
||
|
if c.setLabelsFunc != nil {
|
||
|
return c.setLabelsFunc(ctx, labels)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (c *fakeContainer) Extensions(ctx context.Context) (map[string]prototypes.Any, error) {
|
||
|
if c.extensionsFunc != nil {
|
||
|
return c.extensionsFunc(ctx)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (c *fakeContainer) Update(ctx context.Context, opts ...containerd.UpdateContainerOpts) error {
|
||
|
if c.updateFunc != nil {
|
||
|
return c.updateFunc(ctx, opts...)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (i *fakeImage) Name() string {
|
||
|
if i.nameFunc != nil {
|
||
|
return i.nameFunc()
|
||
|
}
|
||
|
return ""
|
||
|
}
|
||
|
func (i *fakeImage) Target() ocispec.Descriptor {
|
||
|
if i.targetFunc != nil {
|
||
|
return i.targetFunc()
|
||
|
}
|
||
|
return ocispec.Descriptor{}
|
||
|
}
|
||
|
func (i *fakeImage) Unpack(ctx context.Context, name string) error {
|
||
|
if i.unpackFunc != nil {
|
||
|
return i.unpackFunc(ctx, name)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
func (i *fakeImage) RootFS(ctx context.Context) ([]digest.Digest, error) {
|
||
|
if i.rootFSFunc != nil {
|
||
|
return i.rootFSFunc(ctx)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (i *fakeImage) Size(ctx context.Context) (int64, error) {
|
||
|
if i.sizeFunc != nil {
|
||
|
return i.sizeFunc(ctx)
|
||
|
}
|
||
|
return 0, nil
|
||
|
}
|
||
|
func (i *fakeImage) Config(ctx context.Context) (ocispec.Descriptor, error) {
|
||
|
if i.configFunc != nil {
|
||
|
return i.configFunc(ctx)
|
||
|
}
|
||
|
return ocispec.Descriptor{}, nil
|
||
|
}
|
||
|
func (i *fakeImage) IsUnpacked(ctx context.Context, name string) (bool, error) {
|
||
|
if i.isUnpackedFunc != nil {
|
||
|
return i.isUnpackedFunc(ctx, name)
|
||
|
}
|
||
|
return false, nil
|
||
|
}
|
||
|
func (i *fakeImage) ContentStore() content.Store {
|
||
|
if i.contentStoreFunc != nil {
|
||
|
return i.contentStoreFunc()
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (t *fakeTask) ID() string {
|
||
|
if t.idFunc != nil {
|
||
|
return t.idFunc()
|
||
|
}
|
||
|
return ""
|
||
|
}
|
||
|
func (t *fakeTask) Pid() uint32 {
|
||
|
if t.pidFunc != nil {
|
||
|
return t.pidFunc()
|
||
|
}
|
||
|
return 0
|
||
|
}
|
||
|
func (t *fakeTask) Start(ctx context.Context) error {
|
||
|
if t.startFunc != nil {
|
||
|
return t.startFunc(ctx)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
func (t *fakeTask) Delete(ctx context.Context, opts ...containerd.ProcessDeleteOpts) (*containerd.ExitStatus, error) {
|
||
|
if t.deleteFunc != nil {
|
||
|
return t.deleteFunc(ctx, opts...)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (t *fakeTask) Kill(ctx context.Context, signal syscall.Signal, opts ...containerd.KillOpts) error {
|
||
|
if t.killFunc != nil {
|
||
|
return t.killFunc(ctx, signal, opts...)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
func (t *fakeTask) Wait(ctx context.Context) (<-chan containerd.ExitStatus, error) {
|
||
|
if t.waitFunc != nil {
|
||
|
return t.waitFunc(ctx)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (t *fakeTask) CloseIO(ctx context.Context, opts ...containerd.IOCloserOpts) error {
|
||
|
if t.closeIOFunc != nil {
|
||
|
return t.closeIOFunc(ctx, opts...)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
func (t *fakeTask) Resize(ctx context.Context, w, h uint32) error {
|
||
|
if t.resizeFunc != nil {
|
||
|
return t.resizeFunc(ctx, w, h)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
func (t *fakeTask) IO() cio.IO {
|
||
|
if t.ioFunc != nil {
|
||
|
return t.ioFunc()
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
func (t *fakeTask) Status(ctx context.Context) (containerd.Status, error) {
|
||
|
if t.statusFunc != nil {
|
||
|
return t.statusFunc(ctx)
|
||
|
}
|
||
|
return containerd.Status{}, nil
|
||
|
}
|
||
|
func (t *fakeTask) Pause(ctx context.Context) error {
|
||
|
if t.pauseFunc != nil {
|
||
|
return t.pauseFunc(ctx)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
func (t *fakeTask) Resume(ctx context.Context) error {
|
||
|
if t.resumeFunc != nil {
|
||
|
return t.resumeFunc(ctx)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
func (t *fakeTask) Exec(ctx context.Context, cmd string, proc *specs.Process, ioc cio.Creator) (containerd.Process, error) {
|
||
|
if t.execFunc != nil {
|
||
|
return t.execFunc(ctx, cmd, proc, ioc)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (t *fakeTask) Pids(ctx context.Context) ([]containerd.ProcessInfo, error) {
|
||
|
if t.pidsFunc != nil {
|
||
|
return t.pidsFunc(ctx)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (t *fakeTask) Checkpoint(ctx context.Context, opts ...containerd.CheckpointTaskOpts) (containerd.Image, error) {
|
||
|
if t.checkpointFunc != nil {
|
||
|
return t.checkpointFunc(ctx, opts...)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (t *fakeTask) Update(ctx context.Context, opts ...containerd.UpdateTaskOpts) error {
|
||
|
if t.updateFunc != nil {
|
||
|
return t.updateFunc(ctx, opts...)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
func (t *fakeTask) LoadProcess(ctx context.Context, name string, attach cio.Attach) (containerd.Process, error) {
|
||
|
if t.loadProcessFunc != nil {
|
||
|
return t.loadProcessFunc(ctx, name, attach)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
func (t *fakeTask) Metrics(ctx context.Context) (*containerdtypes.Metric, error) {
|
||
|
if t.metricsFunc != nil {
|
||
|
return t.metricsFunc(ctx)
|
||
|
}
|
||
|
return nil, nil
|
||
|
}
|
||
|
|
||
|
func (o *testOutStream) FD() uintptr {
|
||
|
return 0
|
||
|
}
|
||
|
func (o *testOutStream) IsTerminal() bool {
|
||
|
return false
|
||
|
}
|