github.com/a4a881d4/docker@v1.9.0-rc2/api/server/router/local/local.go (about) 1 package local 2 3 import ( 4 "net/http" 5 6 "golang.org/x/net/context" 7 8 "github.com/docker/docker/api/server/httputils" 9 dkrouter "github.com/docker/docker/api/server/router" 10 "github.com/docker/docker/daemon" 11 ) 12 13 // router is a docker router that talks with the local docker daemon. 14 type router struct { 15 daemon *daemon.Daemon 16 routes []dkrouter.Route 17 } 18 19 // localRoute defines an individual API route to connect with the docker daemon. 20 // It implements router.Route. 21 type localRoute struct { 22 method string 23 path string 24 handler httputils.APIFunc 25 } 26 27 // Handler returns the APIFunc to let the server wrap it in middlewares 28 func (l localRoute) Handler() httputils.APIFunc { 29 return l.handler 30 } 31 32 // Method returns the http method that the route responds to. 33 func (l localRoute) Method() string { 34 return l.method 35 } 36 37 // Path returns the subpath where the route responds to. 38 func (l localRoute) Path() string { 39 return l.path 40 } 41 42 // NewRoute initialies a new local route for the reouter 43 func NewRoute(method, path string, handler httputils.APIFunc) dkrouter.Route { 44 return localRoute{method, path, handler} 45 } 46 47 // NewGetRoute initializes a new route with the http method GET. 48 func NewGetRoute(path string, handler httputils.APIFunc) dkrouter.Route { 49 return NewRoute("GET", path, handler) 50 } 51 52 // NewPostRoute initializes a new route with the http method POST. 53 func NewPostRoute(path string, handler httputils.APIFunc) dkrouter.Route { 54 return NewRoute("POST", path, handler) 55 } 56 57 // NewPutRoute initializes a new route with the http method PUT. 58 func NewPutRoute(path string, handler httputils.APIFunc) dkrouter.Route { 59 return NewRoute("PUT", path, handler) 60 } 61 62 // NewDeleteRoute initializes a new route with the http method DELETE. 63 func NewDeleteRoute(path string, handler httputils.APIFunc) dkrouter.Route { 64 return NewRoute("DELETE", path, handler) 65 } 66 67 // NewOptionsRoute initializes a new route with the http method OPTIONS 68 func NewOptionsRoute(path string, handler httputils.APIFunc) dkrouter.Route { 69 return NewRoute("OPTIONS", path, handler) 70 } 71 72 // NewHeadRoute initializes a new route with the http method HEAD. 73 func NewHeadRoute(path string, handler httputils.APIFunc) dkrouter.Route { 74 return NewRoute("HEAD", path, handler) 75 } 76 77 // NewRouter initializes a local router with a new daemon. 78 func NewRouter(daemon *daemon.Daemon) dkrouter.Router { 79 r := &router{ 80 daemon: daemon, 81 } 82 r.initRoutes() 83 return r 84 } 85 86 // Routes returns the list of routes registered in the router. 87 func (r *router) Routes() []dkrouter.Route { 88 return r.routes 89 } 90 91 // initRoutes initializes the routes in this router 92 func (r *router) initRoutes() { 93 r.routes = []dkrouter.Route{ 94 // HEAD 95 NewHeadRoute("/containers/{name:.*}/archive", r.headContainersArchive), 96 // OPTIONS 97 NewOptionsRoute("/", optionsHandler), 98 // GET 99 NewGetRoute("/_ping", pingHandler), 100 NewGetRoute("/events", r.getEvents), 101 NewGetRoute("/info", r.getInfo), 102 NewGetRoute("/version", r.getVersion), 103 NewGetRoute("/images/json", r.getImagesJSON), 104 NewGetRoute("/images/search", r.getImagesSearch), 105 NewGetRoute("/images/get", r.getImagesGet), 106 NewGetRoute("/images/{name:.*}/get", r.getImagesGet), 107 NewGetRoute("/images/{name:.*}/history", r.getImagesHistory), 108 NewGetRoute("/images/{name:.*}/json", r.getImagesByName), 109 NewGetRoute("/containers/json", r.getContainersJSON), 110 NewGetRoute("/containers/{name:.*}/export", r.getContainersExport), 111 NewGetRoute("/containers/{name:.*}/changes", r.getContainersChanges), 112 NewGetRoute("/containers/{name:.*}/json", r.getContainersByName), 113 NewGetRoute("/containers/{name:.*}/top", r.getContainersTop), 114 NewGetRoute("/containers/{name:.*}/logs", r.getContainersLogs), 115 NewGetRoute("/containers/{name:.*}/stats", r.getContainersStats), 116 NewGetRoute("/containers/{name:.*}/attach/ws", r.wsContainersAttach), 117 NewGetRoute("/exec/{id:.*}/json", r.getExecByID), 118 NewGetRoute("/containers/{name:.*}/archive", r.getContainersArchive), 119 NewGetRoute("/volumes", r.getVolumesList), 120 NewGetRoute("/volumes/{name:.*}", r.getVolumeByName), 121 // POST 122 NewPostRoute("/auth", r.postAuth), 123 NewPostRoute("/commit", r.postCommit), 124 NewPostRoute("/build", r.postBuild), 125 NewPostRoute("/images/create", r.postImagesCreate), 126 NewPostRoute("/images/load", r.postImagesLoad), 127 NewPostRoute("/images/{name:.*}/push", r.postImagesPush), 128 NewPostRoute("/images/{name:.*}/tag", r.postImagesTag), 129 NewPostRoute("/containers/create", r.postContainersCreate), 130 NewPostRoute("/containers/{name:.*}/kill", r.postContainersKill), 131 NewPostRoute("/containers/{name:.*}/pause", r.postContainersPause), 132 NewPostRoute("/containers/{name:.*}/unpause", r.postContainersUnpause), 133 NewPostRoute("/containers/{name:.*}/restart", r.postContainersRestart), 134 NewPostRoute("/containers/{name:.*}/start", r.postContainersStart), 135 NewPostRoute("/containers/{name:.*}/stop", r.postContainersStop), 136 NewPostRoute("/containers/{name:.*}/wait", r.postContainersWait), 137 NewPostRoute("/containers/{name:.*}/resize", r.postContainersResize), 138 NewPostRoute("/containers/{name:.*}/attach", r.postContainersAttach), 139 NewPostRoute("/containers/{name:.*}/copy", r.postContainersCopy), 140 NewPostRoute("/containers/{name:.*}/exec", r.postContainerExecCreate), 141 NewPostRoute("/exec/{name:.*}/start", r.postContainerExecStart), 142 NewPostRoute("/exec/{name:.*}/resize", r.postContainerExecResize), 143 NewPostRoute("/containers/{name:.*}/rename", r.postContainerRename), 144 NewPostRoute("/volumes/create", r.postVolumesCreate), 145 // PUT 146 NewPutRoute("/containers/{name:.*}/archive", r.putContainersArchive), 147 // DELETE 148 NewDeleteRoute("/containers/{name:.*}", r.deleteContainers), 149 NewDeleteRoute("/images/{name:.*}", r.deleteImages), 150 NewDeleteRoute("/volumes/{name:.*}", r.deleteVolumes), 151 } 152 } 153 154 func optionsHandler(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 155 w.WriteHeader(http.StatusOK) 156 return nil 157 } 158 159 func pingHandler(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 160 _, err := w.Write([]byte{'O', 'K'}) 161 return err 162 }