diff options
author | Sebastiaan van Stijn <github@gone.nl> | 2021-12-22 17:21:27 +0100 |
---|---|---|
committer | Sebastiaan van Stijn <github@gone.nl> | 2022-01-24 18:24:51 +0100 |
commit | 01ae9525dd7d3e1fac7bd1b05f1d3286d853ff3a (patch) | |
tree | c3a1ed98b5de3b2bc677bc8bd298dbc5742aa582 /integration | |
parent | 6b69de61f9ef499ced56394cb79c72d53dc15b9f (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.go | 98 |
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) + } + }) + } +} |