aboutsummaryrefslogtreecommitdiff
path: root/integration
diff options
context:
space:
mode:
authorSebastiaan van Stijn <github@gone.nl>2021-12-22 17:21:27 +0100
committerSebastiaan van Stijn <github@gone.nl>2022-01-24 18:24:51 +0100
commit01ae9525dd7d3e1fac7bd1b05f1d3286d853ff3a (patch)
treec3a1ed98b5de3b2bc677bc8bd298dbc5742aa582 /integration
parent6b69de61f9ef499ced56394cb79c72d53dc15b9f (diff)
Add support for platform (os and architecture) on image import
Commit 0380fbff37922cadf294851b1546f4c212c7f364 added the ability to pass a --platform flag on `docker import` when importing an archive. The intent of that commit was to allow importing a Linux rootfs on a Windows daemon (as part of the experimental LCOW feature). A later commit (337ba71fc1124603302e28d94e2f08674e31a756) changed some of this code to take both OS and Architecture into account (for `docker build` and `docker pull`), but did not yet update the `docker image import`. This patch updates the import endpoitn to allow passing both OS and Architecture. Note that currently only matching OSes are accepted, and an error will be produced when (e.g.) specifying `linux` on Windows and vice-versa. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Diffstat (limited to 'integration')
-rw-r--r--integration/image/import_test.go98
1 files changed, 98 insertions, 0 deletions
diff --git a/integration/image/import_test.go b/integration/image/import_test.go
index 2880df8d32..110ab87a5f 100644
--- a/integration/image/import_test.go
+++ b/integration/image/import_test.go
@@ -6,10 +6,12 @@ import (
"context"
"io"
"runtime"
+ "strconv"
"strings"
"testing"
"github.com/docker/docker/api/types"
+ "github.com/docker/docker/image"
"github.com/docker/docker/testutil"
"github.com/docker/docker/testutil/daemon"
"gotest.tools/v3/assert"
@@ -47,3 +49,99 @@ func TestImportExtremelyLargeImageWorks(t *testing.T) {
types.ImageImportOptions{})
assert.NilError(t, err)
}
+
+func TestImportWithCustomPlatform(t *testing.T) {
+ skip.If(t, testEnv.OSType == "windows", "TODO enable on windows")
+
+ defer setupTest(t)()
+ client := testEnv.APIClient()
+ ctx := context.Background()
+
+ // Construct an empty tar archive.
+ var tarBuffer bytes.Buffer
+
+ tw := tar.NewWriter(&tarBuffer)
+ err := tw.Close()
+ assert.NilError(t, err)
+ imageRdr := io.MultiReader(&tarBuffer, io.LimitReader(testutil.DevZero, 0))
+
+ tests := []struct {
+ name string
+ platform string
+ expected image.V1Image
+ expectedErr string
+ }{
+ {
+ platform: "",
+ expected: image.V1Image{
+ OS: runtime.GOOS,
+ Architecture: runtime.GOARCH, // this may fail on armhf due to normalization?
+ },
+ },
+ {
+ platform: " ",
+ expectedErr: "is an invalid component",
+ },
+ {
+ platform: "/",
+ expectedErr: "is an invalid component",
+ },
+ {
+ platform: runtime.GOOS,
+ expected: image.V1Image{
+ OS: runtime.GOOS,
+ Architecture: runtime.GOARCH, // this may fail on armhf due to normalization?
+ },
+ },
+ {
+ platform: strings.ToUpper(runtime.GOOS),
+ expected: image.V1Image{
+ OS: runtime.GOOS,
+ Architecture: runtime.GOARCH, // this may fail on armhf due to normalization?
+ },
+ },
+ {
+ platform: runtime.GOOS + "/sparc64",
+ expected: image.V1Image{
+ OS: runtime.GOOS,
+ Architecture: "sparc64",
+ },
+ },
+ {
+ platform: "macos",
+ expectedErr: "operating system is not supported",
+ },
+ {
+ platform: "macos/arm64",
+ expectedErr: "operating system is not supported",
+ },
+ {
+ // TODO: platforms.Normalize() only validates os or arch if a single component is passed,
+ // but ignores unknown os/arch in other cases. See:
+ // https://github.com/containerd/containerd/blob/7d4891783aac5adf6cd83f657852574a71875631/platforms/platforms.go#L183-L209
+ platform: "nintendo64",
+ expectedErr: "unknown operating system or architecture",
+ },
+ }
+
+ for i, tc := range tests {
+ tc := tc
+ t.Run(tc.platform, func(t *testing.T) {
+ reference := "import-with-platform:tc-" + strconv.Itoa(i)
+ _, err = client.ImageImport(context.Background(),
+ types.ImageImportSource{Source: imageRdr, SourceName: "-"},
+ reference,
+ types.ImageImportOptions{Platform: tc.platform})
+ if tc.expectedErr != "" {
+ assert.ErrorContains(t, err, tc.expectedErr)
+ } else {
+ assert.NilError(t, err)
+
+ inspect, _, err := client.ImageInspectWithRaw(ctx, reference)
+ assert.NilError(t, err)
+ assert.Equal(t, inspect.Os, tc.expected.OS)
+ assert.Equal(t, inspect.Architecture, tc.expected.Architecture)
+ }
+ })
+ }
+}