2019-07-12 12:10:03 +03:00
package api
import (
"encoding/json"
"net/http"
"sort"
"strconv"
2019-08-03 04:58:23 +03:00
"github.com/containous/traefik/v2/pkg/config/runtime"
"github.com/containous/traefik/v2/pkg/log"
"github.com/gorilla/mux"
2019-07-12 12:10:03 +03:00
)
type tcpRouterRepresentation struct {
2019-07-15 18:04:04 +03:00
* runtime . TCPRouterInfo
2019-07-12 12:10:03 +03:00
Name string ` json:"name,omitempty" `
Provider string ` json:"provider,omitempty" `
}
type tcpServiceRepresentation struct {
2019-07-15 18:04:04 +03:00
* runtime . TCPServiceInfo
2019-07-12 12:10:03 +03:00
Name string ` json:"name,omitempty" `
Provider string ` json:"provider,omitempty" `
}
func ( h Handler ) getTCPRouters ( rw http . ResponseWriter , request * http . Request ) {
results := make ( [ ] tcpRouterRepresentation , 0 , len ( h . runtimeConfiguration . TCPRouters ) )
for name , rt := range h . runtimeConfiguration . TCPRouters {
results = append ( results , tcpRouterRepresentation {
TCPRouterInfo : rt ,
Name : name ,
Provider : getProviderName ( name ) ,
} )
}
sort . Slice ( results , func ( i , j int ) bool {
return results [ i ] . Name < results [ j ] . Name
} )
pageInfo , err := pagination ( request , len ( results ) )
if err != nil {
http . Error ( rw , err . Error ( ) , http . StatusBadRequest )
return
}
rw . Header ( ) . Set ( "Content-Type" , "application/json" )
rw . Header ( ) . Set ( nextPageHeader , strconv . Itoa ( pageInfo . nextPage ) )
err = json . NewEncoder ( rw ) . Encode ( results [ pageInfo . startIndex : pageInfo . endIndex ] )
if err != nil {
log . FromContext ( request . Context ( ) ) . Error ( err )
http . Error ( rw , err . Error ( ) , http . StatusInternalServerError )
}
}
func ( h Handler ) getTCPRouter ( rw http . ResponseWriter , request * http . Request ) {
routerID := mux . Vars ( request ) [ "routerID" ]
router , ok := h . runtimeConfiguration . TCPRouters [ routerID ]
if ! ok {
http . NotFound ( rw , request )
return
}
result := tcpRouterRepresentation {
TCPRouterInfo : router ,
Name : routerID ,
Provider : getProviderName ( routerID ) ,
}
rw . Header ( ) . Set ( "Content-Type" , "application/json" )
err := json . NewEncoder ( rw ) . Encode ( result )
if err != nil {
log . FromContext ( request . Context ( ) ) . Error ( err )
http . Error ( rw , err . Error ( ) , http . StatusInternalServerError )
}
}
func ( h Handler ) getTCPServices ( rw http . ResponseWriter , request * http . Request ) {
results := make ( [ ] tcpServiceRepresentation , 0 , len ( h . runtimeConfiguration . TCPServices ) )
for name , si := range h . runtimeConfiguration . TCPServices {
results = append ( results , tcpServiceRepresentation {
TCPServiceInfo : si ,
Name : name ,
Provider : getProviderName ( name ) ,
} )
}
sort . Slice ( results , func ( i , j int ) bool {
return results [ i ] . Name < results [ j ] . Name
} )
pageInfo , err := pagination ( request , len ( results ) )
if err != nil {
http . Error ( rw , err . Error ( ) , http . StatusBadRequest )
return
}
rw . Header ( ) . Set ( "Content-Type" , "application/json" )
rw . Header ( ) . Set ( nextPageHeader , strconv . Itoa ( pageInfo . nextPage ) )
err = json . NewEncoder ( rw ) . Encode ( results [ pageInfo . startIndex : pageInfo . endIndex ] )
if err != nil {
log . FromContext ( request . Context ( ) ) . Error ( err )
http . Error ( rw , err . Error ( ) , http . StatusInternalServerError )
}
}
func ( h Handler ) getTCPService ( rw http . ResponseWriter , request * http . Request ) {
serviceID := mux . Vars ( request ) [ "serviceID" ]
service , ok := h . runtimeConfiguration . TCPServices [ serviceID ]
if ! ok {
http . NotFound ( rw , request )
return
}
result := tcpServiceRepresentation {
TCPServiceInfo : service ,
Name : serviceID ,
Provider : getProviderName ( serviceID ) ,
}
rw . Header ( ) . Set ( "Content-Type" , "application/json" )
err := json . NewEncoder ( rw ) . Encode ( result )
if err != nil {
log . FromContext ( request . Context ( ) ) . Error ( err )
http . Error ( rw , err . Error ( ) , http . StatusInternalServerError )
}
}