Added existsVPN API and refactored NeutronVPN 67/41267/5
authorAbhinav Gupta <abhinav.gupta@ericsson.com>
Mon, 4 Jul 2016 09:39:55 +0000 (15:09 +0530)
committerAbhinav Gupta <abhinav.gupta@ericsson.com>
Tue, 5 Jul 2016 12:18:11 +0000 (17:48 +0530)
1. existsVPN API added in VPNMgr, removed from NeutronVPN
2. Indentation, logging, import statement changes
3. Removed unused router-dpns yang model
4. Added notifications for router assc/dissc to/from VPN
5. Refactored a couple of validations

Change-Id: I139b5809b6519de5be3618b0accdb7987b551729
Signed-off-by: Abhinav Gupta <abhinav.gupta@ericsson.com>
vpnservice/neutronvpn/neutronvpn-api/src/main/yang/neutronvpn.yang
vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListener.java
vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManager.java
vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnNatManager.java
vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnUtils.java
vpnservice/vpnmanager/vpnmanager-api/src/main/java/org/opendaylight/netvirt/vpnmanager/api/IVpnManager.java
vpnservice/vpnmanager/vpnmanager-api/src/main/yang/odl-l3vpn.yang
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnManager.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnserviceProvider.java

index 22fc4ffe96da527df4a07ffd61d5409259416f28..9938a584bf44de9e3ab31dd68fb8ca4c5f376c22 100644 (file)
@@ -151,7 +151,6 @@ module neutronvpn {
         }
     }
 
-
     container router-interfaces-map {
         list router-interfaces {
             key router-id;
@@ -163,19 +162,6 @@ module neutronvpn {
         }
     }
 
-    /* container to maintain mapping between neutron router and DPN(s) on which vpn-interfaces for router are present
-    container neutron-router-dpns {
-        list router-dpn-list {
-            key router-id;
-            leaf router-id { type yang:uuid;}
-            list dpn-vpninterfaces-list {
-                key dpn-id;
-                leaf dpn-id { type uint64;}
-                leaf-list vpninterfaces-list { type yang:uuid;}
-            }
-        }
-    }
-
     /* container for DHCP Configuration */
     container dhcp-config {
         list configs {
index d17122bc29e6679be816ae562e026deedabd03b7..ca480068ddd0798ca8d016ed9317047cc22442a3 100644 (file)
@@ -218,8 +218,8 @@ public class NeutronPortChangeListener extends AbstractDataChangeListener<Port>
                     }
                 }
             } else {
-                LOG.warn("Neutron network {} corresponding to router interface port {} for neutron router {} already " +
-                        "associated to VPN {}", infNetworkId.getValue(), routerPort.getUuid().getValue(), routerId
+                LOG.error("Neutron network {} corresponding to router interface port {} for neutron router {} already" +
+                        " associated to VPN {}", infNetworkId.getValue(), routerPort.getUuid().getValue(), routerId
                         .getValue(), existingVpnId.getValue());
             }
         }
