From 5936e81b2e0d4b2d2090c763160da96cd82eb649 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Fri, 2 Jun 2017 07:31:44 -0500 Subject: [PATCH] Add determinePodIPBySandboxID. --- pkg/kubelet/dockershim/docker_sandbox.go | 12 ++++-- pkg/kubelet/dockershim/helpers_linux.go | 4 ++ pkg/kubelet/dockershim/helpers_unsupported.go | 5 +++ pkg/kubelet/dockershim/helpers_windows.go | 39 +++++++++++++++++++ 4 files changed, 57 insertions(+), 3 deletions(-) diff --git a/pkg/kubelet/dockershim/docker_sandbox.go b/pkg/kubelet/dockershim/docker_sandbox.go index bcac5d5c43..4def3b5902 100644 --- a/pkg/kubelet/dockershim/docker_sandbox.go +++ b/pkg/kubelet/dockershim/docker_sandbox.go @@ -317,9 +317,15 @@ func (ds *dockerService) PodSandboxStatus(podSandboxID string) (*runtimeapi.PodS if r.State.Running { state = runtimeapi.PodSandboxState_SANDBOX_READY } - IP, err := ds.getIP(r) - if err != nil { - return nil, err + + var IP string + // TODO: Remove this when sandbox is available on windows + // This is a workaround for windows, where sandbox is not in use, and pod IP is determined through containers belonging to the Pod. + if IP = ds.determinePodIPBySandboxID(podSandboxID); IP == "" { + IP, err = ds.getIP(r) + if err != nil { + return nil, err + } } network := &runtimeapi.PodSandboxNetworkStatus{Ip: IP} hostNetwork := sharesHostNetwork(r) diff --git a/pkg/kubelet/dockershim/helpers_linux.go b/pkg/kubelet/dockershim/helpers_linux.go index 4952d862ad..ba1d357e7b 100644 --- a/pkg/kubelet/dockershim/helpers_linux.go +++ b/pkg/kubelet/dockershim/helpers_linux.go @@ -82,3 +82,7 @@ func (ds *dockerService) updateCreateConfig( return nil } + +func (ds *dockerService) determinePodIPBySandboxID(uid string) string { + return "" +} diff --git a/pkg/kubelet/dockershim/helpers_unsupported.go b/pkg/kubelet/dockershim/helpers_unsupported.go index 36fd97a1f9..5c3f14e356 100644 --- a/pkg/kubelet/dockershim/helpers_unsupported.go +++ b/pkg/kubelet/dockershim/helpers_unsupported.go @@ -42,3 +42,8 @@ func (ds *dockerService) updateCreateConfig( glog.Warningf("updateCreateConfig is unsupported in this build") return nil } + +func (ds *dockerService) determinePodIPBySandboxID(uid string) string { + glog.Warningf("determinePodIPBySandboxID is unsupported in this build") + return "" +} diff --git a/pkg/kubelet/dockershim/helpers_windows.go b/pkg/kubelet/dockershim/helpers_windows.go index 0ced8e7936..2f2c883aa4 100644 --- a/pkg/kubelet/dockershim/helpers_windows.go +++ b/pkg/kubelet/dockershim/helpers_windows.go @@ -24,6 +24,7 @@ import ( "github.com/blang/semver" dockertypes "github.com/docker/engine-api/types" dockercontainer "github.com/docker/engine-api/types/container" + dockerfilters "github.com/docker/engine-api/types/filters" "github.com/golang/glog" "k8s.io/kubernetes/pkg/api/v1" runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1" @@ -60,3 +61,41 @@ func (ds *dockerService) updateCreateConfig( return nil } + +func (ds *dockerService) determinePodIPBySandboxID(sandboxID string) string { + opts := dockertypes.ContainerListOptions{ + All: true, + Filter: dockerfilters.NewArgs(), + } + + f := newDockerFilter(&opts.Filter) + f.AddLabel(containerTypeLabelKey, containerTypeLabelContainer) + f.AddLabel(sandboxIDLabelKey, sandboxID) + containers, err := ds.client.ListContainers(opts) + if err != nil { + return "" + } + + for _, c := range containers { + r, err := ds.client.InspectContainer(c.ID) + if err != nil { + continue + } + if containerIP := getContainerIP(r); containerIP != "" { + return containerIP + } + } + + return "" +} + +func getContainerIP(container *dockertypes.ContainerJSON) string { + if container.NetworkSettings != nil { + for _, network := range container.NetworkSettings.Networks { + if network.IPAddress != "" { + return network.IPAddress + } + } + } + return "" +}