ovs-driver refactored to support new TAPI-based presto NRP model.
[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 org.opendaylight.controller.md.sal.binding.api.DataBroker;
4 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
5 import org.opendaylight.unimgr.utils.CapabilitiesService;
6 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
7 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
8 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
9 import org.opendaylight.yangtools.yang.binding.DataObject;
10 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory;
12
13 import java.util.Collection;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.function.Function;
17
18 import static org.opendaylight.unimgr.utils.CapabilitiesService.Capability.Mode.AND;
19 import static org.opendaylight.unimgr.utils.CapabilitiesService.NodeContext.NodeCapability.OVSDB;
20
21 /**
22  * Class created to classify object according to its modification types.
23  *
24  * @author marek.ryznar@amartus.com
25  */
26 public class DataObjectModificationQualifier {
27     private static final Logger LOG = LoggerFactory.getLogger(DataObjectModificationQualifier.class);
28     private CapabilitiesService capabilitiesService;
29
30     public DataObjectModificationQualifier(DataBroker dataBroker){
31         capabilitiesService = new CapabilitiesService(dataBroker);
32     }
33
34     private Function<Node,Boolean> isOvs = node -> capabilitiesService.node(node).isSupporting(AND, OVSDB);
35
36     protected void checkNodes(List<DataObjectModification> nodes, Map<TerminationPoint,String> toAddMap, Map<TerminationPoint,String> toUpdateMap, Map<TerminationPoint,String> toDeleteMap){
37         Node n;
38         for(DataObjectModification node: nodes){
39             switch(node.getModificationType()){
40                 //new ovs node
41                 case WRITE :{
42                     n = (Node) node.getDataAfter();
43                     if(!isOvs.apply(n) || n.getTerminationPoint()==null)
44                         break;
45                     String bridgeName = n.getAugmentation(OvsdbBridgeAugmentation.class).getBridgeName().getValue();
46                     n.getTerminationPoint().forEach(tp -> toAddMap.put(tp,bridgeName));
47                 } break;
48                 case SUBTREE_MODIFIED:{
49                     checkTerminationPoints(node, toAddMap, toUpdateMap, toDeleteMap);
50                 } break;
51                 //whole ovs-node eg. s1 deleted
52                 case DELETE:{
53                     n = (Node) node.getDataBefore();
54                     if(!isOvs.apply(n) || n.getTerminationPoint()==null)
55                         break;
56                     String bridgeName = n.getAugmentation(OvsdbBridgeAugmentation.class).getBridgeName().getValue();
57                     n.getTerminationPoint().forEach(tp -> toDeleteMap.put(tp,bridgeName));
58                 } break;
59                 default:{
60                     LOG.debug("Not supported modification type: {}",node.getModificationType());
61                 } break;
62             }
63         }
64     }
65
66     private void checkTerminationPoints(DataObjectModification node, Map<TerminationPoint,String> toAddMap, Map<TerminationPoint,String> toUpdateMap, Map<TerminationPoint,String> toDeleteMap){
67         Node n = (Node) node.getDataAfter();
68         if(!isOvs.apply(n))
69             return ;
70         String bridgeName = n.getAugmentation(OvsdbBridgeAugmentation.class).getBridgeName().getValue();
71         Collection<DataObjectModification<? extends DataObject>> modifiedChildren = node.getModifiedChildren();
72
73         TerminationPoint terminationPoint;
74         for(DataObjectModification tp: modifiedChildren) {
75             if(!tp.getDataType().equals(TerminationPoint.class))
76                 continue;
77             switch (tp.getModificationType()) {
78                 //new port added eg. s1-eth7
79                 case WRITE: {
80                     terminationPoint = (TerminationPoint) tp.getDataAfter();
81                     toAddMap.put(terminationPoint,bridgeName);
82                 } break;
83                 case SUBTREE_MODIFIED: {
84                     terminationPoint = (TerminationPoint) tp.getDataAfter();
85                     if (!tp.getDataBefore().equals(tp.getDataAfter()))
86                         toUpdateMap.put(terminationPoint,bridgeName);
87                 } break;
88                 case DELETE: {
89                     terminationPoint = (TerminationPoint) tp.getDataBefore();
90                     toDeleteMap.put(terminationPoint,bridgeName);
91                 } break;
92                 default: {
93                     LOG.debug("Not supported modification type: SUBTREE_MODIFIED.{}",tp.getModificationType());
94                 } break;
95             }
96         }
97     }
98 }