Browse Source

fix(bridge): sync bridge IP deletions/additions between interface manager and persistent bridge store

Proxmox Router 1 week ago
parent
commit
677efbffa7
2 changed files with 32 additions and 4 deletions
  1. 10 0
      internal/api/api.go
  2. 22 4
      internal/bridge/manager.go

+ 10 - 0
internal/api/api.go

@@ -412,6 +412,11 @@ func (s *Server) handleAddInterfaceIP(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
+	// If this interface is a bridge, also sync to BridgeManager persistent config
+	if s.bridgeMgr != nil {
+		_ = s.bridgeMgr.AddBridgeIP(name, req.IP)
+	}
+
 	writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name, "ip": req.IP})
 }
 
@@ -428,6 +433,11 @@ func (s *Server) handleDeleteInterfaceIP(w http.ResponseWriter, r *http.Request)
 		return
 	}
 
+	// If this interface is a bridge, also delete from BridgeManager persistent config
+	if s.bridgeMgr != nil {
+		_ = s.bridgeMgr.DeleteBridgeIP(name, req.IP)
+	}
+
 	writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name, "ip": req.IP})
 }
 

+ 22 - 4
internal/bridge/manager.go

@@ -208,11 +208,20 @@ func (m *BridgeManager) SetBridgeState(id string, disabled bool) error {
 	return nil
 }
 
-func (m *BridgeManager) AddBridgeIP(id string, ipCIDR string) error {
+func (m *BridgeManager) AddBridgeIP(idOrName string, ipCIDR string) error {
 	m.mu.Lock()
 	defer m.mu.Unlock()
 
-	b, ok := m.bridges[id]
+	b, ok := m.bridges[idOrName]
+	if !ok {
+		for _, br := range m.bridges {
+			if br.Name == idOrName {
+				b = br
+				ok = true
+				break
+			}
+		}
+	}
 	if !ok {
 		return fmt.Errorf("bridge not found")
 	}
@@ -237,11 +246,20 @@ func (m *BridgeManager) AddBridgeIP(id string, ipCIDR string) error {
 	return nil
 }
 
-func (m *BridgeManager) DeleteBridgeIP(id string, ipCIDR string) error {
+func (m *BridgeManager) DeleteBridgeIP(idOrName string, ipCIDR string) error {
 	m.mu.Lock()
 	defer m.mu.Unlock()
 
-	b, ok := m.bridges[id]
+	b, ok := m.bridges[idOrName]
+	if !ok {
+		for _, br := range m.bridges {
+			if br.Name == idOrName {
+				b = br
+				ok = true
+				break
+			}
+		}
+	}
 	if !ok {
 		return fmt.Errorf("bridge not found")
 	}