aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorcl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>2005-06-17 14:20:55 +0000
committercl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>2005-06-17 14:20:55 +0000
commit99a2107ffafbf0a3d9f079ebd36ad051daa85857 (patch)
treec41021c6f9b0f182ff59596d143432b611a0c1c6 /tools
parent4ddc54b2db6264de8a8809d2a8763c5f4e3f4191 (diff)
downloadxen-99a2107ffafbf0a3d9f079ebd36ad051daa85857.tar.gz
xen-99a2107ffafbf0a3d9f079ebd36ad051daa85857.tar.bz2
xen-99a2107ffafbf0a3d9f079ebd36ad051daa85857.zip
bitkeeper revision 1.1713.3.6 (42b2dc47kgG53fAZb70R3lHX96n7dw)
xsobj.py: Handle attribute lookups for non-existing attributes. Use setAttr consistently. Fix access to data in convertFromDB. console.py: Cleanup whitespace. channel.py: Cleanup saveToDB. blkif.py: Save dev_handle in DB. image.py: Cleanup exportToDB. XendDomainInfo.py: Cleanup {save,export}toDB use. Cleanup whitespace. Change id type to be int. Output store_mfn in sxpr. Use id variable name consistently for domain id's. Add eventChannel comment. On restore, the uuid must be known. Signed-off-by: Mike Wray <mike.wray@hp.com> Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
Diffstat (limited to 'tools')
-rw-r--r--tools/python/xen/xend/XendDomainInfo.py77
-rw-r--r--tools/python/xen/xend/image.py4
-rwxr-xr-xtools/python/xen/xend/server/blkif.py1
-rwxr-xr-xtools/python/xen/xend/server/channel.py8
-rwxr-xr-xtools/python/xen/xend/server/console.py3
-rw-r--r--tools/python/xen/xend/xenstore/xsobj.py29
6 files changed, 64 insertions, 58 deletions
diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py
index 16415d78a7..f14756015f 100644
--- a/tools/python/xen/xend/XendDomainInfo.py
+++ b/tools/python/xen/xend/XendDomainInfo.py
@@ -157,7 +157,7 @@ class XendDomainInfo:
db = parentdb.addChild(uuid)
vm = cls(db)
vm.construct(config)
- vm.saveDB(sync=True)
+ vm.saveToDB(sync=True)
return vm
create = classmethod(create)
@@ -193,7 +193,7 @@ class XendDomainInfo:
recreate = classmethod(recreate)
- def restore(cls, parentdb, config, uuid=None):
+ def restore(cls, parentdb, config, uuid):
"""Create a domain and a VM object to do a restore.
@param parentdb: parent db
@@ -202,16 +202,20 @@ class XendDomainInfo:
"""
db = parentdb.addChild(uuid)
vm = cls(db)
- dom = xc.domain_create()
- vm.setdom(dom)
- vm.dom_construct(vm.id, config)
- vm.saveDB(sync=True)
+ id = xc.domain_create()
+ vm.setdom(id)
+ try:
+ vm.restore = True
+ vm.construct(config)
+ finally:
+ vm.restore = False
+ vm.exportToDB(save=True, sync=True)
return vm
restore = classmethod(restore)
__exports__ = [
- DBVar('id', ty='str'),
+ DBVar('id', ty='int'),
DBVar('name', ty='str'),
DBVar('uuid', ty='str'),
DBVar('config', ty='sxpr'),
@@ -267,14 +271,17 @@ class XendDomainInfo:
def setDB(self, db):
self.db = db
- def saveDB(self, save=False, sync=False):
+ def saveToDB(self, save=False, sync=False):
self.db.saveDB(save=save, sync=sync)
def exportToDB(self, save=False, sync=False):
if self.channel:
- self.channel.saveToDB(self.db.addChild("channel"))
+ self.channel.saveToDB(self.db.addChild("channel"), save=save)
if self.store_channel:
- self.store_channel.saveToDB(self.db.addChild("store_channel"))
+ self.store_channel.saveToDB(self.db.addChild("store_channel"),
+ save=save)
+ if self.image:
+ self.image.exportToDB(save=save, sync=sync)
self.db.exportToDB(self, fields=self.__exports__, save=save, sync=sync)
def importFromDB(self):
@@ -316,7 +323,7 @@ class XendDomainInfo:
self.state = state
self.state_updated.notifyAll()
self.state_updated.release()
- self.saveDB()
+ self.saveToDB()
def state_wait(self, state):
self.state_updated.acquire()
@@ -325,14 +332,14 @@ class XendDomainInfo:
self.state_updated.release()
def __str__(self):
- s = "domain"
+ s = "<domain"
s += " id=" + str(self.id)
s += " name=" + self.name
s += " memory=" + str(self.memory)
console = self.getConsole()
if console:
s += " console=" + str(console.console_port)
- s += ""
+ s += ">"
return s
__repr__ = __str__
@@ -422,15 +429,19 @@ class XendDomainInfo:
sxpr.append(self.channel.sxpr())
if self.store_channel:
sxpr.append(self.store_channel.sxpr())
+ if self.store_mfn:
+ sxpr.append(['store_mfn', self.store_mfn])
console = self.getConsole()
if console:
sxpr.append(console.sxpr())
+
if self.restart_count:
sxpr.append(['restart_count', self.restart_count])
if self.restart_state:
sxpr.append(['restart_state', self.restart_state])
if self.restart_time:
sxpr.append(['restart_time', str(self.restart_time)])
+
devs = self.sxpr_devices()
if devs:
sxpr.append(devs)
@@ -546,7 +557,7 @@ class XendDomainInfo:
"""
self.create_channel()
self.image.createImage()
- self.image.exportToDB()
+ self.exportToDB()
#if self.store_channel:
# self.db.introduceDomain(self.id,
# self.store_mfn,
@@ -558,7 +569,7 @@ class XendDomainInfo:
if self.dom_get(self.id):
return
self.id = None
- self.saveDB(sync=True)
+ self.saveToDB(sync=True)
try:
# Todo: eventually will have to wait for devices to signal
# destruction before can delete the db.
@@ -614,7 +625,7 @@ class XendDomainInfo:
"""
self.cleanup()
self.destroy_domain()
- self.saveDB()
+ self.saveToDB()
return 0
def is_terminated(self):
@@ -649,14 +660,13 @@ class XendDomainInfo:
cpu = int(sxp.child_value(self.config, 'cpu', '-1'))
except:
raise VmError('invalid cpu')
- dom = self.image.initDomain(self.id, self.memory, cpu, self.cpu_weight)
+ id = self.image.initDomain(self.id, self.memory, cpu, self.cpu_weight)
log.debug('init_domain> Created domain=%d name=%s memory=%d',
- dom, self.name, self.memory)
- if not self.restore:
- self.setdom(dom)
+ id, self.name, self.memory)
+ self.setdom(id)
def openChannel(self, key, local, remote):
- """Create a channel to the domain.
+ """Create a control channel to the domain.
If saved info is available recreate the channel.
@param key db key for the saved data (if any)
@@ -670,6 +680,11 @@ class XendDomainInfo:
return chan
def eventChannel(self, key):
+ """Create an event channel to the domain.
+ If saved info is available recreate the channel.
+
+ @param key db key for the saved data (if any)
+ """
db = self.db.addChild(key)
return EventChannel.restoreFromDB(db, 0, self.id)
@@ -832,11 +847,12 @@ class XendDomainInfo:
self.state = STATE_VM_OK
self.shutdown_pending = None
self.restart_check()
+ self.exportToDB()
self.restart_state = STATE_RESTART_BOOTING
if self.bootloader:
self.config = self.bootloader_config()
self.construct(self.config)
- self.saveDB()
+ self.saveToDB()
finally:
self.restart_state = None
@@ -910,23 +926,6 @@ class XendDomainInfo:
backend = blkif.getBackend(0)
backend.connect(recreate=self.recreate)
- def dom_construct(self, dom, config):
- """Construct a vm for an existing domain.
-
- @param dom: domain id
- @param config: domain configuration
- """
- d = dom_get(dom)
- if not d:
- raise VmError("Domain not found: %d" % dom)
- try:
- self.restore = True
- self.setdom(dom)
- self.memory = d['mem_kb']/1024
- self.construct(config)
- finally:
- self.restore = False
-
def configure_fields(self):
"""Process the vm configuration fields using the registered handlers.
"""
diff --git a/tools/python/xen/xend/image.py b/tools/python/xen/xend/image.py
index e0d70581bf..8d64472e98 100644
--- a/tools/python/xen/xend/image.py
+++ b/tools/python/xen/xend/image.py
@@ -96,8 +96,8 @@ class ImageHandler:
self.db = vm.db.addChild('/image')
self.config = config
- def exportToDB(self, save=False):
- self.db.exportToDB(self, fields=self.__exports__, save=save)
+ def exportToDB(self, save=False, sync=False):
+ self.db.exportToDB(self, fields=self.__exports__, save=save, sync=sync)
def importFromDB(self):
self.db.importFromDB(self, fields=self.__exports__)
diff --git a/tools/python/xen/xend/server/blkif.py b/tools/python/xen/xend/server/blkif.py
index 75a76e8bda..0b40c30bf3 100755
--- a/tools/python/xen/xend/server/blkif.py
+++ b/tools/python/xen/xend/server/blkif.py
@@ -167,6 +167,7 @@ class BlkDev(Dev):
DBVar('params', ty='str'),
DBVar('node', ty='str'),
DBVar('device', ty='long'),
+ DBVar('dev_handle', ty='long'),
DBVar('start_sector', ty='long'),
DBVar('nr_sectors', ty='long'),
]
diff --git a/tools/python/xen/xend/server/channel.py b/tools/python/xen/xend/server/channel.py
index 00f451a7b8..defe76f106 100755
--- a/tools/python/xen/xend/server/channel.py
+++ b/tools/python/xen/xend/server/channel.py
@@ -81,7 +81,7 @@ class EventChannel(dict):
evtchn_close(self.dom1, self.port1)
evtchn_close(self.dom2, self.port2)
- def saveToDB(self, db):
+ def saveToDB(self, db, save=False):
"""Save the event channel to the db so it can be restored later,
using restoreFromDB() on the class.
@@ -91,7 +91,7 @@ class EventChannel(dict):
db['dom2'] = str(self.dom2)
db['port1'] = str(self.port1)
db['port2'] = str(self.port2)
- db.saveDB()
+ db.saveDB(save=save)
def sxpr(self):
return ['event-channel',
@@ -339,7 +339,7 @@ class Channel:
# Make sure the port will deliver all the messages.
self.port.register(TYPE_WILDCARD)
- def saveToDB(self, db):
+ def saveToDB(self, db, save=False):
"""Save the channel ports to the db so the channel can be restored later,
using restoreFromDB() on the factory.
@@ -348,7 +348,7 @@ class Channel:
if self.closed: return
db['local_port'] = str(self.getLocalPort())
db['remote_port'] = str(self.getRemotePort())
- db.saveDB()
+ db.saveDB(save=save)
def getKey(self):
"""Get the channel key.
diff --git a/tools/python/xen/xend/server/console.py b/tools/python/xen/xend/server/console.py
index 743ace4aec..e0aa04a37a 100755
--- a/tools/python/xen/xend/server/console.py
+++ b/tools/python/xen/xend/server/console.py
@@ -214,7 +214,8 @@ class ConsoleDev(Dev, protocol.ServerFactory):
self.unix_listener = reactor.listenUNIX(path, self)
if xroot.get_xend_http_server():
interface = xroot.get_console_address()
- self.tcp_listener = reactor.listenTCP(self.console_port, self, interface=interface)
+ self.tcp_listener = reactor.listenTCP(
+ self.console_port, self, interface=interface)
finally:
self.lock.release()
diff --git a/tools/python/xen/xend/xenstore/xsobj.py b/tools/python/xen/xend/xenstore/xsobj.py
index b1c9a4f1d1..cdb35c1735 100644
--- a/tools/python/xen/xend/xenstore/xsobj.py
+++ b/tools/python/xen/xend/xenstore/xsobj.py
@@ -1,6 +1,8 @@
import string
import types
+from xen.xend.XendLogging import log
+
from xen.xend import sxp
from xsnode import XenNode
from xen.util.mac import macToString, macFromString
@@ -14,14 +16,19 @@ def hasAttr(obj, attr):
return hasattr(obj, attr)
def getAttr(obj, attr):
- if isinstance(obj, dict):
- return dict.get(attr)
- else:
- return getattr(obj, attr, None)
+ try:
+ if isinstance(obj, dict):
+ return obj.get(attr)
+ else:
+ return getattr(obj, attr, None)
+ except AttributeError:
+ return None
+ except LookupError:
+ return None
def setAttr(obj, attr, val):
if isinstance(obj, dict):
- dict[attr] = val
+ obj[attr] = val
else:
setattr(obj, attr, val)
@@ -53,8 +60,8 @@ class DBConverter:
convertToDB = classmethod(convertToDB)
- def convertFromDB(cls, val, ty=None):
- return cls.getConverter(ty).fromDB(val)
+ def convertFromDB(cls, data, ty=None):
+ return cls.getConverter(ty).fromDB(data.getData())
convertFromDB = classmethod(convertFromDB)
@@ -201,9 +208,8 @@ class DBVar:
setAttr(o, self.attr, val)
def getDB(self, db):
- try:
- data = getattr(db, self.path)
- except AttributeError:
+ data = getAttr(db, self.path)
+ if data is None:
return None
return DBConverter.convertFromDB(data, ty=self.ty)
@@ -214,8 +220,7 @@ class DBVar:
return
data = DBConverter.convertToDB(val, ty=self.ty)
#print 'DBVar>setDB>', self.path, 'data=', data
- setattr(db, self.path, data)
-
+ setAttr(db, self.path, data)
class DBMap(dict):
"""A persistent map. Extends dict with persistence.