0

我正在创建一个自定义系统,当用户提交 netconfedit-config时,它将在我的系统中启动一组操作,这些操作将自动更改我们系统的配置,然后向用户提交成功或失败的通知。

把它想象成一个大的 SQL 事务,最后要么提交要么回滚。

所以,步骤

  1. 用户提交一个edit-config
  2. 系统接受配置并努力实现此配置
  3. 如果配置成功,则通过竖起大拇指的响应发送(不确定执行此操作的正式方式)
  4. 如果配置失败,则通过不满意的响应发送(我必须确保配置在内部回滚)
  5. 所有这些都是原子完成的。因此,如果用户连续提交两个配置,它们不会相互冲突。

我们实现这一点的工作想法(可能不是最好的想法)是通过接受 来解决这个问题edit-config,然后在 sysrepo 中,我们将使用成功或失败标志编辑部分叶子,它们将与初始变化。我们希望这将使一切保持原子性;通过在会话之外进行编辑,多个配置更改可能会相互冲突。

我们不确定使用纯 netconf 或直接利用 sysrepo 来解决这个问题。我们注意到所有这些为 sysrepo 制作的插件/绑定,并认为这些可以直接用于与我们的数据存储区通信。

但话虽如此,我们的工作想法很可能不是最佳实践方法。实现这一目标的最佳方法是什么?

我们的系统是:

而我们的yang文件是

module rxmbn {
  namespace "urn:com:zug:rxmbn";
  prefix rxmbn;

  container rxmbn-config {
    config true;
    leaf raw {
      type string;
    }
    leaf raw_hashCode {
      type int32;
    }
    leaf odl_last_processed_hashCode {
      type int32;
    }
    leaf processed {
      type boolean;
      default "false";
    }
  }
}

目前我们可以:

  • 对 netoperer 服务器执行编辑配置
  • 我们可以在 sysrepo 数据存储中看到新的配置寄存器
  • 我们可以通过 sysrepo 的 API 捕获 sysrepo 注册数据的时刻

但是我们遇到了问题

  • 在更新会话期间以原子方式编辑数据存储(由于锁定,这是正常的。实际上,如果在更新会话期间无法编辑,那很好,也没有必要。主要目标是下一个项目符号)
  • 以原子方式响应新的编辑配置并响应最终用户

我们对 netconf 和 yang 都有些陌生,所以我确信有一些方法可以通过 netopeer 会话或 sysrepo 来利用notificationapi 或eventapi,只是我们还不够了解。

如果有任何示例或实施建议可以为此创建原子事务,那将非常有用。

4

1 回答 1

1

我对 sysrepo 一无所知,所以这是从 NETCONF 的角度来看的。

NETCONF 以请求-响应的方式在单个会话中串行处理请求,这意味着您在单个 NETCONF 会话中所做的一切都应该已经是“原子的” - 您不能发送两个请求并让它们以相反的顺序或并行应用你做什么。一个表现良好的客户端也会在发送新请求之前等待来自服务器的每个响应,特别是如果所有更新必须成功并按特定顺序执行。该协议还定义了无法取消已发送到服务器的请求的方法。

如果您需要防止其他会话在另一个会话执行多重编辑配置时修改数据存储,您可以使用<lock>NETCONF<unlock>操作来锁定整个数据存储。还有RFC5717和部分锁定,它们只会锁定数据存储的特​​定分支。

使用通知报告成功<edit-config>是非常不寻常的 - 这就是同一会话中的<rpc-reply>内容。<rpc-error>您将使用通知来通知其他会话正在发生的事情。事实上,配置更改有标准的基本通知

我建议在继续之前阅读整个RFC6241 。您应该了解候选数据存储、确认提交等内容。

于 2020-06-15T14:21:36.343 回答