* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-
package org.opendaylight.netvirt.neutronvpn;
import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableBiMap;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.SettableFuture;
-import java.math.BigInteger;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.Dhcpv6Base;
+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.IpVersionBase;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.Uint64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
.put(NetworkTypeVxlan.class, SegmentTypeVxlan.class)
.build();
- private static final Set<Class<? extends NetworkTypeBase>> SUPPORTED_NETWORK_TYPES = new HashSet<>();
-
- static {
- SUPPORTED_NETWORK_TYPES.add(NetworkTypeFlat.class);
- SUPPORTED_NETWORK_TYPES.add(NetworkTypeVlan.class);
- SUPPORTED_NETWORK_TYPES.add(NetworkTypeVxlan.class);
- SUPPORTED_NETWORK_TYPES.add(NetworkTypeGre.class);
- }
+ private static final ImmutableSet<Class<? extends NetworkTypeBase>> SUPPORTED_NETWORK_TYPES = ImmutableSet.of(
+ NetworkTypeFlat.class,
+ NetworkTypeVlan.class,
+ NetworkTypeVxlan.class,
+ NetworkTypeGre.class);
private final ConcurrentMap<Uuid, Network> networkMap = new ConcurrentHashMap<>();
private final ConcurrentMap<Uuid, Router> routerMap = new ConcurrentHashMap<>();
protected Uuid getVpnForNetwork(Uuid network) {
InstanceIdentifier<VpnMaps> vpnMapsIdentifier = InstanceIdentifier.builder(VpnMaps.class).build();
Optional<VpnMaps> optionalVpnMaps = read(LogicalDatastoreType.CONFIGURATION, vpnMapsIdentifier);
- if (optionalVpnMaps.isPresent() && optionalVpnMaps.get().getVpnMap() != null) {
- for (VpnMap vpnMap : optionalVpnMaps.get().nonnullVpnMap()) {
+ if (optionalVpnMaps.isPresent() && optionalVpnMaps.get().nonnullVpnMap() != null) {
+ for (VpnMap vpnMap : new ArrayList<>(optionalVpnMaps.get().nonnullVpnMap())) {
List<Uuid> netIds = vpnMap.getNetworkIds();
if (netIds != null && netIds.contains(network)) {
return vpnMap.getVpnId();
InstanceIdentifier<VpnMaps> vpnMapsIdentifier = InstanceIdentifier.builder(VpnMaps.class).build();
Optional<VpnMaps> optionalVpnMaps = read(LogicalDatastoreType.CONFIGURATION, vpnMapsIdentifier);
- if (optionalVpnMaps.isPresent() && optionalVpnMaps.get().getVpnMap() != null) {
- for (VpnMap vpnMap : optionalVpnMaps.get().nonnullVpnMap()) {
+ if (optionalVpnMaps.isPresent() && optionalVpnMaps.get().nonnullVpnMap() != null) {
+ for (VpnMap vpnMap : new ArrayList<>(optionalVpnMaps.get().nonnullVpnMap())) {
List<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.vpnmaps.vpnmap
.RouterIds> routerIdsList = vpnMap.getRouterIds();
if (routerIdsList == null || routerIdsList.isEmpty()) {
Optional<VpnMap> optionalVpnMap = read(LogicalDatastoreType.CONFIGURATION, vpnMapIdentifier);
if (optionalVpnMap.isPresent()) {
VpnMap vpnMap = optionalVpnMap.get();
- return vpnMap.getNetworkIds();
+ if (vpnMap.getNetworkIds() != null && !vpnMap.getNetworkIds().isEmpty()) {
+ return new ArrayList<>(vpnMap.getNetworkIds());
+ } else {
+ return null;
+ }
}
LOG.error("getNetworksforVpn: Failed as VPNMaps DS is absent for VPN {}", vpnId.getValue());
return null;
return null;
}
+ protected static boolean isDhcpServerPort(Port port) {
+ return port.getDeviceOwner().equals("network:dhcp");
+ }
+
+ protected InterfaceAcl getDhcpInterfaceAcl(Port port) {
+ InterfaceAclBuilder interfaceAclBuilder = new InterfaceAclBuilder();
+ interfaceAclBuilder.setPortSecurityEnabled(false);
+ interfaceAclBuilder.setInterfaceType(InterfaceAcl.InterfaceType.DhcpService);
+ List<AllowedAddressPairs> aclAllowedAddressPairs = NeutronvpnUtils.getAllowedAddressPairsForAclService(
+ port.getMacAddress(), port.getFixedIps());
+ interfaceAclBuilder.setAllowedAddressPairs(aclAllowedAddressPairs);
+ return interfaceAclBuilder.build();
+ }
+
/**
* Returns port_security_enabled status with the port.
*
aclAllowedAddressPairs.addAll(NeutronvpnUtils.getAllowedAddressPairsForAclService(portAllowedAddressPairs));
}
interfaceAclBuilder.setAllowedAddressPairs(aclAllowedAddressPairs);
-
+ interfaceAclBuilder.setInterfaceType(InterfaceAcl.InterfaceType.AccessPort);
populateSubnetInfo(interfaceAclBuilder, port);
}
}
static Boolean getIsExternal(Network network) {
- return network.augmentation(NetworkL3Extension.class) != null
- && network.augmentation(NetworkL3Extension.class).isExternal();
+ NetworkL3Extension ext = network.augmentation(NetworkL3Extension.class);
+ return ext != null && ext.isExternal();
}
static InstanceIdentifier<NetworkMap> buildNetworkMapIdentifier(Uuid networkId) {
static boolean isNetworkTypeSupported(Network network) {
NetworkProviderExtension npe = network.augmentation(NetworkProviderExtension.class);
- return npe != null && npe.getNetworkType() != null && SUPPORTED_NETWORK_TYPES.contains(npe.getNetworkType());
+ return npe != null && SUPPORTED_NETWORK_TYPES.contains(npe.getNetworkType());
}
- static boolean isNetworkOfType(Network network, Class<? extends NetworkTypeBase> type) {
- NetworkProviderExtension npe = network.augmentation(NetworkProviderExtension.class);
- if (npe != null && npe.getNetworkType() != null) {
- return type.isAssignableFrom(npe.getNetworkType());
+ static boolean isFlatOrVlanNetwork(Network network) {
+ if (network != null) {
+ NetworkProviderExtension npe = network.augmentation(NetworkProviderExtension.class);
+ if (npe != null) {
+ Class<? extends NetworkTypeBase> npeType = npe.getNetworkType();
+ if (npeType != null) {
+ return NetworkTypeVlan.class.isAssignableFrom(npeType)
+ || NetworkTypeFlat.class.isAssignableFrom(npeType);
+ }
+ }
}
return false;
}
- static boolean isFlatOrVlanNetwork(Network network) {
- return network != null
- && (isNetworkOfType(network, NetworkTypeVlan.class) || isNetworkOfType(network, NetworkTypeFlat.class));
- }
-
static boolean isVlanOrVxlanNetwork(Class<? extends NetworkTypeBase> type) {
return type.isAssignableFrom(NetworkTypeVxlan.class) || type.isAssignableFrom(NetworkTypeVlan.class);
}
LOG.error("updateVpnInstanceWithFallback: vpnInstanceOpDataEntry not found for vpn {}", vpnName);
return;
}
- Long internetBgpVpnId = vpnInstanceOpDataEntry.getVpnId();
+ Long internetBgpVpnId = vpnInstanceOpDataEntry.getVpnId().toJava();
List<Uuid> routerIds = new ArrayList<>();
//Handle router specific V6 internet fallback flow else handle all V6 external routers
if (routerId != null) {
if (rtrId == null) {
continue;
}
- List<BigInteger> dpnIds = getDpnsForRouter(rtrId.getValue());
+ List<Uint64> dpnIds = getDpnsForRouter(rtrId.getValue());
if (dpnIds.isEmpty()) {
continue;
}
VpnInstanceOpDataEntry vpnOpDataEntry = getVpnInstanceOpDataEntryFromVpnId(rtrId.getValue());
- Long routerIdAsLong = vpnOpDataEntry.getVpnId();
+ Long routerIdAsLong = vpnOpDataEntry.getVpnId().toJava();
long vpnId;
Uuid rtrVpnId = getVpnForRouter(rtrId, true);
if (rtrVpnId == null) {
} else {
vpnId = getVpnId(rtrVpnId.getValue());
}
- for (BigInteger dpnId : dpnIds) {
+ for (Uint64 dpnId : dpnIds) {
if (add) {
LoggingFutures.addErrorLogging(
txRunner.callWithNewWriteOnlyTransactionAndSubmit(Datastore.CONFIGURATION,
- tx -> ipV6InternetDefRt.installDefaultRoute(tx, dpnId, rtrId.getValue(), internetBgpVpnId,
- vpnId)), LOG, "Error adding default route");
+ tx -> ipV6InternetDefRt.installDefaultRoute(tx, dpnId, rtrId.getValue(),
+ internetBgpVpnId, vpnId)), LOG, "Error adding default route");
} else {
LoggingFutures.addErrorLogging(
txRunner.callWithNewReadWriteTransactionAndSubmit(Datastore.CONFIGURATION,
- tx -> ipV6InternetDefRt.removeDefaultRoute(tx, dpnId, rtrId.getValue(), internetBgpVpnId,
- vpnId)), LOG,
+ tx -> ipV6InternetDefRt.removeDefaultRoute(tx, dpnId, rtrId.getValue(),
+ internetBgpVpnId, vpnId)), LOG,
"Error removing default route");
}
}
}
@NonNull
- public List<BigInteger> getDpnsForRouter(String routerUuid) {
+ public List<Uint64> getDpnsForRouter(String routerUuid) {
InstanceIdentifier id = InstanceIdentifier.builder(NeutronRouterDpns.class)
.child(RouterDpnList.class, new RouterDpnListKey(routerUuid)).build();
Optional<RouterDpnList> routerDpnListData =
SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
LogicalDatastoreType.OPERATIONAL, id);
- List<BigInteger> dpns = new ArrayList<>();
+ List<Uint64> dpns = new ArrayList<>();
if (routerDpnListData.isPresent()) {
for (DpnVpninterfacesList dpnVpnInterface : routerDpnListData.get().nonnullDpnVpninterfacesList()) {
dpns.add(dpnVpnInterface.getDpnId());
return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(
org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id
- .VpnInstance::getVpnId).orElse(null);
+ .VpnInstance::getVpnId).orElse(null).toJava();
}
protected boolean isV6SubnetPartOfRouter(Uuid routerId) {