Description: add process bar 
   * Version: 20.10.3-14
   * add process bar 
Author: wanghuaiqing <wanghuaiqing@loongson.com>

---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: <vendor|upstream|other>, <url of original patch>
Bug: <url in upstream bugtracker>
Bug-Debian: https://bugs.debian.org/<bugnumber>
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: 2022-05-11

--- lcf-utils-1.0.1/src/loongker-ce-20.10.3.orig/sources/cli/cli/command/image/genapplayer.go
+++ lcf-utils-1.0.1/src/loongker-ce-20.10.3/sources/cli/cli/command/image/genapplayer.go
@@ -1,17 +1,18 @@
 package image
 
 import (
+	"io"
 	"context"
-	"fmt"
 	"github.com/docker/cli/cli"
 	"github.com/docker/cli/cli/command"
-	"github.com/docker/docker/api/types"
 	"github.com/spf13/cobra"
+	"github.com/docker/docker/pkg/jsonmessage"
 )
 
 type genOptions struct {
 	image string
 	name  string
+	quiet bool
 }
 
 // NewTagCommand creates a new `docker gen` command
@@ -30,19 +31,28 @@ func NewGenCommand(dockerCli command.Cli
 	}
 
 	flags := cmd.Flags()
-	flags.SetInterspersed(false)
+	flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Suppress the gen output")
 
 	return cmd
 }
 
 func runGen(dockerCli command.Cli, opts genOptions) error {
 	ctx := context.Background()
-	var applayer types.ImageGenApplayerBody
 
-	applayer, err := dockerCli.Client().ImageGenApplayer(ctx, opts.image, opts.name)
+	if !dockerCli.Out().IsTerminal() {
+		opts.quiet = true
+	}
+
+	response, err := dockerCli.Client().ImageGenApplayer(ctx, opts.image, opts.name, opts.quiet)
 	if err != nil {
 		return err
 	}
-	fmt.Fprintln(dockerCli.Out(), "gen Applayer ", applayer.ID)
+	defer response.Body.Close()
+
+	if response.Body != nil && response.JSON {
+		return jsonmessage.DisplayJSONMessagesToStream(response.Body, dockerCli.Out(), nil)
+	}
+
+	_, err = io.Copy(dockerCli.Out(), response.Body)
 	return nil
 }
--- lcf-utils-1.0.1/src/loongker-ce-20.10.3/sources/cli/vendor/github.com/docker/docker/client/appimage_load.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net/url"
-
-	"github.com/docker/docker/api/types"
-)
-
-// ImageLoad loads an image in the docker host from the client host.
-// It's up to the caller to close the io.ReadCloser in the
-// ImageLoadResponse returned by this function.
-func (cli *Client) AppImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error) {
-	v := url.Values{}
-	v.Set("quiet", "0")
-	if quiet {
-		v.Set("quiet", "1")
-	}
-	headers := map[string][]string{"Content-Type": {"application/x-tar"}}
-	resp, err := cli.postRaw(ctx, "/images/loadapp", v, input, headers)
-	if err != nil {
-		return types.ImageLoadResponse{}, err
-	}
-	return types.ImageLoadResponse{
-		Body: resp.body,
-		JSON: resp.header.Get("Content-Type") == "application/json",
-	}, nil
-}
--- lcf-utils-1.0.1/src/loongker-ce-20.10.3/sources/cli/vendor/github.com/docker/docker/client/appimage_save.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package client // import "github.com/docker/docker/client"
-
-import (
-	"context"
-	"io"
-	"net/url"
-)
-
-// AppImageSave retrieves one or more images from the docker host as an io.ReadCloser.
-// It's up to the caller to store the images and close the stream.
-func (cli *Client) AppImageSave(ctx context.Context, baseimage string, appimage string) (io.ReadCloser, error) {
-	query := url.Values{}
-	if baseimage != "" {
-		query.Set("baseimage", baseimage)
-	}
-	if appimage != "" {
-		query.Set("appimage", appimage)
-	}
-	resp, err := cli.get(ctx, "/images/getapp", query, nil)
-	if err != nil {
-		return nil, err
-	}
-	return resp.body, nil
-}
--- lcf-utils-1.0.1/src/loongker-ce-20.10.3.orig/sources/cli/vendor/github.com/docker/docker/client/image_gen.go
+++ lcf-utils-1.0.1/src/loongker-ce-20.10.3/sources/cli/vendor/github.com/docker/docker/client/image_gen.go
@@ -2,23 +2,27 @@ package client // import "github.com/doc
 
 import (
 	"context"
-	"encoding/json"
 	"net/url"
 
 	"github.com/docker/docker/api/types"
 )
 
