more image binding tests

add two additional bindings tests for image usage.

add ability to use search filter on the endpoint.

Signed-off-by: Brent Baude <bbaude@redhat.com>
This commit is contained in:
Brent Baude
2020-02-22 12:44:35 -06:00
parent 9fd01e1945
commit d92b9b8859
2 changed files with 83 additions and 3 deletions

View File

@ -7,6 +7,7 @@ import (
"os"
"strconv"
"github.com/containers/image/v5/types"
"github.com/containers/libpod/libpod"
"github.com/containers/libpod/libpod/image"
"github.com/containers/libpod/pkg/api/handlers/utils"
@ -147,10 +148,36 @@ func SearchImages(w http.ResponseWriter, r *http.Request) {
utils.Error(w, "Something went wrong.", http.StatusBadRequest, errors.Wrapf(err, "Failed to parse parameters for %s", r.URL.String()))
return
}
// TODO filters are a bit undefined here in terms of what exactly the input looks
// like. We need to understand that a bit more.
filter := image.SearchFilter{}
if len(query.Filters) > 0 {
if len(query.Filters["stars"]) > 0 {
stars, err := strconv.Atoi(query.Filters["stars"][0])
if err != nil {
utils.InternalServerError(w, err)
return
}
filter.Stars = stars
}
if len(query.Filters["is-official"]) > 0 {
isOfficial, err := strconv.ParseBool(query.Filters["is-official"][0])
if err != nil {
utils.InternalServerError(w, err)
return
}
filter.IsOfficial = types.NewOptionalBool(isOfficial)
}
if len(query.Filters["is-automated"]) > 0 {
isAutomated, err := strconv.ParseBool(query.Filters["is-automated"][0])
if err != nil {
utils.InternalServerError(w, err)
return
}
filter.IsAutomated = types.NewOptionalBool(isAutomated)
}
}
options := image.SearchOptions{
Filter: image.SearchFilter{},
Filter: filter,
Limit: query.Limit,
}
results, err := image.SearchImages(query.Term, options)

View File

@ -292,5 +292,58 @@ var _ = Describe("Podman images", func() {
Expect(data.Comment).To(Equal(testMessage))
})
It("History Image", func() {
// a bogus name should return a 404
_, err := images.History(connText, "foobar")
Expect(err).To(Not(BeNil()))
code, _ := bindings.CheckResponseCode(err)
Expect(code).To(BeNumerically("==", http.StatusNotFound))
var foundID bool
data, err := images.GetImage(connText, alpine.name, nil)
Expect(err).To(BeNil())
history, err := images.History(connText, alpine.name)
Expect(err).To(BeNil())
for _, i := range history {
if i.ID == data.ID {
foundID = true
break
}
}
Expect(foundID).To(BeTrue())
})
It("Search for an image", func() {
imgs, err := images.Search(connText, "alpine", nil, nil)
Expect(err).To(BeNil())
Expect(len(imgs)).To(BeNumerically(">", 1))
var foundAlpine bool
for _, i := range imgs {
if i.Name == "docker.io/library/alpine" {
foundAlpine = true
break
}
}
Expect(foundAlpine).To(BeTrue())
// Search for alpine with a limit of 10
ten := 10
imgs, err = images.Search(connText, "docker.io/alpine", &ten, nil)
Expect(err).To(BeNil())
Expect(len(imgs)).To(BeNumerically("<=", 10))
// Search for alpine with stars greater than 100
filters := make(map[string][]string)
filters["stars"] = []string{"100"}
imgs, err = images.Search(connText, "docker.io/alpine", nil, filters)
Expect(err).To(BeNil())
for _, i := range imgs {
Expect(i.Stars).To(BeNumerically(">=", 100))
}
// Search with a fqdn
imgs, err = images.Search(connText, "quay.io/libpod/alpine_nginx", nil, nil)
Expect(len(imgs)).To(BeNumerically(">=", 1))
})
})