merge with xen-unstable.hg

This commit is contained in:
awilliam@xenbuild.aw committed 2006-12-05 10:01:15 -07:00
commit 9d64d3ff83
17 files changed
+306 -93

No files matched your search

+4 -2
View File
@@ -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:
+80 -48
View File
@@ -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
+26 -14
View File
@@ -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
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.