Skip to content

Commit

Permalink
Add support for --override-platform flag. Closes containers#2118.
Browse files Browse the repository at this point in the history
Signed-off-by: Jesse Rittner <[email protected]>
  • Loading branch information
rittneje committed Dec 6, 2023
1 parent a85eaac commit ad8f7ca
Show file tree
Hide file tree
Showing 23 changed files with 1,836 additions and 13 deletions.
51 changes: 42 additions & 9 deletions cmd/skopeo/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"strings"
"time"

"github.com/containerd/containerd/platforms"
commonFlag "github.com/containers/common/pkg/flag"
"github.com/containers/image/v5/signature"
"github.com/containers/image/v5/types"
Expand All @@ -27,9 +28,7 @@ type globalOptions struct {
policyPath string // Path to a signature verification policy file
insecurePolicy bool // Use an "allow everything" signature verification policy
registriesDirPath string // Path to a "registries.d" registry configuration directory
overrideArch string // Architecture to use for choosing images, instead of the runtime one
overrideOS string // OS to use for choosing images, instead of the runtime one
overrideVariant string // Architecture variant to use for choosing images, instead of the runtime one
overridePlatform platformSpecifier // Platform specifier to use for choosing images, instead of the runtime one
commandTimeout time.Duration // Timeout for the command execution
registriesConfPath string // Path to the "registries.conf" file
tmpDir string // Path to use for big temporary files
Expand Down Expand Up @@ -82,9 +81,10 @@ func createApp() (*cobra.Command, *globalOptions) {
rootCommand.PersistentFlags().StringVar(&opts.policyPath, "policy", "", "Path to a trust policy file")
rootCommand.PersistentFlags().BoolVar(&opts.insecurePolicy, "insecure-policy", false, "run the tool without any policy check")
rootCommand.PersistentFlags().StringVar(&opts.registriesDirPath, "registries.d", "", "use registry configuration files in `DIR` (e.g. for container signature storage)")
rootCommand.PersistentFlags().StringVar(&opts.overrideArch, "override-arch", "", "use `ARCH` instead of the architecture of the machine for choosing images")
rootCommand.PersistentFlags().StringVar(&opts.overrideOS, "override-os", "", "use `OS` instead of the running OS for choosing images")
rootCommand.PersistentFlags().StringVar(&opts.overrideVariant, "override-variant", "", "use `VARIANT` instead of the running architecture variant for choosing images")
rootCommand.PersistentFlags().Var(&opts.overridePlatform, "override-platform", "use `PLATFORM` instead of the platform of the machine for choosing images")
rootCommand.PersistentFlags().StringVar(&opts.overridePlatform.architecture, "override-arch", "", "use `ARCH` instead of the architecture of the machine for choosing images")
rootCommand.PersistentFlags().StringVar(&opts.overridePlatform.os, "override-os", "", "use `OS` instead of the running OS for choosing images")
rootCommand.PersistentFlags().StringVar(&opts.overridePlatform.variant, "override-variant", "", "use `VARIANT` instead of the running architecture variant for choosing images")
rootCommand.PersistentFlags().DurationVar(&opts.commandTimeout, "command-timeout", 0, "timeout for the command execution")
rootCommand.PersistentFlags().StringVar(&opts.registriesConfPath, "registries-conf", "", "path to the registries.conf file")
if err := rootCommand.PersistentFlags().MarkHidden("registries-conf"); err != nil {
Expand Down Expand Up @@ -166,9 +166,9 @@ func (opts *globalOptions) commandTimeoutContext() (context.Context, context.Can
func (opts *globalOptions) newSystemContext() *types.SystemContext {
ctx := &types.SystemContext{
RegistriesDirPath: opts.registriesDirPath,
ArchitectureChoice: opts.overrideArch,
OSChoice: opts.overrideOS,
VariantChoice: opts.overrideVariant,
ArchitectureChoice: opts.overridePlatform.architecture,
OSChoice: opts.overridePlatform.os,
VariantChoice: opts.overridePlatform.variant,
SystemRegistriesConfPath: opts.registriesConfPath,
BigFilesTemporaryDir: opts.tmpDir,
DockerRegistryUserAgent: defaultUserAgent,
Expand All @@ -179,3 +179,36 @@ func (opts *globalOptions) newSystemContext() *types.SystemContext {
}
return ctx
}

type platformSpecifier struct {
os string
architecture string
variant string
}

func (ps *platformSpecifier) Set(s string) error {
p, err := platforms.Parse(s)
if err != nil {
return err
}

ps.os = p.OS
ps.architecture = p.Architecture
ps.variant = p.Variant

return nil
}

func (ps *platformSpecifier) String() string {
components := make([]string, 0, 3)
for _, s := range []string{ps.os, ps.architecture, ps.variant} {
if s != "" {
components = append(components, s)
}
}
return strings.Join(components, "/")
}

func (*platformSpecifier) Type() string {
return "platform specifier"
}
19 changes: 16 additions & 3 deletions cmd/skopeo/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,11 @@ func TestGlobalOptionsNewSystemContext(t *testing.T) {
// User-Agent is set by default.
DockerRegistryUserAgent: defaultUserAgent,
}, res)

// Set everything to non-default values.
opts, _ = fakeGlobalOptions(t, []string{
"--registries.d", "/srv/registries.d",
"--override-arch", "overridden-arch",
"--override-os", "overridden-os",
"--override-variant", "overridden-variant",
"--override-platform", "overridden-os/overridden-arch/overridden-variant",
"--tmpdir", "/srv",
"--registries-conf", "/srv/registries.conf",
"--tls-verify=false",
Expand All @@ -48,4 +47,18 @@ func TestGlobalOptionsNewSystemContext(t *testing.T) {
DockerInsecureSkipTLSVerify: types.OptionalBoolTrue,
DockerRegistryUserAgent: defaultUserAgent,
}, res)

// Test legacy platform overrides.
opts, _ = fakeGlobalOptions(t, []string{
"--override-arch", "overridden-arch",
"--override-os", "overridden-os",
"--override-variant", "overridden-variant",
})
res = opts.newSystemContext()
assert.Equal(t, &types.SystemContext{
ArchitectureChoice: "overridden-arch",
OSChoice: "overridden-os",
VariantChoice: "overridden-variant",
DockerRegistryUserAgent: defaultUserAgent,
}, res)
}
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module github.com/containers/skopeo
go 1.19

require (
github.com/containerd/containerd v1.7.9
github.com/containers/common v0.57.0
github.com/containers/image/v5 v5.29.0
github.com/containers/ocicrypt v1.1.9
Expand Down Expand Up @@ -30,7 +31,7 @@ require (
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/containerd/cgroups/v3 v3.0.2 // indirect
github.com/containerd/containerd v1.7.9 // indirect
github.com/containerd/log v0.1.0 // indirect
github.com/containerd/stargz-snapshotter/estargz v0.15.1 // indirect
github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 // indirect
github.com/coreos/go-oidc/v3 v3.7.0 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ github.com/containerd/cgroups/v3 v3.0.2 h1:f5WFqIVSgo5IZmtTT3qVBo6TzI1ON6sycSBKk
github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE=
github.com/containerd/containerd v1.7.9 h1:KOhK01szQbM80YfW1H6RZKh85PHGqY/9OcEZ35Je8sc=
github.com/containerd/containerd v1.7.9/go.mod h1:0/W44LWEYfSHoxBtsHIiNU/duEkgpMokemafHVCpq9Y=
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
github.com/containerd/stargz-snapshotter/estargz v0.15.1 h1:eXJjw9RbkLFgioVaTG+G/ZW/0kEe2oEKCdS/ZxIyoCU=
github.com/containerd/stargz-snapshotter/estargz v0.15.1/go.mod h1:gr2RNwukQ/S9Nv33Lt6UC7xEx58C+LHRdoqbEKjz1Kk=
github.com/containers/common v0.57.0 h1:5O/+6QUBafKK0/zeok9y1rLPukfWgdE0sT4nuzmyAqk=
Expand Down
149 changes: 149 additions & 0 deletions vendor/github.com/containerd/containerd/log/context_deprecated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit ad8f7ca

Please sign in to comment.