顾名思义 这是一个操作 ovs db 的库。 那么 ovs db 有: ovs db, ovn nb db, sb db
如何使用 ???
libovsdb 可以基于 ovs db schema 生成 model,用于进行 ORM 层 CRUD 编码, 甚至包括 某类数据的 监控(monitor)。
1. ovn ovs schema
# ovn git:(main) ls -a | grep ovsschema
# ovn 的 schema
ovn-ic-nb.ovsschema
ovn-ic-sb.ovsschema
ovn-nb.ovsschema
ovn-sb.ovsschema
# 当然还有另外两个 ovs 的 schema
## https://github.com/ovn-org/libovsdb/blob/main/Makefile
ovsdb/serverdb/_server.ovsschema:
@curl -sSL https://raw.githubusercontent.com/openvswitch/ovs/${OVS_VERSION}/ovsdb/_server.ovsschema -o $@
example/vswitchd/ovs.ovsschema:
@curl -sSL https://raw.githubusercontent.com/openvswitch/ovs/${OVS_VERSION}/vswitchd/vswitch.ovsschema -o $@
ic 用于多 AZ 场景的内联
目前 kube-ovn 已经完成了 ovn-nb.ovsschema 的 libovsdb 的集成, ovn-sb.ovsschema 尚未实现。
(vv) ➜ kube-ovn git:(master) grep ovn-nb.ovsschema -r
./pkg/ovs/ovn-nb.go:// reference to ovn-nb.ovsschema(ovsdb-client get-schema unix:/var/run/ovn/ovnnb_db.sock OVN_Northbound) for more information,
(vv) ➜ kube-ovn git:(master) grep ovn-sb.ovsschema -r
2. 大致确定实现方案
2.1 尝试构建 ovn sb model
## modelgen
go install github.com/ovn-org/libovsdb/cmd/modelgen
构建一个 kube-ovn kind 集群,用于获取当前正在用的版本的 schema 文件
# 获取 nb
root@kube-ovn-control-plane:/kube-ovn# ovsdb-client list-dbs "tcp:172.18.0.3:6641"
Local_Config
OVN_Northbound
_Server
ovsdb-client get-schema "tcp:172.18.0.3:6641" OVN_Northbound > test/ovs-nb.ovsschema
# 获取 sb
root@kube-ovn-control-plane:/kube-ovn# ovsdb-client list-dbs "tcp:172.18.0.3:6642"
Local_Config
OVN_Southbound
_Server
ovsdb-client get-schema "tcp:172.18.0.3:6642" OVN_Southbound > test/ovs-sb.ovsschema
# 获取 Open_vSwitch 无需指定 ip 也可以获取
root@kube-ovn-control-plane:/kube-ovn# ovsdb-client list-dbs
Open_vSwitch
_Server
尝试生成
(.venv) root@empty:~/test-libovsdb# pwd
/root/test-libovsdb
(.venv) root@empty:~/test-libovsdb#
(.venv) root@empty:~/test-libovsdb# ls -l
total 32
-rw-r--r-- 1 root root 14411 8月 4 16:25 ovs-nb.ovsschema
-rw-r--r-- 1 root root 13502 8月 4 16:25 ovs-sb.ovsschema
执行
mkdir ovssb
# 注意 modelgen 不支持 中划线,比如 ovs-sb
# 官网指导的这个生成 感觉手动测试不是很方便
cat <<EOF > ovssb/gen.go
package mypackage
// go:generate modelgen -p ovssb -o . ../ovs-sb.ovsschema
EOF
go generate ./...
# 直接基于命令生成 更为方便
cd ovssb
modelgen -p ovssb -o . ../ovs-sb.ovsschema
(.venv) root@empty:~/test-libovsdb/ovssb# modelgen -p ovssb -o . ../ovs-sb.ovsschema
(.venv) root@empty:~/test-libovsdb/ovssb# ll
total 180
drwxr-xr-x 2 root root 4096 8月 4 17:12 ./
drwxr-xr-x 3 root root 4096 8月 4 17:12 ../
-rw-r--r-- 1 root root 303 8月 4 17:12 address_set.go
-rw-r--r-- 1 root root 899 8月 4 17:12 bfd.go
-rw-r--r-- 1 root root 714 8月 4 17:12 chassis.go
-rw-r--r-- 1 root root 532 8月 4 17:12 chassis_private.go
-rw-r--r-- 1 root root 375 8月 4 17:12 chassis_template_var.go
-rw-r--r-- 1 root root 743 8月 4 17:12 connection.go
-rw-r--r-- 1 root root 633 8月 4 17:12 controller_event.go
-rw-r--r-- 1 root root 434 8月 4 17:12 datapath_binding.go
-rw-r--r-- 1 root root 896 8月 4 17:12 dhcp_options.go
-rw-r--r-- 1 root root 559 8月 4 17:12 dhcpv6_options.go
-rw-r--r-- 1 root root 356 8月 4 17:12 dns.go
-rw-r--r-- 1 root root 554 8月 4 17:12 encap.go
-rw-r--r-- 1 root root 285 8月 4 17:12 fdb.go
-rw-r--r-- 1 root root 507 8月 4 17:12 gateway_chassis.go
-rw-r--r-- 1 root root 387 8月 4 17:12 ha_chassis.go
-rw-r--r-- 1 root root 466 8月 4 17:12 ha_chassis_group.go
-rw-r--r-- 1 root root 369 8月 4 17:12 igmp_group.go
-rw-r--r-- 1 root root 697 8月 4 17:12 ip_multicast.go
-rw-r--r-- 1 root root 865 8月 4 17:12 load_balancer.go
-rw-r--r-- 1 root root 290 8月 4 17:12 logical_dp_group.go
-rw-r--r-- 1 root root 998 8月 4 17:12 logical_flow.go
-rw-r--r-- 1 root root 417 8月 4 17:12 mac_binding.go
-rw-r--r-- 1 root root 455 8月 4 17:12 meter_band.go
-rw-r--r-- 1 root root 405 8月 4 17:12 meter.go
-rw-r--r-- 1 root root 760 8月 4 17:12 mirror.go
-rw-r--r-- 1 root root 36138 8月 4 17:12 model.go
-rw-r--r-- 1 root root 399 8月 4 17:12 multicast_group.go
-rw-r--r-- 1 root root 1759 8月 4 17:12 port_binding.go
-rw-r--r-- 1 root root 282 8月 4 17:12 port_group.go
-rw-r--r-- 1 root root 429 8月 4 17:12 rbac_permission.go
-rw-r--r-- 1 root root 328 8月 4 17:12 rbac_role.go
-rw-r--r-- 1 root root 525 8月 4 17:12 sb_global.go
-rw-r--r-- 1 root root 1155 8月 4 17:12 service_monitor.go
-rw-r--r-- 1 root root 610 8月 4 17:12 ssl.go
-rw-r--r-- 1 root root 502 8月 4 17:12 static_mac_binding.go
(.venv) root@empty:~/test-libovsdb/ovssb#
生成前
(.venv) root@empty:~# tree test-libovsdb/
test-libovsdb/
├── ovs-nb.ovsschema
├── ovs-sb
│ └── gen.go
└── ovs-sb.ovsschema
生成后
调整
由于发现基于命令行从 kube-ovn-cni 获取的 model文件有些不同,所以基于ovn 指定版本的 schema 直接生成
git clone -b branch-22.12 --depth=1 https://github.com/ovn-org/ovn.git
# 找到 ovn-sb.ovsschema
cd ovnsb
modelgen -p ovnsb -o . ../ovn-sb.ovsschema
# tree
(.venv) root@empty:~/feat/branch-22.12# tree
.
├── ovnsb
│ ├── address_set.go
│ ├── bfd.go
│ ├── chassis.go
│ ├── chassis_private.go
│ ├── chassis_template_var.go
│ ├── connection.go
│ ├── controller_event.go
│ ├── datapath_binding.go
│ ├── dhcp_options.go
│ ├── dhcpv6_options.go
│ ├── dns.go
│ ├── encap.go
│ ├── fdb.go
│ ├── gateway_chassis.go
│ ├── ha_chassis.go
│ ├── ha_chassis_group.go
│ ├── igmp_group.go
│ ├── ip_multicast.go
│ ├── load_balancer.go
│ ├── logical_dp_group.go
│ ├── logical_flow.go
│ ├── mac_binding.go
│ ├── meter_band.go
│ ├── meter.go
│ ├── mirror.go
│ ├── model.go
│ ├── multicast_group.go
│ ├── port_binding.go
│ ├── port_group.go
│ ├── rbac_permission.go
│ ├── rbac_role.go
│ ├── sb_global.go
│ ├── service_monitor.go
│ ├── ssl.go
│ └── static_mac_binding.go
└── ovn-sb.ovsschema
3.1 构建 ovs model
先获取 ovs schema
# 选择当前在用版本
# 下载 libovsdb Makefile中的
ovsdb/serverdb/_server.ovsschema:
@curl -sSL https://raw.githubusercontent.com/openvswitch/ovs/${OVS_VERSION}/ovsdb/_server.ovsschema -o $@
example/vswitchd/ovs.ovsschema:
@curl -sSL https://raw.githubusercontent.com/openvswitch/ovs/${OVS_VERSION}/vswitchd/vswitch.ovsschema -o $@
# 然后放到一个自定义目录下,分别建立以下子目录并执行
~ tree ovsmodel
ovsmodel
├── ovsdbserver
│ ├── database.go
│ └── model.go
├── ovs.ovsschema
├── _server.ovsschema
└── vswitchd
├── autoattach.go
├── bridge.go
├── controller.go
├── ct_timeout_policy.go
├── ct_zone.go
├── datapath.go
├── flow_sample_collector_set.go
├── flow_table.go
├── interface.go
├── ipfix.go
├── manager.go
├── mirror.go
├── model.go
├── netflow.go
├── open_vswitch.go
├── port.go
├── qos.go
├── queue.go
├── sflow.go
└── ssl.go
3 directories, 24 files
# 以上 model 基于如下命令生成
cd vswitchd
modelgen -p vswitchd -o . ../ovs.ovsschema
cd ovsdbserver
modelgen -p ovsdbserver -o . ../_server.ovsschema