*/\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
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
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
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
\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
--- /dev/null
+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