summaryrefslogtreecommitdiff
path: root/pkg/domain
diff options
context:
space:
mode:
authorJhon Honce <jhonce@redhat.com>2020-03-23 09:04:31 -0700
committerJhon Honce <jhonce@redhat.com>2020-03-24 16:06:01 -0700
commit1d7cb7cc48d06631e2bdfd0e25eeccc8e87b042f (patch)
treea9ce6c3b2e91a797cf8174d7a4e9d62eccb4d1e8 /pkg/domain
parent0c084d9719772a9b68d5eb67114cf5bf001958b2 (diff)
downloadpodman-1d7cb7cc48d06631e2bdfd0e25eeccc8e87b042f.tar.gz
podman-1d7cb7cc48d06631e2bdfd0e25eeccc8e87b042f.tar.bz2
podman-1d7cb7cc48d06631e2bdfd0e25eeccc8e87b042f.zip
V2 podman images/image list
* Updated entities to support flags/options * Updated bindings caused by entities changes * Removed handlers.ImageSummary in favor of entities.ImageSummary * Introduced StringSet() container object to simply error checking Signed-off-by: Jhon Honce <jhonce@redhat.com>
Diffstat (limited to 'pkg/domain')
-rw-r--r--pkg/domain/entities/engine_image.go2
-rw-r--r--pkg/domain/entities/images.go61
-rw-r--r--pkg/domain/entities/set.go45
-rw-r--r--pkg/domain/infra/abi/images.go29
-rw-r--r--pkg/domain/infra/abi/images_list.go80
-rw-r--r--pkg/domain/infra/tunnel/images.go11
6 files changed, 153 insertions, 75 deletions
diff --git a/pkg/domain/entities/engine_image.go b/pkg/domain/entities/engine_image.go
index 27676d781..d44fdaf53 100644
--- a/pkg/domain/entities/engine_image.go
+++ b/pkg/domain/entities/engine_image.go
@@ -7,6 +7,6 @@ import (
type ImageEngine interface {
Delete(ctx context.Context, nameOrId string, opts ImageDeleteOptions) (*ImageDeleteReport, error)
History(ctx context.Context, nameOrId string, opts ImageHistoryOptions) (*ImageHistoryReport, error)
- List(ctx context.Context, opts ImageListOptions) (*ImageListReport, error)
+ List(ctx context.Context, opts ImageListOptions) ([]*ImageSummary, error)
Prune(ctx context.Context, opts ImagePruneOptions) (*ImagePruneReport, error)
}
diff --git a/pkg/domain/entities/images.go b/pkg/domain/entities/images.go
index f18ee2651..f04317e37 100644
--- a/pkg/domain/entities/images.go
+++ b/pkg/domain/entities/images.go
@@ -48,22 +48,24 @@ func (i *Image) Id() string {
}
type ImageSummary struct {
- Identifier
- ID string `json:"Id"`
- ParentId string `json:",omitempty"`
- RepoTags []string `json:",omitempty"`
- Created int `json:",omitempty"`
- Size int `json:",omitempty"`
- SharedSize int `json:",omitempty"`
- VirtualSize int `json:",omitempty"`
- Labels string `json:",omitempty"`
- Containers int `json:",omitempty"`
- ReadOnly bool `json:",omitempty"`
- Dangling bool `json:",omitempty"`
+ ID string `json:"Id"`
+ ParentId string `json:",omitempty"`
+ RepoTags []string `json:",omitempty"`
+ Created int64 `json:",omitempty"`
+ Size int64 `json:",omitempty"`
+ SharedSize int `json:",omitempty"`
+ VirtualSize int64 `json:",omitempty"`
+ Labels map[string]string `json:",omitempty"`
+ Containers int `json:",omitempty"`
+ ReadOnly bool `json:",omitempty"`
+ Dangling bool `json:",omitempty"`
// Podman extensions
- Digest digest.Digest `json:",omitempty"`
- ConfigDigest digest.Digest `json:",omitempty"`
+ Names []string `json:",omitempty"`
+ Digest string `json:",omitempty"`
+ Digests []string `json:",omitempty"`
+ ConfigDigest string `json:",omitempty"`
+ History []string `json:",omitempty"`
}
func (i *ImageSummary) Id() string {
@@ -78,18 +80,6 @@ func (i *ImageSummary) IsDangling() bool {
return i.Dangling
}
-type ImageOptions struct {
- All bool
- Digests bool
- Filter []string
- Format string
- Noheading bool
- NoTrunc bool
- Quiet bool
- Sort string
- History bool
-}
-
type ImageDeleteOptions struct {
Force bool
}
@@ -124,21 +114,14 @@ type ImageInspectOptions struct {
}
type ImageListOptions struct {
- All bool `json:"all" schema:"all"`
- Digests bool `json:"digests" schema:"digests"`
- Filter []string `json:",omitempty"`
- Filters url.Values `json:"filters" schema:"filters"`
- Format string `json:",omitempty"`
- History bool `json:",omitempty"`
- Noheading bool `json:",omitempty"`
- NoTrunc bool `json:",omitempty"`
- Quiet bool `json:",omitempty"`
- Sort string `json:",omitempty"`
+ All bool `json:"all" schema:"all"`
+ Filter []string `json:",omitempty"`
+ Filters url.Values `json:"filters" schema:"filters"`
}
-type ImageListReport struct {
- Images []ImageSummary
-}
+// type ImageListReport struct {
+// Images []ImageSummary
+// }
type ImagePruneOptions struct {
All bool
diff --git a/pkg/domain/entities/set.go b/pkg/domain/entities/set.go
new file mode 100644
index 000000000..c8d6cb1a9
--- /dev/null
+++ b/pkg/domain/entities/set.go
@@ -0,0 +1,45 @@
+package entities
+
+import (
+ "strings"
+)
+
+type stringSet struct {
+ m map[string]struct{}
+}
+
+func NewStringSet(elem ...string) *stringSet {
+ s := &stringSet{}
+ s.m = make(map[string]struct{}, len(elem))
+ for _, e := range elem {
+ s.Add(e)
+ }
+ return s
+}
+
+func (s *stringSet) Add(elem string) {
+ s.m[elem] = struct{}{}
+}
+
+func (s *stringSet) Remove(elem string) {
+ delete(s.m, elem)
+}
+
+func (s *stringSet) Contains(elem string) bool {
+ _, ok := s.m[elem]
+ return ok
+}
+
+func (s *stringSet) Elements() []string {
+ keys := make([]string, len(s.m))
+ i := 0
+ for k := range s.m {
+ keys[i] = k
+ i++
+ }
+ return keys
+}
+
+func (s *stringSet) String() string {
+ return strings.Join(s.Elements(), ", ")
+}
diff --git a/pkg/domain/infra/abi/images.go b/pkg/domain/infra/abi/images.go
index 2db08f259..6e9d7f566 100644
--- a/pkg/domain/infra/abi/images.go
+++ b/pkg/domain/infra/abi/images.go
@@ -39,35 +39,6 @@ func (ir *ImageEngine) Prune(ctx context.Context, opts entities.ImagePruneOption
return &report, nil
}
-func (ir *ImageEngine) List(ctx context.Context, opts entities.ImageListOptions) (*entities.ImageListReport, error) {
- var (
- images []*libpodImage.Image
- err error
- )
-
- filters := utils.ToLibpodFilters(opts.Filters)
- if len(filters) > 0 {
- images, err = ir.Libpod.ImageRuntime().GetImagesWithFilters(filters)
- } else {
- images, err = ir.Libpod.ImageRuntime().GetImages()
- }
- if err != nil {
- return nil, err
- }
-
- report := entities.ImageListReport{
- Images: make([]entities.ImageSummary, len(images)),
- }
- for i, img := range images {
- hold := entities.ImageSummary{}
- if err := utils.DeepCopy(&hold, img); err != nil {
- return nil, err
- }
- report.Images[i] = hold
- }
- return &report, nil
-}
-
func (ir *ImageEngine) History(ctx context.Context, nameOrId string, opts entities.ImageHistoryOptions) (*entities.ImageHistoryReport, error) {
image, err := ir.Libpod.ImageRuntime().NewFromLocal(nameOrId)
if err != nil {
diff --git a/pkg/domain/infra/abi/images_list.go b/pkg/domain/infra/abi/images_list.go
new file mode 100644
index 000000000..2f4020374
--- /dev/null
+++ b/pkg/domain/infra/abi/images_list.go
@@ -0,0 +1,80 @@
+// +build ABISupport
+
+package abi
+
+import (
+ "context"
+
+ libpodImage "github.com/containers/libpod/libpod/image"
+ "github.com/containers/libpod/pkg/domain/entities"
+)
+
+func (ir *ImageEngine) List(ctx context.Context, opts entities.ImageListOptions) ([]*entities.ImageSummary, error) {
+ var (
+ images []*libpodImage.Image
+ err error
+ )
+
+ // TODO: Future work support for domain.Filters
+ // filters := utils.ToLibpodFilters(opts.Filters)
+
+ if len(opts.Filter) > 0 {
+ images, err = ir.Libpod.ImageRuntime().GetImagesWithFilters(opts.Filter)
+ } else {
+ images, err = ir.Libpod.ImageRuntime().GetImages()
+ }
+ if err != nil {
+ return nil, err
+ }
+
+ summaries := make([]*entities.ImageSummary, len(images))
+ for i, img := range images {
+ var repoTags []string
+ if opts.All {
+ pairs, err := libpodImage.ReposToMap(img.Names())
+ if err != nil {
+ return nil, err
+ }
+
+ for repo, tags := range pairs {
+ for _, tag := range tags {
+ repoTags = append(repoTags, repo+":"+tag)
+ }
+ }
+ } else {
+ repoTags, _ = img.RepoTags()
+ }
+
+ digests := make([]string, len(img.Digests()))
+ for j, d := range img.Digests() {
+ digests[j] = string(d)
+ }
+
+ e := entities.ImageSummary{
+ ID: img.ID(),
+
+ ConfigDigest: string(img.ConfigDigest),
+ Created: img.Created().Unix(),
+ Dangling: img.Dangling(),
+ Digest: string(img.Digest()),
+ Digests: digests,
+ History: img.NamesHistory(),
+ Names: img.Names(),
+ ParentId: img.Parent,
+ ReadOnly: img.IsReadOnly(),
+ SharedSize: 0,
+ VirtualSize: img.VirtualSize,
+ RepoTags: repoTags,
+ }
+ e.Labels, _ = img.Labels(context.TODO())
+
+ ctnrs, _ := img.Containers()
+ e.Containers = len(ctnrs)
+
+ sz, _ := img.Size(context.TODO())
+ e.Size = int64(*sz)
+
+ summaries[i] = &e
+ }
+ return summaries, nil
+}
diff --git a/pkg/domain/infra/tunnel/images.go b/pkg/domain/infra/tunnel/images.go
index 718685e57..60df40498 100644
--- a/pkg/domain/infra/tunnel/images.go
+++ b/pkg/domain/infra/tunnel/images.go
@@ -32,23 +32,22 @@ func (ir *ImageEngine) Delete(ctx context.Context, nameOrId string, opts entitie
return &report, err
}
-func (ir *ImageEngine) List(ctx context.Context, opts entities.ImageListOptions) (*entities.ImageListReport, error) {
+func (ir *ImageEngine) List(ctx context.Context, opts entities.ImageListOptions) ([]*entities.ImageSummary, error) {
images, err := images.List(ir.ClientCxt, &opts.All, opts.Filters)
+
if err != nil {
return nil, err
}
- report := entities.ImageListReport{
- Images: make([]entities.ImageSummary, len(images)),
- }
+ is := make([]*entities.ImageSummary, len(images))
for i, img := range images {
hold := entities.ImageSummary{}
if err := utils.DeepCopy(&hold, img); err != nil {
return nil, err
}
- report.Images[i] = hold
+ is[i] = &hold
}
- return &report, nil
+ return is, nil
}
func (ir *ImageEngine) History(ctx context.Context, nameOrId string, opts entities.ImageHistoryOptions) (*entities.ImageHistoryReport, error) {