index a3c09d553e2b190d298c855027145804511ee93c..9a664dcc670f4b22925c8fa2e62dd1d1c45f00ed 100644 (file)
@@ -21,14 +21,12 @@ import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev14081
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.VpnTargets;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.VpnTargetsBuilder;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.vpntargets.VpnTarget;
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.vpntargets
-        .VpnTargetBuilder;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.vpntargets.VpnTargetBuilder;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.vpntargets.VpnTargetKey;
 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.vpn.instances.VpnInstanceBuilder;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstanceKey;
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.vpn.instance
-        .Ipv4FamilyBuilder;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.vpn.instance.Ipv4FamilyBuilder;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;
@@ -39,7 +37,39 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.Adj
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AdjacenciesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.Adjacency;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.AdjacencyBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.AssociateNetworksInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.AssociateNetworksOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.AssociateNetworksOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.AssociateRouterInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.CreateL3VPNInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.CreateL3VPNOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.CreateL3VPNOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DeleteL3VPNInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DeleteL3VPNOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DeleteL3VPNOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DissociateNetworksInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DissociateNetworksOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DissociateNetworksOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.DissociateRouterInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.GetFixedIPsForNeutronPortInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.GetFixedIPsForNeutronPortOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.GetFixedIPsForNeutronPortOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.GetL3VPNInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.GetL3VPNInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.GetL3VPNOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.GetL3VPNOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.L3vpnInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NeutronvpnService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.RouterAssociatedToVpn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.RouterAssociatedToVpnBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.RouterDisassociatedFromVpn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.RouterDisassociatedFromVpnBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.RouterInterfacesMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.SubnetAddedToVpnBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.SubnetDeletedFromVpnBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.SubnetUpdatedInVpnBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.Subnetmaps;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.VpnMaps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.router.interfaces.map.RouterInterfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.router.interfaces.map.RouterInterfacesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.router.interfaces.map.RouterInterfacesKey;
@@ -55,17 +85,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.por
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.Subnets;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.SubnetKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstanceKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.*;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.createl3vpn.input.L3vpn;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.getl3vpn.output.L3vpnInstances;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.getl3vpn.output
-        .L3vpnInstancesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.getl3vpn.output.L3vpnInstancesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.Subnetmap;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.SubnetmapBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.SubnetmapKey;
@@ -86,11 +112,10 @@ import org.slf4j.LoggerFactory;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
-public class NeutronvpnManager implements NeutronvpnService, AutoCloseable , EventListener{
+public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, EventListener {
 
     private static final Logger logger = LoggerFactory.getLogger(NeutronvpnManager.class);
     private final DataBroker broker;
@@ -891,18 +916,6 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable , Eve
         }
     }
 
-
-
-        // router-interfaces-map
-//    list router-interfaces {
-//        key router-id;
-//        leaf router-id { type yang:uuid; }
-//        list interfaces {
-//            key interface-id;
-//            leaf interface-id { type yang:uuid; }
-//        }
-//    }
-////}
     InstanceIdentifier<RouterInterfaces> getRouterInterfacesId(Uuid routerId) {
         return InstanceIdentifier.builder(RouterInterfacesMap.class)
                 .child(RouterInterfaces.class, new RouterInterfacesKey(routerId)).build();
@@ -1090,9 +1103,17 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable , Eve
             logger.debug("Updating association of subnets to external vpn {}", vpnId.getValue());
             if (routerSubnets != null) {
                 for (Uuid subnetId : routerSubnets) {
-                    updateVpnForSubnet(vpnId, subnetId,true);
+                    updateVpnForSubnet(vpnId, subnetId, true);
                 }
             }
+            try {
+                checkAndPublishRouterAssociatedtoVpnNotification(routerId, vpnId);
+                logger.debug("notification upon association of router {} to VPN {} published", routerId.getValue(),
+                        vpnId.getValue());
+            } catch (Exception e) {
+                logger.error("publishing of notification upon association of router {} to VPN {} failed : ", routerId
+                        .getValue(), vpnId.getValue(), e);
+            }
         } else {
             logger.debug("Adding subnets to internal vpn {}", vpnId.getValue());
             for (Uuid subnet : routerSubnets) {
@@ -1111,6 +1132,14 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable , Eve
             }
         }
         clearFromVpnMaps(vpnId, routerId, null);
