diff --git a/pkg/collector/api/server/cluster.go b/pkg/collector/api/server/cluster.go index 2601a7b8..961c1c92 100644 --- a/pkg/collector/api/server/cluster.go +++ b/pkg/collector/api/server/cluster.go @@ -29,6 +29,17 @@ type clusterMember struct { LockedTargets []string `json:"locked-targets,omitempty"` } +func (s *Server) requireClustering(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if s.locker == nil { + w.WriteHeader(http.StatusServiceUnavailable) + json.NewEncoder(w).Encode(APIErrors{Errors: []string{"clustering is not enabled"}}) + return + } + next.ServeHTTP(w, r) + }) +} + func (s *Server) handleClusteringGet(w http.ResponseWriter, r *http.Request) { // clusteringResponse clusteringCfg, ok, err := s.store.Config.Get("clustering", "clustering") diff --git a/pkg/collector/api/server/routes.go b/pkg/collector/api/server/routes.go index 0ed42864..1dd89e80 100644 --- a/pkg/collector/api/server/routes.go +++ b/pkg/collector/api/server/routes.go @@ -33,13 +33,15 @@ func (s *Server) adminRoutes(r *mux.Router) { } func (s *Server) clusterRoutes(r *mux.Router) { - r.HandleFunc("/cluster", s.handleClusteringGet).Methods(http.MethodGet) - r.HandleFunc("/cluster/rebalance", s.handleClusterRebalance).Methods(http.MethodPost) - r.HandleFunc("/cluster/leader", s.handleClusteringLeaderGet).Methods(http.MethodGet) - r.HandleFunc("/cluster/leader", s.handleClusteringLeaderDelete).Methods(http.MethodDelete) - r.HandleFunc("/cluster/members", s.handleClusteringMembersGet).Methods(http.MethodGet) - r.HandleFunc("/cluster/members/{id}/drain", s.handleClusteringDrainInstance).Methods(http.MethodPost) - r.HandleFunc("/cluster/move", s.handleClusterMove).Methods(http.MethodPost) // TODO: implement move target + cluster := r.PathPrefix("/cluster").Subrouter() + cluster.Use(s.requireClustering) + cluster.HandleFunc("", s.handleClusteringGet).Methods(http.MethodGet) + cluster.HandleFunc("/rebalance", s.handleClusterRebalance).Methods(http.MethodPost) + cluster.HandleFunc("/leader", s.handleClusteringLeaderGet).Methods(http.MethodGet) + cluster.HandleFunc("/leader", s.handleClusteringLeaderDelete).Methods(http.MethodDelete) + cluster.HandleFunc("/members", s.handleClusteringMembersGet).Methods(http.MethodGet) + cluster.HandleFunc("/members/{id}/drain", s.handleClusteringDrainInstance).Methods(http.MethodPost) + cluster.HandleFunc("/move", s.handleClusterMove).Methods(http.MethodPost) } func (s *Server) configRoutes(r *mux.Router) {