【问题标题】:Opendaylight flow notificationOpendaylight 流量通知
【发布时间】:2016-02-16 10:55:04
【问题描述】:

我正在编写一个 Opendaylight 应用程序,它将在删除、添加或更新时提取所有流规则。

要在添加、删除或更新流时获取通知,应用程序应提供一个扩展了 salFlowListener 接口的侦听器。 但是,当我创建应用程序目录结构时,从 Opendaylight 在线教程中并不清楚逻辑要放在哪里。

此外,使用 YANG 模型扩充通知服务时会出现编译错误。

这是获取通知的正确方法吗?我可以参考任何清晰的在线教程吗?

谢谢。

【问题讨论】:

  • 您能更好地解释一下您的目标吗?您使用的是哪个 Opendaylight 版本?为什么要增加通知服务?

标签: opendaylight


【解决方案1】:
public class ChangeListener implements DataChangeListener {
private static final Logger logger = LoggerFactory.getLogger(DhcontrollerListener.class);
private DataBroker          dataBroker;

public DhcontrollerListener(DataBroker broker) {
    this.dataBroker = broker;

    //flow
    InstanceIdentifier<Flow> flowPath = InstanceIdentifier.builder(Nodes.class)
        .child(Node.class).augmentation(FlowCapableNode.class).child(Table.class)
        .child(Flow.class).build();
    dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, flowPath, this,
        DataChangeScope.BASE);

}

@Override
public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {

    if (change == null) {
        logger.info("DhcontrollerListener ===>>> onDataChanged: change is null");
        return;
    }

    handleCreatedFlow(change);
    handleUpdatedFlow(change);
    handleDeletedFlow(change);

}

private void handleCreatedFlow(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
    Map<InstanceIdentifier<?>, DataObject> createdData = change.getCreatedData();
    if (createdData == null) {
        logger.info("handleCreatedFlow ===>>> getRemovedPaths==null");
        return;
    }
    for (Map.Entry<InstanceIdentifier<?>, DataObject> entry : createdData.entrySet()) {
        final DataObject dataObject = entry.getValue();

        if (dataObject instanceof Flow) {
            Flow flow = (Flow) dataObject;
            logger.info("create flow :  " + flow.getCookie() + " " + flow.getKey().toString());
        }

    }
}

private void handleUpdatedFlow(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
    Map<InstanceIdentifier<?>, DataObject> updatedData = change.getCreatedData();
    if (updatedData == null) {
        logger.info("handleUpdatedFlow ===>>> getRemovedPaths==null");
        return;
    }
    for (Map.Entry<InstanceIdentifier<?>, DataObject> entry : updatedData.entrySet()) {
        final DataObject dataObject = entry.getValue();

        if (dataObject instanceof Flow) {
            Flow flow = (Flow) dataObject;
            logger.info("update flow :  " + flow.getCookie() + " " + flow.getKey().toString());
        }

    }
}

private void handleDeletedFlow(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
    Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();
    Set<InstanceIdentifier<?>> removedData = change.getRemovedPaths();
    if (removedData == null) {
        logger.info("handleDeletedFlow ===>>> getRemovedPaths==null");
        return;
    }
    for (InstanceIdentifier<?> instanceIdentifier : removedData) {
        final DataObject dataObject = originalData.get(instanceIdentifier);

        if (dataObject instanceof Flow) {
            Flow flow = (Flow) dataObject;
            logger.info("remove flow :  " + flow.getCookie() + " " + flow.getPriority() + " "
                        + flow.getMatch().getIpMatch() + " " + flow.getKey().toString());
        }
    }
}

}

我的做法是设置 InstanceIdentifier。设置不同的InstanceIdentifier,还可以监听节点、表等的变化。

【讨论】:

  • InstanceIdentifier flowPath = InstanceIdentifier.builder(Nodes.class.child(Node.class).augmentation(FlowCapableNode.class).child(Table.class).child(Flow.class)。 build(); 你是如何确定这个层次结构的?是否有某个地方的 yang 模型可以告诉你这个?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多