From 494ccd821d711a2957531d1c33274ed293e4d925 Mon Sep 17 00:00:00 2001 From: ynojima Date: Wed, 6 Nov 2013 11:02:56 -0700 Subject: [PATCH] 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 Signed-off-by: Hugo Trippaers --- .../resource/LibvirtComputingResource.java | 47 +++++++++++-------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index a6593982abd..570eae60078 100755 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -51,6 +51,8 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import java.util.regex.Pattern; +import java.util.regex.Matcher; import javax.ejb.Local; import javax.naming.ConfigurationException; @@ -1656,14 +1658,19 @@ ServerResource { } } - private String getVlanIdFromBridge(String brName) { + private String getBroadcastUriFromBridge(String brName) { String pif= matchPifFileInDirectory(brName); - String[] pifparts = pif.split("\\."); - - if(pifparts.length == 2) { - return pifparts[1]; + Pattern pattern = Pattern.compile("(\\D+)(\\d+)"); + Matcher matcher = pattern.matcher(pif); + if(matcher.find()) { + if (brName.startsWith("brvx")){ + return BroadcastDomainType.Vxlan.toUri(matcher.group(2)).toString(); + } + else{ + return BroadcastDomainType.Vlan.toUri(matcher.group(2)).toString(); + } } 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); return ""; } @@ -1934,7 +1941,7 @@ ServerResource { for (InterfaceDef pluggedNic : pluggedNics) { String pluggedVlanBr = pluggedNic.getBrName(); - String pluggedVlanId = getVlanIdFromBridge(pluggedVlanBr); + String pluggedVlanId = getBroadcastUriFromBridge(pluggedVlanBr); if (pubVlan.equalsIgnoreCase(Vlan.UNTAGGED) && pluggedVlanBr.equalsIgnoreCase(_publicBridgeName)) { break; @@ -1975,25 +1982,25 @@ ServerResource { conn = LibvirtConnection.getConnectionByVmName(routerName); IpAddressTO[] ips = cmd.getIpAddresses(); Integer devNum = 0; - Map vlanToNicNum = new HashMap(); + Map broadcastUriToNicNum = new HashMap(); List pluggedNics = getInterfaces(conn, routerName); for (InterfaceDef pluggedNic : pluggedNics) { String pluggedVlan = pluggedNic.getBrName(); if (pluggedVlan.equalsIgnoreCase(_linkLocalBridgeName)) { - vlanToNicNum.put("LinkLocal",devNum); + broadcastUriToNicNum.put("LinkLocal", devNum); } else if (pluggedVlan.equalsIgnoreCase(_publicBridgeName) || pluggedVlan.equalsIgnoreCase(_privBridgeName) || pluggedVlan.equalsIgnoreCase(_guestBridgeName)) { - vlanToNicNum.put(Vlan.UNTAGGED,devNum); + broadcastUriToNicNum.put(BroadcastDomainType.Vlan.toUri(Vlan.UNTAGGED).toString(), devNum); } else { - vlanToNicNum.put(getVlanIdFromBridge(pluggedVlan),devNum); + broadcastUriToNicNum.put(getBroadcastUriFromBridge(pluggedVlan), devNum); } devNum++; } 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 subnet = NetUtils.getSubNet(ip.getPublicIp(), ip.getVlanNetmask()); _virtRouterResource.assignVpcIpToRouter(routerIP, ip.isAdd(), ip.getPublicIp(), @@ -2021,19 +2028,19 @@ ServerResource { try { conn = LibvirtConnection.getConnectionByVmName(routerName); List nics = getInterfaces(conn, routerName); - Map vlanAllocatedToVM = new HashMap(); + Map broadcastUriAllocatedToVM = new HashMap(); Integer nicPos = 0; for (InterfaceDef nic : nics) { if (nic.getBrName().equalsIgnoreCase(_linkLocalBridgeName)) { - vlanAllocatedToVM.put("LinkLocal", nicPos); + broadcastUriAllocatedToVM.put("LinkLocal", nicPos); } else { if (nic.getBrName().equalsIgnoreCase(_publicBridgeName) || nic.getBrName().equalsIgnoreCase(_privBridgeName) || nic.getBrName().equalsIgnoreCase(_guestBridgeName)) { - vlanAllocatedToVM.put(Vlan.UNTAGGED, nicPos); + broadcastUriAllocatedToVM.put(BroadcastDomainType.Vlan.toUri(Vlan.UNTAGGED).toString(), nicPos); } else { - String vlanId = getVlanIdFromBridge(nic.getBrName()); - vlanAllocatedToVM.put(vlanId, nicPos); + String broadcastUri = getBroadcastUriFromBridge(nic.getBrName()); + broadcastUriAllocatedToVM.put(broadcastUri, nicPos); } } nicPos++; @@ -2044,14 +2051,14 @@ ServerResource { int nicNum = 0; boolean newNic = false; for (IpAddressTO ip : ips) { - if (!vlanAllocatedToVM.containsKey(ip.getBroadcastUri())) { + if (!broadcastUriAllocatedToVM.containsKey(ip.getBroadcastUri())) { /* plug a vif into router */ VifHotPlug(conn, routerName, ip.getBroadcastUri(), ip.getVifMacAddress()); - vlanAllocatedToVM.put(ip.getBroadcastUri(), nicPos++); + broadcastUriAllocatedToVM.put(ip.getBroadcastUri(), nicPos++); newNic = true; } - nicNum = vlanAllocatedToVM.get(ip.getBroadcastUri()); + nicNum = broadcastUriAllocatedToVM.get(ip.getBroadcastUri()); networkUsage(routerIp, "addVif", "eth" + nicNum); result = _virtRouterResource.assignPublicIpAddress(routerName, routerIp, ip.getPublicIp(), ip.isAdd(), ip.isFirstIP(),