feat(dashboard): introduce the in memory handler

the in memory handler gives etcd the ability to serve a dashboard
without on disk resources. This is the first time we are using the
/mod/ path too.

TODO: cleanup the mod stuff so it isn't hacked into etcd_handlers.
This commit is contained in:
Brandon Philips 2013-10-07 23:33:16 -07:00
parent 637650e2a9
commit 431eebf754
2 changed files with 43 additions and 15 deletions

View File

@ -19,7 +19,6 @@ package main
import (
"fmt"
"net/http"
"os"
"strconv"
"strings"
@ -42,7 +41,7 @@ func NewEtcdMuxer() *http.ServeMux {
etcdMux.Handle("/"+version+"/stats/", errorHandler(StatsHttpHandler))
etcdMux.Handle("/version", errorHandler(VersionHttpHandler))
etcdMux.HandleFunc("/test/", TestHttpHandler)
etcdMux.Handle("/dashboard/", DashboardHttpHandler())
etcdMux.Handle("/mod/dashboard/", DashboardHttpHandler("/mod/dashboard/"))
return etcdMux
}
@ -278,19 +277,6 @@ func GetHttpHandler(w http.ResponseWriter, req *http.Request) error {
}
// DashboardHttpHandler either uses the compiled in virtual filesystem for the
// dashboard assets or if ETCD_DASHBOARD_DIR is set uses that as the source of
// assets.
func DashboardHttpHandler() http.Handler {
dashDir := os.Getenv("ETCD_DASHBOARD_DIR")
if len(dashDir) == 0 {
dashDir = "./"
}
return http.StripPrefix("/dashboard/", http.FileServer(http.Dir(dashDir)))
}
// Watch handler
func WatchHttpHandler(w http.ResponseWriter, req *http.Request) error {
key := req.URL.Path[len("/v1/watch/"):]

42
etcd_modules.go Normal file
View File

@ -0,0 +1,42 @@
package main
import (
"bytes"
"net/http"
"os"
"time"
"github.com/coreos/etcd/dashboard/resources"
)
func DashboardMemoryFileServer(w http.ResponseWriter, req *http.Request) {
path := req.URL.Path
if len(path) == 0 {
path = "index.html"
}
b, ok := resources.File("/" + path)
if ok == false {
http.Error(w, path+": File not found", http.StatusNotFound)
return
}
http.ServeContent(w, req, path, time.Time{}, bytes.NewReader(b))
return
}
// DashboardHttpHandler either uses the compiled in virtual filesystem for the
// dashboard assets or if ETCD_DASHBOARD_DIR is set uses that as the source of
// assets.
func DashboardHttpHandler(prefix string) (handler http.Handler) {
handler = http.HandlerFunc(DashboardMemoryFileServer)
// Serve the dashboard from a filesystem if the magic env variable is enabled
dashDir := os.Getenv("ETCD_DASHBOARD_DIR")
if len(dashDir) != 0 {
handler = http.FileServer(http.Dir(dashDir))
}
return http.StripPrefix(prefix, handler)
}