Signed-off-by: John Howard <jhoward@microsoft.com> This PR has the API changes described in https://github.com/moby/moby/issues/34617. Specifically, it adds an HTTP header "X-Requested-Platform" which is a JSON-encoded OCI Image-spec `Platform` structure. In addition, it renames (almost all) uses of a string variable platform (and associated) methods/functions to os. This makes it much clearer to disambiguate with the swarm "platform" which is really os/arch. This is a stepping stone to getting the daemon towards fully multi-platform/arch-aware, and makes it clear when "operating system" is being referred to rather than "platform" which is misleadingly used - sometimes in the swarm meaning, but more often as just the operating system. Upstream-commit: 0380fbff37922cadf294851b1546f4c212c7f364 Component: engine
72 lines
2.2 KiB
Go
72 lines
2.2 KiB
Go
package system
|
|
|
|
import (
|
|
"fmt"
|
|
"runtime"
|
|
"strings"
|
|
|
|
specs "github.com/opencontainers/image-spec/specs-go/v1"
|
|
)
|
|
|
|
// IsPlatformEmpty determines if an OCI image-spec platform structure is not populated.
|
|
// TODO This is a temporary function - can be replaced by parsing from
|
|
// https://github.com/containerd/containerd/pull/1403/files at a later date.
|
|
// @jhowardmsft
|
|
func IsPlatformEmpty(platform specs.Platform) bool {
|
|
if platform.Architecture == "" &&
|
|
platform.OS == "" &&
|
|
len(platform.OSFeatures) == 0 &&
|
|
platform.OSVersion == "" &&
|
|
platform.Variant == "" {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// ValidatePlatform determines if a platform structure is valid.
|
|
// TODO This is a temporary function - can be replaced by parsing from
|
|
// https://github.com/containerd/containerd/pull/1403/files at a later date.
|
|
// @jhowardmsft
|
|
func ValidatePlatform(platform *specs.Platform) error {
|
|
platform.Architecture = strings.ToLower(platform.Architecture)
|
|
platform.OS = strings.ToLower(platform.OS)
|
|
if platform.Architecture != "" && platform.Architecture != runtime.GOARCH {
|
|
return fmt.Errorf("invalid platform architecture %q", platform.Architecture)
|
|
}
|
|
if platform.OS != "" {
|
|
if !(platform.OS == runtime.GOOS || (LCOWSupported() && platform.OS == "linux")) {
|
|
return fmt.Errorf("invalid platform os %q", platform.OS)
|
|
}
|
|
}
|
|
if len(platform.OSFeatures) != 0 {
|
|
return fmt.Errorf("invalid platform osfeatures %q", platform.OSFeatures)
|
|
}
|
|
if platform.OSVersion != "" {
|
|
return fmt.Errorf("invalid platform osversion %q", platform.OSVersion)
|
|
}
|
|
if platform.Variant != "" {
|
|
return fmt.Errorf("invalid platform variant %q", platform.Variant)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ParsePlatform parses a platform string in the format os[/arch[/variant]
|
|
// into an OCI image-spec platform structure.
|
|
// TODO This is a temporary function - can be replaced by parsing from
|
|
// https://github.com/containerd/containerd/pull/1403/files at a later date.
|
|
// @jhowardmsft
|
|
func ParsePlatform(in string) *specs.Platform {
|
|
p := &specs.Platform{}
|
|
elements := strings.SplitN(strings.ToLower(in), "/", 3)
|
|
if len(elements) == 3 {
|
|
p.Variant = elements[2]
|
|
}
|
|
if len(elements) >= 2 {
|
|
p.Architecture = elements[1]
|
|
}
|
|
if len(elements) >= 1 {
|
|
p.OS = elements[0]
|
|
}
|
|
return p
|
|
}
|