libovsdb 小试

276 阅读4分钟

顾名思义 这是一个操作 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

image.png

2. 大致确定实现方案

image.png

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



生成后

image.png

调整

由于发现基于命令行从 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