-func (cli *Client) ImageGenApplayer(ctx context.Context, imageID string, target string) (types.ImageGenApplayerBody, error) {
+func (cli *Client) ImageGenApplayer(ctx context.Context, imageID string, target string, quiet bool) (types.ImageLoadResponse, error) {
 	query := url.Values{}
 	query.Set("applayername", target)
-
-	var applayer types.ImageGenApplayerBody
-	resp, err := cli.post(ctx, "/images/"+imageID+"/genapplayer", query, nil, nil)
-	defer ensureReaderClosed(resp)
+	query.Set("quiet", "0")
+	if quiet {
+		query.Set("quiet", "1")
+	}
+	headers := map[string][]string{"Content-Type": {"application/x-tar"}}
+	resp, err := cli.postRaw(ctx, "/images/"+imageID+"/genapplayer", query, nil, headers)
 	if err != nil {
-		return applayer, wrapResponseError(err, resp, "image", imageID)
+		return types.ImageLoadResponse{}, err
 	}
 
-	err = json.NewDecoder(resp.body).Decode(&applayer)
-	return applayer, err
+	return types.ImageLoadResponse{
+		Body: resp.body,
+		JSON: resp.header.Get("Content-Type") == "application/json",
+	}, nil
+
 }
--- lcf-utils-1.0.1/src/loongker-ce-20.10.3.orig/sources/cli/vendor/github.com/docker/docker/client/interface.go
+++ lcf-utils-1.0.1/src/loongker-ce-20.10.3/sources/cli/vendor/github.com/docker/docker/client/interface.go
@@ -105,7 +105,7 @@ type ImageAPIClient interface {
 	UpgradeImageSave(ctx context.Context, baseimage string, upgradeimage string, target string) (io.ReadCloser, error)
 	ImageTag(ctx context.Context, image, ref string) error
 	ImagesPrune(ctx context.Context, pruneFilter filters.Args) (types.ImagesPruneReport, error)
-	ImageGenApplayer(ctx context.Context, imageID string, target string) (types.ImageGenApplayerBody, error)
+	ImageGenApplayer(ctx context.Context, imageID string, target string, quiet bool) (types.ImageLoadResponse, error)
 	AppLayerList(ctx context.Context, options types.AppLayerListOptions) ([]types.AppLayer, error)
 	ApplayerRemove(ctx context.Context,  idorName string) (types.AppLayerDeleteResponse, error)
 	Appcompose(ctx context.Context) error
--- lcf-utils-1.0.1/src/loongker-ce-20.10.3.orig/sources/engine/api/server/router/image/backend.go
+++ lcf-utils-1.0.1/src/loongker-ce-20.10.3/sources/engine/api/server/router/image/backend.go
@@ -27,7 +27,7 @@ type imageBackend interface {
 	LookupImage(name string) (*types.ImageInspect, error)
 	TagImage(imageName, repository, tag string) (string, error)
 	ImagesPrune(ctx context.Context, pruneFilters filters.Args) (*types.ImagesPruneReport, error)
-	ImageGenApplayer(imageRef string, appname string, outStream io.Writer) (*types.ImageGenApplayerBody, error)
+	ImageGenApplayer(imageRef string, appname string, outStream io.Writer, quiet bool) error
 	ApplayerDelete(idorName string) (*types.AppLayerDeleteResponse, error)
 	Appcompose() error
 }
--- lcf-utils-1.0.1/src/loongker-ce-20.10.3.orig/sources/engine/api/server/router/image/image_routes.go
+++ lcf-utils-1.0.1/src/loongker-ce-20.10.3/sources/engine/api/server/router/image/image_routes.go
@@ -327,6 +327,7 @@ func (s *imageRouter) genApplayer(ctx co
 	output := ioutils.NewWriteFlusher(w)
 	defer output.Close()
 
+	quiet := httputils.BoolValueOrDefault(r, "quiet", true)
 	applayername := r.Form.Get("applayername")
 	name := vars["name"]
 
@@ -334,12 +335,12 @@ func (s *imageRouter) genApplayer(ctx co
 		return missingImageError{}
 	}
 
-	response, err := s.backend.ImageGenApplayer(name, applayername, output)
+	err := s.backend.ImageGenApplayer(name, applayername, output, quiet)
 	if err != nil {
 		return err
 	}
 
-	return httputils.WriteJSON(w, http.StatusOK, response)
+	return nil
 }
 
 func (s *imageRouter) getImagesByName(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
--- lcf-utils-1.0.1/src/loongker-ce-20.10.3.orig/sources/engine/daemon/images/image_genapplayer.go
+++ lcf-utils-1.0.1/src/loongker-ce-20.10.3/sources/engine/daemon/images/image_genapplayer.go
@@ -4,7 +4,6 @@ import (
 	"io"
 	"runtime"
 	"encoding/json"
-	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/layer"
 	"github.com/docker/docker/image"
 	"github.com/docker/docker/pkg/system"
@@ -15,72 +14,72 @@ import (
 	digest "github.com/opencontainers/go-digest"
 )
 
-func (i *ImageService) ImageGenApplayer(imageRef string, appname string, outStream io.Writer) (*types.ImageGenApplayerBody, error) {
+func (i *ImageService) ImageGenApplayer(imageRef string, appname string, outStream io.Writer, quiet bool) error {
 
 	var progressOutput progress.Output
-	progressOutput = streamformatter.NewJSONProgressOutput(outStream, false)
+	if !quiet {
+		progressOutput = streamformatter.NewJSONProgressOutput(outStream, false)
+	}
 	outStream = streamformatter.NewStdoutWriter(outStream)
 
 	id, err := i.applayerStore.GetByName(appname)
 	if err == nil {
-		return  nil, errors.Errorf("name %s already exists", appname)
+		return errors.Errorf("name %s already exists", appname)
 	}
-	var resp types.ImageGenApplayerBody
 	img, err := i.GetImage(imageRef, nil)
 	if err != nil {
-		return nil, err
+		return err
 	}
 
 	if !system.IsOSSupported(img.OperatingSystem()) {
-		return	nil, errors.Errorf("unable to gen applayer: %q", system.ErrNotSupportedOperatingSystem)
+		return	errors.Errorf("unable to gen applayer: %q", system.ErrNotSupportedOperatingSystem)
 	}
 	if img.DiffLen() <= 1 {
-		return  nil, errors.Errorf("image layers count is not more than 1, please check it")
+		return  errors.Errorf("image layers count is not more than 1, please check it")
 	}
 	os := img.OS
 	if os == "" {
 		os = runtime.GOOS
 	}
 	if os != "linux" {
-		return	nil, errors.Errorf("please check image os, make sure it is linux")
+		return	errors.Errorf("please check image os, make sure it is linux")
 	}
 	appimg := image.NewApplayerImage(img)
 	config, err := json.Marshal(appimg)
 	if err != nil {
-		return nil, err
+		return err
 	}
 	dgst := digest.FromBytes(config)
 	id = image.IDFromDigest(dgst)
 	_, err = i.applayerStore.Get(id)
 	if err == nil {
-		return nil, errors.Errorf("applayerid %v already exsit", id)
+		return errors.Errorf("applayerid %v already exsit", id)
 	}
 	chainID := img.RootFS.ChainID()
 	newLayer, err := i.layerStores[os].Get(chainID)
 	if err != nil {
-		return nil, err
+		return err
 	}
 	defer layer.ReleaseAndLog(i.layerStores[os], newLayer)
 	tar, err := newLayer.TarStream()
 	if err != nil {
-		return nil, err
+		return err
 	}
 	defer tar.Close()
 
 	var r io.Reader
 	if progressOutput != nil {
 		diffsize, _ := newLayer.DiffSize()
-		r = progress.NewProgressReader(tar, progressOutput, diffsize, string(appname), "Making applayer")
+		r = progress.NewProgressReader(tar, progressOutput, diffsize, appname, "Making applayer")
 	} else {
 		r = tar
 	}
 
 	id, err = i.applayerStore.Create(r, appname, config)
 	if err != nil {
-		return nil, err
+		return err
 	}
 	ac := appcompose.NewAppComposer(i.imageStore, i.layerStores, i.referenceStore, i.applayerStore, i)
-	err = ac.GenImgByApplayerID(id)
-	resp.ID = id.String()
-	return &resp, nil
+	ac.GenImgByApplayerID(id)
+	return nil
 }
--- lcf-utils-1.0.1/src/loongker-ce-20.10.3.orig/sources/engine/image/apptarexport/appload.go
+++ lcf-utils-1.0.1/src/loongker-ce-20.10.3/sources/engine/image/apptarexport/appload.go
@@ -79,7 +79,6 @@ func (l *apptarexporter) LoadApp(inTar i
 	if err != nil {
 		return err
 	}
-	logrus.Debugf("In func LoadApp call NewAppComposer")
 	ac := appcompose.NewAppComposer(l.is, l.lss, l.rs, l.as, l.loggerImgEvent)
 	err = ac.GenImgByApplayerID(id)
 
