diff options
author | Clark Laughlin <clark.laughlin@linaro.org> | 2015-11-02 15:58:05 -0500 |
---|---|---|
committer | Clark Laughlin <clark.laughlin@linaro.org> | 2015-11-02 15:58:05 -0500 |
commit | 6b45d5bd2ecfb653941886d50de9e9bff9e569bd (patch) | |
tree | 38c5e5c4858f97f2950ca95ac88d6af8eb0eb064 | |
parent | 6e1e05f04a558e0e73f1f5ed20bba77da4e144ab (diff) |
Enable support for a quay.io registry
-rw-r--r-- | registry-browser/Dockerfile | 2 | ||||
-rw-r--r-- | registry-browser/server.go | 151 |
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) |