1. 简介
Honeycomb 是基于 Java 开发的一个数据平面管理代理 (Data Plane Management Agent) 框架,为 VPP 提供了 RESTCONF 和 NETCONF 的北向接口,实现了VPP与SND控制器 (ODL)的集成。关于 Honeycomb 请参考Hc2vpp 项目,Hc2vpp 项目曾经是 Honeycomb 项目的一部分,在1.17.01版本中 Honeycomb 项目分解为generic (honeycomb) 和 与 vpp 相关的部分(Hc2vpp)。
2. Honeycomb 与 VPP
Honeycomb 使用了高性能共享内存接口与 VPP 进行对接,并向 ODL 提供由 YANG 模型定义的 RESTCONF 和 NETCONF 北向接口。因此,Honeycomb 实际上是由 ODL 的一些模块和工具建立的框架,包括:YangTools、MD-SAL、Netconf和Restconf。
Honeycomb 的核心功能主要提现在数据处理层 (Data processing layer) 和转换层 (Translation layer) 上。
数据处理层实现了 OLD 中用于数据事务处理操作的 DataBroker 接口,由于与实现语言无关,且仅使用 DOM 类型的 YANG 模型结构表示。这使得其具有通用性,因为不依赖于 YANG 模型生成的代码,所以也称其为绑定独立(BI, Binding-Independent) 。除此之外,数据处理层很容易与 ODL 的 NETCONF 和 RESTCONF 北向服务器进行连接。转换层提供了 Honeycomb 自定义的接口,使用了绑定感知 (BA, Binding-Aware) 的YANG 模型结构生成的 Java 代码实例。
Honeycomb 需要 VPP 的接口才能实现调用。因此,VPP 提供了底层的共享内存接口,而 VPP 之上的 JVpp 提供了适用于 Java 的接口。JVpp 是基于 JNI 的,借助 VPP 接口,从而使任何 JVM 程序都可以监管 VPP。
下图展示了 Honeycomb 的内部结构:**
Honeycomb 的配置写入过程如下图所示:
Honeycomb 的操作读取过程如下图所示:
3. 安装
Installing from available binary packages
Installing from available archives
官方提供了 honeycomb 的压缩文件,在 Honeycomb’s nexus 服务中找到 vpp-integration-distribution ,然后下载 .zip 或 .tar.gz 压缩文件。 解压之后,进入目录 vpp-integration-distribution-
4. 启动
(1) 如果是下载的 honeycomb 的压缩文件,可以直接解压并运行包中脚本即可,这种方式启动 honeycomb 将会自动初始化 JVpp。
# 进入相应版本的目录中
sudo ./vpp-integration-distribution-<version>/honeycomb
(2) 如果是采用RPM或者DEB包安装的方式,可以通过如下方式启动:
# honeycomb 在 /opt/honeycomb 目录中
sudo service vpp start
sudo service honeycomb start
成功启动会输出日志:
2020-07-21 14:34:48.831 CST [main] INFO i.f.h.i.d.i.InitializerRegistryAdapter - Config initialization started
2020-07-21 14:34:48.858 CST [netconf-netty-1] INFO o.o.n.ssh.NetconfNorthboundSshServer - Netconf SSH endpoint started successfully at 0.0.0.0
2020-07-21 14:34:48.890 CST [main] INFO i.f.h.i.d.i.InitializerRegistryAdapter - Persisted context restored successfully
2020-07-21 14:34:50.001 CST [main] INFO i.f.h.i.d.i.InitializerRegistryAdapter - Configuration initialized successfully
2020-07-21 14:34:50.016 CST [main] INFO i.f.h.i.d.i.InitializerRegistryAdapter - Persisted configuration restored successfully
2020-07-21 14:34:50.016 CST [main] INFO i.f.h.i.d.i.InitializerRegistryAdapter - Honeycomb initialized
2020-07-21 14:34:50.016 CST [main] INFO io.fd.honeycomb.infra.distro.Main - Configuration initialized successfully
2020-07-21 14:34:50.016 CST [main] INFO io.fd.honeycomb.infra.distro.Main - Honeycomb started successfully!
5. 测试
(1) 通过如下方式,使用SSH测试其NETCONF北向接口是否能够调用NETCONF用户/密码默认为 admin/admin,端口号为2831,其配置在 vpp-integration-distribution-
ssh admin@localhost -p 2831 -s netconf
(2) 接下来通过 hello 初始化 NETCONF 会话,将下面的代码复制到 SSH 会话中,然后回车即可,这一步是没有任何响应的。
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
</capabilities>
</hello>
]]>]]>
(3) 和上一步相同,这一步会获取到所有的VPP配置信息。
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="101">
<get-config>
<source>
<running/>
</source>
</get-config>
</rpc>
]]>]]>
(4) 该步骤能够获取到VPP的所有可操作数据。
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="101">
<get/>
</rpc>
]]>]]>
(5) honeycomb 也支持 Notifications/NETCONF,通过下面的代码测试该功能。
<netconf:rpc netconf:message-id="101" xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0">
<create-subscription xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
<stream>honeycomb</stream>
</create-subscription>
</netconf:rpc>
]]>]]>
(6) VPP的接口状态可以使用以下命令进行修改:
telnet 0 5002
set interface state local0 up
6. 使用示例
- Honeycomb plugin overview
- How to write Honeycomb plugins
- How to write Honeycomb plugins for VPP
- Interface managmenet sample from Honeycomb
7. 相关链接
- Honeycomb Gerrit 仓库地址:https://gerrit.fd.io/r/admin/repos/honeycomb
- Honeycomb 官方Wiki :https://wiki.fd.io/view/Honeycomb
- Hc2vpp 官方Wiki :https://wiki.fd.io/view/Hc2vpp
- Honeycomb 1.16.12-SNAPSHOT Release note:https://docs.fd.io/honeycomb/1.16.12-SNAPSHOT/release-notes-aggregator/release_notes.html
- https://docs.fd.io/honeycomb/
- 运行 Honeycomb
- CSDN— vpp honeycomb 总结
Cisco VPP入门(一)——VPP源码编译与安装
Cisco VPP入门(二)—— VPP源码目录介绍
Cisco VPP入门(三)——VPP启动配置及常用命令
Cisco VPP入门(四)——VPP示例插件编译运行
VPP专栏