1 package org.opendaylight.bgpmanager;
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;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
23 import java.util.ArrayList;
24 import java.util.List;
25 import java.util.Iterator;
27 import com.google.common.util.concurrent.FutureCallback;
28 import com.google.common.base.Optional;
31 * Created by emhamla on 4/14/2015.
33 public class FibDSWriter {
34 private static final Logger logger = LoggerFactory.getLogger(FibDSWriter.class);
35 private final DataBroker broker;
37 public FibDSWriter(final DataBroker db) {
41 public synchronized void addFibEntryToDS(String rd, String prefix,
42 String nexthop, int label) {
44 VrfEntry vrfEntry = new VrfEntryBuilder().setDestPrefix(prefix).
45 setNextHopAddress(nexthop).setLabel((long)label).build();
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));
51 logger.info("Created idBuilder for VrfTables");
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);
60 VrfTables vrfTableUpdate = new VrfTablesBuilder().setRouteDistinguisher(rd).
61 setVrfEntry(vrfEntryListExisting).build();
62 write(LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableUpdate);
65 List<VrfEntry> vrfEntryList = new ArrayList<VrfEntry>();
66 vrfEntryList.add(vrfEntry);
68 //add a new vrf table with this vrf entry
69 VrfTables vrfTableNew = new VrfTablesBuilder().setRouteDistinguisher(rd).
70 setVrfEntry(vrfEntryList).build();
72 logger.info("Created VrfTables");
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);
82 public synchronized void removeFibEntryFromDS(String rd, String prefix) {
84 logger.debug("Removing fib entry with destination prefix " + prefix + " from vrf table for rd " + rd);
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;
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)) {
102 VrfTables vrfTableUpdate = new VrfTablesBuilder().setRouteDistinguisher(rd).
103 setVrfEntry(vrfEntryListExisting).build();
104 write(LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableUpdate);
108 private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
109 InstanceIdentifier<T> path) {
111 ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
113 Optional<T> result = Optional.absent();
115 result = tx.read(datastoreType, path).get();
116 } catch (Exception e) {
117 throw new RuntimeException(e);
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);