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.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.vpn.to.dpn.list.VpnInterfaces;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id.VpnInstance;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
MdsalUtils.commitTransaction(tx);
}
+ waitForInterfaceDpn(vpnName, rd, interfaceName);
+
+ NetvirtVpnUtils.createVpnPortFixedIp(dataBroker, vpnName, interfaceName, ipUni.getIpAddress(),
+ uni.getMacAddress());
+ }
+
+ private void waitForInterfaceDpn(String vpnName, String rd, String interfaceName) {
InstanceIdentifier<VpnInstanceOpDataEntry> vpnId = NetvirtVpnUtils.getVpnInstanceOpDataIdentifier(rd);
+ DataWaitGetter<VpnInstanceOpDataEntry> getInterfByName = (vpn) -> {
+ if (vpn.getVpnToDpnList() == null)
+ return null;
+ for (VpnToDpnList is : vpn.getVpnToDpnList()) {
+ if (is.getVpnInterfaces() == null)
+ continue;
+ for (VpnInterfaces i : is.getVpnInterfaces()) {
+ if (i.getInterfaceName().equals(interfaceName))
+ return interfaceName;
+ }
+ }
+ return null;
+ };
@SuppressWarnings("resource")
DataWaitListener<VpnInstanceOpDataEntry> vpnInstanceWaiter = new DataWaitListener<>(dataBroker, vpnId, 10,
- LogicalDatastoreType.OPERATIONAL, vpn -> vpn.getVpnToDpnList());
+ LogicalDatastoreType.OPERATIONAL, getInterfByName);
if (!vpnInstanceWaiter.waitForData()) {
String errorMessage = String.format("Fail to wait for vpn to dpn list %s", vpnName);
Log.error(errorMessage);
throw new UnsupportedOperationException(errorMessage);
}
-
- NetvirtVpnUtils.createVpnPortFixedIp(dataBroker, vpnName, interfaceName, ipUni.getIpAddress(),
- uni.getMacAddress());
}
private String createElanInterface(String vpnName, InstanceIdentifier<Ipvc> ipvcId, String uniId, String elanName,
public static void addDirectSubnetToVpn(DataBroker dataBroker,
final NotificationPublishService notificationPublishService, String vpnName, String subnetName,
- IpPrefix subnetIpPrefix, String interfaceName, int waitForElan) {
+ IpPrefix subnetIpPrefix, String interfaceName, String intfMac, int waitForElan) {
InstanceIdentifier<ElanInstance> elanIdentifierId = NetvirtUtils.getElanInstanceInstanceIdentifier(subnetName);
@SuppressWarnings("resource") // AutoCloseable
String subnetIp = getSubnetFromPrefix(ipPrefixToString(subnetIpPrefix));
logger.info("Adding subnet {} {} to vpn {}", subnetName, subnetIp, vpnName);
- updateSubnetNode(dataBroker, new Uuid(vpnName), subnetId, subnetIp);
+ updateSubnetNode(dataBroker, new Uuid(vpnName), subnetId, subnetIp, intfMac);
logger.info("Adding port {} to subnet {}", interfaceName, subnetName);
updateSubnetmapNodeWithPorts(dataBroker, subnetId, new Uuid(interfaceName), null, vpnName);
logger.debug("Deleted subnet-network mapping for network {}", networkId.getValue());
}
- protected static void updateSubnetNode(DataBroker dataBroker, Uuid vpnId, Uuid subnetId, String subnetIp) {
+ protected static void updateSubnetNode(DataBroker dataBroker, Uuid vpnId, Uuid subnetId, String subnetIp,
+ String intfMac) {
Subnetmap subnetmap = null;
SubnetmapBuilder builder = null;
InstanceIdentifier<Subnetmap> id = InstanceIdentifier.builder(Subnetmaps.class)
builder.setSubnetIp(subnetIp);
builder.setNetworkId(subnetId);
builder.setVpnId(vpnId);
+ builder.setRouterIntfMacAddress(intfMac);
subnetmap = builder.build();
logger.debug("Creating/Updating subnetMap node: {} ", subnetId.getValue());
private final int waitForElanInterval;
public SubnetListener(final DataBroker dataBroker, final NotificationPublishService notPublishService,
- final IGwMacListener gwMacListener, int sleepInterval) {
+ final IGwMacListener gwMacListener, int sleepInterval) {
super(dataBroker);
this.notificationPublishService = notPublishService;
this.gwMacListener = gwMacListener;
ipUniSubnets.forEach(s -> removeNetwork(s, uniId, ipUniId, ipvcId));
}
-
private void createNetwork(DataTreeModification<Subnet> newDataObject) {
Subnet newSubnet = newDataObject.getRootNode().getDataAfter();
return;
}
- String srcTpAddressStr = NetvirtVpnUtils.getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress()));
+ String srcTpAddressStr = NetvirtVpnUtils
+ .getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress()));
IpAddress srcIpAddress = new IpAddress(srcTpAddressStr.toCharArray());
String subnet = NetvirtVpnUtils.ipPrefixToString(newSubnet.getSubnet());
- gwMacListener.resolveGwMac(ipvcVpn.getVpnId(), vpnElan.getElanPort(), srcIpAddress, newSubnet.getGateway(), subnet);
+ gwMacListener.resolveGwMac(ipvcVpn.getVpnId(), vpnElan.getElanPort(), srcIpAddress, newSubnet.getGateway(),
+ subnet);
}
private void checkCreateDirectNetwork(Subnet newSubnet, IpvcVpn ipvcVpn, InstanceIdentifier<Ipvc> ipvcId,
return;
}
+ org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni operUni = MefInterfaceUtils
+ .getUni(dataBroker, newSubnet.getUniId().getValue(), LogicalDatastoreType.OPERATIONAL);
+ if (operUni == null) {
+ Log.error("Uni {} for network {} is not operational", newSubnet.getUniId(), newSubnet.getSubnet());
+ return;
+ }
+ String portMacAddress = operUni.getMacAddress().getValue();
+
NetvirtVpnUtils.addDirectSubnetToVpn(dataBroker, notificationPublishService, ipvcVpn.getVpnId(),
- vpnElan.getElanId(), newSubnet.getSubnet(), vpnElan.getElanPort(), waitForElanInterval);
+ vpnElan.getElanId(), newSubnet.getSubnet(), vpnElan.getElanPort(), portMacAddress, waitForElanInterval);
}
vpnElan.getElanId(), vpnElan.getElanPort(), subnetStr);
}
-
private void removeDirectNetwork(Subnet deletedSubnet, IpvcVpn ipvcVpn, InstanceIdentifier<Ipvc> ipvcId) {
if (deletedSubnet.getGateway() != null) {
return;
return;
}
- String srcTpAddressStr = NetvirtVpnUtils.getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress()));
+ String srcTpAddressStr = NetvirtVpnUtils
+ .getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress()));
IpAddress srcIpAddress = new IpAddress(srcTpAddressStr.toCharArray());
String subnet = NetvirtVpnUtils.ipPrefixToString(deletedSubnet.getSubnet());
- gwMacListener.unResolveGwMac(ipvcVpn.getVpnId(), vpnElan.getElanPort(), srcIpAddress, deletedSubnet.getGateway(), subnet);
+ gwMacListener.unResolveGwMac(ipvcVpn.getVpnId(), vpnElan.getElanPort(), srcIpAddress,
+ deletedSubnet.getGateway(), subnet);
NetvirtVpnUtils.removeVpnInterfaceAdjacency(dataBroker, vpnElan.getElanPort(), deletedSubnet.getSubnet());
NetvirtVpnUtils.removeVpnInterfaceAdjacency(dataBroker, vpnElan.getElanPort(), deletedSubnet.getGateway());