summaryrefslogtreecommitdiff
path: root/pkg/specgen
diff options
context:
space:
mode:
authorcdoern <cdoern@redhat.com>2021-09-05 23:22:17 -0400
committercdoern <cdoern@redhat.com>2021-09-28 21:20:01 -0400
commit2d86051893fc2e813f26c16d13786bb377c26d48 (patch)
tree32059566515a61e938b6eaf1ae397f128bd8ff67 /pkg/specgen
parent8e2d25e93706190acf25bcf74bd18cdf98fb3a12 (diff)
downloadpodman-2d86051893fc2e813f26c16d13786bb377c26d48.tar.gz
podman-2d86051893fc2e813f26c16d13786bb377c26d48.tar.bz2
podman-2d86051893fc2e813f26c16d13786bb377c26d48.zip
Pod Device-Read-BPS support
added the option for the user to specify a rate, in bytes, at which they would like to be able to read from the device being added to the pod. This is the first in a line of pod device options. WARNING: changed pod name json tag to pod_name to avoid confusion when marshaling with the containerspec's name Signed-off-by: cdoern <cdoern@redhat.com>
Diffstat (limited to 'pkg/specgen')
-rw-r--r--pkg/specgen/generate/container.go10
-rw-r--r--pkg/specgen/generate/container_create.go19
-rw-r--r--pkg/specgen/podspecgen.go2
3 files changed, 26 insertions, 5 deletions
diff --git a/pkg/specgen/generate/container.go b/pkg/specgen/generate/container.go
index ae26807a9..f3ee42b2f 100644
--- a/pkg/specgen/generate/container.go
+++ b/pkg/specgen/generate/container.go
@@ -191,9 +191,6 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat
if len(s.User) == 0 && inspectData != nil {
s.User = inspectData.Config.User
}
- if err := finishThrottleDevices(s); err != nil {
- return nil, err
- }
// Unless already set via the CLI, check if we need to disable process
// labels or set the defaults.
if len(s.SelinuxOpts) == 0 {
@@ -251,10 +248,10 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat
return warnings, nil
}
-// finishThrottleDevices takes the temporary representation of the throttle
+// FinishThrottleDevices takes the temporary representation of the throttle
// devices in the specgen and looks up the major and major minors. it then
// sets the throttle devices proper in the specgen
-func finishThrottleDevices(s *specgen.SpecGenerator) error {
+func FinishThrottleDevices(s *specgen.SpecGenerator) error {
if bps := s.ThrottleReadBpsDevice; len(bps) > 0 {
for k, v := range bps {
statT := unix.Stat_t{}
@@ -263,6 +260,9 @@ func finishThrottleDevices(s *specgen.SpecGenerator) error {
}
v.Major = (int64(unix.Major(uint64(statT.Rdev))))
v.Minor = (int64(unix.Minor(uint64(statT.Rdev))))
+ if s.ResourceLimits.BlockIO == nil {
+ s.ResourceLimits.BlockIO = new(spec.LinuxBlockIO)
+ }
s.ResourceLimits.BlockIO.ThrottleReadBpsDevice = append(s.ResourceLimits.BlockIO.ThrottleReadBpsDevice, v)
}
}
diff --git a/pkg/specgen/generate/container_create.go b/pkg/specgen/generate/container_create.go
index fefa9b4a9..11027ebdb 100644
--- a/pkg/specgen/generate/container_create.go
+++ b/pkg/specgen/generate/container_create.go
@@ -2,6 +2,7 @@ package generate
import (
"context"
+ "fmt"
"os"
"path/filepath"
"strings"
@@ -52,6 +53,24 @@ func MakeContainer(ctx context.Context, rt *libpod.Runtime, s *specgen.SpecGener
if infraConfig != nil && len(infraConfig.Spec.Linux.Devices) > 0 {
s.DevicesFrom = append(s.DevicesFrom, infraConfig.ID)
}
+ if infraConfig != nil && infraConfig.Spec.Linux.Resources != nil && infraConfig.Spec.Linux.Resources.BlockIO != nil && len(infraConfig.Spec.Linux.Resources.BlockIO.ThrottleReadBpsDevice) > 0 {
+ tempDev := make(map[string]spec.LinuxThrottleDevice)
+ for _, val := range infraConfig.Spec.Linux.Resources.BlockIO.ThrottleReadBpsDevice {
+ nodes, err := util.FindDeviceNodes()
+ if err != nil {
+ return nil, nil, nil, err
+ }
+ key := fmt.Sprintf("%d:%d", val.Major, val.Minor)
+ tempDev[nodes[key]] = spec.LinuxThrottleDevice{Rate: uint64(val.Rate)}
+ }
+ for i, dev := range s.ThrottleReadBpsDevice {
+ tempDev[i] = dev
+ }
+ s.ThrottleReadBpsDevice = tempDev
+ }
+ if err := FinishThrottleDevices(s); err != nil {
+ return nil, nil, nil, err
+ }
// Set defaults for unset namespaces
if s.PidNS.IsDefault() {
defaultNS, err := GetDefaultNamespaceMode("pid", rtc, pod)
diff --git a/pkg/specgen/podspecgen.go b/pkg/specgen/podspecgen.go
index 83fa9426c..ee4fbc13a 100644
--- a/pkg/specgen/podspecgen.go
+++ b/pkg/specgen/podspecgen.go
@@ -201,6 +201,8 @@ type PodResourceConfig struct {
CPUPeriod uint64 `json:"cpu_period,omitempty"`
// CPU quota of the cpuset, determined by --cpus
CPUQuota int64 `json:"cpu_quota,omitempty"`
+ // ThrottleReadBpsDevice contains the rate at which the devices in the pod can be read from/accessed
+ ThrottleReadBpsDevice map[string]spec.LinuxThrottleDevice `json:"throttleReadBpsDevice,omitempty"`
}
// NewPodSpecGenerator creates a new pod spec