summary_test.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. // +build !windows
  2. /*
  3. Copyright 2016 The Kubernetes Authors.
  4. Licensed under the Apache License, Version 2.0 (the "License");
  5. you may not use this file except in compliance with the License.
  6. You may obtain a copy of the License at
  7. http://www.apache.org/licenses/LICENSE-2.0
  8. Unless required by applicable law or agreed to in writing, software
  9. distributed under the License is distributed on an "AS IS" BASIS,
  10. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. See the License for the specific language governing permissions and
  12. limitations under the License.
  13. */
  14. package stats
  15. import (
  16. "testing"
  17. "time"
  18. fuzz "github.com/google/gofuzz"
  19. "github.com/stretchr/testify/assert"
  20. "k8s.io/api/core/v1"
  21. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  22. statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1"
  23. "k8s.io/kubernetes/pkg/kubelet/cm"
  24. statstest "k8s.io/kubernetes/pkg/kubelet/server/stats/testing"
  25. )
  26. var (
  27. imageFsStats = getFsStats()
  28. rootFsStats = getFsStats()
  29. node = &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "test-node"}}
  30. nodeConfig = cm.NodeConfig{
  31. RuntimeCgroupsName: "/runtime",
  32. SystemCgroupsName: "/misc",
  33. KubeletCgroupsName: "/kubelet",
  34. }
  35. cgroupRoot = "/kubepods"
  36. rlimitStats = getRlimitStats()
  37. )
  38. func TestSummaryProviderGetStats(t *testing.T) {
  39. assert := assert.New(t)
  40. podStats := []statsapi.PodStats{
  41. {
  42. PodRef: statsapi.PodReference{Name: "test-pod", Namespace: "test-namespace", UID: "UID_test-pod"},
  43. StartTime: metav1.NewTime(time.Now()),
  44. Containers: []statsapi.ContainerStats{*getContainerStats()},
  45. Network: getNetworkStats(),
  46. VolumeStats: []statsapi.VolumeStats{*getVolumeStats()},
  47. },
  48. }
  49. cgroupStatsMap := map[string]struct {
  50. cs *statsapi.ContainerStats
  51. ns *statsapi.NetworkStats
  52. }{
  53. "/": {cs: getContainerStats(), ns: getNetworkStats()},
  54. "/runtime": {cs: getContainerStats(), ns: getNetworkStats()},
  55. "/misc": {cs: getContainerStats(), ns: getNetworkStats()},
  56. "/kubelet": {cs: getContainerStats(), ns: getNetworkStats()},
  57. "/pods": {cs: getContainerStats(), ns: getNetworkStats()},
  58. }
  59. mockStatsProvider := new(statstest.StatsProvider)
  60. mockStatsProvider.
  61. On("GetNode").Return(node, nil).
  62. On("GetNodeConfig").Return(nodeConfig).
  63. On("GetPodCgroupRoot").Return(cgroupRoot).
  64. On("ListPodStats").Return(podStats, nil).
  65. On("ListPodStatsAndUpdateCPUNanoCoreUsage").Return(podStats, nil).
  66. On("ImageFsStats").Return(imageFsStats, nil).
  67. On("RootFsStats").Return(rootFsStats, nil).
  68. On("RlimitStats").Return(rlimitStats, nil).
  69. On("GetCgroupStats", "/", true).Return(cgroupStatsMap["/"].cs, cgroupStatsMap["/"].ns, nil).
  70. On("GetCgroupStats", "/runtime", false).Return(cgroupStatsMap["/runtime"].cs, cgroupStatsMap["/runtime"].ns, nil).
  71. On("GetCgroupStats", "/misc", false).Return(cgroupStatsMap["/misc"].cs, cgroupStatsMap["/misc"].ns, nil).
  72. On("GetCgroupStats", "/kubelet", false).Return(cgroupStatsMap["/kubelet"].cs, cgroupStatsMap["/kubelet"].ns, nil).
  73. On("GetCgroupStats", "/kubepods", true).Return(cgroupStatsMap["/pods"].cs, cgroupStatsMap["/pods"].ns, nil)
  74. kubeletCreationTime := metav1.Now()
  75. systemBootTime := metav1.Now()
  76. provider := summaryProviderImpl{kubeletCreationTime: kubeletCreationTime, systemBootTime: systemBootTime, provider: mockStatsProvider}
  77. summary, err := provider.Get(true)
  78. assert.NoError(err)
  79. assert.Equal(summary.Node.NodeName, "test-node")
  80. assert.Equal(summary.Node.StartTime, systemBootTime)
  81. assert.Equal(summary.Node.CPU, cgroupStatsMap["/"].cs.CPU)
  82. assert.Equal(summary.Node.Memory, cgroupStatsMap["/"].cs.Memory)
  83. assert.Equal(summary.Node.Network, cgroupStatsMap["/"].ns)
  84. assert.Equal(summary.Node.Fs, rootFsStats)
  85. assert.Equal(summary.Node.Runtime, &statsapi.RuntimeStats{ImageFs: imageFsStats})
  86. assert.Equal(len(summary.Node.SystemContainers), 4)
  87. assert.Contains(summary.Node.SystemContainers, statsapi.ContainerStats{
  88. Name: "kubelet",
  89. StartTime: kubeletCreationTime,
  90. CPU: cgroupStatsMap["/kubelet"].cs.CPU,
  91. Memory: cgroupStatsMap["/kubelet"].cs.Memory,
  92. Accelerators: cgroupStatsMap["/kubelet"].cs.Accelerators,
  93. UserDefinedMetrics: cgroupStatsMap["/kubelet"].cs.UserDefinedMetrics,
  94. })
  95. assert.Contains(summary.Node.SystemContainers, statsapi.ContainerStats{
  96. Name: "misc",
  97. StartTime: cgroupStatsMap["/misc"].cs.StartTime,
  98. CPU: cgroupStatsMap["/misc"].cs.CPU,
  99. Memory: cgroupStatsMap["/misc"].cs.Memory,
  100. Accelerators: cgroupStatsMap["/misc"].cs.Accelerators,
  101. UserDefinedMetrics: cgroupStatsMap["/misc"].cs.UserDefinedMetrics,
  102. })
  103. assert.Contains(summary.Node.SystemContainers, statsapi.ContainerStats{
  104. Name: "runtime",
  105. StartTime: cgroupStatsMap["/runtime"].cs.StartTime,
  106. CPU: cgroupStatsMap["/runtime"].cs.CPU,
  107. Memory: cgroupStatsMap["/runtime"].cs.Memory,
  108. Accelerators: cgroupStatsMap["/runtime"].cs.Accelerators,
  109. UserDefinedMetrics: cgroupStatsMap["/runtime"].cs.UserDefinedMetrics,
  110. })
  111. assert.Contains(summary.Node.SystemContainers, statsapi.ContainerStats{
  112. Name: "pods",
  113. StartTime: cgroupStatsMap["/pods"].cs.StartTime,
  114. CPU: cgroupStatsMap["/pods"].cs.CPU,
  115. Memory: cgroupStatsMap["/pods"].cs.Memory,
  116. Accelerators: cgroupStatsMap["/pods"].cs.Accelerators,
  117. UserDefinedMetrics: cgroupStatsMap["/pods"].cs.UserDefinedMetrics,
  118. })
  119. assert.Equal(summary.Pods, podStats)
  120. }
  121. func TestSummaryProviderGetCPUAndMemoryStats(t *testing.T) {
  122. assert := assert.New(t)
  123. podStats := []statsapi.PodStats{
  124. {
  125. PodRef: statsapi.PodReference{Name: "test-pod", Namespace: "test-namespace", UID: "UID_test-pod"},
  126. StartTime: metav1.NewTime(time.Now()),
  127. Containers: []statsapi.ContainerStats{*getContainerStats()},
  128. },
  129. }
  130. cgroupStatsMap := map[string]struct {
  131. cs *statsapi.ContainerStats
  132. }{
  133. "/": {cs: getVolumeCPUAndMemoryStats()},
  134. "/runtime": {cs: getVolumeCPUAndMemoryStats()},
  135. "/misc": {cs: getVolumeCPUAndMemoryStats()},
  136. "/kubelet": {cs: getVolumeCPUAndMemoryStats()},
  137. "/pods": {cs: getVolumeCPUAndMemoryStats()},
  138. }
  139. mockStatsProvider := new(statstest.StatsProvider)
  140. mockStatsProvider.
  141. On("GetNode").Return(node, nil).
  142. On("GetNodeConfig").Return(nodeConfig).
  143. On("GetPodCgroupRoot").Return(cgroupRoot).
  144. On("ListPodCPUAndMemoryStats").Return(podStats, nil).
  145. On("GetCgroupCPUAndMemoryStats", "/", false).Return(cgroupStatsMap["/"].cs, nil).
  146. On("GetCgroupCPUAndMemoryStats", "/runtime", false).Return(cgroupStatsMap["/runtime"].cs, nil).
  147. On("GetCgroupCPUAndMemoryStats", "/misc", false).Return(cgroupStatsMap["/misc"].cs, nil).
  148. On("GetCgroupCPUAndMemoryStats", "/kubelet", false).Return(cgroupStatsMap["/kubelet"].cs, nil).
  149. On("GetCgroupCPUAndMemoryStats", "/kubepods", false).Return(cgroupStatsMap["/pods"].cs, nil)
  150. provider := NewSummaryProvider(mockStatsProvider)
  151. summary, err := provider.GetCPUAndMemoryStats()
  152. assert.NoError(err)
  153. assert.Equal(summary.Node.NodeName, "test-node")
  154. assert.Equal(summary.Node.StartTime, cgroupStatsMap["/"].cs.StartTime)
  155. assert.Equal(summary.Node.CPU, cgroupStatsMap["/"].cs.CPU)
  156. assert.Equal(summary.Node.Memory, cgroupStatsMap["/"].cs.Memory)
  157. assert.Nil(summary.Node.Network)
  158. assert.Nil(summary.Node.Fs)
  159. assert.Nil(summary.Node.Runtime)
  160. assert.Equal(len(summary.Node.SystemContainers), 4)
  161. assert.Contains(summary.Node.SystemContainers, statsapi.ContainerStats{
  162. Name: "kubelet",
  163. StartTime: cgroupStatsMap["/kubelet"].cs.StartTime,
  164. CPU: cgroupStatsMap["/kubelet"].cs.CPU,
  165. Memory: cgroupStatsMap["/kubelet"].cs.Memory,
  166. })
  167. assert.Contains(summary.Node.SystemContainers, statsapi.ContainerStats{
  168. Name: "misc",
  169. StartTime: cgroupStatsMap["/misc"].cs.StartTime,
  170. CPU: cgroupStatsMap["/misc"].cs.CPU,
  171. Memory: cgroupStatsMap["/misc"].cs.Memory,
  172. })
  173. assert.Contains(summary.Node.SystemContainers, statsapi.ContainerStats{
  174. Name: "runtime",
  175. StartTime: cgroupStatsMap["/runtime"].cs.StartTime,
  176. CPU: cgroupStatsMap["/runtime"].cs.CPU,
  177. Memory: cgroupStatsMap["/runtime"].cs.Memory,
  178. })
  179. assert.Contains(summary.Node.SystemContainers, statsapi.ContainerStats{
  180. Name: "pods",
  181. StartTime: cgroupStatsMap["/pods"].cs.StartTime,
  182. CPU: cgroupStatsMap["/pods"].cs.CPU,
  183. Memory: cgroupStatsMap["/pods"].cs.Memory,
  184. })
  185. assert.Equal(summary.Pods, podStats)
  186. }
  187. func getFsStats() *statsapi.FsStats {
  188. f := fuzz.New().NilChance(0)
  189. v := &statsapi.FsStats{}
  190. f.Fuzz(v)
  191. return v
  192. }
  193. func getContainerStats() *statsapi.ContainerStats {
  194. f := fuzz.New().NilChance(0)
  195. v := &statsapi.ContainerStats{}
  196. f.Fuzz(v)
  197. return v
  198. }
  199. func getVolumeCPUAndMemoryStats() *statsapi.ContainerStats {
  200. f := fuzz.New().NilChance(0)
  201. v := &statsapi.ContainerStats{}
  202. f.Fuzz(&v.Name)
  203. f.Fuzz(&v.StartTime)
  204. f.Fuzz(v.CPU)
  205. f.Fuzz(v.Memory)
  206. return v
  207. }
  208. func getVolumeStats() *statsapi.VolumeStats {
  209. f := fuzz.New().NilChance(0)
  210. v := &statsapi.VolumeStats{}
  211. f.Fuzz(v)
  212. return v
  213. }
  214. func getNetworkStats() *statsapi.NetworkStats {
  215. f := fuzz.New().NilChance(0)
  216. v := &statsapi.NetworkStats{}
  217. f.Fuzz(v)
  218. return v
  219. }
  220. func getRlimitStats() *statsapi.RlimitStats {
  221. f := fuzz.New().NilChance(0)
  222. v := &statsapi.RlimitStats{}
  223. f.Fuzz(v)
  224. return v
  225. }