Tizen_4.0 base
[platform/upstream/docker-engine.git] / daemon / image_inspect.go
1 package daemon
2
3 import (
4         "runtime"
5         "time"
6
7         "github.com/docker/distribution/reference"
8         "github.com/docker/docker/api/types"
9         "github.com/docker/docker/layer"
10         "github.com/pkg/errors"
11 )
12
13 // LookupImage looks up an image by name and returns it as an ImageInspect
14 // structure.
15 func (daemon *Daemon) LookupImage(name string) (*types.ImageInspect, error) {
16         img, err := daemon.GetImage(name)
17         if err != nil {
18                 return nil, errors.Wrapf(err, "no such image: %s", name)
19         }
20
21         // If the image OS isn't set, assume it's the host OS
22         platform := img.OS
23         if platform == "" {
24                 platform = runtime.GOOS
25         }
26
27         refs := daemon.stores[platform].referenceStore.References(img.ID().Digest())
28         repoTags := []string{}
29         repoDigests := []string{}
30         for _, ref := range refs {
31                 switch ref.(type) {
32                 case reference.NamedTagged:
33                         repoTags = append(repoTags, reference.FamiliarString(ref))
34                 case reference.Canonical:
35                         repoDigests = append(repoDigests, reference.FamiliarString(ref))
36                 }
37         }
38
39         var size int64
40         var layerMetadata map[string]string
41         layerID := img.RootFS.ChainID()
42         if layerID != "" {
43                 l, err := daemon.stores[platform].layerStore.Get(layerID)
44                 if err != nil {
45                         return nil, err
46                 }
47                 defer layer.ReleaseAndLog(daemon.stores[platform].layerStore, l)
48                 size, err = l.Size()
49                 if err != nil {
50                         return nil, err
51                 }
52
53                 layerMetadata, err = l.Metadata()
54                 if err != nil {
55                         return nil, err
56                 }
57         }
58
59         comment := img.Comment
60         if len(comment) == 0 && len(img.History) > 0 {
61                 comment = img.History[len(img.History)-1].Comment
62         }
63
64         lastUpdated, err := daemon.stores[platform].imageStore.GetLastUpdated(img.ID())
65         if err != nil {
66                 return nil, err
67         }
68
69         imageInspect := &types.ImageInspect{
70                 ID:              img.ID().String(),
71                 RepoTags:        repoTags,
72                 RepoDigests:     repoDigests,
73                 Parent:          img.Parent.String(),
74                 Comment:         comment,
75                 Created:         img.Created.Format(time.RFC3339Nano),
76                 Container:       img.Container,
77                 ContainerConfig: &img.ContainerConfig,
78                 DockerVersion:   img.DockerVersion,
79                 Author:          img.Author,
80                 Config:          img.Config,
81                 Architecture:    img.Architecture,
82                 Os:              platform,
83                 OsVersion:       img.OSVersion,
84                 Size:            size,
85                 VirtualSize:     size, // TODO: field unused, deprecate
86                 RootFS:          rootFSToAPIType(img.RootFS),
87                 Metadata: types.ImageMetadata{
88                         LastTagTime: lastUpdated,
89                 },
90         }
91
92         imageInspect.GraphDriver.Name = daemon.GraphDriverName(platform)
93         imageInspect.GraphDriver.Data = layerMetadata
94
95         return imageInspect, nil
96 }