Search registries with an empty query

Adds functionality to search registries implementing the v2
endpoint with an empty query, that is the results will be
all the available images on the registries.
If this is tried with a v1 registry an error will occur.
To search a whole registry, there needs to be a trailing slash
at the end, i.e `podman search registry.fedoraproject.org/`.

Signed-off-by: Urvashi Mohnani <umohnani@redhat.com>

Closes: #1444
Approved by: rhatdan
This commit is contained in:
Urvashi Mohnani 2018-09-11 16:37:43 -04:00 committed by Atomic Bot
parent 9bc3c9d11c
commit 70b160ae03
3 changed files with 38 additions and 3 deletions

View file

@ -345,6 +345,11 @@ func matchesOfficialFilter(filter searchFilterParams, result docker.SearchResult
}
func getRegistry(image string) (string, error) {
// It is possible to only have the registry name in the format "myregistry/"
// if so, just trim the "/" from the end and return the registry name
if strings.HasSuffix(image, "/") {
return strings.TrimSuffix(image, "/"), nil
}
imgRef, err := reference.Parse(image)
if err != nil {
return "", err

View file

@ -10,10 +10,12 @@ podman\-search - Search a registry for an image
**podman search** searches a registry or a list of registries for a matching image.
The user can specify which registry to search by prefixing the registry in the search term
(example **registry.fedoraproject.org/fedora**), default is the registries in the
**registires.search** table in the config file - **/etc/containers/registries.conf**.
**registries.search** table in the config file - **/etc/containers/registries.conf**.
The number of results can be limited using the **--limit** flag. If more than one registry
is being searched, the limit will be applied to each registry. The output can be filtered
using the **--filter** flag.
using the **--filter** flag. To get all available images in a registry without a specific
search term, the user can just enter the registry name with a trailing "/" (example **registry.fedoraproject.org/**).
Note, searching without a search term will only work for registries that implement the v2 API.
**podman [GLOBAL OPTIONS]**
@ -116,6 +118,27 @@ INDEX NAME
fedoraproject.org fedoraproject.org/fedora
fedoraproject.org fedoraproject.org/fedora-minimal
```
```
$ podman search registry.fedoraproject.org/
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
fedoraproject.org registry.fedoraproject.org/f25/cockpit 0
fedoraproject.org registry.fedoraproject.org/f25/container-engine 0
fedoraproject.org registry.fedoraproject.org/f25/docker 0
fedoraproject.org registry.fedoraproject.org/f25/etcd 0
fedoraproject.org registry.fedoraproject.org/f25/flannel 0
fedoraproject.org registry.fedoraproject.org/f25/httpd 0
fedoraproject.org registry.fedoraproject.org/f25/kubernetes-apiserver 0
fedoraproject.org registry.fedoraproject.org/f25/kubernetes-controller-manager 0
fedoraproject.org registry.fedoraproject.org/f25/kubernetes-kubelet 0
fedoraproject.org registry.fedoraproject.org/f25/kubernetes-master 0
fedoraproject.org registry.fedoraproject.org/f25/kubernetes-node 0
fedoraproject.org registry.fedoraproject.org/f25/kubernetes-proxy 0
fedoraproject.org registry.fedoraproject.org/f25/kubernetes-scheduler 0
fedoraproject.org registry.fedoraproject.org/f25/mariadb 0
```
Note: This works only with registries that implement the v2 API. If tried with a v1 registry an error will be returned.
## FILES
**registries.conf** (`/etc/containers/registries.conf`)

View file

@ -84,7 +84,7 @@ var _ = Describe("Podman search", func() {
})
It("podman search limit flag", func() {
search := podmanTest.Podman([]string{"search", "--limit", "3", "alpine"})
search := podmanTest.Podman([]string{"search", "--limit", "3", "docker.io/alpine"})
search.WaitWithDefaultTimeout()
Expect(search.ExitCode()).To(Equal(0))
Expect(len(search.OutputToStringArray())).To(Equal(4))
@ -120,6 +120,13 @@ var _ = Describe("Podman search", func() {
}
})
It("podman search v2 registry with empty query", func() {
search := podmanTest.Podman([]string{"search", "registry.fedoraproject.org/"})
search.WaitWithDefaultTimeout()
Expect(search.ExitCode()).To(Equal(0))
Expect(len(search.OutputToStringArray())).To(BeNumerically(">=", 1))
})
It("podman search attempts HTTP if tls-verify flag is set false", func() {
podmanTest.RestoreArtifact(registry)
fakereg := podmanTest.Podman([]string{"run", "-d", "--name", "registry", "-p", "5000:5000", registry, "/entrypoint.sh", "/etc/docker/registry/config.yml"})