Merge "JUnit for IdManager"
authorVivek Srivastava <vivek.v.srivastava@ericsson.com>
Wed, 13 May 2015 13:04:14 +0000 (13:04 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Wed, 13 May 2015 13:04:14 +0000 (13:04 +0000)
63 files changed:
bgpmanager/bgpmanager-api/pom.xml
bgpmanager/bgpmanager-impl/pom.xml
bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/bgpmanager/BgpConfigurationManager.java
bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/bgpmanager/BgpManager.java
bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/bgpmanager/FibDSWriter.java
bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/bgpmanager/thrift/client/implementation/BgpRouter.java
bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/bgpmanager/thrift/server/implementation/BgpThriftService.java
bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/bgpmanager/thrift/server/implementation/BgpUpdateHandler.java
bgpmanager/bgpmanager-impl/src/test/java/org/opendaylight/vpnservice/bgpmanager/test/AbstractMockFibManager.java
bgpmanager/bgpmanager-impl/src/test/java/org/opendaylight/vpnservice/bgpmanager/test/BgpManagerTest.java
bgpmanager/bgpmanager-impl/src/test/java/org/opendaylight/vpnservice/bgpmanager/test/MockFibManager.java
bgpmanager/pom.xml
commons/binding-parent/pom.xml
commons/config-parent/pom.xml
features/pom.xml
features/src/main/features/features.xml
fibmanager/fibmanager-api/pom.xml
fibmanager/fibmanager-impl/pom.xml
fibmanager/fibmanager-impl/src/main/config/default-config.xml
fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java
fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManagerProvider.java
fibmanager/fibmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/fibmanager/impl/rev150325/FibmanagerImplModule.java
fibmanager/fibmanager-impl/src/main/yang/fibmanager-impl.yang
fibmanager/pom.xml
idmanager/idmanager-api/pom.xml
idmanager/idmanager-impl/pom.xml
idmanager/pom.xml
interfacemgr/interfacemgr-api/pom.xml
interfacemgr/interfacemgr-impl/pom.xml
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfaceManager.java
interfacemgr/pom.xml
mdsalutil/mdsalutil-api/pom.xml
mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/MDSALDataStoreUtils.java
mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/interfaces/IMdsalApiManager.java
mdsalutil/mdsalutil-impl/pom.xml
mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALManager.java
mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALUtilProvider.java
mdsalutil/pom.xml
model-bgp/pom.xml
nexthopmgr/nexthopmgr-api/pom.xml
nexthopmgr/nexthopmgr-api/src/main/yang/l3nexthop.yang
nexthopmgr/nexthopmgr-impl/pom.xml
nexthopmgr/nexthopmgr-impl/src/main/config/default-config.xml
nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java
nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopmgrProvider.java
nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/nexthopmgr/impl/rev150325/NexthopmgrImplModule.java
nexthopmgr/nexthopmgr-impl/src/main/yang/nexthopmgr-impl.yang
nexthopmgr/pom.xml
pom.xml
vpnmanager/pom.xml
vpnmanager/vpnmanager-api/pom.xml
vpnmanager/vpnmanager-api/src/main/java/org/opendaylight/vpnmanager/api/IVpnManager.java [new file with mode: 0644]
vpnmanager/vpnmanager-api/src/main/yang/vpnmanager-api.yang [new file with mode: 0644]
vpnmanager/vpnmanager-impl/pom.xml
vpnmanager/vpnmanager-impl/src/main/config/default-config.xml
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnConstants.java [new file with mode: 0644]
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModule.java
vpnmanager/vpnmanager-impl/src/main/yang/vpnservice-impl.yang
vpnservice-artifacts/pom.xml

index d359c1487bb957e0759af2321dd2f02fc1c6a923..b52acb4b36f4c9ddd61c0e5bb2afd3097ec57194 100644 (file)
@@ -11,7 +11,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.vpnservice</groupId>
     <artifactId>config-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <relativePath>../../commons/config-parent</relativePath>
   </parent>
 
index ffdf1ea093385c51051add8e5cb06d2121cd77b6..36810b6adcb672f372c8244d9904ad2aa3333471 100644 (file)
@@ -11,7 +11,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.vpnservice</groupId>
     <artifactId>config-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <relativePath>../../commons/config-parent</relativePath>
   </parent>
 
index 21e4cb0139216f283118526d923b6a74a49d9bcc..ebd49642ceaf58c54f6657bfeb57fb1108b27a35 100644 (file)
@@ -82,7 +82,7 @@ public class BgpConfigurationManager {
         protected void remove(InstanceIdentifier<BgpRouter> identifier,
                               BgpRouter del) {
 
-            LOG.info("Bgp Router deleted in DS - " + "key: " + identifier + ", value=" + del);
+            LOG.debug("Bgp Router deleted in DS - key: {} value={} ", identifier, del);
 
             removeBgpRouter(del);
 
@@ -110,7 +110,7 @@ public class BgpConfigurationManager {
         protected void update(InstanceIdentifier<BgpRouter> identifier,
                               BgpRouter original, BgpRouter update) {
 
-            LOG.info("Bgp Router Updated in DS - " + "key: " + identifier + ", original=" + original + ", update=" + update);
+            LOG.debug("Bgp Router Updated in DS - key: {}, original={}, update={} ", identifier, original, update);
 
             updateBgpRouter(original, update);
         }
@@ -132,9 +132,7 @@ public class BgpConfigurationManager {
         @Override
         protected void add(InstanceIdentifier<BgpRouter> identifier,
                            BgpRouter value) {
-            LOG.info("Bgp Router added in DS - " + "key: " + identifier + ", value=" + value);
-            LOG.info("Bgp Router localASNumber:" + value.getLocalAsNumber());
-            LOG.info("Bgp Router localASIdentifier:" + value.getLocalAsIdentifier());
+            LOG.debug("Bgp Router added in DS - key: {}, value={} ",identifier, value);
 
             addBgpRouter(value);
         }
@@ -181,7 +179,7 @@ public class BgpConfigurationManager {
             if(gateway != null) {
                 if ((gateway.getPeerAddressType() != null) && (gateway.getPeerAddressType() instanceof org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.bgp.rev130715.bgp.neighbors.bgp.neighbor.peer.address.type.IpAddress)) {
                     IpAddress neighborIPAddr = ((org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.bgp.rev130715.bgp.neighbors.bgp.neighbor.peer.address.type.IpAddress) gateway.getPeerAddressType()).getIpAddress();
-                    LOG.info("Bgp Neighbor IP Address " + neighborIPAddr.getIpv4Address().getValue());
+                    LOG.debug("Bgp Neighbor IP Address {} ", neighborIPAddr.getIpv4Address().getValue());
 
                     configureBgpServer(BgpOp.DEL_NGHBR);
 
@@ -197,7 +195,7 @@ public class BgpConfigurationManager {
         protected void remove(InstanceIdentifier<BgpNeighbors> identifier,
                               BgpNeighbors del) {
 
-            LOG.info("Bgp Neighbors deleted in DS - " + "key: " + identifier + ", value=" + del);
+            LOG.debug("Bgp Neighbors deleted in DS - key: {}, value={} ", identifier, del);
             removeBgpNeighbors(del);
         }
 
@@ -221,7 +219,7 @@ public class BgpConfigurationManager {
                     configureBgpServer(BgpOp.DEL_NGHBR);
                 }
                 if(gateway.getAsNumber() != null) {
-                    LOG.info("Bgp Neighbor AS number " + gateway.getAsNumber());
+                    LOG.debug("Bgp Neighbor AS number {} ", gateway.getAsNumber());
                     if(bgpConfiguration.getNeighbourAsNum() != gateway.getAsNumber()) {
                         bgpConfiguration.setNeighbourAsNum(gateway.getAsNumber());
                         bgpConfiguration.setConfigUpdated();
@@ -229,7 +227,7 @@ public class BgpConfigurationManager {
                 }
                 if((gateway.getPeerAddressType() != null) && (gateway.getPeerAddressType() instanceof org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.bgp.rev130715.bgp.neighbors.bgp.neighbor.peer.address.type.IpAddress)) {
                     IpAddress neighborIPAddr = ((org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.bgp.rev130715.bgp.neighbors.bgp.neighbor.peer.address.type.IpAddress)gateway.getPeerAddressType()).getIpAddress();
-                    LOG.info("Bgp Neighbor IP Address " + neighborIPAddr.getIpv4Address().getValue());
+                    LOG.debug("Bgp Neighbor IP Address {}", neighborIPAddr.getIpv4Address().getValue());
                     if(bgpConfiguration.getNeighbourIp() != neighborIPAddr.getIpv4Address().getValue()) {
                         bgpConfiguration.setNeighbourIp(neighborIPAddr.getIpv4Address().getValue());
                         bgpConfiguration.setConfigUpdated();
@@ -247,7 +245,7 @@ public class BgpConfigurationManager {
         protected void update(InstanceIdentifier<BgpNeighbors> identifier,
                               BgpNeighbors original, BgpNeighbors update) {
 
-            LOG.info("Bgp Neighbors Updated in DS - " + "key: " + identifier + ", original=" + original + ", update=" + update);
+            LOG.debug("Bgp Neighbors Updated in DS - key: {}, original={}, update={} ", identifier,  original, update);
 
             updateBgpNeighbors(original, update);
 
@@ -261,12 +259,12 @@ public class BgpConfigurationManager {
 
             if(gateway != null) {
                 if(gateway.getAsNumber() != null) {
-                    LOG.info("Bgp Neighbor AS number " + gateway.getAsNumber());
+                    LOG.debug("Bgp Neighbor AS number {} ", gateway.getAsNumber());
                     bgpConfiguration.setNeighbourAsNum(gateway.getAsNumber());
                 }
                 if((gateway.getPeerAddressType() != null) && (gateway.getPeerAddressType() instanceof org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.bgp.rev130715.bgp.neighbors.bgp.neighbor.peer.address.type.IpAddress)) {
                     IpAddress neighborIPAddr = ((org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.bgp.rev130715.bgp.neighbors.bgp.neighbor.peer.address.type.IpAddress)gateway.getPeerAddressType()).getIpAddress();
-                    LOG.info("Bgp Neighbor IP Address " + neighborIPAddr.getIpv4Address().getValue());
+                    LOG.debug("Bgp Neighbor IP Address {} ", neighborIPAddr.getIpv4Address().getValue());
                     bgpConfiguration.setNeighbourIp(neighborIPAddr.getIpv4Address().getValue());
 
                 }
@@ -280,8 +278,7 @@ public class BgpConfigurationManager {
         @Override
         protected void add(InstanceIdentifier<BgpNeighbors> identifier,
                            BgpNeighbors value) {
-            LOG.info("key: " + identifier + ", value=" + value);
-            LOG.info("Bgp Neighbor added in DS - " + "key: " + identifier + ", value=" + value);
+            LOG.debug("Bgp Neighbor added in DS - key: {}, value={} ", identifier, value);
 
             addBgpNeighbors(value);
         }
@@ -322,7 +319,7 @@ public class BgpConfigurationManager {
                         bgpManager.deleteNeighbor(bgpConfiguration.getNeighbourIp());
                         break;
                     default:
-                        LOG.info("Invalid configuration option");
+                        LOG.error("Invalid configuration option {}", bgpOp);
                 }
 
                 retry = false;
index 35d492471d2e48227a0cafc39bcff876c19c077a..d8e387eaf58e52478b4e2d215045a37b2bf8bcf3 100644 (file)
@@ -96,14 +96,14 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
 
     public void startBgpService() throws TException {
         if(bgpThriftClient == null) {
-            LOGGER.info("Start Bgp Service - bgpThriftClient is null. Unable to start BGP service.");
+            LOGGER.error("Start Bgp Service - bgpThriftClient is null. Unable to start BGP service.");
             return;
         }
 
         // Now try start bgp - if bgp is already Active, it will tell us, nothing to do then
         try {
             bgpThriftClient.startBgp((int)bgpConfiguration.getAsNum(), bgpConfiguration.getRouterId());
-            LOGGER.info("Started BGP with AS number " + (int)bgpConfiguration.getAsNum() + " and router id " + bgpConfiguration.getRouterId());
+            LOGGER.debug("Started BGP with AS number " + (int)bgpConfiguration.getAsNum() + " and router id " + bgpConfiguration.getRouterId());
         } catch (BgpRouterException be) {
             if(be.getErrorCode() == BgpRouterException.BGP_ERR_ACTIVE) {
                 LOGGER.info("bgp server already active");
@@ -121,12 +121,12 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
 
         }  catch (TException t) {
             LOGGER.error("Could not set up thrift connection with bgp server");
-            //LOGGER.trace("Transport error while starting bgp server ", t);
+            LOGGER.debug("Transport error while starting bgp server ", t);
             reInitConn();
             throw t;
         } catch (Exception e) {
             LOGGER.error("Error while starting bgp server");
-            //LOGGER.trace("Bgp Service not started due to exception", e);
+            LOGGER.debug("Bgp Service not started due to exception", e);
             return;
         }
 
@@ -174,15 +174,15 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
 
     protected void addNeighbor(String ipAddress, long asNum) throws TException {
         if(bgpThriftClient == null) {
-            LOGGER.info("Add BGP Neighbor - bgpThriftClient is null. Unable to add BGP Neighbor.");
+            LOGGER.error("Add BGP Neighbor - bgpThriftClient is null. Unable to add BGP Neighbor.");
             return;
         }
 
         try {
             bgpThriftClient.addNeighbor(ipAddress, (int) asNum);
         } catch (BgpRouterException b) {
-            LOGGER.error("Failed to add BGP neighbor " + ipAddress + "due to BgpRouter Exception number " + b.getErrorCode());
-            LOGGER.error("BgpRouterException trace ", b);
+            LOGGER.error("Failed to add BGP neighbor " + ipAddress + " due to BgpRouter Exception number " + b.getErrorCode());
+            LOGGER.debug("BgpRouterException trace ", b);
         } catch (TException t) {
             LOGGER.error(String.format("Failed adding neighbor %s due to Transport error", ipAddress));
             reInitConn();
@@ -195,7 +195,7 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
 
     protected void deleteNeighbor(String ipAddress) throws TException {
         if(bgpThriftClient == null) {
-            LOGGER.info("Delete BGP Neighbor - bgpThriftClient is null. Unable to delete BGP Neighbor.");
+            LOGGER.error("Delete BGP Neighbor - bgpThriftClient is null. Unable to delete BGP Neighbor.");
             return;
         }
 
@@ -203,7 +203,7 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
             bgpThriftClient.delNeighbor(ipAddress);
         } catch (BgpRouterException b) {
             LOGGER.error("Failed to delete BGP neighbor " + ipAddress + "due to BgpRouter Exception number " + b.getErrorCode());
-            LOGGER.error("BgpRouterException trace ", b);
+            LOGGER.debug("BgpRouterException trace ", b);
         }catch (TException t) {
             LOGGER.error(String.format("Failed deleting neighbor %s due to Transport error", ipAddress));
             reInitConn();
@@ -217,14 +217,14 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
     @Override
     public void addVrf(String rd, Collection<String> importRts, Collection<String> exportRts) throws Exception {
         if(bgpThriftClient == null) {
-            LOGGER.info("Add BGP vrf - bgpThriftClient is null. Unable to add BGP vrf.");
+            LOGGER.error("Add BGP vrf - bgpThriftClient is null. Unable to add BGP vrf.");
             return;
         }
         try {
             bgpThriftClient.addVrf(rd, new ArrayList<>(importRts), new ArrayList<>(exportRts));
         } catch (BgpRouterException b) {
             LOGGER.error("Failed to add BGP vrf " + rd + "due to BgpRouter Exception number " + b.getErrorCode());
-            LOGGER.error("BgpRouterException trace ", b);
+            LOGGER.debug("BgpRouterException trace ", b);
             throw b;
         } catch (TException t) {
             LOGGER.error(String.format("Failed adding vrf %s due to Transport error", rd));
@@ -246,7 +246,7 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
             bgpThriftClient.delVrf(rd);
         } catch (BgpRouterException b) {
             LOGGER.error("Failed to delete BGP vrf " + rd + "due to BgpRouter Exception number " + b.getErrorCode());
-            LOGGER.error("BgpRouterException trace ", b);
+            LOGGER.debug("BgpRouterException trace ", b);
             throw b;
         } catch (TException t) {
             LOGGER.error(String.format("Failed deleting vrf %s due to Transport error", rd));
@@ -270,7 +270,7 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
             bgpThriftClient.addPrefix(rd, prefix, nextHop, vpnLabel);
         } catch (BgpRouterException b) {
             LOGGER.error("Failed to add BGP prefix " + prefix + "due to BgpRouter Exception number " + b.getErrorCode());
-            LOGGER.error("BgpRouterException trace ", b);
+            LOGGER.debug("BgpRouterException trace ", b);
             throw b;
         } catch (TException t) {
             LOGGER.error(String.format("Failed adding prefix entry <vrf:prefix:nexthop:vpnlabel> %s:%s:%s:%d due to Transport error",
@@ -296,7 +296,7 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
             bgpThriftClient.delPrefix(rd, prefix);
         } catch (BgpRouterException b) {
             LOGGER.error("Failed to delete BGP prefix " + prefix + "due to BgpRouter Exception number " + b.getErrorCode());
-            LOGGER.error("BgpRouterException trace ", b);
+            LOGGER.debug("BgpRouterException trace ", b);
             throw b;
         } catch (TException t) {
             LOGGER.error(String.format("Failed deleting prefix entry <vrf:prefix> %s:%s due to Transport error",
@@ -321,10 +321,10 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
         }
         try {
             bgpThriftClient.connect(host, port);
-            LOGGER.info("Connected to BGP server " + host + " on port " + port);
+            LOGGER.debug("Connected to BGP server {} on port {} ", host, port);
         } catch (BgpRouterException b) {
             LOGGER.error("Failed to connect to BGP server " + host + " on port " + port + " due to BgpRouter Exception number " + b.getErrorCode());
-            //_logger.error("BgpRouterException trace ", b);
+            LOGGER.debug("BgpRouterException trace ", b);
             throw b;
         } catch (TException t) {
             LOGGER.error("Failed to initialize BGP Connection due to Transport error ");
@@ -349,10 +349,10 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
 
         try {
             bgpThriftClient.reInit();
-            LOGGER.info("Reinitialized connection to BGP Server " + bgpHost);
+            LOGGER.debug("Reinitialized connection to BGP Server {}", bgpHost);
         } catch (BgpRouterException b) {
-            LOGGER.error("Failed to reinitialize connection to BGP server " + bgpHost + " on port " + bgpPort + " due to BgpRouter Exception number " + b.getErrorCode());
-            LOGGER.error("BgpRouterException trace ", b);
+            LOGGER.error("Failed to reinitialize connection to BGP server {} on port {} due to BgpRouter Exception number {}", bgpHost, bgpPort, b.getErrorCode());
+            LOGGER.debug("BgpRouterException trace ", b);
         } catch (TException t) {
             LOGGER.error("Failed to reinitialize BGP Connection due to Transport error.");
         }
index 8cab61572c9553386d0f581f695e8fd4b2fc51b5..496f3cfa847b356c4cd9090373a8eac090177ca1 100644 (file)
@@ -15,6 +15,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev15
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTablesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTablesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.vrfentries.VrfEntryKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.FibEntries;
 
 import org.slf4j.Logger;
@@ -43,64 +44,31 @@ public class FibDSWriter {
 
         VrfEntry vrfEntry = new VrfEntryBuilder().setDestPrefix(prefix).
             setNextHopAddress(nexthop).setLabel((long)label).build();
+        logger.debug("Created vrfEntry for {} nexthop {} label {}", prefix, nexthop, label);
+
+        List<VrfEntry> vrfEntryList = new ArrayList<VrfEntry>();
+        vrfEntryList.add(vrfEntry);
 
-        logger.info("Created vrfEntry for " + prefix + " nexthop " + nexthop + " label " + label);
         InstanceIdentifierBuilder<VrfTables> idBuilder =
             InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd));
-
-
         InstanceIdentifier<VrfTables> vrfTableId = idBuilder.build();
-        Optional<VrfTables> vrfTable = read(LogicalDatastoreType.CONFIGURATION, vrfTableId);
-        if (vrfTable.isPresent()) {
-            List<VrfEntry> vrfEntryListExisting = vrfTable.get().getVrfEntry();
-            vrfEntryListExisting.add(vrfEntry);
 
+        VrfTables vrfTableNew = new VrfTablesBuilder().setRouteDistinguisher(rd).
+            setVrfEntry(vrfEntryList).build();
 
-            VrfTables vrfTableUpdate = new VrfTablesBuilder().setRouteDistinguisher(rd).
-                setVrfEntry(vrfEntryListExisting).build();
-            write(LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableUpdate);
-        }
-        else {
-            List<VrfEntry> vrfEntryList = new ArrayList<VrfEntry>();
-            vrfEntryList.add(vrfEntry);
-
-            //add a new vrf table with this vrf entry
-            VrfTables vrfTableNew = new VrfTablesBuilder().setRouteDistinguisher(rd).
-                setVrfEntry(vrfEntryList).build();
-
-
-            InstanceIdentifier<VrfTables> vrfTableNewId = InstanceIdentifier.builder(FibEntries.class)
-                .child(VrfTables.class, new VrfTablesKey(rd)).build();
-
-            write(LogicalDatastoreType.CONFIGURATION, vrfTableNewId, vrfTableNew);
-        }
+        write(LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableNew);
 
     }
 
     public synchronized void removeFibEntryFromDS(String rd, String prefix) {
 
-        logger.debug("Removing fib entry with destination prefix " + prefix + " from vrf table for rd " + rd);
+        logger.debug("Removing fib entry with destination prefix {} from vrf table for rd {}", prefix, rd);
+
+        InstanceIdentifierBuilder<VrfEntry> idBuilder =
+            InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)).child(VrfEntry.class, new VrfEntryKey(prefix));
+        InstanceIdentifier<VrfEntry> vrfEntryId = idBuilder.build();
+        delete(LogicalDatastoreType.CONFIGURATION, vrfEntryId);
 
-        InstanceIdentifierBuilder<VrfTables> idBuilder =
-            InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd));
-        InstanceIdentifier<VrfTables> vrfTableId = idBuilder.build();
-        Optional<VrfTables> vrfTable = read(LogicalDatastoreType.CONFIGURATION, vrfTableId);
-        if (vrfTable.isPresent()) {
-            String searchPfx = prefix;
-
-            List<VrfEntry> vrfEntryListExisting = vrfTable.get().getVrfEntry();
-            for (Iterator<VrfEntry> it = vrfEntryListExisting.iterator(); it.hasNext(); ) {
-                VrfEntry elem = it.next();
-                if (elem.getDestPrefix().equals(searchPfx)) {
-                    it.remove();
-                    break;
-                }
-            }
-
-            VrfTables vrfTableUpdate = new VrfTablesBuilder().setRouteDistinguisher(rd).
-                setVrfEntry(vrfEntryListExisting).build();
-            write(LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableUpdate);
-        }
     }
 
     private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
@@ -121,7 +89,13 @@ public class FibDSWriter {
     private <T extends DataObject> void write(LogicalDatastoreType datastoreType,
                                                    InstanceIdentifier<T> path, T data) {
         WriteTransaction tx = broker.newWriteOnlyTransaction();
-        tx.put(datastoreType, path, data, true);
+        tx.merge(datastoreType, path, data, true);
+        tx.submit();
+    }
+
+    private <T extends DataObject> void delete(LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
+        WriteTransaction tx = broker.newWriteOnlyTransaction();
+        tx.delete(datastoreType, path);
         tx.submit();
     }
 }
index e5af15acd93e733c946c5d4d08b633a9334102f6..93c92f87ad2e5ba911747da2815469ee3d2f8516 100644 (file)
@@ -70,7 +70,7 @@ public class BgpRouter {
         this.bgpPort = bgpPort;
         bop = new BgpOp();
         try {
-            LOGGER.info("Connecting to BGP Server " + bgpHost + " on port " + bgpPort);
+            LOGGER.debug("Connecting to BGP Server " + bgpHost + " on port " + bgpPort);
             reInit();
         } catch (Exception e) {
             LOGGER.error("Failed connecting to BGP server ");
@@ -142,7 +142,7 @@ public class BgpRouter {
         bop.type = START_BGP;
         bop.asNum = asNum;
         bop.rtrId = rtrId;
-        LOGGER.info("Starting BGP Server with as number " + asNum + " and router ID " + rtrId);
+        LOGGER.debug("Starting BGP Server with as number {} and router ID {} ", asNum, rtrId);
         dispatch(bop);
     }
 
@@ -151,7 +151,7 @@ public class BgpRouter {
         bop.type = ADD_NBR;
         bop.nbrIp = nbrIp;
         bop.nbrAsNum = nbrAsNum;
-        LOGGER.info("Adding BGP Neighbor " + nbrIp + " with as number " + nbrAsNum);
+        LOGGER.debug("Adding BGP Neighbor {} with as number {} ", nbrIp, nbrAsNum);
         dispatch(bop);
     }
 
@@ -159,7 +159,7 @@ public class BgpRouter {
         throws TException, BgpRouterException {
         bop.type = DEL_NBR;
         bop.nbrIp = nbrIp;
-        LOGGER.info("Deleting BGP Neighbor " + nbrIp);
+        LOGGER.debug("Deleting BGP Neighbor {} ", nbrIp);
         dispatch(bop);
     }
 
@@ -169,7 +169,7 @@ public class BgpRouter {
         bop.rd = rd;
         bop.irts = irts;
         bop.erts = erts;
-        LOGGER.info("Adding BGP VRF rd: " + rd);
+        LOGGER.debug("Adding BGP VRF rd: {} ", rd);
         dispatch(bop);
     }
 
@@ -177,7 +177,7 @@ public class BgpRouter {
         throws TException, BgpRouterException {
         bop.type = DEL_VRF;
         bop.rd = rd;
-        LOGGER.info("Deleting BGP VRF rd: " + rd);
+        LOGGER.debug("Deleting BGP VRF rd: {} " + rd);
         dispatch(bop);
     }
 
@@ -188,7 +188,7 @@ public class BgpRouter {
         bop.pfx = prefix;
         bop.nh = nexthop;
         bop.lbl = label;
-        LOGGER.info("Adding BGP route - rd:" + rd + " prefix:" + prefix + " nexthop:" + nexthop + " label:" + label);
+        LOGGER.debug("Adding BGP route - rd:{} prefix:{} nexthop:{} label:{} ", rd ,prefix, nexthop, label);
         dispatch(bop);
     }
 
@@ -197,7 +197,7 @@ public class BgpRouter {
         bop.type = DEL_PFX;
         bop.rd = rd;
         bop.pfx = prefix;
-        LOGGER.info("Deleting BGP route - rd:" + rd + " prefix:" + prefix);
+        LOGGER.debug("Deleting BGP route - rd:{} prefix:{} ", rd, prefix);
         dispatch(bop);
     }
 
@@ -267,7 +267,7 @@ public class BgpRouter {
         BgpSyncHandle bsh = BgpSyncHandle.getInstance();
 
         try {
-            LOGGER.info("Starting BGP Route sync.. ");
+            LOGGER.debug("Starting BGP Route sync.. ");
             initRibSync(bsh);
             while (bsh.getState() != bsh.DONE) {
                 Routes r = doRibSync(bsh);
@@ -288,7 +288,7 @@ public class BgpRouter {
                 }
             }
             endRibSync(bsh);
-            LOGGER.info("Completed BGP Route sync.");
+            LOGGER.debug("Completed BGP Route sync.");
         }  catch (Exception e) {
             throw e;
         }
index dfe4af646d97f2907c2f8b39c1cd6bd5d81ea699..921c9cf96217643c340dd9b0f6826e5c4d2632fd 100644 (file)
@@ -31,12 +31,12 @@ public class BgpThriftService {
 
 
        public void start() {
-               LOGGER.info("BGP Thrift Server starting.");
+               LOGGER.debug("BGP Thrift Server starting...");
                startBgpThriftServer();
        }
        
        public void stop() {
-               LOGGER.info("BGP Thrift Server stopping.");
+               LOGGER.debug("BGP Thrift Server stopping...");
                stopBgpThriftServer();
        }
 
@@ -68,13 +68,12 @@ public class BgpThriftService {
 
        public void stopBgpThriftServer() {
                try {
-            LOGGER.debug("Server stopping");
-
             if (serverTransport != null) {
                 serverTransport.close();
             }
             
             server.stop();
+                       LOGGER.info("BGP Thrift Server stopped");
         } catch (Exception e) {
             LOGGER.error("Error while stopping the server - {} {}", getClass().getName(), e.getMessage());
         }
@@ -86,7 +85,7 @@ public class BgpThriftService {
 
                try {
                                serverTransport = new TServerSocket(port);
-                   LOGGER.info("Server Socket on Port {} ", port);
+                               LOGGER.info("BGP Thrift Server started on port {} ", port);
                        } catch (TTransportException e) {
                                LOGGER.error("Transport Exception while starting bgp thrift server", e);
                                return;
index 9f3c40a89a65a2d5ae33f791bf1cab1abd3767bf..bf7b33bbd49bdc2039ccca25fd4b5c8acf646c55 100644 (file)
@@ -20,21 +20,20 @@ class BgpUpdateHandler implements BgpUpdater.Iface {
     public void onUpdatePushRoute(String rd, String prefix, int plen,
                                 String nexthop, int label) {
 
-       LOGGER.info("Route add ** " + rd + " ** " + prefix + "/" + plen
-               + " ** " + nexthop + " ** " + label);
+       LOGGER.debug("Route add ** {} ** {}/{} ** {} ** {} ", rd, prefix, plen, nexthop, label);
         //Write to FIB in Data Store
         fibDSWriter.addFibEntryToDS(rd, prefix + "/" + plen, nexthop, label);
 
    }
 
    public void onUpdateWithdrawRoute(String rd, String prefix, int plen) {
-       LOGGER.info("Route del ** " + rd + " ** " + prefix + "/" + plen);
+       LOGGER.debug("Route del ** {} ** {}/{} ", rd, prefix, plen);
        fibDSWriter.removeFibEntryFromDS(rd, prefix + "/" + plen);
 
    }
 
    public void onStartConfigResyncNotification() {
-       LOGGER.info("BGP (re)started");
+       LOGGER.debug("BGP (re)started");
        bgpManager.reInitConn();
    }
 
index 1c7ee261b0fee0d0bb364f3914ae03b9d0ace62f..bcf127d1f004760c74a94047a1d7c3a988bbd4f4 100644 (file)
@@ -1,4 +1,4 @@
-package org.opendaylight.vpnservice.test;
+package org.opendaylight.vpnservice.bgpmanager.test;
 
 import java.math.BigInteger;
 import java.util.ArrayList;
index 58d1975a5493e8669283a80f0c831285078bf604..7ddc6d0e730c597ba345657e8ac1b6009b9e8c99 100644 (file)
@@ -16,7 +16,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
 
   <groupId>org.opendaylight.vpnservice</groupId>
   <artifactId>bgpmanager</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
+  <version>0.1.0-SNAPSHOT</version>
   <name>bgpmanager</name>
   <packaging>pom</packaging>
   <modelVersion>4.0.0</modelVersion>
index 871044634a2dd990cacec663fbcbb0379e38ad04..28a0bbed6ecd5d51e0b386c7f191aed1d2bbb414 100644 (file)
@@ -17,11 +17,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.opendaylight.vpnservice</groupId>
   <artifactId>binding-parent</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
+  <version>0.1.0-SNAPSHOT</version>
   <packaging>pom</packaging>
 
   <properties>
-    <vpnservices.version>0.0.1-SNAPSHOT</vpnservices.version>
+    <vpnservices.version>0.1.0-SNAPSHOT</vpnservices.version>
     <ietf.inet.types.version>2010.09.24.7-SNAPSHOT</ietf.inet.types.version>
     <ietf.yang.types.version>2010.09.24.7-SNAPSHOT</ietf.yang.types.version>
     <ietf.interfaces.version>2014.05.08.7-SNAPSHOT</ietf.interfaces.version>
@@ -29,7 +29,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
     <yang.ext.version>2013.09.07.7-SNAPSHOT</yang.ext.version>
     <yangtools.version>0.7.0-SNAPSHOT</yangtools.version>
     <mdsal.version>1.2.0-SNAPSHOT</mdsal.version>
-    <vpns.mdsalutil.version>0.0.1-SNAPSHOT</vpns.mdsalutil.version>
+    <vpns.mdsalutil.version>0.1.0-SNAPSHOT</vpns.mdsalutil.version>
     <model.bgp.version>2013.07.15.7-SNAPSHOT</model.bgp.version>
   </properties>
 </project>
index 98a1c10aa2367b7529f87c2c1d3fb42b78682b30..f7beac5b1ad8b94b0d1f949b3ae2ea82eeb3714c 100644 (file)
@@ -18,12 +18,13 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.opendaylight.vpnservice</groupId>
   <artifactId>config-parent</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
+  <version>0.1.0-SNAPSHOT</version>
   <packaging>pom</packaging>
 
   <properties>
     <!-- ODL -->
-    <vpnservices.version>0.0.1-SNAPSHOT</vpnservices.version>
+    <vpnservices.version>0.1.0-SNAPSHOT</vpnservices.version>
+    <jacoco.version>0.7.2.201409121644</jacoco.version>
     <ietf.inet.types.version>2010.09.24.7-SNAPSHOT</ietf.inet.types.version>
     <ietf.yang.types.version>2010.09.24.7-SNAPSHOT</ietf.yang.types.version>
     <ietf.interfaces.version>2014.05.08.7-SNAPSHOT</ietf.interfaces.version>
@@ -31,8 +32,9 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
     <yang.ext.version>2013.09.07.7-SNAPSHOT</yang.ext.version>
     <yangtools.version>0.7.0-SNAPSHOT</yangtools.version>
     <mdsal.version>1.2.0-SNAPSHOT</mdsal.version>
-    <vpns.mdsalutil.version>0.0.1-SNAPSHOT</vpns.mdsalutil.version>
+    <vpns.mdsalutil.version>0.1.0-SNAPSHOT</vpns.mdsalutil.version>
     <model.bgp.version>2013.07.15.7-SNAPSHOT</model.bgp.version>
+    <openflowplugin.version>0.1.0-SNAPSHOT</openflowplugin.version>
   </properties>
 
   <dependencies>
@@ -55,15 +57,47 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-checkstyle-plugin</artifactId>
+          <executions>
+            <execution>
+              <phase>process-sources</phase>
+              <goals>
+                <goal>check</goal>
+              </goals>
+            </execution>
+          </executions>
         <configuration>
           <configLocation>
             ${project.basedir}/../../commons/src/main/resources/vpns_checks.xml
           </configLocation>
           <failsOnError>true</failsOnError>
           <includes>**/*.java,**/*.xml,**/*.ini,**/*.sh,**/*.bat</includes>
-          <excludes>**/yang/</excludes>
+          <excludes>**\/target\/,**\/bin\/,**\/third-party,**\/yang-gen-sal</excludes>
         </configuration>
       </plugin>
+     <plugin>
+       <groupId>org.jacoco</groupId>
+       <artifactId>jacoco-maven-plugin</artifactId>
+       <configuration>
+         <includes>
+           <include>org.opendaylight.vpnservice.*</include>
+         </includes>
+       </configuration>
+       <executions>
+         <execution>
+           <id>pre-test</id>
+           <goals>
+             <goal>prepare-agent</goal>
+           </goals>
+         </execution>
+         <execution>
+           <id>post-test</id>
+           <goals>
+             <goal>report</goal>
+           </goals>
+           <phase>test</phase>
+         </execution>
+       </executions>
+     </plugin>
     </plugins>
   </build>
 
index 6a8ccae6d85eb437a07bfc236d830c0e508460bf..d7ea8a85be16d1a7517eec6f646bb5f4d01a610e 100644 (file)
@@ -24,13 +24,13 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
     <mdsal.version>1.2.0-SNAPSHOT</mdsal.version>
     <openflowplugin.version>0.1.0-SNAPSHOT</openflowplugin.version>
     <yangtools.version>0.7.0-SNAPSHOT</yangtools.version>
-    <vpnservices.version>0.0.1-SNAPSHOT</vpnservices.version>
-    <mdsalutil.version>0.0.1-SNAPSHOT</mdsalutil.version>
-    <vpnmanager.version>0.0.1-SNAPSHOT</vpnmanager.version>
-    <interfacemgr.version>0.0.1-SNAPSHOT</interfacemgr.version>
-    <nexthopmgr.version>0.0.1-SNAPSHOT</nexthopmgr.version>
-    <fibmanager.version>0.0.1-SNAPSHOT</fibmanager.version>
-    <idmanager.version>0.0.1-SNAPSHOT</idmanager.version>
+    <vpnservices.version>0.1.0-SNAPSHOT</vpnservices.version>
+    <mdsalutil.version>${vpnservices.version}</mdsalutil.version>
+    <vpnmanager.version>${vpnservices.version}</vpnmanager.version>
+    <interfacemgr.version>${vpnservices.version}</interfacemgr.version>
+    <nexthopmgr.version>${vpnservices.version}</nexthopmgr.version>
+    <fibmanager.version>${vpnservices.version}</fibmanager.version>
+    <idmanager.version>${vpnservices.version}</idmanager.version>
   </properties>
   <dependencyManagement>
     <dependencies>
index a44ea7097986a04da672c37e3d5e79415c21a952..38b6f759a72eda01defa8af4aae3fb6cf32bcf0b 100644 (file)
@@ -15,6 +15,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <repository>mvn:org.opendaylight.openflowplugin/features-openflowplugin/${openflowplugin.version}/xml/features</repository>
   <repository>mvn:org.opendaylight.controller/features-restconf/${mdsal.version}/xml/features</repository>
   <feature name='odl-vpnservice-api' version='${project.version}' description='OpenDaylight :: vpnservice :: api '>
+    <feature version='${mdsal.version}'>odl-mdsal-broker</feature>
     <feature version='${yangtools.version}'>odl-yangtools-models</feature>
     <feature version='${openflowplugin.version}'>odl-openflowplugin-nsf-model</feature>
     <bundle>mvn:org.opendaylight.vpnservice/model-bgp/{{VERSION}}</bundle>
@@ -43,12 +44,12 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
     <!--<bundle>mvn:org.opendaylight.vpnservice.third-party/org.apache.thriftlib/1.0.1-SNAPSHOT</bundle>-->
     <bundle>wrap:mvn:org.apache.thrift/libthrift/0.9.1$overwrite=merge&amp;Bundle-Version=0.9.1&amp;Export-Package=*;-noimport:=true;version="0.9.1"</bundle>
     <!--<bundle>wrap:mvn:javax.servlet/servlet-api/2.5</bundle>-->
+       <configfile finalname="idmanager-impl-default-config.xml">mvn:org.opendaylight.vpnservice/idmanager-impl/${idmanager.version}/xml/config</configfile>
     <configfile finalname="bgpmanager-impl-default-config.xml">mvn:org.opendaylight.vpnservice/bgpmanager-impl/${vpnservices.version}/xml/config</configfile>
     <configfile finalname="mdsalutil-impl-default-config.xml">mvn:org.opendaylight.vpnservice/mdsalutil-impl/${interfacemgr.version}/xml/config</configfile>
     <configfile finalname="interfacemgr-impl-default-config.xml">mvn:org.opendaylight.vpnservice/interfacemgr-impl/${interfacemgr.version}/xml/config</configfile>
     <configfile finalname="vpnmanager-impl-default-config.xml">mvn:org.opendaylight.vpnservice/vpnmanager-impl/${vpnmanager.version}/xml/config</configfile>
     <configfile finalname="nexthopmgr-impl-default-config.xml">mvn:org.opendaylight.vpnservice/nexthopmgr-impl/${nexthopmgr.version}/xml/config</configfile>
-    <configfile finalname="idmanager-impl-default-config.xml">mvn:org.opendaylight.vpnservice/idmanager-impl/${idmanager.version}/xml/config</configfile>
     <configfile finalname="fibmanager-impl-default-config.xml">mvn:org.opendaylight.vpnservice/fibmanager-impl/${fibmanager.version}/xml/config</configfile>
 
   </feature>
index aa25305ae6322865a444c5ce414d6f82552fad8f..d82fe10a92a3fcf0cff008bf34f99de1219e7f39 100644 (file)
@@ -10,7 +10,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.vpnservice</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <relativePath>../../commons/binding-parent</relativePath>
   </parent>
 
index 9e91a468a2a00cbeedfe7e3e4f630b3b11da4afc..d9f46bcd7c3155e329b018a8b6188cbb73c83a3a 100644 (file)
@@ -11,7 +11,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.vpnservice</groupId>
     <artifactId>config-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <relativePath>../../commons/config-parent</relativePath>
   </parent>
 
@@ -26,12 +26,26 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <artifactId>fibmanager-api</artifactId>
       <version>${vpnservices.version}</version>
     </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>mdsalutil-api</artifactId>
+      <version>${vpnservices.version}</version>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.vpnservice</groupId>
       <artifactId>vpnmanager-impl</artifactId>
       <version>${vpnservices.version}</version>
     </dependency>
-
+    <dependency>
+      <groupId>org.opendaylight.vpnservice</groupId>
+      <artifactId>vpnmanager-api</artifactId>
+      <version>${vpnservices.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.vpnservice</groupId>
+      <artifactId>nexthopmgr-api</artifactId>
+      <version>${vpnservices.version}</version>
+    </dependency>
   </dependencies>
 
 </project>
index a624ae7d58099f87aec186d398a00425a69ae983..166d22cb19a798510c26e46b630cabe460e040e4 100644 (file)
@@ -10,6 +10,8 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
 <snapshot>
   <required-capabilities>
       <capability>urn:opendaylight:params:xml:ns:yang:fibmanager:impl?module=fibmanager-impl&amp;revision=2015-03-25</capability>
+      <capability>urn:opendaylight:params:xml:ns:yang:vpnmanager:api?module=vpnmanager-api&amp;revision=2015-05-08</capability>
+      <capability>urn:opendaylight:params:xml:ns:yang:mdsalutil:api?module=odl-mdsalutil&amp;revision=2015-04-10</capability>
       <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&amp;revision=2013-10-28</capability>
   </required-capabilities>
   <configuration>
@@ -23,6 +25,14 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
             <name>binding-osgi-broker</name>
           </broker>
+          <mdsalutil>
+            <type xmlns:mdsalutil="urn:opendaylight:params:xml:ns:yang:mdsalutil:api">mdsalutil:odl-mdsalutil</type>
+            <name>mdsalutil-service</name>
+          </mdsalutil>
+          <vpnmanager>
+            <type xmlns:odl-vpn="urn:opendaylight:params:xml:ns:yang:vpnmanager:api">odl-vpn:vpnmanager-api</type>
+            <name>vpnmanager</name>
+          </vpnmanager>
         </module>
       </modules>
     </data>
index 42476b0871794b509b6802818d3e796c9e00e24c..b0e7098c4f560503c4ec98c62c650e401cec55fb 100644 (file)
@@ -7,12 +7,35 @@
  */
 package org.opendaylight.vpnservice.fibmanager;
 
+import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.Futures;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import com.google.common.util.concurrent.FutureCallback;
+
+import org.opendaylight.vpnmanager.api.IVpnManager;
 import org.opendaylight.vpnservice.AbstractDataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.vpnservice.mdsalutil.ActionInfo;
+import org.opendaylight.vpnservice.mdsalutil.ActionType;
+import org.opendaylight.vpnservice.mdsalutil.FlowEntity;
+import org.opendaylight.vpnservice.mdsalutil.InstructionInfo;
+import org.opendaylight.vpnservice.mdsalutil.InstructionType;
+import org.opendaylight.vpnservice.mdsalutil.MDSALUtil;
+import org.opendaylight.vpnservice.mdsalutil.MatchFieldType;
+import org.opendaylight.vpnservice.mdsalutil.MatchInfo;
+import org.opendaylight.vpnservice.mdsalutil.MetaDataUtil;
+import org.opendaylight.vpnservice.mdsalutil.NwConstants;
+import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInstance1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTables;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTablesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.vrfentries.VrfEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.GetEgressPointerInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.GetEgressPointerOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.L3nexthopService;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -21,14 +44,37 @@ import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.FibEntries;
+import org.opendaylight.yangtools.yang.binding.RpcService;
+import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import com.google.common.base.Optional;
 
-public class FibManager extends AbstractDataChangeListener<FibEntries> implements AutoCloseable{
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+public class FibManager extends AbstractDataChangeListener<VrfEntry> implements AutoCloseable{
   private static final Logger LOG = LoggerFactory.getLogger(FibManager.class);
+  private static final String FLOWID_PREFIX = "L3.";
   private ListenerRegistration<DataChangeListener> listenerRegistration;
   private final DataBroker broker;
+  private final L3nexthopService l3nexthopService;
+  private IMdsalApiManager mdsalManager;
+  private IVpnManager vpnmanager;
+
+  private static final short L3_FIB_TABLE = 20;
+  private static final short L3_LFIB_TABLE = 21;
+  private static final BigInteger COOKIE_VM_LFIB_TABLE = new BigInteger("8000002", 16);
+  private static final BigInteger COOKIE_VM_FIB_TABLE =  new BigInteger("8000003", 16);
+  private static final int DEFAULT_FIB_FLOW_PRIORITY = 10;
+
 
   private static final FutureCallback<Void> DEFAULT_CALLBACK =
       new FutureCallback<Void>() {
@@ -41,9 +87,10 @@ public class FibManager extends AbstractDataChangeListener<FibEntries> implement
         };
       };
 
-  public FibManager(final DataBroker db) {
-    super(FibEntries.class);
+  public FibManager(final DataBroker db, final RpcService nextHopService) {
+    super(VrfEntry.class);
     broker = db;
+    l3nexthopService = (L3nexthopService)nextHopService;
     registerListener(db);
   }
 
@@ -60,6 +107,15 @@ public class FibManager extends AbstractDataChangeListener<FibEntries> implement
     LOG.info("Fib Manager Closed");
   }
 
+
+  public void setMdsalManager(IMdsalApiManager mdsalManager) {
+    this.mdsalManager = mdsalManager;
+  }
+
+  public void setVpnmanager(IVpnManager vpnmanager) {
+    this.vpnmanager = vpnmanager;
+  }
+
   private void registerListener(final DataBroker db) {
     try {
       listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
@@ -70,12 +126,6 @@ public class FibManager extends AbstractDataChangeListener<FibEntries> implement
     }
   }
 
-  @Override
-  protected void add(final InstanceIdentifier<FibEntries> identifier,
-                     final FibEntries fibEntries) {
-    LOG.trace("key: " + identifier + ", value=" + fibEntries );
-  }
-
   private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
                                                   InstanceIdentifier<T> path) {
 
@@ -91,24 +141,259 @@ public class FibManager extends AbstractDataChangeListener<FibEntries> implement
     return result;
   }
 
-  private InstanceIdentifier<FibEntries> getWildCardPath() {
-    return InstanceIdentifier.create(FibEntries.class);
+  private InstanceIdentifier<VrfEntry> getWildCardPath() {
+    return InstanceIdentifier.create(FibEntries.class).child(VrfTables.class).child(VrfEntry.class);
+  }
+
+  private <T extends DataObject> void asyncWrite(LogicalDatastoreType datastoreType,
+                                                 InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
+    WriteTransaction tx = broker.newWriteOnlyTransaction();
+    tx.put(datastoreType, path, data, true);
+    Futures.addCallback(tx.submit(), callback);
   }
 
   @Override
-  protected void remove(InstanceIdentifier<FibEntries> identifier, FibEntries del) {
-    LOG.trace("key: " + identifier + ", value=" + del );
+  protected void add(final InstanceIdentifier<VrfEntry> identifier,
+                     final VrfEntry vrfEntry) {
+    LOG.trace("key: " + identifier + ", value=" + vrfEntry );
+    createFibEntries(identifier, vrfEntry);
   }
 
   @Override
-  protected void update(InstanceIdentifier<FibEntries> identifier, FibEntries original, FibEntries update) {
+  protected void remove(InstanceIdentifier<VrfEntry> identifier, VrfEntry vrfEntry) {
+    LOG.trace("key: " + identifier + ", value=" + vrfEntry);
+    deleteFibEntries(identifier, vrfEntry);
+  }
+
+  @Override
+  protected void update(InstanceIdentifier<VrfEntry> identifier, VrfEntry original, VrfEntry update) {
     LOG.trace("key: " + identifier + ", original=" + original + ", update=" + update );
   }
 
-  private <T extends DataObject> void asyncWrite(LogicalDatastoreType datastoreType,
-                                                 InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
-    WriteTransaction tx = broker.newWriteOnlyTransaction();
-    tx.put(datastoreType, path, data, true);
-    Futures.addCallback(tx.submit(), callback);
+  private void createFibEntries(final InstanceIdentifier<VrfEntry> identifier,
+                                final VrfEntry vrfEntry) {
+    final VrfTablesKey vrfTableKey = identifier.firstKeyOf(VrfTables.class, VrfTablesKey.class);
+    Preconditions.checkNotNull(vrfTableKey, "VrfTablesKey cannot be null or empty!");
+    Preconditions.checkNotNull(vrfEntry, "VrfEntry cannot be null or empty!");
+
+    Long vpnId = getVpnId(vrfTableKey.getRouteDistinguisher());
+    Preconditions.checkNotNull(vpnId, "Vpn Instance not available!");
+    Collection<Long> dpns = vpnmanager.getDpnsForVpn(vpnId);
+    for (Long dpId : dpns) {
+      addRouteInternal(dpId, vpnId, vrfTableKey, vrfEntry);
+    }
+  }
+
+  private void addRouteInternal(final long dpId, final long vpnId, final VrfTablesKey vrfTableKey,
+                                final VrfEntry vrfEntry) {
+    String rd = vrfTableKey.getRouteDistinguisher();
+    LOG.debug("adding route " + vrfEntry.getDestPrefix() + " " + rd);
+
+    GetEgressPointerOutput adjacency = resolveAdjacency(dpId, vpnId, vrfEntry);
+    long groupId = -1;
+    boolean isLocalRoute = false;
+    if(adjacency != null) {
+      groupId = adjacency.getEgressPointer();
+      isLocalRoute = adjacency.isLocalDestination();
+    }
+    if(groupId == -1) {
+      LOG.error("Could not get nexthop group id for nexthop: {} in vpn {}",
+                                   vrfEntry.getNextHopAddress(), rd);
+      LOG.warn("Failed to add Route: {} in vpn: {}",
+                             vrfEntry.getDestPrefix(), rd);
+      return;
+    }
+
+    makeConnectedRoute(dpId, vpnId, vrfEntry, rd, groupId, NwConstants.ADD_FLOW);
+
+    if (isLocalRoute) {
+      makeLFibTableEntry(dpId, vrfEntry.getLabel(), groupId, vrfEntry.getNextHopAddress(), NwConstants.ADD_FLOW);
+    }
+
+    LOG.debug(
+        "Successfully added fib entry for " + vrfEntry.getDestPrefix() + " vpnId " + vpnId);
+  }
+
+  private void deleteFibEntries(final InstanceIdentifier<VrfEntry> identifier,
+                                final VrfEntry vrfEntry) {
+    final VrfTablesKey vrfTableKey = identifier.firstKeyOf(VrfTables.class, VrfTablesKey.class);
+    Preconditions.checkNotNull(vrfTableKey, "VrfTablesKey cannot be null or empty!");
+    Preconditions.checkNotNull(vrfEntry, "VrfEntry cannot be null or empty!");
+
+    Long vpnId = getVpnId(vrfTableKey.getRouteDistinguisher());
+    Preconditions.checkNotNull(vpnId, "Vpn Instance not available!");
+    Collection<Long> dpns = vpnmanager.getDpnsForVpn(vpnId);
+    for (Long dpId : dpns) {
+      deleteRoute(dpId, vpnId, vrfTableKey, vrfEntry);
+    }
+  }
+
+  public void deleteRoute(final long dpId, final long vpnId, final VrfTablesKey vrfTableKey,
+                          final VrfEntry vrfEntry) {
+    LOG.debug("deleting route "+ vrfEntry.getDestPrefix() + " "+vpnId);
+    String rd = vrfTableKey.getRouteDistinguisher();
+    GetEgressPointerOutput adjacency = resolveAdjacency(dpId, vpnId, vrfEntry);
+    long groupId = -1;
+    boolean isLocalRoute = false;
+    if(adjacency != null) {
+      groupId = adjacency.getEgressPointer();
+      isLocalRoute = adjacency.isLocalDestination();
+    }
+    if(groupId == -1) {
+      LOG.error("Could not get nexthop group id for nexthop: {} in vpn {}",
+                              vrfEntry.getNextHopAddress(), rd);
+      LOG.warn("Failed to add Route: {} in vpn: {}",
+                             vrfEntry.getDestPrefix(), rd);
+      return;
+    }
+
+    makeConnectedRoute(dpId, vpnId, vrfEntry, rd, groupId, NwConstants.DEL_FLOW);
+
+    if (isLocalRoute) {
+      makeLFibTableEntry(dpId, vrfEntry.getLabel(), groupId, vrfEntry.getNextHopAddress(), NwConstants.DEL_FLOW);
+    }
+
+    LOG.debug("Successfully delete fib entry for "+ vrfEntry.getDestPrefix() + " vpnId "+vpnId);
+  }
+
+  private long getIpAddress(byte[] rawIpAddress) {
+    return (((rawIpAddress[0] & 0xFF) << (3 * 8)) + ((rawIpAddress[1] & 0xFF) << (2 * 8))
+            + ((rawIpAddress[2] & 0xFF) << (1 * 8)) + (rawIpAddress[3] & 0xFF)) & 0xffffffffL;
+  }
+
+  private void makeConnectedRoute(long dpId, long vpnId, VrfEntry vrfEntry, String rd,
+                                  long groupId, int addOrRemove) {
+    String values[] = vrfEntry.getDestPrefix().split("/");
+    LOG.debug("Adding route to DPN. ip {} masklen {}", values[0], values[1]);
+    String ipAddress = values[0];
+    int prefixLength = Integer.parseInt(values[1]);
+    InetAddress destPrefix = null;
+    try {
+      destPrefix = InetAddress.getByName(ipAddress);
+    } catch (UnknownHostException e) {
+      LOG.error("UnknowHostException in addRoute. Failed to add Route for ipPrefix {}", vrfEntry.getDestPrefix());
+      return;
+    }
+
+    List<MatchInfo> matches = new ArrayList<MatchInfo>();
+
+    matches.add(new MatchInfo(MatchFieldType.metadata, new BigInteger[] {
+        BigInteger.valueOf(vpnId), MetaDataUtil.METADATA_MASK_VRFID }));
+
+    matches.add(new MatchInfo(MatchFieldType.eth_type,
+                              new long[] { 0x0800L }));
+
+    if(prefixLength != 0) {
+      matches.add(new MatchInfo(MatchFieldType.ipv4_dst, new long[] {
+          getIpAddress(destPrefix.getAddress()), prefixLength }));
+    }
+
+    List<InstructionInfo> instructions = new ArrayList<InstructionInfo>();
+    List<ActionInfo> actionsInfos = new ArrayList<ActionInfo>();
+
+    if(addOrRemove == NwConstants.ADD_FLOW) {
+      actionsInfos.add(new ActionInfo(ActionType.group, new String[] { String.valueOf(groupId)}));
+      actionsInfos.add(new ActionInfo(ActionType.push_mpls, new String[] { Long.toString(vrfEntry.getLabel())}));
+      instructions.add(new InstructionInfo(InstructionType.write_actions, actionsInfos));
+    }
+
+    String flowRef = getFlowRef(dpId, L3_FIB_TABLE, rd, destPrefix);
+
+    FlowEntity flowEntity;
+
+    int priority = DEFAULT_FIB_FLOW_PRIORITY + prefixLength;
+    flowEntity = MDSALUtil.buildFlowEntity(dpId, L3_FIB_TABLE, flowRef,
+                                           priority, flowRef, 0, 0,
+                                           COOKIE_VM_FIB_TABLE, matches, instructions);
+
+    if (addOrRemove == NwConstants.ADD_FLOW) {
+      mdsalManager.installFlow(flowEntity);
+    } else {
+      mdsalManager.removeFlow(flowEntity);
+    }
+  }
+
+  private void makeLFibTableEntry(long dpId, long label, long groupId,
+                                  String nextHop, int addOrRemove) {
+    List<MatchInfo> matches = new ArrayList<MatchInfo>();
+    matches.add(new MatchInfo(MatchFieldType.eth_type,
+                              new long[] { 0x8847L }));
+    matches.add(new MatchInfo(MatchFieldType.mpls_label, new String[]{Long.toString(label)}));
+
+    List<InstructionInfo> instructions = new ArrayList<InstructionInfo>();
+    List<ActionInfo> actionsInfos = new ArrayList<ActionInfo>();
+    actionsInfos.add(new ActionInfo(ActionType.group, new String[] { String.valueOf(groupId) }));
+    instructions.add(new InstructionInfo(InstructionType.write_actions, actionsInfos));
+
+    // Install the flow entry in L3_LFIB_TABLE
+    String flowRef = getFlowRef(dpId, L3_LFIB_TABLE, label, nextHop);
+
+    FlowEntity flowEntity;
+    flowEntity = MDSALUtil.buildFlowEntity(dpId, L3_LFIB_TABLE, flowRef,
+                                           DEFAULT_FIB_FLOW_PRIORITY, flowRef, 0, 0,
+                                           COOKIE_VM_LFIB_TABLE, matches, instructions);
+
+    if (addOrRemove == NwConstants.ADD_FLOW) {
+      mdsalManager.installFlow(flowEntity);
+    } else {
+      mdsalManager.removeFlow(flowEntity);
+    }
+    LOG.debug("LFIB Entry for dpID {} : label : {} grpup {} modified successfully {}",dpId, label, groupId );
+  }
+
+  private String getFlowRef(long dpnId, short tableId, long label, String nextHop) {
+    return new StringBuilder(64).append(FLOWID_PREFIX).append(dpnId).append(NwConstants.FLOWID_SEPARATOR)
+        .append(tableId).append(NwConstants.FLOWID_SEPARATOR)
+        .append(label).append(NwConstants.FLOWID_SEPARATOR)
+        .append(nextHop).toString();
+  }
+
+  private String getFlowRef(long dpnId, short tableId, String rd, InetAddress destPrefix) {
+    return new StringBuilder(64).append(FLOWID_PREFIX).append(dpnId).append(NwConstants.FLOWID_SEPARATOR)
+        .append(tableId).append(NwConstants.FLOWID_SEPARATOR)
+        .append(rd).append(NwConstants.FLOWID_SEPARATOR)
+        .append(destPrefix.getHostAddress()).toString();
+  }
+
+  private GetEgressPointerOutput resolveAdjacency(final long dpId, final long vpnId,
+                        final VrfEntry vrfEntry) {
+    GetEgressPointerOutput adjacency = null;
+    LOG.trace("resolveAdjacency called with dpid {}, vpnId{}, VrfEntry {}",dpId, vpnId, vrfEntry);;
+    try {
+      Future<RpcResult<GetEgressPointerOutput>> result =
+          l3nexthopService.getEgressPointer(new GetEgressPointerInputBuilder().setDpnId(dpId)
+                                                .setIpPrefix(vrfEntry.getDestPrefix())
+                                                .setNexthopIp(vrfEntry.getNextHopAddress())
+                                                .setVpnId(vpnId)
+                                                .build());
+      RpcResult<GetEgressPointerOutput> rpcResult = result.get();
+      if (rpcResult.isSuccessful()) {
+        adjacency = rpcResult.getResult();
+      } else {
+        LOG.error("Next hop information not available");
+      }
+    } catch (NullPointerException | InterruptedException | ExecutionException e) {
+      LOG.trace("", e);
+    }
+    return adjacency;
+  }
+
+  private Long getVpnId(String rd) {
+    Long vpnId = null;
+    InstanceIdentifier<VpnInstances> id = InstanceIdentifier.create(VpnInstances.class);
+    Optional<VpnInstances> vpnInstances = read(LogicalDatastoreType.OPERATIONAL, id);
+    if(vpnInstances.isPresent()) {
+      List<VpnInstance> vpns = vpnInstances.get().getVpnInstance();
+      for(VpnInstance vpn : vpns) {
+        if(vpn.getIpv4Family().getRouteDistinguisher().equals(rd)) {
+          VpnInstance1 vpnInstanceId = vpn.getAugmentation(VpnInstance1.class);
+          if (vpnInstanceId != null) {
+            vpnId = vpnInstanceId.getVpnId();
+            break;
+          }
+        }
+      }
+    }
+    return vpnId;
   }
 }
index 2015dc0fda96845ede533e819aafbfa8c5f177df..b9ddfbb4a44605ee23006bdfd61ba42865ff3f54 100644 (file)
@@ -10,6 +10,10 @@ package org.opendaylight.vpnservice.fibmanager;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
+import org.opendaylight.vpnmanager.api.IVpnManager;
+import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.L3nexthopService;
+import org.opendaylight.yangtools.yang.binding.RpcService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -18,13 +22,18 @@ public class FibManagerProvider implements BindingAwareProvider, AutoCloseable {
   private static final Logger LOG = LoggerFactory.getLogger(FibManagerProvider.class);
 
   private FibManager fibManager;
+  private IMdsalApiManager mdsalManager;
+  private IVpnManager vpnmanager;
 
   @Override
   public void onSessionInitiated(ProviderContext session) {
     LOG.info("FibManagerProvider Session Initiated");
     try {
       final  DataBroker dataBroker = session.getSALService(DataBroker.class);
-      fibManager = new FibManager(dataBroker);
+      final RpcService nexthopService = session.getRpcService(L3nexthopService.class);
+      fibManager = new FibManager(dataBroker, nexthopService);
+      fibManager.setMdsalManager(mdsalManager);
+      fibManager.setVpnmanager(vpnmanager);
     } catch (Exception e) {
       LOG.error("Error initializing services", e);
     }
@@ -36,4 +45,11 @@ public class FibManagerProvider implements BindingAwareProvider, AutoCloseable {
     fibManager.close();
   }
 
+  public void setMdsalManager(IMdsalApiManager mdsalManager) {
+    this.mdsalManager = mdsalManager;
+  }
+
+  public void setVpnmanager(IVpnManager vpnmanager) {
+    this.vpnmanager = vpnmanager;
+  }
 }
\ No newline at end of file
index f3d9acd90e41b1e72b6a971311ac051a3b54b341..eada290ae1a8bcf6e6b22f848b4e084ac249f7fc 100644 (file)
@@ -25,6 +25,8 @@ public class FibmanagerImplModule extends org.opendaylight.yang.gen.v1.urn.opend
     @Override
     public java.lang.AutoCloseable createInstance() {
         FibManagerProvider provider = new FibManagerProvider();
+        provider.setMdsalManager(getMdsalutilDependency());
+        provider.setVpnmanager(getVpnmanagerDependency());
         getBrokerDependency().registerProvider(provider);
         return provider;
     }
index a9321ae359d75048a28ca43bb90853164e3a0162..42e0a05a300d491fde1f96cbf629a8dde742da32 100644 (file)
@@ -5,6 +5,8 @@ module fibmanager-impl {
 
     import config { prefix config; revision-date 2013-04-05; }
     import opendaylight-md-sal-binding { prefix md-sal-binding; revision-date 2013-10-28;}
+    import odl-mdsalutil { prefix odl-mdsal; revision-date 2015-04-10;}
+    import vpnmanager-api { prefix odl-vpn; revision-date 2015-05-08;}
 
     description
         "Service definition for fibmanager project";
@@ -30,6 +32,22 @@ module fibmanager-impl {
                     }
                 }
             }
+            container mdsalutil {
+                uses config:service-ref {
+                    refine type {
+                        mandatory true;
+                        config:required-identity odl-mdsal:odl-mdsalutil;
+                    }
+                }
+            }
+            container vpnmanager {
+                uses config:service-ref {
+                    refine type {
+                        mandatory true;
+                        config:required-identity odl-vpn:vpnmanager-api;
+                    }
+                }
+            }
         }
     }
 }
index 84d36f051b66145effb8e495f88d73cfcc3ed629..32625641b1b043dda2ae4c2cb7d05e624b64a50a 100644 (file)
@@ -16,7 +16,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
 
   <groupId>org.opendaylight.vpnservice</groupId>
   <artifactId>fibmanager-aggregator</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
+  <version>0.1.0-SNAPSHOT</version>
   <name>fibmanager</name>
   <packaging>pom</packaging>
   <modelVersion>4.0.0</modelVersion>
index 6a7708fa0861c372476aa3d369a40362beec200e..69ab5f76b93d38fc08a9c3a695828a309ca88c8a 100644 (file)
@@ -10,7 +10,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.vpnservice</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <relativePath>../../commons/binding-parent</relativePath>
   </parent>
 
index 039d4e053c8211e55b852de7d872204ea26e12e9..a975b63dcc02ff8d36a7180cbb67e7229f233096 100644 (file)
@@ -11,7 +11,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.vpnservice</groupId>
     <artifactId>config-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <relativePath>../../commons/config-parent</relativePath>
   </parent>
 
index fbcaa519db9ab8002edcb6501cb118ec05e39e8e..0b34eb2cea13d861d0cf5013bf757594daa0c434 100644 (file)
@@ -16,7 +16,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
 
   <groupId>org.opendaylight.vpnservice</groupId>
   <artifactId>idmanager-aggregator</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
+  <version>0.1.0-SNAPSHOT</version>
   <name>idmanager</name>
   <packaging>pom</packaging>
   <modelVersion>4.0.0</modelVersion>
index 32dace0f44892e2889b3066004ab4270600d92a8..28f6b70f8bcd0bcaa352f3610c5ecfccc7ff4e03 100644 (file)
@@ -10,7 +10,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.vpnservice</groupId>
     <artifactId>config-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <relativePath>../../commons/config-parent</relativePath>
   </parent>
 
index 59451e2ad7279c0fdbc76a79dc120356836386a9..89b136e52b50ee84dc3fcc38379c66ed8341fe34 100644 (file)
@@ -11,14 +11,14 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.vpnservice</groupId>
     <artifactId>config-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <relativePath>../../commons/config-parent</relativePath>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.opendaylight.vpnservice</groupId>
   <artifactId>interfacemgr-impl</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
+  <version>0.1.0-SNAPSHOT</version>
   <packaging>bundle</packaging>
   <dependencies>
     <dependency>
index a1cc4972589eee098b9d2b3cb32bca552c571e52..7737e0104d80596ff32c7c92bad34fb83db54095 100644 (file)
@@ -282,6 +282,7 @@ public class InterfaceManager extends AbstractDataChangeListener<Interface> impl
                     Node node = getNodeFromDataStore(delInterface);
                     if((node != null) &&(node.getNodeConnector().isEmpty())) {
                         dbDpnEndpoints.remove(node.getId());
+                        LOG.trace("dbDpnEndpoints: {}",dbDpnEndpoints);
                     }
                 }
             }
@@ -390,7 +391,6 @@ public class InterfaceManager extends AbstractDataChangeListener<Interface> impl
 
     void processPortUpdate(NodeConnector oldPort, NodeConnector update) {
         //TODO: Currently nothing to do here.
-        LOG.trace("ifMap: {}, dpnMap: {}", mapNcToInterfaceName, dbDpnEndpoints);
     }
 
     void processPortDelete(NodeConnector port) {
@@ -411,7 +411,7 @@ public class InterfaceManager extends AbstractDataChangeListener<Interface> impl
             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder =
                             new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder();
             if (stateIf.isPresent()) {
-                stateIface = ifaceBuilder.setOperStatus(opStatus).build();
+                stateIface = ifaceBuilder.setOperStatus(opStatus).setKey(IfmUtil.getStateInterfaceKeyFromName(ifName)).build();
                 LOG.trace("Setting OperStatus for {} to {} in OPERATIONAL DS", ifName, opStatus);
                 asyncUpdate(LogicalDatastoreType.OPERATIONAL, id, stateIface, DEFAULT_CALLBACK);
             }
@@ -488,13 +488,12 @@ public class InterfaceManager extends AbstractDataChangeListener<Interface> impl
         Class<? extends InterfaceType> ifType = iface.getType();
         long dpn = this.getDpnForInterface(ifName);
         long portNo = this.getPortNumForInterface(iface).longValue();
-
         if (iface.isEnabled()) {
 
             if(ifType.isAssignableFrom(L2vlan.class)) {
                 IfL2vlan vlanIface = iface.getAugmentation(IfL2vlan.class);
-                long vlanVid = vlanIface.getVlanId();
                 LOG.trace("L2Vlan: {}",vlanIface);
+                long vlanVid = (vlanIface == null) ? 0 : vlanIface.getVlanId();
                 if (vlanVid != 0) {
                     listActionInfo.add(new ActionInfo(ActionType.push_vlan, new String[] {}));
                     listActionInfo.add(new ActionInfo(ActionType.set_field_vlan_vid,
@@ -536,7 +535,7 @@ public class InterfaceManager extends AbstractDataChangeListener<Interface> impl
         } catch (Exception e) {
             LOG.error("OFPort for Interface {} not found", iface.getName());
         }
-        return null;
+        return 0L;
     }
 
 }
index 95e95dd4f6f2eb66bdc7df9d6250b42b84411b32..3eb934c67d29d5bcb981d10c72e5eb3ca571f403 100644 (file)
@@ -16,7 +16,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
 
   <groupId>org.opendaylight.vpnservice</groupId>
   <artifactId>interfacemgr-aggregator</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
+  <version>0.1.0-SNAPSHOT</version>
   <name>interfacemgr</name>
   <packaging>pom</packaging>
   <modelVersion>4.0.0</modelVersion>
index c8d18d40918fe019d33b8195dc70290e1c21b319..2962463ae9bef2ae5804a1f67c28558be5b6af02 100644 (file)
@@ -3,83 +3,18 @@
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     
     <parent>
-        <groupId>org.opendaylight.controller</groupId>
+        <groupId>org.opendaylight.vpnservice</groupId>
         <artifactId>config-parent</artifactId>
-        <version>0.3.0-SNAPSHOT</version>
-        <relativePath/>
-    </parent>
+        <version>0.1.0-SNAPSHOT</version>
+        <relativePath>../../commons/config-parent</relativePath>
+     </parent>
     
     <modelVersion>4.0.0</modelVersion>
     <groupId>org.opendaylight.vpnservice</groupId>
     <artifactId>mdsalutil-api</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
-    <properties>
-    <!-- ODL -->
-    <openflowplugin.version>0.1.0-SNAPSHOT</openflowplugin.version>
-     </properties>
-  
-    <build>
-        <plugins>
-        <!--
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <version>${bundle.plugin.version}</version>
-                <extensions>true</extensions>
-                <configuration>
-                    <instructions>
-                        <Export-Package>
-                            org.opendaylight.vpnservice.mdsalutil,
-                            org.opendaylight.vpnservice.mdsalutil.interfaces
-                        </Export-Package>
-                        <Import-Package>
-                            com.google.common.*,
-                            org.opendaylight.yang.*,
-                            org.opendaylight.yangtools.*,
-                            org.opendaylight.controller.sal.binding.api.*,
-                            org.opendaylight.controller.md.sal.common.api.*,
-                            org.opendaylight.controller.sal.common
-                         </Import-Package
-                    </instructions>
-                    <manifestLocation>${project.basedir}/META-INF</manifestLocation>
-                </configuration>
-            </plugin>
-            -->
-            <plugin>
-                   <groupId>org.opendaylight.yangtools</groupId>
-                   <artifactId>yang-maven-plugin</artifactId>
-                   <executions>
-                     <execution>
-                       <goals>
-                         <goal>generate-sources</goal>
-                       </goals>
-                       <configuration>
-                         <codeGenerators>
-                           <generator>
-                             <codeGeneratorClass>org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl</codeGeneratorClass>
-                             <outputBaseDir>${salGeneratorPath}</outputBaseDir>
-                           </generator>
-                           <generator>
-                             <codeGeneratorClass>org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator</codeGeneratorClass>
-                             <outputBaseDir>${jmxGeneratorPath}</outputBaseDir>
-                             <additionalConfiguration>
-                               <namespaceToPackage1>urn:opendaylight:params:xml:ns:yang==org.opendaylight.controller.config.yang</namespaceToPackage1>
-                             </additionalConfiguration>
-                           </generator>
-                           <generator>
-                             <codeGeneratorClass>org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl</codeGeneratorClass>
-                             <outputBaseDir>target/site/models</outputBaseDir>
-                           </generator>
-                         </codeGenerators>
-                         <inspectDependencies>true</inspectDependencies>
-                       </configuration>
-                     </execution>
-                   </executions>
-      </plugin>
-        </plugins>
-    </build>
     <dependencies>
     <dependency>
                 <groupId>org.opendaylight.openflowplugin.model</groupId>
                 <artifactId>model-flow-service</artifactId>
                 <version>${openflowplugin.version}</version>
         </dependency>
-        <!--
-        <dependency>
-            <groupId>org.opendaylight.controller</groupId>
-            <artifactId>sal-binding-api</artifactId>
-        </dependency>
-        -->
-         <!-- removed due to missing constraint
-        <dependency>
-            <groupId>org.opendaylight.controller.model</groupId>
-            <artifactId>model-flow-service</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.opendaylight.controller.model</groupId>
-            <artifactId>model-flow-base</artifactId>
-        </dependency>
-        -->
-       <!--  <dependency>
-            <groupId>org.opendaylight.controller.model</groupId>
-            <artifactId>model-flow-management</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.opendaylight.controller.model</groupId>
-            <artifactId>model-inventory</artifactId>
-        </dependency>
-        -->
-        <!--
-        <dependency>
-            <groupId>org.opendaylight.controller.model</groupId>
-            <artifactId>model-flow-statistics</artifactId>
-        </dependency>
-        
-        <dependency>
-            <groupId>org.opendaylight.controller.adsal</groupId>
-            <artifactId>sal</artifactId>
-        </dependency>
-        -->
-        <dependency>
-                   <groupId>org.opendaylight.controller</groupId>
-                   <artifactId>config-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.opendaylight.controller</groupId>
-            <artifactId>sal-common</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-        </dependency>
-        <!--
-        <dependency>
-            <groupId>org.opendaylight.controller.model</groupId>
-            <artifactId>model-topology</artifactId>
-        </dependency>
-       -->
-                     
+                      
     </dependencies>
 </project>
index d52394e2ab0987505f9093b590ae6e7739cd2ffa..bf90fd8c0087a9d8b639e0b570671ac0e77683ba 100644 (file)
@@ -13,7 +13,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class MDSALDataStoreUtils {
 
-    public <T extends DataObject> Optional<T> read(final DataBroker broker,final LogicalDatastoreType datastoreType,
+    public static <T extends DataObject> Optional<T> read(final DataBroker broker,final LogicalDatastoreType datastoreType,
             InstanceIdentifier<T> path) {
 
         ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
@@ -35,14 +35,14 @@ public class MDSALDataStoreUtils {
        Futures.addCallback(tx.submit(), callback);
    }
 
-   public <T extends DataObject> void asyncUpdate(final DataBroker broker,final LogicalDatastoreType datastoreType,
+   public static <T extends DataObject> void asyncUpdate(final DataBroker broker,final LogicalDatastoreType datastoreType,
        InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
        WriteTransaction tx = broker.newWriteOnlyTransaction();
        tx.merge(datastoreType, path, data, true);
        Futures.addCallback(tx.submit(), callback);
    }
 
-   public <T extends DataObject> void asyncRemove(final DataBroker broker,final LogicalDatastoreType datastoreType,
+   public static <T extends DataObject> void asyncRemove(final DataBroker broker,final LogicalDatastoreType datastoreType,
        InstanceIdentifier<T> path, FutureCallback<Void> callback) {
        WriteTransaction tx = broker.newWriteOnlyTransaction();
        tx.delete(datastoreType, path);
index 697946facb517f01bd88531f6901daa673655198..4b70e82d9a7b8850e366e615c45f442a47ed62af 100644 (file)
@@ -22,7 +22,5 @@ public interface IMdsalApiManager {
     public void sendPacketOutWithActions(long lDpnId, long groupId, byte[] payload, List<ActionInfo> actionInfos);
 
     public void sendARPPacketOutWithActions(long dpid, byte[] payload, List<ActionInfo> action_info);
-    
-    public void printTest() ;
 
- }
+}
index 2101d2ad4d4d58648e75912a822585b01765691c..8db75ec1534a4529146ed6c27a75f5ed02193004 100644 (file)
@@ -3,15 +3,15 @@
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     
     <parent>
-        <groupId>org.opendaylight.controller</groupId>
+        <groupId>org.opendaylight.vpnservice</groupId>
         <artifactId>config-parent</artifactId>
-        <version>0.3.0-SNAPSHOT</version>
-        <relativePath/>
-    </parent>
+        <version>0.1.0-SNAPSHOT</version>
+        <relativePath>../../commons/config-parent</relativePath>
+     </parent>
     <modelVersion>4.0.0</modelVersion>
     <groupId>org.opendaylight.vpnservice</groupId>
     <artifactId>mdsalutil-impl</artifactId>
-    <version>0.0.1-SNAPSHOT</version>    
+    <version>0.1.0-SNAPSHOT</version>    
     <packaging>bundle</packaging>
     
     <properties>
         <dependency>
             <groupId>org.opendaylight.openflowplugin.model</groupId>
             <artifactId>model-flow-base</artifactId>
-            <version>0.1.0-SNAPSHOT</version>
+            <version>${openflowplugin.version}</version>
         </dependency>
         <dependency>
             <groupId>org.opendaylight.openflowplugin.model</groupId>
             <artifactId>model-flow-service</artifactId>
-            <version>0.1.0-SNAPSHOT</version>
+            <version>${openflowplugin.version}</version>
         </dependency>
          <!--  TEST Dependencies -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-       <dependency>
-       <groupId>org.mockito</groupId>
-       <artifactId>mockito-all</artifactId>
-       <scope>test</scope>
-    </dependency>
-    <dependency>
+        <dependency>
         <groupId>org.powermock</groupId>
         <artifactId>powermock-module-junit4</artifactId>
         <version>1.5.2</version>
       <scope>test</scope>
       <type>test-jar</type>
     </dependency>
-     <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-        </dependency>
      <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>mdsalutil-api</artifactId>
 
     <build>
         <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <version>${bundle.plugin.version}</version>
-                <extensions>true</extensions>
-                <configuration>
-                    <instructions>
-                        <Export-Package>
-                        </Export-Package>
-                        <Service-Component>
-                        </Service-Component>
-                    </instructions>
-                    <manifestLocation>${project.basedir}/META-INF</manifestLocation>
-                </configuration>
-            </plugin>
-            <plugin>
-                <artifactId>maven-clean-plugin</artifactId>
-                <version>${maven.clean.plugin.version}</version>
-                <configuration>
-                    <filesets>
-                        <fileset>
-                            <directory>${basedir}/src/main/xtend-gen</directory>
-                            <includes>
-                                <include>**</include>
-                            </includes>
-                        </fileset>
-                    </filesets>
-                </configuration>
-            </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
index 20e74528831cc64eb1912d173d5e38f28f4a7be3..b021e84419c4f65a253fc67d4993e871401129a2 100644 (file)
@@ -11,20 +11,15 @@ package org.opendaylight.vpnservice.mdsalutil.internal;
 
 import java.math.BigInteger;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-
 import org.opendaylight.vpnservice.mdsalutil.ActionInfo;
 import org.opendaylight.vpnservice.mdsalutil.ActionType;
 import org.opendaylight.vpnservice.mdsalutil.FlowEntity;
 import org.opendaylight.vpnservice.mdsalutil.GroupEntity;
 import org.opendaylight.vpnservice.mdsalutil.MDSALUtil;
-import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
@@ -64,10 +59,6 @@ public class MDSALManager implements AutoCloseable {
 
     private PacketProcessingService m_packetProcessingService;
 
-    private final AtomicInteger m_atomicInteger = new AtomicInteger();
-
-    //TODO : IF ID MANAGER IS RQD
-
     /**
      * Writes the flows and Groups to the MD SAL DataStore
      * which will be sent to the openflowplugin for installing flows/groups on the switch.
@@ -83,58 +74,32 @@ public class MDSALManager implements AutoCloseable {
 
     }
 
-
     @Override
     public void close() throws Exception {
         s_logger.info("MDSAL Manager Closed");
     }
 
-
-    public void printTest() {
-
-        s_logger.info(" INTER MODULECOMMUNICATION IS WORKING!!!!");
-    }
-
     public void installFlow(FlowEntity flowEntity) {
 
         try {
-            s_logger.info("within installFlow {}", flowEntity.getDpnId());
+            s_logger.info("InstallFlow for flowEntity {} ", flowEntity);
 
             if (flowEntity.getCookie() == null) {
-              //  s_logger.info("Helium_sync: Cookie is null");
-                flowEntity.setCookie(new BigInteger("0110000", 16));
+               flowEntity.setCookie(new BigInteger("0110000", 16));
             }
 
             FlowKey flowKey = new FlowKey( new FlowId(flowEntity.getFlowId()) );
 
             FlowBuilder flowbld = flowEntity.getFlowBuilder();
 
-            Flow flow = flowbld.build() ;
-
             Node nodeDpn = buildDpnNode(flowEntity.getDpnId());
-            InstanceIdentifier<Node> nodeInstanceId = InstanceIdentifier.builder(Nodes.class)
-                    .child(Node.class, nodeDpn.getKey()).build();
-
             InstanceIdentifier<Flow> flowInstanceId = InstanceIdentifier.builder(Nodes.class)
                     .child(Node.class, nodeDpn.getKey()).augmentation(FlowCapableNode.class)
                     .child(Table.class, new TableKey(flowEntity.getTableId())).child(Flow.class,flowKey).build();
 
-            String sTransactionUri = generateTransactionUri();
-
-            TableKey tableKey = new TableKey(flowEntity.getTableId() );
-            InstanceIdentifier<Table> tableInstanceId = InstanceIdentifier.create(Nodes.class).child(Node.class, nodeDpn.getKey())
-                    .augmentation(FlowCapableNode.class).child(Table.class, tableKey);
-            Table table = new TableBuilder().setKey(tableKey).setFlow(Collections.<Flow>emptyList()).build();
-
             WriteTransaction modification = m_dataBroker.newWriteOnlyTransaction();
 
-            //CHECK IF RQD
-           // modification.put(LogicalDatastoreType.CONFIGURATION, nodeInstanceId, nodeDpn, true);
-
-
-            modification.put(LogicalDatastoreType.CONFIGURATION, tableInstanceId, table);
-
-            modification.put(LogicalDatastoreType.CONFIGURATION, flowInstanceId, flowbld.build());
+            modification.put(LogicalDatastoreType.CONFIGURATION, flowInstanceId, flowbld.build(),true );
 
             CheckedFuture<Void,TransactionCommitFailedException> submitFuture  = modification.submit();
 
@@ -160,7 +125,7 @@ public class MDSALManager implements AutoCloseable {
                 }
             });
         } catch (Exception e) {
-            s_logger.error("Could not install flow: {}, exception: {}", flowEntity, e.getMessage());
+            s_logger.error("Could not install flow: {}, exception: {}", flowEntity, e);
         }
     }
 
@@ -169,17 +134,14 @@ public class MDSALManager implements AutoCloseable {
             Group group = groupEntity.getGroupBuilder().build();
 
             Node nodeDpn = buildDpnNode(groupEntity.getDpnId());
-            InstanceIdentifier<Node> nodeInstanceId = InstanceIdentifier.builder(Nodes.class)
-                    .child(Node.class, nodeDpn.getKey()).build();
+
             InstanceIdentifier<Group> groupInstanceId = InstanceIdentifier.builder(Nodes.class)
                     .child(Node.class, nodeDpn.getKey()).augmentation(FlowCapableNode.class)
                     .child(Group.class, new GroupKey(new GroupId(groupEntity.getGroupId()))).build();
 
             WriteTransaction modification = m_dataBroker.newWriteOnlyTransaction();
 
-            //CHECK IF RQD
-         //   modification.put(LogicalDatastoreType.CONFIGURATION, nodeInstanceId, nodeDpn);
-            modification.put(LogicalDatastoreType.CONFIGURATION, groupInstanceId, group);
+            modification.put(LogicalDatastoreType.CONFIGURATION, groupInstanceId, group, true);
 
             CheckedFuture<Void,TransactionCommitFailedException> submitFuture  = modification.submit();
 
@@ -204,7 +166,7 @@ public class MDSALManager implements AutoCloseable {
                 }
              });
            } catch (Exception e) {
-            s_logger.error("Could not install Group: {}, exception: {}", groupEntity, e.getMessage());
+            s_logger.error("Could not install Group: {}, exception: {}", groupEntity, e);
             throw e;
         }
     }
@@ -244,7 +206,7 @@ public class MDSALManager implements AutoCloseable {
 
                 });
         } catch (Exception e) {
-            s_logger.error("Could not remove Flow: {}, exception: {}", flowEntity, e.getMessage());
+            s_logger.error("Could not remove Flow: {}, exception: {}", flowEntity, e);
         }
     }
 
@@ -281,7 +243,7 @@ public class MDSALManager implements AutoCloseable {
                 }
             });
         } catch (Exception e) {
-            s_logger.error("Could not remove Group: {}, exception: {}", groupEntity, e.getMessage());
+            s_logger.error("Could not remove Group: {}, exception: {}", groupEntity, e);
         }
     }
 
@@ -290,21 +252,6 @@ public class MDSALManager implements AutoCloseable {
         installGroup(groupEntity);
     }
 
-    private String generateTransactionUri() {
-        long lTransactionIdOut = m_atomicInteger.incrementAndGet();
-
-        // TO DO Introduce this later
-      //  return "" + (lTransactionIdOut | m_lTransactionIdPrefix);
-        return "" + (lTransactionIdOut );
-    }
-/*
-    private String generateTransactionUriForFlow(long nTransactionId) {
-        long lTransactionIdOut = m_atomicInteger.incrementAndGet();
-        return Long.toString((lTransactionIdOut | m_lTransactionIdPrefix)) + EUtil.TRANSACTION_ID_SEPARATOR
-                + Long.toString(nTransactionId);
-    }
-*/
-
     public void sendPacketOut(long lDpnId, int groupId, byte[] payload) {
 
         List<ActionInfo> actionInfos = new ArrayList<ActionInfo>();
@@ -324,12 +271,6 @@ public class MDSALManager implements AutoCloseable {
                 getNodeConnRef("openflow:" + lDpnId, "0xfffffffd")));
     }
 
-    private NodeKey getNodeKey(long dpId) {
-        String nodeId = "openflow:" + dpId;
-        NodeKey nodeKey = new NodeKey(new NodeId(nodeId));
-        return nodeKey;
-    }
-
     public InstanceIdentifier<Node> nodeToInstanceId(Node node) {
         return InstanceIdentifier.builder(Nodes.class).child(Node.class, node.getKey()).toInstance();
     }
@@ -353,11 +294,6 @@ public class MDSALManager implements AutoCloseable {
         return _nodeConnectorRef;
     }
 
-    private long getDpnIdFromNodeName(String nodeName) {
-        String dpId = nodeName.substring(nodeName.lastIndexOf(":") + 1);
-        return Long.parseLong(dpId);
-    }
-
     private Node buildDpnNode(long lDpnId) {
         NodeId nodeId = new NodeId("openflow:" + lDpnId);
         Node nodeDpn = new NodeBuilder().setId(nodeId).setKey(new NodeKey(nodeId)).build();
index 6246d9c70b5f3e7bdcfca73010ac40906c8589e7..af1baa494f7ce541f0b4d6213c5e6d4e1b51215f 100644 (file)
@@ -90,11 +90,4 @@ public class MDSALUtilProvider implements BindingAwareConsumer, IMdsalApiManager
         mdSalMgr.sendARPPacketOutWithActions(dpid, payload, action_info);
     }
 
-
-    @Override
-    public void printTest() {
-        // TODO Auto-generated method stub
-        mdSalMgr.printTest();
-    }
-
 }
index 3d52a99d2fb159371cbdf9bf8bd8bf80bf0ff486..4009e9b9ecb1e4c87ea9cf7484e5e8052c94b469 100644 (file)
@@ -16,7 +16,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
 
   <groupId>org.opendaylight.vpnservice</groupId>
   <artifactId>mdsalutil-aggregator</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
+  <version>0.1.0-SNAPSHOT</version>
   <name>mdsalutil</name>
   <packaging>pom</packaging>
   <modelVersion>4.0.0</modelVersion>
index 1a205a397b91dd00fd6834d13069f2fa5033837a..1690640ab1b06cbeef90d97272b59975cfbe4314 100644 (file)
@@ -12,7 +12,7 @@
   <parent>
     <groupId>org.opendaylight.vpnservice</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <relativePath>../commons/binding-parent</relativePath>
   </parent>
 
index 24e58e6b5e965a21594f7ac339859cddb6a99087..74cda60a21cd4a7e4e40074b530f1139ffc82ba1 100644 (file)
@@ -10,7 +10,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.vpnservice</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <relativePath>../../commons/binding-parent</relativePath>
   </parent>
 
index 7a287b5b5816e0e669f2068d2c6a9f830a6bdf3b..8fdc6902279402ae725752327d9aa4ff166a10f5 100644 (file)
@@ -40,6 +40,7 @@ module l3nexthop {
                }
                output { 
                        leaf egressPointer {type uint32;} 
+                       leaf localDestination {type boolean;}
                }
        }
 }
\ No newline at end of file
index 601bc90f4a7aedc0149c9d234a85689e07ecc4c2..d039f5cc8164193f19d78c7f4e0f4f09427596cd 100644 (file)
@@ -11,7 +11,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.vpnservice</groupId>
     <artifactId>config-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <relativePath>../../commons/config-parent</relativePath>
   </parent>
 
index 18c12e6176a418225d97c27a43dff7b2b516fb4a..5df30835bbada9d6395ea798b6a6908019769f7c 100644 (file)
@@ -33,6 +33,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <type xmlns:odlif="urn:opendaylight:vpnservice:interfacemgr">odlif:odl-interface</type>
             <name>interfacemgr-service</name>
           </odlinterface>
+          <rpc-registry>
+            <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-rpc-registry</type>
+            <name>binding-rpc-broker</name>
+          </rpc-registry>
         </module>
       </modules>
     </data>
index 546e60f8a91ee5970da596eb3d4cfdf3b9c1d66e..ab5b2772b4be21531ae5fe18df8d525712806c46 100644 (file)
@@ -122,12 +122,12 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
 
         InstanceIdentifier<VpnInstance> id = idBuilder.build();
         InstanceIdentifier<VpnInstance1> idx = id.augmentation(VpnInstance1.class);
-        Optional<VpnInstance1> vpn = read(LogicalDatastoreType.CONFIGURATION, idx);
+        Optional<VpnInstance1> vpn = read(LogicalDatastoreType.OPERATIONAL, idx);
 
         if (vpn.isPresent()) {
             return vpn.get().getVpnId();
         } else {
-            return 0;
+            return -1;
         }
     }
 
@@ -165,7 +165,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
             BucketInfo bucket = new BucketInfo(listActionInfo);
             // MAC re-write
             if (macAddress != null) {
-                listActionInfo.add(new ActionInfo(ActionType.set_field_eth_dest, new String[]{macAddress}));
+               listActionInfo.add(0, new ActionInfo(ActionType.set_field_eth_dest, new String[]{macAddress}));
             } else {
                 //FIXME: Log message here.
             }
@@ -214,7 +214,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
 
         // check if vpn node is there or to be created
         InstanceIdentifier<VpnNexthops> id = idBuilder.build();
-        Optional<VpnNexthops> nexthops = read(LogicalDatastoreType.CONFIGURATION, id);
+        Optional<VpnNexthops> nexthops = read(LogicalDatastoreType.OPERATIONAL, id);
         if (!nexthops.isPresent()) {
             // create a new node
             VpnNexthops node = new VpnNexthopsBuilder().setKey(new VpnNexthopsKey(vpnId)).setVpnId(vpnId).build();
@@ -240,7 +240,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
 
         // check if dpn node is there or to be created
         InstanceIdentifier<TunnelNexthops> id = idBuilder.build();
-        Optional<TunnelNexthops> nexthops = read(LogicalDatastoreType.CONFIGURATION, id);
+        Optional<TunnelNexthops> nexthops = read(LogicalDatastoreType.OPERATIONAL, id);
         if (!nexthops.isPresent()) {
             // create a new node
             TunnelNexthops node = new TunnelNexthopsBuilder()
@@ -269,8 +269,8 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
         InstanceIdentifierBuilder<VpnNexthops> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
                 .child(VpnNexthops.class, new VpnNexthopsKey(vpnId));
         InstanceIdentifier<VpnNexthops> id = idBuilder.build();
-        Optional<VpnNexthops> vpnNexthops = read(LogicalDatastoreType.CONFIGURATION, id);
-        if (!vpnNexthops.isPresent()) {
+        Optional<VpnNexthops> vpnNexthops = read(LogicalDatastoreType.OPERATIONAL, id);
+        if (vpnNexthops.isPresent()) {
 
             // get nexthops list for vpn
             List<VpnNexthop> nexthops = vpnNexthops.get().getVpnNexthop();
@@ -292,8 +292,8 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
 
         // check if vpn node is there 
         InstanceIdentifier<TunnelNexthops> id = idBuilder.build();
-        Optional<TunnelNexthops> dpnNexthops = read(LogicalDatastoreType.CONFIGURATION, id);
-        if (!dpnNexthops.isPresent()) {
+        Optional<TunnelNexthops> dpnNexthops = read(LogicalDatastoreType.OPERATIONAL, id);
+        if (dpnNexthops.isPresent()) {
             List<TunnelNexthop> nexthops = dpnNexthops.get().getTunnelNexthop();
             for (TunnelNexthop nexthop : nexthops) {
                 if (nexthop.getIpAddress().equals(ipAddress)) {
@@ -374,11 +374,19 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
     @Override
     public Future<RpcResult<GetEgressPointerOutput>> getEgressPointer(
             GetEgressPointerInput input) {
-        long egressGroupId =
-                getNextHopPointer(input.getDpnId(), input.getVpnId(), input.getIpPrefix(), input.getNexthopIp());
 
         GetEgressPointerOutputBuilder output = new GetEgressPointerOutputBuilder();
-        output.setEgressPointer(egressGroupId);
+
+        String endpointIp = interfaceManager.getEndpointIpForDpn(input.getDpnId());
+        if (input.getNexthopIp().equals(endpointIp)) {
+            VpnNexthop vpnNextHop = getVpnNexthop(input.getVpnId(), input.getIpPrefix());
+            output.setEgressPointer(vpnNextHop.getEgressPointer());
+            output.setLocalDestination(true);
+        } else {
+            TunnelNexthop tunnelNextHop = getTunnelNexthop(input.getDpnId(), input.getNexthopIp());
+            output.setEgressPointer(tunnelNextHop.getEgressPointer());
+            output.setLocalDestination(false);
+        }
 
         RpcResultBuilder<GetEgressPointerOutput> rpcResultBuilder = RpcResultBuilder.success();
         rpcResultBuilder.withResult(output.build());
index 2e1456622e0494d19ff069a05af40e0b824873a9..51494d92efcbffdea25f8bf7a76cf1712d792718 100644 (file)
@@ -8,13 +8,15 @@
 package org.opendaylight.vpnservice.nexthopmgr;
 
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
 import org.opendaylight.vpnservice.nexthopmgr.NexthopManager;
 import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.L3nexthopService;
 import org.opendaylight.idmanager.IdManager;
-
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -27,6 +29,15 @@ public class NexthopmgrProvider implements BindingAwareProvider, AutoCloseable {
     private IMdsalApiManager mdsalManager;
     private IInterfaceManager interfaceManager;
     private IdManager idManager;
+    private RpcProviderRegistry rpcProviderRegistry;
+
+    public RpcProviderRegistry getRpcProviderRegistry() {
+        return rpcProviderRegistry;
+    }
+
+    public void setRpcProviderRegistry(RpcProviderRegistry rpcProviderRegistry) {
+        this.rpcProviderRegistry = rpcProviderRegistry;
+    }
 
     @Override
     public void onSessionInitiated(ProviderContext session) {
@@ -35,6 +46,7 @@ public class NexthopmgrProvider implements BindingAwareProvider, AutoCloseable {
         vpnIfListener = new VpnInterfaceChangeListener(dbx, nhManager);
         odlIfListener = new OdlInterfaceChangeListener(dbx, nhManager, interfaceManager);
         idManager = new IdManager(dbx);
+        final BindingAwareBroker.RpcRegistration<L3nexthopService> rpcRegistration = getRpcProviderRegistry().addRpcImplementation(L3nexthopService.class, nhManager);
         nhManager.setMdsalManager(mdsalManager);
         nhManager.setInterfaceManager(interfaceManager);
         nhManager.setIdManager(idManager);
@@ -50,6 +62,10 @@ public class NexthopmgrProvider implements BindingAwareProvider, AutoCloseable {
         this.interfaceManager = interfaceManager;
     }
 
+    public NexthopmgrProvider(RpcProviderRegistry rpcRegistry) {
+        this.rpcProviderRegistry = rpcRegistry;
+    }
+
     @Override
     public void close() throws Exception {
         vpnIfListener.close();
index 4b7d4aeac0b4b6383594d0cf477110b95f8df7fe..7d2a8f28cfb21795778a6a96fbae8c08f06c868a 100644 (file)
@@ -18,10 +18,9 @@ public class NexthopmgrImplModule extends org.opendaylight.yang.gen.v1.urn.opend
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        NexthopmgrProvider provider = new NexthopmgrProvider();
+        NexthopmgrProvider provider = new NexthopmgrProvider(getRpcRegistryDependency());
         provider.setMdsalManager(getMdsalutilDependency());
         provider.setInterfaceManager(getOdlinterfaceDependency());
-
         getBrokerDependency().registerProvider(provider);
         return provider;
     }
index 3b50fdaf2309b1cb021c1babc642d4e3075bdf59..6e29481b8d9c53a8580797a1cc1a1e1f7c3082e4 100644 (file)
@@ -48,6 +48,14 @@ module nexthopmgr-impl {
                     }
                 }
             }
+            container rpc-registry {
+                 uses config:service-ref {
+                      refine type {
+                         mandatory true;
+                         config:required-identity md-sal-binding:binding-rpc-registry;
+                      }
+                 }
+            }
         }
     }
 }
index 061a8091e8a680098c3e5e69fa5ded328b528ad7..da111f90c0c1e7b6d451b762b5884bd23b0e807b 100644 (file)
@@ -16,7 +16,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
 
   <groupId>org.opendaylight.vpnservice</groupId>
   <artifactId>nexthopmgr-aggregator</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
+  <version>0.1.0-SNAPSHOT</version>
   <name>nexthopmgr</name>
   <packaging>pom</packaging>
   <modelVersion>4.0.0</modelVersion>
diff --git a/pom.xml b/pom.xml
index 7c29c75c64b1dbd3e43f6eca07dde5c657abd0a0..2a0bd1d14e2b93eff048dc807a77d8679b653a44 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -8,7 +8,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <groupId>org.opendaylight.vpnservice</groupId>
   <artifactId>vpnservice</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
+  <version>0.1.0-SNAPSHOT</version>
   <name>${project.artifactId}</name>
   <packaging>pom</packaging>
   <modelVersion>4.0.0</modelVersion>
index 49922b6b2f42bbcc9fa39db2b6cd84d7c7321d83..c4f23f981da64088e1cbdec7247223b1604c9a2b 100644 (file)
@@ -11,12 +11,12 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
     <groupId>org.opendaylight.odlparent</groupId>
     <artifactId>odlparent</artifactId>
     <version>1.5.0-SNAPSHOT</version>
-       <relativePath/>
+    <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.vpnservice</groupId>
   <artifactId>vpnmanager</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
+  <version>0.1.0-SNAPSHOT</version>
   <name>vpnmanager</name>
   <packaging>pom</packaging>
   <modelVersion>4.0.0</modelVersion>
index b042c1eb3e9816184aa66665420b9b71f0362b84..1f9f1584bc9471215eb9c78c147c2f20699ec296 100644 (file)
@@ -9,8 +9,8 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
     <groupId>org.opendaylight.vpnservice</groupId>
-    <artifactId>binding-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <artifactId>config-parent</artifactId>
+    <version>0.1.0-SNAPSHOT</version>
     <relativePath>../../commons/binding-parent</relativePath>
   </parent>
 
@@ -61,5 +61,9 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <artifactId>model-bgp</artifactId>
       <version>${model.bgp.version}</version>
     </dependency>
+    <dependency>
+        <groupId>org.opendaylight.controller</groupId>
+        <artifactId>config-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/vpnmanager/vpnmanager-api/src/main/java/org/opendaylight/vpnmanager/api/IVpnManager.java b/vpnmanager/vpnmanager-api/src/main/java/org/opendaylight/vpnmanager/api/IVpnManager.java
new file mode 100644 (file)
index 0000000..3748ec1
--- /dev/null
@@ -0,0 +1,7 @@
+package org.opendaylight.vpnmanager.api;
+
+import java.util.Collection;
+
+public interface IVpnManager {
+    Collection<Long> getDpnsForVpn(long vpnId);
+}
diff --git a/vpnmanager/vpnmanager-api/src/main/yang/vpnmanager-api.yang b/vpnmanager/vpnmanager-api/src/main/yang/vpnmanager-api.yang
new file mode 100644 (file)
index 0000000..eb73fb4
--- /dev/null
@@ -0,0 +1,20 @@
+module vpnmanager-api {
+    yang-version 1;
+    namespace "urn:opendaylight:params:xml:ns:yang:vpnmanager:api";
+    prefix "vpnmanager-api";
+
+    import config { prefix config; revision-date 2013-04-05; }
+
+    description
+        "Service definition for vpnmanager project";
+
+    revision "2015-05-08" {
+        description
+            "Initial revision";
+    }
+
+    identity vpnmanager-api {
+        base "config:service-type";
+        config:java-class "org.opendaylight.vpnmanager.api.IVpnManager";
+    }
+}
\ No newline at end of file
index 7846979c78517460a25fd4b214bb13e891990e7e..9b2f5feeb07b9b85acde5e468d34669f1c482707 100644 (file)
@@ -11,7 +11,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.vpnservice</groupId>
     <artifactId>config-parent</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <relativePath>../../commons/config-parent</relativePath>
   </parent>
 
@@ -46,6 +46,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <artifactId>interfacemgr-api</artifactId>
       <version>${vpnservices.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.vpnservice</groupId>
+      <artifactId>idmanager-api</artifactId>
+      <version>${vpnservices.version}</version>
+    </dependency>
   </dependencies>
 
 </project>
index 3d718ff744e4e50793bdd85de40ca4e4be69a244..8312c9f7904e7fd56b49f203c425c0c191753719 100644 (file)
@@ -26,6 +26,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
             <name>binding-osgi-broker</name>
           </broker>
+          <rpcregistry>
+            <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-rpc-registry</type>
+            <name>binding-rpc-broker</name>
+          </rpcregistry>
           <bgpmanager>
             <type xmlns:bgpmanager="urn:opendaylight:params:xml:ns:yang:bgpmanager:api">bgpmanager:bgpmanager-api</type>
             <name>bgpmanager</name>
@@ -40,6 +44,15 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
           </odlinterface>
         </module>
       </modules>
+      <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+        <service>
+          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:vpnmanager:api">prefix:vpnmanager-api</type>
+          <instance>
+            <name>vpnmanager</name>
+            <provider>/modules/module[type='vpnservice-impl'][name='vpnservice-default']</provider>
+          </instance>
+        </service>
+      </services>
     </data>
   </configuration>
 </snapshot>
diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnConstants.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnConstants.java
new file mode 100644 (file)
index 0000000..69c190f
--- /dev/null
@@ -0,0 +1,10 @@
+package org.opendaylight.vpnservice;
+
+public class VpnConstants {
+    public static final String VPN_IDPOOL_NAME = "vpnservices";
+    public static final long VPN_IDPOOL_START = 1L;
+    public static final String VPN_IDPOOL_SIZE = "65535";
+    public static final short LPORT_INGRESS_TABLE = 0;
+    public static final short FIB_TABLE = 21;
+    public static final short DEFAULT_FLOW_PRIORITY = 10;
+}
index 48926683c75fe9fc7ae6ab3055c9fa48a8c9a32a..3221a474f4f50612d263fe4537ef4f6ef3164f85 100644 (file)
@@ -8,10 +8,18 @@
 package org.opendaylight.vpnservice;
 
 import java.math.BigInteger;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.ArrayList;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 
 import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.FutureCallback;
 
@@ -31,6 +39,7 @@ import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
+import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -42,6 +51,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.AdjacencyLi
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.AdjacencyBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInstance1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnAfConfig;
@@ -62,6 +75,9 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
     private final IBgpManager bgpManager;
     private IMdsalApiManager mdsalManager;
     private IInterfaceManager interfaceManager;
+    private IdManagerService idManager;
+    private Map<Long, Collection<Long>> vpnToDpnsDb;
+    private Map<Long, Collection<String>> dpnToInterfaceDb;
 
     private static final FutureCallback<Void> DEFAULT_CALLBACK =
             new FutureCallback<Void>() {
@@ -84,6 +100,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         super(VpnInterface.class);
         broker = db;
         this.bgpManager = bgpManager;
+        vpnToDpnsDb = new ConcurrentHashMap<>();
+        dpnToInterfaceDb = new ConcurrentHashMap<>();
         registerListener(db);
     }
 
@@ -91,6 +109,14 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         this.mdsalManager = mdsalManager;
     }
 
+    public void setInterfaceManager(IInterfaceManager interfaceManager) {
+        this.interfaceManager = interfaceManager;
+    }
+
+    public void setIdManager(IdManagerService idManager) {
+        this.idManager = idManager;
+    }
+
     @Override
     public void close() throws Exception {
         if (listenerRegistration != null) {
@@ -117,7 +143,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
     @Override
     protected void add(final InstanceIdentifier<VpnInterface> identifier,
             final VpnInterface vpnInterface) {
-        LOG.info("key: {} , value: {}", identifier, vpnInterface );
+        LOG.trace("key: {} , value: {}", identifier, vpnInterface );
         addInterface(identifier, vpnInterface);
     }
 
@@ -148,17 +174,17 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
 
             //Get the rd of the vpn instance
             String rd = getRouteDistinguisher(intf.getVpnInstanceName());
-            //TODO: Get the endpoint IP from interface manager
-            String nextHopIp = "10.0.0.1";
+
+            long dpnId = interfaceManager.getDpnForInterface(intfName);
+            String nextHopIp = interfaceManager.getEndpointIpForDpn(dpnId);
 
             if (!nextHops.isEmpty()) {
-                LOG.info("NextHops are {}", nextHops);
+                LOG.trace("NextHops are {}", nextHops);
                 for (Adjacency nextHop : nextHops) {
-                    //TODO: Generate label for the prefix and store it in the next hop model
-                    long label = 200;
+                    String key = nextHop.getIpAddress();
+                    long label = getUniqueId(key);
 
-                    //TODO: Update BGP
-                    updatePrefixToBGP(rd, nextHop, nextHopIp);
+                    updatePrefixToBGP(rd, nextHop, nextHopIp, label);
                     value.add(new AdjacencyBuilder(nextHop).setLabel(label).build());
                 }
             }
@@ -169,10 +195,31 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         }
     }
 
+    private Integer getUniqueId(String idKey) {
+        GetUniqueIdInput getIdInput = new GetUniqueIdInputBuilder()
+                                           .setPoolName(VpnConstants.VPN_IDPOOL_NAME)
+                                           .setIdKey(idKey).build();
+
+        try {
+            Future<RpcResult<GetUniqueIdOutput>> result = idManager.getUniqueId(getIdInput);
+            RpcResult<GetUniqueIdOutput> rpcResult = result.get();
+            if(rpcResult.isSuccessful()) {
+                return rpcResult.getResult().getIdValue().intValue();
+            } else {
+                LOG.warn("RPC Call to Get Unique Id returned with Errors {}", rpcResult.getErrors());
+            }
+        } catch (NullPointerException | InterruptedException | ExecutionException e) {
+            LOG.warn("Exception when getting Unique Id",e);
+        }
+        return 0;
+    }
+
     private long getVpnId(String vpnName) {
+        //TODO: This should be a Util function
         InstanceIdentifier<VpnInstance1> id = InstanceIdentifier.builder(VpnInstances.class)
                 .child(VpnInstance.class, new VpnInstanceKey(vpnName)).augmentation(VpnInstance1.class).build();
-        Optional<VpnInstance1> vpnInstance = read(LogicalDatastoreType.CONFIGURATION, id);
+        Optional<VpnInstance1> vpnInstance = read(LogicalDatastoreType.OPERATIONAL, id);
+        //TODO: Default vpnid should be a constant.
         long vpnId = -1;
         if(vpnInstance.isPresent()) {
             vpnId = vpnInstance.get().getVpnId();
@@ -193,21 +240,60 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         return rd;
     }
 
+    private synchronized void updateMappingDbs(long vpnId, long dpnId, String intfName) {
+        Collection<Long> dpnIds = vpnToDpnsDb.get(vpnId);
+        if(dpnIds == null) {
+            dpnIds = new HashSet<>();
+        }
+        if(dpnIds.add(dpnId)) {
+            vpnToDpnsDb.put(vpnId, dpnIds);
+            //TODO: Send an Event that new DPN added...
+        }
+
+        Collection<String> intfNames = dpnToInterfaceDb.get(dpnId);
+        if(intfNames == null) {
+            intfNames = new ArrayList<>();
+        }
+        intfNames.add(intfName);
+        dpnToInterfaceDb.put(dpnId, intfNames);
+    }
+
+    private synchronized void remoteFromMappingDbs(long vpnId, long dpnId, String inftName) {
+        Collection<String> intfNames = dpnToInterfaceDb.get(dpnId);
+        if(intfNames == null) {
+            return;
+        }
+        intfNames.remove(inftName);
+        dpnToInterfaceDb.put(dpnId, intfNames);
+        if(intfNames.isEmpty()) {
+            Collection<Long> dpnIds = vpnToDpnsDb.get(vpnId);
+            if(dpnIds == null) {
+                return;
+            }
+            dpnIds.remove(dpnId);
+            vpnToDpnsDb.put(vpnId, dpnIds);
+        }
+    }
+
     private void bindServiceOnInterface(Interface intf, long vpnId) {
-        LOG.info("Bind service on interface {} for VPN: {}", intf, vpnId);
-        //TODO: Create Ingress flow on the interface to bind the VPN service
-        //TODO: Get dpn ID from the interface manager
-        long dpId = 1;
-        short LPORT_INGRESS_TABLE = 0;
-        //TODO: Get the port no from interface manager
-        int portNo = 1;
-        String flowRef = getL3InterfaceFlowRef(dpId, LPORT_INGRESS_TABLE, vpnId, portNo);
+        LOG.trace("Bind service on interface {} for VPN: {}", intf, vpnId);
+
+        long dpId = interfaceManager.getDpnForInterface(intf.getName()); 
+        if(dpId == 0L) {
+            LOG.warn("DPN for interface {} not found. Bind service on this interface aborted.", intf.getName());
+            return;
+        } else {
+            updateMappingDbs(vpnId, dpId, intf.getName());
+        }
+
+        long portNo = interfaceManager.getPortForInterface(intf.getName());
+        String flowRef = getVpnInterfaceFlowRef(dpId, VpnConstants.LPORT_INGRESS_TABLE, vpnId, portNo);
 
         String flowName = intf.getName();
         BigInteger COOKIE_VM_INGRESS_TABLE = new BigInteger("8000001", 16);
 
-        int priority = 10; //L3Constants.DEFAULT_L3_FLOW_PRIORITY;
-        short gotoTableId = 21; //L3Constants.L3_FIB_TABLE;
+        int priority = VpnConstants.DEFAULT_FLOW_PRIORITY;
+        short gotoTableId = VpnConstants.FIB_TABLE;
 
         List<InstructionInfo> mkInstructions = new ArrayList<InstructionInfo>();
         mkInstructions.add(new InstructionInfo(InstructionType.write_metadata, new BigInteger[] {
@@ -219,23 +305,20 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         matches.add(new MatchInfo(MatchFieldType.in_port, new long[] {
                 dpId, portNo }));
 
-        FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpId, LPORT_INGRESS_TABLE, flowRef,
+        FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpId, VpnConstants.LPORT_INGRESS_TABLE, flowRef,
                           priority, flowName, 0, 0, COOKIE_VM_INGRESS_TABLE, matches, mkInstructions);
 
         mdsalManager.installFlow(flowEntity);
     }
 
-    private String getL3InterfaceFlowRef(long dpId, short tableId,
-            long vpnId, int portNo) {
+    private String getVpnInterfaceFlowRef(long dpId, short tableId,
+            long vpnId, long portNo) {
         return new StringBuilder().append(dpId).append(tableId).append(vpnId).append(portNo).toString();
     }
 
-    private void updatePrefixToBGP(String rd, Adjacency nextHop, String nextHopIp) {
-        //TODO: Update the Prefix to BGP
-        //public void addPrefix(String rd, String prefix, String nextHop, int vpnLabel)
-        int label = nextHop.getLabel().intValue();
+    private void updatePrefixToBGP(String rd, Adjacency nextHop, String nextHopIp, long label) {
         try {
-            bgpManager.addPrefix(rd, nextHop.getIpAddress(), nextHopIp, label);
+            bgpManager.addPrefix(rd, nextHop.getIpAddress(), nextHopIp, (int)label);
         } catch(Exception e) {
             LOG.error("Add prefix failed", e);
         }
@@ -262,7 +345,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
 
     @Override
     protected void remove( InstanceIdentifier<VpnInterface> identifier, VpnInterface vpnInterface) {
-        LOG.info("Remove event - key: {}, value: {}" ,identifier, vpnInterface );
+        LOG.trace("Remove event - key: {}, value: {}" ,identifier, vpnInterface );
         final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class);
         String interfaceName = key.getName();
         InstanceIdentifierBuilder<Interface> idBuilder = 
@@ -271,10 +354,10 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         Optional<Interface> port = read(LogicalDatastoreType.CONFIGURATION, id);
         if (port.isPresent()) {
             Interface interf = port.get();
-            unbindServiceOnInterface(interf);
             removeNextHops(identifier, vpnInterface);
+            unbindServiceOnInterface(interf, getVpnId(vpnInterface.getVpnInstanceName()));
         } else {
-            LOG.info("No nexthops were available to handle remove event {}", interfaceName);
+            LOG.warn("No nexthops were available to handle remove event {}", interfaceName);
         }
     }
 
@@ -283,21 +366,19 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         InstanceIdentifier<Adjacencies> path = identifier.augmentation(Adjacencies.class);
         Optional<Adjacencies> adjacencies = read(LogicalDatastoreType.OPERATIONAL, path);
         String intfName = intf.getName();
-
+        String rd = getRouteDistinguisher(intf.getVpnInstanceName());
         if (adjacencies.isPresent()) {
             List<Adjacency> nextHops = adjacencies.get().getAdjacency();
 
             if (!nextHops.isEmpty()) {
                 LOG.trace("NextHops are " + nextHops);
                 for (Adjacency nextHop : nextHops) {
-                    //TODO: Update BGP
-                    removePrefixFromBGP(nextHop);
+                    removePrefixFromBGP(rd, nextHop);
                 }
             }
-
-            InstanceIdentifier<VpnInterface> interfaceId = VpnUtil.getVpnInterfaceIdentifier(intfName);
-            delete(LogicalDatastoreType.OPERATIONAL, interfaceId);
         }
+        InstanceIdentifier<VpnInterface> interfaceId = VpnUtil.getVpnInterfaceIdentifier(intfName);
+        delete(LogicalDatastoreType.OPERATIONAL, interfaceId);
     }
 
     private <T extends DataObject> void delete(LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
@@ -306,12 +387,41 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         Futures.addCallback(tx.submit(), DEFAULT_CALLBACK);
     }
 
-    private void unbindServiceOnInterface(Interface intf) {
-        //TODO: Remove Ingress flow on the interface to unbind the VPN service
+    private void unbindServiceOnInterface(Interface intf, long vpnId) {
+        LOG.trace("Unbind service on interface {} for VPN: {}", intf, vpnId);
+
+        long dpId = interfaceManager.getDpnForInterface(intf.getName());
+        if(dpId == 0L) {
+            LOG.warn("DPN for interface {} not found. Unbind service on this interface aborted.", intf.getName());
+            return;
+        } else {
+            remoteFromMappingDbs(vpnId, dpId, intf.getName());
+        }
+
+        long portNo = interfaceManager.getPortForInterface(intf.getName());
+        String flowRef = getVpnInterfaceFlowRef(dpId, VpnConstants.LPORT_INGRESS_TABLE, vpnId, portNo);
+
+        String flowName = intf.getName();
+
+        int priority = VpnConstants.DEFAULT_FLOW_PRIORITY;
+
+        List<MatchInfo> matches = new ArrayList<MatchInfo>();
+        matches.add(new MatchInfo(MatchFieldType.in_port, new long[] {
+                dpId, portNo }));
+
+        FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpId, VpnConstants.LPORT_INGRESS_TABLE, flowRef,
+                          priority, flowName, 0, 0, null, matches, null);
+
+        mdsalManager.removeFlow(flowEntity);
     }
 
-    private void removePrefixFromBGP(Adjacency nextHop) {
-        //TODO: Update the Prefix to BGP
+    private void removePrefixFromBGP(String rd, Adjacency nextHop) {
+        //public void deletePrefix(String rd, String prefix) throws Exception;
+        try {
+            bgpManager.deletePrefix(rd, nextHop.getIpAddress());
+        } catch(Exception e) {
+            LOG.error("Delete prefix failed", e);
+        }
     }
 
     @Override
@@ -327,4 +437,13 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         tx.put(datastoreType, path, data, true);
         Futures.addCallback(tx.submit(), callback);
     }
+
+    synchronized Collection<Long> getDpnsForVpn(long vpnId) {
+        Collection<Long> dpnIds = vpnToDpnsDb.get(vpnId);
+        if(dpnIds != null) {
+            return ImmutableList.copyOf(dpnIds);
+        } else {
+            return Collections.emptyList();
+        }
+    }
 }
index c05506bb739ff74fa14e38623b9ce7e2db47d2af..3689cbbe21395c9f5b07089a026d0d716888482a 100644 (file)
@@ -11,6 +11,8 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 
 import org.opendaylight.bgpmanager.api.IBgpManager;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
@@ -20,6 +22,7 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataCh
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnAfConfig;
@@ -32,6 +35,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev15
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTablesKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.vrfentries.VrfEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,6 +51,7 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
     private ListenerRegistration<DataChangeListener> listenerRegistration, fibListenerRegistration;
     private final DataBroker broker;
     private final IBgpManager bgpManager;
+    private IdManagerService idManager;
     private final FibEntriesListener fibListener;
 
     private static final FutureCallback<Void> DEFAULT_CALLBACK =
@@ -83,38 +91,43 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
         }
     }
 
+    public void setIdManager(IdManagerService idManager) {
+        this.idManager = idManager;
+    }
+
     @Override
-    protected void remove(InstanceIdentifier<VpnInstance> identifier,
-            VpnInstance del) {
-        // TODO Auto-generated method stub
+    protected void remove(InstanceIdentifier<VpnInstance> identifier, VpnInstance del) {
+        LOG.trace("Remove event - Key: {}, value: {}", identifier, del);
+        String vpnName = del.getVpnInstanceName();
+        InstanceIdentifier<VpnInstance> vpnIdentifier = VpnUtil.getVpnInstanceIdentifier(vpnName);
+        delete(LogicalDatastoreType.OPERATIONAL, vpnIdentifier);
+
+        String rd = del.getIpv4Family().getRouteDistinguisher();
+        try {
+            bgpManager.deleteVrf(rd);
+        } catch(Exception e) {
+            LOG.error("Exception when removing VRF from BGP", e);
+        }
     }
 
     @Override
     protected void update(InstanceIdentifier<VpnInstance> identifier,
             VpnInstance original, VpnInstance update) {
-        // TODO Auto-generated method stub
+        LOG.trace("Update event - Key: {}, value: {}", identifier, update);
     }
 
     @Override
     protected void add(InstanceIdentifier<VpnInstance> identifier,
             VpnInstance value) {
-        LOG.info("key: {}, value: {}" +identifier, value);
-        //TODO: Generate VPN ID for this instance, where to store in model ... ?
-        long vpnId = 1000;
-        InstanceIdentifier<VpnInstance1> augId = identifier.augmentation(VpnInstance1.class);
-        Optional<VpnInstance1> vpnAugmenation = read(LogicalDatastoreType.CONFIGURATION, augId);
-        if(vpnAugmenation.isPresent()) {
-            VpnInstance1 vpn = vpnAugmenation.get();
-            vpnId = vpn.getVpnId();
-            LOG.info("VPN ID is {}", vpnId);
-        }
+        LOG.trace("key: {}, value: {}", identifier, value);
+
+        long vpnId = getUniqueId(value.getVpnInstanceName());
 
         VpnInstance opValue = new VpnInstanceBuilder(value).
                  addAugmentation(VpnInstance1.class, new VpnInstance1Builder().setVpnId(vpnId).build()).build();
 
         asyncWrite(LogicalDatastoreType.OPERATIONAL, identifier, opValue, DEFAULT_CALLBACK);
 
-        //TODO: Add VRF to BGP
         //public void addVrf(String rd, Collection<String> importRts, Collection<String> exportRts)
         VpnAfConfig config = value.getIpv4Family();
         String rd = config.getRouteDistinguisher();
@@ -193,6 +206,31 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
         return null;
     }
 
+    private Integer getUniqueId(String idKey) {
+        GetUniqueIdInput getIdInput = new GetUniqueIdInputBuilder()
+                                           .setPoolName(VpnConstants.VPN_IDPOOL_NAME)
+                                           .setIdKey(idKey).build();
+
+        try {
+            Future<RpcResult<GetUniqueIdOutput>> result = idManager.getUniqueId(getIdInput);
+            RpcResult<GetUniqueIdOutput> rpcResult = result.get();
+            if(rpcResult.isSuccessful()) {
+                return rpcResult.getResult().getIdValue().intValue();
+            } else {
+                LOG.warn("RPC Call to Get Unique Id returned with Errors {}", rpcResult.getErrors());
+            }
+        } catch (NullPointerException | InterruptedException | ExecutionException e) {
+            LOG.warn("Exception when getting Unique Id",e);
+        }
+        return 0;
+    }
+
+    private <T extends DataObject> void delete(LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
+        WriteTransaction tx = broker.newWriteOnlyTransaction();
+        tx.delete(datastoreType, path);
+        Futures.addCallback(tx.submit(), DEFAULT_CALLBACK);
+    }
+
     private class FibEntriesListener extends AbstractDataChangeListener<VrfEntry>  {
 
         public FibEntriesListener() {
@@ -202,8 +240,32 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
         @Override
         protected void remove(InstanceIdentifier<VrfEntry> identifier,
                 VrfEntry del) {
-            // TODO Auto-generated method stub
-
+            LOG.trace("Remove Fib event - Key : {}, value : {} ", identifier, del);
+            final VrfTablesKey key = identifier.firstKeyOf(VrfTables.class, VrfTablesKey.class);
+            String rd = key.getRouteDistinguisher();
+            Long label = del.getLabel();
+            VpnInstance vpn = getVpnForRD(rd);
+            if(vpn != null) {
+                InstanceIdentifier<VpnInstance> id = VpnUtil.getVpnInstanceIdentifier(vpn.getVpnInstanceName());
+                InstanceIdentifier<VpnInstance1> augId = id.augmentation(VpnInstance1.class);
+                Optional<VpnInstance1> vpnAugmenation = read(LogicalDatastoreType.OPERATIONAL, augId);
+                if(vpnAugmenation.isPresent()) {
+                    VpnInstance1 vpnAug = vpnAugmenation.get();
+                    List<Long> routeIds = vpnAug.getRouteEntryId();
+                    if(routeIds == null) {
+                        LOG.debug("Fib Route entry is empty.");
+                        return;
+                    }
+                    LOG.debug("Removing label from vpn info - {}", label);
+                    routeIds.remove(label);
+                    asyncWrite(LogicalDatastoreType.OPERATIONAL, augId,
+                            new VpnInstance1Builder(vpnAug).setRouteEntryId(routeIds).build(), DEFAULT_CALLBACK);
+                } else {
+                    LOG.warn("VPN Augmentation not found for vpn instance {}", vpn.getVpnInstanceName());
+                }
+            } else {
+                LOG.warn("No VPN Instance found for RD: {}", rd);
+            }
         }
 
         @Override
@@ -216,7 +278,7 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
         @Override
         protected void add(InstanceIdentifier<VrfEntry> identifier,
                 VrfEntry add) {
-            LOG.info("Key : " + identifier + " value : " + add);
+            LOG.trace("Add Vrf Entry event - Key : {}, value : {}", identifier, add);
             final VrfTablesKey key = identifier.firstKeyOf(VrfTables.class, VrfTablesKey.class);
             String rd = key.getRouteDistinguisher();
             Long label = add.getLabel();
@@ -231,12 +293,12 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
                     if(routeIds == null) {
                         routeIds = new ArrayList<>();
                     }
-                    LOG.info("Adding label to vpn info " + label);
+                    LOG.debug("Adding label to vpn info - {}", label);
                     routeIds.add(label);
                     asyncWrite(LogicalDatastoreType.OPERATIONAL, augId,
                             new VpnInstance1Builder(vpnAug).setRouteEntryId(routeIds).build(), DEFAULT_CALLBACK);
                 } else {
-                    LOG.info("VPN Augmentation not found");
+                    LOG.warn("VPN Augmentation not found for vpn instance {}", vpn.getVpnInstanceName());
                 }
             } else {
                 LOG.warn("No VPN Instance found for RD: {}", rd);
index b7c9721e255946f2011bb1ffb0ce0b2663a9f93f..fc70f055b085d4de055b2611ee1deaccdb694adc 100644 (file)
@@ -1,6 +1,9 @@
 package org.opendaylight.vpnservice;
 
 import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstance;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances;
@@ -11,7 +14,11 @@ import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev14081
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.AdjacenciesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.Pools;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.pools.IdPool;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.pools.IdPoolKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
 
 public class VpnUtil {
     static InstanceIdentifier<VpnInterface> getVpnInterfaceIdentifier(String vpnInterfaceName) {
@@ -32,4 +39,11 @@ public class VpnUtil {
     static Adjacencies getVpnInterfaceAugmentation(List<Adjacency> nextHops) {
         return new AdjacenciesBuilder().setAdjacency(nextHops).build();
     }
+
+    public static InstanceIdentifier<IdPool> getPoolId(String poolName){
+        InstanceIdentifier.InstanceIdentifierBuilder<IdPool> idBuilder =
+                        InstanceIdentifier.builder(Pools.class).child(IdPool.class, new IdPoolKey(poolName));
+        InstanceIdentifier<IdPool> id = idBuilder.build();
+        return id;
+    }
 }
index a93dc1c2611d4e711452b28b744efb2aa55d819c..28c387d3e0e194ef0db09eb8f13484ed1078ded2 100644 (file)
@@ -7,18 +7,27 @@
  */
 package org.opendaylight.vpnservice;
 
+import java.math.BigInteger;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 
 import org.opendaylight.bgpmanager.api.IBgpManager;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
+import org.opendaylight.vpnmanager.api.IVpnManager;
 import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService;
+import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class VpnserviceProvider implements BindingAwareProvider,
+public class VpnserviceProvider implements BindingAwareProvider, IVpnManager,
                                                        AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(VpnserviceProvider.class);
@@ -27,6 +36,7 @@ public class VpnserviceProvider implements BindingAwareProvider,
     private IBgpManager bgpManager;
     private IMdsalApiManager mdsalManager;
     private IInterfaceManager interfaceManager;
+    private IdManagerService idManager;
 
     @Override
     public void onSessionInitiated(ProviderContext session) {
@@ -34,8 +44,12 @@ public class VpnserviceProvider implements BindingAwareProvider,
         try {
             final  DataBroker dataBroker = session.getSALService(DataBroker.class);
             vpnManager = new VpnManager(dataBroker, bgpManager);
+            vpnManager.setIdManager(idManager);
             vpnInterfaceManager = new VpnInterfaceManager(dataBroker, bgpManager);
             vpnInterfaceManager.setMdsalManager(mdsalManager);
+            vpnInterfaceManager.setInterfaceManager(interfaceManager);
+            vpnInterfaceManager.setIdManager(idManager);
+            createIdPool();
         } catch (Exception e) {
             LOG.error("Error initializing services", e);
         }
@@ -54,9 +68,34 @@ public class VpnserviceProvider implements BindingAwareProvider,
         this.interfaceManager = interfaceManager;
     }
 
+    public void setIdManager(IdManagerService idManager) {
+        this.idManager = idManager;
+    }
+
+    private void createIdPool() {
+        CreateIdPoolInput createPool = new CreateIdPoolInputBuilder()
+            .setPoolName(VpnConstants.VPN_IDPOOL_NAME)
+            .setIdStart(VpnConstants.VPN_IDPOOL_START)
+            .setPoolSize(new BigInteger(VpnConstants.VPN_IDPOOL_SIZE))
+            .build();
+        try {
+           Future<RpcResult<Void>> result = idManager.createIdPool(createPool);
+           if ((result != null) && (result.get().isSuccessful())) {
+                LOG.debug("Created IdPool for VPN Service");
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Failed to create idPool for VPN Service",e);
+        }
+    }
+
     @Override
     public void close() throws Exception {
         vpnManager.close();
         vpnInterfaceManager.close();
     }
+
+    @Override
+    public Collection<Long> getDpnsForVpn(long vpnId) {
+        return vpnInterfaceManager.getDpnsForVpn(vpnId);
+    }
 }
index cbab6e84ac2e254779ed46784e5e2d6ab2db5922..14e2539d15b3399cdacea0f70088a9abd69cc3d9 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpnservice.impl.rev150216;
 
 import org.opendaylight.vpnservice.VpnserviceProvider;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService;
 
 public class VpnserviceImplModule extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpnservice.impl.rev150216.AbstractVpnserviceImplModule {
     public VpnserviceImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
@@ -25,10 +26,12 @@ public class VpnserviceImplModule extends org.opendaylight.yang.gen.v1.urn.opend
 
     @Override
     public java.lang.AutoCloseable createInstance() {
+        IdManagerService idManager = getRpcregistryDependency().getRpcService(IdManagerService.class);
         VpnserviceProvider provider = new VpnserviceProvider();
         provider.setBgpManager(getBgpmanagerDependency());
         provider.setMdsalManager(getMdsalutilDependency());
         provider.setInterfaceManager(getOdlinterfaceDependency());
+        provider.setIdManager(idManager);
         getBrokerDependency().registerProvider(provider);
         return provider;
     }
index b1703e2227d693432a7e3c27c52ff5d00a769d7d..2aac44cf474e2222b19b7ffe71bac5cac6767a87 100644 (file)
@@ -6,6 +6,7 @@ module vpnservice-impl {
     import config { prefix config; revision-date 2013-04-05; }
     import opendaylight-md-sal-binding { prefix md-sal-binding; revision-date 2013-10-28;}
     import bgpmanager-api { prefix bgpmgr-api; revision-date 2015-04-20;}
+    import vpnmanager-api { prefix vpnmgr-api; revision-date 2015-05-08;}
     import odl-mdsalutil { prefix odl-mdsal; revision-date 2015-04-10;}
     import odl-interface {prefix odlif; revision-date 2015-03-31;}
 
@@ -19,6 +20,7 @@ module vpnservice-impl {
 
     identity vpnservice-impl {
         base config:module-type;
+        config:provided-service vpnmgr-api:vpnmanager-api;
         config:java-name-prefix VpnserviceImpl;
     }
 
@@ -33,6 +35,14 @@ module vpnservice-impl {
                     }
                 }
             }
+            container rpcregistry {
+                uses config:service-ref {
+                    refine type {
+                        mandatory true;
+                        config:required-identity md-sal-binding:binding-rpc-registry;
+                    }
+                }
+            }
             container bgpmanager {
                 uses config:service-ref {
                     refine type {
index 7b7b14caff7d433c7fca635844afe67b3fdec27b..1c09d33e2ad85382c5b161a3aee1f12a4fe562bd 100644 (file)
@@ -17,16 +17,6 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
 
   <dependencyManagement>
     <dependencies>
-      <!--<dependency>
-        <groupId>${project.groupId}</groupId>
-        <artifactId>vpnmanager-api</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>${project.groupId}</groupId>
-        <artifactId>vpnmanager-impl</artifactId>
-        <version>${project.version}</version>
-      </dependency> -->
       <dependency>
         <groupId>${project.groupId}</groupId>
         <artifactId>vpnservice-features</artifactId>