[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