[CalendarServer-changes] [7435] CalendarServer/trunk/contrib/performance/loadtest
source_changes at macosforge.org
source_changes at macosforge.org
Thu May 12 11:29:19 PDT 2011
Revision: 7435
http://trac.macosforge.org/projects/calendarserver/changeset/7435
Author: exarkun at twistedmatrix.com
Date: 2011-05-12 11:29:19 -0700 (Thu, 12 May 2011)
Log Message:
-----------
Read account information from somewhere else instead of assuming user%02d-style username/passwords everywhere
Modified Paths:
--------------
CalendarServer/trunk/contrib/performance/loadtest/config.plist
CalendarServer/trunk/contrib/performance/loadtest/population.py
CalendarServer/trunk/contrib/performance/loadtest/sim.py
CalendarServer/trunk/contrib/performance/loadtest/test_sim.py
Added Paths:
-----------
CalendarServer/trunk/contrib/performance/loadtest/accounts.txt
Added: CalendarServer/trunk/contrib/performance/loadtest/accounts.txt
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/accounts.txt (rev 0)
+++ CalendarServer/trunk/contrib/performance/loadtest/accounts.txt 2011-05-12 18:29:19 UTC (rev 7435)
@@ -0,0 +1,99 @@
+user01 user01
+user02 user02
+user03 user03
+user04 user04
+user05 user05
+user06 user06
+user07 user07
+user08 user08
+user09 user09
+user10 user10
+user11 user11
+user12 user12
+user13 user13
+user14 user14
+user15 user15
+user16 user16
+user17 user17
+user18 user18
+user19 user19
+user20 user20
+user21 user21
+user22 user22
+user23 user23
+user24 user24
+user25 user25
+user26 user26
+user27 user27
+user28 user28
+user29 user29
+user30 user30
+user31 user31
+user32 user32
+user33 user33
+user34 user34
+user35 user35
+user36 user36
+user37 user37
+user38 user38
+user39 user39
+user40 user40
+user41 user41
+user42 user42
+user43 user43
+user44 user44
+user45 user45
+user46 user46
+user47 user47
+user48 user48
+user49 user49
+user50 user50
+user51 user51
+user52 user52
+user53 user53
+user54 user54
+user55 user55
+user56 user56
+user57 user57
+user58 user58
+user59 user59
+user60 user60
+user61 user61
+user62 user62
+user63 user63
+user64 user64
+user65 user65
+user66 user66
+user67 user67
+user68 user68
+user69 user69
+user70 user70
+user71 user71
+user72 user72
+user73 user73
+user74 user74
+user75 user75
+user76 user76
+user77 user77
+user78 user78
+user79 user79
+user80 user80
+user81 user81
+user82 user82
+user83 user83
+user84 user84
+user85 user85
+user86 user86
+user87 user87
+user88 user88
+user89 user89
+user90 user90
+user91 user91
+user92 user92
+user93 user93
+user94 user94
+user95 user95
+user96 user96
+user97 user97
+user98 user98
+user99 user99
Modified: CalendarServer/trunk/contrib/performance/loadtest/config.plist
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/config.plist 2011-05-12 18:13:58 UTC (rev 7434)
+++ CalendarServer/trunk/contrib/performance/loadtest/config.plist 2011-05-12 18:29:19 UTC (rev 7435)
@@ -29,6 +29,17 @@
<integer>8008</integer>
</dict>
+ <key>accounts</key>
+ <dict>
+ <key>loader</key>
+ <string>loadtest.sim.recordsFromTextFile</string>
+ <key>params</key>
+ <dict>
+ <key>path</key>
+ <string>loadtest/accounts.txt</string>
+ </dict>
+ </dict>
+
<key>arrival</key>
<dict>
<key>factory</key>
Modified: CalendarServer/trunk/contrib/performance/loadtest/population.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/population.py 2011-05-12 18:13:58 UTC (rev 7434)
+++ CalendarServer/trunk/contrib/performance/loadtest/population.py 2011-05-12 18:29:19 UTC (rev 7435)
@@ -112,13 +112,14 @@
class CalendarClientSimulator(object):
- def __init__(self, populator, parameters, reactor, host, port):
+ def __init__(self, records, populator, parameters, reactor, host, port):
+ self._records = records
self.populator = populator
self.reactor = reactor
self.host = host
self.port = port
self._pop = self.populator.populate(parameters)
- self._user = 1
+ self._user = 0
def _nextUserNumber(self):
@@ -129,13 +130,14 @@
def _createUser(self, number):
from urllib2 import HTTPDigestAuthHandler
- user = "user%02d" % (number,)
+ record = self._records[number]
+ user = record.uid
auth = HTTPDigestAuthHandler()
auth.add_password(
realm="Test Realm",
uri="http://%s:%d/" % (self.host, self.port),
user=user,
- passwd=user)
+ passwd=record.password)
return user, auth
Modified: CalendarServer/trunk/contrib/performance/loadtest/sim.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/sim.py 2011-05-12 18:13:58 UTC (rev 7434)
+++ CalendarServer/trunk/contrib/performance/loadtest/sim.py 2011-05-12 18:29:19 UTC (rev 7435)
@@ -33,6 +33,19 @@
CalendarClientSimulator)
+class _DirectoryRecord(object):
+ def __init__(self, uid, password):
+ self.uid = uid
+ self.password = password
+
+
+def recordsFromTextFile(path):
+ return [
+ _DirectoryRecord(*line.split())
+ for line
+ in FilePath(path).getContent().splitlines()]
+
+
class LagTrackingReactor(object):
"""
This reactor wraps another reactor and proxies all attribute
@@ -120,14 +133,19 @@
@type server: L{Server}
@type arrival: L{Arrival}
@type parameters: L{PopulationParameters}
+
+ @ivar records: A C{list} of L{DirectoryRecord} instances giving
+ user information about the accounts on the server being put
+ under load.
"""
- def __init__(self, server, arrival, parameters, observers=None, reactor=None):
+ def __init__(self, server, arrival, parameters, observers=None, records=None, reactor=None):
if reactor is None:
from twisted.internet import reactor
self.server = server
self.arrival = arrival
self.parameters = parameters
self.observers = observers
+ self.records = records
self.reactor = LagTrackingReactor(reactor)
@@ -175,9 +193,16 @@
for observerName in options.config['observers']:
observers.append(namedAny(observerName)())
- return cls(server, arrival, parameters, observers)
+ records = []
+ if 'accounts' in options.config:
+ loader = options.config['accounts']['loader']
+ params = options.config['accounts']['params']
+ records.extend(namedAny(loader)(**params))
+ return cls(server, arrival, parameters,
+ observers=observers, records=records)
+
@classmethod
def main(cls, args=None):
simulator = cls.fromCommandLine(args)
@@ -189,13 +214,14 @@
port = self.server.port
populator = Populator(Random())
return CalendarClientSimulator(
- populator, self.parameters, self.reactor, host, port)
+ self.records, populator, self.parameters, self.reactor,
+ host, port)
def createArrivalPolicy(self):
return self.arrival.factory(self.reactor, **self.arrival.parameters)
+
-
def run(self):
for obs in self.observers:
addObserver(obs.observe)
Modified: CalendarServer/trunk/contrib/performance/loadtest/test_sim.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/test_sim.py 2011-05-12 18:13:58 UTC (rev 7434)
+++ CalendarServer/trunk/contrib/performance/loadtest/test_sim.py 2011-05-12 18:29:19 UTC (rev 7435)
@@ -18,6 +18,8 @@
from operator import setitem
from plistlib import writePlistToString
+from zope.interface.verify import verifyClass
+
from twisted.python.log import LogPublisher, theLogPublisher, msg
from twisted.python.usage import UsageError
from twisted.python.filepath import FilePath
@@ -25,10 +27,13 @@
from twisted.internet.defer import succeed
from twisted.internet.task import Clock
+from twistedcaldav.directory.idirectory import IDirectoryService
+from twistedcaldav.directory.directory import DirectoryService, DirectoryRecord
+
from loadtest.ical import SnowLeopard
from loadtest.profiles import Eventer, Inviter, Accepter
from loadtest.population import (
- SmoothRampUp, ClientType, PopulationParameters, CalendarClientSimulator,
+ SmoothRampUp, ClientType, PopulationParameters, Populator, CalendarClientSimulator,
SimpleStatistics)
from loadtest.sim import (
Server, Arrival, SimOptions, LoadSimulator, LagTrackingReactor, main)
@@ -94,6 +99,50 @@
+class CalendarClientSimulatorTests(TestCase):
+ """
+ Tests for L{CalendarClientSimulator} which adds running clients to
+ a simulation.
+ """
+ realmName = 'stub'
+
+ def _user(self, name):
+ record = DirectoryRecord(self, 'user', name, (name,))
+ record.password = 'password-' + name
+ return record
+
+
+ def test_createUser(self):
+ """
+ Subsequent calls to L{CalendarClientSimulator._createUser}
+ with different user numbers return user details from different
+ directory records.
+ """
+ calsim = CalendarClientSimulator(
+ [self._user('alice'), self._user('bob'), self._user('carol')],
+ Populator(None), None, None, 'example.org', 1234)
+ users = sorted([
+ calsim._createUser(0)[0],
+ calsim._createUser(1)[0],
+ calsim._createUser(2)[0],
+ ])
+ self.assertEqual(['alice', 'bob', 'carol'], users)
+
+
+ def test_createUserAuthInfo(self):
+ """
+ The auth handler returned by L{CalendarClientSimulator._createUser}
+ includes the password taken from user's directory record.
+ """
+ calsim = CalendarClientSimulator(
+ [self._user('alice')],
+ Populator(None), None, None, 'example.org', 1234)
+ user, auth = calsim._createUser(0)
+ self.assertEqual(
+ auth.passwd.find_user_password('Test Realm', 'http://example.org:1234/')[1],
+ 'password-' + user)
+
+
class Reactor(object):
message = "some event to be observed"
@@ -149,9 +198,9 @@
def test_createSimulator(self):
"""
- L{LoadSimulator.createSimulator} creates a
- L{CalendarClientSimulator} with its own reactor and host and
- port information from the configuration file.
+ L{LoadSimulator.createSimulator} creates a L{CalendarClientSimulator}
+ with its own reactor and host and port information from the
+ configuration file.
"""
host = '127.0.0.7'
port = 1243
@@ -165,6 +214,28 @@
self.assertEquals(calsim.port, port)
+ def test_loadAccountsFromFile(self):
+ """
+ L{LoadSimulator.
+ """
+ accounts = FilePath(self.mktemp())
+ accounts.setContent("foo bar\nbaz quux\n")
+ config = VALID_CONFIG.copy()
+ config["accounts"] = {
+ "loader": "loadtest.sim.recordsFromTextFile",
+ "params": {
+ "path": accounts.path},
+ }
+ configpath = FilePath(self.mktemp())
+ configpath.setContent(writePlistToString(config))
+ sim = LoadSimulator.fromCommandLine(['--config', configpath.path])
+ self.assertEqual(2, len(sim.records))
+ self.assertEqual(sim.records[0].uid, 'foo')
+ self.assertEqual(sim.records[0].password, 'bar')
+ self.assertEqual(sim.records[1].uid, 'baz')
+ self.assertEqual(sim.records[1].password, 'quux')
+
+
def test_loadServerConfig(self):
"""
The Calendar Server host and port are loaded from the [server]
@@ -277,7 +348,7 @@
sim = LoadSimulator(
Server('example.com', 123),
Arrival(lambda reactor: NullArrival(), {}),
- None, observers, Reactor())
+ None, observers, reactor=Reactor())
sim.run()
self.assertTrue(observers[0].reported)
self.assertEquals(
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110512/012e72e5/attachment-0001.html>
More information about the calendarserver-changes
mailing list