An admin-controlled scenario that repeats what the operator does by hand: clear the IP queue, scan and enqueue all free Floating IPs, wait until every queued address reaches a terminal state (so results are in the Registry), then wait a configurable interval and start over. - control-api: new auto_cycle singleton table (migration 0008) holding enabled/interval/max-run settings and persisted phase state, so the cycle survives restarts; engine in orchestrator/autocycle.go driven from the existing loop tick with an injectable "now" for deterministic tests. - Interval (default 1h, min 60s) and max wait (default unlimited, timeout outcome) are runtime settings, never hardcoded. - The periodic fip_scan_interval_seconds scan is skipped while the cycle is enabled. An emptied queue mid-cycle counts as finished; stopping during the pause keeps the last cycle's outcome. - API: GET/PUT /api/v1/admin/auto-cycle, POST .../start, POST .../stop. - admin-dashboard: "Автоматический цикл" panel on /settings and an "Автоцикл активен" indicator on /overview. - Tests for db, orchestrator, httpapi and dashboard; run-local-e2e.sh now exercises a full auto cycle; docs updated; bin/ rebuilt with refreshed SHA256SUMS. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
63 lines
3.6 KiB
Go
63 lines
3.6 KiB
Go
package httpapi
|
|
|
|
import "net/http"
|
|
|
|
func (s *Server) routes(mux *http.ServeMux) {
|
|
mux.HandleFunc("GET /healthz", s.handleHealthz)
|
|
|
|
mux.HandleFunc("POST /api/v1/agents/register", s.handleAgentRegister)
|
|
mux.HandleFunc("POST /api/v1/agents/{id}/heartbeat", s.handleAgentHeartbeat)
|
|
mux.HandleFunc("GET /api/v1/agents/{id}/assignment", s.handleAgentAssignment)
|
|
mux.HandleFunc("POST /api/v1/agents/{id}/self-check", s.handleAgentSelfCheck)
|
|
mux.HandleFunc("POST /api/v1/agents/{id}/events", s.handleAgentEvent)
|
|
mux.HandleFunc("POST /api/v1/agents/{id}/results", s.handleAgentResults)
|
|
mux.HandleFunc("POST /api/v1/agents/{id}/complete", s.handleAgentComplete)
|
|
|
|
mux.HandleFunc("POST /api/v1/probers/register", s.handleProberRegister)
|
|
mux.HandleFunc("POST /api/v1/probers/{site_id}/heartbeat", s.handleProberHeartbeat)
|
|
mux.HandleFunc("GET /api/v1/probers/{site_id}/assignments", s.handleProberAssignments)
|
|
mux.HandleFunc("POST /api/v1/probers/{site_id}/results", s.handleProberResults)
|
|
|
|
mux.HandleFunc("GET /api/v1/admin/status", s.handleAdminStatus)
|
|
mux.HandleFunc("GET /api/v1/admin/ips", s.handleAdminIPs)
|
|
mux.HandleFunc("POST /api/v1/admin/ips", s.handleAdminSubmitIPs)
|
|
mux.HandleFunc("POST /api/v1/admin/ips/scan", s.handleAdminScanFloatingIPs)
|
|
mux.HandleFunc("GET /api/v1/admin/ips/{ip}", s.handleAdminIPDetail)
|
|
mux.HandleFunc("POST /api/v1/admin/ips/{ip}/cancel", s.handleAdminCancelIP)
|
|
mux.HandleFunc("DELETE /api/v1/admin/ips/{ip}", s.handleAdminDeleteIP)
|
|
mux.HandleFunc("POST /api/v1/admin/ips/delete", s.handleAdminDeleteIPs)
|
|
mux.HandleFunc("POST /api/v1/admin/ips/clear", s.handleAdminClearQueue)
|
|
mux.HandleFunc("GET /api/v1/admin/validators", s.handleAdminValidators)
|
|
|
|
mux.HandleFunc("GET /api/v1/admin/auto-cycle", s.handleAdminGetAutoCycle)
|
|
mux.HandleFunc("PUT /api/v1/admin/auto-cycle", s.handleAdminPutAutoCycle)
|
|
mux.HandleFunc("POST /api/v1/admin/auto-cycle/start", s.handleAdminStartAutoCycle)
|
|
mux.HandleFunc("POST /api/v1/admin/auto-cycle/stop", s.handleAdminStopAutoCycle)
|
|
|
|
mux.HandleFunc("GET /api/v1/admin/registry", s.handleAdminRegistry)
|
|
mux.HandleFunc("GET /api/v1/admin/registry/{ip}", s.handleAdminRegistryHistory)
|
|
|
|
mux.HandleFunc("GET /api/v1/admin/config/validators", s.handleConfigListValidators)
|
|
mux.HandleFunc("POST /api/v1/admin/config/validators", s.handleConfigCreateValidator)
|
|
mux.HandleFunc("PUT /api/v1/admin/config/validators/{id}", s.handleConfigUpdateValidator)
|
|
mux.HandleFunc("DELETE /api/v1/admin/config/validators/{id}", s.handleConfigDeleteValidator)
|
|
|
|
mux.HandleFunc("GET /api/v1/admin/config/sites", s.handleConfigListSites)
|
|
mux.HandleFunc("PUT /api/v1/admin/config/sites/{index}", s.handleConfigPutSite)
|
|
mux.HandleFunc("DELETE /api/v1/admin/config/sites/{index}", s.handleConfigDeleteSite)
|
|
|
|
mux.HandleFunc("GET /api/v1/admin/config/targets", s.handleConfigListTargets)
|
|
mux.HandleFunc("PUT /api/v1/admin/config/targets/{group}", s.handleConfigPutTargetGroup)
|
|
mux.HandleFunc("DELETE /api/v1/admin/config/targets/{group}", s.handleConfigDeleteTargetGroup)
|
|
|
|
mux.HandleFunc("GET /api/v1/admin/config/check-types", s.handleConfigListCheckTypes)
|
|
mux.HandleFunc("PUT /api/v1/admin/config/check-types/{name}", s.handleConfigPutCheckType)
|
|
mux.HandleFunc("DELETE /api/v1/admin/config/check-types/{name}", s.handleConfigDeleteCheckType)
|
|
|
|
mux.HandleFunc("GET /api/v1/admin/config/orchestrator", s.handleConfigGetOrchestratorSettings)
|
|
mux.HandleFunc("PUT /api/v1/admin/config/orchestrator", s.handleConfigPutOrchestratorSettings)
|
|
|
|
mux.HandleFunc("GET /api/v1/admin/config/inbound-checks", s.handleConfigGetInboundChecks)
|
|
mux.HandleFunc("PUT /api/v1/admin/config/inbound-checks", s.handleConfigPutInboundChecks)
|
|
}
|