Refactoring cloudfactory layer handler into a more generic storage
middleware concept. This also breaks the dependency the storage package had on goamz Signed-off-by: David Lawrence <david.lawrence@docker.com> (github: endophage)
This commit is contained in:
parent
4ae9583092
commit
952f39edff
9 changed files with 139 additions and 238 deletions
|
@ -16,6 +16,7 @@ import (
|
|||
"github.com/docker/distribution/registry/storage"
|
||||
storagedriver "github.com/docker/distribution/registry/storage/driver"
|
||||
"github.com/docker/distribution/registry/storage/driver/factory"
|
||||
storagemiddleware "github.com/docker/distribution/registry/storage/driver/middleware"
|
||||
"github.com/gorilla/mux"
|
||||
"golang.org/x/net/context"
|
||||
)
|
||||
|
@ -41,8 +42,6 @@ type App struct {
|
|||
sink notifications.Sink
|
||||
source notifications.SourceRecord
|
||||
}
|
||||
|
||||
layerHandler storage.LayerHandler // allows dispatch of layer serving to external provider
|
||||
}
|
||||
|
||||
// Value intercepts calls context.Context.Value, returning the current app id,
|
||||
|
@ -101,14 +100,22 @@ func NewApp(ctx context.Context, configuration configuration.Configuration) *App
|
|||
app.accessController = accessController
|
||||
}
|
||||
|
||||
layerHandlerType := configuration.LayerHandler.Type()
|
||||
for _, mw := range configuration.Middleware {
|
||||
if mw.Inject == "registry" {
|
||||
// registry middleware can director wrap app.registry identically to storage middlewares with driver
|
||||
panic(fmt.Sprintf("unable to configure registry middleware (%s): %v", mw.Name, err))
|
||||
} else if mw.Inject == "repository" {
|
||||
// we have to do something more intelligent with repository middleware, It needs to be staged
|
||||
// for later to be wrapped around the repository at request time.
|
||||
panic(fmt.Sprintf("unable to configure repository middleware (%s): %v", mw.Name, err))
|
||||
} else if mw.Inject == "storage" {
|
||||
smw, err := storagemiddleware.GetStorageMiddleware(mw.Name, mw.Options, app.driver)
|
||||
|
||||
if layerHandlerType != "" {
|
||||
lh, err := storage.GetLayerHandler(layerHandlerType, configuration.LayerHandler.Parameters(), app.driver)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("unable to configure layer handler (%s): %v", layerHandlerType, err))
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("unable to configure storage middleware (%s): %v", mw.Name, err))
|
||||
}
|
||||
app.driver = smw
|
||||
}
|
||||
app.layerHandler = lh
|
||||
}
|
||||
|
||||
return app
|
||||
|
|
|
@ -49,8 +49,8 @@ type layerHandler struct {
|
|||
// response.
|
||||
func (lh *layerHandler) GetLayer(w http.ResponseWriter, r *http.Request) {
|
||||
ctxu.GetLogger(lh).Debug("GetImageLayer")
|
||||
layers := lh.Repository.Layers()
|
||||
layer, err := layers.Fetch(lh.Digest)
|
||||
layerStore := lh.Repository.Layers()
|
||||
layerReader, err := layerStore.Fetch(lh.Digest)
|
||||
|
||||
if err != nil {
|
||||
switch err := err.(type) {
|
||||
|
@ -62,17 +62,6 @@ func (lh *layerHandler) GetLayer(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
return
|
||||
}
|
||||
defer layer.Close()
|
||||
|
||||
w.Header().Set("Docker-Content-Digest", lh.Digest.String())
|
||||
|
||||
if lh.layerHandler != nil {
|
||||
handler, _ := lh.layerHandler.Resolve(layer)
|
||||
if handler != nil {
|
||||
handler.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
http.ServeContent(w, r, layer.Digest().String(), layer.CreatedAt(), layer)
|
||||
layerReader.ServeHTTP(w, r)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue