diff --git a/integration/pod_hostname_env_test.go b/integration/pod_hostname_env_test.go new file mode 100644 index 000000000..191943ecd --- /dev/null +++ b/integration/pod_hostname_env_test.go @@ -0,0 +1,115 @@ +/* +Copyright 2018 The containerd Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package integration + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" +) + +func TestPodHostnameEnv(t *testing.T) { + hostname, err := os.Hostname() + require.NoError(t, err) + for name, test := range map[string]struct { + opts []PodSandboxOpts + expectedHostname string + }{ + "regular pod with custom hostname": { + opts: []PodSandboxOpts{ + WithPodHostname("test-hostname"), + }, + expectedHostname: "test-hostname", + }, + "host network pod without custom hostname": { + opts: []PodSandboxOpts{ + WithHostNetwork, + }, + expectedHostname: hostname, + }, + "host network pod with custom hostname": { + opts: []PodSandboxOpts{ + WithHostNetwork, + WithPodHostname("test-hostname"), + }, + expectedHostname: "test-hostname", + }, + } { + t.Run(name, func(t *testing.T) { + testPodLogDir, err := ioutil.TempDir("/tmp", "hostname-env") + require.NoError(t, err) + defer os.RemoveAll(testPodLogDir) + + opts := append(test.opts, WithPodLogDirectory(testPodLogDir)) + t.Log("Create a sandbox with hostname") + sbConfig := PodSandboxConfig("sandbox", "hostname-env", opts...) + sb, err := runtimeService.RunPodSandbox(sbConfig) + require.NoError(t, err) + defer func() { + assert.NoError(t, runtimeService.StopPodSandbox(sb)) + assert.NoError(t, runtimeService.RemovePodSandbox(sb)) + }() + + const ( + testImage = "busybox" + containerName = "test-container" + ) + t.Logf("Pull test image %q", testImage) + img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil) + require.NoError(t, err) + defer func() { + assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img})) + }() + + t.Log("Create a container to print env") + cnConfig := ContainerConfig( + containerName, + "busybox", + WithCommand("env"), + WithLogPath(containerName), + ) + cn, err := runtimeService.CreateContainer(sb, cnConfig, sbConfig) + require.NoError(t, err) + + t.Log("Start the container") + require.NoError(t, runtimeService.StartContainer(cn)) + + t.Log("Wait for container to finish running") + require.NoError(t, Eventually(func() (bool, error) { + s, err := runtimeService.ContainerStatus(cn) + if err != nil { + return false, err + } + if s.GetState() == runtime.ContainerState_CONTAINER_EXITED { + return true, nil + } + return false, nil + }, time.Second, 30*time.Second)) + + t.Log("Search hostname env in container log") + content, err := ioutil.ReadFile(filepath.Join(testPodLogDir, containerName)) + assert.NoError(t, err) + assert.Contains(t, string(content), "HOSTNAME="+test.expectedHostname) + }) + } +} diff --git a/integration/test_utils.go b/integration/test_utils.go index c9c31f14d..110b9640a 100644 --- a/integration/test_utils.go +++ b/integration/test_utils.go @@ -126,6 +126,13 @@ func WithPodLogDirectory(dir string) PodSandboxOpts { } } +// Add pod hostname. +func WithPodHostname(hostname string) PodSandboxOpts { + return func(p *runtime.PodSandboxConfig) { + p.Hostname = hostname + } +} + // PodSandboxConfig generates a pod sandbox config for test. func PodSandboxConfig(name, ns string, opts ...PodSandboxOpts) *runtime.PodSandboxConfig { config := &runtime.PodSandboxConfig{