Skip to content

Commit 502e0f5

Browse files
committed
Adding support for pod level resources in kubectl
1. Add support for pod level resources in kubectl 2. Reuse the existing method to describe container resources and generalize it to describe both pod and container level resources
1 parent 85488b5 commit 502e0f5

File tree

2 files changed

+80
-7
lines changed

2 files changed

+80
-7
lines changed

staging/src/k8s.io/kubectl/pkg/describe/describe.go

+15-7
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,11 @@ func describePod(pod *corev1.Pod, events *corev1.EventList) (string, error) {
838838
w.Write(LEVEL_0, "NominatedNodeName:\t%s\n", pod.Status.NominatedNodeName)
839839
}
840840

841+
if pod.Spec.Resources != nil {
842+
w.Write(LEVEL_0, "Resources:\n")
843+
describeResources(pod.Spec.Resources, w, LEVEL_1)
844+
}
845+
841846
if len(pod.Spec.InitContainers) > 0 {
842847
describeContainers("Init Containers", pod.Spec.InitContainers, pod.Status.InitContainerStatuses, EnvValueRetriever(pod), w, "")
843848
}
@@ -1800,7 +1805,7 @@ func describeContainers(label string, containers []corev1.Container, containerSt
18001805
if ok {
18011806
describeContainerState(status, w)
18021807
}
1803-
describeContainerResource(container, w)
1808+
describeResources(&container.Resources, w, LEVEL_2)
18041809
describeContainerProbe(container, w)
18051810
if len(container.EnvFrom) > 0 {
18061811
describeContainerEnvFrom(container, resolverFn, w)
@@ -1886,22 +1891,25 @@ func describeContainerCommand(container corev1.Container, w PrefixWriter) {
18861891
}
18871892
}
18881893

1889-
func describeContainerResource(container corev1.Container, w PrefixWriter) {
1890-
resources := container.Resources
1894+
func describeResources(resources *corev1.ResourceRequirements, w PrefixWriter, level int) {
1895+
if resources == nil {
1896+
return
1897+
}
1898+
18911899
if len(resources.Limits) > 0 {
1892-
w.Write(LEVEL_2, "Limits:\n")
1900+
w.Write(level, "Limits:\n")
18931901
}
18941902
for _, name := range SortedResourceNames(resources.Limits) {
18951903
quantity := resources.Limits[name]
1896-
w.Write(LEVEL_3, "%s:\t%s\n", name, quantity.String())
1904+
w.Write(level+1, "%s:\t%s\n", name, quantity.String())
18971905
}
18981906

18991907
if len(resources.Requests) > 0 {
1900-
w.Write(LEVEL_2, "Requests:\n")
1908+
w.Write(level, "Requests:\n")
19011909
}
19021910
for _, name := range SortedResourceNames(resources.Requests) {
19031911
quantity := resources.Requests[name]
1904-
w.Write(LEVEL_3, "%s:\t%s\n", name, quantity.String())
1912+
w.Write(level+1, "%s:\t%s\n", name, quantity.String())
19051913
}
19061914
}
19071915

staging/src/k8s.io/kubectl/pkg/describe/describe_test.go

+65
Original file line numberDiff line numberDiff line change
@@ -1179,6 +1179,71 @@ func VerifyDatesInOrder(
11791179
}
11801180
}
11811181

1182+
func TestDescribeResources(t *testing.T) {
1183+
testCases := []struct {
1184+
resources *corev1.ResourceRequirements
1185+
expectedElements map[string]int
1186+
}{
1187+
{
1188+
resources: &corev1.ResourceRequirements{},
1189+
expectedElements: map[string]int{},
1190+
},
1191+
{
1192+
resources: &corev1.ResourceRequirements{
1193+
Requests: corev1.ResourceList{
1194+
corev1.ResourceCPU: resource.MustParse("1000"),
1195+
corev1.ResourceMemory: resource.MustParse("100Mi"),
1196+
},
1197+
Limits: corev1.ResourceList{
1198+
corev1.ResourceCPU: resource.MustParse("1000"),
1199+
corev1.ResourceMemory: resource.MustParse("100Mi"),
1200+
},
1201+
},
1202+
expectedElements: map[string]int{"cpu": 2, "memory": 2, "Requests": 1, "Limits": 1, "1k": 2, "100Mi": 2},
1203+
},
1204+
{
1205+
resources: &corev1.ResourceRequirements{
1206+
Limits: corev1.ResourceList{
1207+
corev1.ResourceCPU: resource.MustParse("1000"),
1208+
corev1.ResourceMemory: resource.MustParse("100Mi"),
1209+
},
1210+
},
1211+
expectedElements: map[string]int{"cpu": 1, "memory": 1, "Limits": 1, "1k": 1, "100Mi": 1},
1212+
},
1213+
{
1214+
resources: &corev1.ResourceRequirements{
1215+
Requests: corev1.ResourceList{
1216+
corev1.ResourceCPU: resource.MustParse("1000"),
1217+
corev1.ResourceMemory: resource.MustParse("100Mi"),
1218+
},
1219+
},
1220+
expectedElements: map[string]int{"cpu": 1, "memory": 1, "Requests": 1, "1k": 1, "100Mi": 1},
1221+
},
1222+
}
1223+
1224+
for i, testCase := range testCases {
1225+
t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
1226+
out := new(bytes.Buffer)
1227+
writer := NewPrefixWriter(out)
1228+
describeResources(testCase.resources, writer, LEVEL_1)
1229+
output := out.String()
1230+
gotElements := make(map[string]int)
1231+
for key, val := range testCase.expectedElements {
1232+
count := strings.Count(output, key)
1233+
if count == 0 {
1234+
t.Errorf("expected to find %q in output: %q", val, output)
1235+
continue
1236+
}
1237+
gotElements[key] = count
1238+
}
1239+
1240+
if !reflect.DeepEqual(gotElements, testCase.expectedElements) {
1241+
t.Errorf("Expected %v, got %v in output string: %q", testCase.expectedElements, gotElements, output)
1242+
}
1243+
})
1244+
}
1245+
}
1246+
11821247
func TestDescribeContainers(t *testing.T) {
11831248
trueVal := true
11841249
testCases := []struct {

0 commit comments

Comments
 (0)