Bugfix: VR has double NICs connected to Public network

replace vlanid wih broadcast uri to support vxlan to identify whether id is VLAN ID or VNI

Signed-off-by: ynojima <mail@ynojima.net>
Signed-off-by: Hugo Trippaers <htrippaers@schubergphilis.com>
This commit is contained in:
ynojima 2013-11-06 11:02:56 -07:00 committed by Hugo Trippaers
parent c06d8a750c
commit 494ccd821d

View File

@ -51,6 +51,8 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import javax.ejb.Local; import javax.ejb.Local;
import javax.naming.ConfigurationException; import javax.naming.ConfigurationException;
@ -1656,14 +1658,19 @@ ServerResource {
} }
} }
private String getVlanIdFromBridge(String brName) { private String getBroadcastUriFromBridge(String brName) {
String pif= matchPifFileInDirectory(brName); String pif= matchPifFileInDirectory(brName);
String[] pifparts = pif.split("\\."); Pattern pattern = Pattern.compile("(\\D+)(\\d+)");
Matcher matcher = pattern.matcher(pif);
if(pifparts.length == 2) { if(matcher.find()) {
return pifparts[1]; if (brName.startsWith("brvx")){
return BroadcastDomainType.Vxlan.toUri(matcher.group(2)).toString();
}
else{
return BroadcastDomainType.Vlan.toUri(matcher.group(2)).toString();
}
} else { } else {
s_logger.debug("failed to get vlan id from bridge " + brName s_logger.debug("failed to get vNet id from bridge " + brName
+ "attached to physical interface" + pif); + "attached to physical interface" + pif);
return ""; return "";
} }
@ -1934,7 +1941,7 @@ ServerResource {
for (InterfaceDef pluggedNic : pluggedNics) { for (InterfaceDef pluggedNic : pluggedNics) {
String pluggedVlanBr = pluggedNic.getBrName(); String pluggedVlanBr = pluggedNic.getBrName();
String pluggedVlanId = getVlanIdFromBridge(pluggedVlanBr); String pluggedVlanId = getBroadcastUriFromBridge(pluggedVlanBr);
if (pubVlan.equalsIgnoreCase(Vlan.UNTAGGED) if (pubVlan.equalsIgnoreCase(Vlan.UNTAGGED)
&& pluggedVlanBr.equalsIgnoreCase(_publicBridgeName)) { && pluggedVlanBr.equalsIgnoreCase(_publicBridgeName)) {
break; break;
@ -1975,25 +1982,25 @@ ServerResource {
conn = LibvirtConnection.getConnectionByVmName(routerName); conn = LibvirtConnection.getConnectionByVmName(routerName);
IpAddressTO[] ips = cmd.getIpAddresses(); IpAddressTO[] ips = cmd.getIpAddresses();
Integer devNum = 0; Integer devNum = 0;
Map<String, Integer> vlanToNicNum = new HashMap<String, Integer>(); Map<String, Integer> broadcastUriToNicNum = new HashMap<String, Integer>();
List<InterfaceDef> pluggedNics = getInterfaces(conn, routerName); List<InterfaceDef> pluggedNics = getInterfaces(conn, routerName);
for (InterfaceDef pluggedNic : pluggedNics) { for (InterfaceDef pluggedNic : pluggedNics) {
String pluggedVlan = pluggedNic.getBrName(); String pluggedVlan = pluggedNic.getBrName();
if (pluggedVlan.equalsIgnoreCase(_linkLocalBridgeName)) { if (pluggedVlan.equalsIgnoreCase(_linkLocalBridgeName)) {
vlanToNicNum.put("LinkLocal",devNum); broadcastUriToNicNum.put("LinkLocal", devNum);
} else if (pluggedVlan.equalsIgnoreCase(_publicBridgeName) } else if (pluggedVlan.equalsIgnoreCase(_publicBridgeName)
|| pluggedVlan.equalsIgnoreCase(_privBridgeName) || pluggedVlan.equalsIgnoreCase(_privBridgeName)
|| pluggedVlan.equalsIgnoreCase(_guestBridgeName)) { || pluggedVlan.equalsIgnoreCase(_guestBridgeName)) {
vlanToNicNum.put(Vlan.UNTAGGED,devNum); broadcastUriToNicNum.put(BroadcastDomainType.Vlan.toUri(Vlan.UNTAGGED).toString(), devNum);
} else { } else {
vlanToNicNum.put(getVlanIdFromBridge(pluggedVlan),devNum); broadcastUriToNicNum.put(getBroadcastUriFromBridge(pluggedVlan), devNum);
} }
devNum++; devNum++;
} }
for (IpAddressTO ip : ips) { for (IpAddressTO ip : ips) {
String nicName = "eth" + vlanToNicNum.get(ip.getBroadcastUri()); String nicName = "eth" + broadcastUriToNicNum.get(ip.getBroadcastUri());
String netmask = Long.toString(NetUtils.getCidrSize(ip.getVlanNetmask())); String netmask = Long.toString(NetUtils.getCidrSize(ip.getVlanNetmask()));
String subnet = NetUtils.getSubNet(ip.getPublicIp(), ip.getVlanNetmask()); String subnet = NetUtils.getSubNet(ip.getPublicIp(), ip.getVlanNetmask());
_virtRouterResource.assignVpcIpToRouter(routerIP, ip.isAdd(), ip.getPublicIp(), _virtRouterResource.assignVpcIpToRouter(routerIP, ip.isAdd(), ip.getPublicIp(),
@ -2021,19 +2028,19 @@ ServerResource {
try { try {
conn = LibvirtConnection.getConnectionByVmName(routerName); conn = LibvirtConnection.getConnectionByVmName(routerName);
List<InterfaceDef> nics = getInterfaces(conn, routerName); List<InterfaceDef> nics = getInterfaces(conn, routerName);
Map<String, Integer> vlanAllocatedToVM = new HashMap<String, Integer>(); Map<String, Integer> broadcastUriAllocatedToVM = new HashMap<String, Integer>();
Integer nicPos = 0; Integer nicPos = 0;
for (InterfaceDef nic : nics) { for (InterfaceDef nic : nics) {
if (nic.getBrName().equalsIgnoreCase(_linkLocalBridgeName)) { if (nic.getBrName().equalsIgnoreCase(_linkLocalBridgeName)) {
vlanAllocatedToVM.put("LinkLocal", nicPos); broadcastUriAllocatedToVM.put("LinkLocal", nicPos);
} else { } else {
if (nic.getBrName().equalsIgnoreCase(_publicBridgeName) if (nic.getBrName().equalsIgnoreCase(_publicBridgeName)
|| nic.getBrName().equalsIgnoreCase(_privBridgeName) || nic.getBrName().equalsIgnoreCase(_privBridgeName)
|| nic.getBrName().equalsIgnoreCase(_guestBridgeName)) { || nic.getBrName().equalsIgnoreCase(_guestBridgeName)) {
vlanAllocatedToVM.put(Vlan.UNTAGGED, nicPos); broadcastUriAllocatedToVM.put(BroadcastDomainType.Vlan.toUri(Vlan.UNTAGGED).toString(), nicPos);
} else { } else {
String vlanId = getVlanIdFromBridge(nic.getBrName()); String broadcastUri = getBroadcastUriFromBridge(nic.getBrName());
vlanAllocatedToVM.put(vlanId, nicPos); broadcastUriAllocatedToVM.put(broadcastUri, nicPos);
} }
} }
nicPos++; nicPos++;
@ -2044,14 +2051,14 @@ ServerResource {
int nicNum = 0; int nicNum = 0;
boolean newNic = false; boolean newNic = false;
for (IpAddressTO ip : ips) { for (IpAddressTO ip : ips) {
if (!vlanAllocatedToVM.containsKey(ip.getBroadcastUri())) { if (!broadcastUriAllocatedToVM.containsKey(ip.getBroadcastUri())) {
/* plug a vif into router */ /* plug a vif into router */
VifHotPlug(conn, routerName, ip.getBroadcastUri(), VifHotPlug(conn, routerName, ip.getBroadcastUri(),
ip.getVifMacAddress()); ip.getVifMacAddress());
vlanAllocatedToVM.put(ip.getBroadcastUri(), nicPos++); broadcastUriAllocatedToVM.put(ip.getBroadcastUri(), nicPos++);
newNic = true; newNic = true;
} }
nicNum = vlanAllocatedToVM.get(ip.getBroadcastUri()); nicNum = broadcastUriAllocatedToVM.get(ip.getBroadcastUri());
networkUsage(routerIp, "addVif", "eth" + nicNum); networkUsage(routerIp, "addVif", "eth" + nicNum);
result = _virtRouterResource.assignPublicIpAddress(routerName, result = _virtRouterResource.assignPublicIpAddress(routerName,
routerIp, ip.getPublicIp(), ip.isAdd(), ip.isFirstIP(), routerIp, ip.getPublicIp(), ip.isAdd(), ip.isFirstIP(),