Merge pull request #15079 from gmarek/fix-kubemark

Turn on smarter FakeDockerClient in HollowNode.
This commit is contained in:
Alex Robinson 2015-10-05 17:00:49 -07:00
commit 99936383b0
2 changed files with 94 additions and 76 deletions

View File

@ -107,6 +107,8 @@ func main() {
configFilePath := makeTempDirOrDie("config", testRootDir)
glog.Infof("Using %s as root dir for hollow-kubelet", testRootDir)
fakeDockerClient.VersionInfo = docker.Env{"ApiVersion=1.18"}
fakeDockerClient.ContainerMap = make(map[string]*docker.Container)
fakeDockerClient.EnableSleep = true
kcfg := kubeletapp.SimpleKubelet(
cl,
&fakeDockerClient,

View File

@ -19,6 +19,7 @@ package dockertools
import (
"encoding/json"
"fmt"
"math/rand"
"os"
"reflect"
"sort"
@ -52,6 +53,7 @@ type FakeDockerClient struct {
Information docker.Env
ExecInspect *docker.ExecInspect
execCmd []string
EnableSleep bool
}
func (f *FakeDockerClient) ClearCalls() {
@ -175,14 +177,29 @@ func (f *FakeDockerClient) InspectImage(name string) (*docker.Image, error) {
return f.Image, err
}
// Sleeps random amount of time with the normal distribution with given mean and stddev
// (in milliseconds), we never sleep less than cutOffMillis
func (f *FakeDockerClient) normalSleep(mean, stdDev, cutOffMillis int) {
if !f.EnableSleep {
return
}
cutoff := (time.Duration)(cutOffMillis) * time.Millisecond
delay := (time.Duration)(rand.NormFloat64()*float64(stdDev)+float64(mean)) * time.Millisecond
if delay < cutoff {
delay = cutoff
}
time.Sleep(delay)
}
// CreateContainer is a test-spy implementation of DockerInterface.CreateContainer.
// It adds an entry "create" to the internal method call record.
func (f *FakeDockerClient) CreateContainer(c docker.CreateContainerOptions) (*docker.Container, error) {
f.Lock()
defer f.Unlock()
f.called = append(f.called, "create")
err := f.popError("create")
if err == nil {
if err := f.popError("create"); err != nil {
return nil, err
}
f.Created = append(f.Created, c.Name)
// This is not a very good fake. We'll just add this container's name to the list.
// Docker likes to add a '/', so copy that behavior.
@ -193,10 +210,9 @@ func (f *FakeDockerClient) CreateContainer(c docker.CreateContainerOptions) (*do
containerCopy := container
f.ContainerMap[name] = &containerCopy
}
f.normalSleep(200, 50, 50)
return &container, nil
}
return nil, err
}
// StartContainer is a test-spy implementation of DockerInterface.StartContainer.
// It adds an entry "start" to the internal method call record.
@ -204,9 +220,9 @@ func (f *FakeDockerClient) StartContainer(id string, hostConfig *docker.HostConf
f.Lock()
defer f.Unlock()
f.called = append(f.called, "start")
err := f.popError("start")
if err == nil {
if err := f.popError("start"); err != nil {
return err
}
f.Container = &docker.Container{
ID: id,
Name: id, // For testing purpose, we set name to id
@ -233,8 +249,8 @@ func (f *FakeDockerClient) StartContainer(id string, hostConfig *docker.HostConf
container.NetworkSettings = &docker.NetworkSettings{IPAddress: "2.3.4.5"}
f.ContainerMap[id] = container
}
}
return err
f.normalSleep(200, 50, 50)
return nil
}
// StopContainer is a test-spy implementation of DockerInterface.StopContainer.
@ -243,8 +259,9 @@ func (f *FakeDockerClient) StopContainer(id string, timeout uint) error {
f.Lock()
defer f.Unlock()
f.called = append(f.called, "stop")
err := f.popError("stop")
if err == nil {
if err := f.popError("stop"); err != nil {
return err
}
f.Stopped = append(f.Stopped, id)
var newList []docker.APIContainers
for _, container := range f.ContainerList {
@ -273,9 +290,8 @@ func (f *FakeDockerClient) StopContainer(id string, timeout uint) error {
}
f.ContainerMap[id] = container
}
}
return err
f.normalSleep(200, 50, 50)
return nil
}
func (f *FakeDockerClient) RemoveContainer(opts docker.RemoveContainerOptions) error {