BUG 7331: CLI command to create VPNs allows creation of two VPNs with the 66/49166/2
authoreupakir <kiran.n.upadhyaya@ericsson.com>
Fri, 9 Dec 2016 07:14:57 +0000 (12:44 +0530)
committerSam Hague <shague@redhat.com>
Sat, 10 Dec 2016 02:16:43 +0000 (02:16 +0000)
same RD

Two VPNs with the same RDs cannot be handled by the VPN Engine. Hence this
will not be allowed.

Change-Id: I4955ba73ed928a8ba9b671e772da3e7c644035e6
Signed-off-by: eupakir <kiran.n.upadhyaya@ericsson.com>
vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManager.java
vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnUtils.java

index 6d5ed88c1e6f11397124b55026ea109a370e4022..e87274d7997694c36ce5eaa71526c649bc29a356 100644 (file)
@@ -826,6 +826,7 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
 
         List<L3vpn> vpns = input.getL3vpn();
         for (L3vpn vpn : vpns) {
+            List<String> existingRDs = NeutronvpnUtils.getExistingRDs(dataBroker);
             RpcError error = null;
             String msg;
             if (vpn.getRouteDistinguisher() == null || vpn.getImportRT() == null || vpn.getExportRT() == null) {
@@ -846,6 +847,15 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
                 warningcount++;
                 continue;
             }
+            if (existingRDs.contains(vpn.getRouteDistinguisher().get(0))) {
+                msg = String.format("Creation of L3VPN failed for VPN %s as another VPN with the same RD %s is already configured",
+                        vpn.getId().getValue(), vpn.getRouteDistinguisher().get(0));
+                LOG.warn(msg);
+                error = RpcResultBuilder.newWarning(ErrorType.PROTOCOL, "invalid-input", msg);
+                errorList.add(error);
+                warningcount++;
+                continue;
+            }
             if (vpn.getRouterId() != null) {
                 if (NeutronvpnUtils.getNeutronRouter(dataBroker, vpn.getRouterId()) == null) {
                     msg = String.format("Creation of L3VPN failed for VPN %s due to router not found %s",
index f0a1e19152007862f66e5470ba269fcdd7cb84c6..dbcb227ad06ea4c9a62b1f6d939059063c345c3e 100644 (file)
@@ -36,6 +36,8 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
+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.VpnInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.FloatingIpPortInfo;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ProviderTypes;
 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronConstants;
@@ -1132,4 +1134,16 @@ public class NeutronvpnUtils {
         return ret;
     }
 
+    static List<String> getExistingRDs(DataBroker broker) {
+        List<String> existingRDs = new ArrayList<>();
+        InstanceIdentifier<VpnInstances> path = InstanceIdentifier.builder(VpnInstances.class).build();
+        Optional<VpnInstances> vpnInstancesOptional = NeutronvpnUtils.read(broker, LogicalDatastoreType.CONFIGURATION, path);
+        if (vpnInstancesOptional.isPresent() && vpnInstancesOptional.get().getVpnInstance() != null) {
+            for (VpnInstance vpnInstance : vpnInstancesOptional.get().getVpnInstance()) {
+                existingRDs.add(vpnInstance.getIpv4Family().getRouteDistinguisher());
+            }
+        }
+        return existingRDs;
+    }
+
 }