Merge pull request #1335 from dchen1107/exit1

Convert existing kubernetes system to use ContainerStatus, instead of
This commit is contained in:
Brendan Burns 2014-09-24 21:37:24 -07:00
commit 431caa93df
13 changed files with 93 additions and 58 deletions

View File

@ -50,7 +50,7 @@ while [ $ALL_RUNNING -ne 1 ]; do
ALL_RUNNING=1 ALL_RUNNING=1
for id in $POD_ID_LIST; do for id in $POD_ID_LIST; do
CURRENT_STATUS=$($KUBECFG -template '{{and .CurrentState.Info.mynginx.State.Running .CurrentState.Info.net.State.Running}}' get pods/$id) CURRENT_STATUS=$($KUBECFG -template '{{and .CurrentState.Info.mynginx.State.Running .CurrentState.Info.net.State.Running}}' get pods/$id)
if [ "$CURRENT_STATUS" != "true" ]; then if [ "$CURRENT_STATUS" != "{}" ]; then
ALL_RUNNING=0 ALL_RUNNING=0
fi fi
done done

View File

@ -40,10 +40,10 @@ function validate() {
for id in $POD_ID_LIST; do for id in $POD_ID_LIST; do
TEMPLATE_STRING="{{and ((index .CurrentState.Info \"${CONTROLLER_NAME}\").State.Running) .CurrentState.Info.net.State.Running}}" TEMPLATE_STRING="{{and ((index .CurrentState.Info \"${CONTROLLER_NAME}\").State.Running) .CurrentState.Info.net.State.Running}}"
CURRENT_STATUS=$($KUBECFG -template "${TEMPLATE_STRING}" get pods/$id) CURRENT_STATUS=$($KUBECFG -template "${TEMPLATE_STRING}" get pods/$id)
if [ "$CURRENT_STATUS" != "true" ]; then if [ "$CURRENT_STATUS" != "{}" ]; then
ALL_RUNNING=0 ALL_RUNNING=0
else else
CURRENT_IMAGE=$($KUBECFG -template "{{(index .CurrentState.Info \"${CONTROLLER_NAME}\").Config.Image}}" get pods/$id) CURRENT_IMAGE=$($KUBECFG -template "{{(index .CurrentState.Info \"${CONTROLLER_NAME}\").DetailInfo.Config.Image}}" get pods/$id)
if [ "$CURRENT_IMAGE" != "${DOCKER_HUB_USER}/update-demo:${CONTAINER_IMAGE_VERSION}" ]; then if [ "$CURRENT_IMAGE" != "${DOCKER_HUB_USER}/update-demo:${CONTAINER_IMAGE_VERSION}" ]; then
ALL_RUNNING=0 ALL_RUNNING=0
fi fi

View File

@ -288,8 +288,7 @@ type ContainerStatus struct {
} }
// PodInfo contains one entry for every container with available info. // PodInfo contains one entry for every container with available info.
// TODO(dchen1107): Replace docker.Container below with ContainerStatus defined above. type PodInfo map[string]ContainerStatus
type PodInfo map[string]docker.Container
type RestartPolicyAlways struct{} type RestartPolicyAlways struct{}

View File

@ -301,7 +301,7 @@ type ContainerStatus struct {
} }
// PodInfo contains one entry for every container with available info. // PodInfo contains one entry for every container with available info.
type PodInfo map[string]docker.Container type PodInfo map[string]ContainerStatus
type RestartPolicyAlways struct{} type RestartPolicyAlways struct{}

View File

