ODL中配置库添加的流未在操作库显示,请求排查问题原因
排查ODL Config有流但Operational无对应流的问题
嘿,这个场景我在做ODL OpenFlow项目的时候踩过好几次坑,咱们一步步拆解可能的原因和排查方法:
核心逻辑先明确
首先得记住ODL里两个datastore的区别:
- Config datastore:存的是你想要下发的「意图配置」,不管设备能不能生效,只要格式合法就能存进去
- Operational datastore:存的是设备上「实际生效」的配置,只有当ODL把config里的规则成功下发到设备,且设备确认接收后,才会同步到这里
所以问题本质是:你的流规则没有从Config成功同步到设备,或者同步后设备没反馈给ODL。
具体排查方向
1. 设备连接状态异常
如果ODL和设备之间的OpenFlow会话断了,或者会话不稳定,流根本发不出去。
- 先在ODL的Karaf控制台里执行
openflow:show-flows(如果装了openflowplugin),看看能不能看到目标设备的信息; - 查看Karaf日志(
log:tail),搜设备的DPID,有没有Session closed或者Connection refused这类错误; - 直接登录设备,用
ovs-ofctl show <bridge-name>(如果是OVS)确认设备和ODL的控制器连接是否正常。
2. 流规则格式/参数不合法
ODL接收了你的配置(所以Config里有),但下发给设备时被拒绝了。
- 检查流的匹配字段:比如是不是指定了设备不存在的端口号、VLAN ID,或者用了设备不支持的匹配项(比如某些老设备不支持IPv6匹配);
- 检查动作字段:比如
output动作的端口是不是LOCAL或者设备实际存在的端口,有没有用设备不支持的动作(比如set-field的某些参数); - 看Karaf日志里的错误信息,通常会明确指出流规则被拒绝的原因,比如
Flow mod failed: BAD_ACTION。
3. 配置提交的路径错误
你可能把流存在了错误的Yang模型路径下,ODL根本不会把这个路径的配置下发到设备。
- 正确的流配置路径应该是:
确认你POST/PUT的路径是不是符合这个格式,有没有写错命名空间(比如漏了/restconf/config/opendaylight-inventory:nodes/node/{node-id}/table/{table-id}/flow/{flow-id}opendaylight-inventory:)。
4. OpenFlow版本兼容性问题
ODL的openflowplugin版本和设备的OpenFlow版本不匹配,导致下发失败。
- 比如你用ODL Neon版本的openflowplugin(默认支持OF13),但设备只开了OF10,这时候流下发会失败;
- 在Karaf里执行
feature:list | grep openflow确认插件版本,同时在设备上用ovs-vsctl set bridge <bridge> protocols=OpenFlow13(如果是OVS)调整协议版本。
5. Operational Datastore刷新延迟
有时候不是没同步,而是ODL的Operational datastore刷新有延迟。
- 等个10-15秒再重新GET Operational的流;
- 可以手动触发同步,执行RESTCONF请求:
(注意需要有对应的权限,且ODL版本支持这个操作)POST /restconf/operations/opendaylight-inventory:refresh-operational
快速验证步骤
- 先确认Config里的流内容和路径完全正确;
- 查设备上有没有这个流(用设备自身的命令);
- 查ODL日志有没有流下发相关的错误;
- 确认设备和ODL的会话正常。
内容的提问来源于stack exchange,提问作者Juan Andrés Martinez




