func makeFakePodSandbox(m *kubeGenericRuntimeManager, pod *api.Pod, createdAt int64) (*apitest.FakePodSandbox, error) { config, err := m.generatePodSandboxConfig(pod, 0) if err != nil { return nil, err } podSandboxID := apitest.BuildSandboxName(config.Metadata) readyState := runtimeApi.PodSandBoxState_READY return &apitest.FakePodSandbox{ PodSandboxStatus: runtimeApi.PodSandboxStatus{ Id: &podSandboxID, Metadata: config.Metadata, State: &readyState, CreatedAt: &createdAt, Labels: config.Labels, }, }, nil }
// makeFakePodSandbox creates a fake pod sandbox based on a sandbox template. func makeFakePodSandbox(t *testing.T, m *kubeGenericRuntimeManager, template sandboxTemplate) *apitest.FakePodSandbox { config, err := m.generatePodSandboxConfig(template.pod, template.attempt) assert.NoError(t, err, "generatePodSandboxConfig for sandbox template %+v", template) podSandboxID := apitest.BuildSandboxName(config.Metadata) return &apitest.FakePodSandbox{ PodSandboxStatus: runtimeApi.PodSandboxStatus{ Id: &podSandboxID, Metadata: config.Metadata, State: &template.state, CreatedAt: &template.createdAt, Network: &runtimeApi.PodSandboxNetworkStatus{ Ip: &apitest.FakePodSandboxIP, }, Labels: config.Labels, }, } }
func makeFakeContainer(m *kubeGenericRuntimeManager, pod *api.Pod, container api.Container, sandboxConfig *runtimeApi.PodSandboxConfig, createdAt int64, state runtimeApi.ContainerState) (*apitest.FakeContainer, error) { containerConfig, err := m.generateContainerConfig(&container, pod, 0, "") if err != nil { return nil, err } containerID := apitest.BuildContainerName(containerConfig.Metadata) podSandboxID := apitest.BuildSandboxName(sandboxConfig.Metadata) imageRef := containerConfig.Image.GetImage() return &apitest.FakeContainer{ ContainerStatus: runtimeApi.ContainerStatus{ Id: &containerID, Metadata: containerConfig.Metadata, Image: containerConfig.Image, ImageRef: &imageRef, CreatedAt: &createdAt, State: &state, Labels: containerConfig.Labels, Annotations: containerConfig.Annotations, }, SandboxID: podSandboxID, }, nil }
// makeFakeContainer creates a fake container based on a container template. func makeFakeContainer(t *testing.T, m *kubeGenericRuntimeManager, template containerTemplate) *apitest.FakeContainer { sandboxConfig, err := m.generatePodSandboxConfig(template.pod, template.sandboxAttempt) assert.NoError(t, err, "generatePodSandboxConfig for container template %+v", template) containerConfig, err := m.generateContainerConfig(template.container, template.pod, template.attempt, "") assert.NoError(t, err, "generateContainerConfig for container template %+v", template) podSandboxID := apitest.BuildSandboxName(sandboxConfig.Metadata) containerID := apitest.BuildContainerName(containerConfig.Metadata, podSandboxID) imageRef := containerConfig.Image.GetImage() return &apitest.FakeContainer{ ContainerStatus: runtimeApi.ContainerStatus{ Id: &containerID, Metadata: containerConfig.Metadata, Image: containerConfig.Image, ImageRef: &imageRef, CreatedAt: &template.createdAt, State: &template.state, Labels: containerConfig.Labels, Annotations: containerConfig.Annotations, }, SandboxID: podSandboxID, } }
func TestSyncPodWithInitContainers(t *testing.T) { fakeRuntime, _, m, err := createTestRuntimeManager() assert.NoError(t, err) initContainers := []v1.Container{ { Name: "init1", Image: "init", ImagePullPolicy: v1.PullIfNotPresent, }, } containers := []v1.Container{ { Name: "foo1", Image: "busybox", ImagePullPolicy: v1.PullIfNotPresent, }, { Name: "foo2", Image: "alpine", ImagePullPolicy: v1.PullIfNotPresent, }, } pod := &v1.Pod{ ObjectMeta: v1.ObjectMeta{ UID: "12345678", Name: "foo", Namespace: "new", }, Spec: v1.PodSpec{ Containers: containers, InitContainers: initContainers, }, } // buildContainerID is an internal helper function to build container id from api pod // and container with default attempt number 0. buildContainerID := func(pod *v1.Pod, container v1.Container) string { uid := string(pod.UID) sandboxID := apitest.BuildSandboxName(&runtimeApi.PodSandboxMetadata{ Name: &pod.Name, Uid: &uid, Namespace: &pod.Namespace, }) return apitest.BuildContainerName(&runtimeApi.ContainerMetadata{Name: &container.Name}, sandboxID) } backOff := flowcontrol.NewBackOff(time.Second, time.Minute) // 1. should only create the init container. podStatus, err := m.GetPodStatus(pod.UID, pod.Name, pod.Namespace) assert.NoError(t, err) result := m.SyncPod(pod, v1.PodStatus{}, podStatus, []v1.Secret{}, backOff) assert.NoError(t, result.Error()) assert.Equal(t, 1, len(fakeRuntime.Containers)) initContainerID := buildContainerID(pod, initContainers[0]) expectedContainers := []string{initContainerID} if actual, ok := verifyFakeContainerList(fakeRuntime, expectedContainers); !ok { t.Errorf("expected %q, got %q", expectedContainers, actual) } // 2. should not create app container because init container is still running. podStatus, err = m.GetPodStatus(pod.UID, pod.Name, pod.Namespace) assert.NoError(t, err) result = m.SyncPod(pod, v1.PodStatus{}, podStatus, []v1.Secret{}, backOff) assert.NoError(t, result.Error()) assert.Equal(t, 1, len(fakeRuntime.Containers)) expectedContainers = []string{initContainerID} if actual, ok := verifyFakeContainerList(fakeRuntime, expectedContainers); !ok { t.Errorf("expected %q, got %q", expectedContainers, actual) } // 3. should create all app containers because init container finished. fakeRuntime.StopContainer(initContainerID, 0) podStatus, err = m.GetPodStatus(pod.UID, pod.Name, pod.Namespace) assert.NoError(t, err) result = m.SyncPod(pod, v1.PodStatus{}, podStatus, []v1.Secret{}, backOff) assert.NoError(t, result.Error()) assert.Equal(t, 3, len(fakeRuntime.Containers)) expectedContainers = []string{initContainerID, buildContainerID(pod, containers[0]), buildContainerID(pod, containers[1])} if actual, ok := verifyFakeContainerList(fakeRuntime, expectedContainers); !ok { t.Errorf("expected %q, got %q", expectedContainers, actual) } }