2015-09-08 13:33:10 +02:00
package main
import (
2015-09-09 00:22:34 +02:00
"encoding/json"
2015-09-12 15:10:03 +02:00
"fmt"
2015-09-24 17:16:13 +02:00
"io/ioutil"
"net/http"
2015-09-24 14:32:37 +02:00
log "github.com/Sirupsen/logrus"
2015-09-11 18:47:54 +02:00
"github.com/elazarl/go-bindata-assetfs"
2015-09-12 15:10:03 +02:00
"github.com/gorilla/mux"
2015-10-22 14:02:14 +02:00
"github.com/unrolled/render"
2015-09-08 13:33:10 +02:00
)
type WebProvider struct {
2015-09-24 14:32:37 +02:00
Address string
2015-09-22 21:00:29 +02:00
CertFile , KeyFile string
2015-09-08 13:33:10 +02:00
}
2015-10-22 14:02:14 +02:00
var (
templatesRenderer = render . New ( render . Options {
Directory : "nowhere" ,
} )
)
2015-10-01 12:04:25 +02:00
func ( provider * WebProvider ) Provide ( configurationChan chan <- configMessage ) error {
2015-09-08 13:33:10 +02:00
systemRouter := mux . NewRouter ( )
2015-09-22 23:17:21 +00:00
2015-10-05 16:01:34 +02:00
// health route
systemRouter . Methods ( "GET" ) . Path ( "/health" ) . HandlerFunc ( getHealthHandler )
// API routes
systemRouter . Methods ( "GET" ) . Path ( "/api" ) . HandlerFunc ( getConfigHandler )
systemRouter . Methods ( "GET" ) . Path ( "/api/providers" ) . HandlerFunc ( getConfigHandler )
systemRouter . Methods ( "GET" ) . Path ( "/api/providers/{provider}" ) . HandlerFunc ( getProviderHandler )
systemRouter . Methods ( "PUT" ) . Path ( "/api/providers/{provider}" ) . HandlerFunc ( func ( response http . ResponseWriter , request * http . Request ) {
vars := mux . Vars ( request )
if vars [ "provider" ] != "web" {
response . WriteHeader ( http . StatusBadRequest )
fmt . Fprintf ( response , "Only 'web' provider can be updated through the REST API" )
return
}
configuration := new ( Configuration )
body , _ := ioutil . ReadAll ( request . Body )
err := json . Unmarshal ( body , configuration )
if err == nil {
configurationChan <- configMessage { "web" , configuration }
getConfigHandler ( response , request )
} else {
log . Errorf ( "Error parsing configuration %+v" , err )
http . Error ( response , fmt . Sprintf ( "%+v" , err ) , http . StatusBadRequest )
}
} )
systemRouter . Methods ( "GET" ) . Path ( "/api/providers/{provider}/backends" ) . HandlerFunc ( getBackendsHandler )
systemRouter . Methods ( "GET" ) . Path ( "/api/providers/{provider}/backends/{backend}" ) . HandlerFunc ( getBackendHandler )
systemRouter . Methods ( "GET" ) . Path ( "/api/providers/{provider}/backends/{backend}/servers" ) . HandlerFunc ( getServersHandler )
systemRouter . Methods ( "GET" ) . Path ( "/api/providers/{provider}/backends/{backend}/servers/{server}" ) . HandlerFunc ( getServerHandler )
systemRouter . Methods ( "GET" ) . Path ( "/api/providers/{provider}/frontends" ) . HandlerFunc ( getFrontendsHandler )
systemRouter . Methods ( "GET" ) . Path ( "/api/providers/{provider}/frontends/{frontend}" ) . HandlerFunc ( getFrontendHandler )
2015-10-08 11:16:40 +02:00
systemRouter . Methods ( "GET" ) . Path ( "/api/providers/{provider}/frontends/{frontend}/routes" ) . HandlerFunc ( getRoutesHandler )
systemRouter . Methods ( "GET" ) . Path ( "/api/providers/{provider}/frontends/{frontend}/routes/{route}" ) . HandlerFunc ( getRouteHandler )
2015-10-05 16:01:34 +02:00
// Expose dashboard
systemRouter . Methods ( "GET" ) . Path ( "/" ) . HandlerFunc ( func ( response http . ResponseWriter , request * http . Request ) {
http . Redirect ( response , request , "/dashboard/" , 302 )
} )
systemRouter . Methods ( "GET" ) . PathPrefix ( "/dashboard/" ) . Handler ( http . StripPrefix ( "/dashboard/" , http . FileServer ( & assetfs . AssetFS { Asset : Asset , AssetDir : AssetDir , Prefix : "static" } ) ) )
2015-09-08 13:33:10 +02:00
2015-09-22 21:00:29 +02:00
go func ( ) {
if len ( provider . CertFile ) > 0 && len ( provider . KeyFile ) > 0 {
2015-09-24 14:32:37 +02:00
err := http . ListenAndServeTLS ( provider . Address , provider . CertFile , provider . KeyFile , systemRouter )
if err != nil {
2015-09-24 11:39:18 +02:00
log . Fatal ( "Error creating server: " , err )
}
2015-09-22 21:00:29 +02:00
} else {
2015-09-24 11:39:18 +02:00
err := http . ListenAndServe ( provider . Address , systemRouter )
2015-09-24 14:32:37 +02:00
if err != nil {
2015-09-24 11:39:18 +02:00
log . Fatal ( "Error creating server: " , err )
}
2015-09-22 21:00:29 +02:00
}
} ( )
2015-10-01 12:04:25 +02:00
return nil
2015-09-08 13:33:10 +02:00
}
2015-10-05 16:01:34 +02:00
func getHealthHandler ( response http . ResponseWriter , request * http . Request ) {
templatesRenderer . JSON ( response , http . StatusOK , metrics . Data ( ) )
2015-09-08 13:33:10 +02:00
}
2015-10-05 16:01:34 +02:00
func getConfigHandler ( response http . ResponseWriter , request * http . Request ) {
templatesRenderer . JSON ( response , http . StatusOK , currentConfigurations )
2015-09-08 13:33:10 +02:00
}
2015-09-12 13:20:54 +02:00
2015-10-05 16:01:34 +02:00
func getProviderHandler ( response http . ResponseWriter , request * http . Request ) {
vars := mux . Vars ( request )
providerID := vars [ "provider" ]
if provider , ok := currentConfigurations [ providerID ] ; ok {
templatesRenderer . JSON ( response , http . StatusOK , provider )
} else {
http . NotFound ( response , request )
}
2015-10-03 16:50:53 +02:00
}
2015-10-05 16:01:34 +02:00
func getBackendsHandler ( response http . ResponseWriter , request * http . Request ) {
vars := mux . Vars ( request )
providerID := vars [ "provider" ]
if provider , ok := currentConfigurations [ providerID ] ; ok {
templatesRenderer . JSON ( response , http . StatusOK , provider . Backends )
2015-09-23 05:48:32 +00:00
} else {
2015-10-05 16:01:34 +02:00
http . NotFound ( response , request )
2015-09-23 05:48:32 +00:00
}
2015-09-15 18:35:32 +02:00
}
2015-10-05 16:01:34 +02:00
func getBackendHandler ( response http . ResponseWriter , request * http . Request ) {
vars := mux . Vars ( request )
providerID := vars [ "provider" ]
backendID := vars [ "backend" ]
if provider , ok := currentConfigurations [ providerID ] ; ok {
if backend , ok := provider . Backends [ backendID ] ; ok {
templatesRenderer . JSON ( response , http . StatusOK , backend )
2015-09-23 05:48:32 +00:00
return
}
2015-09-16 19:08:01 +02:00
}
2015-10-05 16:01:34 +02:00
http . NotFound ( response , request )
2015-09-15 18:35:32 +02:00
}
2015-10-08 11:16:40 +02:00
func getServersHandler ( response http . ResponseWriter , request * http . Request ) {
vars := mux . Vars ( request )
providerID := vars [ "provider" ]
backendID := vars [ "backend" ]
if provider , ok := currentConfigurations [ providerID ] ; ok {
if backend , ok := provider . Backends [ backendID ] ; ok {
templatesRenderer . JSON ( response , http . StatusOK , backend . Servers )
return
}
}
http . NotFound ( response , request )
}
func getServerHandler ( response http . ResponseWriter , request * http . Request ) {
vars := mux . Vars ( request )
providerID := vars [ "provider" ]
backendID := vars [ "backend" ]
serverID := vars [ "server" ]
if provider , ok := currentConfigurations [ providerID ] ; ok {
if backend , ok := provider . Backends [ backendID ] ; ok {
if server , ok := backend . Servers [ serverID ] ; ok {
templatesRenderer . JSON ( response , http . StatusOK , server )
return
}
}
}
http . NotFound ( response , request )
}
2015-10-05 16:01:34 +02:00
func getFrontendsHandler ( response http . ResponseWriter , request * http . Request ) {
vars := mux . Vars ( request )
providerID := vars [ "provider" ]
if provider , ok := currentConfigurations [ providerID ] ; ok {
templatesRenderer . JSON ( response , http . StatusOK , provider . Frontends )
2015-09-23 05:48:32 +00:00
} else {
2015-10-05 16:01:34 +02:00
http . NotFound ( response , request )
2015-09-23 05:48:32 +00:00
}
2015-09-15 18:35:32 +02:00
}
2015-10-05 16:01:34 +02:00
func getFrontendHandler ( response http . ResponseWriter , request * http . Request ) {
vars := mux . Vars ( request )
providerID := vars [ "provider" ]
frontendID := vars [ "frontend" ]
if provider , ok := currentConfigurations [ providerID ] ; ok {
if frontend , ok := provider . Frontends [ frontendID ] ; ok {
templatesRenderer . JSON ( response , http . StatusOK , frontend )
2015-09-23 05:48:32 +00:00
return
}
2015-09-16 19:08:01 +02:00
}
2015-10-05 16:01:34 +02:00
http . NotFound ( response , request )
2015-09-15 18:35:32 +02:00
}
2015-09-16 19:08:01 +02:00
2015-10-08 11:16:40 +02:00
func getRoutesHandler ( response http . ResponseWriter , request * http . Request ) {
2015-10-05 16:01:34 +02:00
vars := mux . Vars ( request )
providerID := vars [ "provider" ]
2015-10-08 11:16:40 +02:00
frontendID := vars [ "frontend" ]
2015-10-05 16:01:34 +02:00
if provider , ok := currentConfigurations [ providerID ] ; ok {
2015-10-08 11:16:40 +02:00
if frontend , ok := provider . Frontends [ frontendID ] ; ok {
templatesRenderer . JSON ( response , http . StatusOK , frontend . Routes )
2015-09-23 05:48:32 +00:00
return
}
2015-09-16 19:08:01 +02:00
}
2015-10-05 16:01:34 +02:00
http . NotFound ( response , request )
2015-09-16 19:08:01 +02:00
}
2015-10-08 11:16:40 +02:00
func getRouteHandler ( response http . ResponseWriter , request * http . Request ) {
2015-10-05 16:01:34 +02:00
vars := mux . Vars ( request )
providerID := vars [ "provider" ]
2015-10-08 11:16:40 +02:00
frontendID := vars [ "frontend" ]
routeID := vars [ "route" ]
2015-10-05 16:01:34 +02:00
if provider , ok := currentConfigurations [ providerID ] ; ok {
2015-10-08 11:16:40 +02:00
if frontend , ok := provider . Frontends [ frontendID ] ; ok {
if route , ok := frontend . Routes [ routeID ] ; ok {
templatesRenderer . JSON ( response , http . StatusOK , route )
2015-09-23 05:48:32 +00:00
return
}
2015-09-16 19:08:01 +02:00
}
}
2015-10-05 16:01:34 +02:00
http . NotFound ( response , request )
2015-09-22 10:33:37 +02:00
}