vxlan_handlers.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package api
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "debtik/internal/vpn"
  6. )
  7. // ======================== VXLAN Handlers ========================
  8. func (s *Server) handleListVXLAN(w http.ResponseWriter, r *http.Request) {
  9. if s.vpnMgr == nil || s.vpnMgr.VXLAN == nil {
  10. writeJSON(w, http.StatusOK, []*vpn.VXLANInstance{})
  11. return
  12. }
  13. list := s.vpnMgr.VXLAN.List()
  14. writeJSON(w, http.StatusOK, list)
  15. }
  16. func (s *Server) handleSaveVXLAN(w http.ResponseWriter, r *http.Request) {
  17. if s.vpnMgr == nil || s.vpnMgr.VXLAN == nil {
  18. writeError(w, http.StatusServiceUnavailable, "vxlan subsystem unavailable")
  19. return
  20. }
  21. var inst vpn.VXLANInstance
  22. if err := json.NewDecoder(r.Body).Decode(&inst); err != nil {
  23. writeError(w, http.StatusBadRequest, "invalid request body")
  24. return
  25. }
  26. if err := s.vpnMgr.VXLAN.Save(&inst); err != nil {
  27. writeError(w, http.StatusBadRequest, err.Error())
  28. return
  29. }
  30. writeJSON(w, http.StatusOK, map[string]any{
  31. "success": true,
  32. "id": inst.ID,
  33. "name": inst.Name,
  34. "vni": inst.VNI,
  35. "port": inst.Port,
  36. })
  37. }
  38. func (s *Server) handleDeleteVXLAN(w http.ResponseWriter, r *http.Request) {
  39. if s.vpnMgr == nil || s.vpnMgr.VXLAN == nil {
  40. writeError(w, http.StatusServiceUnavailable, "vxlan subsystem unavailable")
  41. return
  42. }
  43. id := r.PathValue("id")
  44. if id == "" {
  45. writeError(w, http.StatusBadRequest, "interface id required")
  46. return
  47. }
  48. if err := s.vpnMgr.VXLAN.Delete(id); err != nil {
  49. writeError(w, http.StatusInternalServerError, err.Error())
  50. return
  51. }
  52. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id})
  53. }
  54. func (s *Server) handleSetVXLANState(w http.ResponseWriter, r *http.Request) {
  55. if s.vpnMgr == nil || s.vpnMgr.VXLAN == nil {
  56. writeError(w, http.StatusServiceUnavailable, "vxlan subsystem unavailable")
  57. return
  58. }
  59. id := r.PathValue("id")
  60. var req struct {
  61. Disabled bool `json:"disabled"`
  62. }
  63. _ = json.NewDecoder(r.Body).Decode(&req)
  64. if err := s.vpnMgr.VXLAN.SetState(id, req.Disabled); err != nil {
  65. writeError(w, http.StatusInternalServerError, err.Error())
  66. return
  67. }
  68. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id, "disabled": req.Disabled})
  69. }
  70. // ======================== VXLAN VTEP Handlers ========================
  71. func (s *Server) handleListVXLANVteps(w http.ResponseWriter, r *http.Request) {
  72. if s.vpnMgr == nil || s.vpnMgr.VXLAN == nil {
  73. writeJSON(w, http.StatusOK, []*vpn.VXLANVtep{})
  74. return
  75. }
  76. filterIface := r.URL.Query().Get("interface")
  77. list := s.vpnMgr.VXLAN.ListVteps(filterIface)
  78. writeJSON(w, http.StatusOK, list)
  79. }
  80. func (s *Server) handleSaveVXLANVtep(w http.ResponseWriter, r *http.Request) {
  81. if s.vpnMgr == nil || s.vpnMgr.VXLAN == nil {
  82. writeError(w, http.StatusServiceUnavailable, "vxlan subsystem unavailable")
  83. return
  84. }
  85. var vtep vpn.VXLANVtep
  86. if err := json.NewDecoder(r.Body).Decode(&vtep); err != nil {
  87. writeError(w, http.StatusBadRequest, "invalid request body")
  88. return
  89. }
  90. if vtep.Interface == "" {
  91. writeError(w, http.StatusBadRequest, "interface is required")
  92. return
  93. }
  94. if vtep.RemoteIP == "" {
  95. writeError(w, http.StatusBadRequest, "remote_ip is required")
  96. return
  97. }
  98. if err := s.vpnMgr.VXLAN.AddVtep(vtep.Interface, &vtep); err != nil {
  99. writeError(w, http.StatusBadRequest, err.Error())
  100. return
  101. }
  102. writeJSON(w, http.StatusOK, map[string]any{
  103. "success": true,
  104. "id": vtep.ID,
  105. "interface": vtep.Interface,
  106. "remote_ip": vtep.RemoteIP,
  107. "port": vtep.Port,
  108. })
  109. }
  110. func (s *Server) handleDeleteVXLANVtep(w http.ResponseWriter, r *http.Request) {
  111. if s.vpnMgr == nil || s.vpnMgr.VXLAN == nil {
  112. writeError(w, http.StatusServiceUnavailable, "vxlan subsystem unavailable")
  113. return
  114. }
  115. id := r.PathValue("id")
  116. vtepid := r.PathValue("vtepid")
  117. if id == "" || vtepid == "" {
  118. writeError(w, http.StatusBadRequest, "interface id and vtepid required")
  119. return
  120. }
  121. if err := s.vpnMgr.VXLAN.DeleteVtep(id, vtepid); err != nil {
  122. writeError(w, http.StatusInternalServerError, err.Error())
  123. return
  124. }
  125. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id, "vtepid": vtepid})
  126. }