Skip to content

Commit 546135d

Browse files
committed
examples: Add OVSDB Server example
This required moving the vswitchd schema to it's own package so it can be used by both play_with_ovs and ovsdb-server. Signed-off-by: Dave Tucker <dave@dtucker.co.uk>
1 parent d17ab7f commit 546135d

File tree

6 files changed

+137
-18
lines changed

6 files changed

+137
-18
lines changed

.gitignore

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,6 @@ _obj
1111
_test
1212
bin
1313

14-
# Generated files
15-
example/play_with_ovs/ovs.ovsschema
16-
example/play_with_ovs/*.go
17-
!example/play_with_ovs/gen.go
18-
!example/play_with_ovs/play_with_ovs.go
19-
2014
# Architecture specific extensions/prefixes
2115
*.[568vq]
2216
[568vq].out
@@ -64,4 +58,6 @@ Temporary Items
6458
### Project-Specific
6559
*.out
6660
*.cov
67-
61+
example/vswitchd/ovs.ovsschema
62+
example/vswitchd/*.go
63+
!example/vswitchd/gen.go

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ prebuild:
66
@echo "+ $@"
77
@mkdir -p bin
88
@go build -v -o ./bin ./cmd/modelgen
9-
@[ -f example/play_with_ovs/ovs.ovsschema ] || curl -o example/play_with_ovs/ovs.ovsschema https://raw.githubusercontent.com/openvswitch/ovs/v2.15.0/vswitchd/vswitch.ovsschema
9+
@[ -f example/vswitchd/ovs.ovsschema ] || curl -o example/vswitchd/ovs.ovsschema https://raw.githubusercontent.com/openvswitch/ovs/v2.15.0/vswitchd/vswitch.ovsschema
1010
@go generate -v ./...
1111

1212
.PHONY: build

example/ovsdb-server/main.go

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"flag"
6+
"fmt"
7+
"log"
8+
"os"
9+
"os/signal"
10+
"path/filepath"
11+
"runtime"
12+
"runtime/pprof"
13+
"time"
14+
15+
"github.com/ovn-org/libovsdb/client"
16+
"github.com/ovn-org/libovsdb/example/vswitchd"
17+
"github.com/ovn-org/libovsdb/model"
18+
"github.com/ovn-org/libovsdb/ovsdb"
19+
"github.com/ovn-org/libovsdb/server"
20+
)
21+
22+
var (
23+
cpuprofile = flag.String("cpuprofile", "", "write cpu profile to this file")
24+
memprofile = flag.String("memoryprofile", "", "write memory profile to this file")
25+
port = flag.Int("port", 56640, "tcp port to listen on")
26+
)
27+
28+
func main() {
29+
flag.Parse()
30+
var err error
31+
if *cpuprofile != "" {
32+
f, err := os.Create(*cpuprofile)
33+
if err != nil {
34+
log.Fatal(err)
35+
}
36+
if err := pprof.StartCPUProfile(f); err != nil {
37+
log.Fatal(err)
38+
}
39+
defer pprof.StopCPUProfile()
40+
}
41+
42+
dbModel, err := vswitchd.FullDatabaseModel()
43+
if err != nil {
44+
log.Fatal(err)
45+
}
46+
wd, err := os.Getwd()
47+
if err != nil {
48+
log.Fatal(err)
49+
}
50+
path := filepath.Join(wd, "vswitchd", "vswitchd.ovsschema")
51+
f, err := os.Open(path)
52+
if err != nil {
53+
log.Fatal(err)
54+
}
55+
schema, err := ovsdb.SchemaFromFile(f)
56+
if err != nil {
57+
log.Fatal(err)
58+
}
59+
60+
ovsDB := server.NewInMemoryDatabase(map[string]*model.DBModel{
61+
schema.Name: dbModel,
62+
})
63+
64+
s, err := server.NewOvsdbServer(ovsDB, server.DatabaseModel{
65+
Model: dbModel,
66+
Schema: schema,
67+
})
68+
if err != nil {
69+
log.Fatal(err)
70+
}
71+
defer s.Close()
72+
73+
sig := make(chan os.Signal, 1)
74+
signal.Notify(sig, os.Interrupt)
75+
76+
go func(o *server.OvsdbServer) {
77+
if err := o.Serve("tcp", fmt.Sprintf(":%d", *port)); err != nil {
78+
log.Fatal(err)
79+
}
80+
}(s)
81+
82+
time.Sleep(1 * time.Second)
83+
c, err := client.NewOVSDBClient(dbModel, client.WithEndpoint(fmt.Sprintf("tcp::%d", *port)))
84+
if err != nil {
85+
log.Fatal(err)
86+
}
87+
88+
err = c.Connect(context.Background())
89+
if err != nil {
90+
log.Fatal(err)
91+
}
92+
ovsRow := &vswitchd.OpenvSwitch{
93+
UUID: "ovs",
94+
}
95+
ovsOps, err := c.Create(ovsRow)
96+
if err != nil {
97+
log.Fatal(err)
98+
}
99+
reply, err := c.Transact(ovsOps...)
100+
if err != nil {
101+
log.Fatal(err)
102+
}
103+
_, err = ovsdb.CheckOperationResults(reply, ovsOps)
104+
if err != nil {
105+
log.Fatal(err)
106+
}
107+
c.Close()
108+
log.Printf("listening on tcp::%d", *port)
109+
<-sig
110+
111+
if *memprofile != "" {
112+
f, err := os.Create(*memprofile)
113+
if err != nil {
114+
log.Fatal(err)
115+
}
116+
defer f.Close()
117+
runtime.GC()
118+
if err := pprof.WriteHeapProfile(f); err != nil {
119+
log.Fatal("could not write memory profile: ", err)
120+
}
121+
}
122+
}

example/play_with_ovs/gen.go

Lines changed: 0 additions & 3 deletions
This file was deleted.

example/play_with_ovs/play_with_ovs.go renamed to example/play_with_ovs/main..go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/ovn-org/libovsdb/cache"
1010
"github.com/ovn-org/libovsdb/client"
11+
"github.com/ovn-org/libovsdb/example/vswitchd"
1112
"github.com/ovn-org/libovsdb/model"
1213
"github.com/ovn-org/libovsdb/ovsdb"
1314
)
@@ -28,14 +29,14 @@ var connection = flag.String("ovsdb", "unix:/var/run/openvswitch/db.sock", "OVSD
2829
func play(ovs client.Client) {
2930
go processInput(ovs)
3031
for model := range update {
31-
bridge := model.(*Bridge)
32+
bridge := model.(*vswitchd.Bridge)
3233
if bridge.Name == "stop" {
3334
fmt.Printf("Bridge stop detected: %+v\n", *bridge)
3435
ovs.Disconnect()
3536
quit <- true
3637
} else {
3738
fmt.Printf("Current list of bridges:\n")
38-
var bridges []Bridge
39+
var bridges []vswitchd.Bridge
3940
if err := ovs.List(&bridges); err != nil {
4041
log.Fatal(err)
4142
}
@@ -47,7 +48,7 @@ func play(ovs client.Client) {
4748
}
4849

4950
func createBridge(ovs client.Client, bridgeName string) {
50-
bridge := Bridge{
51+
bridge := vswitchd.Bridge{
5152
UUID: "gopher",
5253
Name: bridgeName,
5354
}
@@ -56,7 +57,7 @@ func createBridge(ovs client.Client, bridgeName string) {
5657
log.Fatal(err)
5758
}
5859

59-
ovsRow := OpenvSwitch{
60+
ovsRow := vswitchd.OpenvSwitch{
6061
UUID: rootUUID,
6162
}
6263
mutateOps, err := ovs.Where(&ovsRow).Mutate(&ovsRow, model.Mutation{
@@ -97,7 +98,7 @@ func main() {
9798
update = make(chan model.Model)
9899

99100
dbModel, err := model.NewDBModel("Open_vSwitch",
100-
map[string]model.Model{bridgeTable: &Bridge{}, ovsTable: &OpenvSwitch{}})
101+
map[string]model.Model{bridgeTable: &vswitchd.Bridge{}, ovsTable: &vswitchd.OpenvSwitch{}})
101102
if err != nil {
102103
log.Fatal("Unable to create DB model ", err)
103104
}
@@ -120,8 +121,8 @@ func main() {
120121
},
121122
})
122123
_, err = ovs.Monitor(
123-
ovs.NewTableMonitor(&OpenvSwitch{}),
124-
ovs.NewTableMonitor(&Bridge{}),
124+
ovs.NewTableMonitor(&vswitchd.OpenvSwitch{}),
125+
ovs.NewTableMonitor(&vswitchd.Bridge{}),
125126
)
126127
if err != nil {
127128
log.Fatal(err)

example/vswitchd/gen.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package vswitchd
2+
3+
//go:generate ../../bin/modelgen -p vswitchd -o . ovs.ovsschema

0 commit comments

Comments
 (0)