Updating operational datastore 02/17902/1
authorSasidharan Sambasivam <sasidharan.s.sambasivam@ericsson.com>
Wed, 8 Apr 2015 09:23:36 +0000 (14:53 +0530)
committerSasidharan Sambasivam <sasidharan.s.sambasivam@ericsson.com>
Wed, 8 Apr 2015 09:24:29 +0000 (14:54 +0530)
Change-Id: If1c556a0d5973f544a12967845577708362360c6
Signed-off-by: Sasidharan Sambasivam <sasidharan.s.sambasivam@ericsson.com>
vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java
vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java [new file with mode: 0644]

index d46f1624a610de39d80a7cf9d6fc26326c3d2811..e9203b0db14787490da46d244126eee81d4750c4 100644 (file)
@@ -7,8 +7,12 @@
  */\r
 package org.opendaylight.vpnservice;\r
 \r
-\r
 import java.util.List;\r
+import java.util.ArrayList;\r
+\r
+import com.google.common.base.Optional;\r
+import com.google.common.util.concurrent.Futures;\r
+import com.google.common.util.concurrent.FutureCallback;\r
 \r
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;\r
@@ -17,6 +21,7 @@ import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;\r
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;\r
@@ -24,20 +29,31 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.NextHopList;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.next.hop.list.L3NextHops;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.next.hop.list.L3NextHopsBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInterface1;\r
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;\r
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;\r
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInterface1Builder;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
-import com.google.common.base.Optional;\r
-import com.google.common.collect.FluentIterable;\r
-\r
 public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface> implements AutoCloseable {\r
     private static final Logger LOG = LoggerFactory.getLogger(VpnInterfaceManager.class);\r
     private ListenerRegistration<DataChangeListener> listenerRegistration;\r
     private final DataBroker broker;\r
+    \r
+    private static final FutureCallback<Void> DEFAULT_CALLBACK =\r
+            new FutureCallback<Void>() {\r
+                public void onSuccess(Void result) {\r
+                    LOG.info("Success in Datastore write operation");\r
+                }\r
+\r
+                public void onFailure(Throwable error) {\r
+                    LOG.error("Error in Datastore write operation", error);\r
+                };\r
+            };\r
 \r
     /**\r
      * Responsible for listening to data change related to VPN Interface\r
@@ -92,27 +108,35 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         if (port.isPresent()) {\r
             Interface interf = port.get();\r
             bindServiceOnInterface(interf);\r
-            updateNextHops(identifier);\r
+            updateNextHops(identifier, vpnInterface);\r
         }\r
     }\r
 \r
-    private void updateNextHops(final InstanceIdentifier<VpnInterface> identifier) {\r
+    private void updateNextHops(final InstanceIdentifier<VpnInterface> identifier, VpnInterface intf) {\r
         //Read NextHops\r
         InstanceIdentifier<VpnInterface1> path = identifier.augmentation(VpnInterface1.class);\r
         Optional<VpnInterface1> nextHopList = read(LogicalDatastoreType.CONFIGURATION, path);\r
+        String intfName = intf.getName(); \r
 \r
         if (nextHopList.isPresent()) {\r
             List<L3NextHops> nextHops = nextHopList.get().getL3NextHops();\r
+            List<L3NextHops> value = new ArrayList<>();\r
 \r
             if (!nextHops.isEmpty()) {\r
                 LOG.info("NextHops are " + nextHops);\r
                 for (L3NextHops nextHop : nextHops) {\r
                     //TODO: Generate label for the prefix and store it in the next hop model\r
+                    long label = 200;\r
 \r
                     //TODO: Update BGP\r
                     updatePrefixToBGP(nextHop);\r
+                    value.add(new L3NextHopsBuilder(nextHop).setLabel(label).build());\r
                 }\r
             }\r
+            VpnInterface1 aug = VpnUtil.getVpnInterfaceAugmentation(value);\r
+            VpnInterface opInterface = VpnUtil.getVpnInterface(intfName, intf.getVpnInstanceName(), aug);\r
+            InstanceIdentifier<VpnInterface> interfaceId = VpnUtil.getVpnInterfaceIdentifier(intfName);\r
+            asyncWrite(LogicalDatastoreType.OPERATIONAL, interfaceId, opInterface, DEFAULT_CALLBACK);\r
         }\r
     }\r
 \r
@@ -156,4 +180,10 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
 \r
     }\r
 \r
+    private <T extends DataObject> void asyncWrite(LogicalDatastoreType datastoreType,\r
+                        InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {\r
+        WriteTransaction tx = broker.newWriteOnlyTransaction();\r
+        tx.put(datastoreType, path, data, true);\r
+        Futures.addCallback(tx.submit(), callback);\r
+    }\r
 }\r
diff --git a/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java b/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java
new file mode 100644 (file)
index 0000000..76411af
--- /dev/null
@@ -0,0 +1,27 @@
+package org.opendaylight.vpnservice;\r
+\r
+import java.util.List;\r
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;\r
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;\r
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;\r
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.next.hop.list.L3NextHops;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInterface1;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInterface1Builder;\r
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
+\r
+public class VpnUtil {\r
+    static InstanceIdentifier<VpnInterface> getVpnInterfaceIdentifier(String vpnInterfaceName) {\r
+        return InstanceIdentifier.builder(VpnInterfaces.class)\r
+                .child(VpnInterface.class, new VpnInterfaceKey(vpnInterfaceName)).build();\r
+    }\r
+\r
+    static VpnInterface getVpnInterface(String intfName, String vpnName, VpnInterface1 aug) {\r
+        return new VpnInterfaceBuilder().setKey(new VpnInterfaceKey(intfName)).setVpnInstanceName(vpnName)\r
+                .addAugmentation(VpnInterface1.class, aug).build();\r
+    }\r
+\r
+    static VpnInterface1 getVpnInterfaceAugmentation(List<L3NextHops> nextHops) {\r
+        return new VpnInterface1Builder().setL3NextHops(nextHops).build();\r
+    }\r
+}\r