package internal
import (
"context"
"net/http"
"github.com/envoyproxy/go-control-plane/pkg/cache/types"
resourcev3 "github.com/envoyproxy/go-control-plane/pkg/resource/v3"
internalapi "envoy-control-plane/internal/api"
"envoy-control-plane/internal/snapshot"
)
// API holds reference to snapshot manager
type API struct {
Manager *snapshot.SnapshotManager // SnapshotManager is assumed to be defined elsewhere in internal package
}
// NewAPI returns a new REST API handler
func NewAPI(sm *snapshot.SnapshotManager) *API {
return &API{
Manager: sm,
}
}
// RegisterRoutes mounts REST handlers
func (api *API) RegisterRoutes(mux *http.ServeMux) {
// Management Handlers (Add / Remove / Enable / Disable)
// Cluster Handlers
mux.HandleFunc("/add-cluster", func(w http.ResponseWriter, r *http.Request) {
api.addResourceHandler(w, r, resourcev3.ClusterType, func(req interface{}) types.Resource {
cr := req.(*internalapi.AddClusterRequest)
cl, er := snapshot.LoadClusterFromYAML(context.TODO(), cr.YAML)
if er != nil {
http.Error(w, "failed to load cluster", http.StatusBadRequest)
return nil
}
return cl
})
})
mux.HandleFunc("/disable-cluster", func(w http.ResponseWriter, r *http.Request) {
api.disableResourceHandler(w, r, resourcev3.ClusterType)
})
mux.HandleFunc("/enable-cluster", func(w http.ResponseWriter, r *http.Request) {
api.enableResourceHandler(w, r, resourcev3.ClusterType)
})
mux.HandleFunc("/remove-cluster", func(w http.ResponseWriter, r *http.Request) {
api.removeResourceHandler(w, r, resourcev3.ClusterType)
})
// Listener Handlers
mux.HandleFunc("/add-listener", func(w http.ResponseWriter, r *http.Request) {
api.addResourceHandler(w, r, resourcev3.ListenerType, func(req interface{}) types.Resource {
lr := req.(*internalapi.AddListenerRequest)
ls, err := snapshot.LoadListenerFromYAML(context.TODO(), lr.YAML)
if err != nil {
http.Error(w, "failed to load listener", http.StatusBadRequest)
return nil
}
return ls
})
})
mux.HandleFunc("/disable-listener", func(w http.ResponseWriter, r *http.Request) {
api.disableResourceHandler(w, r, resourcev3.ListenerType)
})
mux.HandleFunc("/enable-listener", func(w http.ResponseWriter, r *http.Request) {
api.enableResourceHandler(w, r, resourcev3.ListenerType)
})
mux.HandleFunc("/remove-listener", func(w http.ResponseWriter, r *http.Request) {
api.removeResourceHandler(w, r, resourcev3.ListenerType)
})
mux.HandleFunc("/append-filter-chain", func(w http.ResponseWriter, r *http.Request) {
api.appendFilterChainHandler(w, r)
})
mux.HandleFunc("/update-filter-chain", func(w http.ResponseWriter, r *http.Request) {
api.updateFilterChainHandler(w, r)
})
// Query / List Handlers
mux.HandleFunc("/list-clusters", func(w http.ResponseWriter, r *http.Request) {
api.listResourceHandler(w, r, resourcev3.ClusterType)
})
mux.HandleFunc("/get-cluster", func(w http.ResponseWriter, r *http.Request) {
api.getResourceHandler(w, r, resourcev3.ClusterType)
})
mux.HandleFunc("/list-listeners", func(w http.ResponseWriter, r *http.Request) {
api.listResourceHandler(w, r, resourcev3.ListenerType)
})
mux.HandleFunc("/get-listener", func(w http.ResponseWriter, r *http.Request) {
api.getResourceHandler(w, r, resourcev3.ListenerType)
})
// Persistence Handlers
mux.HandleFunc("/load-from-db", api.loadSnapshotFromDB)
mux.HandleFunc("/flush-to-db", api.flushCacheToDB)
mux.HandleFunc("/load-from-file", api.loadSnapshotFromFile)
mux.HandleFunc("/save-to-file", api.saveSnapshotToFile)
// Consistency Handler
mux.HandleFunc("/is-consistent", api.isConsistentHandler)
}