|
|
@@ -32,6 +32,11 @@ import (
|
|
|
|
"k8s.io/kubernetes/pkg/api"
|
|
|
|
"k8s.io/kubernetes/pkg/api"
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type calledDetail struct {
|
|
|
|
|
|
|
|
name string
|
|
|
|
|
|
|
|
arguments []interface{}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// FakeDockerClient is a simple fake docker client, so that kubelet can be run for testing without requiring a real docker setup.
|
|
|
|
// FakeDockerClient is a simple fake docker client, so that kubelet can be run for testing without requiring a real docker setup.
|
|
|
|
type FakeDockerClient struct {
|
|
|
|
type FakeDockerClient struct {
|
|
|
|
sync.Mutex
|
|
|
|
sync.Mutex
|
|
|
@@ -41,7 +46,7 @@ type FakeDockerClient struct {
|
|
|
|
Image *dockertypes.ImageInspect
|
|
|
|
Image *dockertypes.ImageInspect
|
|
|
|
Images []dockertypes.Image
|
|
|
|
Images []dockertypes.Image
|
|
|
|
Errors map[string]error
|
|
|
|
Errors map[string]error
|
|
|
|
called []string
|
|
|
|
called []calledDetail
|
|
|
|
pulled []string
|
|
|
|
pulled []string
|
|
|
|
|
|
|
|
|
|
|
|
// Created, Stopped and Removed all container docker ID
|
|
|
|
// Created, Stopped and Removed all container docker ID
|
|
|
@@ -95,13 +100,21 @@ func (f *FakeDockerClient) ClearErrors() {
|
|
|
|
func (f *FakeDockerClient) ClearCalls() {
|
|
|
|
func (f *FakeDockerClient) ClearCalls() {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = []string{}
|
|
|
|
f.called = []calledDetail{}
|
|
|
|
f.Stopped = []string{}
|
|
|
|
f.Stopped = []string{}
|
|
|
|
f.pulled = []string{}
|
|
|
|
f.pulled = []string{}
|
|
|
|
f.Created = []string{}
|
|
|
|
f.Created = []string{}
|
|
|
|
f.Removed = []string{}
|
|
|
|
f.Removed = []string{}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (f *FakeDockerClient) getCalledNames() []string {
|
|
|
|
|
|
|
|
names := []string{}
|
|
|
|
|
|
|
|
for _, detail := range f.called {
|
|
|
|
|
|
|
|
names = append(names, detail.name)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return names
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Because the new data type returned by engine-api is too complex to manually initialize, we need a
|
|
|
|
// Because the new data type returned by engine-api is too complex to manually initialize, we need a
|
|
|
|
// fake container which is easier to initialize.
|
|
|
|
// fake container which is easier to initialize.
|
|
|
|
type FakeContainer struct {
|
|
|
|
type FakeContainer struct {
|
|
|
@@ -178,6 +191,17 @@ func (f *FakeDockerClient) AssertCalls(calls []string) (err error) {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if !reflect.DeepEqual(calls, f.getCalledNames()) {
|
|
|
|
|
|
|
|
err = fmt.Errorf("expected %#v, got %#v", calls, f.getCalledNames())
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (f *FakeDockerClient) AssertCallDetails(calls []calledDetail) (err error) {
|
|
|
|
|
|
|
|
f.Lock()
|
|
|
|
|
|
|
|
defer f.Unlock()
|
|
|
|
|
|
|
|
|
|
|
|
if !reflect.DeepEqual(calls, f.called) {
|
|
|
|
if !reflect.DeepEqual(calls, f.called) {
|
|
|
|
err = fmt.Errorf("expected %#v, got %#v", calls, f.called)
|
|
|
|
err = fmt.Errorf("expected %#v, got %#v", calls, f.called)
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -216,24 +240,6 @@ func (f *FakeDockerClient) AssertStopped(stopped []string) error {
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (f *FakeDockerClient) AssertUnorderedCalls(calls []string) (err error) {
|
|
|
|
|
|
|
|
f.Lock()
|
|
|
|
|
|
|
|
defer f.Unlock()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expected := make([]string, len(calls))
|
|
|
|
|
|
|
|
actual := make([]string, len(f.called))
|
|
|
|
|
|
|
|
copy(expected, calls)
|
|
|
|
|
|
|
|
copy(actual, f.called)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sort.StringSlice(expected).Sort()
|
|
|
|
|
|
|
|
sort.StringSlice(actual).Sort()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if !reflect.DeepEqual(actual, expected) {
|
|
|
|
|
|
|
|
err = fmt.Errorf("expected(sorted) %#v, got(sorted) %#v", expected, actual)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (f *FakeDockerClient) popError(op string) error {
|
|
|
|
func (f *FakeDockerClient) popError(op string) error {
|
|
|
|
if f.Errors == nil {
|
|
|
|
if f.Errors == nil {
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
@@ -252,7 +258,7 @@ func (f *FakeDockerClient) popError(op string) error {
|
|
|
|
func (f *FakeDockerClient) ListContainers(options dockertypes.ContainerListOptions) ([]dockertypes.Container, error) {
|
|
|
|
func (f *FakeDockerClient) ListContainers(options dockertypes.ContainerListOptions) ([]dockertypes.Container, error) {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = append(f.called, "list")
|
|
|
|
f.called = append(f.called, calledDetail{name: "list"})
|
|
|
|
err := f.popError("list")
|
|
|
|
err := f.popError("list")
|
|
|
|
containerList := append([]dockertypes.Container{}, f.RunningContainerList...)
|
|
|
|
containerList := append([]dockertypes.Container{}, f.RunningContainerList...)
|
|
|
|
if options.All {
|
|
|
|
if options.All {
|
|
|
@@ -269,7 +275,7 @@ func (f *FakeDockerClient) ListContainers(options dockertypes.ContainerListOptio
|
|
|
|
func (f *FakeDockerClient) InspectContainer(id string) (*dockertypes.ContainerJSON, error) {
|
|
|
|
func (f *FakeDockerClient) InspectContainer(id string) (*dockertypes.ContainerJSON, error) {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = append(f.called, "inspect_container")
|
|
|
|
f.called = append(f.called, calledDetail{name: "inspect_container"})
|
|
|
|
err := f.popError("inspect_container")
|
|
|
|
err := f.popError("inspect_container")
|
|
|
|
if container, ok := f.ContainerMap[id]; ok {
|
|
|
|
if container, ok := f.ContainerMap[id]; ok {
|
|
|
|
return container, err
|
|
|
|
return container, err
|
|
|
@@ -282,7 +288,7 @@ func (f *FakeDockerClient) InspectContainer(id string) (*dockertypes.ContainerJS
|
|
|
|
func (f *FakeDockerClient) InspectImage(name string) (*dockertypes.ImageInspect, error) {
|
|
|
|
func (f *FakeDockerClient) InspectImage(name string) (*dockertypes.ImageInspect, error) {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = append(f.called, "inspect_image")
|
|
|
|
f.called = append(f.called, calledDetail{name: "inspect_image"})
|
|
|
|
err := f.popError("inspect_image")
|
|
|
|
err := f.popError("inspect_image")
|
|
|
|
return f.Image, err
|
|
|
|
return f.Image, err
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -306,7 +312,7 @@ func (f *FakeDockerClient) normalSleep(mean, stdDev, cutOffMillis int) {
|
|
|
|
func (f *FakeDockerClient) CreateContainer(c dockertypes.ContainerCreateConfig) (*dockertypes.ContainerCreateResponse, error) {
|
|
|
|
func (f *FakeDockerClient) CreateContainer(c dockertypes.ContainerCreateConfig) (*dockertypes.ContainerCreateResponse, error) {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = append(f.called, "create")
|
|
|
|
f.called = append(f.called, calledDetail{name: "create"})
|
|
|
|
if err := f.popError("create"); err != nil {
|
|
|
|
if err := f.popError("create"); err != nil {
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -329,7 +335,7 @@ func (f *FakeDockerClient) CreateContainer(c dockertypes.ContainerCreateConfig)
|
|
|
|
func (f *FakeDockerClient) StartContainer(id string) error {
|
|
|
|
func (f *FakeDockerClient) StartContainer(id string) error {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = append(f.called, "start")
|
|
|
|
f.called = append(f.called, calledDetail{name: "start"})
|
|
|
|
if err := f.popError("start"); err != nil {
|
|
|
|
if err := f.popError("start"); err != nil {
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -352,7 +358,7 @@ func (f *FakeDockerClient) StartContainer(id string) error {
|
|
|
|
func (f *FakeDockerClient) StopContainer(id string, timeout int) error {
|
|
|
|
func (f *FakeDockerClient) StopContainer(id string, timeout int) error {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = append(f.called, "stop")
|
|
|
|
f.called = append(f.called, calledDetail{name: "stop"})
|
|
|
|
if err := f.popError("stop"); err != nil {
|
|
|
|
if err := f.popError("stop"); err != nil {
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -390,7 +396,7 @@ func (f *FakeDockerClient) StopContainer(id string, timeout int) error {
|
|
|
|
func (f *FakeDockerClient) RemoveContainer(id string, opts dockertypes.ContainerRemoveOptions) error {
|
|
|
|
func (f *FakeDockerClient) RemoveContainer(id string, opts dockertypes.ContainerRemoveOptions) error {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = append(f.called, "remove")
|
|
|
|
f.called = append(f.called, calledDetail{name: "remove"})
|
|
|
|
err := f.popError("remove")
|
|
|
|
err := f.popError("remove")
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return err
|
|
|
@@ -413,7 +419,7 @@ func (f *FakeDockerClient) RemoveContainer(id string, opts dockertypes.Container
|
|
|
|
func (f *FakeDockerClient) Logs(id string, opts dockertypes.ContainerLogsOptions, sopts StreamOptions) error {
|
|
|
|
func (f *FakeDockerClient) Logs(id string, opts dockertypes.ContainerLogsOptions, sopts StreamOptions) error {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = append(f.called, "logs")
|
|
|
|
f.called = append(f.called, calledDetail{name: "logs"})
|
|
|
|
return f.popError("logs")
|
|
|
|
return f.popError("logs")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@@ -422,7 +428,7 @@ func (f *FakeDockerClient) Logs(id string, opts dockertypes.ContainerLogsOptions
|
|
|
|
func (f *FakeDockerClient) PullImage(image string, auth dockertypes.AuthConfig, opts dockertypes.ImagePullOptions) error {
|
|
|
|
func (f *FakeDockerClient) PullImage(image string, auth dockertypes.AuthConfig, opts dockertypes.ImagePullOptions) error {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = append(f.called, "pull")
|
|
|
|
f.called = append(f.called, calledDetail{name: "pull"})
|
|
|
|
err := f.popError("pull")
|
|
|
|
err := f.popError("pull")
|
|
|
|
if err == nil {
|
|
|
|
if err == nil {
|
|
|
|
authJson, _ := json.Marshal(auth)
|
|
|
|
authJson, _ := json.Marshal(auth)
|
|
|
@@ -445,21 +451,21 @@ func (f *FakeDockerClient) CreateExec(id string, opts dockertypes.ExecConfig) (*
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.execCmd = opts.Cmd
|
|
|
|
f.execCmd = opts.Cmd
|
|
|
|
f.called = append(f.called, "create_exec")
|
|
|
|
f.called = append(f.called, calledDetail{name: "create_exec"})
|
|
|
|
return &dockertypes.ContainerExecCreateResponse{ID: "12345678"}, nil
|
|
|
|
return &dockertypes.ContainerExecCreateResponse{ID: "12345678"}, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (f *FakeDockerClient) StartExec(startExec string, opts dockertypes.ExecStartCheck, sopts StreamOptions) error {
|
|
|
|
func (f *FakeDockerClient) StartExec(startExec string, opts dockertypes.ExecStartCheck, sopts StreamOptions) error {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = append(f.called, "start_exec")
|
|
|
|
f.called = append(f.called, calledDetail{name: "start_exec"})
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (f *FakeDockerClient) AttachToContainer(id string, opts dockertypes.ContainerAttachOptions, sopts StreamOptions) error {
|
|
|
|
func (f *FakeDockerClient) AttachToContainer(id string, opts dockertypes.ContainerAttachOptions, sopts StreamOptions) error {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = append(f.called, "attach")
|
|
|
|
f.called = append(f.called, calledDetail{name: "attach"})
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@@ -468,12 +474,13 @@ func (f *FakeDockerClient) InspectExec(id string) (*dockertypes.ContainerExecIns
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (f *FakeDockerClient) ListImages(opts dockertypes.ImageListOptions) ([]dockertypes.Image, error) {
|
|
|
|
func (f *FakeDockerClient) ListImages(opts dockertypes.ImageListOptions) ([]dockertypes.Image, error) {
|
|
|
|
f.called = append(f.called, "list_images")
|
|
|
|
f.called = append(f.called, calledDetail{name: "list_images"})
|
|
|
|
err := f.popError("list_images")
|
|
|
|
err := f.popError("list_images")
|
|
|
|
return f.Images, err
|
|
|
|
return f.Images, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (f *FakeDockerClient) RemoveImage(image string, opts dockertypes.ImageRemoveOptions) ([]dockertypes.ImageDelete, error) {
|
|
|
|
func (f *FakeDockerClient) RemoveImage(image string, opts dockertypes.ImageRemoveOptions) ([]dockertypes.ImageDelete, error) {
|
|
|
|
|
|
|
|
f.called = append(f.called, calledDetail{name: "remove_image", arguments: []interface{}{image, opts}})
|
|
|
|
err := f.popError("remove_image")
|
|
|
|
err := f.popError("remove_image")
|
|
|
|
if err == nil {
|
|
|
|
if err == nil {
|
|
|
|
for i := range f.Images {
|
|
|
|
for i := range f.Images {
|
|
|
@@ -503,14 +510,14 @@ func (f *FakeDockerClient) updateContainerStatus(id, status string) {
|
|
|
|
func (f *FakeDockerClient) ResizeExecTTY(id string, height, width int) error {
|
|
|
|
func (f *FakeDockerClient) ResizeExecTTY(id string, height, width int) error {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = append(f.called, "resize_exec")
|
|
|
|
f.called = append(f.called, calledDetail{name: "resize_exec"})
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (f *FakeDockerClient) ResizeContainerTTY(id string, height, width int) error {
|
|
|
|
func (f *FakeDockerClient) ResizeContainerTTY(id string, height, width int) error {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = append(f.called, "resize_container")
|
|
|
|
f.called = append(f.called, calledDetail{name: "resize_container"})
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@@ -555,7 +562,7 @@ func (f *FakeDockerPuller) IsImagePresent(name string) (bool, error) {
|
|
|
|
func (f *FakeDockerClient) ImageHistory(id string) ([]dockertypes.ImageHistory, error) {
|
|
|
|
func (f *FakeDockerClient) ImageHistory(id string) ([]dockertypes.ImageHistory, error) {
|
|
|
|
f.Lock()
|
|
|
|
f.Lock()
|
|
|
|
defer f.Unlock()
|
|
|
|
defer f.Unlock()
|
|
|
|
f.called = append(f.called, "image_history")
|
|
|
|
f.called = append(f.called, calledDetail{name: "image_history"})
|
|
|
|
history := f.ImageHistoryMap[id]
|
|
|
|
history := f.ImageHistoryMap[id]
|
|
|
|
return history, nil
|
|
|
|
return history, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|