在 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 没有别的...没有&lt;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之四:Maven工具

将另一个关系数据库插入 OpenDS

OpenDaylight 中的 SSH 访问 Netconf 服务器

从零开始学OpenDayLight之基础环境

Worklight 6.2 使用 OpenDS 对 LDAP 进行身份验证

mininet+opendaylight/floodlight+wireshark搭建SDN测试环境