Merge "Neutron port listener updated to support allowed address pair with security...
authorSam Hague <shague@redhat.com>
Wed, 13 Jul 2016 15:38:50 +0000 (15:38 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Wed, 13 Jul 2016 15:38:50 +0000 (15:38 +0000)
vpnservice/aclservice/api/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/netvirt/aclservice/rev160608/IpPrefixOrAddressBuilder.java
vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListener.java

index a5e1deede5204fef3850bf609fc24f26372d6850..3d739e78b5b07c579d5f5afdb13ecbe60b0a1b16 100644 (file)
@@ -1,5 +1,11 @@
 package org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608;
 
+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.inet.types.rev100924.IpAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefixBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation.
@@ -12,8 +18,16 @@ package org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev1606
  */
 public class IpPrefixOrAddressBuilder {
 
-    public static IpPrefixOrAddress getDefaultInstance(java.lang.String defaultValue) {
-        throw new java.lang.UnsupportedOperationException("Not yet implemented");
-    }
+    private static final Logger LOG = LoggerFactory.getLogger(IpPrefixOrAddressBuilder.class);
 
+    public static IpPrefixOrAddress getDefaultInstance(String defaultValue) {
+        try {
+            IpPrefix ipPrefix = IpPrefixBuilder.getDefaultInstance(defaultValue);
+            return new IpPrefixOrAddress(ipPrefix);
+        } catch (IllegalArgumentException e) {
+            LOG.debug("{} is not of IpPrefix type; checking whether it's a IpAddress type", defaultValue);
+            IpAddress ipAddress = IpAddressBuilder.getDefaultInstance(defaultValue);
+            return new IpPrefixOrAddress(ipAddress);
+        }
+    }
 }
index 4d4a7090ddcf41f986217d4d00afbe74f58f9e89..1ae7aed907f71537e2915f08c94db9e075a43d94 100644 (file)
@@ -34,6 +34,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.LockManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.InterfaceAcl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.InterfaceAclBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.IpPrefixOrAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.interfaces._interface.AllowedAddressPairs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.interfaces._interface.AllowedAddressPairsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInterfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterfaceBuilder;
@@ -345,9 +348,16 @@ public class NeutronPortChangeListener extends AbstractDataChangeListener<Port>
                     if (securityGroups != null) {
                         interfaceAclBuilder.setSecurityGroups(securityGroups);
                     }
+                    List<org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs> portAllowedAddressPairs =
+                            portUpdated.getAllowedAddressPairs();
+                    if (portAllowedAddressPairs != null) {
+                        interfaceAclBuilder
+                                .setAllowedAddressPairs(getAllowedAddressPairsForAclService(portAllowedAddressPairs));
+                    }
                 } else {
                     // Handle security group disabled
                     interfaceAclBuilder.setSecurityGroups(Lists.newArrayList());
+                    interfaceAclBuilder.setAllowedAddressPairs(Lists.newArrayList());
                 }
             } else {
                 if (updatedSecurityEnabled) {
@@ -359,19 +369,36 @@ public class NeutronPortChangeListener extends AbstractDataChangeListener<Port>
                     List<Uuid> deletedGroups = getsecurityGroupChanged(portOriginal.getSecurityGroups(),
                             portUpdated.getSecurityGroups());
                     List<Uuid> securityGroups = interfaceAcl.getSecurityGroups();
+                    List<Uuid> updatedSecurityGroups =
+                            (securityGroups != null) ? new ArrayList<>(securityGroups) : new ArrayList<>();
                     if (addedGroups != null) {
-                        securityGroups.addAll(addedGroups);
+                        updatedSecurityGroups.addAll(addedGroups);
                     }
                     if (deletedGroups != null) {
-                        securityGroups.removeAll(deletedGroups);
+                        updatedSecurityGroups.removeAll(deletedGroups);
+                    }
+                    interfaceAclBuilder.setSecurityGroups(updatedSecurityGroups);
+
+                    List<AllowedAddressPairs> addedAllowedAddressPairs = getAllowedAddressPairsChanged(
+                            portUpdated.getAllowedAddressPairs(), portOriginal.getAllowedAddressPairs());
+                    List<AllowedAddressPairs> deletedAllowedAddressPairs = getAllowedAddressPairsChanged(
+                            portOriginal.getAllowedAddressPairs(), portUpdated.getAllowedAddressPairs());
+                    List<AllowedAddressPairs> allowedAddressPairs = interfaceAcl.getAllowedAddressPairs();
+                    List<AllowedAddressPairs> updatedAllowedAddressPairs =
+                            (allowedAddressPairs != null) ? new ArrayList<>(allowedAddressPairs) : new ArrayList<>();
+                    if (addedAllowedAddressPairs != null) {
+                        updatedAllowedAddressPairs.addAll(addedAllowedAddressPairs);
+                    }
+                    if (deletedAllowedAddressPairs != null) {
+                        updatedAllowedAddressPairs.removeAll(deletedAllowedAddressPairs);
                     }
-                    interfaceAclBuilder.setSecurityGroups(securityGroups);
+                    interfaceAclBuilder.setAllowedAddressPairs(updatedAllowedAddressPairs);
                 }
             }
 
             if (interfaceAclBuilder != null) {
-                InterfaceBuilder builder = new InterfaceBuilder(portInterface)
-                        .addAugmentation(InterfaceAcl.class, interfaceAclBuilder.build());
+                InterfaceBuilder builder = new InterfaceBuilder(portInterface).addAugmentation(InterfaceAcl.class,
+                        interfaceAclBuilder.build());
                 InstanceIdentifier interfaceIdentifier = NeutronvpnUtils.buildVlanInterfaceIdentifier(interfaceName);
                 MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION, interfaceIdentifier, builder.build());
             }