@ -298,7 +298,7 @@ type ContainerStatus struct {
// PodInfo contains one entry for every container with available info. // PodInfo contains one entry for every container with available info.
// TODO(dchen1107): Replace docker.Container below with ContainerStatus defined above. // TODO(dchen1107): Replace docker.Container below with ContainerStatus defined above.
type PodInfo map[string]docker.Container type PodInfo map[string]ContainerStatus
type RestartPolicyAlways struct{} type RestartPolicyAlways struct{}

View File

@ -32,7 +32,9 @@ import (
func TestHTTPPodInfoGetter(t *testing.T) { func TestHTTPPodInfoGetter(t *testing.T) {
expectObj := api.PodInfo{ expectObj := api.PodInfo{
"myID": docker.Container{ID: "myID"}, "myID": api.ContainerStatus{
DetailInfo: docker.Container{ID: "myID"},
},
} }
body, err := json.Marshal(expectObj) body, err := json.Marshal(expectObj)
if err != nil { if err != nil {
@ -67,14 +69,17 @@ func TestHTTPPodInfoGetter(t *testing.T) {
} }
// reflect.DeepEqual(expectObj, gotObj) doesn't handle blank times well // reflect.DeepEqual(expectObj, gotObj) doesn't handle blank times well
if len(gotObj) != len(expectObj) || expectObj["myID"].ID != gotObj["myID"].ID { if len(gotObj) != len(expectObj) ||
expectObj["myID"].DetailInfo.ID != gotObj["myID"].DetailInfo.ID {
t.Errorf("Unexpected response. Expected: %#v, received %#v", expectObj, gotObj) t.Errorf("Unexpected response. Expected: %#v, received %#v", expectObj, gotObj)
} }
} }
func TestHTTPPodInfoGetterNotFound(t *testing.T) { func TestHTTPPodInfoGetterNotFound(t *testing.T) {
expectObj := api.PodInfo{ expectObj := api.PodInfo{
"myID": docker.Container{ID: "myID"}, "myID": api.ContainerStatus{
DetailInfo: docker.Container{ID: "myID"},
},
} }
_, err := json.Marshal(expectObj) _, err := json.Marshal(expectObj)
if err != nil { if err != nil {

View File

@ -228,6 +228,25 @@ func GetKubeletDockerContainerLogs(client DockerInterface, containerID, tail str
return return
} }
func generateContainerStatus(inspectResult *docker.Container) api.ContainerStatus {
if inspectResult == nil {
// Why did we not get an error?
return api.ContainerStatus{}
}
var containerStatus api.ContainerStatus
if inspectResult.State.Running {
containerStatus.State.Running = &api.ContainerStateRunning{}
} else {
containerStatus.State.Termination = &api.ContainerStateTerminated{
ExitCode: inspectResult.State.ExitCode,
}
}
containerStatus.DetailInfo = *inspectResult
return containerStatus
}
// ErrNoContainersInPod is returned when there are no containers for a given pod // ErrNoContainersInPod is returned when there are no containers for a given pod
var ErrNoContainersInPod = errors.New("no containers exist for this pod") var ErrNoContainersInPod = errors.New("no containers exist for this pod")
@ -249,7 +268,9 @@ func GetDockerPodInfo(client DockerInterface, podFullName, uuid string) (api.Pod
continue continue
} }
// We assume docker return us a list of containers in time order // We assume docker return us a list of containers in time order
if _, ok := info[dockerContainerName]; ok { if containerStatus, found := info[dockerContainerName]; found {
containerStatus.RestartCount += 1
info[dockerContainerName] = containerStatus
continue continue
} }
@ -257,12 +278,7 @@ func GetDockerPodInfo(client DockerInterface, podFullName, uuid string) (api.Pod
if err != nil { if err != nil {
return nil, err return nil, err
} }
if inspectResult == nil { info[dockerContainerName] = generateContainerStatus(inspectResult)
// Why did we not get an error?
info[dockerContainerName] = docker.Container{}
} else {
info[dockerContainerName] = *inspectResult
}
} }
if len(info) == 0 { if len(info) == 0 {
return nil, ErrNoContainersInPod return nil, ErrNoContainersInPod

View File

@ -77,8 +77,8 @@ func (h *httpActionHandler) Run(podFullName, uuid string, container *api.Contain
return err return err
} }
netInfo, found := info[networkContainerName] netInfo, found := info[networkContainerName]
if found && netInfo.NetworkSettings != nil { if found && netInfo.DetailInfo.NetworkSettings != nil {
host = netInfo.NetworkSettings.IPAddress host = netInfo.DetailInfo.NetworkSettings.IPAddress
} else { } else {
return fmt.Errorf("failed to find networking container: %v", info) return fmt.Errorf("failed to find networking container: %v", info)
} }

View File

@ -488,8 +488,8 @@ func (kl *Kubelet) syncPod(pod *Pod, dockerContainers dockertools.DockerContaine
podFullName, uuid) podFullName, uuid)
} }
netInfo, found := info[networkContainerName] netInfo, found := info[networkContainerName]
if found && netInfo.NetworkSettings != nil { if found && netInfo.DetailInfo.NetworkSettings != nil {
podState.PodIP = netInfo.NetworkSettings.IPAddress podState.PodIP = netInfo.DetailInfo.NetworkSettings.IPAddress
} }
for _, container := range pod.Manifest.Containers { for _, container := range pod.Manifest.Containers {

View File

@ -146,7 +146,11 @@ func TestContainers(t *testing.T) {
func TestPodInfo(t *testing.T) { func TestPodInfo(t *testing.T) {
fw := newServerTest() fw := newServerTest()
expected := api.PodInfo{"goodpod": docker.Container{ID: "myContainerID"}} expected := api.PodInfo{
"goodpod": api.ContainerStatus{
DetailInfo: docker.Container{ID: "myContainerID"},
},
}
fw.fakeKubelet.infoFunc = func(name string) (api.PodInfo, error) { fw.fakeKubelet.infoFunc = func(name string) (api.PodInfo, error) {
if name == "goodpod.etcd" { if name == "goodpod.etcd" {
return expected, nil return expected, nil

View File

@ -41,7 +41,11 @@ func (f *FakePodInfoGetter) GetPodInfo(host, id string) (api.PodInfo, error) {
func TestPodCacheGet(t *testing.T) { func TestPodCacheGet(t *testing.T) {
cache := NewPodCache(nil, nil) cache := NewPodCache(nil, nil)
expected := api.PodInfo{"foo": docker.Container{ID: "foo"}} expected := api.PodInfo{
"foo": api.ContainerStatus{
DetailInfo: docker.Container{ID: "foo"},
},
}
cache.podInfo["foo"] = expected cache.podInfo["foo"] = expected
info, err := cache.GetPodInfo("host", "foo") info, err := cache.GetPodInfo("host", "foo")
@ -66,7 +70,11 @@ func TestPodCacheGetMissing(t *testing.T) {
} }
func TestPodGetPodInfoGetter(t *testing.T) { func TestPodGetPodInfoGetter(t *testing.T) {
expected := api.PodInfo{"foo": docker.Container{ID: "foo"}} expected := api.PodInfo{
"foo": api.ContainerStatus{
DetailInfo: docker.Container{ID: "foo"},
},
}
fake := FakePodInfoGetter{ fake := FakePodInfoGetter{
data: expected, data: expected,
} }
@ -98,7 +106,11 @@ func TestPodUpdateAllContainers(t *testing.T) {
pods := []api.Pod{pod} pods := []api.Pod{pod}
mockRegistry := registrytest.NewPodRegistry(&api.PodList{Items: pods}) mockRegistry := registrytest.NewPodRegistry(&api.PodList{Items: pods})
expected := api.PodInfo{"foo": docker.Container{ID: "foo"}} expected := api.PodInfo{
"foo": api.ContainerStatus{
DetailInfo: docker.Container{ID: "foo"},
},
}
fake := FakePodInfoGetter{ fake := FakePodInfoGetter{
data: expected, data: expected,
} }

View File

@ -196,8 +196,8 @@ func (rs *REST) fillPodInfo(pod *api.Pod) {
pod.CurrentState.Info = info pod.CurrentState.Info = info
netContainerInfo, ok := info["net"] netContainerInfo, ok := info["net"]
if ok { if ok {
if netContainerInfo.NetworkSettings != nil { if netContainerInfo.DetailInfo.NetworkSettings != nil {
pod.CurrentState.PodIP = netContainerInfo.NetworkSettings.IPAddress pod.CurrentState.PodIP = netContainerInfo.DetailInfo.NetworkSettings.IPAddress
} else { } else {
glog.Warningf("No network settings: %#v", netContainerInfo) glog.Warningf("No network settings: %#v", netContainerInfo)
} }
@ -253,11 +253,13 @@ func getPodStatus(pod *api.Pod, minions client.MinionInterface) (api.PodStatus,
stopped := 0 stopped := 0
unknown := 0 unknown := 0
for _, container := range pod.DesiredState.Manifest.Containers { for _, container := range pod.DesiredState.Manifest.Containers {
if info, ok := pod.CurrentState.Info[container.Name]; ok { if containerStatus, ok := pod.CurrentState.Info[container.Name]; ok {
if info.State.Running { if containerStatus.State.Running != nil {
running++ running++
} else { } else if containerStatus.State.Termination != nil {
stopped++ stopped++
} else {
unknown++
} }
} else { } else {
unknown++ unknown++

View File

@ -360,14 +360,14 @@ func TestMakePodStatus(t *testing.T) {
currentState := api.PodState{ currentState := api.PodState{
Host: "machine", Host: "machine",
} }
runningState := docker.Container{ runningState := api.ContainerStatus{
State: docker.State{ State: api.ContainerState{
Running: true, Running: &api.ContainerStateRunning{},
}, },
} }
stoppedState := docker.Container{ stoppedState := api.ContainerStatus{
State: docker.State{ State: api.ContainerState{
Running: false, Termination: &api.ContainerStateTerminated{},
}, },
} }
@ -376,14 +376,7 @@ func TestMakePodStatus(t *testing.T) {
status api.PodStatus status api.PodStatus
test string test string
}{ }{
{ {&api.Pod{DesiredState: desiredState, CurrentState: currentState}, api.PodWaiting, "waiting"},
&api.Pod{
DesiredState: desiredState,
CurrentState: currentState,
},
api.PodWaiting,
"waiting",
},
{ {
&api.Pod{ &api.Pod{
DesiredState: desiredState, DesiredState: desiredState,
@ -398,7 +391,7 @@ func TestMakePodStatus(t *testing.T) {
&api.Pod{ &api.Pod{
DesiredState: desiredState, DesiredState: desiredState,
CurrentState: api.PodState{ CurrentState: api.PodState{
Info: map[string]docker.Container{ Info: map[string]api.ContainerStatus{
"containerA": runningState, "containerA": runningState,
"containerB": runningState, "containerB": runningState,
}, },
@ -412,7 +405,7 @@ func TestMakePodStatus(t *testing.T) {
&api.Pod{ &api.Pod{
DesiredState: desiredState, DesiredState: desiredState,
CurrentState: api.PodState{ CurrentState: api.PodState{
Info: map[string]docker.Container{ Info: map[string]api.ContainerStatus{
"containerA": runningState, "containerA": runningState,
"containerB": runningState, "containerB": runningState,
}, },
@ -426,7 +419,7 @@ func TestMakePodStatus(t *testing.T) {
&api.Pod{ &api.Pod{
DesiredState: desiredState, DesiredState: desiredState,
CurrentState: api.PodState{ CurrentState: api.PodState{
Info: map[string]docker.Container{ Info: map[string]api.ContainerStatus{
"containerA": stoppedState, "containerA": stoppedState,
"containerB": stoppedState, "containerB": stoppedState,
}, },
@ -440,7 +433,7 @@ func TestMakePodStatus(t *testing.T) {
&api.Pod{ &api.Pod{
DesiredState: desiredState, DesiredState: desiredState,
CurrentState: api.PodState{ CurrentState: api.PodState{
Info: map[string]docker.Container{ Info: map[string]api.ContainerStatus{
"containerA": stoppedState, "containerA": stoppedState,
"containerB": stoppedState, "containerB": stoppedState,
}, },
@ -454,7 +447,7 @@ func TestMakePodStatus(t *testing.T) {
&api.Pod{ &api.Pod{
DesiredState: desiredState, DesiredState: desiredState,
CurrentState: api.PodState{ CurrentState: api.PodState{
Info: map[string]docker.Container{ Info: map[string]api.ContainerStatus{
"containerA": runningState, "containerA": runningState,
"containerB": stoppedState, "containerB": stoppedState,
}, },
@ -468,7 +461,7 @@ func TestMakePodStatus(t *testing.T) {
&api.Pod{ &api.Pod{
DesiredState: desiredState, DesiredState: desiredState,
CurrentState: api.PodState{ CurrentState: api.PodState{
Info: map[string]docker.Container{ Info: map[string]api.ContainerStatus{
"containerA": runningState, "containerA": runningState,
}, },
Host: "machine", Host: "machine",
@ -566,12 +559,14 @@ func (f *FakePodInfoGetter) GetPodInfo(host, podID string) (api.PodInfo, error)
func TestFillPodInfo(t *testing.T) { func TestFillPodInfo(t *testing.T) {
expectedIP := "1.2.3.4" expectedIP := "1.2.3.4"
fakeGetter := FakePodInfoGetter{ fakeGetter := FakePodInfoGetter{
info: map[string]docker.Container{ info: map[string]api.ContainerStatus{
"net": { "net": {
ID: "foobar", DetailInfo: docker.Container{
Path: "bin/run.sh", ID: "foobar",
NetworkSettings: &docker.NetworkSettings{ Path: "bin/run.sh",
IPAddress: expectedIP, NetworkSettings: &docker.NetworkSettings{
IPAddress: expectedIP,
},
}, },
}, },
}, },
@ -592,10 +587,12 @@ func TestFillPodInfo(t *testing.T) {
func TestFillPodInfoNoData(t *testing.T) { func TestFillPodInfoNoData(t *testing.T) {
expectedIP := "" expectedIP := ""
fakeGetter := FakePodInfoGetter{ fakeGetter := FakePodInfoGetter{
info: map[string]docker.Container{ info: map[string]api.ContainerStatus{
"net": { "net": {
ID: "foobar", DetailInfo: docker.Container{
Path: "bin/run.sh", ID: "foobar",
Path: "bin/run.sh",
},
}, },
}, },
} }