Prepare urls package for exports

The route definition files have been prepared for export with documentation.
Consts have been updated and tests are now passing for the urls package.
This commit is contained in:
Stephen J Day 2014-12-11 21:08:23 -08:00
parent c78d173cf7
commit da19114d1a
2 changed files with 38 additions and 35 deletions

View File

@ -1,66 +1,69 @@
package registry package urls
import ( import (
"github.com/docker/docker-registry/common" "github.com/docker/docker-registry/common"
"github.com/gorilla/mux" "github.com/gorilla/mux"
) )
// The following are definitions of the name under which all V2 routes are
// registered. These symbols can be used to look up a route based on the name.
const ( const (
routeNameBase = "base" RouteNameBase = "base"
routeNameImageManifest = "image-manifest" RouteNameManifest = "manifest"
routeNameTags = "tags" RouteNameTags = "tags"
routeNameBlob = "blob" RouteNameBlob = "blob"
routeNameBlobUpload = "blob-upload" RouteNameBlobUpload = "blob-upload"
routeNameBlobUploadResume = "blob-upload-resume" RouteNameBlobUploadChunk = "blob-upload-chunk"
) )
var allEndpoints = []string{ var allEndpoints = []string{
routeNameImageManifest, RouteNameManifest,
routeNameTags, RouteNameTags,
routeNameBlob, RouteNameBlob,
routeNameBlobUpload, RouteNameBlobUpload,
routeNameBlobUploadResume, RouteNameBlobUploadChunk,
} }
// v2APIRouter builds a gorilla router with named routes for the various API // Router builds a gorilla router with named routes for the various API
// methods. We may export this for use by the client. // methods. This can be used directly by both server implementations and
func v2APIRouter() *mux.Router { // clients.
func Router() *mux.Router {
router := mux.NewRouter(). router := mux.NewRouter().
StrictSlash(true) StrictSlash(true)
// GET /v2/ Check Check that the registry implements API version 2(.1) // GET /v2/ Check Check that the registry implements API version 2(.1)
router. router.
Path("/v2/"). Path("/v2/").
Name(routeNameBase) Name(RouteNameBase)
// GET /v2/<name>/manifest/<tag> Image Manifest Fetch the image manifest identified by name and tag. // GET /v2/<name>/manifest/<tag> Image Manifest Fetch the image manifest identified by name and tag.
// PUT /v2/<name>/manifest/<tag> Image Manifest Upload the image manifest identified by name and tag. // PUT /v2/<name>/manifest/<tag> Image Manifest Upload the image manifest identified by name and tag.
// DELETE /v2/<name>/manifest/<tag> Image Manifest Delete the image identified by name and tag. // DELETE /v2/<name>/manifest/<tag> Image Manifest Delete the image identified by name and tag.
router. router.
Path("/v2/{name:" + common.RepositoryNameRegexp.String() + "}/manifests/{tag:" + common.TagNameRegexp.String() + "}"). Path("/v2/{name:" + common.RepositoryNameRegexp.String() + "}/manifests/{tag:" + common.TagNameRegexp.String() + "}").
Name(routeNameImageManifest) Name(RouteNameManifest)
// GET /v2/<name>/tags/list Tags Fetch the tags under the repository identified by name. // GET /v2/<name>/tags/list Tags Fetch the tags under the repository identified by name.
router. router.
Path("/v2/{name:" + common.RepositoryNameRegexp.String() + "}/tags/list"). Path("/v2/{name:" + common.RepositoryNameRegexp.String() + "}/tags/list").
Name(routeNameTags) Name(RouteNameTags)
// GET /v2/<name>/blob/<digest> Layer Fetch the blob identified by digest. // GET /v2/<name>/blob/<digest> Layer Fetch the blob identified by digest.
router. router.
Path("/v2/{name:" + common.RepositoryNameRegexp.String() + "}/blobs/{digest:[a-zA-Z0-9-_+.]+:[a-zA-Z0-9-_+.=]+}"). Path("/v2/{name:" + common.RepositoryNameRegexp.String() + "}/blobs/{digest:[a-zA-Z0-9-_+.]+:[a-zA-Z0-9-_+.=]+}").
Name(routeNameBlob) Name(RouteNameBlob)
// POST /v2/<name>/blob/upload/ Layer Upload Initiate an upload of the layer identified by tarsum. // POST /v2/<name>/blob/upload/ Layer Upload Initiate an upload of the layer identified by tarsum.
router. router.
Path("/v2/{name:" + common.RepositoryNameRegexp.String() + "}/blobs/uploads/"). Path("/v2/{name:" + common.RepositoryNameRegexp.String() + "}/blobs/uploads/").
Name(routeNameBlobUpload) Name(RouteNameBlobUpload)
// GET /v2/<name>/blob/upload/<uuid> Layer Upload Get the status of the upload identified by tarsum and uuid. // GET /v2/<name>/blob/upload/<uuid> Layer Upload Get the status of the upload identified by tarsum and uuid.
// PUT /v2/<name>/blob/upload/<uuid> Layer Upload Upload all or a chunk of the upload identified by tarsum and uuid. // PUT /v2/<name>/blob/upload/<uuid> Layer Upload Upload all or a chunk of the upload identified by tarsum and uuid.
// DELETE /v2/<name>/blob/upload/<uuid> Layer Upload Cancel the upload identified by layer and uuid // DELETE /v2/<name>/blob/upload/<uuid> Layer Upload Cancel the upload identified by layer and uuid
router. router.
Path("/v2/{name:" + common.RepositoryNameRegexp.String() + "}/blobs/uploads/{uuid}"). Path("/v2/{name:" + common.RepositoryNameRegexp.String() + "}/blobs/uploads/{uuid}").
Name(routeNameBlobUploadResume) Name(RouteNameBlobUploadChunk)
return router return router
} }

