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) }