[CalendarServer-changes] [870]
CalendarServer/branches/users/dreid/cluster
source_changes at macosforge.org
source_changes at macosforge.org
Wed Dec 20 13:06:22 PST 2006
Revision: 870
http://trac.macosforge.org/projects/calendarserver/changeset/870
Author: dreid at apple.com
Date: 2006-12-20 13:06:22 -0800 (Wed, 20 Dec 2006)
Log Message:
-----------
The simplest thing that could possibly work with regards to cluster support
Modified Paths:
--------------
CalendarServer/branches/users/dreid/cluster/conf/caldavd-test.plist
CalendarServer/branches/users/dreid/cluster/conf/caldavd.plist
CalendarServer/branches/users/dreid/cluster/run
CalendarServer/branches/users/dreid/cluster/twisted/plugins/caldav.py
CalendarServer/branches/users/dreid/cluster/twistedcaldav/config.py
CalendarServer/branches/users/dreid/cluster/twistedcaldav/tap.py
Added Paths:
-----------
CalendarServer/branches/users/dreid/cluster/twistedcaldav/cluster.py
Modified: CalendarServer/branches/users/dreid/cluster/conf/caldavd-test.plist
===================================================================
--- CalendarServer/branches/users/dreid/cluster/conf/caldavd-test.plist 2006-12-20 19:59:24 UTC (rev 869)
+++ CalendarServer/branches/users/dreid/cluster/conf/caldavd-test.plist 2006-12-20 21:06:22 UTC (rev 870)
@@ -166,5 +166,29 @@
<string>/principals/user/admin</string>
</array>
+ <key>ClusterEnable</key>
+ <false/>
+
+ <key>Cluster</key>
+ <dict>
+ <key>processes</key>
+ <integer>0</integer>
+
+ <key>scheduler</key>
+ <string>leastconns</string>
+
+ <key>admin</key>
+ <dict>
+ <key>username</key>
+ <string></string>
+
+ <key>password</key>
+ <string></string>
+ </dict>
+
+ <key>pydirLocation</key>
+ <string>/usr/share/caldavd/bin/pydir++.py</string>
+
+ </dict>
</dict>
</plist>
Modified: CalendarServer/branches/users/dreid/cluster/conf/caldavd.plist
===================================================================
--- CalendarServer/branches/users/dreid/cluster/conf/caldavd.plist 2006-12-20 19:59:24 UTC (rev 869)
+++ CalendarServer/branches/users/dreid/cluster/conf/caldavd.plist 2006-12-20 21:06:22 UTC (rev 870)
@@ -112,5 +112,28 @@
<string>/principals/user/admin</string>
</array>
+ <key>ClusterEnable</key>
+ <false/>
+
+ <key>Cluster</key>
+ <dict>
+ <key>processes</key>
+ <integer>0</integer>
+
+ <key>scheduler</key>
+ <string>leastconns</string>
+
+ <key>admin</key>
+ <dict>
+ <key>username</key>
+ <string></string>
+
+ <key>password</key>
+ <string></string>
+ </dict>
+
+ <key>pydirLocation</key>
+ <string>/usr/share/caldavd/bin/pydir++.py</string>
+ </dict>
</dict>
</plist>
Modified: CalendarServer/branches/users/dreid/cluster/run
===================================================================
--- CalendarServer/branches/users/dreid/cluster/run 2006-12-20 19:59:24 UTC (rev 869)
+++ CalendarServer/branches/users/dreid/cluster/run 2006-12-20 21:06:22 UTC (rev 870)
@@ -527,6 +527,20 @@
fi;
#
+# PyDirector
+#
+
+if ! py_have_module pydirector; then
+ pydirector="${top}/pydirector-1.0.0";
+
+ www_get "PyDirector" "${pydirector}" http://easynews.dl.sourceforge.net/sourceforge/pythondirector/pydirector-1.0.0.tar.gz;
+ py_build "PyDirector" "${pydirector}" false;
+ py_install "PyDirector" "${pydirector}";
+
+ export PYTHONPATH="${PYTHONPATH}:${pydirector}/build/${py_platform_libdir}";
+fi;
+
+#
# TwistedCalDAV
#
Modified: CalendarServer/branches/users/dreid/cluster/twisted/plugins/caldav.py
===================================================================
--- CalendarServer/branches/users/dreid/cluster/twisted/plugins/caldav.py 2006-12-20 19:59:24 UTC (rev 869)
+++ CalendarServer/branches/users/dreid/cluster/twisted/plugins/caldav.py 2006-12-20 21:06:22 UTC (rev 870)
@@ -1,3 +1,5 @@
from twistedcaldav.tap import CaldavServiceMaker
+from twistedcaldav.cluster import ClusterServiceMaker
TwistedCalDAV = CaldavServiceMaker()
+TwistedCalDAVCluster = ClusterServiceMaker()
Added: CalendarServer/branches/users/dreid/cluster/twistedcaldav/cluster.py
===================================================================
--- CalendarServer/branches/users/dreid/cluster/twistedcaldav/cluster.py (rev 0)
+++ CalendarServer/branches/users/dreid/cluster/twistedcaldav/cluster.py 2006-12-20 21:06:22 UTC (rev 870)
@@ -0,0 +1,152 @@
+import os
+import tempfile
+import socket
+
+from twisted.runner import procmon
+
+from twisted.python import usage
+
+from twistedcaldav.config import config
+from twistedcaldav.tap import CaldavOptions, CaldavServiceMaker
+
+serviceTemplate = """
+ <service name="%(name)s">
+ <listen ip="127.0.0.1:%(port)s" />
+ <group name="main" scheduler="%(scheduler)s">
+ %(hosts)s
+ </group>
+ <enable group="main" />
+ </service>
+"""
+
+configTemplate = """
+<pdconfig>
+ %(services)s
+ <admin listen="localhost:7001">
+ <user name="%(username)s" password="%(password)s" access="full"/>
+ </admin>
+ <logging file="pydir.log"/>
+</pdconfig>
+"""
+
+hostTemplate = '<host name="%(name)s" ip="127.0.0.1:%(port)s" />'
+
+twistdTemplate = ('%(twistd)s caldav -f %(configFile)s '
+ '-o Port=%(port)s -o SSLPort=%(sslPort)s')
+
+class TwistdSlaveProcess(object):
+ prefix = "caldav"
+
+ def __init__(self, twistdLocation, configFile, port, sslPort):
+ self.twistd = twistdLocation
+
+ self.configFile = configFile
+
+ self.port = port
+ self.sslPort = sslPort
+
+ self.pidFile = os.path.join(
+ os.path.dirname(config.PIDFile),
+ '%s.pid' % (self.getName(),))
+
+ def getName(self):
+ return '%s-%s' % (self.prefix, self.port)
+
+ def getSSLName(self):
+ return '%s-%s' % (self.prefix, self.sslPort)
+
+ def getCommandLine(self):
+ return [self.twistd, '-n', 'caldav',
+ '-f', self.configFile,
+ '-o', 'Port=%s' % (self.port,),
+ '-o', 'SSLPort=%s' % (self.sslPort,),
+ '-o', 'PIDFile=%s' % (self.pidFile,)]
+
+ def getHostLine(self, ssl=None):
+ name = self.getName()
+ port = self.port
+ if ssl:
+ name = self.getSSLName()
+ port = self.sslPort
+
+ return hostTemplate % {'name': name,
+ 'port': port}
+
+
+class ClusterServiceMaker(CaldavServiceMaker):
+ tapname = "caldavcluster"
+
+ description = "A cluster of Calendar Servers"
+
+ def makeService(self, options):
+ _twistdTemplate = twistdTemplate % {
+ 'twistd': config.twistdLocation,
+ 'configFile': options['config'],
+ 'port': '%(port)s',
+ 'sslPort': '%(sslPort)s',
+ }
+
+ if not config.ClusterEnable:
+ raise usage.UsageError(
+ ("Clustering is not enabled in the config "
+ "file, use -o ClusterEnable=True to "
+ "override, or use --degrade"))
+
+ service = procmon.ProcessMonitor()
+
+ hosts = []
+ sslHosts = []
+
+ port = config.Port
+ sslport = config.SSLPort
+
+ for p in xrange(0, config.Cluster['processes']):
+ port += 1
+ sslport += 1
+
+ process = TwistdSlaveProcess(config.twistdLocation,
+ options['config'],
+ port, sslport)
+
+ service.addProcess(process.getName(),
+ process.getCommandLine(),
+ uid=options.parent['uid'],
+ gid=options.parent['gid'])
+
+ hosts.append(process.getHostLine())
+
+ if config.SSLEnable:
+ sslHosts.append(process.getHostLine(ssl=True))
+
+ services = []
+
+ services.append(serviceTemplate % {
+ 'name': 'http',
+ 'port': config.Port,
+ 'scheduler': config.Cluster['scheduler'],
+ 'hosts': '\n'.join(hosts)
+ })
+
+
+ if config.SSLEnable:
+ services.append(serviceTemplate % {
+ 'name': 'https',
+ 'port': config.SSLPort,
+ 'scheduler': config.Cluster['scheduler'],
+ 'hosts': '\n'.join(sslHosts),
+ })
+
+ pdconfig = configTemplate % {
+ 'services': '\n'.join(services),
+ 'username': config.Cluster['admin']['username'],
+ 'password': config.Cluster['admin']['password'],
+ }
+
+ fd, fname = tempfile.mkstemp(prefix='pydir')
+ os.write(fd, pdconfig)
+ os.close(fd)
+
+ service.addProcess('pydir', [config.Cluster['pydirLocation'],
+ fname])
+
+ return service
Modified: CalendarServer/branches/users/dreid/cluster/twistedcaldav/config.py
===================================================================
--- CalendarServer/branches/users/dreid/cluster/twistedcaldav/config.py 2006-12-20 19:59:24 UTC (rev 869)
+++ CalendarServer/branches/users/dreid/cluster/twistedcaldav/config.py 2006-12-20 21:06:22 UTC (rev 870)
@@ -48,8 +48,18 @@
'twistdLocation': '/usr/share/caldavd/bin/twistd',
'SACLEnable': False,
'AuthSchemes': ['Basic'],
- 'AdminPrincipals': ['/principals/user/admin']
-}
+ 'AdminPrincipals': ['/principals/user/admin'],
+ 'ClusterEnable': Trueb,
+ 'Cluster': {
+ 'processes': 10,
+ 'scheduler': 'leastconns',
+ 'admin': {
+ 'username': None,
+ 'password': None,
+ },
+ 'pydirLocation': '/usr/share/caldavd/bin/pydir++.py',
+ },
+ }
class Config (object):
def __init__(self, defaults):
Modified: CalendarServer/branches/users/dreid/cluster/twistedcaldav/tap.py
===================================================================
--- CalendarServer/branches/users/dreid/cluster/twistedcaldav/tap.py 2006-12-20 19:59:24 UTC (rev 869)
+++ CalendarServer/branches/users/dreid/cluster/twistedcaldav/tap.py 2006-12-20 21:06:22 UTC (rev 870)
@@ -80,7 +80,7 @@
elif isinstance(defaultConfig[key], (int, float, long)):
value = type(defaultConfig[key])(value)
- elif isinstance(defaultConfig[key], (list, tuples)):
+ elif isinstance(defaultConfig[key], (list, tuple)):
value = value.split(',')
elif isinstance(defaultConfig[key], dict):
@@ -104,6 +104,7 @@
self.parent['logfile'] = config.ErrorLogFile
self.parent['pidfile'] = config.PIDFile
+
class CaldavServiceMaker(object):
implements(IPlugin, service.IServiceMaker)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20061220/1ffd4845/attachment.html
More information about the calendarserver-changes
mailing list