1

我需要在我的 Opendaylight(0.11.x 钠)系统中修改我的 Openflow 配置。我遵循帮助指南的文档

  • 创建新配置
  • 删除配置
  • 替换配置
  • 但我没有看到有关如何修改(或合并)配置的示例或说明。

顶部段落引用了修改配置,但实际上并未显示示例。为了清楚起见,我所说的修改是指合并操作。即,就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 中正确合并/修改配置

4

4 回答 4

2

您对“目标”字段及其功能是正确的。但是,目标字段应仅包含您尝试修改的资源/前缀的名称。

我建议您相应地更改您的流程和目标资源。我的意思是您需要确保流和目标资源指向您尝试配置的相同资源。

它应该是这样的:

PATCH localhost:8181/rests/data/opendaylight-inventory:nodes/node=openflow%3A{{OFID}}/table=0/flow=259/instructions/instruction=0/flow-node-inventory:apply-actions/订单=4

并将目标资源保留为 = /flow-node-inventory:action[flow-node-inventory:order='4']

在流程上尝试 GET 以确认您仅收到您尝试修改/删除的资源。

于 2021-02-26T01:44:44.620 回答
1

尝试在您的 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/.../...

于 2021-02-02T17:50:20.433 回答
1

我尝试使用 RFC 8040 端点执行 yang-patch,但仍然遇到一些问题——看来我无法删除除"/". 这是为了修改 openflow 插件中的流程。

在这里查询一个特定的流程是我得到的:

GET localhost:8181/rests/data/opendaylight-inventory:nodes/node=openflow%3A{{OFID}}/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%3A{{OFID}}/table=0/flow=259/instructions/instruction=0

根据 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}]/AugmentationIdentifier{childNames=[(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 中的最后一个分层元素删除子元素。

不知道我在这里做错了什么——我原以为我可以指定一个目标并相应地执行删除,但我不确定我还需要做什么。

于 2021-02-25T22:34:41.877 回答
0

这看起来是 netconf 编辑操作中全局级配置/节点级配置的问题。ODL 将 netconf RPC 发送到已安装的 netconf 设备。我确定更高版本(11.2 及更高版本)在节点级配置中支持 yang-patch。不知道你用的是哪个版本??

这也可能是您尝试配置的 netconf 设备的问题,如果不支持和启用节点级配置,ODL 可能会收到来自 netconf 响应的错误。

无论哪种方式,检查 ODL 上的 yang-tool 日志都可以让您清楚这一点。您可以在 karaf 上为 yang-tools 启用日志,并可以设置详细的日志。这可以更多地解释这一点。

于 2021-03-07T08:36:31.847 回答