[CalendarServer-changes] [9300] CalendarServer/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Fri May 25 06:22:21 PDT 2012
Revision: 9300
http://trac.macosforge.org/projects/calendarserver/changeset/9300
Author: cdaboo at apple.com
Date: 2012-05-25 06:22:21 -0700 (Fri, 25 May 2012)
Log Message:
-----------
Sim now follows redirect on .well-known and allows for a principal path to be specified to enable it to work
with other servers. PYTHONPATH now set in sim script.
Modified Paths:
--------------
CalendarServer/trunk/contrib/performance/loadtest/config.dist.plist
CalendarServer/trunk/contrib/performance/loadtest/config.plist
CalendarServer/trunk/contrib/performance/loadtest/ical.py
CalendarServer/trunk/contrib/performance/loadtest/population.py
CalendarServer/trunk/contrib/performance/loadtest/sim.py
CalendarServer/trunk/contrib/performance/loadtest/test_ical.py
CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py
CalendarServer/trunk/contrib/performance/loadtest/test_sim.py
CalendarServer/trunk/sim
Modified: CalendarServer/trunk/contrib/performance/loadtest/config.dist.plist
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/config.dist.plist 2012-05-24 22:18:24 UTC (rev 9299)
+++ CalendarServer/trunk/contrib/performance/loadtest/config.dist.plist 2012-05-25 13:22:21 UTC (rev 9300)
@@ -36,6 +36,10 @@
<key>server</key>
<string>https://127.0.0.1:8443/</string>
+ <!-- The template URI for doing initial principal lookup on. -->
+ <key>principalPathTemplate</key>
+ <string>/principals/users/%s/</string>
+
<!-- Configure Admin Web UI. -->
<key>webadmin</key>
<dict>
Modified: CalendarServer/trunk/contrib/performance/loadtest/config.plist
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/config.plist 2012-05-24 22:18:24 UTC (rev 9299)
+++ CalendarServer/trunk/contrib/performance/loadtest/config.plist 2012-05-25 13:22:21 UTC (rev 9300)
@@ -23,6 +23,10 @@
<key>server</key>
<string>https://127.0.0.1:8443/</string>
+ <!-- The template URI for doing initial principal lookup on. -->
+ <key>principalPathTemplate</key>
+ <string>/principals/users/%s/</string>
+
<!-- Configure Admin Web UI. -->
<key>webadmin</key>
<dict>
Modified: CalendarServer/trunk/contrib/performance/loadtest/ical.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/ical.py 2012-05-24 22:18:24 UTC (rev 9299)
+++ CalendarServer/trunk/contrib/performance/loadtest/ical.py 2012-05-25 13:22:21 UTC (rev 9300)
@@ -17,7 +17,7 @@
import random
from uuid import uuid4
-from urlparse import urlparse, urlunparse
+from urlparse import urlparse, urlunparse, urlsplit
from xml.etree import ElementTree
@@ -268,7 +268,7 @@
email = None
- def __init__(self, reactor, root, record, auth, calendarHomePollInterval=None, supportPush=True,
+ def __init__(self, reactor, root, principalPathTemplate, record, auth, calendarHomePollInterval=None, supportPush=True,
supportAmpPush=True, ampPushHost="localhost", ampPushPort=62311):
self._client_id = str(uuid4())
@@ -276,6 +276,7 @@
self.reactor = reactor
self.agent = AuthHandlerAgent(Agent(self.reactor), auth)
self.root = root
+ self.principalPathTemplate = principalPathTemplate
self.record = record
if calendarHomePollInterval is None:
@@ -414,11 +415,13 @@
StringProducer(body),
method_label=method_label,
)
+
body = yield readBody(response)
result = self._parseMultiStatus(body)
- returnValue(result)
+ returnValue((response, result,))
+
@inlineCallbacks
def _proppatch(self, url, body):
"""
@@ -461,39 +464,44 @@
returnValue(result)
+ @inlineCallbacks
def _startupPropfindWellKnown(self):
"""
Issue a PROPFIND on the /.well-known/caldav/ URL
"""
- return self._propfind(
- '/.well-known/caldav/',
+
+ location = "/.well-known/caldav/"
+ response, result = yield self._propfind(
+ location,
self._STARTUP_WELL_KNOWN,
allowedStatus=(MULTI_STATUS, MOVED_PERMANENTLY),
)
+
+ # Follow any redirect
+ if response.code == MOVED_PERMANENTLY:
+ location = response.headers.getRawHeaders("location")[0]
+ location = urlsplit(location)[2]
+ response, result = yield self._propfind(
+ location,
+ self._STARTUP_WELL_KNOWN,
+ allowedStatus=(MULTI_STATUS),
+ )
+
+ returnValue(result[location])
+
-
- def _startupPropfindRoot(self):
- """
- Issue a PROPFIND on the / URL
- """
- return self._propfind(
- '/',
- self._STARTUP_WELL_KNOWN,
- )
-
-
@inlineCallbacks
def _principalPropfindInitial(self, user):
"""
Issue a PROPFIND on the /principals/users/<uid> URL to retrieve
the /principals/__uids__/<guid> principal URL
"""
- principalURL = '/principals/users/' + user + '/'
- result = yield self._propfind(
- '/principals/users/' + user + '/',
+ principalPath = self.principalPathTemplate % (user,)
+ _ignore_response, result = yield self._propfind(
+ principalPath,
self._STARTUP_PRINCIPAL_PROPFIND_INITIAL,
)
- returnValue(result[principalURL])
+ returnValue(result[principalPath])
@inlineCallbacks
@@ -503,7 +511,7 @@
user and return a L{Principal} instance constructed from the
response.
"""
- result = yield self._propfind(
+ _ignore_response, result = yield self._propfind(
self.principalURL,
self._STARTUP_PRINCIPAL_PROPFIND,
)
@@ -529,7 +537,7 @@
"""
if not calendarHomeSet.endswith('/'):
calendarHomeSet = calendarHomeSet + '/'
- result = yield self._propfind(
+ _ignore_response, result = yield self._propfind(
calendarHomeSet,
self._POLL_CALENDARHOME_PROPFIND,
depth='1',
@@ -613,7 +621,7 @@
# the sim can fire a PUT between the PROPFIND and when process the removals.
old_hrefs = set([calendar.url + child for child in calendar.events.keys()])
- result = yield self._propfind(
+ _ignore_response, result = yield self._propfind(
calendar.url,
self._POLL_CALENDAR_PROPFIND_D1,
depth='1',
@@ -839,7 +847,7 @@
@inlineCallbacks
def _notificationPropfind(self, notificationURL):
- result = yield self._propfind(
+ _ignore_response, result = yield self._propfind(
notificationURL,
self._POLL_NOTIFICATION_PROPFIND,
)
@@ -848,7 +856,7 @@
@inlineCallbacks
def _notificationChangesPropfind(self, notificationURL):
- result = yield self._propfind(
+ _ignore_response, result = yield self._propfind(
notificationURL,
self._POLL_NOTIFICATION_PROPFIND_D1,
depth='1',
@@ -1328,7 +1336,7 @@
@inlineCallbacks
def startup(self):
- # PROPFIND /principals/users/<uid> to retrieve /principals/__uids__/<guid>
+ # PROPFIND principal path to retrieve actual principal-URL
response = yield self._principalPropfindInitial(self.record.uid)
hrefs = response.getHrefProperties()
self.principalURL = hrefs[davxml.principal_URL].toString()
@@ -1429,16 +1437,18 @@
@inlineCallbacks
def startup(self):
- # PROPFIND well-known - ignore
- yield self._startupPropfindWellKnown()
-
- # PROPFIND / - ignore
- yield self._startupPropfindRoot()
-
- # PROPFIND /principals/users/<uid> to retrieve /principals/__uids__/<guid>
- response = yield self._principalPropfindInitial(self.record.uid)
+ # PROPFIND well-known with redirect
+ response = yield self._startupPropfindWellKnown()
hrefs = response.getHrefProperties()
- self.principalURL = hrefs[davxml.principal_URL].toString()
+ if davxml.current_user_principal in hrefs:
+ self.principalURL = hrefs[davxml.current_user_principal].toString()
+ elif davxml.principal_URL in hrefs:
+ self.principalURL = hrefs[davxml.principal_URL].toString()
+ else:
+ # PROPFIND principal path to retrieve actual principal-URL
+ response = yield self._principalPropfindInitial(self.record.uid)
+ hrefs = response.getHrefProperties()
+ self.principalURL = hrefs[davxml.principal_URL].toString()
# Using the actual principal URL, retrieve principal information
principal = yield self._principalPropfind()
@@ -1534,7 +1544,7 @@
Issue a PROPFIND on the /principals/ URL to retrieve
the /principals/__uids__/<guid> principal URL
"""
- result = yield self._propfind(
+ _ignore_response, result = yield self._propfind(
'/principals/',
self._STARTUP_PRINCIPAL_PROPFIND_INITIAL,
)
@@ -1622,16 +1632,18 @@
@inlineCallbacks
def startup(self):
- # PROPFIND well-known - ignore
- yield self._startupPropfindWellKnown()
-
- # PROPFIND / - ignore
- yield self._startupPropfindRoot()
-
- # PROPFIND /principals/ to retrieve /principals/__uids__/<guid>
- response = yield self._principalPropfindInitial()
+ # PROPFIND well-known with redirect
+ response = yield self._startupPropfindWellKnown()
hrefs = response.getHrefProperties()
- self.principalURL = hrefs[davxml.current_user_principal].toString()
+ if davxml.current_user_principal in hrefs:
+ self.principalURL = hrefs[davxml.current_user_principal].toString()
+ elif davxml.principal_URL in hrefs:
+ self.principalURL = hrefs[davxml.principal_URL].toString()
+ else:
+ # PROPFIND principal path to retrieve actual principal-URL
+ response = yield self._principalPropfindInitial(self.record.uid)
+ hrefs = response.getHrefProperties()
+ self.principalURL = hrefs[davxml.principal_URL].toString()
# Using the actual principal URL, retrieve principal information
principal = yield self._principalPropfind()
Modified: CalendarServer/trunk/contrib/performance/loadtest/population.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/population.py 2012-05-24 22:18:24 UTC (rev 9299)
+++ CalendarServer/trunk/contrib/performance/loadtest/population.py 2012-05-25 13:22:21 UTC (rev 9300)
@@ -76,12 +76,12 @@
self.profileTypes = profileTypes
- def new(self, reactor, serverAddress, userRecord, authInfo):
+ def new(self, reactor, serverAddress, principalPathTemplate, userRecord, authInfo):
"""
Create a new instance of this client type.
"""
return self.clientType(
- reactor, serverAddress, userRecord, authInfo, **self.clientParams)
+ reactor, serverAddress, principalPathTemplate, userRecord, authInfo, **self.clientParams)
@@ -155,11 +155,12 @@
class CalendarClientSimulator(object):
def __init__(self, records, populator, parameters, reactor, server,
- workerIndex=0, workerCount=1):
+ principalPathTemplate, workerIndex=0, workerCount=1):
self._records = records
self.populator = populator
self.reactor = reactor
self.server = server
+ self.principalPathTemplate = principalPathTemplate
self._pop = self.populator.populate(parameters)
self._user = 0
self._stopped = False
@@ -224,7 +225,8 @@
reactor = loggedReactor(self.reactor)
client = clientType.new(
- reactor, self.server, self.getUserRecord(number), auth)
+ reactor, self.server, self.principalPathTemplate, self.getUserRecord(number), auth
+ )
self.clients.append(client)
d = client.run()
d.addErrback(self._clientFailure, reactor)
Modified: CalendarServer/trunk/contrib/performance/loadtest/sim.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/sim.py 2012-05-24 22:18:24 UTC (rev 9299)
+++ CalendarServer/trunk/contrib/performance/loadtest/sim.py 2012-05-25 13:22:21 UTC (rev 9300)
@@ -193,12 +193,13 @@
user information about the accounts on the server being put
under load.
"""
- def __init__(self, server, webadminPort, arrival, parameters, observers=None,
+ def __init__(self, server, principalPathTemplate, webadminPort, arrival, parameters, observers=None,
records=None, reactor=None, runtime=None, workers=None,
configTemplate=None, workerID=None, workerCount=1):
if reactor is None:
from twisted.internet import reactor
self.server = server
+ self.principalPathTemplate = principalPathTemplate
self.webadminPort = webadminPort
self.arrival = arrival
self.parameters = parameters
@@ -241,11 +242,15 @@
workerCount = config.get("workerCount", 1)
configTemplate = None
server = 'http://127.0.0.1:8008/'
+ principalPathTemplate = "/principals/users/%s/"
webadminPort = None
if 'server' in config:
server = config['server']
+ if 'principalPathTemplate' in config:
+ principalPathTemplate = config['principalPathTemplate']
+
if 'webadmin' in config:
if config['webadmin']['enabled']:
webadminPort = config['webadmin']['HTTPPort']
@@ -277,6 +282,7 @@
else:
# Manager / observer process.
server = ''
+ principalPathTemplate = ''
webadminPort = None
arrival = None
parameters = None
@@ -296,7 +302,7 @@
records.extend(namedAny(loader)(**params))
output.write("Loaded {0} accounts.\n".format(len(records)))
- return cls(server, webadminPort, arrival, parameters, observers=observers,
+ return cls(server, principalPathTemplate, webadminPort, arrival, parameters, observers=observers,
records=records, runtime=runtime, reactor=reactor,
workers=workers, configTemplate=configTemplate,
workerID=workerID, workerCount=workerCount)
@@ -337,7 +343,7 @@
populator = Populator(Random())
return CalendarClientSimulator(
self.records, populator, self.parameters, self.reactor, self.server,
- self.workerID, self.workerCount
+ self.principalPathTemplate, self.workerID, self.workerCount
)
Modified: CalendarServer/trunk/contrib/performance/loadtest/test_ical.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/test_ical.py 2012-05-24 22:18:24 UTC (rev 9299)
+++ CalendarServer/trunk/contrib/performance/loadtest/test_ical.py 2012-05-25 13:22:21 UTC (rev 9300)
@@ -1154,7 +1154,9 @@
TimezoneCache.create()
self.record = _DirectoryRecord(
u"user91", u"user91", u"User 91", u"user91 at example.org")
- self.client = OS_X_10_6(None, "http://127.0.0.1/", self.record, None)
+ self.client = OS_X_10_6(
+ None, "http://127.0.0.1/", "/principals/users/%s/", self.record, None
+ )
def interceptRequests(self):
Modified: CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py 2012-05-24 22:18:24 UTC (rev 9299)
+++ CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py 2012-05-25 13:22:21 UTC (rev 9300)
@@ -316,7 +316,7 @@
"""
def setUp(self):
self.sim = CalendarClientSimulator(
- AnyUser(), Populator(None), None, None, None)
+ AnyUser(), Populator(None), None, None, None, None)
def _simpleAccount(self, userNumber, eventText):
@@ -516,7 +516,7 @@
"""
def setUp(self):
self.sim = CalendarClientSimulator(
- AnyUser(), Populator(None), None, None, None)
+ AnyUser(), Populator(None), None, None, None, None)
def _simpleAccount(self, userNumber, eventText):
@@ -685,7 +685,7 @@
"""
def setUp(self):
self.sim = CalendarClientSimulator(
- AnyUser(), Populator(None), None, None, None)
+ AnyUser(), Populator(None), None, None, None, None)
def test_enabled(self):
@@ -949,7 +949,7 @@
"""
def setUp(self):
self.sim = CalendarClientSimulator(
- AnyUser(), Populator(None), None, None, None)
+ AnyUser(), Populator(None), None, None, None, None)
def test_enabled(self):
Modified: CalendarServer/trunk/contrib/performance/loadtest/test_sim.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/test_sim.py 2012-05-24 22:18:24 UTC (rev 9299)
+++ CalendarServer/trunk/contrib/performance/loadtest/test_sim.py 2012-05-25 13:22:21 UTC (rev 9300)
@@ -117,7 +117,7 @@
"""
calsim = CalendarClientSimulator(
[self._user('alice'), self._user('bob'), self._user('carol')],
- Populator(None), None, None, 'http://example.org:1234/')
+ Populator(None), None, None, 'http://example.org:1234/', None)
users = sorted([
calsim._createUser(0)[0],
calsim._createUser(1)[0],
@@ -133,7 +133,7 @@
"""
calsim = CalendarClientSimulator(
[self._user('alice')],
- Populator(None), None, None, 'http://example.org:1234/')
+ Populator(None), None, None, 'http://example.org:1234/', None)
user, auth = calsim._createUser(0)
self.assertEqual(
auth.passwd.find_user_password('Test Realm', 'http://example.org:1234/')[1],
@@ -146,7 +146,7 @@
profiles are not logged.
"""
class BrokenClient(object):
- def __init__(self, reactor, serverAddress, userInfo, auth, runResult):
+ def __init__(self, reactor, serverAddress, principalPathTemplate, userInfo, auth, runResult):
self._runResult = runResult
def run(self):
@@ -171,7 +171,7 @@
BrokenClient, {'runResult': clientRunResult},
[ProfileType(BrokenProfile, {'runResult': profileRunResult})]))
sim = CalendarClientSimulator(
- [self._user('alice')], Populator(None), params, None, 'http://example.com:1234/')
+ [self._user('alice')], Populator(None), params, None, 'http://example.com:1234/', None)
sim.add(1, 1)
sim.stop()
clientRunResult.errback(RuntimeError("Some fictional client problem"))
@@ -248,7 +248,7 @@
exc = self.assertRaises(
SystemExit, StubSimulator.main, ['--config', config.path])
self.assertEquals(
- exc.args, (StubSimulator(None, None, None, None).run(),))
+ exc.args, (StubSimulator(None, None, None, None, None).run(),))
def test_createSimulator(self):
@@ -259,7 +259,7 @@
"""
server = 'http://127.0.0.7:1243/'
reactor = object()
- sim = LoadSimulator(server, None, None, None, reactor=reactor)
+ sim = LoadSimulator(server, None, None, None, None, reactor=reactor)
calsim = sim.createSimulator()
self.assertIsInstance(calsim, CalendarClientSimulator)
self.assertIsInstance(calsim.reactor, LagTrackingReactor)
@@ -439,7 +439,7 @@
reactor = object()
sim = LoadSimulator(
- None, None, Arrival(FakeArrival, {'x': 3, 'y': 2}), None, reactor=reactor)
+ None, None, None, Arrival(FakeArrival, {'x': 3, 'y': 2}), None, reactor=reactor)
arrival = sim.createArrivalPolicy()
self.assertIsInstance(arrival, FakeArrival)
self.assertIdentical(arrival.reactor, sim.reactor)
@@ -516,6 +516,7 @@
observers = [Observer()]
sim = LoadSimulator(
"http://example.com:123/",
+ "/principals/users/%s/",
None,
Arrival(lambda reactor: NullArrival(), {}),
None, observers, reactor=Reactor())
Modified: CalendarServer/trunk/sim
===================================================================
--- CalendarServer/trunk/sim 2012-05-24 22:18:24 UTC (rev 9299)
+++ CalendarServer/trunk/sim 2012-05-25 13:22:21 UTC (rev 9300)
@@ -23,4 +23,6 @@
source "${wd}/support/shell.sh";
+export PYTHONPATH="$("${wd}/run" -p)";
+
exec "${wd}/contrib/performance/sim" "$@";
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120525/5225a058/attachment-0001.html>
More information about the calendarserver-changes
mailing list