在 Opendaylight 中修改配置
Posted
技术标签:
【中文标题】在 Opendaylight 中修改配置【英文标题】:Modifying a config in Opendaylight 【发布时间】:2021-03-25 11:28:48 【问题描述】:我需要在我的 Opendaylight(0.11.x 钠)系统中修改我的 Openflow 配置。我关注的documentation 有帮助指导在
创建新配置 删除配置 替换配置 但我没有看到有关如何修改(或合并)配置的示例或说明。上面的段落引用了修改配置,但实际上并未显示示例。为了清楚起见,modification 我的意思是 merge 操作。即,就netconf edit-config RFC-6241 而言,我只想修改配置的一些叶子,但保留旧叶子。
不幸的是,我在 openflow 文档中看到的选项只是创建、删除和替换。我们需要弄清楚如何进行合并。
在进行一些研究时,REST PATCH
命令似乎具有功能,但是我无法让 Opendaylight 使用它。这是我正在尝试的:
PATCH //127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:244354675513412/table/0/flow/105 HTTP/1.1
Content-Type: application/yang.patch+xml
Accept: application/yang.patch+json
Authorization: Basic YWRtaW46YWRtaW4=
User-Agent: PostmanRuntime/7.26.8
Postman-Token: 875a3c91-f6b1-4d21-8f2d-615b3c4b5cdd
Host: 127.0.0.1:8181
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 1233
Cookie: JSESSIONID=node0dqx2exo4lrydz1adjhvc9lum374.node0
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<flow xmlns='urn:opendaylight:flow:inventory' xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
<strict>false</strict>
<id>105</id>
<priority>9</priority>
<table_id>0</table_id>
<hard-timeout>0</hard-timeout>
<idle-timeout>0</idle-timeout>
<flow-name>10dot0SubnetToPort1_from_4</flow-name>
<match>
<ethernet-match>
<ethernet-type>
<type>2048</type>
</ethernet-type>
<ethernet-destination>
<address>FF:FF:29:01:19:61</address>
</ethernet-destination>
<ethernet-source>
<address>00:00:00:11:23:AE</address>
</ethernet-source>
</ethernet-match>
</match>
<instructions>
<instruction>
<order>1</order>
<apply-actions>
<action>
<order>0</order>
<output-action>
<output-node-connector>6</output-node-connector>
<max-length>66</max-length>
</output-action>
</action>
</apply-actions>
</instruction>
</instructions>
</flow>
但我得到的回复是:406 Not Acceptable
没有别的...没有<error...
rpc-response 或任何东西。我也在研究 DEBUG 和 TRACE 模式下的日志文件,无法获得任何关于出现问题的提示。
我还尝试将nc:operation='merge'
粘贴到这样的每个元素...
...
<output-action nc:operation='merge'>
<output-node-connector nc:operation='merge'>6</output-node-connector>
<max-length nc:operation='merge'>66</max-length>
</output-action>
...
但这也会导致相同的406 Not Acceptable
响应。
目标:如何在 OpenDaylight/Openflow 中正确合并/修改配置
【问题讨论】:
【参考方案1】:您对“目标”字段及其功能是正确的。但是,目标字段应该只包含您尝试修改的资源/前缀的名称。
我建议您相应地更改您的流程和目标资源。我的意思是您需要确保流和目标资源指向您尝试配置的相同资源。
应该是这样的:
PATCH localhost:8181/rests/data/opendaylight-inventory:nodes/node=openflow%3AOFID/table=0/flow=259/instructions/instruction=0/flow-node-inventory:apply -actions/order=4
并将目标资源保留为 = /flow-node-inventory:action[flow-node-inventory:order='4']
在流程上尝试 GET 以确认您只接收到您尝试修改/删除的资源。
【讨论】:
【参考方案2】:尝试在您的 karaf shell 上安装“odl-restconf-nb-RFC8040”端点。 ODL 为 restconf 通信提供了两个端点。尽管 RFC-8040 上的文档较少,但 yang-patch 没有给出任何错误。 (YANG-PATCH 允许“创建、删除、插入、合并、移动、替换、删除”操作。可以通过更改此有效负载中的操作来创建、修改和删除配置。https://docs.opendaylight.org/projects/netconf/en/latest/user-guide.html#reconfiguring-an-existing-connector)
RFC-8040 根据此 RFC 定义 YANG-PATCH:https://datatracker.ietf.org/doc/html/draft-ietf-netconf-yang-patch-14#section-2
你的标题看起来不错。
您的 API 将像这样开始:PATCH //127.0.0.1:8181/rests/data/.../...
【讨论】:
感谢您的提示。我和我的同事一直在搞这个插件,我们可以做非常广泛的操作,比如删除整个流程,但我们无法生成精确的补丁来改变流程的各个方面。是否有针对流使用 PATCH 的示例? 很高兴我能帮上忙。有关 OpenDaylight 配置的更多信息是关于他们的 Magnesium(及更高版本)docs.opendaylight.org/projects/netconf/en/latest/…(操作“合并”应该作为客户端的 PATCH)另外添加,RFC 8072(tools.ietf.org/html/rfc8072)中引入的 Yang-PATCH 可能会有所帮助寻找正确的有效载荷。确保使用 API 的 RFC-8040 格式。谢谢你给我的第一个声誉:) 查看威廉的问题 (***.com/a/66377498/1582712) 我们一起工作,他一直在深入研究 PATCH 方法并碰壁。不知道你能不能帮忙?【参考方案3】:我尝试使用 RFC 8040 端点执行 yang-patch,但我仍然遇到一些问题——看来我无法删除除 "/"
以外的值的目标。这是为了修改openflow插件中的流程。
在这里查询一个特定的流程是我得到的:
GET localhost:8181/rests/data/opendaylight-inventory:nodes/node=openflow%3AOFID/table=0/flow=259/instructions/instruction=0
回复:
"flow-node-inventory:instruction": [
"order": 0,
"apply-actions":
"action": [
"order": 4,
"output-action":
"output-node-connector": "2",
"max-length": 60
,
"order": 0,
"set-field":
"ipv4-source": "10.0.0.254/32"
,
"set-nw-src-action":
"ipv4-address": "10.0.0.254/32"
,
"order": 1,
"set-field":
"ipv4-destination": "10.0.0.21/32"
,
"set-nw-dst-action":
"ipv4-address": "10.0.0.21/32"
,
"order": 2,
"output-action":
"output-node-connector": "2",
"max-length": 60
,
"order": 3,
"set-field":
"ipv4-destination": "10.0.0.29/32"
,
"set-nw-dst-action":
"ipv4-address": "10.0.0.29/32"
]
]
这是意料之中的——我已经安装了一个包含特定操作的流程,并且它们已正确列出。
现在,假设我想删除上面带有order=4
的操作。我想我会通过以下方式创建我的请求:
PATCH localhost:8181/rests/data/opendaylight-inventory:nodes/node=openflow%3AOFID/table=0/flow=259/instructions/instruction=0
Content-type 和 accept-types 是根据 yang.patch 要求设置的。
正文:
"ietf-restconf:yang-patch" :
"patch-id" : "0",
"edit" : [
"edit-id" : "edit1",
"operation" : "delete",
"target" : "/flow-node-inventory:apply-actions/flow-node-inventory:action[flow-node-inventory:order='4']"
]
回复:
"ietf-yang-patch:yang-patch-status":
"patch-id": "0",
"edit-status":
"edit": [
"edit-id": "edit1",
"errors":
"error": [
"error-type": "protocol",
"error-tag": "data-missing",
"error-path": "/(urn:opendaylight:inventory?revision=2013-08-19)nodes/node/node[(urn:opendaylight:inventory?revision=2013-08-19)id=openflow:152169965450049]/AugmentationIdentifierchildNames=[(urn:opendaylight:flow:inventory?revision=2013-08-19)description, (urn:opendaylight:flow:inventory?revision=2013-08-19)supported-actions, (urn:opendaylight:flow:inventory?revision=2013-08-19)hardware, (urn:opendaylight:flow:inventory?revision=2013-08-19)switch-features, (urn:opendaylight:flow:inventory?revision=2013-08-19)stale-meter, (urn:opendaylight:flow:inventory?revision=2013-08-19)supported-instructions, (urn:opendaylight:flow:inventory?revision=2013-08-19)meter, (urn:opendaylight:flow:inventory?revision=2013-08-19)serial-number, (urn:opendaylight:flow:inventory?revision=2013-08-19)stale-group, (urn:opendaylight:flow:inventory?revision=2013-08-19)supported-match-types, (urn:opendaylight:flow:inventory?revision=2013-08-19)port-number, (urn:opendaylight:flow:inventory?revision=2013-08-19)table, (urn:opendaylight:flow:inventory?revision=2013-08-19)group, (urn:opendaylight:flow:inventory?revision=2013-08-19)manufacturer, (urn:opendaylight:flow:inventory?revision=2013-08-19)table-features, (urn:opendaylight:flow:inventory?revision=2013-08-19)software, (urn:opendaylight:flow:inventory?revision=2013-08-19)ip-address]/(urn:opendaylight:flow:inventory?revision=2013-08-19)table/table[(urn:opendaylight:flow:inventory?revision=2013-08-19)id=0]/flow/flow[(urn:opendaylight:flow:inventory?revision=2013-08-19)id=259]/instructions/instruction/instruction[(urn:opendaylight:flow:inventory?revision=2013-08-19)order=0]/instruction/apply-actions/action/action[(urn:opendaylight:flow:inventory?revision=2013-08-19)order=4]",
"error-message": "Data does not exist"
]
]
现在,我知道数据存在,但我似乎无法请求删除我在目标中指定的特定元素。实际上,我可以删除特定元素的唯一方法是使用"target" : "/"
,它将根据 URL 中的最后一个分层元素删除子元素。
不确定我在这里做错了什么——我原以为我可以指定一个目标并相应地执行删除,但我不确定我还需要做什么。
【讨论】:
【参考方案4】:这看起来是 netconf 编辑操作中全局级配置/节点级配置的问题。 ODL 将 netconf RPC 发送到已安装的 netconf 设备。我确定更高版本(11.2 及更高版本)在节点级配置中支持 yang-patch。不确定您使用的是哪个版本??
这也可能是您尝试配置的 netconf 设备的问题,如果不支持和启用节点级配置,ODL 可能会收到来自 netconf 响应的错误。
无论哪种方式,检查 ODL 上的 yang-tool 日志都可以让您清楚这一点。您可以在 karaf 上为 yang-tools 启用日志,并可以设置详细的日志。这可以解释更多。
【讨论】:
以上是关于在 Opendaylight 中修改配置的主要内容,如果未能解决你的问题,请参考以下文章
OpenDaylight 中的 SSH 访问 Netconf 服务器