import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.ipvc.VpnElans;
import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.ipvc.choice.ipvc.unis.Uni;
import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.Identifier45;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInterface.EtreeInterfaceType;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
}
Long vlan = ipUni.getVlan() != null ? Long.valueOf(ipUni.getVlan().getValue()) : null;
- String elanName = NetvirtVpnUtils.getElanNameForVpnPort(uniId);
- String interfaceName = createElanInterface(vpnName, ipvcId, uniId, elanName, vlan, tx);
- createVpnInterface(vpnName, uni, ipUni, interfaceName, tx);
+ String elanName = NetvirtVpnUtils.getElanNameForVpnPort(uniId, ipUniId);
+
+ String srcIpAddressStr = NetvirtVpnUtils
+ .getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress()));
+ IpAddress ipAddress = new IpAddress(srcIpAddressStr.toCharArray());
+
+ String interfaceName = createElanInterface(vpnName, ipvcId, uniId, elanName, vlan, ipAddress, tx);
+ createVpnInterface(vpnName, uni, ipUni, interfaceName, elanName, tx);
MefServicesUtils.addOperIpvcVpnElan(ipvcId, vpnName, uniInService.getUniId(), uniInService.getIpUniId(),
elanName, interfaceName, null, tx);
}
private String createElanInterface(String vpnName, InstanceIdentifier<Ipvc> ipvcId, String uniId, String elanName,
- Long vlan, WriteTransaction tx) {
+ Long vlan, IpAddress ipAddress, WriteTransaction tx) {
Log.info("Adding elan instance: " + elanName);
NetvirtUtils.updateElanInstance(elanName, tx);
+ NetvirtVpnUtils.registerDirectSubnetForVpn(dataBroker, new Uuid(elanName), ipAddress);
Log.info("Added trunk interface for uni {} vlan: {}", uniId, vlan);
if (vlan != null) {
private void createVpnInterface(String vpnName,
org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni uni,
- IpUni ipUni, String interfaceName, WriteTransaction tx) {
+ IpUni ipUni, String interfaceName, String elanName, WriteTransaction tx) {
Log.info("Adding vpn interface: " + interfaceName);
NetvirtVpnUtils.createUpdateVpnInterface(vpnName, interfaceName, ipUni.getIpAddress(),
- uni.getMacAddress().getValue(), true, null, tx);
+ uni.getMacAddress().getValue(), true, null, elanName, tx);
NetvirtVpnUtils.createVpnPortFixedIp(vpnName, interfaceName, ipUni.getIpAddress(), uni.getMacAddress(), tx);
Log.info("Finished working on vpn instance: " + vpnName);
}
}
String vpnName = ipvcVpn.getVpnId();
-
VpnElans vpnElans = MefServicesUtils.findVpnElanForNetwork(new Identifier45(uniId), ipUni.getIpUniId(),
ipvcVpn);
if (vpnElans == null) {
String interfaceName = vpnElans.getElanPort();
Log.info("Removing elan instance {} and interface {}: ", elanName, interfaceName);
+ NetvirtVpnUtils.unregisterDirectSubnetForVpn(dataBroker, new Uuid(elanName));
NetvirtUtils.deleteElanInterface(interfaceName, tx);
NetvirtUtils.deleteElanInstance(elanName, tx);
}
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.UUID;
import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder;
import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.OdlArputilService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.Subnetmap;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.SubnetmapBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.SubnetmapKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.IpVersionV4;
+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.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.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.SubnetKey;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
import com.google.common.base.Optional;
public class NetvirtVpnUtils {
}
public static void createUpdateVpnInterface(DataBroker dataBroker, String vpnName, String interfaceName,
- String ifAddr, String macAddress, boolean primary, String gwIpAddress) {
+ String ifAddr, String macAddress, boolean primary, String gwIpAddress, String directSubnetId) {
WriteTransaction tx = MdsalUtils.createTransaction(dataBroker);
- createUpdateVpnInterface(vpnName, interfaceName, ifAddr, macAddress, primary, gwIpAddress, tx);
+ createUpdateVpnInterface(vpnName, interfaceName, ifAddr, macAddress, primary, gwIpAddress, directSubnetId, tx);
MdsalUtils.commitTransaction(tx);
}
public static void createUpdateVpnInterface(String vpnName, String interfaceName, IpPrefix ifPrefix,
- String macAddress, boolean primary, IpPrefix gwIpAddress, WriteTransaction tx) {
+ String macAddress, boolean primary, IpPrefix gwIpAddress, String directSubnetId, WriteTransaction tx) {
synchronized (interfaceName.intern()) {
String ipAddress = null;
String nextHopIp = null;
ipAddress = ipPrefixToString(ifPrefix);
nextHopIp = getIpAddressFromPrefix(ipPrefixToString(gwIpAddress));
}
- createUpdateVpnInterface(vpnName, interfaceName, ipAddress, macAddress, primary, nextHopIp, tx);
+ createUpdateVpnInterface(vpnName, interfaceName, ipAddress, macAddress, primary, nextHopIp, directSubnetId,
+ tx);
}
}
public static void createUpdateVpnInterface(String vpnName, String interfaceName, String ipAddress,
- String macAddress, boolean primary, String nextHopIp, WriteTransaction tx) {
+ String macAddress, boolean primary, String nextHopIp, String subnetId, WriteTransaction tx) {
synchronized (interfaceName.intern()) {
- Adjacencies adjancencies = buildInterfaceAdjacency(ipAddress, macAddress, primary, nextHopIp);
+ Adjacencies adjancencies = buildInterfaceAdjacency(ipAddress, macAddress, primary, nextHopIp, subnetId);
VpnInterfaceBuilder einterfaceBuilder = createVpnInterface(vpnName, interfaceName, adjancencies);
tx.merge(LogicalDatastoreType.CONFIGURATION, getVpnInterfaceInstanceIdentifier(interfaceName),
}
private static Adjacencies buildInterfaceAdjacency(String ipAddress, String macAddress, boolean primary,
- String nextHopIp) {
+ String nextHopIp, String subnetId) {
AdjacenciesBuilder builder = new AdjacenciesBuilder();
List<Adjacency> list = new ArrayList<>();
aBuilder.setMacAddress(macAddress);
}
aBuilder.setPrimaryAdjacency(primary);
+ if (subnetId != null) {
+ aBuilder.setSubnetId(new Uuid(subnetId));
+ }
if (nextHopIp != null) {
aBuilder.setNextHopIpList(Arrays.asList(nextHopIp));
}
}
public static void removeVpnInterfaceAdjacencies(DataBroker dataBroker, String vpnName, String interfaceName) {
+ InstanceIdentifier<VpnInterface> identifier = getVpnInterfaceInstanceIdentifier(interfaceName);
+ InstanceIdentifier<Adjacencies> path = identifier.augmentation(Adjacencies.class);
+ Optional<Adjacencies> adjacencies = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path);
+ List<Adjacency> adjacenciesList = (adjacencies.isPresent() && adjacencies.get().getAdjacency() != null)
+ ? adjacencies.get().getAdjacency() : Collections.emptyList();
+ adjacenciesList.forEach(a -> {
+ String ipStr = getIpAddressFromPrefix(a.getIpAddress());
+ InstanceIdentifier<VpnPortipToPort> id = getVpnPortipToPortIdentifier(vpnName, ipStr);
+ MdsalUtils.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+ });
+
AdjacenciesBuilder builder = new AdjacenciesBuilder();
List<Adjacency> list = new ArrayList<>();
builder.setAdjacency(list);
tx.delete(LogicalDatastoreType.OPERATIONAL, id);
}
+ public static void registerDirectSubnetForVpn(DataBroker dataBroker, Uuid subnetName, IpAddress gwIpAddress) {
+ final SubnetKey subnetkey = new SubnetKey(subnetName);
+
+ final InstanceIdentifier<Subnet> subnetidentifier = InstanceIdentifier.create(Neutron.class)
+ .child(Subnets.class).child(Subnet.class, subnetkey);
+
+ SubnetBuilder subnetBuilder = new SubnetBuilder();
+ subnetBuilder.setIpVersion(IpVersionV4.class);
+ subnetBuilder.setGatewayIp(gwIpAddress);
+ subnetBuilder.setKey(subnetkey);
+ MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, subnetidentifier, subnetBuilder.build());
+ }
+
+ public static void unregisterDirectSubnetForVpn(DataBroker dataBroker, Uuid subnetName) {
+ final SubnetKey subnetkey = new SubnetKey(subnetName);
+ final InstanceIdentifier<Subnet> subnetidentifier = InstanceIdentifier.create(Neutron.class)
+ .child(Subnets.class).child(Subnet.class, subnetkey);
+
+ MdsalUtils.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, subnetidentifier);
+ }
+
public static void addDirectSubnetToVpn(DataBroker dataBroker,
final NotificationPublishService notificationPublishService, String vpnName, String subnetName,
IpPrefix subnetIpPrefix, String interfaceName) {
logger.info("Publish subnet {}", subnetName);
publishSubnetAddNotification(notificationPublishService, subnetId, subnetIp, vpnName, elanTag);
logger.info("Finished Working on subnet {}", subnetName);
-
}
public static void removeDirectSubnetFromVpn(DataBroker dataBroker,
}
}
+ public static String getElanNameForVpnPort(String uniId, String ipUniId) {
+ return getUUidFromString(ELAN_PREFIX + uniId + ipUniId);
+ }
+
public static String getIpAddressFromPrefix(String prefix) {
return prefix.split(IP_MUSK_SEPARATOR)[0];
}
return myAddress + IP_ADDR_SUFFIX;
}
- public static String getElanNameForVpnPort(String portName) {
- return getUUidFromString(ELAN_PREFIX + portName);
- }
-
public static String getUUidFromString(String key) {
return java.util.UUID.nameUUIDFromBytes(key.getBytes()).toString();
}