From ba20e63446815f8bcab4fc4c6e07eab2e2a9e121 Mon Sep 17 00:00:00 2001 From: Davanum Srinivas Date: Thu, 1 Mar 2018 07:26:00 +0000 Subject: [PATCH] Create fake /etc/hosts for conformance test "KubeletManagedEtcHosts should test kubelet managed /etc/hosts file" conformance test fails in the CI's Docker-In-Docker environment. This test mounts a /etc/hosts file and checks if "# Kubernetes-managed hosts file." string is present or not under various conditions. The specific failure with DIND happens when the /etc/hosts picked up from the box where e2e test are running already has this string. This happens because our CI runs on kubernetes and the e2e tests are running in a container that was started on kubernetes (and hence already has that string) To avoid this situation, we create a new /etc/hosts file with known contents (and does not have the "# Kubernetes-managed hosts file." string) --- test/e2e/common/kubelet_etc_hosts.go | 33 +++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/test/e2e/common/kubelet_etc_hosts.go b/test/e2e/common/kubelet_etc_hosts.go index 94438865270e8..bcce2375a4cdc 100644 --- a/test/e2e/common/kubelet_etc_hosts.go +++ b/test/e2e/common/kubelet_etc_hosts.go @@ -17,6 +17,8 @@ limitations under the License. package common import ( + "io/ioutil" + "os" "strings" "time" @@ -40,6 +42,7 @@ type KubeletManagedHostConfig struct { hostNetworkPod *v1.Pod pod *v1.Pod f *framework.Framework + tmpEtcHostFile *os.File } var _ = framework.KubeDescribe("KubeletManagedEtcHosts", func() { @@ -59,6 +62,8 @@ var _ = framework.KubeDescribe("KubeletManagedEtcHosts", func() { By("Running the test") config.verifyEtcHosts() + + config.cleanup() }) }) @@ -76,6 +81,26 @@ func (config *KubeletManagedHostConfig) verifyEtcHosts() { } func (config *KubeletManagedHostConfig) setup() { + etcHostContents := `127.0.0.1 localhost +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +ff00::0 ip6-mcastprefix +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters` + + // Write the data to a temp file. + var err error + config.tmpEtcHostFile, err = ioutil.TempFile("", "etc-hosts") + if err != nil { + framework.Failf("failed to create temp file for /etc/hosts: %v", err) + } + if _, err := config.tmpEtcHostFile.Write([]byte(etcHostContents)); err != nil { + framework.Failf("Failed to write temp file for /etc/hosts data: %v", err) + } + if err := config.tmpEtcHostFile.Close(); err != nil { + framework.Failf("Failed to close temp file: %v", err) + } + By("Creating hostNetwork=false pod") config.createPodWithoutHostNetwork() @@ -83,6 +108,12 @@ func (config *KubeletManagedHostConfig) setup() { config.createPodWithHostNetwork() } +func (config *KubeletManagedHostConfig) cleanup() { + if config.tmpEtcHostFile != nil { + os.Remove(config.tmpEtcHostFile.Name()) + } +} + func (config *KubeletManagedHostConfig) createPodWithoutHostNetwork() { podSpec := config.createPodSpec(etcHostsPodName) config.pod = config.f.PodClient().CreateSync(podSpec) @@ -184,7 +215,7 @@ func (config *KubeletManagedHostConfig) createPodSpec(podName string) *v1.Pod { Name: "host-etc-hosts", VolumeSource: v1.VolumeSource{ HostPath: &v1.HostPathVolumeSource{ - Path: "/etc/hosts", + Path: config.tmpEtcHostFile.Name(), Type: hostPathType, }, },