cdi_test.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package container // import "github.com/docker/docker/integration/container"
  2. import (
  3. "bytes"
  4. "context"
  5. "io"
  6. "os"
  7. "path/filepath"
  8. "strings"
  9. "testing"
  10. "github.com/docker/docker/api/types"
  11. containertypes "github.com/docker/docker/api/types/container"
  12. "github.com/docker/docker/integration/internal/container"
  13. "github.com/docker/docker/pkg/stdcopy"
  14. "github.com/docker/docker/testutil/daemon"
  15. "gotest.tools/v3/assert"
  16. is "gotest.tools/v3/assert/cmp"
  17. "gotest.tools/v3/skip"
  18. )
  19. func TestCreateWithCDIDevices(t *testing.T) {
  20. skip.If(t, testEnv.DaemonInfo.OSType != "linux", "CDI devices are only supported on Linux")
  21. skip.If(t, testEnv.IsRemoteDaemon, "cannot run cdi tests with a remote daemon")
  22. cwd, err := os.Getwd()
  23. assert.NilError(t, err)
  24. d := daemon.New(t, daemon.WithExperimental())
  25. d.StartWithBusybox(t, "--cdi-spec-dir="+filepath.Join(cwd, "testdata", "cdi"))
  26. defer d.Stop(t)
  27. client := d.NewClientT(t)
  28. ctx := context.Background()
  29. id := container.Run(ctx, t, client,
  30. container.WithCmd("/bin/sh", "-c", "env"),
  31. container.WithCDIDevices("vendor1.com/device=foo"),
  32. )
  33. defer client.ContainerRemove(ctx, id, types.ContainerRemoveOptions{Force: true})
  34. inspect, err := client.ContainerInspect(ctx, id)
  35. assert.NilError(t, err)
  36. expectedRequests := []containertypes.DeviceRequest{
  37. {
  38. Driver: "cdi",
  39. DeviceIDs: []string{"vendor1.com/device=foo"},
  40. },
  41. }
  42. assert.Check(t, is.DeepEqual(inspect.HostConfig.DeviceRequests, expectedRequests))
  43. reader, err := client.ContainerLogs(ctx, id, types.ContainerLogsOptions{
  44. ShowStdout: true,
  45. })
  46. assert.NilError(t, err)
  47. actualStdout := new(bytes.Buffer)
  48. actualStderr := io.Discard
  49. _, err = stdcopy.StdCopy(actualStdout, actualStderr, reader)
  50. assert.NilError(t, err)
  51. outlines := strings.Split(actualStdout.String(), "\n")
  52. assert.Assert(t, is.Contains(outlines, "FOO=injected"))
  53. }