Merge "Fixed IBgpManager by moving it, as it was in clearly wrong directory"
[vpnservice.git] / neutronvpn / neutronvpn-impl / src / main / java / org / opendaylight / vpnservice / neutronvpn / NeutronPortChangeListener.java
index 826955dff5a553b5a27daeadb7030ea2c64aa9c7..a684d9118ee5b2f4c077b89e03109b8810d615cc 100644 (file)
@@ -18,6 +18,7 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataCh
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.vpnservice.mdsalutil.AbstractDataChangeListener;
 import org.opendaylight.vpnservice.mdsalutil.MDSALUtil;
+import org.opendaylight.vpnservice.neutronvpn.api.utils.NeutronUtils;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
@@ -47,8 +48,10 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
 
 public class NeutronPortChangeListener extends AbstractDataChangeListener<Port> implements AutoCloseable {
@@ -140,7 +143,7 @@ public class NeutronPortChangeListener extends AbstractDataChangeListener<Port>
     }
 
     private void handleNeutronPortCreated(Port port) {
-        if (!NeutronvpnUtils.isPortVnicTypeNormal(port)) {
+        if (!NeutronUtils.isPortVnicTypeNormal(port)) {
             LOG.info("Port {} is not a NORMAL VNIC Type port; OF Port interfaces are not created",
                     port.getUuid().getValue());
             return;
@@ -158,6 +161,10 @@ public class NeutronPortChangeListener extends AbstractDataChangeListener<Port>
             // create vpn-interface on this neutron port
             LOG.debug("Adding VPN Interface");
             nvpnManager.createVpnInterface(vpnId, port);
+            Uuid routerId = NeutronvpnUtils.getVpnMap(broker, vpnId).getRouterId();
+            if(routerId != null) {
+                nvpnManager.addToNeutronRouterInterfacesMap(routerId, port.getUuid().getValue());
+            }
         }
     }
 
@@ -176,22 +183,56 @@ public class NeutronPortChangeListener extends AbstractDataChangeListener<Port>
         // ELAN interface is also implicitly deleted as part of this operation
         deleteOfPortInterface(port);
 
+        Uuid routerId = NeutronvpnUtils.getVpnMap(broker, vpnId).getRouterId();
+        if(routerId != null) {
+            nvpnManager.removeFromNeutronRouterInterfacesMap(routerId, port.getUuid().getValue());
+        }
+
     }
 
     private void handleNeutronPortUpdated(Port portoriginal, Port portupdate) {
         LOG.debug("Add port to subnet");
-        // add port FixedIP to local Subnets DS
         Uuid vpnIdup = addPortToSubnets(portupdate);
+        Uuid vpnIdor = removePortFromSubnets(portoriginal);
 
+        // add port FixedIP to local Subnets DS
         if (vpnIdup != null) {
             nvpnManager.createVpnInterface(vpnIdup, portupdate);
+            Uuid routerId = NeutronvpnUtils.getVpnMap(broker, vpnIdup).getRouterId();
+            if(routerId != null) {
+                nvpnManager.addToNeutronRouterInterfacesMap(routerId, portupdate.getUuid().getValue());
+            }
+            if ((vpnIdor != vpnIdup ||
+                 !portoriginal.getDeviceOwner().equals("network:router_interface")) &&
+                portupdate.getDeviceOwner().equals("network:router_interface")) {
+                Set<Uuid> subnetUuids = new HashSet<>();
+                for (FixedIps fixedIps : portupdate.getFixedIps()) {
+                    subnetUuids.add(fixedIps.getSubnetId());
+                }
+                for (Uuid subnetUuid : subnetUuids) {
+                    nvpnManager.addSubnetToVpn(vpnIdup, subnetUuid);
+                }
+            }
         }
 
         // remove port FixedIP from local Subnets DS
-        Uuid vpnIdor = removePortFromSubnets(portoriginal);
-
         if (vpnIdor != null) {
             nvpnManager.deleteVpnInterface(portoriginal);
+            Uuid routerId = NeutronvpnUtils.getVpnMap(broker, vpnIdor).getRouterId();
+            if(routerId != null) {
+                nvpnManager.removeFromNeutronRouterInterfacesMap(routerId, portoriginal.getUuid().getValue());
+            }
+            if ((vpnIdor != vpnIdup ||
+                 !portupdate.getDeviceOwner().equals("network:router_interface")) &&
+                portoriginal.getDeviceOwner().equals("network:router_interface")) {
+                Set<Uuid> subnetUuids = new HashSet<>();
+                for (FixedIps fixedIps : portoriginal.getFixedIps()) {
+                    subnetUuids.add(fixedIps.getSubnetId());
+                }
+                for (Uuid subnetUuid : subnetUuids) {
+                    nvpnManager.removeSubnetFromVpn(vpnIdor, subnetUuid);
+                }
+            }
         }
     }
 
@@ -248,7 +289,7 @@ public class NeutronPortChangeListener extends AbstractDataChangeListener<Port>
     private void createElanInterface(Port port, String name) {
         String elanInstanceName = port.getNetworkId().getValue();
         List<PhysAddress> physAddresses = new ArrayList<>();
-        physAddresses.add(new PhysAddress(port.getMacAddress()));
+        physAddresses.add(new PhysAddress(String.valueOf(port.getMacAddress().getValue())));
 
         InstanceIdentifier<ElanInterface> id = InstanceIdentifier.builder(ElanInterfaces.class).child(ElanInterface
                 .class, new ElanInterfaceKey(name)).build();
@@ -293,6 +334,15 @@ public class NeutronPortChangeListener extends AbstractDataChangeListener<Port>
                     NeutronvpnUtils.unlock(lockManager, lockName);
                 }
             }
+            if (port.getDeviceOwner().equals("network:router_interface")) {
+                Set<Uuid> subnetUuids = new HashSet<>();
+                for (FixedIps fixedIps : port.getFixedIps()) {
+                    subnetUuids.add(fixedIps.getSubnetId());
+                }
+                for (Uuid subnetUuid : subnetUuids) {
+                    nvpnManager.addSubnetToVpn(vpnId, subnetUuid);
+                }
+            }
         }
         return vpnId;
     }
@@ -327,6 +377,15 @@ public class NeutronPortChangeListener extends AbstractDataChangeListener<Port>
                     NeutronvpnUtils.unlock(lockManager, lockName);
                 }
             }
+            if (port.getDeviceOwner().equals("network:router_interface")) {
+                Set<Uuid> subnetUuids = new HashSet<>();
+                for (FixedIps fixedIps : port.getFixedIps()) {
+                    subnetUuids.add(fixedIps.getSubnetId());
+                }
+                for (Uuid subnetUuid : subnetUuids) {
+                    nvpnManager.removeSubnetFromVpn(vpnId, subnetUuid);
+                }
+            }
         }
         return vpnId;
     }