Merge pull request #13157 from ydayagi/main

play kube: set defaults to container resources
This commit is contained in:
OpenShift Merge Robot 2022-02-23 13:34:59 -05:00 committed by GitHub
commit 0d2bd53f37
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 126 additions and 1 deletions

View File

@ -7,6 +7,7 @@ import (
"math" "math"
"net" "net"
"regexp" "regexp"
"runtime"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -22,6 +23,7 @@ import (
"github.com/containers/podman/v4/pkg/specgen" "github.com/containers/podman/v4/pkg/specgen"
"github.com/containers/podman/v4/pkg/specgen/generate" "github.com/containers/podman/v4/pkg/specgen/generate"
"github.com/containers/podman/v4/pkg/util" "github.com/containers/podman/v4/pkg/util"
"github.com/docker/docker/pkg/system"
"github.com/docker/go-units" "github.com/docker/go-units"
spec "github.com/opencontainers/runtime-spec/specs-go" spec "github.com/opencontainers/runtime-spec/specs-go"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -712,8 +714,12 @@ func envVarValueResourceFieldRef(env v1.EnvVar, opts *CtrSpecGenOptions) (*strin
divisor.Set(1) divisor.Set(1)
} }
resources, err := getContainerResources(opts.Container)
if err != nil {
return nil, err
}
var value *resource.Quantity var value *resource.Quantity
resources := opts.Container.Resources
resourceName := env.ValueFrom.ResourceFieldRef.Resource resourceName := env.ValueFrom.ResourceFieldRef.Resource
var isValidDivisor bool var isValidDivisor bool
@ -769,6 +775,46 @@ func isCPUDivisor(divisor resource.Quantity) bool {
} }
} }
func getContainerResources(container v1.Container) (v1.ResourceRequirements, error) {
result := v1.ResourceRequirements{
Limits: v1.ResourceList{},
Requests: v1.ResourceList{},
}
limits := container.Resources.Limits
requests := container.Resources.Requests
if limits == nil || limits.Memory().IsZero() {
mi, err := system.ReadMemInfo()
if err != nil {
return result, err
}
result.Limits[v1.ResourceMemory] = *resource.NewQuantity(mi.MemTotal, resource.DecimalSI)
} else {
result.Limits[v1.ResourceMemory] = limits[v1.ResourceMemory]
}
if limits == nil || limits.Cpu().IsZero() {
result.Limits[v1.ResourceCPU] = *resource.NewQuantity(int64(runtime.NumCPU()), resource.DecimalSI)
} else {
result.Limits[v1.ResourceCPU] = limits[v1.ResourceCPU]
}
if requests == nil || requests.Memory().IsZero() {
result.Requests[v1.ResourceMemory] = result.Limits[v1.ResourceMemory]
} else {
result.Requests[v1.ResourceMemory] = requests[v1.ResourceMemory]
}
if requests == nil || requests.Cpu().IsZero() {
result.Requests[v1.ResourceCPU] = result.Limits[v1.ResourceCPU]
} else {
result.Requests[v1.ResourceCPU] = requests[v1.ResourceCPU]
}
return result, nil
}
// getPodPorts converts a slice of kube container descriptions to an // getPodPorts converts a slice of kube container descriptions to an
// array of portmapping // array of portmapping
func getPodPorts(containers []v1.Container) []types.PortMapping { func getPodPorts(containers []v1.Container) []types.PortMapping {

View File

@ -6,10 +6,12 @@ import (
"io/ioutil" "io/ioutil"
"math" "math"
"os" "os"
"runtime"
"strconv" "strconv"
"testing" "testing"
"github.com/containers/common/pkg/secrets" "github.com/containers/common/pkg/secrets"
"github.com/docker/docker/pkg/system"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/api/resource"
@ -193,6 +195,11 @@ func TestEnvVarValue(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
defer os.RemoveAll(d) defer os.RemoveAll(d)
secretsManager := createSecrets(t, d) secretsManager := createSecrets(t, d)
stringNumCPUs := strconv.Itoa(runtime.NumCPU())
mi, err := system.ReadMemInfo()
assert.Nil(t, err)
stringMemTotal := strconv.FormatInt(mi.MemTotal, 10)
tests := []struct { tests := []struct {
name string name string
@ -694,6 +701,78 @@ func TestEnvVarValue(t *testing.T) {
true, true,
strconv.Itoa(int(float64(cpuInt) / 0.001)), strconv.Itoa(int(float64(cpuInt) / 0.001)),
}, },
{
"ResourceFieldRefNoLimitMemory",
v1.EnvVar{
Name: "FOO",
ValueFrom: &v1.EnvVarSource{
ResourceFieldRef: &v1.ResourceFieldSelector{
Resource: "limits.memory",
},
},
},
CtrSpecGenOptions{
Container: v1.Container{
Name: "test",
},
},
true,
stringMemTotal,
},
{
"ResourceFieldRefNoRequestMemory",
v1.EnvVar{
Name: "FOO",
ValueFrom: &v1.EnvVarSource{
ResourceFieldRef: &v1.ResourceFieldSelector{
Resource: "requests.memory",
},
},
},
CtrSpecGenOptions{
Container: v1.Container{
Name: "test",
},
},
true,
stringMemTotal,
},
{
"ResourceFieldRefNoLimitCPU",
v1.EnvVar{
Name: "FOO",
ValueFrom: &v1.EnvVarSource{
ResourceFieldRef: &v1.ResourceFieldSelector{
Resource: "limits.cpu",
},
},
},
CtrSpecGenOptions{
Container: v1.Container{
Name: "test",
},
},
true,
stringNumCPUs,
},
{
"ResourceFieldRefNoRequestCPU",
v1.EnvVar{
Name: "FOO",
ValueFrom: &v1.EnvVarSource{
ResourceFieldRef: &v1.ResourceFieldSelector{
Resource: "requests.cpu",
},
},
},
CtrSpecGenOptions{
Container: v1.Container{
Name: "test",
},
},
true,
stringNumCPUs,
},
} }
for _, test := range tests { for _, test := range tests {