6737385a8569e8798f2357a81552f31d293bcaf0
[vpnservice.git] / bgpmanager / bgpmanager-impl / src / main / java / org / opendaylight / bgpmanager / FibDSWriter.java
1 package org.opendaylight.bgpmanager;
2
3 import com.google.common.util.concurrent.Futures;
4 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
5 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
6 import org.opendaylight.yangtools.yang.binding.DataObject;
7 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
8 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
9 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
10 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
11 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.VrfEntries;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.vrfentries.VrfEntry;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.vrfentries.VrfEntryBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTables;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTablesBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTablesKey;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.FibEntries;
19
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22
23 import java.util.ArrayList;
24 import java.util.List;
25 import java.util.Iterator;
26
27 import com.google.common.util.concurrent.FutureCallback;
28 import com.google.common.base.Optional;
29
30 /**
31  * Created by emhamla on 4/14/2015.
32  */
33 public class FibDSWriter {
34     private static final Logger logger = LoggerFactory.getLogger(FibDSWriter.class);
35     private final DataBroker broker;
36
37     public FibDSWriter(final DataBroker db) {
38         broker = db;
39     }
40
41     public synchronized void addFibEntryToDS(String rd, String prefix,
42                                        String nexthop, int label) {
43
44         VrfEntry vrfEntry = new VrfEntryBuilder().setDestPrefix(prefix).
45             setNextHopAddress(nexthop).setLabel((long)label).build();
46
47         logger.info("Created vrfEntry for " + prefix + " nexthop " + nexthop + " label " + label);
48         InstanceIdentifierBuilder<VrfTables> idBuilder =
49             InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd));
50
51         logger.info("Created idBuilder for VrfTables");
52
53         InstanceIdentifier<VrfTables> vrfTableId = idBuilder.build();
54         Optional<VrfTables> vrfTable = read(LogicalDatastoreType.CONFIGURATION, vrfTableId);
55         if (vrfTable.isPresent()) {
56             List<VrfEntry> vrfEntryListExisting = vrfTable.get().getVrfEntry();
57             vrfEntryListExisting.add(vrfEntry);
58
59
60             VrfTables vrfTableUpdate = new VrfTablesBuilder().setRouteDistinguisher(rd).
61                 setVrfEntry(vrfEntryListExisting).build();
62             write(LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableUpdate);
63         }
64         else {
65             List<VrfEntry> vrfEntryList = new ArrayList<VrfEntry>();
66             vrfEntryList.add(vrfEntry);
67
68             //add a new vrf table with this vrf entry
69             VrfTables vrfTableNew = new VrfTablesBuilder().setRouteDistinguisher(rd).
70                 setVrfEntry(vrfEntryList).build();
71
72             logger.info("Created VrfTables");
73
74             InstanceIdentifier<VrfTables> vrfTableNewId = InstanceIdentifier.builder(FibEntries.class)
75                 .child(VrfTables.class, new VrfTablesKey(rd)).build();
76             logger.info("Created idBuilder for new VrfTables");
77             write(LogicalDatastoreType.CONFIGURATION, vrfTableNewId, vrfTableNew);
78         }
79
80     }
81
82     public synchronized void removeFibEntryFromDS(String rd, String prefix) {
83
84         logger.debug("Removing fib entry with destination prefix " + prefix + " from vrf table for rd " + rd);
85
86         InstanceIdentifierBuilder<VrfTables> idBuilder =
87             InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd));
88         InstanceIdentifier<VrfTables> vrfTableId = idBuilder.build();
89         Optional<VrfTables> vrfTable = read(LogicalDatastoreType.CONFIGURATION, vrfTableId);
90         if (vrfTable.isPresent()) {
91             String searchPfx = prefix;
92
93             List<VrfEntry> vrfEntryListExisting = vrfTable.get().getVrfEntry();
94             for (Iterator<VrfEntry> it = vrfEntryListExisting.iterator(); it.hasNext(); ) {
95                 VrfEntry elem = it.next();
96                 if (elem.getDestPrefix().equals(searchPfx)) {
97                     it.remove();
98                     break;
99                 }
100             }
101
102             VrfTables vrfTableUpdate = new VrfTablesBuilder().setRouteDistinguisher(rd).
103                 setVrfEntry(vrfEntryListExisting).build();
104             write(LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableUpdate);
105         }
106     }
107
108     private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
109                                                     InstanceIdentifier<T> path) {
110
111         ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
112
113         Optional<T> result = Optional.absent();
114         try {
115             result = tx.read(datastoreType, path).get();
116         } catch (Exception e) {
117             throw new RuntimeException(e);
118         }
119
120         return result;
121     }
122
123     private <T extends DataObject> void write(LogicalDatastoreType datastoreType,
124                                                    InstanceIdentifier<T> path, T data) {
125         WriteTransaction tx = broker.newWriteOnlyTransaction();
126         tx.put(datastoreType, path, data, true);
127         tx.submit();
128     }
129 }