我正在使用Oendaylight(碳)来开发一个SDN应用程序,该应用程序由连接到控制器的多个开关组成 . 我希望能够在连接时在不同的交换机上部署不同的应用程序 . 我怎么指定这个?例如,当openflow:1连接时,我想在其上部署L2交换机,当openflow:2连接时,我想在其上部署不同的应用程序 . 谢谢 .
首先,您不要在交换机上部署应用程序 . 应用程序在控制器上运行,您可以添加仅对所选开关进行编程的逻辑 .
你最本想做的是反应式编程;等待事件并采取相应行动 . 这可以通过将事件侦听器挂钩到应用程序的YANG模型中的节点来轻松实现 . 然后,这些节点中的任何更改都将通知您的应用程序,然后可以执行选择性网络编程 .
在上面提到的示例中,您将需要使用“InstanceIdentifier”对象来标识您有兴趣收听哪些数据模型的事件 .
InstanceIdentifier<Node> nodeID = InstanceIdentifier.builder(Nodes.class).child(Node.class, new NodeKey(node.getId())) .augmentation(FlowCapableNode.class) .build();
现在只需使用DataBroker对象的registerDataChangeListener方法将侦听器注册到此IID .
db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, nodeID, this, AsyncDataBroker.DataChangeScope.SUBTREE);
此时,您将收到有关已注册的交换机的任何更新(添加/修改/删除)的通知 .
最后要捕获事件使用/覆盖DataChangeListener接口的onDataChanged方法并添加你的花哨逻辑 .
类似的逻辑可以细粒度地监听交换机上特定流表,流规则等上的活动 .
1 回答
首先,您不要在交换机上部署应用程序 . 应用程序在控制器上运行,您可以添加仅对所选开关进行编程的逻辑 .
你最本想做的是反应式编程;等待事件并采取相应行动 . 这可以通过将事件侦听器挂钩到应用程序的YANG模型中的节点来轻松实现 . 然后,这些节点中的任何更改都将通知您的应用程序,然后可以执行选择性网络编程 .
在上面提到的示例中,您将需要使用“InstanceIdentifier”对象来标识您有兴趣收听哪些数据模型的事件 .
现在只需使用DataBroker对象的registerDataChangeListener方法将侦听器注册到此IID .
此时,您将收到有关已注册的交换机的任何更新(添加/修改/删除)的通知 .
最后要捕获事件使用/覆盖DataChangeListener接口的onDataChanged方法并添加你的花哨逻辑 .
类似的逻辑可以细粒度地监听交换机上特定流表,流规则等上的活动 .