Merge pull request #37350 from tonistiigi/platform-support

Fix platform struct passing
diff --git a/api/server/server.go b/api/server/server.go
index 3874a56..c364008 100644
--- a/api/server/server.go
+++ b/api/server/server.go
@@ -149,7 +149,7 @@
 }
 
 // InitRouter initializes the list of routers for the server.
-// This method also enables the Go profiler if enableProfiler is true.
+// This method also enables the Go profiler.
 func (s *Server) InitRouter(routers ...router.Router) {
 	s.routers = append(s.routers, routers...)
 
diff --git a/integration/internal/network/ops.go b/integration/internal/network/ops.go
index 9b69b79..33bd3d0 100644
--- a/integration/internal/network/ops.go
+++ b/integration/internal/network/ops.go
@@ -33,6 +33,13 @@
 	}
 }
 
+// WithAttachable sets Attachable flag on the create network request
+func WithAttachable() func(*types.NetworkCreate) {
+	return func(n *types.NetworkCreate) {
+		n.Attachable = true
+	}
+}
+
 // WithMacvlan sets the network as macvlan with the specified parent
 func WithMacvlan(parent string) func(*types.NetworkCreate) {
 	return func(n *types.NetworkCreate) {
diff --git a/integration/network/service_test.go b/integration/network/service_test.go
index d926045..b276c51 100644
--- a/integration/network/service_test.go
+++ b/integration/network/service_test.go
@@ -66,7 +66,7 @@
 	assert.Equal(t, out.IPAM.Config[0].Subnet, "175.30.0.0/16")
 
 	// Create a bridge network and verify its subnet is the second default pool
-	name := "elango"
+	name := "elango" + t.Name()
 	network.CreateNoError(t, context.Background(), cli, name,
 		network.WithDriver("bridge"),
 	)
@@ -75,7 +75,7 @@
 	assert.Equal(t, out.IPAM.Config[0].Subnet, "175.33.0.0/24")
 
 	// Create a bridge network and verify its subnet is the third default pool
-	name = "saanvi"
+	name = "saanvi" + t.Name()
 	network.CreateNoError(t, context.Background(), cli, name,
 		network.WithDriver("bridge"),
 	)
@@ -99,7 +99,7 @@
 	defer cli.Close()
 
 	// Create a bridge network
-	name := "elango"
+	name := "elango" + t.Name()
 	network.CreateNoError(t, context.Background(), cli, name,
 		network.WithDriver("bridge"),
 	)
@@ -131,7 +131,7 @@
 	defer cli.Close()
 
 	// Create a bridge network
-	name := "elango"
+	name := "elango" + t.Name()
 	network.CreateNoError(t, context.Background(), cli, name,
 		network.WithDriver("bridge"),
 	)
@@ -140,7 +140,7 @@
 	networkip := out.IPAM.Config[0].Subnet
 
 	// Create a bridge network
-	name = "sthira"
+	name = "sthira" + t.Name()
 	network.CreateNoError(t, context.Background(), cli, name,
 		network.WithDriver("bridge"),
 	)
@@ -154,7 +154,7 @@
 		"--default-address-pool", "base=175.19.0.0/16,size=24")
 
 	// Create a bridge network
-	name = "saanvi"
+	name = "saanvi" + t.Name()
 	network.CreateNoError(t, context.Background(), cli, name,
 		network.WithDriver("bridge"),
 	)
diff --git a/integration/service/network_test.go b/integration/service/network_test.go
index 4ebbd97..ba170fc 100644
--- a/integration/service/network_test.go
+++ b/integration/service/network_test.go
@@ -7,6 +7,7 @@
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types/network"
 	"github.com/docker/docker/integration/internal/container"
+	net "github.com/docker/docker/integration/internal/network"
 	"github.com/docker/docker/integration/internal/swarm"
 	"gotest.tools/assert"
 	is "gotest.tools/assert/cmp"
@@ -21,11 +22,10 @@
 	ctx := context.Background()
 
 	name := t.Name() + "test-alias"
-	_, err := client.NetworkCreate(ctx, name, types.NetworkCreate{
-		Driver:     "overlay",
-		Attachable: true,
-	})
-	assert.NilError(t, err)
+	net.CreateNoError(t, ctx, client, name,
+		net.WithDriver("overlay"),
+		net.WithAttachable(),
+	)
 
 	cID1 := container.Create(t, ctx, client, func(c *container.TestContainerConfig) {
 		c.NetworkingConfig = &network.NetworkingConfig{
@@ -35,7 +35,7 @@
 		}
 	})
 
-	err = client.NetworkConnect(ctx, name, cID1, &network.EndpointSettings{
+	err := client.NetworkConnect(ctx, name, cID1, &network.EndpointSettings{
 		Aliases: []string{
 			"aaa",
 		},
diff --git a/vendor.conf b/vendor.conf
index 627a856..cd059b7 100644
--- a/vendor.conf
+++ b/vendor.conf
@@ -114,7 +114,7 @@
 google.golang.org/genproto 694d95ba50e67b2e363f3483057db5d4910c18f9
 
 # containerd
-github.com/containerd/containerd 63522d9eaa5a0443d225642c4b6f4f5fdedf932b
+github.com/containerd/containerd 08f7ee9828af1783dc98cc5cc1739e915697c667
 github.com/containerd/fifo 3d5202aec260678c48179c56f40e6f38a095738c
 github.com/containerd/continuity d3c23511c1bf5851696cba83143d9cbcd666869b
 github.com/containerd/cgroups fe281dd265766145e943a034aa41086474ea6130
diff --git a/vendor/github.com/containerd/containerd/images/image.go b/vendor/github.com/containerd/containerd/images/image.go
index 35eda26..a96597c 100644
--- a/vendor/github.com/containerd/containerd/images/image.go
+++ b/vendor/github.com/containerd/containerd/images/image.go
@@ -129,11 +129,14 @@
 // this direction because this abstraction is not needed.`
 func Manifest(ctx context.Context, provider content.Provider, image ocispec.Descriptor, platform string) (ocispec.Manifest, error) {
 	var (
-		matcher platforms.Matcher
-		m       *ocispec.Manifest
+		matcher  platforms.Matcher
+		m        *ocispec.Manifest
+		p        ocispec.Platform
+		wasIndex bool
 	)
 	if platform != "" {
-		p, err := platforms.Parse(platform)
+		var err error
+		p, err = platforms.Parse(platform)
 		if err != nil {
 			return ocispec.Manifest{}, err
 		}
@@ -201,6 +204,8 @@
 				}
 			}
 
+			wasIndex = true
+
 			return descs, nil
 
 		}
@@ -210,7 +215,11 @@
 	}
 
 	if m == nil {
-		return ocispec.Manifest{}, errors.Wrapf(errdefs.ErrNotFound, "manifest %v", image.Digest)
+		err := errors.Wrapf(errdefs.ErrNotFound, "manifest %v", image.Digest)
+		if wasIndex {
+			err = errors.Wrapf(errdefs.ErrNotFound, "no match for current platform %s in manifest %v", platforms.Format(p), image.Digest)
+		}
+		return ocispec.Manifest{}, err
 	}
 
 	return *m, nil
diff --git a/vendor/github.com/containerd/containerd/platforms/database.go b/vendor/github.com/containerd/containerd/platforms/database.go
index df9cc23..8e85448 100644
--- a/vendor/github.com/containerd/containerd/platforms/database.go
+++ b/vendor/github.com/containerd/containerd/platforms/database.go
@@ -89,18 +89,21 @@
 	case "x86_64", "x86-64":
 		arch = "amd64"
 		variant = ""
-	case "aarch64":
+	case "aarch64", "arm64":
 		arch = "arm64"
-		variant = "" // v8 is implied
+		switch variant {
+		case "8", "v8":
+			variant = ""
+		}
 	case "armhf":
 		arch = "arm"
-		variant = ""
+		variant = "v7"
 	case "armel":
 		arch = "arm"
 		variant = "v6"
 	case "arm":
 		switch variant {
-		case "v7", "7":
+		case "", "7":
 			variant = "v7"
 		case "5", "6", "8":
 			variant = "v" + variant
diff --git a/vendor/github.com/containerd/containerd/platforms/platforms.go b/vendor/github.com/containerd/containerd/platforms/platforms.go
index 1f91ed2..29b7ad6 100644
--- a/vendor/github.com/containerd/containerd/platforms/platforms.go
+++ b/vendor/github.com/containerd/containerd/platforms/platforms.go
@@ -135,7 +135,7 @@
 // Applications should opt to use `Match` over directly parsing specifiers.
 func NewMatcher(platform specs.Platform) Matcher {
 	return &matcher{
-		Platform: platform,
+		Platform: Normalize(platform),
 	}
 }
 
@@ -197,6 +197,9 @@
 		}
 
 		p.Architecture, p.Variant = normalizeArch(parts[0], "")
+		if p.Architecture == "arm" && p.Variant == "v7" {
+			p.Variant = ""
+		}
 		if isKnownArch(p.Architecture) {
 			p.OS = runtime.GOOS
 			return p, nil
@@ -208,12 +211,18 @@
 		// about whether or not we know of the platform.
 		p.OS = normalizeOS(parts[0])
 		p.Architecture, p.Variant = normalizeArch(parts[1], "")
+		if p.Architecture == "arm" && p.Variant == "v7" {
+			p.Variant = ""
+		}
 
 		return p, nil
 	case 3:
 		// we have a fully specified variant, this is rare
 		p.OS = normalizeOS(parts[0])
 		p.Architecture, p.Variant = normalizeArch(parts[1], parts[2])
+		if p.Architecture == "arm64" && p.Variant == "" {
+			p.Variant = "v8"
+		}
 
 		return p, nil
 	}
diff --git a/vendor/github.com/containerd/containerd/runtime/shim/client/client.go b/vendor/github.com/containerd/containerd/runtime/shim/client/client.go
index f636128..e46d6df 100644
--- a/vendor/github.com/containerd/containerd/runtime/shim/client/client.go
+++ b/vendor/github.com/containerd/containerd/runtime/shim/client/client.go
@@ -136,6 +136,7 @@
 	// will be mounted by the shim
 	cmd.SysProcAttr = getSysProcAttr()
 	cmd.ExtraFiles = append(cmd.ExtraFiles, socket)
+	cmd.Env = append(os.Environ(), "GOMAXPROCS=2")
 	if debug {
 		cmd.Stdout = os.Stdout
 		cmd.Stderr = os.Stderr
diff --git a/vendor/github.com/containerd/containerd/vendor.conf b/vendor/github.com/containerd/containerd/vendor.conf
index 7585e03..2e100c1 100644
--- a/vendor/github.com/containerd/containerd/vendor.conf
+++ b/vendor/github.com/containerd/containerd/vendor.conf
@@ -22,7 +22,6 @@
 github.com/opencontainers/runtime-spec v1.0.1
 github.com/opencontainers/runc 69663f0bd4b60df09991c08812a60108003fa340
 github.com/sirupsen/logrus v1.0.0
-github.com/pmezard/go-difflib v1.0.0
 github.com/urfave/cli 7bc6a0acffa589f415f88aca16cc1de5ffd66f9c
 golang.org/x/net b3756b4b77d7b13260a0a2ec658753cf48922eac
 google.golang.org/grpc v1.12.0
@@ -40,7 +39,7 @@
 golang.org/x/text 19e51611da83d6be54ddafce4a4af510cb3e9ea4
 github.com/stevvooe/ttrpc d4528379866b0ce7e9d71f3eb96f0582fc374577
 github.com/syndtr/gocapability db04d3cc01c8b54962a58ec7e491717d06cfcc16
-github.com/gotestyourself/gotestyourself 44dbf532bbf5767611f6f2a61bded572e337010a
+gotest.tools v2.1.0
 github.com/google/go-cmp v0.1.0
 
 github.com/containerd/cri 8bcb9a95394e8d7845da1d6a994d3ac2a86d22f0