@@ -403,6 +430,56 @@ public class NeutronPortChangeListener extends AbstractDataChangeListener<Port>
         return list1;
     }
 
+    private List<AllowedAddressPairs> getAllowedAddressPairsChanged(
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs> port1AllowedAddressPairs,
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs> port2AllowedAddressPairs) {
+        if (port1AllowedAddressPairs == null) {
+            return null;
+        }
+
+        if (port2AllowedAddressPairs == null) {
+            return getAllowedAddressPairsForAclService(port1AllowedAddressPairs);
+        }
+
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs> list1 =
+                new ArrayList<>(port1AllowedAddressPairs);
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs> list2 =
+                new ArrayList<>(port2AllowedAddressPairs);
+        for (Iterator<org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs> iterator =
+                list1.iterator(); iterator.hasNext();) {
+            org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs allowedAddressPair1 =
+                    iterator.next();
+            for (org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs allowedAddressPair2 : list2) {
+                if (allowedAddressPair1.getKey().equals(allowedAddressPair2.getKey())) {
+                    iterator.remove();
+                    break;
+                }
+            }
+        }
+        return getAllowedAddressPairsForAclService(list1);
+    }
+
+    private List<AllowedAddressPairs> getAllowedAddressPairsForAclService(
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs> portAllowedAddressPairs) {
+        List<AllowedAddressPairs> aclAllowedAddressPairs = new ArrayList<>();
+        for (org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs portAllowedAddressPair : portAllowedAddressPairs) {
+            AllowedAddressPairsBuilder aclAllowedAdressPairBuilder = new AllowedAddressPairsBuilder();
+            org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.types.rev160517.IpPrefixOrAddress ipAddress =
+                    portAllowedAddressPair.getIpAddress();
+            if (ipAddress != null && ipAddress.getValue() != null) {
+                if (ipAddress.getIpPrefix() != null) {
+                    aclAllowedAdressPairBuilder.setIpAddress(new IpPrefixOrAddress(ipAddress.getIpPrefix()));
+                } else {
+                    aclAllowedAdressPairBuilder.setIpAddress(new IpPrefixOrAddress(ipAddress.getIpAddress()));
+                }
+            }
+
+            aclAllowedAdressPairBuilder.setMacAddress(portAllowedAddressPair.getMacAddress());
+            aclAllowedAddressPairs.add(aclAllowedAdressPairBuilder.build());
+        }
+        return aclAllowedAddressPairs;
+    }
+
     private String createOfPortInterface(Port port) {
         Interface inf = createInterface(port);
         String infName = inf.getName();
@@ -443,6 +520,13 @@ public class NeutronPortChangeListener extends AbstractDataChangeListener<Port>
             if (securityGroups != null) {
                 interfaceAclBuilder.setSecurityGroups(securityGroups);
             }
+
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs> portAllowedAddressPairs =
+                    port.getAllowedAddressPairs();
+            if (portAllowedAddressPairs != null) {
+                interfaceAclBuilder
+                        .setAllowedAddressPairs(getAllowedAddressPairsForAclService(portAllowedAddressPairs));
+            }
             interfaceBuilder.addAugmentation(InterfaceAcl.class, interfaceAclBuilder.build());
         }