Initial implementation for dynamic SNAT
[groupbasedpolicy.git] / renderers / vpp / src / main / java / org / opendaylight / groupbasedpolicy / renderer / vpp / nat / NatUtil.java
index de4f83cd03ee25f7f2d3061251082aa6fa373078..c2fff1cae300230be05e7ede89c29e5e59f0dd68 100644 (file)
@@ -8,10 +8,28 @@
 \r
 package org.opendaylight.groupbasedpolicy.renderer.vpp.nat;\r
 \r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Map.Entry;\r
+\r
+import javax.annotation.Nonnull;\r
+import javax.annotation.Nullable;\r
+\r
+import org.apache.commons.net.util.SubnetUtils;\r
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.PolicyContext;\r
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.nat.rev150908.nat.parameters.ExternalIpAddressPool;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.nat.rev150908.nat.parameters.ExternalIpAddressPoolBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.SubnetAugmentRenderer;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.has.subnet.subnet.AllocationPool;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.RendererForwardingByTenant;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.forwarding.renderer.forwarding.by.tenant.RendererNetworkDomain;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.nat.rev161214.NatInterfaceAugmentation;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.nat.rev161214._interface.nat.attributes.Nat;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.nat.rev161214._interface.nat.attributes.NatBuilder;\r
@@ -41,4 +59,47 @@ public class NatUtil {
     public static InstanceIdentifier<Nat> buildNatIid(InstanceIdentifier<Interface> ifaceIid) {\r
         return ifaceIid.builder().augmentation(NatInterfaceAugmentation.class).child(Nat.class).build();\r
     }\r
+\r
+    public static List<ExternalIpAddressPool> resolveDynamicNat(@Nonnull PolicyContext policyCtx) {\r
+        List<RendererForwardingByTenant> rendererForwardingByTenant =\r
+                policyCtx.getPolicy().getConfiguration().getRendererForwarding().getRendererForwardingByTenant();\r
+        Map<Long, Ipv4Prefix> hm = new HashMap<>();\r
+        for (RendererForwardingByTenant rft : rendererForwardingByTenant) {\r
+            for (RendererNetworkDomain rnd : rft.getRendererNetworkDomain()) {\r
+                SubnetAugmentRenderer subnet = rnd.getAugmentation(SubnetAugmentRenderer.class);\r
+                if (subnet.getSubnet() != null && !subnet.getSubnet().isIsTenant()\r
+                        && subnet.getSubnet().getAllocationPool() != null) {\r
+                    for (AllocationPool pool : subnet.getSubnet().getAllocationPool()) {\r
+                        if (subnet.getSubnet().getIpPrefix().getIpv4Prefix() != null) {\r
+                            hm.putAll(resolveIpv4Prefix(subnet.getSubnet().getIpPrefix().getIpv4Prefix(),\r
+                                    pool.getFirst(), pool.getLast()));\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
+        List<ExternalIpAddressPool> extIps = new ArrayList<>();\r
+        for (Entry<Long, Ipv4Prefix> entry : hm.entrySet()) {\r
+            new ExternalIpAddressPoolBuilder().setPoolId(entry.getKey()).setExternalIpPool(entry.getValue()).build();\r
+        }\r
+        return extIps;\r
+    }\r
+\r
+    private static Map<Long,Ipv4Prefix> resolveIpv4Prefix(@Nonnull Ipv4Prefix prefix, @Nonnull String first,\r
+            @Nullable String last) {\r
+        SubnetUtils subnet = new SubnetUtils(prefix.getValue());\r
+        Map<Long,Ipv4Prefix> ext = new HashMap<>();\r
+        int min = subnet.getInfo().asInteger(first);\r
+        for (String addr : subnet.getInfo().getAllAddresses()) {\r
+            int asInt = subnet.getInfo().asInteger(addr);\r
+            if (asInt < min) {\r
+                continue;\r
+            }\r
+            ext.put(Long.valueOf(asInt), new Ipv4Prefix(addr + "/32"));\r
+            if (last == null || subnet.getInfo().asInteger(addr) > subnet.getInfo().asInteger(last)) {\r
+                break;\r
+            }\r
+        }\r
+        return ext;\r
+    }\r
 }\r