View File

@ -1,4 +1,4 @@
package registry package urls
import ( import (
"encoding/json" "encoding/json"
@ -25,7 +25,7 @@ type routeTestCase struct {
// This may go away as the application structure comes together. // This may go away as the application structure comes together.
func TestRouter(t *testing.T) { func TestRouter(t *testing.T) {
router := v2APIRouter() router := Router()
testHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { testHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
testCase := routeTestCase{ testCase := routeTestCase{
@ -47,12 +47,12 @@ func TestRouter(t *testing.T) {
for _, testcase := range []routeTestCase{ for _, testcase := range []routeTestCase{
{ {
RouteName: routeNameBase, RouteName: RouteNameBase,
RequestURI: "/v2/", RequestURI: "/v2/",
Vars: map[string]string{}, Vars: map[string]string{},
}, },
{ {
RouteName: routeNameImageManifest, RouteName: RouteNameManifest,
RequestURI: "/v2/foo/bar/manifests/tag", RequestURI: "/v2/foo/bar/manifests/tag",
Vars: map[string]string{ Vars: map[string]string{
"name": "foo/bar", "name": "foo/bar",
@ -60,14 +60,14 @@ func TestRouter(t *testing.T) {
}, },
}, },
{ {
RouteName: routeNameTags, RouteName: RouteNameTags,
RequestURI: "/v2/foo/bar/tags/list", RequestURI: "/v2/foo/bar/tags/list",
Vars: map[string]string{ Vars: map[string]string{
"name": "foo/bar", "name": "foo/bar",
}, },
}, },
{ {
RouteName: routeNameBlob, RouteName: RouteNameBlob,
RequestURI: "/v2/foo/bar/blobs/tarsum.dev+foo:abcdef0919234", RequestURI: "/v2/foo/bar/blobs/tarsum.dev+foo:abcdef0919234",
Vars: map[string]string{ Vars: map[string]string{
"name": "foo/bar", "name": "foo/bar",
@ -75,7 +75,7 @@ func TestRouter(t *testing.T) {
}, },
}, },
{ {
RouteName: routeNameBlob, RouteName: RouteNameBlob,
RequestURI: "/v2/foo/bar/blobs/sha256:abcdef0919234", RequestURI: "/v2/foo/bar/blobs/sha256:abcdef0919234",
Vars: map[string]string{ Vars: map[string]string{
"name": "foo/bar", "name": "foo/bar",
@ -83,14 +83,14 @@ func TestRouter(t *testing.T) {
}, },
}, },
{ {
RouteName: routeNameBlobUpload, RouteName: RouteNameBlobUpload,
RequestURI: "/v2/foo/bar/blobs/uploads/", RequestURI: "/v2/foo/bar/blobs/uploads/",
Vars: map[string]string{ Vars: map[string]string{
"name": "foo/bar", "name": "foo/bar",
}, },
}, },
{ {
RouteName: routeNameBlobUploadResume, RouteName: RouteNameBlobUploadChunk,
RequestURI: "/v2/foo/bar/blobs/uploads/uuid", RequestURI: "/v2/foo/bar/blobs/uploads/uuid",
Vars: map[string]string{ Vars: map[string]string{
"name": "foo/bar", "name": "foo/bar",
@ -98,7 +98,7 @@ func TestRouter(t *testing.T) {
}, },
}, },
{ {
RouteName: routeNameBlobUploadResume, RouteName: RouteNameBlobUploadChunk,
RequestURI: "/v2/foo/bar/blobs/uploads/D95306FA-FAD3-4E36-8D41-CF1C93EF8286", RequestURI: "/v2/foo/bar/blobs/uploads/D95306FA-FAD3-4E36-8D41-CF1C93EF8286",
Vars: map[string]string{ Vars: map[string]string{
"name": "foo/bar", "name": "foo/bar",
@ -106,7 +106,7 @@ func TestRouter(t *testing.T) {
}, },
}, },
{ {
RouteName: routeNameBlobUploadResume, RouteName: RouteNameBlobUploadChunk,
RequestURI: "/v2/foo/bar/blobs/uploads/RDk1MzA2RkEtRkFEMy00RTM2LThENDEtQ0YxQzkzRUY4Mjg2IA==", RequestURI: "/v2/foo/bar/blobs/uploads/RDk1MzA2RkEtRkFEMy00RTM2LThENDEtQ0YxQzkzRUY4Mjg2IA==",
Vars: map[string]string{ Vars: map[string]string{
"name": "foo/bar", "name": "foo/bar",
@ -117,7 +117,7 @@ func TestRouter(t *testing.T) {
// Check ambiguity: ensure we can distinguish between tags for // Check ambiguity: ensure we can distinguish between tags for
// "foo/bar/image/image" and image for "foo/bar/image" with tag // "foo/bar/image/image" and image for "foo/bar/image" with tag
// "tags" // "tags"
RouteName: routeNameImageManifest, RouteName: RouteNameManifest,
RequestURI: "/v2/foo/bar/manifests/manifests/tags", RequestURI: "/v2/foo/bar/manifests/manifests/tags",
Vars: map[string]string{ Vars: map[string]string{
"name": "foo/bar/manifests", "name": "foo/bar/manifests",
@ -127,14 +127,14 @@ func TestRouter(t *testing.T) {
{ {
// This case presents an ambiguity between foo/bar with tag="tags" // This case presents an ambiguity between foo/bar with tag="tags"
// and list tags for "foo/bar/manifest" // and list tags for "foo/bar/manifest"
RouteName: routeNameTags, RouteName: RouteNameTags,
RequestURI: "/v2/foo/bar/manifests/tags/list", RequestURI: "/v2/foo/bar/manifests/tags/list",
Vars: map[string]string{ Vars: map[string]string{
"name": "foo/bar/manifests", "name": "foo/bar/manifests",
}, },
}, },
{ {
RouteName: routeNameBlobUploadResume, RouteName: RouteNameBlobUploadChunk,
RequestURI: "/v2/foo/../../blob/uploads/D95306FA-FAD3-4E36-8D41-CF1C93EF8286", RequestURI: "/v2/foo/../../blob/uploads/D95306FA-FAD3-4E36-8D41-CF1C93EF8286",
StatusCode: http.StatusNotFound, StatusCode: http.StatusNotFound,
}, },