1
16
17 package top
18
19 import (
20 "bytes"
21 "encoding/json"
22 "io"
23 "time"
24
25 "testing"
26
27 v1 "k8s.io/api/core/v1"
28 "k8s.io/apimachinery/pkg/api/resource"
29 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
30 "k8s.io/cli-runtime/pkg/genericiooptions"
31 cmdtesting "k8s.io/kubectl/pkg/cmd/testing"
32 metricsv1beta1api "k8s.io/metrics/pkg/apis/metrics/v1beta1"
33 )
34
35 func TestTopSubcommandsExist(t *testing.T) {
36 cmdtesting.InitTestErrorHandler(t)
37
38 f := cmdtesting.NewTestFactory()
39 defer f.Cleanup()
40
41 cmd := NewCmdTop(f, genericiooptions.NewTestIOStreamsDiscard())
42 if !cmd.HasSubCommands() {
43 t.Error("top command should have subcommands")
44 }
45 }
46
47 func marshallBody(metrics interface{}) (io.ReadCloser, error) {
48 result, err := json.Marshal(metrics)
49 if err != nil {
50 return nil, err
51 }
52 return io.NopCloser(bytes.NewReader(result)), nil
53 }
54
55 func testNodeV1beta1MetricsData() (*metricsv1beta1api.NodeMetricsList, *v1.NodeList) {
56 metrics := &metricsv1beta1api.NodeMetricsList{
57 ListMeta: metav1.ListMeta{
58 ResourceVersion: "1",
59 },
60 Items: []metricsv1beta1api.NodeMetrics{
61 {
62 ObjectMeta: metav1.ObjectMeta{Name: "node1", ResourceVersion: "10", Labels: map[string]string{"key": "value"}},
63 Window: metav1.Duration{Duration: time.Minute},
64 Usage: v1.ResourceList{
65 v1.ResourceCPU: *resource.NewMilliQuantity(1, resource.DecimalSI),
66 v1.ResourceMemory: *resource.NewQuantity(2*(1024*1024), resource.DecimalSI),
67 v1.ResourceStorage: *resource.NewQuantity(3*(1024*1024), resource.DecimalSI),
68 },
69 },
70 {
71 ObjectMeta: metav1.ObjectMeta{Name: "node2", ResourceVersion: "11"},
72 Window: metav1.Duration{Duration: time.Minute},
73 Usage: v1.ResourceList{
74 v1.ResourceCPU: *resource.NewMilliQuantity(5, resource.DecimalSI),
75 v1.ResourceMemory: *resource.NewQuantity(6*(1024*1024), resource.DecimalSI),
76 v1.ResourceStorage: *resource.NewQuantity(7*(1024*1024), resource.DecimalSI),
77 },
78 },
79 {
80 ObjectMeta: metav1.ObjectMeta{Name: "node3", ResourceVersion: "11"},
81 Window: metav1.Duration{Duration: time.Minute},
82 Usage: v1.ResourceList{
83 v1.ResourceCPU: *resource.NewMilliQuantity(3, resource.DecimalSI),
84 v1.ResourceMemory: *resource.NewQuantity(4*(1024*1024), resource.DecimalSI),
85 v1.ResourceStorage: *resource.NewQuantity(5*(1024*1024), resource.DecimalSI),
86 },
87 },
88 },
89 }
90 nodes := &v1.NodeList{
91 ListMeta: metav1.ListMeta{
92 ResourceVersion: "15",
93 },
94 Items: []v1.Node{
95 {
96 ObjectMeta: metav1.ObjectMeta{Name: "node1", ResourceVersion: "10"},
97 Status: v1.NodeStatus{
98 Allocatable: v1.ResourceList{
99 v1.ResourceCPU: *resource.NewMilliQuantity(10, resource.DecimalSI),
100 v1.ResourceMemory: *resource.NewQuantity(20*(1024*1024), resource.DecimalSI),
101 v1.ResourceStorage: *resource.NewQuantity(30*(1024*1024), resource.DecimalSI),
102 },
103 },
104 },
105 {
106 ObjectMeta: metav1.ObjectMeta{Name: "node2", ResourceVersion: "11"},
107 Status: v1.NodeStatus{
108 Allocatable: v1.ResourceList{
109 v1.ResourceCPU: *resource.NewMilliQuantity(50, resource.DecimalSI),
110 v1.ResourceMemory: *resource.NewQuantity(60*(1024*1024), resource.DecimalSI),
111 v1.ResourceStorage: *resource.NewQuantity(70*(1024*1024), resource.DecimalSI),
112 },
113 },
114 },
115 {
116 ObjectMeta: metav1.ObjectMeta{Name: "node3", ResourceVersion: "11"},
117 Status: v1.NodeStatus{
118 Allocatable: v1.ResourceList{
119 v1.ResourceCPU: *resource.NewMilliQuantity(30, resource.DecimalSI),
120 v1.ResourceMemory: *resource.NewQuantity(40*(1024*1024), resource.DecimalSI),
121 v1.ResourceStorage: *resource.NewQuantity(50*(1024*1024), resource.DecimalSI),
122 },
123 },
124 },
125 },
126 }
127 return metrics, nodes
128 }
129
View as plain text