1 package org.opendaylight.unimgr.mef.nrp.ovs.tapi;
3 import static org.opendaylight.unimgr.mef.nrp.ovs.util.OvsCapabilitiesService.NodeCapability.OVSDB;
4 import static org.opendaylight.unimgr.utils.CapabilitiesService.Capability.Mode.AND;
6 import java.util.Collection;
9 import java.util.function.Function;
10 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
11 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
12 import org.opendaylight.unimgr.utils.CapabilitiesService;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
14 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
15 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
16 import org.opendaylight.yangtools.yang.binding.DataObject;
17 import org.slf4j.Logger;
18 import org.slf4j.LoggerFactory;
21 * Class created to classify object according to its modification types.
23 * @author marek.ryznar@amartus.com
25 public class DataObjectModificationQualifier {
26 private static final Logger LOG = LoggerFactory.getLogger(DataObjectModificationQualifier.class);
27 private CapabilitiesService capabilitiesService;
29 public DataObjectModificationQualifier(DataBroker dataBroker) {
30 capabilitiesService = new CapabilitiesService(dataBroker);
33 private Function<Node,Boolean> isOvs = node -> capabilitiesService.node(node).isSupporting(AND, OVSDB);
35 protected void checkNodes(List<DataObjectModification> nodes,
36 Map<TerminationPoint,String> toAddMap,
37 Map<TerminationPoint,String> toUpdateMap, Map<TerminationPoint,String> toDeleteMap) {
39 for (DataObjectModification node: nodes) {
40 switch (node.getModificationType()) {
43 n = (Node) node.getDataAfter();
44 if (!isOvs.apply(n) || n.getTerminationPoint() == null) {
47 String bn1 = n.augmentation(OvsdbBridgeAugmentation.class).getBridgeName().getValue();
48 n.getTerminationPoint().forEach(tp -> toAddMap.put(tp,bn1));
50 case SUBTREE_MODIFIED:
51 checkTerminationPoints(node, toAddMap, toUpdateMap, toDeleteMap);
53 //whole ovs-node eg. s1 deleted
55 n = (Node) node.getDataBefore();
56 if (!isOvs.apply(n) || n.getTerminationPoint() == null) {
59 String bn2 = n.augmentation(OvsdbBridgeAugmentation.class).getBridgeName().getValue();
60 n.getTerminationPoint().forEach(tp -> toDeleteMap.put(tp,bn2));
63 LOG.debug("Not supported modification type: {}",node.getModificationType());
69 private void checkTerminationPoints(DataObjectModification node,
70 Map<TerminationPoint,String> toAddMap,
71 Map<TerminationPoint,String> toUpdateMap,
72 Map<TerminationPoint,String> toDeleteMap) {
73 Node n = (Node) node.getDataAfter();
74 if (!isOvs.apply(n)) {
77 String bridgeName = n.augmentation(OvsdbBridgeAugmentation.class).getBridgeName().getValue();
78 Collection<DataObjectModification<? extends DataObject>> modifiedChildren = node.getModifiedChildren();
80 TerminationPoint terminationPoint;
81 for (DataObjectModification tp: modifiedChildren) {
82 if (!tp.getDataType().equals(TerminationPoint.class)) {
85 switch (tp.getModificationType()) {
86 //new port added eg. s1-eth7
88 terminationPoint = (TerminationPoint) tp.getDataAfter();
89 toAddMap.put(terminationPoint,bridgeName);
91 case SUBTREE_MODIFIED:
92 terminationPoint = (TerminationPoint) tp.getDataAfter();
93 if (!tp.getDataBefore().equals(tp.getDataAfter())) {
94 toUpdateMap.put(terminationPoint,bridgeName);
98 terminationPoint = (TerminationPoint) tp.getDataBefore();
99 toDeleteMap.put(terminationPoint,bridgeName);
102 LOG.debug("Not supported modification type: SUBTREE_MODIFIED.{}",tp.getModificationType());