CLOUDSTACK-8765: fix vm migration failure due to different dev name on KVM

This commit is contained in:
Wei Zhou 2015-08-24 14:28:13 +02:00
parent 82df5b156b
commit bb8f7c652e

View File

@ -16,6 +16,7 @@
# specific language governing permissions and limitations # specific language governing permissions and limitations
# under the License. # under the License.
import sys import sys
import re
from xml.dom.minidom import parse from xml.dom.minidom import parse
from cloudutils.configFileOps import configFileOps from cloudutils.configFileOps import configFileOps
from cloudutils.networkConfig import networkConfig from cloudutils.networkConfig import networkConfig
@ -24,21 +25,29 @@ def isOldStyleBridge(brName):
return True return True
else: else:
return False return False
def isNewStyleBridge(brName):
if re.match(r"br(\w+)-(\d+)", brName) == None:
return False
else:
return True
def getGuestNetworkDevice(): def getGuestNetworkDevice():
netlib = networkConfig() netlib = networkConfig()
cfo = configFileOps("/etc/cloudstack/agent/agent.properties") cfo = configFileOps("/etc/cloudstack/agent/agent.properties")
guestDev = cfo.getEntry("guest.network.device") guestDev = cfo.getEntry("guest.network.device")
enslavedDev = netlib.getEnslavedDev(guestDev, 1) enslavedDev = netlib.getEnslavedDev(guestDev, 1)
return enslavedDev return enslavedDev.split(".")[0]
def handleMigrateBegin(): def handleMigrateBegin():
try: try:
domain = parse(sys.stdin) domain = parse(sys.stdin)
for interface in domain.getElementsByTagName("interface"): for interface in domain.getElementsByTagName("interface"):
source = interface.getElementsByTagName("source")[0] source = interface.getElementsByTagName("source")[0]
bridge = source.getAttribute("bridge") bridge = source.getAttribute("bridge")
if not isOldStyleBridge(bridge): if isOldStyleBridge(bridge):
vlanId = bridge.replace("cloudVirBr","")
elif isNewStyleBridge(bridge):
vlanId = re.sub(r"br(\w+)-","",bridge)
else:
continue continue
vlanId = bridge.replace("cloudVirBr","")
phyDev = getGuestNetworkDevice() phyDev = getGuestNetworkDevice()
newBrName="br" + phyDev + "-" + vlanId newBrName="br" + phyDev + "-" + vlanId
source.setAttribute("bridge", newBrName) source.setAttribute("bridge", newBrName)