}
}
}
+ list allocation-pool {
+ description "Allocation pool of assignable addresses.";
+ key "first last";
+ leaf first {
+ type string;
+ }
+ leaf last {
+ type string;
+ }
+ }
+ leaf is-tenant {
+ description "Subnet is used as tenant network.";
+ type boolean;
+ default "true";
+ }
}
}
rwTx.merge(LogicalDatastoreType.CONFIGURATION, L2L3IidFactory.l2BridgeDomainIid(tenantId, l2BdId), l2Bd, true);
// set virtual router IP for subnet
NetworkDomain subnetDomain = NeutronSubnetAware.createSubnet(
- routerPortSubnet, portIpWithSubnet.getIpAddress());
+ routerPortSubnet, neutron);
rwTx.merge(LogicalDatastoreType.CONFIGURATION, L2L3IidFactory.subnetIid(tenantId, subnetDomain.getNetworkDomainId()), subnetDomain);
// does the same for tenant forwarding domains
.build();
rwTx.merge(LogicalDatastoreType.CONFIGURATION,
L2L3IidFactory.l2BridgeDomainIid(tenantId, fwdCtx.getContextId()), fwdCtx);
- NetworkDomain subnet = NeutronSubnetAware.createSubnet(routerPortSubnet, null);
+ NetworkDomain subnet = NeutronSubnetAware.createSubnet(routerPortSubnet, newNeutron);
rwTx.put(LogicalDatastoreType.CONFIGURATION, L2L3IidFactory.subnetIid(tenantId, subnet.getNetworkDomainId()),
subnet);
unregisterEndpointAndRemoveMapping(createUnregisterEndpointInput(port, oldNeutron), port, rwTx);
import static com.google.common.base.Preconditions.checkNotNull;
+import java.util.List;
+import java.util.stream.Collectors;
+
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.SubnetAugmentForwarding;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.SubnetAugmentForwardingBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.has.subnet.SubnetBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.has.subnet.subnet.AllocationPool;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.has.subnet.subnet.AllocationPoolBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.NetworkDomain;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.NetworkDomainBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.Subnet;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension;
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.yangtools.yang.binding.InstanceIdentifier;
NetworkDomain subnetDomain = null;
if (NetworkUtils.isProviderPhysicalNetwork(networkOfSubnet)) {
- // add virtual router IP only in case it is provider physical network
- subnetDomain = createSubnet(neutronSubnet, neutronSubnet.getGatewayIp());
+ subnetDomain = createSubnet(neutronSubnet, neutron);
IpAddress gatewayIp = neutronSubnet.getGatewayIp();
boolean registeredDefaultRoute = epRegistrator.registerExternalL3PrefixEndpoint(MappingUtils.DEFAULT_ROUTE,
new L3ContextId(neutronSubnet.getNetworkId().getValue()), gatewayIp, tenantId);
return;
}
} else {
- // virtual router IP is not set and it will be set when router gateway port is set
- // or when a router port is attached to a network
- subnetDomain = createSubnet(neutronSubnet, null);
+ subnetDomain = createSubnet(neutronSubnet, neutron);
}
processTenantSubnet(neutronSubnet, networkOfSubnet, tenantId, rwTx);
rwTx.put(LogicalDatastoreType.CONFIGURATION, L2L3IidFactory.subnetIid(tenantId, subnetDomain.getNetworkDomainId()), subnetDomain, true);
public static NetworkDomain createSubnet(
org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet subnet,
- IpAddress virtualRouterIp) {
+ Neutron neutron) {
SubnetBuilder sb = new SubnetBuilder();
sb.setIpPrefix(subnet.getCidr());
- sb.setVirtualRouterIp(virtualRouterIp);
+ if (neutron.getPorts() != null && neutron.getPorts().getPort() != null) {
+ for (Port port : neutron.getPorts().getPort()) {
+ if (port.getFixedIps() == null || !port.getFixedIps()
+ .stream()
+ .filter(fi -> fi.getSubnetId().equals(subnet.getUuid()))
+ .findFirst()
+ .isPresent()) {
+ continue;
+ }
+ if (neutron.getRouters() != null && neutron.getRouters().getRouter() != null && neutron.getRouters()
+ .getRouter()
+ .stream()
+ .filter(r -> !r.getUuid().getValue().equals(port.getDeviceOwner()))
+ .findFirst()
+ .isPresent()) {
+ // virtual router IP is set when a router port is attached to a network
+ sb.setVirtualRouterIp(subnet.getGatewayIp());
+ } else if (neutron.getNetworks() != null && neutron.getNetworks().getNetwork() != null && neutron
+ .getNetworks()
+ .getNetwork()
+ .stream()
+ .filter(net -> net.getUuid().equals(port.getNetworkId()))
+ .filter(net -> net.getAugmentation(NetworkProviderExtension.class) != null)
+ .filter(net -> net.getAugmentation(NetworkProviderExtension.class).getPhysicalNetwork() != null)
+ .findFirst()
+ .isPresent()) {
+ // add virtual router IP only in case it is provider physical network
+ sb.setVirtualRouterIp(subnet.getGatewayIp());
+ }
+ }
+ }
+ Optional<Network> potentialNetwork =
+ NetworkUtils.findNetwork(subnet.getNetworkId(), neutron.getNetworks());
+ if (potentialNetwork.isPresent()) {
+ sb.setIsTenant(NetworkUtils.isTenantNetwork(potentialNetwork.get()));
+ }
+ if (subnet.getAllocationPools() != null) {
+ List<AllocationPool> pools = subnet.getAllocationPools()
+ .stream()
+ .map(s -> new AllocationPoolBuilder().setFirst(s.getStart().getIpv4Address().getValue())
+ .setLast(s.getEnd().getIpv4Address().getValue())
+ .build())
+ .collect(Collectors.toList());
+ sb.setAllocationPool(pools);
+ }
NetworkDomainBuilder ndb = new NetworkDomainBuilder();
if (!Strings.isNullOrEmpty(subnet.getName())) {
try {
return Optional.absent();
}
+ public static boolean isTenantNetwork(Network network) {
+ return getPhysicalNetwork(network).isEmpty();
+ }
+
public static boolean isProviderPhysicalNetwork(Network network) {
return (!isRouterExternal(network) && !getPhysicalNetwork(network).isEmpty());
}
import java.util.List;
-import com.google.common.collect.ImmutableList;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
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.SubnetBuilder;
+import com.google.common.collect.ImmutableList;
+
public class NeutronPortAwareDataStoreTest extends NeutronMapperDataBrokerTest {
private final Uuid tenantUuid = new Uuid("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa");
.setFixedIps(ImmutableList.of(portIpWithSubnet))
.build();
portAware.onCreated(port, neutron);
- NeutronMapperAssert.assertNetworkDomainExists(dataBroker, port, subnet, ipAddress);
+ NeutronMapperAssert.assertNetworkDomainExists(dataBroker, port, subnet, neutron);
portAware.onDeleted(port, neutron, neutron);
- NeutronMapperAssert.assertNetworkDomainExists(dataBroker, port, subnet, ipAddress);
+ NeutronMapperAssert.assertNetworkDomainExists(dataBroker, port, subnet, neutron);
NeutronMapperAssert.assertPortNotExists(dataBroker, port.getUuid());
}
Subnet subnet = subnets.getSubnet().get(0);
Port port = newBasePort().setDeviceOwner(PortUtils.DEVICE_OWNER_ROUTER_IFACE).build();
portAware.onCreated(port, neutron);
- NeutronMapperAssert.assertNetworkDomainNotExists(dataBroker, port, subnet, ipAddress);
+ NeutronMapperAssert.assertNetworkDomainNotExists(dataBroker, port, subnet, neutron);
}
@Test
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
-import com.google.common.collect.ImmutableList;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.SubnetBuilder;
import org.opendaylight.yangtools.yang.common.RpcResult;
+import com.google.common.collect.ImmutableList;
+
public class NeutronSubnetAwareDataStoreTest extends NeutronMapperDataBrokerTest {
private static final Uuid tenantUuid = new Uuid("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa");
subnetAware.onCreated(subnet, neutron);
- NeutronMapperAssert.assertNetworkDomainExists(dataBroker, tenantUuid, subnet, ipAddress);
+ NeutronMapperAssert.assertNetworkDomainExists(dataBroker, tenantUuid, subnet, neutron);
}
@Test
subnetAware.onCreated(subnet, neutron);
- NeutronMapperAssert.assertNetworkDomainNotExists(dataBroker, tenantUuid, subnet, ipAddress);
+ NeutronMapperAssert.assertNetworkDomainNotExists(dataBroker, tenantUuid, subnet, neutron);
}
@Test
subnetAware.onCreated(subnet, neutron);
- NeutronMapperAssert.assertNetworkDomainExists(dataBroker, tenantUuid, subnet, ipAddress);
- NeutronMapperAssert.assertNetworkDomainNotExists(dataBroker, tenantUuid, subnet2, ipAddress);
+ NeutronMapperAssert.assertNetworkDomainExists(dataBroker, tenantUuid, subnet, neutron);
+ NeutronMapperAssert.assertNetworkDomainNotExists(dataBroker, tenantUuid, subnet2, neutron);
subnetAware.onUpdated(subnet, subnet2, neutron, neutron);
- NeutronMapperAssert.assertNetworkDomainExists(dataBroker, tenantUuid, subnet2, ipAddress);
+ NeutronMapperAssert.assertNetworkDomainExists(dataBroker, tenantUuid, subnet2, neutron);
}
@Test
subnetAware.onCreated(subnet, neutron);
- NeutronMapperAssert.assertNetworkDomainExists(dataBroker, tenantUuid, subnet, ipAddress);
+ NeutronMapperAssert.assertNetworkDomainExists(dataBroker, tenantUuid, subnet, neutron);
subnetAware.onDeleted(subnet, neutron, neutron);
- NeutronMapperAssert.assertNetworkDomainNotExists(dataBroker, tenantUuid, subnet, ipAddress);
+ NeutronMapperAssert.assertNetworkDomainNotExists(dataBroker, tenantUuid, subnet, neutron);
}
-
@Test
public void testOnDeleted_wrongSubnet() {
subnetAware.onCreated(subnet, neutron);
- NeutronMapperAssert.assertNetworkDomainExists(dataBroker, tenantUuid, subnet, ipAddress);
+ NeutronMapperAssert.assertNetworkDomainExists(dataBroker, tenantUuid, subnet, neutron);
subnetAware.onDeleted(subnet2, neutron, neutron);
- NeutronMapperAssert.assertNetworkDomainExists(dataBroker, tenantUuid, subnet, ipAddress);
+ NeutronMapperAssert.assertNetworkDomainExists(dataBroker, tenantUuid, subnet, neutron);
}
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPort;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps;
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.Subnet;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.SubnetBuilder;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
return portOptional;
}
- public static void assertNetworkDomainExists(DataBroker dataBroker, Port port, Subnet subnet, IpAddress ipAddress) {
+ public static void assertNetworkDomainExists(DataBroker dataBroker, Port port, Subnet subnet, Neutron neutron) {
Optional<NetworkDomain> opt =
- getNetworkDomainOptional(dataBroker, port.getTenantId(), ipAddress, subnet);
+ getNetworkDomainOptional(dataBroker, port.getTenantId(), neutron, subnet);
assertTrue(opt.isPresent());
}
public static void assertNetworkDomainNotExists(DataBroker dataBroker, Port port, Subnet subnet,
- IpAddress ipAddress) {
+ Neutron neutron) {
Optional<NetworkDomain> opt =
- getNetworkDomainOptional(dataBroker, port.getTenantId(), ipAddress, subnet);
+ getNetworkDomainOptional(dataBroker, port.getTenantId(), neutron, subnet);
assertFalse(opt.isPresent());
}
public static void assertNetworkDomainExists(DataBroker dataBroker, Uuid tenantUuid, Subnet subnet,
- IpAddress ipAddress) {
- Optional<NetworkDomain> opt = getNetworkDomainOptional(dataBroker, tenantUuid, ipAddress, subnet);
+ Neutron neutron) {
+ Optional<NetworkDomain> opt = getNetworkDomainOptional(dataBroker, tenantUuid, neutron, subnet);
assertTrue(opt.isPresent());
}
public static void assertNetworkDomainNotExists(DataBroker dataBroker, Uuid tenantUuid, Subnet subnet,
- IpAddress ipAddress) {
- Optional<NetworkDomain> opt = getNetworkDomainOptional(dataBroker, tenantUuid, ipAddress, subnet);
+ Neutron neutron) {
+ Optional<NetworkDomain> opt = getNetworkDomainOptional(dataBroker, tenantUuid, neutron, subnet);
assertFalse(opt.isPresent());
}
private static Optional<NetworkDomain> getNetworkDomainOptional(DataBroker dataBroker, Uuid tenantUuid,
- IpAddress ipAddress, Subnet subnet) {
+ Neutron neutron, Subnet subnet) {
InstanceIdentifier<NetworkDomain> iid;
- NetworkDomain subnetDomain = NeutronSubnetAware.createSubnet(subnet, ipAddress);
+ NetworkDomain subnetDomain = NeutronSubnetAware.createSubnet(subnet, neutron);
TenantId tenantId = new TenantId(tenantUuid.getValue());
iid = L2L3IidFactory.subnetIid(tenantId, subnetDomain.getNetworkDomainId());
Optional<NetworkDomain> optional;
import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;\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.MountedDataBrokerProvider;\r
import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;\r
import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;\r
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.nat.rev150908.nat.config.nat.instances.nat.instance.MappingTableBuilder;\r
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.nat.rev150908.nat.config.nat.instances.nat.instance.mapping.table.MappingEntry;\r
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.nat.rev150908.nat.config.nat.instances.nat.instance.mapping.table.MappingEntryBuilder;\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.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererNodes;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNode;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.VppInterfaceAugmentation;\r
}\r
\r
public ListenableFuture<Void> submitNatChanges(List<InstanceIdentifier<PhysicalInterface>> physIfacesIid,\r
- List<MappingEntryBuilder> natEntries, boolean add) {\r
+ List<MappingEntryBuilder> natEntries, PolicyContext policyCtx, boolean add) {\r
List<ListenableFuture<Void>> submitedFutures = new ArrayList<>();\r
for (InstanceIdentifier<PhysicalInterface> iidPhysIface : physIfacesIid) {\r
InstanceIdentifier<?> nodeIid = iidPhysIface.firstKeyOf(RendererNode.class).getNodePath();\r
}\r
if (add) {\r
LOG.trace("Setting outbound NAT on interface {}.", iidPhysIface.getPathArguments());\r
- NatUtil.setOutboundInterface(readIface.get(), rwTx);\r
+ NatUtil.setOutboundInterface(readIface.get(), rwTx); \r
rwTx.put(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getNatInstanceIid(id),\r
- buildNatInstance(natEntries));\r
+ buildNatInstance(natEntries, NatUtil.resolveDynamicNat(policyCtx)));\r
} else {\r
LOG.trace("UNsetting outbound NAT on interface {}.", iidPhysIface.getPathArguments());\r
NatUtil.unsetOutboundInterface(readIface.get(), rwTx);\r
return Futures.immediateFuture(null);\r
}\r
\r
- private NatInstance buildNatInstance(List<MappingEntryBuilder> natEntries) {\r
+ private NatInstance buildNatInstance(List<MappingEntryBuilder> natEntries, List<ExternalIpAddressPool> poolEntries) {\r
AtomicInteger ai = new AtomicInteger();\r
List<MappingEntry> mappingEntries = natEntries.stream().map(me -> {\r
int value = ai.get();\r
return me.setIndex((long) value).build();\r
}).collect(Collectors.toList());\r
MappingTable mappingTable = new MappingTableBuilder().setMappingEntry(mappingEntries).build();\r
- return new NatInstanceBuilder().setId(id).setMappingTable(mappingTable).build();\r
+ return new NatInstanceBuilder().setId(id).setExternalIpAddressPool(poolEntries).setMappingTable(mappingTable).build();\r
}\r
}\r
\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
for (RendererForwardingByTenant fwd : cfg.getRendererForwarding().getRendererForwardingByTenant()) {
List<InstanceIdentifier<PhysicalInterface>> physIfacesIid =
resolvePhysicalInterfacesForNat(fwd.getRendererNetworkDomain());
- natManager.submitNatChanges(physIfacesIid, natEntries, true);
+ natManager.submitNatChanges(physIfacesIid, natEntries, policyCtx, true);
}
}
}
for (RendererForwardingByTenant fwd : cfg.getRendererForwarding().getRendererForwardingByTenant()) {
List<InstanceIdentifier<PhysicalInterface>> physIfacesIid =
resolvePhysicalInterfacesForNat(fwd.getRendererNetworkDomain());
- natManager.submitNatChanges(physIfacesIid, natEntries, false);
+ natManager.submitNatChanges(physIfacesIid, natEntries, policyCtx, false);
}
}
}