Skip to content

Commit 18872c7

Browse files
committed
incusd/network/ovn: Implement OVN SB event handlers
Signed-off-by: Stéphane Graber <[email protected]> Sponsored-by: Luizalabs (https://luizalabs.com)
1 parent 9910d3e commit 18872c7

File tree

3 files changed

+101
-0
lines changed

3 files changed

+101
-0
lines changed

internal/server/network/ovn/events.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package ovn
2+
3+
import (
4+
ovsdbModel "github.com/ovn-org/libovsdb/model"
5+
)
6+
7+
// EventHandler represents an OVN database event handler.
8+
type EventHandler struct {
9+
// Tables contains the list of OVN database tables to watch for events.
10+
Tables []string
11+
12+
// Hook is the function being called on a matching event.
13+
Hook func(action string, table string, oldObject ovsdbModel.Model, newObject ovsdbModel.Model)
14+
}

internal/server/network/ovn/ovn_sb.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@ import (
77
"encoding/pem"
88
"fmt"
99
"runtime"
10+
"slices"
1011
"strings"
1112
"time"
1213

1314
"github.com/cenkalti/backoff/v4"
1415
"github.com/go-logr/logr"
16+
ovsdbCache "github.com/ovn-org/libovsdb/cache"
1517
ovsdbClient "github.com/ovn-org/libovsdb/client"
18+
ovsdbModel "github.com/ovn-org/libovsdb/model"
1619

1720
ovnSB "github.com/lxc/incus/v6/internal/server/network/ovn/schema/ovn-sb"
1821
)
@@ -137,6 +140,55 @@ func NewSB(dbAddr string, sslCACert string, sslClientCert string, sslClientKey s
137140
return nil, err
138141
}
139142

143+
// Set up event handlers.
144+
eventHandler := &ovsdbCache.EventHandlerFuncs{}
145+
eventHandler.AddFunc = func(table string, newModel ovsdbModel.Model) {
146+
sbEventHandlersMu.Lock()
147+
defer sbEventHandlersMu.Unlock()
148+
149+
if sbEventHandlers == nil {
150+
return
151+
}
152+
153+
for _, handler := range sbEventHandlers {
154+
if handler.Hook != nil && slices.Contains(handler.Tables, table) {
155+
go handler.Hook("add", table, nil, newModel)
156+
}
157+
}
158+
}
159+
160+
eventHandler.UpdateFunc = func(table string, oldModel ovsdbModel.Model, newModel ovsdbModel.Model) {
161+
sbEventHandlersMu.Lock()
162+
defer sbEventHandlersMu.Unlock()
163+
164+
if sbEventHandlers == nil {
165+
return
166+
}
167+
168+
for _, handler := range sbEventHandlers {
169+
if handler.Hook != nil && slices.Contains(handler.Tables, table) {
170+
go handler.Hook("update", table, oldModel, newModel)
171+
}
172+
}
173+
}
174+
175+
eventHandler.DeleteFunc = func(table string, oldModel ovsdbModel.Model) {
176+
sbEventHandlersMu.Lock()
177+
defer sbEventHandlersMu.Unlock()
178+
179+
if sbEventHandlers == nil {
180+
return
181+
}
182+
183+
for _, handler := range sbEventHandlers {
184+
if handler.Hook != nil && slices.Contains(handler.Tables, table) {
185+
go handler.Hook("remove", table, oldModel, nil)
186+
}
187+
}
188+
}
189+
190+
ovn.Cache().AddEventHandler(eventHandler)
191+
140192
// Create the SB struct.
141193
client := &SB{
142194
client: ovn,
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package ovn
2+
3+
import (
4+
"sync"
5+
)
6+
7+
var sbEventHandlers map[string]EventHandler
8+
var sbEventHandlersMu sync.Mutex
9+
10+
// AddOVNSBHandler registers a new event handler with the OVN Southbound database.
11+
func AddOVNSBHandler(name string, handler EventHandler) error {
12+
sbEventHandlersMu.Lock()
13+
defer sbEventHandlersMu.Unlock()
14+
15+
if sbEventHandlers == nil {
16+
sbEventHandlers = map[string]EventHandler{}
17+
}
18+
19+
sbEventHandlers[name] = handler
20+
21+
return nil
22+
}
23+
24+
func RemoveOVNSBHandler(name string) error {
25+
sbEventHandlersMu.Lock()
26+
defer sbEventHandlersMu.Unlock()
27+
28+
if sbEventHandlers == nil {
29+
return nil
30+
}
31+
32+
delete(sbEventHandlers, name)
33+
34+
return nil
35+
}

0 commit comments

Comments
 (0)