Skip to content

Commit a179790

Browse files
authored
Merge pull request kosmos-io#805 from rxy0210/main_fix_node_test
fix: calculate node resources
2 parents 8087153 + 6609726 commit a179790

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
lines changed

pkg/utils/resources.go

+20-6
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,29 @@ const (
1111
)
1212

1313
func CalculateClusterResources(nodes *corev1.NodeList, pods *corev1.PodList) corev1.ResourceList {
14-
base := GetNodesTotalResources(nodes)
15-
reqs, _ := GetPodsTotalRequestsAndLimits(pods)
14+
unavailableNodes := GetNotReadyAndUnschedulableLeafNodes(nodes)
15+
base := GetNodesTotalResources(nodes, unavailableNodes)
16+
reqs, _ := GetPodsTotalRequestsAndLimits(pods, unavailableNodes)
1617
podNums := GetUsedPodNums(pods, nodes)
1718
SubResourceList(base, reqs)
1819
SubResourceList(base, podNums)
1920
return base
2021
}
2122

22-
func GetNodesTotalResources(nodes *corev1.NodeList) (total corev1.ResourceList) {
23+
func GetNotReadyAndUnschedulableLeafNodes(leafNodes *corev1.NodeList) (unavailableNodes map[string]corev1.Node) {
24+
unavailableNodes = make(map[string]corev1.Node)
25+
for i, n := range leafNodes.Items {
26+
if n.Spec.Unschedulable || !NodeReady(&leafNodes.Items[i]) {
27+
unavailableNodes[n.Name] = n
28+
}
29+
}
30+
return unavailableNodes
31+
}
32+
33+
func GetNodesTotalResources(nodes *corev1.NodeList, unavailableNodes map[string]corev1.Node) (total corev1.ResourceList) {
2334
total = corev1.ResourceList{}
24-
for i, n := range nodes.Items {
25-
if n.Spec.Unschedulable || !NodeReady(&nodes.Items[i]) {
35+
for _, n := range nodes.Items {
36+
if _, ok := unavailableNodes[n.Name]; ok {
2637
continue
2738
}
2839
for key, val := range n.Status.Allocatable {
@@ -50,7 +61,7 @@ func SubResourceList(base, list corev1.ResourceList) {
5061

5162
// GetPodsTotalRequestsAndLimits
5263
// lifted from https://github.com/kubernetes/kubernetes/blob/v1.21.8/staging/src/k8s.io/kubectl/pkg/describe/describe.go#L4051
53-
func GetPodsTotalRequestsAndLimits(podList *corev1.PodList) (reqs corev1.ResourceList, limits corev1.ResourceList) {
64+
func GetPodsTotalRequestsAndLimits(podList *corev1.PodList, unavailableNodes map[string]corev1.Node) (reqs corev1.ResourceList, limits corev1.ResourceList) {
5465
reqs, limits = corev1.ResourceList{}, corev1.ResourceList{}
5566
if podList.Items != nil {
5667
for _, p := range podList.Items {
@@ -61,6 +72,9 @@ func GetPodsTotalRequestsAndLimits(podList *corev1.PodList) (reqs corev1.Resourc
6172
if pod.Status.Phase != corev1.PodRunning {
6273
continue
6374
}
75+
if _, ok := unavailableNodes[pod.Spec.NodeName]; ok {
76+
continue
77+
}
6478
podReqs, podLimits := v1resource.PodRequestsAndLimits(&pod)
6579
for podReqName, podReqValue := range podReqs {
6680
if value, ok := reqs[podReqName]; !ok {

pkg/utils/resources_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ func TestGetNodesTotalResources(t *testing.T) {
1414
name string
1515
nodes *corev1.NodeList
1616
expected corev1.ResourceList
17+
notNodes map[string]corev1.Node
1718
}{
1819
{
1920
name: "No nodes",
@@ -45,7 +46,7 @@ func TestGetNodesTotalResources(t *testing.T) {
4546

4647
for _, tt := range tests {
4748
t.Run(tt.name, func(t *testing.T) {
48-
result := GetNodesTotalResources(tt.nodes)
49+
result := GetNodesTotalResources(tt.nodes, tt.notNodes)
4950
for key, expectedValue := range tt.expected {
5051
if result[key] != expectedValue {
5152
t.Errorf("expected %s for %s, got %v", expectedValue.String(), key.String(), result[key])
@@ -108,6 +109,7 @@ func TestGetPodsTotalRequestsAndLimits(t *testing.T) {
108109
podList *corev1.PodList
109110
expectedReqs corev1.ResourceList
110111
expectedLimits corev1.ResourceList
112+
notNodes map[string]corev1.Node
111113
}{
112114
{
113115
name: "No pods",
@@ -234,7 +236,7 @@ func TestGetPodsTotalRequestsAndLimits(t *testing.T) {
234236

235237
for _, tt := range tests {
236238
t.Run(tt.name, func(t *testing.T) {
237-
reqs, limits := GetPodsTotalRequestsAndLimits(tt.podList)
239+
reqs, limits := GetPodsTotalRequestsAndLimits(tt.podList, tt.notNodes)
238240
for key, expectedValue := range tt.expectedReqs {
239241
if reqs[key] != expectedValue {
240242
t.Errorf("expected %s for requests %s, got %v", expectedValue.String(), key.String(), reqs[key])

0 commit comments

Comments
 (0)