From fdc81b99c7c59689eea548c80cbc44b2c9cfbf2a Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Mon, 18 May 2020 10:07:44 -0400 Subject: [PATCH] release: Mirroring from custom directory via oc adm release mirror fails The command fails when specifying a non-default from directory because the from directory was not passed to either extract or mirror. Add that transformation. Also include the Parallel options as good practice even if they are not heavily used in these flows. Backporting 4882c8f4f645a6e6478e643494a3ad1fd6cf5642 (#446) and resolving a context conflict because 4.3 does not include 3ddaf4d0cd (cherry-pick 331c1a1, 2020-04-17, #426). --- pkg/cli/admin/release/extract.go | 4 +++- pkg/cli/admin/release/mirror.go | 5 ++++- pkg/cli/admin/release/new.go | 5 ++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/pkg/cli/admin/release/extract.go b/pkg/cli/admin/release/extract.go index a04d6a83da..4bfc0c106c 100644 --- a/pkg/cli/admin/release/extract.go +++ b/pkg/cli/admin/release/extract.go @@ -88,7 +88,8 @@ type ExtractOptions struct { SecurityOptions imagemanifest.SecurityOptions ParallelOptions imagemanifest.ParallelOptions - From string + FromDir string + From string Tools bool Command string @@ -167,6 +168,7 @@ func (o *ExtractOptions) Run() error { return err } opts := extract.NewOptions(genericclioptions.IOStreams{Out: o.Out, ErrOut: o.ErrOut}) + opts.ParallelOptions = o.ParallelOptions opts.SecurityOptions = o.SecurityOptions opts.FileDir = o.FileDir diff --git a/pkg/cli/admin/release/mirror.go b/pkg/cli/admin/release/mirror.go index bbb990005b..1348726e7a 100644 --- a/pkg/cli/admin/release/mirror.go +++ b/pkg/cli/admin/release/mirror.go @@ -102,7 +102,7 @@ func NewMirror(f kcmdutil.Factory, parentName string, streams genericclioptions. flags.StringVar(&o.From, "from", o.From, "Image containing the release payload.") flags.StringVar(&o.To, "to", o.To, "An image repository to push to.") flags.StringVar(&o.ToImageStream, "to-image-stream", o.ToImageStream, "An image stream to tag images into.") - flags.StringVar(&o.FromDir, "from-dir", o.ToDir, "A directory to import images from.") + flags.StringVar(&o.FromDir, "from-dir", o.FromDir, "A directory to import images from.") flags.StringVar(&o.ToDir, "to-dir", o.ToDir, "A directory to export images to.") flags.BoolVar(&o.ToMirror, "to-mirror", o.ToMirror, "Output the mirror mappings instead of mirroring.") flags.BoolVar(&o.DryRun, "dry-run", o.DryRun, "Display information about the mirror without actually executing it.") @@ -297,10 +297,12 @@ func (o *MirrorOptions) Run() error { // load image references buf := &bytes.Buffer{} extractOpts := NewExtractOptions(genericclioptions.IOStreams{Out: buf, ErrOut: o.ErrOut}) + extractOpts.ParallelOptions = o.ParallelOptions extractOpts.SecurityOptions = o.SecurityOptions extractOpts.ImageMetadataCallback = func(m *extract.Mapping, dgst, contentDigest digest.Digest, config *dockerv1client.DockerImageConfig) { verifier.Verify(dgst, contentDigest) } + extractOpts.FileDir = o.FromDir extractOpts.From = o.From extractOpts.File = "image-references" if err := extractOpts.Run(); err != nil { @@ -539,6 +541,7 @@ func (o *MirrorOptions) Run() error { opts.SecurityOptions = o.SecurityOptions opts.ParallelOptions = o.ParallelOptions opts.Mappings = mappings + opts.FromFileDir = o.FromDir opts.FileDir = o.ToDir opts.DryRun = o.DryRun opts.ManifestUpdateCallback = func(registry string, manifests map[digest.Digest]digest.Digest) error { diff --git a/pkg/cli/admin/release/new.go b/pkg/cli/admin/release/new.go index cbd21f4b49..f5f96feffa 100644 --- a/pkg/cli/admin/release/new.go +++ b/pkg/cli/admin/release/new.go @@ -387,6 +387,7 @@ func (o *NewOptions) Run() error { buf := &bytes.Buffer{} extractOpts := extract.NewOptions(genericclioptions.IOStreams{Out: buf, ErrOut: o.ErrOut}) + extractOpts.ParallelOptions = o.ParallelOptions extractOpts.SecurityOptions = o.SecurityOptions extractOpts.OnlyFiles = true extractOpts.Mappings = []extract.Mapping{ @@ -922,9 +923,9 @@ func (o *NewOptions) extractManifests(is *imageapi.ImageStream, name string, met verifier := imagemanifest.NewVerifier() var lock sync.Mutex opts := extract.NewOptions(genericclioptions.IOStreams{Out: o.Out, ErrOut: o.ErrOut}) + opts.ParallelOptions = o.ParallelOptions opts.SecurityOptions = o.SecurityOptions opts.OnlyFiles = true - opts.ParallelOptions = o.ParallelOptions opts.ImageMetadataCallback = func(m *extract.Mapping, dgst, contentDigest digest.Digest, config *dockerv1client.DockerImageConfig) { verifier.Verify(dgst, contentDigest) @@ -1048,6 +1049,7 @@ func (o *NewOptions) mirrorImages(is *imageapi.ImageStream) error { opts.ImageStream = copied opts.To = o.Mirror opts.SkipRelease = true + opts.ParallelOptions = o.ParallelOptions opts.SecurityOptions = o.SecurityOptions if err := opts.Run(); err != nil { @@ -1178,6 +1180,7 @@ func (o *NewOptions) write(r io.Reader, is *imageapi.ImageStream, now time.Time) verifier := imagemanifest.NewVerifier() options := imageappend.NewAppendImageOptions(genericclioptions.IOStreams{Out: ioutil.Discard, ErrOut: o.ErrOut}) + options.ParallelOptions = o.ParallelOptions options.SecurityOptions = o.SecurityOptions options.DryRun = o.DryRun options.From = toImageBase