# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID 800261a88275baa3f031aaeb9d847e1d2b20ebd3
# Parent a1c2cede77c78d2af99088d7dece8f74f2a27260
[XEND] Prevent uuid double use.
A check_uuid() in this patch checks on uuid of the
VM configuration definition. If specified uuid is
already used with the others VM, the xm create command
does not create the VM. The xm create command error occurs.
Signed-off-by: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx>
---
tools/python/xen/xend/XendDomain.py | 13 +++++++++++++
tools/python/xen/xend/XendDomainInfo.py | 25 +++++++++++++++++++++++++
2 files changed, 38 insertions(+)
diff -r a1c2cede77c7 -r 800261a88275 tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py Mon Jul 10 15:01:49 2006 +0100
+++ b/tools/python/xen/xend/XendDomain.py Mon Jul 10 15:10:00 2006 +0100
@@ -347,6 +347,19 @@ class XendDomain:
self.domains_lock.release()
+ def domain_lookup_by_uuid_nr(self, uuid):
+ self.domains_lock.acquire()
+ try:
+ matching = filter(lambda d: d.getUuid() == uuid,
+ self.domains.values())
+ n = len(matching)
+ if n == 1:
+ return matching[0]
+ return None
+ finally:
+ self.domains_lock.release()
+
+
def privilegedDomain(self):
self.domains_lock.acquire()
try:
diff -r a1c2cede77c7 -r 800261a88275 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Mon Jul 10 15:01:49 2006 +0100
+++ b/tools/python/xen/xend/XendDomainInfo.py Mon Jul 10 15:10:00 2006 +0100
@@ -396,6 +396,10 @@ def domain_by_name(name):
return XendDomain.instance().domain_lookup_by_name_nr(name)
+def domain_by_uuid(uuid):
+ return XendDomain.instance().domain_lookup_by_uuid_nr(uuid)
+
+
def shutdown_reason(code):
"""Get a shutdown reason from a code.
@@ -581,6 +585,7 @@ class XendDomainInfo:
defaultInfo('security', lambda: None)
self.check_name(self.info['name'])
+ self.check_uuid(self.info['uuid'])
if isinstance(self.info['image'], str):
self.info['image'] = sxp.from_string(self.info['image'])
@@ -777,6 +782,9 @@ class XendDomainInfo:
def getName(self):
return self.info['name']
+
+ def getUuid(self):
+ return self.info['uuid']
def getDomainPath(self):
return self.dompath
@@ -1205,6 +1213,23 @@ class XendDomainInfo:
if dominfo.domid != self.domid:
raise VmError("VM name '%s' is used in both domains %d and %d" %
(name, self.domid, dominfo.domid))
+
+
+ def check_uuid(self, uuid):
+ """The same uuid cannot be used for more than one vm at the same time.
+
+ @param uuid: uuid
+ @raise: VmError if same uuid is used
+ """
+ dominfo = domain_by_uuid(uuid)
+ if not dominfo:
+ return
+ if self.domid is None:
+ raise VmError("uuid '%s' already in use by domain %d" %
+ (uuid, dominfo.domid))
+ if dominfo.domid != self.domid:
+ raise VmError("uuid '%s' is used in both domains %d and %d" %
+ (uuid, self.domid, dominfo.domid))
def construct(self):
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|