mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 18:21:39 +01:00
[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@jp.fujitsu.com>
This commit is contained in:
1 parent
cf021d7e7d
commit
c98d70f46a
2 files changed
+38
No files matched your search
@@ -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:
|
||||
|
||||
@@ -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'])
|
||||
@@ -778,6 +783,9 @@ class XendDomainInfo:
|
||||
def getName(self):
|
||||
return self.info['name']
|
||||
|
||||
def getUuid(self):
|
||||
return self.info['uuid']
|
||||
|
||||
def getDomainPath(self):
|
||||
return self.dompath
|
||||
|
||||
@@ -1207,6 +1215,23 @@ class XendDomainInfo:
|
||||
(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):
|
||||
"""Construct the domain.
|
||||
|
||||
|
||||