pkg/bindings: Support writing image push progress to specified io.Writer

Currently bindings writes image push progress to os.Stderr.

Since os.Stderr is inconvenience for bindings caller to
process the progress messages, Added this support.

Signed-off-by: Naoto Kobayashi <naoto.kobayashi4c@gmail.com>
This commit is contained in:
Naoto Kobayashi
2022-08-07 23:28:51 +09:00
parent 635293ed14
commit b1d1248a18
5 changed files with 29 additions and 1 deletions

View File

@ -62,6 +62,8 @@ func Push(ctx context.Context, source string, destination string, options *PushO
writer := io.Writer(os.Stderr)
if options.GetQuiet() {
writer = ioutil.Discard
} else if progressWriter := options.GetProgressWriter(); progressWriter != nil {
writer = progressWriter
}
dec := json.NewDecoder(response.Body)

View File

@ -1,6 +1,8 @@
package images
import (
"io"
buildahDefine "github.com/containers/buildah/define"
)
@ -131,6 +133,10 @@ type PushOptions struct {
Format *string
// Password for authenticating against the registry.
Password *string
// ProgressWriter is a writer where push progress are sent.
// Since API handler for image push is quiet by default, WithQuiet(false) is necessary for
// the writer to receive progress messages.
ProgressWriter *io.Writer
// SkipTLSVerify to skip HTTPS and certificate verification.
SkipTLSVerify *bool
// RemoveSignatures Discard any pre-existing signatures in the image.

View File

@ -2,6 +2,7 @@
package images
import (
"io"
"net/url"
"github.com/containers/podman/v4/pkg/bindings/internal/util"
@ -107,6 +108,21 @@ func (o *PushOptions) GetPassword() string {
return *o.Password
}
// WithProgressWriter set field ProgressWriter to given value
func (o *PushOptions) WithProgressWriter(value io.Writer) *PushOptions {
o.ProgressWriter = &value
return o
}
// GetProgressWriter returns value of field ProgressWriter
func (o *PushOptions) GetProgressWriter() io.Writer {
if o.ProgressWriter == nil {
var z io.Writer
return z
}
return *o.ProgressWriter
}
// WithSkipTLSVerify set field SkipTLSVerify to given value
func (o *PushOptions) WithSkipTLSVerify(value bool) *PushOptions {
o.SkipTLSVerify = &value

View File

@ -379,6 +379,10 @@ var _ = Describe("Podman images", func() {
Expect(err).To(HaveOccurred())
})
It("Image Push", func() {
Skip("TODO: implement test for image push to registry")
})
It("Build no options", func() {
results, err := images.Build(bt.conn, []string{"fixture/Containerfile"}, entities.BuildOptions{})
Expect(err).ToNot(HaveOccurred())

View File

@ -240,7 +240,7 @@ func (ir *ImageEngine) Import(ctx context.Context, opts entities.ImageImportOpti
func (ir *ImageEngine) Push(ctx context.Context, source string, destination string, opts entities.ImagePushOptions) error {
options := new(images.PushOptions)
options.WithAll(opts.All).WithCompress(opts.Compress).WithUsername(opts.Username).WithPassword(opts.Password).WithAuthfile(opts.Authfile).WithFormat(opts.Format).WithRemoveSignatures(opts.RemoveSignatures).WithQuiet(opts.Quiet).WithCompressionFormat(opts.CompressionFormat)
options.WithAll(opts.All).WithCompress(opts.Compress).WithUsername(opts.Username).WithPassword(opts.Password).WithAuthfile(opts.Authfile).WithFormat(opts.Format).WithRemoveSignatures(opts.RemoveSignatures).WithQuiet(opts.Quiet).WithCompressionFormat(opts.CompressionFormat).WithProgressWriter(opts.Writer)
if s := opts.SkipTLSVerify; s != types.OptionalBoolUndefined {
if s == types.OptionalBoolTrue {