2018-12-03 10:32:05 +00:00
package rest
import (
"encoding/json"
"fmt"
"net/http"
2019-08-03 01:58:23 +00:00
"github.com/gorilla/mux"
2022-11-21 17:36:05 +00:00
"github.com/rs/zerolog/log"
2023-02-03 14:24:05 +00:00
"github.com/traefik/traefik/v3/pkg/config/dynamic"
"github.com/traefik/traefik/v3/pkg/provider"
"github.com/traefik/traefik/v3/pkg/safe"
2018-12-03 10:32:05 +00:00
"github.com/unrolled/render"
)
var _ provider . Provider = ( * Provider ) ( nil )
// Provider is a provider.Provider implementation that provides a Rest API.
type Provider struct {
2019-09-06 13:08:04 +00:00
Insecure bool ` description:"Activate REST Provider directly on the entryPoint named traefik." json:"insecure,omitempty" toml:"insecure,omitempty" yaml:"insecure,omitempty" export:"true" `
2019-07-10 07:26:04 +00:00
configurationChan chan <- dynamic . Message
2019-06-17 09:48:05 +00:00
}
// SetDefaults sets the default values.
2019-11-14 15:40:05 +00:00
func ( p * Provider ) SetDefaults ( ) { }
2018-12-03 10:32:05 +00:00
var templatesRenderer = render . New ( render . Options { Directory : "nowhere" } )
// Init the provider.
func ( p * Provider ) Init ( ) error {
return nil
}
2020-05-11 10:06:07 +00:00
// CreateRouter creates a router for the Rest API.
2019-11-14 15:40:05 +00:00
func ( p * Provider ) CreateRouter ( ) * mux . Router {
2019-09-06 13:08:04 +00:00
router := mux . NewRouter ( )
2019-11-14 15:40:05 +00:00
router . Methods ( http . MethodPut ) . Path ( "/api/providers/{provider}" ) . Handler ( p )
2019-09-06 13:08:04 +00:00
return router
}
2019-11-14 15:40:05 +00:00
func ( p * Provider ) ServeHTTP ( rw http . ResponseWriter , req * http . Request ) {
vars := mux . Vars ( req )
if vars [ "provider" ] != "rest" {
http . Error ( rw , "Only 'rest' provider can be updated through the REST API" , http . StatusBadRequest )
return
}
2018-12-03 10:32:05 +00:00
2019-11-14 15:40:05 +00:00
configuration := new ( dynamic . Configuration )
2019-02-05 16:10:03 +00:00
2019-11-14 15:40:05 +00:00
if err := json . NewDecoder ( req . Body ) . Decode ( configuration ) ; err != nil {
2022-11-21 17:36:05 +00:00
log . Error ( ) . Err ( err ) . Msg ( "Error parsing configuration" )
2019-11-14 15:40:05 +00:00
http . Error ( rw , fmt . Sprintf ( "%+v" , err ) , http . StatusBadRequest )
return
}
2019-02-05 16:10:03 +00:00
2019-11-14 15:40:05 +00:00
p . configurationChan <- dynamic . Message { ProviderName : "rest" , Configuration : configuration }
if err := templatesRenderer . JSON ( rw , http . StatusOK , configuration ) ; err != nil {
2022-11-21 17:36:05 +00:00
log . Error ( ) . Err ( err ) . Send ( )
2019-11-14 15:40:05 +00:00
}
2018-12-03 10:32:05 +00:00
}
// Provide allows the provider to provide configurations to traefik
// using the given configuration channel.
2019-07-10 07:26:04 +00:00
func ( p * Provider ) Provide ( configurationChan chan <- dynamic . Message , pool * safe . Pool ) error {
2018-12-03 10:32:05 +00:00
p . configurationChan = configurationChan
return nil
}