+        try {
+            checkAndPublishRouterDisassociatedFromVpnNotification(routerId, vpnId);
+            logger.debug("notification upon disassociation of router {} from VPN {} published", routerId.getValue(),
+                    vpnId.getValue());
+        } catch (Exception e) {
+            logger.error("publishing of notification upon disassociation of router {} from VPN {} failed : ", routerId
+                    .getValue(), vpnId.getValue(), e);
+        }
     }
 
     protected List<String> associateNetworksToVpn(Uuid vpn, List<Uuid> networks) {
@@ -1133,13 +1162,13 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable , Eve
                     if (networkSubnets != null) {
                         for (Uuid subnet : networkSubnets) {
                             // check if subnet added as router interface to some router
-                            Uuid routerVpnId = NeutronvpnUtils.getVpnForSubnet(broker, subnet);
-                            if (routerVpnId == null) {
+                            Uuid subnetVpnId = NeutronvpnUtils.getVpnForSubnet(broker, subnet);
+                            if (subnetVpnId == null) {
                                 addSubnetToVpn(vpn, subnet);
                                 passedNwList.add(nw);
                             } else {
                                 failedNwList.add(String.format("subnet %s already added as router interface bound to " +
-                                        "internal/external VPN %s", subnet.getValue (), routerVpnId.getValue()));
+                                        "internal/external VPN %s", subnet.getValue (), subnetVpnId.getValue()));
                             }
                         }
                     }
