\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
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