Working with OVS
[vpnservice.git] / nexthopmgr / nexthopmgr-impl / src / main / java / org / opendaylight / vpnservice / nexthopmgr / OdlInterfaceChangeListener.java
index 49a7bdbbf43fd81b6ad60680709680f374b2dcb9..d5ddfd21936a95b106f8b02182389043413353a6 100644 (file)
@@ -9,18 +9,20 @@ package org.opendaylight.vpnservice.nexthopmgr;
 
 
 import java.math.BigInteger;
+
+import com.google.common.base.Optional;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.Tunnel;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.BaseIds;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL3tunnel;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.L3tunnel;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
@@ -60,7 +62,7 @@ public class OdlInterfaceChangeListener extends AbstractDataChangeListener<Inter
 
     private void registerListener(final DataBroker db) {
         try {
-            listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
+            listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
                     getWildCardPath(), OdlInterfaceChangeListener.this, DataChangeScope.SUBTREE);
         } catch (final Exception e) {
             LOG.error("Nexthop Manager Interfaces DataChange listener registration fail!", e);
@@ -69,36 +71,59 @@ public class OdlInterfaceChangeListener extends AbstractDataChangeListener<Inter
     }
 
     @Override
-    protected void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
-        LOG.trace("Adding Interface : key: " + identifier + ", value=" + intrf );
-
-        if (intrf.getType().equals(L3tunnel.class)) {
-            IfL3tunnel intfData = intrf.getAugmentation(IfL3tunnel.class);
-            IpAddress gatewayIp = intfData.getGatewayIp();
-            IpAddress remoteIp = (gatewayIp == null) ? intfData.getRemoteIp() : gatewayIp;
-            NodeConnectorId ofPort = intrf.getAugmentation(BaseIds.class).getOfPortId();
-            nexthopManager.createRemoteNextHop(intrf.getName(), ofPort.toString(), remoteIp.getIpv4Address().getValue());
+    protected void add(InstanceIdentifier<Interface> identifier, Interface interfaceInfo) {
+        LOG.trace("Adding Interface : key: " + identifier + ", value=" + interfaceInfo );
+        // READ interface config information
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface intrf =
+                getInterfaceFromConfigDS(nexthopManager, new InterfaceKey(interfaceInfo.getName()));
+
+        if(intrf != null && intrf.getType().equals(Tunnel.class)){
+            IfTunnel intfData = intrf.getAugmentation(IfTunnel.class);
+            IpAddress gatewayIp = intfData.getTunnelGateway();
+            IpAddress remoteIp = (gatewayIp == null) ? intfData.getTunnelDestination() : gatewayIp;
+            nexthopManager.createRemoteNextHop(intrf.getName(), remoteIp.getIpv4Address().getValue());
         }
     }
 
-
     private InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
+        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
     }
 
     @Override
     protected void remove(InstanceIdentifier<Interface> identifier,
-            Interface intrf) {
-        LOG.trace("Removing interface : key: " + identifier + ", value=" + intrf );
-        if (intrf.getType().equals(L3tunnel.class)) {
+            Interface interfaceInfo) {
+        LOG.trace("Removing interface : key: " + identifier + ", value=" + interfaceInfo );
+        // READ interface config information
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface intrf =
+                getInterfaceFromConfigDS(nexthopManager, new InterfaceKey(interfaceInfo.getName()));
+
+        if (intrf != null && intrf.getType().equals(Tunnel.class)) {
             BigInteger dpnId = interfaceManager.getDpnForInterface(intrf);
-            IfL3tunnel intfData = intrf.getAugmentation(IfL3tunnel.class);
-            IpAddress gatewayIp = intfData.getGatewayIp();
-            IpAddress remoteIp = (gatewayIp == null) ? intfData.getRemoteIp() : gatewayIp;
+            IfTunnel intfData = intrf.getAugmentation(IfTunnel.class);
+            IpAddress gatewayIp = intfData.getTunnelGateway();
+            IpAddress remoteIp = (gatewayIp == null) ? intfData.getTunnelDestination() : gatewayIp;
             nexthopManager.removeRemoteNextHop(dpnId, intrf.getName(), remoteIp.getIpv4Address().getValue());
         }
     }
 
+    public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface getInterfaceFromConfigDS(NexthopManager nexthopManager, InterfaceKey interfaceKey) {
+        InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface> interfaceId =
+                getInterfaceIdentifier(interfaceKey);
+        Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface> interfaceOptional =
+                nexthopManager.read(LogicalDatastoreType.CONFIGURATION, interfaceId);
+        if (!interfaceOptional.isPresent()) {
+            return null;
+        }
+
+        return interfaceOptional.get();
+    }
+
+    public static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface> getInterfaceIdentifier(InterfaceKey interfaceKey) {
+        InstanceIdentifier.InstanceIdentifierBuilder<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface> interfaceInstanceIdentifierBuilder =
+                InstanceIdentifier.builder(Interfaces.class).child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface.class, interfaceKey);
+        return interfaceInstanceIdentifierBuilder.build();
+    }
+
     @Override
     protected void update(InstanceIdentifier<Interface> identifier,
             Interface original, Interface update) {