Description: add command applayer inspect 
 loongker-ce (5:20.10.3-24) buster; urgency=low
   * Version: 20.10.3-24
   * add command applayer inspect 
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-10-10

--- lcf/src/loongker-ce-20.10.3.orig/VERSION
+++ lcf/src/loongker-ce-20.10.3/VERSION
@@ -1 +1 @@
-20.10.3-23
+20.10.3-24
--- /dev/null
+++ lcf/src/loongker-ce-20.10.3/sources/cli/cli/command/applayer/applayer_inspect.go
@@ -0,0 +1,44 @@
+package applayer
+
+import (
+	"context"
+
+	"github.com/docker/cli/cli"
+	"github.com/docker/cli/cli/command"
+	"github.com/docker/cli/cli/command/inspect"
+	"github.com/spf13/cobra"
+)
+
+type inspectOptions struct {
+	format string
+	refs   []string
+}
+
+// newInspectCommand creates a new cobra.Command for `docker image inspect`
+func newInspectCommand(dockerCli command.Cli) *cobra.Command {
+	var opts inspectOptions
+
+	cmd := &cobra.Command{
+		Use:   "inspect [OPTIONS] APPLAYER [APPLAYER...]",
+		Short: "Display detailed information on one or more applayers",
+		Args:  cli.RequiresMinArgs(1),
+		RunE: func(cmd *cobra.Command, args []string) error {
+			opts.refs = args
+			return runInspect(dockerCli, opts)
+		},
+	}
+
+	flags := cmd.Flags()
+	flags.StringVarP(&opts.format, "format", "f", "", "Format the output using the given Go template")
+	return cmd
+}
+
+func runInspect(dockerCli command.Cli, opts inspectOptions) error {
+	client := dockerCli.Client()
+	ctx := context.Background()
+
+	getRefFunc := func(ref string) (interface{}, []byte, error) {
+		return client.ApplayerInspectWithRaw(ctx, ref)
+	}
+	return inspect.Inspect(dockerCli.Out(), opts.refs, opts.format, getRefFunc)
+}
--- lcf/src/loongker-ce-20.10.3.orig/sources/cli/cli/command/system/inspect.go
+++ lcf/src/loongker-ce-20.10.3/sources/cli/cli/command/system/inspect.go
@@ -46,7 +46,7 @@ func NewInspectCommand(dockerCli command
 func runInspect(dockerCli command.Cli, opts inspectOptions) error {
 	var elementSearcher inspect.GetRefFunc
 	switch opts.inspectType {
-	case "", "container", "image", "node", "network", "service", "volume", "task", "plugin", "secret":
+	case "", "container", "image", "node", "network", "service", "volume", "task", "plugin", "secret", "applayer":
 		elementSearcher = inspectAll(context.Background(), dockerCli, opts.size, opts.inspectType)
 	default:
 		return errors.Errorf("%q is not a valid value for --type", opts.inspectType)
@@ -109,6 +109,12 @@ func inspectSecret(ctx context.Context,
 	}
 }
 
+func inspectApplayer(ctx context.Context, dockerCli command.Cli) inspect.GetRefFunc {
+	return func(ref string) (interface{}, []byte, error) {
+		return dockerCli.Client().ApplayerInspectWithRaw(ctx, ref)
+	}
+}
+
 func inspectAll(ctx context.Context, dockerCli command.Cli, getSize bool, typeConstraint string) inspect.GetRefFunc {
 	var inspectAutodetect = []struct {
 		objectType      string
@@ -153,6 +159,10 @@ func inspectAll(ctx context.Context, doc
 			objectInspector: inspectPlugin(ctx, dockerCli),
 		},
 		{
+			objectType:      "applayer",
+			objectInspector: inspectApplayer(ctx, dockerCli),
+		},
+		{
 			objectType:      "secret",
 			isSwarmObject:   true,
 			objectInspector: inspectSecret(ctx, dockerCli),
--- lcf/src/loongker-ce-20.10.3.orig/sources/cli/vendor/github.com/docker/docker/api/types/types.go
+++ lcf/src/loongker-ce-20.10.3/sources/cli/vendor/github.com/docker/docker/api/types/types.go
@@ -49,6 +49,26 @@ type ImageInspect struct {
 	Metadata        ImageMetadata
 }
 
+// ApplayerInspect contains response of Engine API:
+// GET "/applayers/{name:.*}/json"
+type ApplayerInspect struct {
+	name            string
+	ID              string `json:"Id"`
+	Container       string
+	ContainerConfig *container.Config
+	DockerVersion   string
+	Author          string
+	Config          *container.Config
+	Architecture    string
+	Variant         string `json:",omitempty"`
+	Os              string
+	OsVersion       string `json:",omitempty"`
+	Size            int64
+	Diffid          string
+        Deps            []string
+	RefImages       []string
+}
+
 // ImageMetadata contains engine-local data about the image
 type ImageMetadata struct {
 	LastTagTime time.Time `json:",omitempty"`
--- /dev/null
+++ lcf/src/loongker-ce-20.10.3/sources/cli/vendor/github.com/docker/docker/client/applayer_inspect.go
@@ -0,0 +1,32 @@
+package client // import "github.com/docker/docker/client"
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"io/ioutil"
+
+	"github.com/docker/docker/api/types"
+)
+
+// ApplayerInspectWithRaw returns the applayer information and its raw representation.
+func (cli *Client) ApplayerInspectWithRaw(ctx context.Context, applayerID string) (types.ApplayerInspect, []byte, error) {
+	if applayerID == "" {
+		return types.ApplayerInspect{}, nil, objectNotFoundError{object: "applayer", id: applayerID}
+	}
+	serverResp, err := cli.get(ctx, "/applayers/"+applayerID+"/json", nil, nil)
+	defer ensureReaderClosed(serverResp)
+	if err != nil {
+		return types.ApplayerInspect{}, nil, wrapResponseError(err, serverResp, "applayer", applayerID)
+	}
+
+	body, err := ioutil.ReadAll(serverResp.body)
+	if err != nil {
+		return types.ApplayerInspect{}, nil, err
+	}
+
+	var response types.ApplayerInspect
+	rdr := bytes.NewReader(body)
+	err = json.NewDecoder(rdr).Decode(&response)
+	return response, body, err
+}
--- lcf/src/loongker-ce-20.10.3.orig/sources/cli/vendor/github.com/docker/docker/client/interface.go
+++ lcf/src/loongker-ce-20.10.3/sources/cli/vendor/github.com/docker/docker/client/interface.go
@@ -25,6 +25,7 @@ type CommonAPIClient interface {
 	ContainerAPIClient
 	DistributionAPIClient
 	ImageAPIClient
+	ApplayerAPIClient
 	NodeAPIClient
 	NetworkAPIClient
 	PluginAPIClient
@@ -105,6 +106,10 @@ type ImageAPIClient interface {
 	UpgradeImageSave(ctx context.Context, baseimage string, upgradeimage string, target string, compress string) (io.ReadCloser, error)
 	ImageTag(ctx context.Context, image, ref string) error
 	ImagesPrune(ctx context.Context, pruneFilter filters.Args) (types.ImagesPruneReport, error)
+}
+
+// ApplayerAPIClient defines API client methods for the applayer 
+type ApplayerAPIClient interface {
 	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)
@@ -112,6 +117,7 @@ type ImageAPIClient interface {
 	AppSave(ctx context.Context, idorName string, compress string) (io.ReadCloser, error)
 	AppLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error)
 	ApplayerRename(ctx context.Context, oldName, newName string) error
+	ApplayerInspectWithRaw(ctx context.Context, applayerID string) (types.ApplayerInspect, []byte, error)
 }
 
 // NetworkAPIClient defines API client methods for the networks
--- lcf/src/loongker-ce-20.10.3.orig/sources/engine/api/server/router/image/backend.go
+++ lcf/src/loongker-ce-20.10.3/sources/engine/api/server/router/image/backend.go
@@ -25,6 +25,7 @@ type imageBackend interface {
 	Images(imageFilters filters.Args, all bool, withExtraAttrs bool) ([]*types.ImageSummary, error)
 	Applayers(imageFilters filters.Args) ([]*types.AppLayer, error)
 	LookupImage(name string) (*types.ImageInspect, error)
+	LookupApplayer(name string) (*types.ApplayerInspect, 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, quiet bool) error
--- lcf/src/loongker-ce-20.10.3.orig/sources/engine/api/server/router/image/image.go
+++ lcf/src/loongker-ce-20.10.3/sources/engine/api/server/router/image/image.go
@@ -33,6 +33,7 @@ func (r *imageRouter) initRoutes() {
 		router.NewGetRoute("/images/{name:.*}/get", r.getImagesGet),
 		router.NewGetRoute("/images/{name:.*}/history", r.getImagesHistory),
 		router.NewGetRoute("/images/{name:.*}/json", r.getImagesByName),
+		router.NewGetRoute("/applayers/{name:.*}/json", r.getApplayersByName),
 		router.NewGetRoute("/images/getupgrade", r.getUpgradeImageGet),
 		router.NewGetRoute("/applayers/getapp", r.getAppGet),
 		// POST
--- lcf/src/loongker-ce-20.10.3.orig/sources/engine/api/server/router/image/image_routes.go
+++ lcf/src/loongker-ce-20.10.3/sources/engine/api/server/router/image/image_routes.go
@@ -368,6 +368,15 @@ func (s *imageRouter) genApplayer(ctx co
 	return nil
 }
 
+func (s *imageRouter) getApplayersByName(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+	applayerInspect, err := s.backend.LookupApplayer(vars["name"])
+	if err != nil {
+		return err
+	}
+
+	return httputils.WriteJSON(w, http.StatusOK, applayerInspect)
+}
+
 func (s *imageRouter) getImagesByName(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	imageInspect, err := s.backend.LookupImage(vars["name"])
 	if err != nil {
--- lcf/src/loongker-ce-20.10.3.orig/sources/engine/api/types/types.go
+++ lcf/src/loongker-ce-20.10.3/sources/engine/api/types/types.go
@@ -54,6 +54,27 @@ type ImageMetadata struct {
 	LastTagTime time.Time `json:",omitempty"`
 }
 
+// ApplayerInspect contains response of Engine API:
+// GET "/applayers/{name:.*}/json"
+type ApplayerInspect struct {
+	name            string
+	ID              string `json:"Id"`
+	Container       string
+	ContainerConfig *container.Config
+	DockerVersion   string
+	Author          string
+	Config          *container.Config
+	Architecture    string
+	Variant         string `json:",omitempty"`
+	Os              string
+	OsVersion       string `json:",omitempty"`
+	Size            int64
+	Diffid          string
+        Deps            []string
+	RefImages       []string
+}
+
+
 // Container contains response of Engine API:
 // GET "/containers/json"
 type Container struct {
--- /dev/null
+++ lcf/src/loongker-ce-20.10.3/sources/engine/daemon/images/applayer_inspect.go
@@ -0,0 +1,63 @@
+package images // import "github.com/docker/docker/daemon/images"
+
+import (
+	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/pkg/system"
+	"github.com/pkg/errors"
+)
+
+// LookupApplayer looks up an applayer by name and returns it as an ApplayerInspect
+// structure.
+func (i *ImageService) LookupApplayer(name string) (*types.ApplayerInspect, error) {
+	id, err := i.applayerStore.Search(name)
+        if err != nil {
+                id, err = i.applayerStore.GetByName(name)
+                if err != nil {
+                        return nil, err
+                }
+        }
+
+	img, err := i.applayerStore.GetConfig(id)
+	if err != nil {
+		return nil, errors.Wrapf(err, "no such image: %s", name)
+	}
+
+	if !system.IsOSSupported(img.OperatingSystem()) {
+		return nil, system.ErrNotSupportedOperatingSystem
+	}
+
+	applayer, err := i.applayerStore.Get(id)
+	if err != nil {
+		return nil, errors.Wrapf(err, "no such image: %s", name)
+	}
+
+	var deps []string
+	for _, v := range applayer.Deps() {
+		deps = append(deps, string(v))
+	}
+
+	var refImages []string
+	for _, v := range applayer.GetAllRefImages() {
+		refImages = append(refImages, string(v))
+	}
+
+	applayerInspect := &types.ApplayerInspect{
+		ID:              img.ID().String(),
+		Container:       img.Container,
+		ContainerConfig: &img.ContainerConfig,
+		DockerVersion:   img.DockerVersion,
+		Author:          img.Author,
+		Config:          img.Config,
+		Architecture:    img.Architecture,
+		Variant:         img.Variant,
+		Os:              img.OperatingSystem(),
+		OsVersion:       img.OSVersion,
+		Size:            applayer.Size(),
+		Diffid:          string(applayer.DiffID()),
+		Deps:            deps,
+		RefImages:       refImages,
+	}
+
+	return applayerInspect, nil
+}
+
--- lcf/src/loongker-ce-20.10.3.orig/sources/engine/image/applayer.go
+++ lcf/src/loongker-ce-20.10.3/sources/engine/image/applayer.go
@@ -21,6 +21,7 @@ type AppLayer interface {
 	AddRefImage(id ID) error
 	DelRefImage(id ID) error
 	GetRefImage(id ID) bool
+	GetAllRefImages() []ID
 }
 /*
 The content of the appLayer contains two parts.
@@ -118,3 +119,11 @@ func (al *appLayer) GetRefImage(id ID) b
 	}
 	return true
 }
+
+func (al *appLayer) GetAllRefImages() []ID {
+	var images []ID
+	for k, _ := range al.refImages {
+		images = append(images, k)
+	}
+	return images
+}
