summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClark Laughlin <clark.laughlin@linaro.org>2015-11-02 15:58:05 -0500
committerClark Laughlin <clark.laughlin@linaro.org>2015-11-02 15:58:05 -0500
commit6b45d5bd2ecfb653941886d50de9e9bff9e569bd (patch)
tree38c5e5c4858f97f2950ca95ac88d6af8eb0eb064
parent6e1e05f04a558e0e73f1f5ed20bba77da4e144ab (diff)
Enable support for a quay.io registry
-rw-r--r--registry-browser/Dockerfile2
-rw-r--r--registry-browser/server.go151
2 files changed, 117 insertions, 36 deletions
diff --git a/registry-browser/Dockerfile b/registry-browser/Dockerfile
index 2116367..0e4453c 100644
--- a/registry-browser/Dockerfile
+++ b/registry-browser/Dockerfile
@@ -26,7 +26,7 @@ WORKDIR /goproj/src/linaro.org/docker-registry-browser
RUN go install .
# Run the golang server app when the container starts.
-ENTRYPOINT /goproj/bin/docker-registry-browser -registry=https://registry:5000
+ENTRYPOINT /goproj/bin/docker-registry-browser -type=quay.io -namespace=linaro -registry=https://quay.io
# Document that the service listens on port 80
EXPOSE 80
diff --git a/registry-browser/server.go b/registry-browser/server.go
index 1c8857f..d4e5490 100644
--- a/registry-browser/server.go
+++ b/registry-browser/server.go
@@ -13,14 +13,19 @@ import (
var (
+ registryType = flag.String("type", "quay.io", "Registry type (distribution|quay.io)")
ignoreCertErrors = flag.Bool("ignoreCertErrors", true, "Ignore certificate errors")
listenAddr = flag.String("listen", ":80", "HTTP service address")
+ namespace = flag.String("namespace", "", "Registry namespace (if needed)")
registryServer = flag.String("registry", "https://registry", "Docker registry endpoint")
)
type repositoryEntry struct {
+ Namespace string `json:"namespsace"`
Name string `json:"name"`
+ Description string `json:"description"`
+ Link string `json:"link"`
Tags []string `json:"tags"`
}
@@ -47,7 +52,7 @@ func MakeHttpRequest(url string) ([]byte, error) {
}
-func Handle_RegistryAll(w http.ResponseWriter, r *http.Request) {
+func Handle_Quay_AllRepos(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
responseData := struct{
@@ -58,14 +63,14 @@ func Handle_RegistryAll(w http.ResponseWriter, r *http.Request) {
// get all of the repositories
//
- url1 := fmt.Sprintf("%s/v2/_catalog", *registryServer)
+ url1 := fmt.Sprintf("%s/api/v1/repository?public=true&namespace=%s", *registryServer, *namespace)
content, err := MakeHttpRequest(url1)
if err != nil {
log.Fatal(err)
}
repositories := struct{
- Repositories []string `json:"repositories"`
+ Repositories []map[string]interface{} `json:"repositories"`
}{}
err = json.Unmarshal([]byte(content), &repositories)
@@ -79,14 +84,20 @@ func Handle_RegistryAll(w http.ResponseWriter, r *http.Request) {
//
for _, each := range repositories.Repositories {
- url2 := fmt.Sprintf("%s/v2/%s/tags/list", *registryServer, each)
+ ns := each["namespace"].(string)
+ name := each["name"].(string)
+ desc := each["description"].(string)
+ link := fmt.Sprintf("%s/repository/%s/%s", *registryServer, namespace, name)
+
+ url2 := fmt.Sprintf("%s/api/v1/repository/%s/%s/tag/", *registryServer, ns, name)
content, err := MakeHttpRequest(url2)
if err != nil {
log.Fatal(err)
}
tags := struct{
- Name string `json:"name"`
+ HasAdditional bool `json:"has_additional"`
+ Page int `json:"page"`
Tags []string `json:"tags"`
}{}
@@ -100,52 +111,116 @@ func Handle_RegistryAll(w http.ResponseWriter, r *http.Request) {
//
responseData.Repositories = append(responseData.Repositories,
- repositoryEntry{ tags.Name, tags.Tags })
+ repositoryEntry{ ns, name, desc, link, tags.Tags })
}
enc := json.NewEncoder(w)
enc.Encode(responseData)
}
-func Handle_RegistryRepositories(w http.ResponseWriter, r *http.Request) {
- w.Header().Set("Content-Type", "application/json")
- url := fmt.Sprintf("%s/v2/_catalog", *registryServer)
- content, err := MakeHttpRequest(url)
- if err != nil {
- log.Fatal(err)
- }
- w.Write(content)
-}
-func Handle_RepositoryTags(w http.ResponseWriter, r *http.Request) {
+func Handle_Distribution_AllRepos(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
- repository_param := mux.Vars(r)["repository"]
- url := fmt.Sprintf("%s/v2/%s/tags/list", *registryServer, repository_param)
- content, err := MakeHttpRequest(url)
- if err != nil {
- log.Fatal(err)
- }
- w.Write(content)
-}
-func Handle_RepositoryManifest(w http.ResponseWriter, r *http.Request) {
- w.Header().Set("Content-Type", "application/json")
- repository_param := mux.Vars(r)["repository"]
- tag_param := mux.Vars(r)["tag"]
- url := fmt.Sprintf("%s/v2/%s/manifests/%s", *registryServer, repository_param, tag_param)
- content, err := MakeHttpRequest(url)
+ responseData := struct{
+ Repositories []repositoryEntry `json:"repositories"`
+ }{}
+
+ //
+ // get all of the repositories
+ //
+
+ url1 := fmt.Sprintf("%s/v2/_catalog", *registryServer)
+ content, err := MakeHttpRequest(url1)
if err != nil {
log.Fatal(err)
}
- w.Write(content)
+
+ repositories := struct{
+ Repositories []string `json:"repositories"`
+ }{}
+
+ err = json.Unmarshal([]byte(content), &repositories)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ //
+ // now, for each repository, get the available tags and add
+ // everything to the response data map
+ //
+
+ for _, each := range repositories.Repositories {
+ url2 := fmt.Sprintf("%s/v2/%s/tags/list", *registryServer, each)
+ content, err := MakeHttpRequest(url2)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ tags := struct{
+ Name string `json:"name"`
+ Tags []string `json:"tags"`
+ }{}
+
+ err = json.Unmarshal([]byte(content), &tags)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ //
+ // add to the response
+ //
+
+ responseData.Repositories = append(responseData.Repositories,
+ repositoryEntry{ "", tags.Name, "", "", tags.Tags })
+ }
+
+ enc := json.NewEncoder(w)
+ enc.Encode(responseData)
}
+
+//func Handle_Distribution_RegistryRepositories(w http.ResponseWriter, r *http.Request) {
+// w.Header().Set("Content-Type", "application/json")
+// url := fmt.Sprintf("%s/v2/_catalog", *registryServer)
+// content, err := MakeHttpRequest(url)
+// if err != nil {
+// log.Fatal(err)
+// }
+// w.Write(content)
+//}
+//
+//func Handle_Distribution_RepositoryTags(w http.ResponseWriter, r *http.Request) {
+// w.Header().Set("Content-Type", "application/json")
+// repository_param := mux.Vars(r)["repository"]
+// url := fmt.Sprintf("%s/v2/%s/tags/list", *registryServer, repository_param)
+// content, err := MakeHttpRequest(url)
+// if err != nil {
+// log.Fatal(err)
+// }
+// w.Write(content)
+//}
+//
+//func Handle_Distribution_RepositoryManifest(w http.ResponseWriter, r *http.Request) {
+// w.Header().Set("Content-Type", "application/json")
+// repository_param := mux.Vars(r)["repository"]
+// tag_param := mux.Vars(r)["tag"]
+// url := fmt.Sprintf("%s/v2/%s/manifests/%s", *registryServer, repository_param, tag_param)
+// content, err := MakeHttpRequest(url)
+// if err != nil {
+// log.Fatal(err)
+// }
+// w.Write(content)
+//}
+
+
func main() {
flag.Parse()
log.Println("Listening on:", *listenAddr)
log.Println("Registry server:", *registryServer)
log.Println("Ignore certificate errors:", *ignoreCertErrors)
+ log.Println("Registry type:", *registryType)
//
// handle routes for access to data
@@ -155,14 +230,20 @@ func main() {
s := r.Methods("GET").PathPrefix("/registry").Subrouter()
// combined list of repositories and available tags
- s.HandleFunc("/all", Handle_RegistryAll)
+ if *registryType == "quay.io" {
+ s.HandleFunc("/all", Handle_Quay_AllRepos)
+ } else if *registryType == "distribution" {
+ s.HandleFunc("/all", Handle_Distribution_AllRepos)
+ } else {
+ log.Fatal("No valid registry type specified!")
+ }
// list of repositories
- s.HandleFunc("/repositories", Handle_RegistryRepositories)
+ //s.HandleFunc("/repositories", Handle_RegistryRepositories)
// single repository
- s.HandleFunc("/{repository}/tags", Handle_RepositoryTags)
- s.HandleFunc("/{repository}/manifests/{tag}", Handle_RepositoryManifest)
+ //s.HandleFunc("/{repository}/tags", Handle_RepositoryTags)
+ //s.HandleFunc("/{repository}/manifests/{tag}", Handle_RepositoryManifest)
http.Handle("/registry/", r)