memory manager: add e2e test to run guaranteed pod with init containers

Signed-off-by: Pawel Rapacz <p.rapacz@partner.samsung.com>
This commit is contained in:
Pawel Rapacz 2020-11-04 19:21:57 +01:00 committed by Artyom Lukianov
parent f3d4ac2f7e
commit 606fea29f5

View File

@ -60,12 +60,11 @@ type memoryManagerCtnAttributes struct {
hugepages2Mi string hugepages2Mi string
} }
// makeCPUMangerPod returns a pod with the provided ctnAttributes. // makeMemoryManagerContainers returns slice of containers with provided attributes and indicator of hugepages mount needed for those.
func makeMemoryManagerPod(podName string, ctnAttributes []memoryManagerCtnAttributes) *v1.Pod { func makeMemoryManagerContainers(ctnCmd string, ctnAttributes []memoryManagerCtnAttributes) ([]v1.Container, bool) {
hugepagesMount := false hugepagesMount := false
var containers []v1.Container var containers []v1.Container
for _, ctnAttr := range ctnAttributes { for _, ctnAttr := range ctnAttributes {
memsetCmd := fmt.Sprintf("grep Mems_allowed_list /proc/self/status | cut -f2 && sleep 1d")
ctn := v1.Container{ ctn := v1.Container{
Name: ctnAttr.ctnName, Name: ctnAttr.ctnName,
Image: busyboxImage, Image: busyboxImage,
@ -75,7 +74,7 @@ func makeMemoryManagerPod(podName string, ctnAttributes []memoryManagerCtnAttrib
v1.ResourceMemory: resource.MustParse(ctnAttr.memory), v1.ResourceMemory: resource.MustParse(ctnAttr.memory),
}, },
}, },
Command: []string{"sh", "-c", memsetCmd}, Command: []string{"sh", "-c", ctnCmd},
} }
if ctnAttr.hugepages2Mi != "" { if ctnAttr.hugepages2Mi != "" {
hugepagesMount = true hugepagesMount = true
@ -92,6 +91,20 @@ func makeMemoryManagerPod(podName string, ctnAttributes []memoryManagerCtnAttrib
containers = append(containers, ctn) containers = append(containers, ctn)
} }
return containers, hugepagesMount
}
// makeMemoryMangerPod returns a pod with the provided ctnAttributes.
func makeMemoryManagerPod(podName string, initCtnAttributes, ctnAttributes []memoryManagerCtnAttributes) *v1.Pod {
hugepagesMount := false
memsetCmd := fmt.Sprintf("grep Mems_allowed_list /proc/self/status | cut -f2")
memsetSleepCmd := memsetCmd + "&& sleep 1d"
var containers, initContainers []v1.Container
if len(initCtnAttributes) > 0 {
initContainers, _ = makeMemoryManagerContainers(memsetCmd, initCtnAttributes)
}
containers, hugepagesMount = makeMemoryManagerContainers(memsetSleepCmd, ctnAttributes)
pod := &v1.Pod{ pod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: podName, Name: podName,
@ -99,6 +112,7 @@ func makeMemoryManagerPod(podName string, ctnAttributes []memoryManagerCtnAttrib
Spec: v1.PodSpec{ Spec: v1.PodSpec{
RestartPolicy: v1.RestartPolicyNever, RestartPolicy: v1.RestartPolicyNever,
Containers: containers, Containers: containers,
InitContainers: initContainers,
}, },
} }
@ -217,7 +231,7 @@ var _ = SIGDescribe("Memory Manager [Serial] [Feature:MemoryManager][NodeAlphaFe
// TODO: add more complex tests that will include interaction between CPUManager, MemoryManager and TopologyManager // TODO: add more complex tests that will include interaction between CPUManager, MemoryManager and TopologyManager
var ( var (
allNUMANodes []int allNUMANodes []int
ctnParams []memoryManagerCtnAttributes ctnParams, initCtnParams []memoryManagerCtnAttributes
is2MiHugepagesSupported *bool is2MiHugepagesSupported *bool
isMultiNUMASupported *bool isMultiNUMASupported *bool
kubeParams *kubeletParams kubeParams *kubeletParams
@ -287,7 +301,7 @@ var _ = SIGDescribe("Memory Manager [Serial] [Feature:MemoryManager][NodeAlphaFe
} }
} }
testPod = makeMemoryManagerPod(ctnParams[0].ctnName, ctnParams) testPod = makeMemoryManagerPod(ctnParams[0].ctnName, initCtnParams, ctnParams)
}) })
ginkgo.JustAfterEach(func() { ginkgo.JustAfterEach(func() {
@ -309,8 +323,51 @@ var _ = SIGDescribe("Memory Manager [Serial] [Feature:MemoryManager][NodeAlphaFe
tmpParams := *defaultKubeParams tmpParams := *defaultKubeParams
tmpParams.memoryManagerPolicy = staticPolicy tmpParams.memoryManagerPolicy = staticPolicy
kubeParams = &tmpParams kubeParams = &tmpParams
})
// override pod parameters ginkgo.JustAfterEach(func() {
// reset containers attributes
ctnParams = []memoryManagerCtnAttributes{}
initCtnParams = []memoryManagerCtnAttributes{}
})
ginkgo.When("pod has init and app containers", func() {
ginkgo.BeforeEach(func() {
// override containers parameters
ctnParams = []memoryManagerCtnAttributes{
{
ctnName: "memory-manager-static",
cpus: "100m",
memory: "128Mi",
},
}
// override init container parameters
initCtnParams = []memoryManagerCtnAttributes{
{
ctnName: "init-memory-manager-static",
cpus: "100m",
memory: "128Mi",
},
}
})
ginkgo.It("should succeed to start the pod", func() {
ginkgo.By("Running the test pod")
testPod = f.PodClient().CreateSync(testPod)
// it no taste to verify NUMA pinning when the node has only one NUMA node
if !*isMultiNUMASupported {
return
}
verifyMemoryPinning([]int{0})
})
})
ginkgo.When("pod has only app containers", func() {
ginkgo.BeforeEach(func() {
// override containers parameters
ctnParams = []memoryManagerCtnAttributes{ ctnParams = []memoryManagerCtnAttributes{
{ {
ctnName: "memory-manager-static", ctnName: "memory-manager-static",
@ -332,6 +389,7 @@ var _ = SIGDescribe("Memory Manager [Serial] [Feature:MemoryManager][NodeAlphaFe
verifyMemoryPinning([]int{0}) verifyMemoryPinning([]int{0})
}) })
}) })
})
ginkgo.Context("with none policy", func() { ginkgo.Context("with none policy", func() {
ginkgo.BeforeEach(func() { ginkgo.BeforeEach(func() {