diff --git a/go.mod b/go.mod index 888dd96..bcb3f9a 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( k8s.io/api v0.35.2 k8s.io/apimachinery v0.35.2 k8s.io/client-go v0.35.2 + k8s.io/component-helpers v0.35.2 sigs.k8s.io/karpenter v1.9.0 ) diff --git a/go.sum b/go.sum index 8555da9..acb8cb6 100644 --- a/go.sum +++ b/go.sum @@ -271,8 +271,8 @@ k8s.io/client-go v0.35.2 h1:YUfPefdGJA4aljDdayAXkc98DnPkIetMl4PrKX97W9o= k8s.io/client-go v0.35.2/go.mod h1:4QqEwh4oQpeK8AaefZ0jwTFJw/9kIjdQi0jpKeYvz7g= k8s.io/component-base v0.35.0 h1:+yBrOhzri2S1BVqyVSvcM3PtPyx5GUxCK2tinZz1G94= k8s.io/component-base v0.35.0/go.mod h1:85SCX4UCa6SCFt6p3IKAPej7jSnF3L8EbfSyMZayJR0= -k8s.io/component-helpers v0.35.0 h1:wcXv7HJRksgVjM4VlXJ1CNFBpyDHruRI99RrBtrJceA= -k8s.io/component-helpers v0.35.0/go.mod h1:ahX0m/LTYmu7fL3W8zYiIwnQ/5gT28Ex4o2pymF63Co= +k8s.io/component-helpers v0.35.2 h1:7Ea4CDgHnyOGrl3ZhD8e46SdTyf1itTONnreJ2Q52UM= +k8s.io/component-helpers v0.35.2/go.mod h1:ybIoc8i92FG7xJFrBcEMzB8ul1wlZgfF0I4Z9w0V6VQ= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20251125145642-4e65d59e963e h1:iW9ChlU0cU16w8MpVYjXk12dqQ4BPFBEgif+ap7/hqQ= diff --git a/pkg/model/pod.go b/pkg/model/pod.go index 449edb5..39afd07 100644 --- a/pkg/model/pod.go +++ b/pkg/model/pod.go @@ -22,6 +22,7 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" + helperResource "k8s.io/component-helpers/resource" ) // Pod is our pod model used for internal storage and display @@ -85,24 +86,10 @@ func (p *Pod) Phase() v1.PodPhase { func (p *Pod) Requested() v1.ResourceList { p.mu.RLock() defer p.mu.RUnlock() - requested := v1.ResourceList{} - for _, c := range p.pod.Spec.InitContainers { - if c.RestartPolicy == nil || *c.RestartPolicy != v1.ContainerRestartPolicyAlways { - continue - } - for rn, q := range c.Resources.Requests { - existing := requested[rn] - existing.Add(q) - requested[rn] = existing - } - } - for _, c := range p.pod.Spec.Containers { - for rn, q := range c.Resources.Requests { - existing := requested[rn] - existing.Add(q) - requested[rn] = existing - } - } + requested := helperResource.PodRequests(&p.pod, helperResource.PodResourcesOptions{ + SkipPodLevelResources: false, + SkipContainerLevelResources: false, + }) requested[v1.ResourcePods] = resource.MustParse("1") return requested } diff --git a/pkg/model/pod_test.go b/pkg/model/pod_test.go index fb13f4b..43cd0c6 100644 --- a/pkg/model/pod_test.go +++ b/pkg/model/pod_test.go @@ -74,6 +74,46 @@ func testPod(namespace, name string) *v1.Pod { } return p } + +func testPodWithPodLevelResources(namespace, name string) *v1.Pod { + restartAlways := v1.ContainerRestartPolicyAlways + p := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: namespace, + Name: name, + }, + Status: v1.PodStatus{ + Phase: v1.PodPending, + }, + Spec: v1.PodSpec{ + Resources: &v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceCPU: resource.MustParse("10"), + v1.ResourceMemory: resource.MustParse("12Gi"), + }, + }, + InitContainers: []v1.Container{ + { + Image: "normalinit", + Name: "container", + }, + { + Image: "sidecar", + Name: "container", + RestartPolicy: &restartAlways, + }, + }, + Containers: []v1.Container{ + { + Image: "test-image", + Name: "container", + }, + }, + }, + } + return p +} + func TestNewPod(t *testing.T) { pod := testPod("default", "mypod") pod.Spec.NodeName = "mynode" @@ -100,6 +140,15 @@ func TestNewPod(t *testing.T) { if exp, got := resource.MustParse("2Gi"), p.Requested()[v1.ResourceMemory]; exp.Cmp(got) != 0 { t.Errorf("expected Memory = %s, got %s", exp.String(), got.String()) } + + podWithPodLevelResources := testPodWithPodLevelResources("default", "mypod") + pWithPodLevelResources := model.NewPod(podWithPodLevelResources) + if exp, got := resource.MustParse("10"), pWithPodLevelResources.Requested()[v1.ResourceCPU]; exp.Cmp(got) != 0 { + t.Errorf("expected CPU = %s, got %s", exp.String(), got.String()) + } + if exp, got := resource.MustParse("12Gi"), pWithPodLevelResources.Requested()[v1.ResourceMemory]; exp.Cmp(got) != 0 { + t.Errorf("expected Memory = %s, got %s", exp.String(), got.String()) + } } func TestPodUpdate(t *testing.T) {