diff --git a/cmd/mstorectl/imagecmd/imagecmd.go b/cmd/mstorectl/imagecmd/imagecmd.go index 5b0db41..9b14543 100644 --- a/cmd/mstorectl/imagecmd/imagecmd.go +++ b/cmd/mstorectl/imagecmd/imagecmd.go @@ -12,6 +12,7 @@ package imagecmd import ( "net/url" "path" + "runtime" "strings" "github.com/spf13/cobra" @@ -74,6 +75,10 @@ func (util *ImageUtil) CreateImageCmds() *cobra.Command { Run: util.PullImage, } pullImageCmd.Flags().BoolVarP(&util.pullImageParams.UseGoogleClient, "google", "G", false, "Use google client") + pullImageCmd.Flags().StringVarP(&util.pullImageParams.OS, "os", "O", runtime.GOOS, "Get operation system type") + pullImageCmd.Flags().StringVarP(&util.pullImageParams.Arch, "arch", "A", runtime.GOARCH, "Get CPU architerure") + pullImageCmd.Flags().StringVarP(&util.pullImageParams.Variant, "variant", "V", "", "Get OS or CPU variant") + subCmd.AddCommand(pullImageCmd) // DeleteImage diff --git a/cmd/mstorectl/imagecmd/pullimage.go b/cmd/mstorectl/imagecmd/pullimage.go index 0701c64..7eb6a7d 100644 --- a/cmd/mstorectl/imagecmd/pullimage.go +++ b/cmd/mstorectl/imagecmd/pullimage.go @@ -28,6 +28,9 @@ type PullImageParams struct { Imagepath string Filepath string UseGoogleClient bool + Arch string + OS string + Variant string } type PullImageResult struct { @@ -68,7 +71,7 @@ func (util *ImageUtil) pullImage(common *CommonImageParams, params *PullImagePar return res, err } imageDir := auxtool.MakeTmpFilename(params.Filepath) - err = load.Pull(ctx, ref.Raw(), imageDir, "", "") + err = load.Pull(ctx, ref.Raw(), imageDir, params.OS, params.Arch, params.Variant) if err != nil { return res, err } diff --git a/pkg/repocli/pullimage.go b/pkg/repocli/pullimage.go index 59c90d2..d77da33 100644 --- a/pkg/repocli/pullimage.go +++ b/pkg/repocli/pullimage.go @@ -20,14 +20,6 @@ import ( ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) -const ( -//MediaTypeOIIv1 = "application/vnd.oci.image.index.v1+json" -//MediaTypeDDMLv2 = "application/vnd.docker.distribution.manifest.list.v2+json" - -// MediaTypeDDMv2 = "application/vnd.docker.distribution.manifest.v2+json" -// MediaTypeOIMv1 = "application/vnd.oci.image.manifest.v1+json" -) - type Loader struct { cli *Client } @@ -38,7 +30,7 @@ func NewLoader(client *Client) *Loader { } } -func (down *Loader) Pull(ctx context.Context, rawref, dir, osname, arch string) error { +func (down *Loader) Pull(ctx context.Context, rawref, dir, osname, arch, variant string) error { var err error if osname == "" { osname = runtime.GOOS @@ -75,11 +67,16 @@ func (down *Loader) Pull(ctx context.Context, rawref, dir, osname, arch string) } for _, descr := range index.Manifests { if descr.Platform != nil { - cond := descr.Platform.Architecture == arch + var cond bool + cond = descr.Platform.Architecture == arch cond = cond && descr.Platform.OS == osname + if variant != "" { + cond = cond && descr.Platform.Variant == variant + } if cond { tag = descr.Digest.String() digstr = descr.Digest.String() + break } } }