Merge dev/fluorine work across to master
[unimgr.git] / ovs-driver / src / main / java / org / opendaylight / unimgr / mef / nrp / ovs / tapi / DataObjectModificationQualifier.java
1 package org.opendaylight.unimgr.mef.nrp.ovs.tapi;
2
3 import static org.opendaylight.unimgr.mef.nrp.ovs.util.OvsCapabilitiesService.NodeCapability.OVSDB;
4 import static org.opendaylight.unimgr.utils.CapabilitiesService.Capability.Mode.AND;
5
6 import java.util.Collection;
7 import java.util.List;
8 import java.util.Map;
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;
19
20 /**
21  * Class created to classify object according to its modification types.
22  *
23  * @author marek.ryznar@amartus.com
24  */
25 public class DataObjectModificationQualifier {
26     private static final Logger LOG = LoggerFactory.getLogger(DataObjectModificationQualifier.class);
27     private CapabilitiesService capabilitiesService;
28
29     public DataObjectModificationQualifier(DataBroker dataBroker) {
30         capabilitiesService = new CapabilitiesService(dataBroker);
31     }
32
33     private Function<Node,Boolean> isOvs = node -> capabilitiesService.node(node).isSupporting(AND, OVSDB);
34
35     protected void checkNodes(List<DataObjectModification> nodes,
36                               Map<TerminationPoint,String> toAddMap,
37                               Map<TerminationPoint,String> toUpdateMap, Map<TerminationPoint,String> toDeleteMap) {
38         Node n;
39         for (DataObjectModification node: nodes) {
40             switch (node.getModificationType()) {
41                 //new ovs node
42                 case WRITE :
43                     n = (Node) node.getDataAfter();
44                     if (!isOvs.apply(n) || n.getTerminationPoint() == null) {
45                         break;
46                     }
47                     String bn1 = n.augmentation(OvsdbBridgeAugmentation.class).getBridgeName().getValue();
48                     n.getTerminationPoint().forEach(tp -> toAddMap.put(tp,bn1));
49                 break;
50                 case SUBTREE_MODIFIED:
51                     checkTerminationPoints(node, toAddMap, toUpdateMap, toDeleteMap);
52                 break;
53                 //whole ovs-node eg. s1 deleted
54                 case DELETE:
55                     n = (Node) node.getDataBefore();
56                     if (!isOvs.apply(n) || n.getTerminationPoint() == null) {
57                         break;
58                     }
59                     String bn2 = n.augmentation(OvsdbBridgeAugmentation.class).getBridgeName().getValue();
60                     n.getTerminationPoint().forEach(tp -> toDeleteMap.put(tp,bn2));
61                 break;
62                 default:
63                     LOG.debug("Not supported modification type: {}",node.getModificationType());
64                 break;
65             }
66         }
67     }
68
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)) {
75             return ;
76         }
77         String bridgeName = n.augmentation(OvsdbBridgeAugmentation.class).getBridgeName().getValue();
78         Collection<DataObjectModification<? extends DataObject>> modifiedChildren = node.getModifiedChildren();
79
80         TerminationPoint terminationPoint;
81         for (DataObjectModification tp: modifiedChildren) {
82             if (!tp.getDataType().equals(TerminationPoint.class)) {
83                 continue;
84             }
85             switch (tp.getModificationType()) {
86                 //new port added eg. s1-eth7
87                 case WRITE:
88                     terminationPoint = (TerminationPoint) tp.getDataAfter();
89                     toAddMap.put(terminationPoint,bridgeName);
90                 break;
91                 case SUBTREE_MODIFIED:
92                     terminationPoint = (TerminationPoint) tp.getDataAfter();
93                     if (!tp.getDataBefore().equals(tp.getDataAfter())) {
94                         toUpdateMap.put(terminationPoint,bridgeName);
95                     }
96                 break;
97                 case DELETE:
98                     terminationPoint = (TerminationPoint) tp.getDataBefore();
99                     toDeleteMap.put(terminationPoint,bridgeName);
100                 break;
101                 default:
102                     LOG.debug("Not supported modification type: SUBTREE_MODIFIED.{}",tp.getModificationType());
103                 break;
104             }
105         }
106     }
107 }