@@ -1165,20 +1194,24 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable , Eve
                 if (network == null) {
                     failedNwList.add(String.format("network %s not found", nw.getValue()));
                 } else {
-                    List<Uuid> networkSubnets = NeutronvpnUtils.getSubnetIdsFromNetworkId(broker, nw);
-                    logger.debug("Removing network subnets...");
-                    if (networkSubnets != null) {
-                        for (Uuid subnet : networkSubnets) {
-                            // check if subnet added as router interface to some router
-                            Uuid routerVpnId = NeutronvpnUtils.getVpnForSubnet(broker, subnet);
-                            if (routerVpnId == null) {
+                    Uuid vpnId = NeutronvpnUtils.getVpnForNetwork(broker, nw);
+                    if (vpn.equals(vpnId)) {
+                        List<Uuid> networkSubnets = NeutronvpnUtils.getSubnetIdsFromNetworkId(broker, nw);
+                        logger.debug("Removing network subnets...");
+                        if (networkSubnets != null) {
+                            for (Uuid subnet : networkSubnets) {
                                 removeSubnetFromVpn(vpn, subnet);
                                 passedNwList.add(nw);
-                            } else {
-                                failedNwList.add(String.format("subnet %s added as router interface bound to " +
-                                        "internal/external VPN %s", subnet.getValue (), routerVpnId.getValue()));
                             }
                         }
+                    } else {
+                        if (vpnId == null) {
+                            failedNwList.add(String.format("input network %s not associated to any vpn yet", nw
+                                    .getValue()));
+                        } else {
+                            failedNwList.add(String.format("input network %s associated to a another vpn %s instead " +
+                                    "of the one given as input", nw.getValue(), vpnId.getValue()));
+                        }
                     }
                     if (network.getAugmentation(NetworkL3Extension.class).isExternal()) {
                         nvpnNatManager.removeExternalNetworkFromVpn(network);
@@ -1340,11 +1373,17 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable , Eve
                     Router rtr = NeutronvpnUtils.getNeutronRouter(broker, routerId);
                     if (rtr != null) {
                         Uuid routerVpnId = NeutronvpnUtils.getVpnForRouter(broker, routerId, true);
-                        if (!routerVpnId.equals(vpnId)) {
-                            returnMsg.append("input router ").append(routerId.getValue()).append(" associated to " +
-                                    "vpn ").append(routerVpnId.getValue()).append("instead of the vpn given as input");
-                        } else {
+                        if (vpnId.equals(routerVpnId)) {
                             dissociateRouterFromVpn(vpnId, routerId);
+                        } else {
+                            if (routerVpnId == null) {
+                                returnMsg.append("input router ").append(routerId.getValue()).append(" not associated" +
+                                        " to any vpn yet");
+                            } else {
+                                returnMsg.append("input router ").append(routerId.getValue()).append(" associated to " +
+                                        "vpn ").append(routerVpnId.getValue()).append("instead of the vpn given as " +
+                                        "input");
+                            }
                         }
                     } else {
                         returnMsg.append("router not found : ").append(routerId.getValue());
@@ -1615,4 +1654,19 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable , Eve
         notificationPublishService.putNotification(builder.build());
     }
 
+    private void checkAndPublishRouterAssociatedtoVpnNotification(Uuid routerId, Uuid vpnId) throws
+            InterruptedException {
+        RouterAssociatedToVpn routerAssociatedToVpn = new RouterAssociatedToVpnBuilder().setRouterId(routerId)
+                .setVpnId(vpnId).build();
+        logger.info("publishing notification upon association of router to VPN");
+        notificationPublishService.putNotification(routerAssociatedToVpn);
+    }
+
+    private void checkAndPublishRouterDisassociatedFromVpnNotification(Uuid routerId, Uuid vpnId) throws
+            InterruptedException {
+        RouterDisassociatedFromVpn routerDisassociatedFromVpn = new RouterDisassociatedFromVpnBuilder().setRouterId
+                (routerId).setVpnId(vpnId).build();
+        logger.info("publishing notification upon disassociation of router from VPN");
+        notificationPublishService.putNotification(routerDisassociatedFromVpn);
+    }
 }
index 1508921c26139afb0fbcfc5ef270d62d05a49a44..ed59330ca4869ea057fd7a1aa15285f44b0d1e5e 100644 (file)
@@ -16,7 +16,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.Router;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.router.ExternalGatewayInfo;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.router.external_gateway_info.ExternalFixedIps;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ExtRouters;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ExternalNetworks;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.Routers;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.RoutersBuilder;
index e280a5278a26e299407a0d70cc96c96a3067e2c1..054154083d373a75e1d115c8b44279bb920a4eca 100644 (file)
@@ -26,7 +26,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.binding.rev150712.P
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.Routers;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.Router;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.RouterKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeGre;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
@@ -54,10 +53,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev15060
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.VpnMaps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.networkmaps.NetworkMap;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.networkmaps.NetworkMapKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.neutron.port.data
-        .PortFixedipToPortName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.neutron.port.data
-        .PortFixedipToPortNameKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.neutron.port.data.PortFixedipToPortName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.neutron.port.data.PortFixedipToPortNameKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.Subnetmap;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.SubnetmapKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.vpnmaps.VpnMap;
index 6d5e365fc2d06bd332339ff94164c48d6fad6979..524fa93904c4952a439b7010f86d41f4988db8e2 100644 (file)
@@ -14,5 +14,14 @@ public interface IVpnManager {
     void setFibService(IFibManager fibManager);
     void addExtraRoute(String destination, String nextHop, String rd, String routerID, int label);
     void delExtraRoute(String destination, String rd, String routerID);
+
+    /**
+     * Returns true if the specified VPN exists
+     *
+     * @param vpnName it must match against the vpn-instance-name attrib in one of the VpnInstances
+     *
+     * @return
+     */
+    boolean existsVpn(String vpnName);
     boolean isVPNConfigured();
 }
index 84de53be1fc10b83d839cda6ed19f1712c8c586d..77d1bf19fb2e5a99f8331d3ddecb057d61413a80 100644 (file)
@@ -70,9 +70,9 @@ module odl-l3vpn {
            list extraroute {
               key prefix;
               leaf prefix {type string;}
-                     leaf nexthop-ip {
-                         type string;
-                     }
+              leaf nexthop-ip {
+                  type string;
+              }
            }
         }
     }
@@ -260,7 +260,7 @@ module odl-l3vpn {
         }
 
 
-      /* container to maintain mapping between neutron router and DPN(s) on which vpn-interfaces for router are present */
+    /* container to maintain mapping between neutron router and DPN(s) on which vpn-interfaces for router are present */
     container neutron-router-dpns {
         list router-dpn-list {
             key router-id;
@@ -268,7 +268,7 @@ module odl-l3vpn {
             list dpn-vpninterfaces-list {
                 key dpn-id;
                 leaf dpn-id { type uint64;}
-                list router-interfaces { 
+                list router-interfaces {
                     key interface;
                     leaf interface { type string; }
                 }
index f6e60fc17917263979306944f14cacb0387a85c3..a882405b1d2ee85841eaca620d981915a57d5fcf 100644 (file)
@@ -22,9 +22,6 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.vpntargets.VpnTarget;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceToVpnId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceToVpnIdBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnRouteList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntryKey;
@@ -38,10 +35,8 @@ import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev14081
 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.vpn.instances.VpnInstanceKey;
 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.VpnInstanceBuilder;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceOpData;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceOpDataBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTablesKey;
@@ -72,10 +67,12 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
 
     private static final FutureCallback<Void> DEFAULT_CALLBACK =
             new FutureCallback<Void>() {
+                @Override
                 public void onSuccess(Void result) {
                     LOG.debug("Success in Datastore operation");
                 }
 
+                @Override
                 public void onFailure(Throwable error) {
                     LOG.error("Error in Datastore operation", error);
                 }
@@ -347,7 +344,6 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
 
     private InstanceIdentifier<?> getVpnInstanceOpListenerPath() {
         return InstanceIdentifier.create(VpnInstanceOpData.class).child(VpnInstanceOpDataEntry.class);
-
     }
 
     @Override
@@ -415,6 +411,10 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
         }
     }
 
+    protected VpnInstance getVpnInstance(String vpnInstanceName) {
+        return VpnUtil.getVpnInstance(broker, vpnInstanceName);
+    }
+
     protected VpnInstanceOpDataEntry getVpnInstanceOpData(String rd) {
         InstanceIdentifier<VpnInstanceOpDataEntry> id = VpnUtil.getVpnInstanceOpDataIdentifier(rd);
         Optional<VpnInstanceOpDataEntry> vpnInstanceOpData = read(LogicalDatastoreType.OPERATIONAL, id);
@@ -424,12 +424,6 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
         return null;
     }
 
-    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() {
index 950b3846e67b97778848f43a213feb2f085076a3..d871e7cf57c855c027daf9ca97a29a4b3e781eda 100644 (file)
@@ -238,6 +238,14 @@ public class VpnUtil {
         return rd;
     }
 
+    //FIXME: Implement caches for DS reads
+    static VpnInstance getVpnInstance(DataBroker broker, String vpnInstanceName) {
+        InstanceIdentifier<VpnInstance> id = InstanceIdentifier.builder(VpnInstances.class).child(VpnInstance.class,
+                new VpnInstanceKey(vpnInstanceName)).build();
+        Optional<VpnInstance> vpnInstance = read(broker, LogicalDatastoreType.CONFIGURATION, id);
+        return (vpnInstance.isPresent()) ? vpnInstance.get() : null;
+    }
+
     static String getVpnRdFromVpnInstanceConfig(DataBroker broker, String vpnName) {
         InstanceIdentifier<VpnInstance> id = InstanceIdentifier.builder(VpnInstances.class)
                 .child(VpnInstance.class, new VpnInstanceKey(vpnName)).build();
index 038398c35e052cea620b5eea3fd676bdce870e80..1d3d01f506e6ad7ac6aaa67db51f30d22e2779cd 100644 (file)
@@ -31,8 +31,7 @@ import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class VpnserviceProvider implements BindingAwareProvider, IVpnManager,
-                                                       AutoCloseable {
+public class VpnserviceProvider implements BindingAwareProvider, IVpnManager, AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(VpnserviceProvider.class);
     private VpnInterfaceManager vpnInterfaceManager;
@@ -149,6 +148,14 @@ public class VpnserviceProvider implements BindingAwareProvider, IVpnManager,
         vpnInterfaceManager.delExtraRoute(destination, rd, routerID);
     }
 
+    @Override
+    public boolean existsVpn(String vpnName) {
+        if (vpnManager != null) {
+            return vpnManager.getVpnInstance(vpnName) != null;
+        }
+        LOG.info("Could not acquire handle to vpnManager, returning false for existsVpn({})", vpnName);
+        return false;
+    }
 
     @Override
     public boolean isVPNConfigured() {