summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--go.mod2
-rw-r--r--go.sum4
-rw-r--r--libpod/runtime_volume_common.go (renamed from libpod/runtime_volume_linux.go)4
-rw-r--r--libpod/runtime_volume_unsupported.go4
-rw-r--r--libpod/util_freebsd.go36
-rw-r--r--libpod/util_unsupported.go4
-rw-r--r--libpod/volume_internal_common.go194
-rw-r--r--libpod/volume_internal_freebsd.go9
-rw-r--r--libpod/volume_internal_linux.go189
-rw-r--r--libpod/volume_internal_unsupported.go4
-rw-r--r--test/system/001-basic.bats35
-rw-r--r--vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache_test_unix.go26
-rw-r--r--vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache_test_windows.go22
-rw-r--r--vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits.go33
-rw-r--r--vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits_unix.go56
-rw-r--r--vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits_windows.go27
-rw-r--r--vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec.go7
-rw-r--r--vendor/modules.txt2
18 files changed, 391 insertions, 267 deletions
diff --git a/go.mod b/go.mod
index 7813f3d78..6b675369c 100644
--- a/go.mod
+++ b/go.mod
@@ -8,7 +8,7 @@ require (
github.com/buger/goterm v1.0.4
github.com/checkpoint-restore/checkpointctl v0.0.0-20220321135231-33f4a66335f0
github.com/checkpoint-restore/go-criu/v5 v5.3.0
- github.com/container-orchestrated-devices/container-device-interface v0.5.1
+ github.com/container-orchestrated-devices/container-device-interface v0.5.2
github.com/containernetworking/cni v1.1.2
github.com/containernetworking/plugins v1.1.1
github.com/containers/buildah v1.27.1-0.20220921131114-d3064796af36
diff --git a/go.sum b/go.sum
index aeb0b5ac2..1ed28a7ba 100644
--- a/go.sum
+++ b/go.sum
@@ -306,8 +306,8 @@ github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h
github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4=
-github.com/container-orchestrated-devices/container-device-interface v0.5.1 h1:nXIUTrlEgGcA/n2geY3J7yyaGGhkocSlMkKPS4Qp4c0=
-github.com/container-orchestrated-devices/container-device-interface v0.5.1/go.mod h1:ZToWfSyUH5l9Rk7/bjkUUkNLz4b1mE+CVUVafuikDPY=
+github.com/container-orchestrated-devices/container-device-interface v0.5.2 h1:Bf/Zq8UBhbSBtB+pFBVIQ2Rh7sNK/x2ZEr6uW5YjNv8=
+github.com/container-orchestrated-devices/container-device-interface v0.5.2/go.mod h1:ZToWfSyUH5l9Rk7/bjkUUkNLz4b1mE+CVUVafuikDPY=
github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE=
github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU=
github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU=
diff --git a/libpod/runtime_volume_linux.go b/libpod/runtime_volume_common.go
index c59417979..b1de2be86 100644
--- a/libpod/runtime_volume_linux.go
+++ b/libpod/runtime_volume_common.go
@@ -1,5 +1,5 @@
-//go:build linux
-// +build linux
+//go:build linux || freebsd
+// +build linux freebsd
package libpod
diff --git a/libpod/runtime_volume_unsupported.go b/libpod/runtime_volume_unsupported.go
index c2816b817..7b7758894 100644
--- a/libpod/runtime_volume_unsupported.go
+++ b/libpod/runtime_volume_unsupported.go
@@ -1,5 +1,5 @@
-//go:build !linux
-// +build !linux
+//go:build !linux && !freebsd
+// +build !linux,!freebsd
package libpod
diff --git a/libpod/util_freebsd.go b/libpod/util_freebsd.go
new file mode 100644
index 000000000..72019743c
--- /dev/null
+++ b/libpod/util_freebsd.go
@@ -0,0 +1,36 @@
+//go:build freebsd
+// +build freebsd
+
+package libpod
+
+import (
+ "errors"
+ "syscall"
+
+ spec "github.com/opencontainers/runtime-spec/specs-go"
+ "github.com/sirupsen/logrus"
+ "golang.org/x/sys/unix"
+)
+
+// systemdSliceFromPath makes a new systemd slice under the given parent with
+// the given name.
+// The parent must be a slice. The name must NOT include ".slice"
+func systemdSliceFromPath(parent, name string, resources *spec.LinuxResources) (string, error) {
+ return "", errors.New("not implemented systemdSliceFromPath")
+}
+
+// No equivalent on FreeBSD?
+func LabelVolumePath(path string) error {
+ return nil
+}
+
+// Unmount umounts a target directory
+func Unmount(mount string) {
+ if err := unix.Unmount(mount, unix.MNT_FORCE); err != nil {
+ if err != syscall.EINVAL {
+ logrus.Warnf("Failed to unmount %s : %v", mount, err)
+ } else {
+ logrus.Debugf("failed to unmount %s : %v", mount, err)
+ }
+ }
+}
diff --git a/libpod/util_unsupported.go b/libpod/util_unsupported.go
index d2ec3ae7b..fc3d00274 100644
--- a/libpod/util_unsupported.go
+++ b/libpod/util_unsupported.go
@@ -1,5 +1,5 @@
-//go:build !linux
-// +build !linux
+//go:build !linux && !freebsd
+// +build !linux,!freebsd
package libpod
diff --git a/libpod/volume_internal_common.go b/libpod/volume_internal_common.go
new file mode 100644
index 000000000..4ff7ac790
--- /dev/null
+++ b/libpod/volume_internal_common.go
@@ -0,0 +1,194 @@
+//go:build linux || freebsd
+// +build linux freebsd
+
+package libpod
+
+import (
+ "errors"
+ "fmt"
+ "os/exec"
+ "strings"
+
+ "github.com/containers/podman/v4/libpod/define"
+ pluginapi "github.com/docker/go-plugins-helpers/volume"
+ "github.com/sirupsen/logrus"
+ "golang.org/x/sys/unix"
+)
+
+// This is a pseudo-container ID to use when requesting a mount or unmount from
+// the volume plugins.
+// This is the shas256 of the string "placeholder\n".
+const pseudoCtrID = "2f73349cfc4630255319c6c8dfc1b46a8996ace9d14d8e07563b165915918ec2"
+
+// mount mounts the volume if necessary.
+// A mount is necessary if a volume has any options set.
+// If a mount is necessary, v.state.MountCount will be incremented.
+// If it was 0 when the increment occurred, the volume will be mounted on the
+// host. Otherwise, we assume it is already mounted.
+// Must be done while the volume is locked.
+// Is a no-op on volumes that do not require a mount (as defined by
+// volumeNeedsMount()).
+func (v *Volume) mount() error {
+ if !v.needsMount() {
+ return nil
+ }
+
+ // Update the volume from the DB to get an accurate mount counter.
+ if err := v.update(); err != nil {
+ return err
+ }
+
+ // If the count is non-zero, the volume is already mounted.
+ // Nothing to do.
+ if v.state.MountCount > 0 {
+ v.state.MountCount++
+ logrus.Debugf("Volume %s mount count now at %d", v.Name(), v.state.MountCount)
+ return v.save()
+ }
+
+ // Volume plugins implement their own mount counter, based on the ID of
+ // the mounting container. But we already have one, and honestly I trust
+ // ours more. So hardcode container ID to something reasonable, and use
+ // the same one for everything.
+ if v.UsesVolumeDriver() {
+ if v.plugin == nil {
+ return fmt.Errorf("volume plugin %s (needed by volume %s) missing: %w", v.Driver(), v.Name(), define.ErrMissingPlugin)
+ }
+
+ req := new(pluginapi.MountRequest)
+ req.Name = v.Name()
+ req.ID = pseudoCtrID
+ mountPoint, err := v.plugin.MountVolume(req)
+ if err != nil {
+ return err
+ }
+
+ v.state.MountCount++
+ v.state.MountPoint = mountPoint
+ return v.save()
+ } else if v.config.Driver == define.VolumeDriverImage {
+ mountPoint, err := v.runtime.storageService.MountContainerImage(v.config.StorageID)
+ if err != nil {
+ return fmt.Errorf("mounting volume %s image failed: %w", v.Name(), err)
+ }
+
+ v.state.MountCount++
+ v.state.MountPoint = mountPoint
+ return v.save()
+ }
+
+ volDevice := v.config.Options["device"]
+ volType := v.config.Options["type"]
+ volOptions := v.config.Options["o"]
+
+ // Some filesystems (tmpfs) don't have a device, but we still need to
+ // give the kernel something.
+ if volDevice == "" && volType != "" {
+ volDevice = volType
+ }
+
+ // We need to use the actual mount command.
+ // Convincing unix.Mount to use the same semantics as the mount command
+ // itself seems prohibitively difficult.
+ // TODO: might want to cache this path in the runtime?
+ mountPath, err := exec.LookPath("mount")
+ if err != nil {
+ return fmt.Errorf("locating 'mount' binary: %w", err)
+ }
+ mountArgs := []string{}
+ if volOptions != "" {
+ mountArgs = append(mountArgs, "-o", volOptions)
+ }
+ switch volType {
+ case "":
+ case "bind":
+ mountArgs = append(mountArgs, "-o", volType)
+ default:
+ mountArgs = append(mountArgs, "-t", volType)
+ }
+
+ mountArgs = append(mountArgs, volDevice, v.config.MountPoint)
+ mountCmd := exec.Command(mountPath, mountArgs...)
+
+ logrus.Debugf("Running mount command: %s %s", mountPath, strings.Join(mountArgs, " "))
+ if output, err := mountCmd.CombinedOutput(); err != nil {
+ logrus.Debugf("Mount %v failed with %v", mountCmd, err)
+ return errors.New(string(output))
+ }
+
+ logrus.Debugf("Mounted volume %s", v.Name())
+
+ // Increment the mount counter
+ v.state.MountCount++
+ logrus.Debugf("Volume %s mount count now at %d", v.Name(), v.state.MountCount)
+ return v.save()
+}
+
+// unmount unmounts the volume if necessary.
+// Unmounting a volume that is not mounted is a no-op.
+// Unmounting a volume that does not require a mount is a no-op.
+// The volume must be locked for this to occur.
+// The mount counter will be decremented if non-zero. If the counter reaches 0,
+// the volume will really be unmounted, as no further containers are using the
+// volume.
+// If force is set, the volume will be unmounted regardless of mount counter.
+func (v *Volume) unmount(force bool) error {
+ if !v.needsMount() {
+ return nil
+ }
+
+ // Update the volume from the DB to get an accurate mount counter.
+ if err := v.update(); err != nil {
+ return err
+ }
+
+ if v.state.MountCount == 0 {
+ logrus.Debugf("Volume %s already unmounted", v.Name())
+ return nil
+ }
+
+ if !force {
+ v.state.MountCount--
+ } else {
+ v.state.MountCount = 0
+ }
+
+ logrus.Debugf("Volume %s mount count now at %d", v.Name(), v.state.MountCount)
+
+ if v.state.MountCount == 0 {
+ if v.UsesVolumeDriver() {
+ if v.plugin == nil {
+ return fmt.Errorf("volume plugin %s (needed by volume %s) missing: %w", v.Driver(), v.Name(), define.ErrMissingPlugin)
+ }
+
+ req := new(pluginapi.UnmountRequest)
+ req.Name = v.Name()
+ req.ID = pseudoCtrID
+ if err := v.plugin.UnmountVolume(req); err != nil {
+ return err
+ }
+
+ v.state.MountPoint = ""
+ return v.save()
+ } else if v.config.Driver == define.VolumeDriverImage {
+ if _, err := v.runtime.storageService.UnmountContainerImage(v.config.StorageID, force); err != nil {
+ return fmt.Errorf("unmounting volume %s image: %w", v.Name(), err)
+ }
+
+ v.state.MountPoint = ""
+ return v.save()
+ }
+
+ // Unmount the volume
+ if err := detachUnmount(v.config.MountPoint); err != nil {
+ if err == unix.EINVAL {
+ // Ignore EINVAL - the mount no longer exists.
+ return nil
+ }
+ return fmt.Errorf("unmounting volume %s: %w", v.Name(), err)
+ }
+ logrus.Debugf("Unmounted volume %s", v.Name())
+ }
+
+ return v.save()
+}
diff --git a/libpod/volume_internal_freebsd.go b/libpod/volume_internal_freebsd.go
new file mode 100644
index 000000000..cf71f1e32
--- /dev/null
+++ b/libpod/volume_internal_freebsd.go
@@ -0,0 +1,9 @@
+package libpod
+
+import (
+ "golang.org/x/sys/unix"
+)
+
+func detachUnmount(mountPoint string) error {
+ return unix.Unmount(mountPoint, unix.MNT_FORCE)
+}
diff --git a/libpod/volume_internal_linux.go b/libpod/volume_internal_linux.go
index 440bceec3..eb4309dc3 100644
--- a/libpod/volume_internal_linux.go
+++ b/libpod/volume_internal_linux.go
@@ -1,194 +1,9 @@
-//go:build linux
-// +build linux
-
package libpod
import (
- "errors"
- "fmt"
- "os/exec"
- "strings"
-
- "github.com/containers/podman/v4/libpod/define"
- pluginapi "github.com/docker/go-plugins-helpers/volume"
- "github.com/sirupsen/logrus"
"golang.org/x/sys/unix"
)
-// This is a pseudo-container ID to use when requesting a mount or unmount from
-// the volume plugins.
-// This is the shas256 of the string "placeholder\n".
-const pseudoCtrID = "2f73349cfc4630255319c6c8dfc1b46a8996ace9d14d8e07563b165915918ec2"
-
-// mount mounts the volume if necessary.
-// A mount is necessary if a volume has any options set.
-// If a mount is necessary, v.state.MountCount will be incremented.
-// If it was 0 when the increment occurred, the volume will be mounted on the
-// host. Otherwise, we assume it is already mounted.
-// Must be done while the volume is locked.
-// Is a no-op on volumes that do not require a mount (as defined by
-// volumeNeedsMount()).
-func (v *Volume) mount() error {
- if !v.needsMount() {
- return nil
- }
-
- // Update the volume from the DB to get an accurate mount counter.
- if err := v.update(); err != nil {
- return err
- }
-
- // If the count is non-zero, the volume is already mounted.
- // Nothing to do.
- if v.state.MountCount > 0 {
- v.state.MountCount++
- logrus.Debugf("Volume %s mount count now at %d", v.Name(), v.state.MountCount)
- return v.save()
- }
-
- // Volume plugins implement their own mount counter, based on the ID of
- // the mounting container. But we already have one, and honestly I trust
- // ours more. So hardcode container ID to something reasonable, and use
- // the same one for everything.
- if v.UsesVolumeDriver() {
- if v.plugin == nil {
- return fmt.Errorf("volume plugin %s (needed by volume %s) missing: %w", v.Driver(), v.Name(), define.ErrMissingPlugin)
- }
-
- req := new(pluginapi.MountRequest)
- req.Name = v.Name()
- req.ID = pseudoCtrID
- mountPoint, err := v.plugin.MountVolume(req)
- if err != nil {
- return err
- }
-
- v.state.MountCount++
- v.state.MountPoint = mountPoint
- return v.save()
- } else if v.config.Driver == define.VolumeDriverImage {
- mountPoint, err := v.runtime.storageService.MountContainerImage(v.config.StorageID)
- if err != nil {
- return fmt.Errorf("mounting volume %s image failed: %w", v.Name(), err)
- }
-
- v.state.MountCount++
- v.state.MountPoint = mountPoint
- return v.save()
- }
-
- volDevice := v.config.Options["device"]
- volType := v.config.Options["type"]
- volOptions := v.config.Options["o"]
-
- // Some filesystems (tmpfs) don't have a device, but we still need to
- // give the kernel something.
- if volDevice == "" && volType != "" {
- volDevice = volType
- }
-
- // We need to use the actual mount command.
- // Convincing unix.Mount to use the same semantics as the mount command
- // itself seems prohibitively difficult.
- // TODO: might want to cache this path in the runtime?
- mountPath, err := exec.LookPath("mount")
- if err != nil {
- return fmt.Errorf("locating 'mount' binary: %w", err)
- }
- mountArgs := []string{}
- if volOptions != "" {
- mountArgs = append(mountArgs, "-o", volOptions)
- }
- switch volType {
- case "":
- case "bind":
- mountArgs = append(mountArgs, "-o", volType)
- default:
- mountArgs = append(mountArgs, "-t", volType)
- }
-
- mountArgs = append(mountArgs, volDevice, v.config.MountPoint)
- mountCmd := exec.Command(mountPath, mountArgs...)
-
- logrus.Debugf("Running mount command: %s %s", mountPath, strings.Join(mountArgs, " "))
- if output, err := mountCmd.CombinedOutput(); err != nil {
- logrus.Debugf("Mount %v failed with %v", mountCmd, err)
- return errors.New(string(output))
- }
-
- logrus.Debugf("Mounted volume %s", v.Name())
-
- // Increment the mount counter
- v.state.MountCount++
- logrus.Debugf("Volume %s mount count now at %d", v.Name(), v.state.MountCount)
- return v.save()
-}
-
-// unmount unmounts the volume if necessary.
-// Unmounting a volume that is not mounted is a no-op.
-// Unmounting a volume that does not require a mount is a no-op.
-// The volume must be locked for this to occur.
-// The mount counter will be decremented if non-zero. If the counter reaches 0,
-// the volume will really be unmounted, as no further containers are using the
-// volume.
-// If force is set, the volume will be unmounted regardless of mount counter.
-func (v *Volume) unmount(force bool) error {
- if !v.needsMount() {
- return nil
- }
-
- // Update the volume from the DB to get an accurate mount counter.
- if err := v.update(); err != nil {
- return err
- }
-
- if v.state.MountCount == 0 {
- logrus.Debugf("Volume %s already unmounted", v.Name())
- return nil
- }
-
- if !force {
- v.state.MountCount--
- } else {
- v.state.MountCount = 0
- }
-
- logrus.Debugf("Volume %s mount count now at %d", v.Name(), v.state.MountCount)
-
- if v.state.MountCount == 0 {
- if v.UsesVolumeDriver() {
- if v.plugin == nil {
- return fmt.Errorf("volume plugin %s (needed by volume %s) missing: %w", v.Driver(), v.Name(), define.ErrMissingPlugin)
- }
-
- req := new(pluginapi.UnmountRequest)
- req.Name = v.Name()
- req.ID = pseudoCtrID
- if err := v.plugin.UnmountVolume(req); err != nil {
- return err
- }
-
- v.state.MountPoint = ""
- return v.save()
- } else if v.config.Driver == define.VolumeDriverImage {
- if _, err := v.runtime.storageService.UnmountContainerImage(v.config.StorageID, force); err != nil {
- return fmt.Errorf("unmounting volume %s image: %w", v.Name(), err)
- }
-
- v.state.MountPoint = ""
- return v.save()
- }
-
- // Unmount the volume
- if err := unix.Unmount(v.config.MountPoint, unix.MNT_DETACH); err != nil {
- if err == unix.EINVAL {
- // Ignore EINVAL - the mount no longer exists.
- return nil
- }
- return fmt.Errorf("unmounting volume %s: %w", v.Name(), err)
- }
- logrus.Debugf("Unmounted volume %s", v.Name())
- }
-
- return v.save()
+func detachUnmount(mountPoint string) error {
+ return unix.Unmount(mountPoint, unix.MNT_DETACH)
}
diff --git a/libpod/volume_internal_unsupported.go b/libpod/volume_internal_unsupported.go
index 50515e692..d138c15fb 100644
--- a/libpod/volume_internal_unsupported.go
+++ b/libpod/volume_internal_unsupported.go
@@ -1,5 +1,5 @@
-//go:build !linux
-// +build !linux
+//go:build !linux && !freebsd
+// +build !linux,!freebsd
package libpod
diff --git a/test/system/001-basic.bats b/test/system/001-basic.bats
index ba6bde4df..f6b4aa1e8 100644
--- a/test/system/001-basic.bats
+++ b/test/system/001-basic.bats
@@ -215,47 +215,12 @@ See 'podman version --help'" "podman version --remote"
run_podman --log-level=warn info
assert "$output" !~ " level=" "log-level=warn shows no logs at all"
- # Force a warning (local podman only; podman-remote doesn't check versions)
- if ! is_remote; then
- run_podman --log-level=warn --storage-opt=mount_program=/bin/false info
- assert "$output" =~ " level=warning msg=\"Failed to retrieve " \
- "log-level=warn"
-
- # confirm that default level is "warn", by invoking without --log-level
- run_podman --storage-opt=mount_program=/bin/false info
- assert "$output" =~ " level=warning msg=\"Failed to retrieve " \
- "default log level includes warning messages"
- fi
-
run_podman --log-level=warning info
assert "$output" !~ " level=" "log-level=warning shows no logs at all"
run_podman --log-level=error info
assert "$output" !~ " level=" "log-level=error shows no logs at all"
- # error, fatal, panic:
- if is_remote; then
- # podman-remote does not grok --runtime; all we can do is test parsing
- for level in error fatal panic; do
- run_podman --log-level=$level info
- assert "$output" !~ " level=" \
- "log-level=$level shows no logs at all"
- done
- else
- # local podman only
- run_podman --log-level=error --storage-opt=mount_program=/bin/false --runtime=/bin/false info
- assert "$output" =~ " level=error msg=\"Getting info on OCI runtime " \
- "log-level=error shows "
- assert "$output" !~ " level=warn" \
- "log-level=error does not show warnings"
-
- run_podman --log-level=fatal --storage-opt=mount_program=/bin/false --runtime=/bin/false info
- assert "$output" !~ " level=" "log-level=fatal shows no logs at all"
-
- run_podman --log-level=panic --storage-opt=mount_program=/bin/false --runtime=/bin/false info
- assert "$output" !~ " level=" "log-level=panic shows no logs at all"
- fi
-
# docker compat
run_podman --debug info
assert "$output" =~ " level=debug " "podman --debug gives debug output"
diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache_test_unix.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache_test_unix.go
new file mode 100644
index 000000000..0ee5fb86f
--- /dev/null
+++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache_test_unix.go
@@ -0,0 +1,26 @@
+//go:build !windows
+// +build !windows
+
+/*
+ Copyright © 2021 The CDI Authors
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+package cdi
+
+import "syscall"
+
+func osSync() {
+ syscall.Sync()
+}
diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache_test_windows.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache_test_windows.go
new file mode 100644
index 000000000..c6dabf5fa
--- /dev/null
+++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache_test_windows.go
@@ -0,0 +1,22 @@
+//go:build windows
+// +build windows
+
+/*
+ Copyright © 2021 The CDI Authors
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+package cdi
+
+func osSync() {}
diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits.go
index 1295f75e9..9fcecf849 100644
--- a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits.go
+++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits.go
@@ -27,8 +27,6 @@ import (
"github.com/container-orchestrated-devices/container-device-interface/specs-go"
oci "github.com/opencontainers/runtime-spec/specs-go"
ocigen "github.com/opencontainers/runtime-tools/generate"
-
- runc "github.com/opencontainers/runc/libcontainer/devices"
)
const (
@@ -289,37 +287,6 @@ func ensureOCIHooks(spec *oci.Spec) {
}
}
-// fillMissingInfo fills in missing mandatory attributes from the host device.
-func (d *DeviceNode) fillMissingInfo() error {
- if d.HostPath == "" {
- d.HostPath = d.Path
- }
-
- if d.Type != "" && (d.Major != 0 || d.Type == "p") {
- return nil
- }
-
- hostDev, err := runc.DeviceFromPath(d.HostPath, "rwm")
- if err != nil {
- return errors.Wrapf(err, "failed to stat CDI host device %q", d.HostPath)
- }
-
- if d.Type == "" {
- d.Type = string(hostDev.Type)
- } else {
- if d.Type != string(hostDev.Type) {
- return errors.Errorf("CDI device (%q, %q), host type mismatch (%s, %s)",
- d.Path, d.HostPath, d.Type, string(hostDev.Type))
- }
- }
- if d.Major == 0 && d.Type != "p" {
- d.Major = hostDev.Major
- d.Minor = hostDev.Minor
- }
-
- return nil
-}
-
// sortMounts sorts the mounts in the given OCI Spec.
func sortMounts(specgen *ocigen.Generator) {
mounts := specgen.Mounts()
diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits_unix.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits_unix.go
new file mode 100644
index 000000000..5d7ebcb55
--- /dev/null
+++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits_unix.go
@@ -0,0 +1,56 @@
+//go:build !windows
+// +build !windows
+
+/*
+ Copyright © 2021 The CDI Authors
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+package cdi
+
+import (
+ runc "github.com/opencontainers/runc/libcontainer/devices"
+ "github.com/pkg/errors"
+)
+
+// fillMissingInfo fills in missing mandatory attributes from the host device.
+func (d *DeviceNode) fillMissingInfo() error {
+ if d.HostPath == "" {
+ d.HostPath = d.Path
+ }
+
+ if d.Type != "" && (d.Major != 0 || d.Type == "p") {
+ return nil
+ }
+
+ hostDev, err := runc.DeviceFromPath(d.HostPath, "rwm")
+ if err != nil {
+ return errors.Wrapf(err, "failed to stat CDI host device %q", d.HostPath)
+ }
+
+ if d.Type == "" {
+ d.Type = string(hostDev.Type)
+ } else {
+ if d.Type != string(hostDev.Type) {
+ return errors.Errorf("CDI device (%q, %q), host type mismatch (%s, %s)",
+ d.Path, d.HostPath, d.Type, string(hostDev.Type))
+ }
+ }
+ if d.Major == 0 && d.Type != "p" {
+ d.Major = hostDev.Major
+ d.Minor = hostDev.Minor
+ }
+
+ return nil
+}
diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits_windows.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits_windows.go
new file mode 100644
index 000000000..fd91afa92
--- /dev/null
+++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits_windows.go
@@ -0,0 +1,27 @@
+//go:build windows
+// +build windows
+
+/*
+ Copyright © 2021 The CDI Authors
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+package cdi
+
+import "fmt"
+
+// fillMissingInfo fills in missing mandatory attributes from the host device.
+func (d *DeviceNode) fillMissingInfo() error {
+ return fmt.Errorf("unimplemented")
+}
diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec.go
index 9a5d451c9..3dfbab2f0 100644
--- a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec.go
+++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec.go
@@ -21,6 +21,7 @@ import (
"io/ioutil"
"os"
"path/filepath"
+ "sync"
oci "github.com/opencontainers/runtime-spec/specs-go"
"github.com/pkg/errors"
@@ -41,6 +42,7 @@ var (
// Externally set CDI Spec validation function.
specValidator func(*cdi.Spec) error
+ validatorLock sync.RWMutex
)
// Spec represents a single CDI Spec. It is usually loaded from a
@@ -249,11 +251,16 @@ func ParseSpec(data []byte) (*cdi.Spec, error) {
// is used for extra CDI Spec content validation whenever a Spec file
// loaded (using ReadSpec() or NewSpec()) or written (Spec.Write()).
func SetSpecValidator(fn func(*cdi.Spec) error) {
+ validatorLock.Lock()
+ defer validatorLock.Unlock()
specValidator = fn
}
// validateSpec validates the Spec using the extneral validator.
func validateSpec(raw *cdi.Spec) error {
+ validatorLock.RLock()
+ defer validatorLock.RUnlock()
+
if specValidator == nil {
return nil
}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 222b70cd3..04c22c1c9 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -64,7 +64,7 @@ github.com/checkpoint-restore/go-criu/v5/stats
# github.com/chzyer/readline v1.5.1
## explicit; go 1.15
github.com/chzyer/readline
-# github.com/container-orchestrated-devices/container-device-interface v0.5.1
+# github.com/container-orchestrated-devices/container-device-interface v0.5.2
## explicit; go 1.17
github.com/container-orchestrated-devices/container-device-interface/pkg/cdi
github.com/container-orchestrated-devices/container-device-interface/specs-go