func newFakeNodeBuilder(uid types.UID, name string) *FakeNodeBuilder { node := new(api.Node) node.UID = uid node.Name = name return &FakeNodeBuilder{ node: node, } }
func TestBuildSummary(t *testing.T) { node := api.Node{} node.Name = "FooNode" nodeConfig := cm.NodeConfig{ RuntimeCgroupsName: "/docker-daemon", SystemCgroupsName: "/system", KubeletCgroupsName: "/kubelet", } const ( namespace0 = "test0" namespace2 = "test2" ) const ( seedRoot = 0 seedRuntime = 100 seedKubelet = 200 seedMisc = 300 seedPod0Infra = 1000 seedPod0Container0 = 2000 seedPod0Container1 = 2001 seedPod1Infra = 3000 seedPod1Container = 4000 seedPod2Infra = 5000 seedPod2Container = 6000 ) const ( pName0 = "pod0" pName1 = "pod1" pName2 = "pod0" // ensure pName2 conflicts with pName0, but is in a different namespace ) const ( cName00 = "c0" cName01 = "c1" cName10 = "c0" // ensure cName10 conflicts with cName02, but is in a different pod cName20 = "c1" // ensure cName20 conflicts with cName01, but is in a different pod + namespace ) prf0 := kubestats.PodReference{Name: pName0, Namespace: namespace0, UID: "UID" + pName0} prf1 := kubestats.PodReference{Name: pName1, Namespace: namespace0, UID: "UID" + pName1} prf2 := kubestats.PodReference{Name: pName2, Namespace: namespace2, UID: "UID" + pName2} infos := map[string]v2.ContainerInfo{ "/": summaryTestContainerInfo(seedRoot, "", "", ""), "/docker-daemon": summaryTestContainerInfo(seedRuntime, "", "", ""), "/kubelet": summaryTestContainerInfo(seedKubelet, "", "", ""), "/system": summaryTestContainerInfo(seedMisc, "", "", ""), // Pod0 - Namespace0 "/pod0-i": summaryTestContainerInfo(seedPod0Infra, pName0, namespace0, leaky.PodInfraContainerName), "/pod0-c0": summaryTestContainerInfo(seedPod0Container0, pName0, namespace0, cName00), "/pod0-c1": summaryTestContainerInfo(seedPod0Container1, pName0, namespace0, cName01), // Pod1 - Namespace0 "/pod1-i": summaryTestContainerInfo(seedPod1Infra, pName1, namespace0, leaky.PodInfraContainerName), "/pod1-c0": summaryTestContainerInfo(seedPod1Container, pName1, namespace0, cName10), // Pod2 - Namespace2 "/pod2-i": summaryTestContainerInfo(seedPod2Infra, pName2, namespace2, leaky.PodInfraContainerName), "/pod2-c0": summaryTestContainerInfo(seedPod2Container, pName2, namespace2, cName20), } rootfs := v2.FsInfo{} imagefs := v2.FsInfo{} // memory limit overrides for each container (used to test available bytes if a memory limit is known) memoryLimitOverrides := map[string]uint64{ "/": uint64(1 << 30), "/pod2-c0": uint64(1 << 15), } for name, memoryLimitOverride := range memoryLimitOverrides { info, found := infos[name] if !found { t.Errorf("No container defined with name %v", name) } info.Spec.Memory.Limit = memoryLimitOverride infos[name] = info } sb := &summaryBuilder{ newFsResourceAnalyzer(&MockStatsProvider{}, time.Minute*5), &node, nodeConfig, rootfs, imagefs, container.ImageStats{}, infos} summary, err := sb.build() assert.NoError(t, err) nodeStats := summary.Node assert.Equal(t, "FooNode", nodeStats.NodeName) assert.EqualValues(t, testTime(creationTime, seedRoot).Unix(), nodeStats.StartTime.Time.Unix()) checkCPUStats(t, "Node", seedRoot, nodeStats.CPU) checkMemoryStats(t, "Node", seedRoot, infos["/"], nodeStats.Memory) checkNetworkStats(t, "Node", seedRoot, nodeStats.Network) systemSeeds := map[string]int{ kubestats.SystemContainerRuntime: seedRuntime, kubestats.SystemContainerKubelet: seedKubelet, kubestats.SystemContainerMisc: seedMisc, } systemContainerToNodeCgroup := map[string]string{ kubestats.SystemContainerRuntime: nodeConfig.RuntimeCgroupsName, kubestats.SystemContainerKubelet: nodeConfig.KubeletCgroupsName, kubestats.SystemContainerMisc: nodeConfig.SystemCgroupsName, } for _, sys := range nodeStats.SystemContainers { name := sys.Name info := infos[systemContainerToNodeCgroup[name]] seed, found := systemSeeds[name] if !found { t.Errorf("Unknown SystemContainer: %q", name) } assert.EqualValues(t, testTime(creationTime, seed).Unix(), sys.StartTime.Time.Unix(), name+".StartTime") checkCPUStats(t, name, seed, sys.CPU) checkMemoryStats(t, name, seed, info, sys.Memory) } assert.Equal(t, 3, len(summary.Pods)) indexPods := make(map[kubestats.PodReference]kubestats.PodStats, len(summary.Pods)) for _, pod := range summary.Pods { indexPods[pod.PodRef] = pod } // Validate Pod0 Results ps, found := indexPods[prf0] assert.True(t, found) assert.Len(t, ps.Containers, 2) indexCon := make(map[string]kubestats.ContainerStats, len(ps.Containers)) for _, con := range ps.Containers { indexCon[con.Name] = con } con := indexCon[cName00] assert.EqualValues(t, testTime(creationTime, seedPod0Container0).Unix(), con.StartTime.Time.Unix()) checkCPUStats(t, "Pod0Container0", seedPod0Container0, con.CPU) checkMemoryStats(t, "Pod0Conainer0", seedPod0Container0, infos["/pod0-c0"], con.Memory) con = indexCon[cName01] assert.EqualValues(t, testTime(creationTime, seedPod0Container1).Unix(), con.StartTime.Time.Unix()) checkCPUStats(t, "Pod0Container1", seedPod0Container1, con.CPU) checkMemoryStats(t, "Pod0Container1", seedPod0Container1, infos["/pod0-c1"], con.Memory) assert.EqualValues(t, testTime(creationTime, seedPod0Infra).Unix(), ps.StartTime.Time.Unix()) checkNetworkStats(t, "Pod0", seedPod0Infra, ps.Network) // Validate Pod1 Results ps, found = indexPods[prf1] assert.True(t, found) assert.Len(t, ps.Containers, 1) con = ps.Containers[0] assert.Equal(t, cName10, con.Name) checkCPUStats(t, "Pod1Container0", seedPod1Container, con.CPU) checkMemoryStats(t, "Pod1Container0", seedPod1Container, infos["/pod1-c0"], con.Memory) checkNetworkStats(t, "Pod1", seedPod1Infra, ps.Network) // Validate Pod2 Results ps, found = indexPods[prf2] assert.True(t, found) assert.Len(t, ps.Containers, 1) con = ps.Containers[0] assert.Equal(t, cName20, con.Name) checkCPUStats(t, "Pod2Container0", seedPod2Container, con.CPU) checkMemoryStats(t, "Pod2Container0", seedPod2Container, infos["/pod2-c0"], con.Memory) checkNetworkStats(t, "Pod2", seedPod2Infra, ps.Network) }
func TestBuildSummary(t *testing.T) { node := api.Node{} node.Name = "FooNode" nodeConfig := cm.NodeConfig{ RuntimeCgroupsName: "/docker-daemon", SystemCgroupsName: "/system", KubeletCgroupsName: "/kubelet", } const ( namespace0 = "test0" namespace2 = "test2" ) const ( seedRoot = 0 seedRuntime = 100 seedKubelet = 200 seedMisc = 300 seedPod0Infra = 1000 seedPod0Container0 = 2000 seedPod0Container1 = 2001 seedPod1Infra = 3000 seedPod1Container = 4000 seedPod2Infra = 5000 seedPod2Container = 6000 ) const ( pName0 = "pod0" pName1 = "pod1" pName2 = "pod0" // ensure pName2 conflicts with pName0, but is in a different namespace ) const ( cName00 = "c0" cName01 = "c1" cName10 = "c0" // ensure cName10 conflicts with cName02, but is in a different pod cName20 = "c1" // ensure cName20 conflicts with cName01, but is in a different pod + namespace ) prf0 := PodReference{Name: pName0, Namespace: namespace0, UID: "UID" + pName0} prf1 := PodReference{Name: pName1, Namespace: namespace0, UID: "UID" + pName1} prf2 := PodReference{Name: pName2, Namespace: namespace2, UID: "UID" + pName2} infos := map[string]v2.ContainerInfo{ "/": summaryTestContainerInfo(seedRoot, "", "", ""), "/docker-daemon": summaryTestContainerInfo(seedRuntime, "", "", ""), "/kubelet": summaryTestContainerInfo(seedKubelet, "", "", ""), "/system": summaryTestContainerInfo(seedMisc, "", "", ""), // Pod0 - Namespace0 "/pod0-i": summaryTestContainerInfo(seedPod0Infra, pName0, namespace0, leaky.PodInfraContainerName), "/pod0-c0": summaryTestContainerInfo(seedPod0Container0, pName0, namespace0, cName00), "/pod0-c2": summaryTestContainerInfo(seedPod0Container1, pName0, namespace0, cName01), // Pod1 - Namespace0 "/pod1-i": summaryTestContainerInfo(seedPod1Infra, pName1, namespace0, leaky.PodInfraContainerName), "/pod1-c0": summaryTestContainerInfo(seedPod1Container, pName1, namespace0, cName10), // Pod2 - Namespace2 "/pod2-i": summaryTestContainerInfo(seedPod2Infra, pName2, namespace2, leaky.PodInfraContainerName), "/pod2-c0": summaryTestContainerInfo(seedPod2Container, pName2, namespace2, cName20), } rootfs := v2.FsInfo{} imagefs := v2.FsInfo{} sb := &summaryBuilder{ newFsResourceAnalyzer(&MockStatsProvider{}, time.Minute*5), &node, nodeConfig, rootfs, imagefs, infos} summary, err := sb.build() assert.NoError(t, err) nodeStats := summary.Node assert.Equal(t, "FooNode", nodeStats.NodeName) checkCPUStats(t, "Node", seedRoot, nodeStats.CPU) checkMemoryStats(t, "Node", seedRoot, nodeStats.Memory) checkNetworkStats(t, "Node", seedRoot, nodeStats.Network) systemSeeds := map[string]int{ SystemContainerRuntime: seedRuntime, SystemContainerKubelet: seedKubelet, SystemContainerMisc: seedMisc, } for _, sys := range nodeStats.SystemContainers { name := sys.Name seed, found := systemSeeds[name] if !found { t.Errorf("Unknown SystemContainer: %q", name) } checkCPUStats(t, name, seed, sys.CPU) checkMemoryStats(t, name, seed, sys.Memory) } assert.Equal(t, 3, len(summary.Pods)) indexPods := make(map[PodReference]PodStats, len(summary.Pods)) for _, pod := range summary.Pods { indexPods[pod.PodRef] = pod } // Validate Pod0 Results ps, found := indexPods[prf0] assert.True(t, found) assert.Len(t, ps.Containers, 2) indexCon := make(map[string]ContainerStats, len(ps.Containers)) for _, con := range ps.Containers { indexCon[con.Name] = con } con := indexCon[cName00] checkCPUStats(t, "container", seedPod0Container0, con.CPU) checkMemoryStats(t, "container", seedPod0Container0, con.Memory) con = indexCon[cName01] checkCPUStats(t, "container", seedPod0Container1, con.CPU) checkMemoryStats(t, "container", seedPod0Container1, con.Memory) checkNetworkStats(t, "Pod", seedPod0Infra, ps.Network) // Validate Pod1 Results ps, found = indexPods[prf1] assert.True(t, found) assert.Len(t, ps.Containers, 1) con = ps.Containers[0] assert.Equal(t, cName10, con.Name) checkCPUStats(t, "container", seedPod1Container, con.CPU) checkMemoryStats(t, "container", seedPod1Container, con.Memory) checkNetworkStats(t, "Pod", seedPod1Infra, ps.Network) // Validate Pod2 Results ps, found = indexPods[prf2] assert.True(t, found) assert.Len(t, ps.Containers, 1) con = ps.Containers[0] assert.Equal(t, cName20, con.Name) checkCPUStats(t, "container", seedPod2Container, con.CPU) checkMemoryStats(t, "container", seedPod2Container, con.Memory) checkNetworkStats(t, "Pod", seedPod2Infra, ps.Network) }