mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 18:21:39 +01:00
There were a couple of small bugs in the xapi xm-test: o outdated XenAPI calls were removed from testcase (02_xapi-vbd_basic) o minor problem with XendLocalStorageRepository is fixed (missed list_images() function - which is moved from the XenQCoWStroageRepo to the common base class XendStorageRepository) which was detected running 02_xapi-vbd_basic. o XenAPI session handling and connecting is fixed. o 03_xapi-network_pos was rewritten and now uses XenAPI. Signed-off-by: Andreas Florath <xen@flonatel.org>
276 lines
8.7 KiB
Python
276 lines
8.7 KiB
Python
#!/usr/bin/python
|
|
"""
|
|
Copyright (C) International Business Machines Corp., 2005, 2006
|
|
Authors: Dan Smith <danms@us.ibm.com>
|
|
Daniel Stekloff <dsteklof@us.ibm.com>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; under version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
"""
|
|
|
|
import sys
|
|
import commands
|
|
import os
|
|
import re
|
|
import time
|
|
|
|
from Xm import *
|
|
from Test import *
|
|
from config import *
|
|
from XenDomain import *
|
|
from NetConfig import *
|
|
from XmTestLib import *
|
|
from __init__ import *
|
|
|
|
class XenNetDevCmd:
|
|
|
|
def __init__(self, netDevice, addCmd, removeCmd):
|
|
"""Object representing a network device command"""
|
|
self.addcmd = addCmd
|
|
self.removecmd = removeCmd
|
|
self.addhasrun = False
|
|
self.rmvhasrun = False
|
|
self.netdevice = netDevice
|
|
|
|
def getAddCmd(self):
|
|
return self.addcmd
|
|
|
|
def getRemoveCmd(self):
|
|
return self.removecmd
|
|
|
|
def hasAddRun(self):
|
|
return self.addhasrun
|
|
|
|
def hasRemoveRun(self):
|
|
self.rmvhasrun
|
|
|
|
def runAddCmd(self, runOnDom0=False):
|
|
# Defaults running command on dom0, if console then will run there
|
|
if runOnDom0 == False:
|
|
dom = self.netdevice.getDomain()
|
|
console = dom.getConsole()
|
|
console.runCmd(self.addcmd)
|
|
else:
|
|
status, output = traceCommand(self.addcmd)
|
|
if status:
|
|
raise NetworkError("Device add cmd failed: %s Status: %d"
|
|
% (self.addcmd, status))
|
|
self.addhasrun = True
|
|
|
|
def runRemoveCmd(self, runOnDom0=False):
|
|
# Defaults running command on dom0, if console then will run there
|
|
if runOnDom0 == False:
|
|
dom = self.netdevice.getDomain()
|
|
console = dom.getConsole()
|
|
console.runCmd(self.removecmd)
|
|
else:
|
|
status, output = traceCommand(self.removecmd)
|
|
if status:
|
|
raise NetworkError("Device remove cmd failed: %s Status: %d"
|
|
% (self.removecmd, status))
|
|
self.removehasrun = True
|
|
|
|
class XenDevice:
|
|
|
|
def __init__(self, domain, id, devConfig=None):
|
|
"""An object to represent Xen Devices like network and block
|
|
@param domain: Domain the device will be added to
|
|
@param id: Device identifier
|
|
@param devConfig: Initial configuration dictionary for XenDevice
|
|
"""
|
|
if config:
|
|
self.config = devConfig
|
|
else:
|
|
self.config = {}
|
|
|
|
self.id = id
|
|
self.domain = domain
|
|
self.configNode = None
|
|
# Commands run when domain is started or devices added and removed.
|
|
self.dom0_cmds = []
|
|
self.domU_cmds = []
|
|
|
|
def __str__(self):
|
|
"""Convert device config to XenConfig node compatible string"""
|
|
confstr = ''
|
|
for k, v in self.config.items():
|
|
if len(confstr) > 0:
|
|
confstr += ', '
|
|
if isinstance(v, int):
|
|
confstr += "%s=%i" % (k, v)
|
|
elif isinstance(v, list) and v:
|
|
confstr += "%s=%s" % (k, v)
|
|
elif isinstance(v, str) and v:
|
|
confstr += "%s=%s" % (k, v)
|
|
|
|
return confstr
|
|
|
|
def execAddCmds(self):
|
|
# Cmds for when a device is added to the system
|
|
if len(self.dom0_cmds) > 0:
|
|
for i in range(0, len(self.dom0_cmds)):
|
|
if self.dom0_cmds[i].getAddCmd():
|
|
self.dom0_cmds[i].runAddCmd(runOnDom0=True)
|
|
|
|
if len(self.domU_cmds) > 0:
|
|
for i in range(0, len(self.domU_cmds)):
|
|
if self.domU_cmds[i].getAddCmd():
|
|
self.domU_cmds[i].runAddCmd()
|
|
|
|
def execRemoveCmds(self):
|
|
# Cmds for when a device is removed from the system
|
|
if len(self.dom0_cmds) > 0:
|
|
for i in range(0, len(self.dom0_cmds)):
|
|
if (self.dom0_cmds[i].getRemoveCmd()
|
|
and self.dom0_cmds[i].hasAddRun() == True):
|
|
self.dom0_cmds[i].runRemoveCmd(runOnDom0=True)
|
|
|
|
if len(self.domU_cmds) > 0:
|
|
for i in range(0, len(self.domU_cmds)):
|
|
if (self.domU_cmds[i].getRemoveCmd()
|
|
and self.domU_cmds[i].hasAddRun() == True):
|
|
self.domU_cmds[i].runRemoveCmd()
|
|
|
|
def removeDevice(self):
|
|
self.execRemoveCmds()
|
|
|
|
def getId(self):
|
|
return self.id
|
|
|
|
def getConfigOpt(self):
|
|
return self.configNode
|
|
|
|
def getDomain(self):
|
|
return self.domain
|
|
|
|
class XenNetDevice(XenDevice):
|
|
|
|
def __init__(self, domain, id, devConfig=None):
|
|
"""An object to represent Xen Network Device
|
|
@param domain: Domain the device is being added to
|
|
@param id: Network device identifier, interface name like eth0
|
|
@param devConfig: Initial dictionary configuration for XenNetDevice
|
|
"""
|
|
if devConfig:
|
|
self.config = devConfig
|
|
else:
|
|
self.config = {}
|
|
|
|
self.id = id
|
|
self.domain = domain
|
|
self.configNode = "vif"
|
|
self.dom0_cmds = []
|
|
self.domU_cmds = []
|
|
self.network = None
|
|
self.netmask = None
|
|
self.ip = None
|
|
self.dom0_alias_ip = None
|
|
|
|
if domain.getDomainType() == "HVM":
|
|
self.config["type"] = "ioemu"
|
|
if not self.config.has_key('bridge'):
|
|
self.config["bridge"] = "xenbr0"
|
|
|
|
if self.config.has_key("ip"):
|
|
self.setNetDevIP(ip=self.config["ip"])
|
|
else:
|
|
if NETWORK_IP_RANGE != "dhcp":
|
|
self.setNetDevIP()
|
|
|
|
def __del__(self):
|
|
# Make sure we clean up NetConfig's list of ips, so the ip can be
|
|
# reused
|
|
self.releaseNetDevIP()
|
|
|
|
def addIfconfigCmd(self, domU=True):
|
|
# Method to add start and remove ifconfig functions
|
|
if domU == True:
|
|
locmd = XenNetDevCmd(self, addCmd="ifconfig lo 127.0.0.1", removeCmd=None)
|
|
ifcmd = []
|
|
|
|
|
|
# Start or Add cmd
|
|
acmd = 'ifconfig %s inet %s netmask %s up' % (self.id, self.ip, self.netmask)
|
|
rcmd = 'ifconfig %s down' % self.id
|
|
ifcmd = XenNetDevCmd(self, addCmd=acmd, removeCmd=rcmd)
|
|
|
|
if domU == True:
|
|
self.domU_cmds.append(locmd)
|
|
self.domU_cmds.append(ifcmd)
|
|
else:
|
|
self.dom0_cmds.append(ifcmd)
|
|
|
|
def removeDevice(self):
|
|
self.releaseNetDevIP()
|
|
|
|
def addDom0AliasCmd(self, dev=DOM0_INTF):
|
|
# Method to add start and remove dom0 alias cmds
|
|
acmd = 'ip addr add %s dev %s' % (self.dom0_alias_ip, dev)
|
|
rcmd = 'ip addr del %s/32 dev %s' % (self.dom0_alias_ip, dev)
|
|
aliascmd = XenNetDevCmd(self, addCmd=acmd, removeCmd=rcmd)
|
|
|
|
self.dom0_cmds.append(aliascmd)
|
|
|
|
def releaseNetDevIP(self):
|
|
# Must remove start cmds for ip configuration and then release from
|
|
# NetConfig
|
|
self.execRemoveCmds()
|
|
self.dom0_cmds = []
|
|
self.domU_cmds = []
|
|
if self.config.has_key("ip"):
|
|
del self.config["ip"]
|
|
|
|
if self.dom0_alias_ip:
|
|
xmtest_netconf.releaseIP("domain0", self.domain.getName(), self.dom0_alias_ip)
|
|
xmtest_netconf.releaseIP(self.domain.getName(), self.id, self.ip)
|
|
|
|
def getNetDevIP(self):
|
|
return self.ip
|
|
|
|
def getDom0AliasIP(self):
|
|
return self.dom0_alias_ip
|
|
|
|
def getNetwork(self):
|
|
return self.network
|
|
|
|
def get_netmask(self):
|
|
return self.netmask
|
|
|
|
def setNetDevIP(self, ip=None):
|
|
# Function to set a new IP for NetDevice.
|
|
if NETWORK_IP_RANGE == "dhcp":
|
|
raise NetworkError("System configured for dhcp, cannot set new ip.")
|
|
|
|
if (self.ip and not ip) or ((self.ip and ip) and (self.ip != ip)):
|
|
self.releaseNetDevIP()
|
|
|
|
if not self.netmask:
|
|
self.netmask = xmtest_netconf.getNetMask()
|
|
|
|
if not self.network:
|
|
self.network = xmtest_netconf.getNetwork()
|
|
|
|
if ip:
|
|
xmtest_netconf.setIP(self.domain.getName(), self.id, ip)
|
|
self.ip = ip
|
|
else:
|
|
self.ip = xmtest_netconf.getIP(self.domain.getName(), self.id)
|
|
|
|
self.addIfconfigCmd()
|
|
self.config["ip"] = str(self.ip)
|
|
|
|
# Setup an alias for Dom0
|
|
self.dom0_alias_ip = xmtest_netconf.getIP("domain0", self.domain.getName())
|
|
self.addDom0AliasCmd()
|