mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
merge with xen-unstable.hg
This commit is contained in:
commit
9d64d3ff83
17 files changed
+306
-93
No files matched your search
@@ -1709,8 +1709,10 @@ class XendDomainInfo:
|
||||
|
||||
dom = XendDomain.instance().domain_lookup_nr(name)
|
||||
if dom and dom.info['uuid'] != self.info['uuid']:
|
||||
raise VmError("VM name '%s' already exists as domain %s" %
|
||||
(name, str(dom.domid)))
|
||||
raise VmError("VM name '%s' already exists%s" %
|
||||
(name,
|
||||
dom.domid is not None and
|
||||
("as domain %s" % str(dom.domid)) or ""))
|
||||
|
||||
|
||||
def update(self, info = None, refresh = True):
|
||||
|
||||
@@ -60,6 +60,14 @@ class Daemon:
|
||||
return running
|
||||
|
||||
|
||||
def reloadConfig(self):
|
||||
"""
|
||||
"""
|
||||
pid = read_pid(XEND_PID_FILE)
|
||||
if find_process(pid, XEND_PROCESS_NAME):
|
||||
os.kill(pid, signal.SIGHUP)
|
||||
|
||||
|
||||
def status(self):
|
||||
"""Returns the status of the xend daemon.
|
||||
The return value is defined by the LSB:
|
||||
|
||||
@@ -65,6 +65,7 @@ class XendServers:
|
||||
def __init__(self):
|
||||
self.servers = []
|
||||
self.cleaningUp = False
|
||||
self.reloadingConfig = False
|
||||
|
||||
def add(self, server):
|
||||
self.servers.append(server)
|
||||
@@ -78,6 +79,11 @@ class XendServers:
|
||||
except:
|
||||
pass
|
||||
|
||||
def reloadConfig(self, signum = 0, frame = None):
|
||||
log.debug("SrvServer.reloadConfig()")
|
||||
self.reloadingConfig = True
|
||||
self.cleanup(signum, frame)
|
||||
|
||||
def start(self, status):
|
||||
# Running the network script will spawn another process, which takes
|
||||
# the status fd with it unless we set FD_CLOEXEC. Failing to do this
|
||||
@@ -86,61 +92,80 @@ class XendServers:
|
||||
fcntl.fcntl(status, fcntl.F_SETFD, fcntl.FD_CLOEXEC)
|
||||
|
||||
Vifctl.network('start')
|
||||
threads = []
|
||||
for server in self.servers:
|
||||
thread = Thread(target=server.run, name=server.__class__.__name__)
|
||||
if isinstance(server, HttpServer):
|
||||
thread.setDaemon(True)
|
||||
thread.start()
|
||||
threads.append(thread)
|
||||
|
||||
|
||||
# check for when all threads have initialized themselves and then
|
||||
# close the status pipe
|
||||
|
||||
threads_left = True
|
||||
while threads_left:
|
||||
threads_left = False
|
||||
|
||||
for server in self.servers:
|
||||
if not server.ready:
|
||||
threads_left = True
|
||||
break
|
||||
|
||||
if threads_left:
|
||||
time.sleep(.5)
|
||||
|
||||
if status:
|
||||
status.write('0')
|
||||
status.close()
|
||||
|
||||
# Prepare to catch SIGTERM (received when 'xend stop' is executed)
|
||||
# and call each server's cleanup if possible
|
||||
signal.signal(signal.SIGTERM, self.cleanup)
|
||||
signal.signal(signal.SIGHUP, self.reloadConfig)
|
||||
|
||||
# Interruptible Thread.join - Python Bug #1167930
|
||||
# Replaces: for t in threads: t.join()
|
||||
# Reason: The above will cause python signal handlers to be
|
||||
# blocked so we're not able to catch SIGTERM in any
|
||||
# way for cleanup
|
||||
runningThreads = threads
|
||||
while len(runningThreads) > 0:
|
||||
try:
|
||||
for t in threads:
|
||||
t.join(1.0)
|
||||
runningThreads = [t for t in threads
|
||||
if t.isAlive() and not t.isDaemon()]
|
||||
if self.cleaningUp and len(runningThreads) > 0:
|
||||
log.debug("Waiting for %s." %
|
||||
[x.getName() for x in runningThreads])
|
||||
except:
|
||||
pass
|
||||
while True:
|
||||
threads = []
|
||||
for server in self.servers:
|
||||
thread = Thread(target=server.run, name=server.__class__.__name__)
|
||||
if isinstance(server, HttpServer):
|
||||
thread.setDaemon(True)
|
||||
thread.start()
|
||||
threads.append(thread)
|
||||
|
||||
|
||||
def create():
|
||||
root = SrvDir()
|
||||
root.putChild('xend', SrvRoot())
|
||||
servers = XendServers()
|
||||
# check for when all threads have initialized themselves and then
|
||||
# close the status pipe
|
||||
|
||||
retryCount = 0
|
||||
threads_left = True
|
||||
while threads_left:
|
||||
threads_left = False
|
||||
|
||||
for server in self.servers:
|
||||
if not server.ready:
|
||||
threads_left = True
|
||||
break
|
||||
|
||||
if threads_left:
|
||||
time.sleep(.5)
|
||||
retryCount += 1
|
||||
if retryCount > 60:
|
||||
for server in self.servers:
|
||||
if not server.ready:
|
||||
log.error("Server " +
|
||||
server.__class__.__name__ +
|
||||
" did not initialise!")
|
||||
break
|
||||
|
||||
if status:
|
||||
status.write('0')
|
||||
status.close()
|
||||
status = None
|
||||
|
||||
# Interruptible Thread.join - Python Bug #1167930
|
||||
# Replaces: for t in threads: t.join()
|
||||
# Reason: The above will cause python signal handlers to be
|
||||
# blocked so we're not able to catch SIGTERM in any
|
||||
# way for cleanup
|
||||
runningThreads = threads
|
||||
while len(runningThreads) > 0:
|
||||
try:
|
||||
for t in threads:
|
||||
t.join(1.0)
|
||||
runningThreads = [t for t in threads
|
||||
if t.isAlive() and not t.isDaemon()]
|
||||
if self.cleaningUp and len(runningThreads) > 0:
|
||||
log.debug("Waiting for %s." %
|
||||
[x.getName() for x in runningThreads])
|
||||
except:
|
||||
pass
|
||||
|
||||
if self.reloadingConfig:
|
||||
log.info("Restarting all servers...")
|
||||
self.cleaningUp = False
|
||||
self.reloadingConfig = False
|
||||
xroot.set_config()
|
||||
self.servers = []
|
||||
_loadConfig(self)
|
||||
else:
|
||||
break
|
||||
|
||||
def _loadConfig(servers):
|
||||
if xroot.get_xend_http_server():
|
||||
servers.add(HttpServer(root,
|
||||
xroot.get_xend_address(),
|
||||
@@ -188,4 +213,11 @@ def create():
|
||||
|
||||
if xroot.get_xend_unix_xmlrpc_server():
|
||||
servers.add(XMLRPCServer(XendAPI.AUTH_PAM))
|
||||
|
||||
|
||||
def create():
|
||||
root = SrvDir()
|
||||
root.putChild('xend', SrvRoot())
|
||||
servers = XendServers()
|
||||
_loadConfig(servers)
|
||||
return servers
|
||||
@@ -16,6 +16,8 @@
|
||||
# Copyright (C) 2006 XenSource Ltd.
|
||||
#============================================================================
|
||||
|
||||
import errno
|
||||
import socket
|
||||
import types
|
||||
import xmlrpclib
|
||||
from xen.util.xmlrpclib2 import UnixXMLRPCServer, TCPXMLRPCServer
|
||||
@@ -105,20 +107,25 @@ class XMLRPCServer:
|
||||
"; authentication has been disabled for this server." or
|
||||
".")
|
||||
|
||||
if self.use_tcp:
|
||||
log.info("Opening TCP XML-RPC server on %s%d%s",
|
||||
self.host and '%s:' % self.host or
|
||||
'all interfaces, port ',
|
||||
self.port, authmsg)
|
||||
self.server = TCPXMLRPCServer((self.host, self.port),
|
||||
self.hosts_allowed,
|
||||
logRequests = False)
|
||||
else:
|
||||
log.info("Opening Unix domain socket XML-RPC server on %s%s",
|
||||
self.path, authmsg)
|
||||
self.server = UnixXMLRPCServer(self.path, self.hosts_allowed,
|
||||
logRequests = False)
|
||||
|
||||
try:
|
||||
if self.use_tcp:
|
||||
log.info("Opening TCP XML-RPC server on %s%d%s",
|
||||
self.host and '%s:' % self.host or
|
||||
'all interfaces, port ',
|
||||
self.port, authmsg)
|
||||
self.server = TCPXMLRPCServer((self.host, self.port),
|
||||
self.hosts_allowed,
|
||||
logRequests = False)
|
||||
else:
|
||||
log.info("Opening Unix domain socket XML-RPC server on %s%s",
|
||||
self.path, authmsg)
|
||||
self.server = UnixXMLRPCServer(self.path, self.hosts_allowed,
|
||||
logRequests = False)
|
||||
except socket.error, exn:
|
||||
log.error('Cannot start server: %s!', exn.args[1])
|
||||
ready = True
|
||||
running = False
|
||||
return
|
||||
|
||||
# Register Xen API Functions
|
||||
# -------------------------------------------------------------------
|
||||
@@ -177,6 +184,11 @@ class XMLRPCServer:
|
||||
|
||||
def cleanup(self):
|
||||
log.debug("XMLRPCServer.cleanup()")
|
||||
try:
|
||||
self.server.socket.close()
|
||||
except Exception, exn:
|
||||
log.exception(exn)
|
||||
pass
|
||||
|
||||
def shutdown(self):
|
||||
self.running = False
|
||||
|
||||