<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[11901] CalendarServer/trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.calendarserver.org//changeset/11901">11901</a></dd>
<dt>Author</dt> <dd>cdaboo@apple.com</dd>
<dt>Date</dt> <dd>2013-11-07 09:02:26 -0800 (Thu, 07 Nov 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge branch that supports cross-pod proxies via HTTP reverse proxy of home resources. This removes all support for partitioning - podding
is now the only multi-server solution. Podding tests are now possible via a new set of config files and CDT pod-specific tests.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#CalendarServertrunkbin_calendarserver_preamblepy">CalendarServer/trunk/bin/_calendarserver_preamble.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertapcaldavpy">CalendarServer/trunk/calendarserver/tap/caldav.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolsshelldirectorypy">CalendarServer/trunk/calendarserver/tools/shell/directory.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstestdeprovisioncaldavdplist">CalendarServer/trunk/calendarserver/tools/test/deprovision/caldavd.plist</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstestgatewaycaldavdplist">CalendarServer/trunk/calendarserver/tools/test/gateway/caldavd.plist</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstestprincipalscaldavdplist">CalendarServer/trunk/calendarserver/tools/test/principals/caldavd.plist</a></li>
<li><a href="#CalendarServertrunkconfauthaugmentsdtd">CalendarServer/trunk/conf/auth/augments.dtd</a></li>
<li><a href="#CalendarServertrunkconflocalserverstestxml">CalendarServer/trunk/conf/localservers-test.xml</a></li>
<li><a href="#CalendarServertrunkconflocalserversxml">CalendarServer/trunk/conf/localservers.xml</a></li>
<li><a href="#CalendarServertrunkconfremoteserverstestxml">CalendarServer/trunk/conf/remoteservers-test.xml</a></li>
<li><a href="#CalendarServertrunkconfremoteserversxml">CalendarServer/trunk/conf/remoteservers.xml</a></li>
<li><a href="#CalendarServertrunkconfresourcescaldavdresourcesplist">CalendarServer/trunk/conf/resources/caldavd-resources.plist</a></li>
<li><a href="#CalendarServertrunkcontribtoolsrequest_monitorpy">CalendarServer/trunk/contrib/tools/request_monitor.py</a></li>
<li><a href="#CalendarServertrunksetuppy">CalendarServer/trunk/setup.py</a></li>
<li><a href="#CalendarServertrunktwistedcaldavconfigpy">CalendarServer/trunk/twistedcaldav/config.py</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectoryaugmentpy">CalendarServer/trunk/twistedcaldav/directory/augment.py</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectorycommonpy">CalendarServer/trunk/twistedcaldav/directory/common.py</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectorydirectoryprincipalresourcehtml">CalendarServer/trunk/twistedcaldav/directory/directory-principal-resource.html</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectorydirectorypy">CalendarServer/trunk/twistedcaldav/directory/directory.py</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectoryidirectorypy">CalendarServer/trunk/twistedcaldav/directory/idirectory.py</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectoryldapdirectorypy">CalendarServer/trunk/twistedcaldav/directory/ldapdirectory.py</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectoryprincipalpy">CalendarServer/trunk/twistedcaldav/directory/principal.py</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectoryresourcepy">CalendarServer/trunk/twistedcaldav/directory/resource.py</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectorytestaugmentstestdefaultxml">CalendarServer/trunk/twistedcaldav/directory/test/augments-test-default.xml</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectorytestaugmentstestxml">CalendarServer/trunk/twistedcaldav/directory/test/augments-test.xml</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectorytestresourcescaldavdplist">CalendarServer/trunk/twistedcaldav/directory/test/resources/caldavd.plist</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectorytesttest_augmentpy">CalendarServer/trunk/twistedcaldav/directory/test/test_augment.py</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectorytesttest_ldapdirectorypy">CalendarServer/trunk/twistedcaldav/directory/test/test_ldapdirectory.py</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectoryxmlaugmentsparserpy">CalendarServer/trunk/twistedcaldav/directory/xmlaugmentsparser.py</a></li>
<li><a href="#CalendarServertrunktwistedcaldavstdconfigpy">CalendarServer/trunk/twistedcaldav/stdconfig.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingaddressmappingpy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/addressmapping.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingcaldavdeliverypy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/caldav/delivery.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingcaldavschedulerpy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/caldav/scheduler.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingcuaddresspy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/cuaddress.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingimplicitpy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/implicit.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingischeduledeliverypy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/delivery.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingischedulelocalserverspy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/localservers.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingischeduleremoteserverspy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/remoteservers.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingischeduleschedulerpy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/scheduler.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingischeduletesttest_localserverspy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingschedulerpy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/scheduler.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingutilspy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/utils.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoretestutilpy">CalendarServer/trunk/txdav/caldav/datastore/test/util.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavicalendardirectoryservicepy">CalendarServer/trunk/txdav/caldav/icalendardirectoryservice.py</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#CalendarServertrunkconfauthaccountstestpodxml">CalendarServer/trunk/conf/auth/accounts-test-pod.xml</a></li>
<li><a href="#CalendarServertrunkconfauthaugmentstestpodxml">CalendarServer/trunk/conf/auth/augments-test-pod.xml</a></li>
<li><a href="#CalendarServertrunkconfauthproxiestestpodxml">CalendarServer/trunk/conf/auth/proxies-test-pod.xml</a></li>
<li><a href="#CalendarServertrunkconfauthresourcestestpodxml">CalendarServer/trunk/conf/auth/resources-test-pod.xml</a></li>
<li><a href="#CalendarServertrunkconfcaldavdtestpodAplist">CalendarServer/trunk/conf/caldavd-test-podA.plist</a></li>
<li><a href="#CalendarServertrunkconfcaldavdtestpodBplist">CalendarServer/trunk/conf/caldavd-test-podB.plist</a></li>
<li><a href="#CalendarServertrunkconflocalserversdtd">CalendarServer/trunk/conf/localservers.dtd</a></li>
<li><a href="#CalendarServertrunkconfremoteserversdtd">CalendarServer/trunk/conf/remoteservers.dtd</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#CalendarServertrunkbincalendarserver_make_partition">CalendarServer/trunk/bin/calendarserver_make_partition</a></li>
<li><a href="#CalendarServertrunkconfcaldavdpartitioningprimaryplist">CalendarServer/trunk/conf/caldavd-partitioning-primary.plist</a></li>
<li><a href="#CalendarServertrunkconfcaldavdpartitioningsecondaryplist">CalendarServer/trunk/conf/caldavd-partitioning-secondary.plist</a></li>
<li><a href="#CalendarServertrunkconfserversdtd">CalendarServer/trunk/conf/servers.dtd</a></li>
<li><a href="#CalendarServertrunkconfservertoserverdtd">CalendarServer/trunk/conf/servertoserver.dtd</a></li>
<li><a href="#CalendarServertrunkconfsudoersplist">CalendarServer/trunk/conf/sudoers.plist</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectorytestsudoersplist">CalendarServer/trunk/twistedcaldav/directory/test/sudoers.plist</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectorytestsudoers2plist">CalendarServer/trunk/twistedcaldav/directory/test/sudoers2.plist</a></li>
</ul>

<h3>Property Changed</h3>
<ul>
<li><a href="#CalendarServertrunk">CalendarServer/trunk/</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="CalendarServertrunk"></a>
<div class="propset"><h4>Property changes: CalendarServer/trunk</h4>
<pre class="diff"><span>
</span></pre></div>
<a id="svnmergeinfo"></a>
<div class="modfile"><h4>Modified: svn:mergeinfo</h4></div>
<span class="cx">/CalendarServer/branches/config-separation:4379-4443
</span><span class="cx">/CalendarServer/branches/egg-info-351:4589-4625
</span><span class="cx">/CalendarServer/branches/generic-sqlstore:6167-6191
</span><span class="cx">/CalendarServer/branches/new-store:5594-5934
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile:5911-5935
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile-2:5936-5981
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-4.3-dev:10180-10190,10192
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-5.1-dev:11846
</span><span class="cx">/CalendarServer/branches/users/cdaboo/batchupload-6699:6700-7198
</span><span class="cx">/CalendarServer/branches/users/cdaboo/cached-subscription-calendars-5692:5693-5702
</span><span class="cx">/CalendarServer/branches/users/cdaboo/component-set-fixes:8130-8346
</span><span class="cx">/CalendarServer/branches/users/cdaboo/directory-cache-on-demand-3627:3628-3644
</span><span class="cx">/CalendarServer/branches/users/cdaboo/fix-no-ischedule:11607-11871
</span><span class="cx">/CalendarServer/branches/users/cdaboo/implicituidrace:8137-8141
</span><span class="cx">/CalendarServer/branches/users/cdaboo/ischedule-dkim:9747-9979
</span><span class="cx">/CalendarServer/branches/users/cdaboo/managed-attachments:9985-10145
</span><span class="cx">/CalendarServer/branches/users/cdaboo/more-sharing-5591:5592-5601
</span><span class="cx">/CalendarServer/branches/users/cdaboo/partition-4464:4465-4957
</span><span class="cx">/CalendarServer/branches/users/cdaboo/performance-tweaks:11824-11836
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pods:7297-7377
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycalendar:7085-7206
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycard:7227-7237
</span><span class="cx">/CalendarServer/branches/users/cdaboo/queued-attendee-refreshes:7740-8287
</span><span class="cx">/CalendarServer/branches/users/cdaboo/relative-config-paths-5070:5071-5105
</span><span class="cx">/CalendarServer/branches/users/cdaboo/shared-calendars-5187:5188-5440
</span><span class="cx">/CalendarServer/branches/users/cdaboo/store-scheduling:10876-11129
</span><span class="cx">/CalendarServer/branches/users/cdaboo/timezones:7443-7699
</span><span class="cx">/CalendarServer/branches/users/cdaboo/txn-debugging:8730-8743
</span><span class="cx">/CalendarServer/branches/users/gaya/sharedgroups-3:11088-11204
</span><span class="cx">/CalendarServer/branches/users/glyph/always-abort-txn-on-error:9958-9969
</span><span class="cx">/CalendarServer/branches/users/glyph/case-insensitive-uid:8772-8805
</span><span class="cx">/CalendarServer/branches/users/glyph/conn-limit:6574-6577
</span><span class="cx">/CalendarServer/branches/users/glyph/contacts-server-merge:4971-5080
</span><span class="cx">/CalendarServer/branches/users/glyph/dalify:6932-7023
</span><span class="cx">/CalendarServer/branches/users/glyph/db-reconnect:6824-6876
</span><span class="cx">/CalendarServer/branches/users/glyph/deploybuild:7563-7572
</span><span class="cx">/CalendarServer/branches/users/glyph/digest-auth-redux:10624-10635
</span><span class="cx">/CalendarServer/branches/users/glyph/disable-quota:7718-7727
</span><span class="cx">/CalendarServer/branches/users/glyph/dont-start-postgres:6592-6614
</span><span class="cx">/CalendarServer/branches/users/glyph/enforce-max-requests:11640-11643
</span><span class="cx">/CalendarServer/branches/users/glyph/hang-fix:11465-11491
</span><span class="cx">/CalendarServer/branches/users/glyph/imip-and-admin-html:7866-7984
</span><span class="cx">/CalendarServer/branches/users/glyph/ipv6-client:9054-9105
</span><span class="cx">/CalendarServer/branches/users/glyph/launchd-wrapper-bis:11413-11436
</span><span class="cx">/CalendarServer/branches/users/glyph/linux-tests:6893-6900
</span><span class="cx">/CalendarServer/branches/users/glyph/log-cleanups:11691-11731
</span><span class="cx">/CalendarServer/branches/users/glyph/migrate-merge:8690-8713
</span><span class="cx">/CalendarServer/branches/users/glyph/misc-portability-fixes:7365-7374
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-6:6322-6368
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-7:6369-6445
</span><span class="cx">/CalendarServer/branches/users/glyph/multiget-delete:8321-8330
</span><span class="cx">/CalendarServer/branches/users/glyph/new-export:7444-7485
</span><span class="cx">/CalendarServer/branches/users/glyph/one-home-list-api:10048-10073
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle:7106-7155
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle-nulls:7340-7351
</span><span class="cx">/CalendarServer/branches/users/glyph/other-html:8062-8091
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-sim:8240-8251
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade:8376-8400
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade_to_1:8571-8583
</span><span class="cx">/CalendarServer/branches/users/glyph/q:9560-9688
</span><span class="cx">/CalendarServer/branches/users/glyph/queue-locking-and-timing:10204-10289
</span><span class="cx">/CalendarServer/branches/users/glyph/quota:7604-7637
</span><span class="cx">/CalendarServer/branches/users/glyph/sendfdport:5388-5424
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-fixes:8436-8443
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-take2:8155-8174
</span><span class="cx">/CalendarServer/branches/users/glyph/sharedpool:6490-6550
</span><span class="cx">/CalendarServer/branches/users/glyph/sharing-api:9192-9205
</span><span class="cx">/CalendarServer/branches/users/glyph/skip-lonely-vtimezones:8524-8535
</span><span class="cx">/CalendarServer/branches/users/glyph/sql-store:5929-6073
</span><span class="cx">/CalendarServer/branches/users/glyph/start-service-start-loop:11060-11065
</span><span class="cx">/CalendarServer/branches/users/glyph/subtransactions:7248-7258
</span><span class="cx">/CalendarServer/branches/users/glyph/table-alias:8651-8664
</span><span class="cx">/CalendarServer/branches/users/glyph/uidexport:7673-7676
</span><span class="cx">/CalendarServer/branches/users/glyph/unshare-when-access-revoked:10562-10595
</span><span class="cx">/CalendarServer/branches/users/glyph/use-system-twisted:5084-5149
</span><span class="cx">/CalendarServer/branches/users/glyph/uuid-normalize:9268-9296
</span><span class="cx">/CalendarServer/branches/users/glyph/warning-cleanups:11347-11357
</span><span class="cx">/CalendarServer/branches/users/glyph/whenNotProposed:11881-11897
</span><span class="cx">/CalendarServer/branches/users/glyph/xattrs-from-files:7757-7769
</span><span class="cx">/CalendarServer/branches/users/sagen/applepush:8126-8184
</span><span class="cx">/CalendarServer/branches/users/sagen/inboxitems:7380-7381
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources:5032-5051
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources-2:5052-5061
</span><span class="cx">/CalendarServer/branches/users/sagen/purge_old_events:6735-6746
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
</span><span class="cx">/CalendarServer/branches/users/sagen/resources-2:5084-5093
</span><span class="cx">/CalendarServer/branches/users/sagen/testing:10827-10851,10853-10855
</span><span class="cx">/CalendarServer/branches/users/wsanchez/transations:5515-5593
</span><span class="cx">   + /CalDAVTester/trunk:11193-11198
</span><span class="cx">/CalendarServer/branches/config-separation:4379-4443
</span><span class="cx">/CalendarServer/branches/egg-info-351:4589-4625
</span><span class="cx">/CalendarServer/branches/generic-sqlstore:6167-6191
</span><span class="cx">/CalendarServer/branches/new-store:5594-5934
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile:5911-5935
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile-2:5936-5981
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-4.3-dev:10180-10190,10192
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-5.1-dev:11846
</span><span class="cx">/CalendarServer/branches/users/cdaboo/batchupload-6699:6700-7198
</span><span class="cx">/CalendarServer/branches/users/cdaboo/cached-subscription-calendars-5692:5693-5702
</span><span class="cx">/CalendarServer/branches/users/cdaboo/component-set-fixes:8130-8346
</span><span class="cx">/CalendarServer/branches/users/cdaboo/directory-cache-on-demand-3627:3628-3644
</span><span class="cx">/CalendarServer/branches/users/cdaboo/fix-no-ischedule:11607-11871
</span><span class="cx">/CalendarServer/branches/users/cdaboo/implicituidrace:8137-8141
</span><span class="cx">/CalendarServer/branches/users/cdaboo/ischedule-dkim:9747-9979
</span><span class="cx">/CalendarServer/branches/users/cdaboo/managed-attachments:9985-10145
</span><span class="cx">/CalendarServer/branches/users/cdaboo/more-sharing-5591:5592-5601
</span><span class="cx">/CalendarServer/branches/users/cdaboo/partition-4464:4465-4957
</span><span class="cx">/CalendarServer/branches/users/cdaboo/performance-tweaks:11824-11836
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pods:7297-7377
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycalendar:7085-7206
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycard:7227-7237
</span><span class="cx">/CalendarServer/branches/users/cdaboo/queued-attendee-refreshes:7740-8287
</span><span class="cx">/CalendarServer/branches/users/cdaboo/relative-config-paths-5070:5071-5105
</span><span class="cx">/CalendarServer/branches/users/cdaboo/reverse-proxy-pods:11875-11900
</span><span class="cx">/CalendarServer/branches/users/cdaboo/shared-calendars-5187:5188-5440
</span><span class="cx">/CalendarServer/branches/users/cdaboo/store-scheduling:10876-11129
</span><span class="cx">/CalendarServer/branches/users/cdaboo/timezones:7443-7699
</span><span class="cx">/CalendarServer/branches/users/cdaboo/txn-debugging:8730-8743
</span><span class="cx">/CalendarServer/branches/users/gaya/sharedgroups-3:11088-11204
</span><span class="cx">/CalendarServer/branches/users/glyph/always-abort-txn-on-error:9958-9969
</span><span class="cx">/CalendarServer/branches/users/glyph/case-insensitive-uid:8772-8805
</span><span class="cx">/CalendarServer/branches/users/glyph/conn-limit:6574-6577
</span><span class="cx">/CalendarServer/branches/users/glyph/contacts-server-merge:4971-5080
</span><span class="cx">/CalendarServer/branches/users/glyph/dalify:6932-7023
</span><span class="cx">/CalendarServer/branches/users/glyph/db-reconnect:6824-6876
</span><span class="cx">/CalendarServer/branches/users/glyph/deploybuild:7563-7572
</span><span class="cx">/CalendarServer/branches/users/glyph/digest-auth-redux:10624-10635
</span><span class="cx">/CalendarServer/branches/users/glyph/disable-quota:7718-7727
</span><span class="cx">/CalendarServer/branches/users/glyph/dont-start-postgres:6592-6614
</span><span class="cx">/CalendarServer/branches/users/glyph/enforce-max-requests:11640-11643
</span><span class="cx">/CalendarServer/branches/users/glyph/hang-fix:11465-11491
</span><span class="cx">/CalendarServer/branches/users/glyph/imip-and-admin-html:7866-7984
</span><span class="cx">/CalendarServer/branches/users/glyph/ipv6-client:9054-9105
</span><span class="cx">/CalendarServer/branches/users/glyph/launchd-wrapper-bis:11413-11436
</span><span class="cx">/CalendarServer/branches/users/glyph/linux-tests:6893-6900
</span><span class="cx">/CalendarServer/branches/users/glyph/log-cleanups:11691-11731
</span><span class="cx">/CalendarServer/branches/users/glyph/migrate-merge:8690-8713
</span><span class="cx">/CalendarServer/branches/users/glyph/misc-portability-fixes:7365-7374
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-6:6322-6368
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-7:6369-6445
</span><span class="cx">/CalendarServer/branches/users/glyph/multiget-delete:8321-8330
</span><span class="cx">/CalendarServer/branches/users/glyph/new-export:7444-7485
</span><span class="cx">/CalendarServer/branches/users/glyph/one-home-list-api:10048-10073
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle:7106-7155
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle-nulls:7340-7351
</span><span class="cx">/CalendarServer/branches/users/glyph/other-html:8062-8091
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-sim:8240-8251
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade:8376-8400
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade_to_1:8571-8583
</span><span class="cx">/CalendarServer/branches/users/glyph/q:9560-9688
</span><span class="cx">/CalendarServer/branches/users/glyph/queue-locking-and-timing:10204-10289
</span><span class="cx">/CalendarServer/branches/users/glyph/quota:7604-7637
</span><span class="cx">/CalendarServer/branches/users/glyph/sendfdport:5388-5424
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-fixes:8436-8443
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-take2:8155-8174
</span><span class="cx">/CalendarServer/branches/users/glyph/sharedpool:6490-6550
</span><span class="cx">/CalendarServer/branches/users/glyph/sharing-api:9192-9205
</span><span class="cx">/CalendarServer/branches/users/glyph/skip-lonely-vtimezones:8524-8535
</span><span class="cx">/CalendarServer/branches/users/glyph/sql-store:5929-6073
</span><span class="cx">/CalendarServer/branches/users/glyph/start-service-start-loop:11060-11065
</span><span class="cx">/CalendarServer/branches/users/glyph/subtransactions:7248-7258
</span><span class="cx">/CalendarServer/branches/users/glyph/table-alias:8651-8664
</span><span class="cx">/CalendarServer/branches/users/glyph/uidexport:7673-7676
</span><span class="cx">/CalendarServer/branches/users/glyph/unshare-when-access-revoked:10562-10595
</span><span class="cx">/CalendarServer/branches/users/glyph/use-system-twisted:5084-5149
</span><span class="cx">/CalendarServer/branches/users/glyph/uuid-normalize:9268-9296
</span><span class="cx">/CalendarServer/branches/users/glyph/warning-cleanups:11347-11357
</span><span class="cx">/CalendarServer/branches/users/glyph/whenNotProposed:11881-11897
</span><span class="cx">/CalendarServer/branches/users/glyph/xattrs-from-files:7757-7769
</span><span class="cx">/CalendarServer/branches/users/sagen/applepush:8126-8184
</span><span class="cx">/CalendarServer/branches/users/sagen/inboxitems:7380-7381
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources:5032-5051
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources-2:5052-5061
</span><span class="cx">/CalendarServer/branches/users/sagen/purge_old_events:6735-6746
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
</span><span class="cx">/CalendarServer/branches/users/sagen/resources-2:5084-5093
</span><span class="cx">/CalendarServer/branches/users/sagen/testing:10827-10851,10853-10855
</span><span class="cx">/CalendarServer/branches/users/wsanchez/transations:5515-5593
</span><a id="CalendarServertrunkbin_calendarserver_preamblepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/bin/_calendarserver_preamble.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/bin/_calendarserver_preamble.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/bin/_calendarserver_preamble.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -60,7 +60,6 @@
</span><span class="cx">     noConfigOption = [
</span><span class="cx">         &quot;calendarserver_bootstrap_database&quot;,
</span><span class="cx">         &quot;calendarserver_load_augmentdb&quot;,
</span><del>-        &quot;calendarserver_make_partition&quot;,
</del><span class="cx">         &quot;calendarserver_manage_augments&quot;,
</span><span class="cx">         &quot;calendarserver_manage_postgres&quot;,
</span><span class="cx">         &quot;calendarserver_manage_timezones&quot;,
</span></span></pre></div>
<a id="CalendarServertrunkbincalendarserver_make_partition"></a>
<div class="delfile"><h4>Deleted: CalendarServer/trunk/bin/calendarserver_make_partition (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/bin/calendarserver_make_partition        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/bin/calendarserver_make_partition        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -1,32 +0,0 @@
</span><del>-#!/usr/bin/env python
-##
-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-import sys
-
-#PYTHONPATH
-
-if __name__ == &quot;__main__&quot;:
-    if &quot;PYTHONPATH&quot; in globals():
-        sys.path.insert(0, PYTHONPATH)
-    else:
-        try:
-            import _calendarserver_preamble
-        except ImportError:
-            sys.exc_clear()
-
-    from calendarserver.tools.makepartition import main
-    main()
</del></span></pre></div>
<a id="CalendarServertrunkcalendarservertapcaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tap/caldav.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tap/caldav.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/calendarserver/tap/caldav.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -401,6 +401,14 @@
</span><span class="cx">         print(&quot;Reading configuration from file: %s&quot; % (self[&quot;config&quot;],))
</span><span class="cx"> 
</span><span class="cx">         config.load(self[&quot;config&quot;])
</span><ins>+
+        for path in config.getProvider().importedFiles:
+            print(&quot;Imported configuration from file: '%s'&quot; % (path,))
+        for path in config.getProvider().includedFiles:
+            print(&quot;Adding configuration from file: '%s'&quot; % (path,))
+        for path in config.getProvider().missingFiles:
+            print(&quot;Missing configuration file: '%s'&quot; % (path,))
+
</ins><span class="cx">         config.updateDefaults(self.overrides)
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolsshelldirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/shell/directory.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/shell/directory.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/calendarserver/tools/shell/directory.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx">     returnValue(sorted(records, key=operator.attrgetter(&quot;fullName&quot;)))
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> @inlineCallbacks
</span><span class="cx"> def recordInfo(directory, record):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="lines">@@ -58,8 +59,9 @@
</span><span class="cx">     add(&quot;Proxy access&quot;     , (yield recordProxyAccessInfo(directory, record)))
</span><span class="cx"> 
</span><span class="cx">     returnValue(&quot;\n&quot;.join(info))
</span><del>-        
</del><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> def recordBasicInfo(directory, record):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Basic information for a record.
</span><span class="lines">@@ -87,15 +89,15 @@
</span><span class="cx">     for cua in record.calendarUserAddresses:
</span><span class="cx">         add(&quot;Calendar User Address&quot;, cua)
</span><span class="cx"> 
</span><del>-    add(&quot;Server ID&quot;           , record.serverID              )
-    add(&quot;Partition ID&quot;        , record.partitionID           )
-    add(&quot;Enabled&quot;             , record.enabled               )
-    add(&quot;Enabled for Calendar&quot;, record.enabledForCalendaring )
</del><ins>+    add(&quot;Server ID&quot;           , record.serverID)
+    add(&quot;Enabled&quot;             , record.enabled)
+    add(&quot;Enabled for Calendar&quot;, record.enabledForCalendaring)
</ins><span class="cx">     add(&quot;Enabled for Contacts&quot;, record.enabledForAddressBooks)
</span><span class="cx"> 
</span><span class="cx">     return succeed(table.toString())
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def recordGroupMembershipInfo(directory, record):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Group membership info for a record.
</span><span class="lines">@@ -109,7 +111,7 @@
</span><span class="cx">         return succeed(None)
</span><span class="cx"> 
</span><span class="cx">     rows = sorted(rows,
</span><del>-        key = lambda row: (row[1], row[2])
</del><ins>+        key=lambda row: (row[1], row[2])
</ins><span class="cx">     )
</span><span class="cx"> 
</span><span class="cx">     table = Table()
</span><span class="lines">@@ -120,6 +122,7 @@
</span><span class="cx">     return succeed(table.toString())
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> @inlineCallbacks
</span><span class="cx"> def recordProxyAccessInfo(directory, record):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="lines">@@ -154,7 +157,7 @@
</span><span class="cx">         returnValue(None)
</span><span class="cx"> 
</span><span class="cx">     rows = sorted(rows,
</span><del>-        key = lambda row: (row[1], row[2], row[4])
</del><ins>+        key=lambda row: (row[1], row[2], row[4])
</ins><span class="cx">     )
</span><span class="cx"> 
</span><span class="cx">     table = Table()
</span><span class="lines">@@ -165,6 +168,7 @@
</span><span class="cx">     returnValue(table.toString())
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def summarizeRecords(directory, records):
</span><span class="cx">     table = Table()
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstestdeprovisioncaldavdplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/deprovision/caldavd.plist (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/deprovision/caldavd.plist        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/calendarserver/tools/test/deprovision/caldavd.plist        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -191,7 +191,6 @@
</span><span class="cx">         Augments for the directory service records to add calendar specific attributes.
</span><span class="cx"> 
</span><span class="cx">         A variety of augment services are available for use.
</span><del>-        When using a partitioned server, a service that can be accessed from each host will be needed.
</del><span class="cx">       --&gt;
</span><span class="cx"> 
</span><span class="cx">     &lt;!-- XML File Augment Service --&gt;
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstestgatewaycaldavdplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/gateway/caldavd.plist (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/gateway/caldavd.plist        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/calendarserver/tools/test/gateway/caldavd.plist        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -203,7 +203,6 @@
</span><span class="cx">         Augments for the directory service records to add calendar specific attributes.
</span><span class="cx"> 
</span><span class="cx">         A variety of augment services are available for use.
</span><del>-        When using a partitioned server, a service that can be accessed from each host will be needed.
</del><span class="cx">       --&gt;
</span><span class="cx"> 
</span><span class="cx">     &lt;!-- XML File Augment Service --&gt;
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstestprincipalscaldavdplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/principals/caldavd.plist (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/principals/caldavd.plist        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/calendarserver/tools/test/principals/caldavd.plist        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -195,7 +195,6 @@
</span><span class="cx">         Augments for the directory service records to add calendar specific attributes.
</span><span class="cx"> 
</span><span class="cx">         A variety of augment services are available for use.
</span><del>-        When using a partitioned server, a service that can be accessed from each host will be needed.
</del><span class="cx">       --&gt;
</span><span class="cx"> 
</span><span class="cx">     &lt;!-- XML File Augment Service --&gt;
</span></span></pre></div>
<a id="CalendarServertrunkconfauthaccountstestpodxmlfromrev11900CalendarServerbranchesuserscdabooreverseproxypodsconfauthaccountstestpodxml"></a>
<div class="copfile"><h4>Copied: CalendarServer/trunk/conf/auth/accounts-test-pod.xml (from rev 11900, CalendarServer/branches/users/cdaboo/reverse-proxy-pods/conf/auth/accounts-test-pod.xml) (0 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/auth/accounts-test-pod.xml                                (rev 0)
+++ CalendarServer/trunk/conf/auth/accounts-test-pod.xml        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -0,0 +1,32 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
+
+&lt;accounts realm=&quot;Test Realm&quot;&gt;
+  &lt;user&gt;
+    &lt;uid&gt;admin&lt;/uid&gt;
+    &lt;guid&gt;admin&lt;/guid&gt;
+    &lt;password&gt;admin&lt;/password&gt;
+    &lt;name&gt;Super User&lt;/name&gt;
+    &lt;first-name&gt;Super&lt;/first-name&gt;
+    &lt;last-name&gt;User&lt;/last-name&gt;
+  &lt;/user&gt;
+  &lt;user repeat=&quot;101&quot;&gt;
+    &lt;uid&gt;user%02d&lt;/uid&gt;
+    &lt;uid&gt;User %02d&lt;/uid&gt;
+    &lt;guid&gt;user%02d&lt;/guid&gt;
+    &lt;password&gt;user%02d&lt;/password&gt;
+    &lt;name&gt;User %02d&lt;/name&gt;
+    &lt;first-name&gt;User&lt;/first-name&gt;
+    &lt;last-name&gt;%02d&lt;/last-name&gt;
+    &lt;email-address&gt;user%02d@example.com&lt;/email-address&gt;
+  &lt;/user&gt;
+  &lt;user repeat=&quot;101&quot;&gt;
+    &lt;uid&gt;puser%02d&lt;/uid&gt;
+    &lt;uid&gt;Puser %02d&lt;/uid&gt;
+    &lt;guid&gt;puser%02d&lt;/guid&gt;
+    &lt;password&gt;puser%02d&lt;/password&gt;
+    &lt;name&gt;Puser %02d&lt;/name&gt;
+    &lt;first-name&gt;Puser&lt;/first-name&gt;
+    &lt;last-name&gt;%02d&lt;/last-name&gt;
+    &lt;email-address&gt;puser%02d@example.com&lt;/email-address&gt;
+  &lt;/user&gt;
+&lt;/accounts&gt;
</ins></span></pre></div>
<a id="CalendarServertrunkconfauthaugmentstestpodxmlfromrev11900CalendarServerbranchesuserscdabooreverseproxypodsconfauthaugmentstestpodxml"></a>
<div class="copfile"><h4>Copied: CalendarServer/trunk/conf/auth/augments-test-pod.xml (from rev 11900, CalendarServer/branches/users/cdaboo/reverse-proxy-pods/conf/auth/augments-test-pod.xml) (0 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/auth/augments-test-pod.xml                                (rev 0)
+++ CalendarServer/trunk/conf/auth/augments-test-pod.xml        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -0,0 +1,19 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
+&lt;!DOCTYPE augments SYSTEM &quot;augments.dtd&quot;&gt;
+
+&lt;augments&gt;
+  &lt;record&gt;
+    &lt;uid&gt;Default&lt;/uid&gt;
+    &lt;enable&gt;true&lt;/enable&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;record repeat=&quot;101&quot;&gt;
+    &lt;uid&gt;puser%02d&lt;/uid&gt;
+    &lt;enable&gt;true&lt;/enable&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+&lt;/augments&gt;
</ins></span></pre></div>
<a id="CalendarServertrunkconfauthaugmentsdtd"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/conf/auth/augments.dtd (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/auth/augments.dtd        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/conf/auth/augments.dtd        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -19,7 +19,7 @@
</span><span class="cx">   &lt;!ELEMENT record (
</span><span class="cx">                   uid,
</span><span class="cx">                   enable,
</span><del>-                  (server-id, partition-id?)?,
</del><ins>+                  server-id?,
</ins><span class="cx">                   enable-calendar?,
</span><span class="cx">                   enable-addressbook?,
</span><span class="cx">                   enable-login?,
</span><span class="lines">@@ -32,7 +32,6 @@
</span><span class="cx">   &lt;!ELEMENT uid                (#PCDATA)&gt;
</span><span class="cx">   &lt;!ELEMENT enable             (#PCDATA)&gt;
</span><span class="cx">   &lt;!ELEMENT server-id          (#PCDATA)&gt;
</span><del>-  &lt;!ELEMENT partition-id       (#PCDATA)&gt;
</del><span class="cx">   &lt;!ELEMENT enable-calendar    (#PCDATA)&gt;
</span><span class="cx">   &lt;!ELEMENT enable-addressbook (#PCDATA)&gt;
</span><span class="cx">   &lt;!ELEMENT enable-login       (#PCDATA)&gt;
</span></span></pre></div>
<a id="CalendarServertrunkconfauthproxiestestpodxmlfromrev11900CalendarServerbranchesuserscdabooreverseproxypodsconfauthproxiestestpodxml"></a>
<div class="copfile"><h4>Copied: CalendarServer/trunk/conf/auth/proxies-test-pod.xml (from rev 11900, CalendarServer/branches/users/cdaboo/reverse-proxy-pods/conf/auth/proxies-test-pod.xml) (0 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/auth/proxies-test-pod.xml                                (rev 0)
+++ CalendarServer/trunk/conf/auth/proxies-test-pod.xml        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -0,0 +1,22 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
+
+&lt;!--
+Copyright (c) 2009-2013 Apple Inc. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+ --&gt;
+
+&lt;!DOCTYPE proxies SYSTEM &quot;proxies.dtd&quot;&gt;
+
+&lt;proxies&gt;
+&lt;/proxies&gt;
</ins></span></pre></div>
<a id="CalendarServertrunkconfauthresourcestestpodxmlfromrev11900CalendarServerbranchesuserscdabooreverseproxypodsconfauthresourcestestpodxml"></a>
<div class="copfile"><h4>Copied: CalendarServer/trunk/conf/auth/resources-test-pod.xml (from rev 11900, CalendarServer/branches/users/cdaboo/reverse-proxy-pods/conf/auth/resources-test-pod.xml) (0 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/auth/resources-test-pod.xml                                (rev 0)
+++ CalendarServer/trunk/conf/auth/resources-test-pod.xml        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
+
+&lt;accounts realm=&quot;Test Realm&quot;&gt;
+&lt;/accounts&gt;
</ins></span></pre></div>
<a id="CalendarServertrunkconfcaldavdpartitioningprimaryplist"></a>
<div class="delfile"><h4>Deleted: CalendarServer/trunk/conf/caldavd-partitioning-primary.plist (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/caldavd-partitioning-primary.plist        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/conf/caldavd-partitioning-primary.plist        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -1,85 +0,0 @@
</span><del>-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-
-&lt;!--
-    Copyright (c) 2006-2013 Apple Inc. All rights reserved.
-
-    Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-  --&gt;
-
-&lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
-&lt;plist version=&quot;1.0&quot;&gt;
-  &lt;dict&gt;
-
-    &lt;!--  Servers --&gt;
-    &lt;key&gt;Servers&lt;/key&gt;
-    &lt;dict&gt;
-            &lt;key&gt;Enabled&lt;/key&gt;
-            &lt;true/&gt;
-            &lt;key&gt;ConfigFile&lt;/key&gt;
-            &lt;string&gt;localservers.xml&lt;/string&gt;
-            &lt;key&gt;MaxClients&lt;/key&gt;
-            &lt;integer&gt;5&lt;/integer&gt;
-        &lt;/dict&gt;
-    &lt;key&gt;ServerPartitionID&lt;/key&gt;
-    &lt;string&gt;00001&lt;/string&gt;
-
-    &lt;!-- PostgreSQL ProxyDB Service --&gt;
-    &lt;key&gt;ProxyDBService&lt;/key&gt;
-    &lt;dict&gt;
-      &lt;key&gt;type&lt;/key&gt;
-      &lt;string&gt;twistedcaldav.directory.calendaruserproxy.ProxyPostgreSQLDB&lt;/string&gt;
-      
-      &lt;key&gt;params&lt;/key&gt;
-      &lt;dict&gt;
-        &lt;key&gt;host&lt;/key&gt;
-        &lt;string&gt;localhost&lt;/string&gt;
-        &lt;key&gt;database&lt;/key&gt;
-        &lt;string&gt;proxies&lt;/string&gt;
-      &lt;/dict&gt;
-    &lt;/dict&gt;
-
-    &lt;!-- Support for Memcached --&gt;
-    &lt;key&gt;Memcached&lt;/key&gt;
-    &lt;dict&gt;
-          &lt;key&gt;Pools&lt;/key&gt;
-                &lt;dict&gt;
-                  &lt;key&gt;CommonToAllNodes&lt;/key&gt;
-                  &lt;dict&gt;
-                    &lt;key&gt;ClientEnabled&lt;/key&gt;
-                    &lt;true/&gt;
-                    &lt;key&gt;ServerEnabled&lt;/key&gt;
-                    &lt;true/&gt;
-                    &lt;key&gt;BindAddress&lt;/key&gt;
-                    &lt;string&gt;localhost&lt;/string&gt;
-                    &lt;key&gt;Port&lt;/key&gt;
-                    &lt;integer&gt;11311&lt;/integer&gt;
-                    &lt;key&gt;HandleCacheTypes&lt;/key&gt;
-                    &lt;array&gt;
-                      &lt;string&gt;ProxyDB&lt;/string&gt;
-                      &lt;string&gt;PrincipalToken&lt;/string&gt;
-                      &lt;string&gt;DIGESTCREDENTIALS&lt;/string&gt;
-                    &lt;/array&gt;
-                  &lt;/dict&gt;
-                &lt;/dict&gt;
-      &lt;key&gt;MaxClients&lt;/key&gt;
-      &lt;integer&gt;5&lt;/integer&gt;
-      &lt;key&gt;memcached&lt;/key&gt;
-      &lt;string&gt;../memcached/_root/bin/memcached&lt;/string&gt; &lt;!-- Find in PATH --&gt;
-      &lt;key&gt;Options&lt;/key&gt;
-      &lt;array&gt;
-        &lt;!--&lt;string&gt;-vv&lt;/string&gt;--&gt;
-      &lt;/array&gt;
-    &lt;/dict&gt;
-
-  &lt;/dict&gt;
-&lt;/plist&gt;
</del></span></pre></div>
<a id="CalendarServertrunkconfcaldavdpartitioningsecondaryplist"></a>
<div class="delfile"><h4>Deleted: CalendarServer/trunk/conf/caldavd-partitioning-secondary.plist (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/caldavd-partitioning-secondary.plist        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/conf/caldavd-partitioning-secondary.plist        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -1,85 +0,0 @@
</span><del>-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-
-&lt;!--
-    Copyright (c) 2006-2013 Apple Inc. All rights reserved.
-
-    Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-  --&gt;
-
-&lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
-&lt;plist version=&quot;1.0&quot;&gt;
-  &lt;dict&gt;
-
-    &lt;!--  Servers --&gt;
-    &lt;key&gt;Servers&lt;/key&gt;
-    &lt;dict&gt;
-            &lt;key&gt;Enabled&lt;/key&gt;
-            &lt;true/&gt;
-            &lt;key&gt;ConfigFile&lt;/key&gt;
-            &lt;string&gt;localservers.xml&lt;/string&gt;
-            &lt;key&gt;MaxClients&lt;/key&gt;
-            &lt;integer&gt;5&lt;/integer&gt;
-        &lt;/dict&gt;
-    &lt;key&gt;ServerPartitionID&lt;/key&gt;
-    &lt;string&gt;00002&lt;/string&gt;
-
-    &lt;!-- PostgreSQL ProxyDB Service --&gt;
-    &lt;key&gt;ProxyDBService&lt;/key&gt;
-    &lt;dict&gt;
-      &lt;key&gt;type&lt;/key&gt;
-      &lt;string&gt;twistedcaldav.directory.calendaruserproxy.ProxyPostgreSQLDB&lt;/string&gt;
-      
-      &lt;key&gt;params&lt;/key&gt;
-      &lt;dict&gt;
-        &lt;key&gt;host&lt;/key&gt;
-        &lt;string&gt;localhost&lt;/string&gt;
-        &lt;key&gt;database&lt;/key&gt;
-        &lt;string&gt;proxies&lt;/string&gt;
-      &lt;/dict&gt;
-    &lt;/dict&gt;
-
-    &lt;!-- Support for Memcached --&gt;
-    &lt;key&gt;Memcached&lt;/key&gt;
-    &lt;dict&gt;
-          &lt;key&gt;Pools&lt;/key&gt;
-                &lt;dict&gt;
-                  &lt;key&gt;CommonToAllNodes&lt;/key&gt;
-                  &lt;dict&gt;
-                    &lt;key&gt;ClientEnabled&lt;/key&gt;
-                    &lt;true/&gt;
-                    &lt;key&gt;ServerEnabled&lt;/key&gt;
-                    &lt;false/&gt;
-                    &lt;key&gt;BindAddress&lt;/key&gt;
-                    &lt;string&gt;localhost&lt;/string&gt;
-                    &lt;key&gt;Port&lt;/key&gt;
-                    &lt;integer&gt;11311&lt;/integer&gt;
-                    &lt;key&gt;HandleCacheTypes&lt;/key&gt;
-                    &lt;array&gt;
-                      &lt;string&gt;ProxyDB&lt;/string&gt;
-                      &lt;string&gt;PrincipalToken&lt;/string&gt;
-                      &lt;string&gt;DIGESTCREDENTIALS&lt;/string&gt;
-                    &lt;/array&gt;
-                  &lt;/dict&gt;
-                &lt;/dict&gt;
-      &lt;key&gt;MaxClients&lt;/key&gt;
-      &lt;integer&gt;5&lt;/integer&gt;
-      &lt;key&gt;memcached&lt;/key&gt;
-      &lt;string&gt;../memcached/_root/bin/memcached&lt;/string&gt; &lt;!-- Find in PATH --&gt;
-      &lt;key&gt;Options&lt;/key&gt;
-      &lt;array&gt;
-        &lt;!--&lt;string&gt;-vv&lt;/string&gt;--&gt;
-      &lt;/array&gt;
-    &lt;/dict&gt;
-
-  &lt;/dict&gt;
-&lt;/plist&gt;
</del></span></pre></div>
<a id="CalendarServertrunkconfcaldavdtestpodAplistfromrev11900CalendarServerbranchesuserscdabooreverseproxypodsconfcaldavdtestpodAplist"></a>
<div class="copfile"><h4>Copied: CalendarServer/trunk/conf/caldavd-test-podA.plist (from rev 11900, CalendarServer/branches/users/cdaboo/reverse-proxy-pods/conf/caldavd-test-podA.plist) (0 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/caldavd-test-podA.plist                                (rev 0)
+++ CalendarServer/trunk/conf/caldavd-test-podA.plist        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -0,0 +1,158 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
+
+&lt;!--
+    Copyright (c) 2006-2009 Apple Inc. All rights reserved.
+
+    Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+  --&gt;
+
+&lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
+&lt;plist version=&quot;1.0&quot;&gt;
+  &lt;dict&gt;
+
+    &lt;!-- Import a parent config before this one --&gt;
+    &lt;key&gt;ImportConfig&lt;/key&gt;
+    &lt;string&gt;./conf/caldavd-test.plist&lt;/string&gt;
+
+    &lt;!-- HTTP port [0 = disable HTTP] --&gt;
+    &lt;key&gt;HTTPPort&lt;/key&gt;
+    &lt;integer&gt;8008&lt;/integer&gt;
+
+    &lt;!-- SSL port [0 = disable HTTPS] --&gt;
+    &lt;!-- (Must also configure SSLCertificate and SSLPrivateKey below) --&gt;
+    &lt;key&gt;SSLPort&lt;/key&gt;
+    &lt;integer&gt;8443&lt;/integer&gt;
+
+    &lt;!-- List of port numbers to bind to for HTTP [empty = same as &quot;Port&quot;] --&gt;
+    &lt;key&gt;BindHTTPPorts&lt;/key&gt;
+    &lt;array&gt;
+    &lt;/array&gt;
+
+    &lt;!-- List of port numbers to bind to for SSL [empty = same as &quot;SSLPort&quot;] --&gt;
+    &lt;key&gt;BindSSLPorts&lt;/key&gt;
+    &lt;array&gt;
+    &lt;/array&gt;
+
+    &lt;!-- Server root --&gt;
+    &lt;key&gt;ServerRoot&lt;/key&gt;
+    &lt;string&gt;./data/podA&lt;/string&gt;
+
+    &lt;!-- Configuration root --&gt;
+    &lt;key&gt;ConfigRoot&lt;/key&gt;
+    &lt;string&gt;./conf&lt;/string&gt;
+
+    &lt;!-- XML File Directory Service --&gt;
+    &lt;key&gt;DirectoryService&lt;/key&gt;
+    &lt;dict&gt;
+      &lt;key&gt;type&lt;/key&gt;
+      &lt;string&gt;twistedcaldav.directory.xmlfile.XMLDirectoryService&lt;/string&gt;
+      
+      &lt;key&gt;params&lt;/key&gt;
+      &lt;dict&gt;
+        &lt;key&gt;xmlFile&lt;/key&gt;
+        &lt;string&gt;./conf/auth/accounts-test-pod.xml&lt;/string&gt;
+      &lt;/dict&gt;
+    &lt;/dict&gt;
+    
+    &lt;!-- Resource and Location Service --&gt;
+    &lt;key&gt;ResourceService&lt;/key&gt;
+    &lt;dict&gt;
+      &lt;key&gt;Enabled&lt;/key&gt;
+      &lt;true/&gt;
+      &lt;key&gt;type&lt;/key&gt;
+      &lt;string&gt;twistedcaldav.directory.xmlfile.XMLDirectoryService&lt;/string&gt;
+      
+      &lt;key&gt;params&lt;/key&gt;
+      &lt;dict&gt;
+        &lt;key&gt;xmlFile&lt;/key&gt;
+        &lt;string&gt;./conf/auth/resources-test-pod.xml&lt;/string&gt;
+      &lt;/dict&gt;
+    &lt;/dict&gt;
+
+    &lt;!-- XML File Augment Service --&gt;
+    &lt;key&gt;AugmentService&lt;/key&gt;
+    &lt;dict&gt;
+      &lt;key&gt;type&lt;/key&gt;
+      &lt;string&gt;twistedcaldav.directory.augment.AugmentXMLDB&lt;/string&gt;
+      
+      &lt;key&gt;params&lt;/key&gt;
+      &lt;dict&gt;
+        &lt;key&gt;xmlFiles&lt;/key&gt;
+        &lt;array&gt;
+              &lt;string&gt;./conf/auth/augments-test-pod.xml&lt;/string&gt;
+        &lt;/array&gt;
+      &lt;/dict&gt;
+    &lt;/dict&gt;
+
+    &lt;key&gt;ProxyLoadFromFile&lt;/key&gt;
+    &lt;string&gt;./conf/auth/proxies-test-pod.xml&lt;/string&gt;
+
+    &lt;!--  Servers --&gt;
+    &lt;key&gt;Servers&lt;/key&gt;
+    &lt;dict&gt;
+            &lt;key&gt;Enabled&lt;/key&gt;
+            &lt;true/&gt;
+            &lt;key&gt;ConfigFile&lt;/key&gt;
+            &lt;string&gt;./conf/localservers-test.xml&lt;/string&gt;
+            &lt;key&gt;MaxClients&lt;/key&gt;
+            &lt;integer&gt;5&lt;/integer&gt;
+            &lt;key&gt;InboxName&lt;/key&gt;
+            &lt;string&gt;podding&lt;/string&gt;
+        &lt;/dict&gt;
+
+    &lt;!-- Support for Memcached --&gt;
+    &lt;key&gt;Memcached&lt;/key&gt;
+    &lt;dict&gt;
+          &lt;key&gt;Pools&lt;/key&gt;
+                &lt;dict&gt;
+                  &lt;key&gt;Default&lt;/key&gt;
+                  &lt;dict&gt;
+                    &lt;key&gt;ClientEnabled&lt;/key&gt;
+                    &lt;true/&gt;
+                    &lt;key&gt;ServerEnabled&lt;/key&gt;
+                    &lt;true/&gt;
+                    &lt;key&gt;BindAddress&lt;/key&gt;
+                    &lt;string&gt;localhost&lt;/string&gt;
+                    &lt;key&gt;Port&lt;/key&gt;
+                    &lt;integer&gt;11211&lt;/integer&gt;
+                  &lt;/dict&gt;
+                  &lt;key&gt;ProxyDB&lt;/key&gt;
+                  &lt;dict&gt;
+                    &lt;key&gt;ClientEnabled&lt;/key&gt;
+                    &lt;true/&gt;
+                    &lt;key&gt;ServerEnabled&lt;/key&gt;
+                    &lt;true/&gt;
+                    &lt;key&gt;BindAddress&lt;/key&gt;
+                    &lt;string&gt;localhost&lt;/string&gt;
+                    &lt;key&gt;Port&lt;/key&gt;
+                    &lt;integer&gt;11311&lt;/integer&gt;
+                    &lt;key&gt;HandleCacheTypes&lt;/key&gt;
+                    &lt;array&gt;
+                      &lt;string&gt;ProxyDB&lt;/string&gt;
+                      &lt;string&gt;PrincipalToken&lt;/string&gt;
+                      &lt;string&gt;DIGESTCREDENTIALS&lt;/string&gt;
+                    &lt;/array&gt;
+                  &lt;/dict&gt;
+                &lt;/dict&gt;
+      &lt;key&gt;MaxClients&lt;/key&gt;
+      &lt;integer&gt;5&lt;/integer&gt;
+      &lt;key&gt;memcached&lt;/key&gt;
+      &lt;string&gt;../memcached/_root/bin/memcached&lt;/string&gt; &lt;!-- Find in PATH --&gt;
+      &lt;key&gt;Options&lt;/key&gt;
+      &lt;array&gt;
+        &lt;!--&lt;string&gt;-vv&lt;/string&gt;--&gt;
+      &lt;/array&gt;
+    &lt;/dict&gt;
+
+  &lt;/dict&gt;
+&lt;/plist&gt;
</ins></span></pre></div>
<a id="CalendarServertrunkconfcaldavdtestpodBplistfromrev11900CalendarServerbranchesuserscdabooreverseproxypodsconfcaldavdtestpodBplist"></a>
<div class="copfile"><h4>Copied: CalendarServer/trunk/conf/caldavd-test-podB.plist (from rev 11900, CalendarServer/branches/users/cdaboo/reverse-proxy-pods/conf/caldavd-test-podB.plist) (0 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/caldavd-test-podB.plist                                (rev 0)
+++ CalendarServer/trunk/conf/caldavd-test-podB.plist        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -0,0 +1,158 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
+
+&lt;!--
+    Copyright (c) 2006-2009 Apple Inc. All rights reserved.
+
+    Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+  --&gt;
+
+&lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
+&lt;plist version=&quot;1.0&quot;&gt;
+  &lt;dict&gt;
+
+    &lt;!-- Import a parent config before this one --&gt;
+    &lt;key&gt;ImportConfig&lt;/key&gt;
+    &lt;string&gt;./conf/caldavd-test.plist&lt;/string&gt;
+
+    &lt;!-- HTTP port [0 = disable HTTP] --&gt;
+    &lt;key&gt;HTTPPort&lt;/key&gt;
+    &lt;integer&gt;8108&lt;/integer&gt;
+
+    &lt;!-- SSL port [0 = disable HTTPS] --&gt;
+    &lt;!-- (Must also configure SSLCertificate and SSLPrivateKey below) --&gt;
+    &lt;key&gt;SSLPort&lt;/key&gt;
+    &lt;integer&gt;8543&lt;/integer&gt;
+
+    &lt;!-- List of port numbers to bind to for HTTP [empty = same as &quot;Port&quot;] --&gt;
+    &lt;key&gt;BindHTTPPorts&lt;/key&gt;
+    &lt;array&gt;
+    &lt;/array&gt;
+
+    &lt;!-- List of port numbers to bind to for SSL [empty = same as &quot;SSLPort&quot;] --&gt;
+    &lt;key&gt;BindSSLPorts&lt;/key&gt;
+    &lt;array&gt;
+    &lt;/array&gt;
+
+    &lt;!-- Server root --&gt;
+    &lt;key&gt;ServerRoot&lt;/key&gt;
+    &lt;string&gt;./data/podB&lt;/string&gt;
+
+    &lt;!-- Configuration root --&gt;
+    &lt;key&gt;ConfigRoot&lt;/key&gt;
+    &lt;string&gt;./conf&lt;/string&gt;
+
+    &lt;!-- XML File Directory Service --&gt;
+    &lt;key&gt;DirectoryService&lt;/key&gt;
+    &lt;dict&gt;
+      &lt;key&gt;type&lt;/key&gt;
+      &lt;string&gt;twistedcaldav.directory.xmlfile.XMLDirectoryService&lt;/string&gt;
+      
+      &lt;key&gt;params&lt;/key&gt;
+      &lt;dict&gt;
+        &lt;key&gt;xmlFile&lt;/key&gt;
+        &lt;string&gt;./conf/auth/accounts-test-pod.xml&lt;/string&gt;
+      &lt;/dict&gt;
+    &lt;/dict&gt;
+    
+    &lt;!-- Resource and Location Service --&gt;
+    &lt;key&gt;ResourceService&lt;/key&gt;
+    &lt;dict&gt;
+      &lt;key&gt;Enabled&lt;/key&gt;
+      &lt;true/&gt;
+      &lt;key&gt;type&lt;/key&gt;
+      &lt;string&gt;twistedcaldav.directory.xmlfile.XMLDirectoryService&lt;/string&gt;
+      
+      &lt;key&gt;params&lt;/key&gt;
+      &lt;dict&gt;
+        &lt;key&gt;xmlFile&lt;/key&gt;
+        &lt;string&gt;./conf/auth/resources-test-pod.xml&lt;/string&gt;
+      &lt;/dict&gt;
+    &lt;/dict&gt;
+
+    &lt;!-- XML File Augment Service --&gt;
+    &lt;key&gt;AugmentService&lt;/key&gt;
+    &lt;dict&gt;
+      &lt;key&gt;type&lt;/key&gt;
+      &lt;string&gt;twistedcaldav.directory.augment.AugmentXMLDB&lt;/string&gt;
+      
+      &lt;key&gt;params&lt;/key&gt;
+      &lt;dict&gt;
+        &lt;key&gt;xmlFiles&lt;/key&gt;
+        &lt;array&gt;
+              &lt;string&gt;./conf/auth/augments-test-pod.xml&lt;/string&gt;
+        &lt;/array&gt;
+      &lt;/dict&gt;
+    &lt;/dict&gt;
+
+    &lt;key&gt;ProxyLoadFromFile&lt;/key&gt;
+    &lt;string&gt;./conf/auth/proxies-test-pod.xml&lt;/string&gt;
+
+    &lt;!--  Servers --&gt;
+    &lt;key&gt;Servers&lt;/key&gt;
+    &lt;dict&gt;
+            &lt;key&gt;Enabled&lt;/key&gt;
+            &lt;true/&gt;
+            &lt;key&gt;ConfigFile&lt;/key&gt;
+            &lt;string&gt;./conf/localservers-test.xml&lt;/string&gt;
+            &lt;key&gt;MaxClients&lt;/key&gt;
+            &lt;integer&gt;5&lt;/integer&gt;
+            &lt;key&gt;InboxName&lt;/key&gt;
+            &lt;string&gt;podding&lt;/string&gt;
+        &lt;/dict&gt;
+
+    &lt;!-- Support for Memcached --&gt;
+    &lt;key&gt;Memcached&lt;/key&gt;
+    &lt;dict&gt;
+          &lt;key&gt;Pools&lt;/key&gt;
+                &lt;dict&gt;
+                  &lt;key&gt;Default&lt;/key&gt;
+                  &lt;dict&gt;
+                    &lt;key&gt;ClientEnabled&lt;/key&gt;
+                    &lt;true/&gt;
+                    &lt;key&gt;ServerEnabled&lt;/key&gt;
+                    &lt;true/&gt;
+                    &lt;key&gt;BindAddress&lt;/key&gt;
+                    &lt;string&gt;localhost&lt;/string&gt;
+                    &lt;key&gt;Port&lt;/key&gt;
+                    &lt;integer&gt;11411&lt;/integer&gt;
+                  &lt;/dict&gt;
+                  &lt;key&gt;ProxyDB&lt;/key&gt;
+                  &lt;dict&gt;
+                    &lt;key&gt;ClientEnabled&lt;/key&gt;
+                    &lt;true/&gt;
+                    &lt;key&gt;ServerEnabled&lt;/key&gt;
+                    &lt;true/&gt;
+                    &lt;key&gt;BindAddress&lt;/key&gt;
+                    &lt;string&gt;localhost&lt;/string&gt;
+                    &lt;key&gt;Port&lt;/key&gt;
+                    &lt;integer&gt;11311&lt;/integer&gt;
+                    &lt;key&gt;HandleCacheTypes&lt;/key&gt;
+                    &lt;array&gt;
+                      &lt;string&gt;ProxyDB&lt;/string&gt;
+                      &lt;string&gt;PrincipalToken&lt;/string&gt;
+                      &lt;string&gt;DIGESTCREDENTIALS&lt;/string&gt;
+                    &lt;/array&gt;
+                  &lt;/dict&gt;
+                &lt;/dict&gt;
+      &lt;key&gt;MaxClients&lt;/key&gt;
+      &lt;integer&gt;5&lt;/integer&gt;
+      &lt;key&gt;memcached&lt;/key&gt;
+      &lt;string&gt;../memcached/_root/bin/memcached&lt;/string&gt; &lt;!-- Find in PATH --&gt;
+      &lt;key&gt;Options&lt;/key&gt;
+      &lt;array&gt;
+        &lt;!--&lt;string&gt;-vv&lt;/string&gt;--&gt;
+      &lt;/array&gt;
+    &lt;/dict&gt;
+
+  &lt;/dict&gt;
+&lt;/plist&gt;
</ins></span></pre></div>
<a id="CalendarServertrunkconflocalserverstestxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/conf/localservers-test.xml (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/localservers-test.xml        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/conf/localservers-test.xml        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -16,21 +16,19 @@
</span><span class="cx"> limitations under the License.
</span><span class="cx">  --&gt;
</span><span class="cx"> 
</span><del>-&lt;!DOCTYPE servers SYSTEM &quot;servers.dtd&quot;&gt;
</del><ins>+&lt;!DOCTYPE servers SYSTEM &quot;localservers.dtd&quot;&gt;
</ins><span class="cx"> 
</span><span class="cx"> &lt;servers&gt;
</span><span class="cx">   &lt;server&gt;
</span><del>-    &lt;id&gt;00001&lt;/id&gt;
</del><ins>+    &lt;id&gt;A&lt;/id&gt;
</ins><span class="cx">     &lt;uri&gt;http://localhost:8008&lt;/uri&gt;
</span><del>-    &lt;partitions&gt;
-            &lt;partition&gt;
-                    &lt;id&gt;00001&lt;/id&gt;
-                    &lt;uri&gt;http://localhost:8008&lt;/uri&gt;
-            &lt;/partition&gt;
-            &lt;partition&gt;
-                    &lt;id&gt;00002&lt;/id&gt;
-                    &lt;uri&gt;http://localhost:8108&lt;/uri&gt;
-            &lt;/partition&gt;
-    &lt;/partitions&gt;
</del><ins>+    &lt;allowed-from&gt;localhost&lt;/allowed-from&gt;
+    &lt;shared-secret&gt;A&lt;/shared-secret&gt;
</ins><span class="cx">   &lt;/server&gt;
</span><ins>+  &lt;server&gt;
+    &lt;id&gt;B&lt;/id&gt;
+    &lt;uri&gt;http://localhost:8108&lt;/uri&gt;
+    &lt;allowed-from&gt;localhost&lt;/allowed-from&gt;
+    &lt;shared-secret&gt;B&lt;/shared-secret&gt;
+  &lt;/server&gt;
</ins><span class="cx"> &lt;/servers&gt;
</span></span></pre></div>
<a id="CalendarServertrunkconflocalserversdtdfromrev11900CalendarServerbranchesuserscdabooreverseproxypodsconflocalserversdtd"></a>
<div class="copfile"><h4>Copied: CalendarServer/trunk/conf/localservers.dtd (from rev 11900, CalendarServer/branches/users/cdaboo/reverse-proxy-pods/conf/localservers.dtd) (0 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/localservers.dtd                                (rev 0)
+++ CalendarServer/trunk/conf/localservers.dtd        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -0,0 +1,25 @@
</span><ins>+&lt;!--
+Copyright (c) 2011-2013 Apple Inc. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+--&gt;
+
+&lt;!ELEMENT servers (server*) &gt;
+
+        &lt;!ELEMENT server (id, uri, allowed-from*, shared-secret?) &gt;
+                &lt;!ATTLIST server implicit (yes|no) &quot;yes&quot;&gt;
+
+                &lt;!ELEMENT id  (#PCDATA) &gt;
+                &lt;!ELEMENT uri (#PCDATA) &gt;
+                &lt;!ELEMENT allowed-from (#PCDATA) &gt;
+                &lt;!ELEMENT shared-secret (#PCDATA) &gt;
</ins></span></pre></div>
<a id="CalendarServertrunkconflocalserversxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/conf/localservers.xml (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/localservers.xml        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/conf/localservers.xml        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -16,7 +16,7 @@
</span><span class="cx"> limitations under the License.
</span><span class="cx">  --&gt;
</span><span class="cx"> 
</span><del>-&lt;!DOCTYPE servers SYSTEM &quot;servers.dtd&quot;&gt;
</del><ins>+&lt;!DOCTYPE servers SYSTEM &quot;localservers.dtd&quot;&gt;
</ins><span class="cx"> 
</span><span class="cx"> &lt;servers&gt;
</span><span class="cx">   &lt;!--
</span><span class="lines">@@ -30,16 +30,6 @@
</span><span class="cx">     &lt;allowed-from&gt;127.0.0.1&lt;/allowed-from&gt;
</span><span class="cx">     &lt;allowed-from&gt;example.local&lt;/allowed-from&gt;
</span><span class="cx">     &lt;shared-secret&gt;ABC&lt;/shared-secret&gt;
</span><del>-    &lt;partitions&gt;
-            &lt;partition&gt;
-                    &lt;id&gt;00001&lt;/id&gt;
-                    &lt;url&gt;https://machine1.example.com:8443&lt;/url&gt;
-            &lt;/partition&gt;
-            &lt;partition&gt;
-                    &lt;id&gt;00002&lt;/id&gt;
-                    &lt;url&gt;https://machine2.example.com:8443&lt;/url&gt;
-            &lt;/partition&gt;
-    &lt;/partitions&gt;
</del><span class="cx">   &lt;/server&gt;
</span><span class="cx">   --&gt;
</span><span class="cx"> &lt;/servers&gt;
</span></span></pre></div>
<a id="CalendarServertrunkconfremoteserverstestxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/conf/remoteservers-test.xml (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/remoteservers-test.xml        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/conf/remoteservers-test.xml        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -16,7 +16,7 @@
</span><span class="cx"> limitations under the License.
</span><span class="cx">  --&gt;
</span><span class="cx"> 
</span><del>-&lt;!DOCTYPE servers SYSTEM &quot;servertoserver.dtd&quot;&gt;
</del><ins>+&lt;!DOCTYPE servers SYSTEM &quot;remoteservers.dtd&quot;&gt;
</ins><span class="cx"> 
</span><span class="cx"> &lt;servers&gt;
</span><span class="cx">   &lt;server&gt;
</span></span></pre></div>
<a id="CalendarServertrunkconfremoteserversdtdfromrev11900CalendarServerbranchesuserscdabooreverseproxypodsconfremoteserversdtd"></a>
<div class="copfile"><h4>Copied: CalendarServer/trunk/conf/remoteservers.dtd (from rev 11900, CalendarServer/branches/users/cdaboo/reverse-proxy-pods/conf/remoteservers.dtd) (0 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/remoteservers.dtd                                (rev 0)
+++ CalendarServer/trunk/conf/remoteservers.dtd        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+&lt;!--
+Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+--&gt;
+
+&lt;!ELEMENT servers (server*) &gt;
+
+        &lt;!ELEMENT server (uri, authentication?, allow-requests-from, allow-requests-to, domains?, hosts?) &gt;
+
+                &lt;!ELEMENT uri (#PCDATA) &gt;
+                &lt;!ELEMENT authentication (user, password) &gt;
+                    &lt;!ATTLIST authentication type (basic) &quot;&quot;&gt;
+                    &lt;!ELEMENT user (#PCDATA) &gt;
+                    &lt;!ELEMENT password (#PCDATA) &gt;
+
+                &lt;!ELEMENT allow-requests-from EMPTY &gt;
+                &lt;!ELEMENT allow-requests-to EMPTY &gt;
+                &lt;!ELEMENT domains (domain*) &gt;
+                        &lt;!ELEMENT domain (#PCDATA) &gt;
+                &lt;!ELEMENT hosts (host*) &gt;
+                        &lt;!ELEMENT host (#PCDATA) &gt;
+                        
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="CalendarServertrunkconfremoteserversxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/conf/remoteservers.xml (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/remoteservers.xml        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/conf/remoteservers.xml        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -16,7 +16,7 @@
</span><span class="cx"> limitations under the License.
</span><span class="cx">  --&gt;
</span><span class="cx"> 
</span><del>-&lt;!DOCTYPE servers SYSTEM &quot;servertoserver.dtd&quot;&gt;
</del><ins>+&lt;!DOCTYPE servers SYSTEM &quot;remoteservers.dtd&quot;&gt;
</ins><span class="cx"> 
</span><span class="cx"> &lt;servers&gt;
</span><span class="cx">   &lt;!--
</span></span></pre></div>
<a id="CalendarServertrunkconfresourcescaldavdresourcesplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/conf/resources/caldavd-resources.plist (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/resources/caldavd-resources.plist        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/conf/resources/caldavd-resources.plist        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -174,7 +174,6 @@
</span><span class="cx">         Augments for the directory service records to add calendar specific attributes.
</span><span class="cx"> 
</span><span class="cx">         A variety of augment services are available for use.
</span><del>-        When using a partitioned server, a service that can be accessed from each host will be needed.
</del><span class="cx">       --&gt;
</span><span class="cx"> 
</span><span class="cx">     &lt;!-- XML File Augment Service --&gt;
</span></span></pre></div>
<a id="CalendarServertrunkconfserversdtd"></a>
<div class="delfile"><h4>Deleted: CalendarServer/trunk/conf/servers.dtd (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/servers.dtd        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/conf/servers.dtd        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -1,28 +0,0 @@
</span><del>-&lt;!--
-Copyright (c) 2011-2013 Apple Inc. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
---&gt;
-
-&lt;!ELEMENT servers (server*) &gt;
-
-        &lt;!ELEMENT server (id, uri, allowed-from*, shared-secret?, partitions?) &gt;
-                &lt;!ATTLIST server implicit (yes|no) &quot;yes&quot;&gt;
-
-                &lt;!ELEMENT id  (#PCDATA) &gt;
-                &lt;!ELEMENT uri (#PCDATA) &gt;
-                &lt;!ELEMENT allowed-from (#PCDATA) &gt;
-                &lt;!ELEMENT shared-secret (#PCDATA) &gt;
-
-                &lt;!ELEMENT partitions (partition*) &gt;
-                        &lt;!ELEMENT partition (id, uri) &gt;
</del></span></pre></div>
<a id="CalendarServertrunkconfservertoserverdtd"></a>
<div class="delfile"><h4>Deleted: CalendarServer/trunk/conf/servertoserver.dtd (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/servertoserver.dtd        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/conf/servertoserver.dtd        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -1,33 +0,0 @@
</span><del>-&lt;!--
-Copyright (c) 2006-2013 Apple Inc. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
---&gt;
-
-&lt;!ELEMENT servers (server*) &gt;
-
-        &lt;!ELEMENT server (uri, authentication?, allow-requests-from, allow-requests-to, domains?, hosts?) &gt;
-
-                &lt;!ELEMENT uri (#PCDATA) &gt;
-                &lt;!ELEMENT authentication (user, password) &gt;
-                    &lt;!ATTLIST authentication type (basic) &quot;&quot;&gt;
-                    &lt;!ELEMENT user (#PCDATA) &gt;
-                    &lt;!ELEMENT password (#PCDATA) &gt;
-
-                &lt;!ELEMENT allow-requests-from EMPTY &gt;
-                &lt;!ELEMENT allow-requests-to EMPTY &gt;
-                &lt;!ELEMENT domains (domain*) &gt;
-                        &lt;!ELEMENT domain (#PCDATA) &gt;
-                &lt;!ELEMENT hosts (host*) &gt;
-                        &lt;!ELEMENT host (#PCDATA) &gt;
-                        
</del><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="CalendarServertrunkconfsudoersplist"></a>
<div class="delfile"><h4>Deleted: CalendarServer/trunk/conf/sudoers.plist (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/conf/sudoers.plist        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/conf/sudoers.plist        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -1,42 +0,0 @@
</span><del>-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-&lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
-&lt;plist version=&quot;1.0&quot;&gt;
-&lt;dict&gt;
-&lt;key&gt;users&lt;/key&gt;
-&lt;array&gt;
-&lt;!-- Sudo user definitions --&gt;
-&lt;!-- With the exception of username and password none of the following
-     elements are used in the current implementation. --&gt;
-&lt;!--
-  &lt;dict&gt;
-    &lt;key&gt;authorize-as&lt;/key&gt;
-    &lt;dict&gt;
-      &lt;key&gt;allow&lt;/key&gt;
-      &lt;true/&gt;
-      &lt;key&gt;principals&lt;/key&gt;
-      &lt;array&gt;
-        &lt;string&gt;all&lt;/string&gt;
-        &lt;string&gt;/principals/user/wsanchez&lt;/string&gt;
-      &lt;/array&gt;
-    &lt;/dict&gt;
-    &lt;key&gt;authorize-from&lt;/key&gt;
-    &lt;array&gt;
-      &lt;string&gt;127.0.0.1&lt;/string&gt;
-    &lt;/array&gt;
-
-    &lt;key&gt;username&lt;/key&gt;
-    &lt;string&gt;&lt;/string&gt;
-
-    &lt;key&gt;password&lt;/key&gt;
-    &lt;string&gt;&lt;/string&gt;
-  &lt;/dict&gt;
---&gt;
-  &lt;dict&gt;
-    &lt;key&gt;username&lt;/key&gt;
-    &lt;string&gt;superuser&lt;/string&gt;
-    &lt;key&gt;password&lt;/key&gt;
-    &lt;string&gt;superuser&lt;/string&gt;
-  &lt;/dict&gt;
-&lt;/array&gt;
-&lt;/dict&gt;
-&lt;/plist&gt;
</del></span></pre></div>
<a id="CalendarServertrunkcontribtoolsrequest_monitorpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/contrib/tools/request_monitor.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/contrib/tools/request_monitor.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/contrib/tools/request_monitor.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -303,8 +303,6 @@
</span><span class="cx">     print(&quot;--procs N  specifies how many python processes are expected in the log file (default: 80)&quot;)
</span><span class="cx">     print(&quot;--top N    how many long requests to print (default: 10)&quot;)
</span><span class="cx">     print(&quot;--users N  how many top users to print (default: 5)&quot;)
</span><del>-    print(&quot;--router   analyze a partition server router node&quot;)
-    print(&quot;--worker   analyze a partition server worker node&quot;)
</del><span class="cx">     print(&quot;&quot;)
</span><span class="cx">     print(&quot;Version: 5&quot;)
</span><span class="cx"> 
</span><span class="lines">@@ -313,19 +311,13 @@
</span><span class="cx"> numTop = 10
</span><span class="cx"> numUsers = 5
</span><span class="cx"> lineRange = None
</span><del>-router = False
-worker = False
-options, args = getopt.getopt(sys.argv[1:], &quot;h&quot;, [&quot;debug&quot;, &quot;router&quot;, &quot;worker&quot;, &quot;lines=&quot;, &quot;range=&quot;, &quot;procs=&quot;, &quot;top=&quot;, &quot;users=&quot;])
</del><ins>+options, args = getopt.getopt(sys.argv[1:], &quot;h&quot;, [&quot;debug&quot;, &quot;lines=&quot;, &quot;range=&quot;, &quot;procs=&quot;, &quot;top=&quot;, &quot;users=&quot;])
</ins><span class="cx"> for option, value in options:
</span><span class="cx">     if option == &quot;-h&quot;:
</span><span class="cx">         usage()
</span><span class="cx">         sys.exit(0)
</span><span class="cx">     elif option == &quot;--debug&quot;:
</span><span class="cx">         debug = True
</span><del>-    elif option == &quot;--router&quot;:
-        router = True
-    elif option == &quot;--worker&quot;:
-        worker = True
</del><span class="cx">     elif option == &quot;--lines&quot;:
</span><span class="cx">         numLines = int(value)
</span><span class="cx">     elif option == &quot;--range&quot;:
</span></span></pre></div>
<a id="CalendarServertrunksetuppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/setup.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/setup.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/setup.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -145,7 +145,6 @@
</span><span class="cx">                              &quot;bin/calendarserver_export&quot;,
</span><span class="cx">                             #&quot;bin/calendarserver_icalendar_validate&quot;,
</span><span class="cx">                             #&quot;bin/calendarserver_load_augmentdb&quot;,
</span><del>-                            #&quot;bin/calendarserver_make_partition&quot;,
</del><span class="cx">                             #&quot;bin/calendarserver_manage_postgres&quot;,
</span><span class="cx">                              &quot;bin/calendarserver_manage_principals&quot;,
</span><span class="cx">                              &quot;bin/calendarserver_manage_push&quot;,
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavconfigpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/config.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/config.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/config.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -97,6 +97,9 @@
</span><span class="cx">             self._defaults = ConfigDict()
</span><span class="cx">         else:
</span><span class="cx">             self._defaults = ConfigDict(copy.deepcopy(defaults))
</span><ins>+        self.importedFiles = []
+        self.includedFiles = []
+        self.missingFiles = []
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def getDefaults(self):
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectoryaugmentpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/directory/augment.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/augment.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/augment.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -25,11 +25,11 @@
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav.config import fullServerPath, config
</span><del>-from twistedcaldav.database import AbstractADBAPIDatabase, ADBAPISqliteMixin,\
</del><ins>+from twistedcaldav.database import AbstractADBAPIDatabase, ADBAPISqliteMixin, \
</ins><span class="cx">     ADBAPIPostgreSQLMixin
</span><span class="cx"> from twistedcaldav.directory import xmlaugmentsparser
</span><span class="cx"> from twistedcaldav.directory.xmlaugmentsparser import XMLAugmentsParser
</span><del>-from twistedcaldav.xmlutil import newElementTreeWithRoot, addSubElement,\
</del><ins>+from twistedcaldav.xmlutil import newElementTreeWithRoot, addSubElement, \
</ins><span class="cx">     writeXML, readXML
</span><span class="cx"> from twistedcaldav.directory.util import normalizeUUID
</span><span class="cx"> 
</span><span class="lines">@@ -56,7 +56,6 @@
</span><span class="cx">         uid,
</span><span class="cx">         enabled=False,
</span><span class="cx">         serverID=&quot;&quot;,
</span><del>-        partitionID=&quot;&quot;,
</del><span class="cx">         enabledForCalendaring=False,
</span><span class="cx">         autoSchedule=False,
</span><span class="cx">         autoScheduleMode=&quot;default&quot;,
</span><span class="lines">@@ -67,7 +66,6 @@
</span><span class="cx">         self.uid = uid
</span><span class="cx">         self.enabled = enabled
</span><span class="cx">         self.serverID = serverID
</span><del>-        self.partitionID = partitionID
</del><span class="cx">         self.enabledForCalendaring = enabledForCalendaring
</span><span class="cx">         self.enabledForAddressBooks = enabledForAddressBooks
</span><span class="cx">         self.enabledForLogin = enabledForLogin
</span><span class="lines">@@ -87,9 +85,9 @@
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Abstract base class for an augment record database.
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    
</del><ins>+
</ins><span class="cx">     def __init__(self):
</span><del>-        
</del><ins>+
</ins><span class="cx">         self.cachedRecords = {}
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -126,10 +124,10 @@
</span><span class="cx"> 
</span><span class="cx">         @param uid: directory UID to lookup
</span><span class="cx">         @type uid: C{str}
</span><del>-        
</del><ins>+
</ins><span class="cx">         @return: L{Deferred}
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        
</del><ins>+
</ins><span class="cx">         recordType = recordTypesMap[recordType]
</span><span class="cx"> 
</span><span class="cx">         result = (yield self._lookupAugmentRecord(uid))
</span><span class="lines">@@ -166,6 +164,7 @@
</span><span class="cx">         result.clonedFromDefault = True
</span><span class="cx">         returnValue(result)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def getAllUIDs(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -173,21 +172,23 @@
</span><span class="cx"> 
</span><span class="cx">         @return: L{Deferred}
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        
</del><ins>+
</ins><span class="cx">         raise NotImplementedError(&quot;Child class must define this.&quot;)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def _lookupAugmentRecord(self, uid):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Get an AugmentRecord for the specified UID.
</span><span class="cx"> 
</span><span class="cx">         @param uid: directory UID to lookup
</span><span class="cx">         @type uid: C{str}
</span><del>-        
</del><ins>+
</ins><span class="cx">         @return: L{Deferred}
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        
</del><ins>+
</ins><span class="cx">         raise NotImplementedError(&quot;Child class must define this.&quot;)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _cachedAugmentRecord(self, uid):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -195,59 +196,64 @@
</span><span class="cx"> 
</span><span class="cx">         @param uid: directory UID to lookup
</span><span class="cx">         @type uid: C{str}
</span><del>-        
</del><ins>+
</ins><span class="cx">         @return: L{Deferred}
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        
</del><ins>+
</ins><span class="cx">         if not uid in self.cachedRecords:
</span><span class="cx">             result = (yield self._lookupAugmentRecord(uid))
</span><span class="cx">             self.cachedRecords[uid] = result
</span><span class="cx">         returnValue(self.cachedRecords[uid])
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def addAugmentRecords(self, records):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Add an AugmentRecord to the DB.
</span><span class="cx"> 
</span><span class="cx">         @param record: augment records to add
</span><span class="cx">         @type record: C{list} of L{AugmentRecord}
</span><del>-        
</del><ins>+
</ins><span class="cx">         @return: L{Deferred}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         raise NotImplementedError(&quot;Child class must define this.&quot;)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def removeAugmentRecords(self, uids):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Remove AugmentRecords with the specified UIDs.
</span><span class="cx"> 
</span><span class="cx">         @param uid: directory UIDs to remove
</span><span class="cx">         @type uid: C{list} of C{str}
</span><del>-        
</del><ins>+
</ins><span class="cx">         @return: L{Deferred}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         raise NotImplementedError(&quot;Child class must define this.&quot;)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def refresh(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Refresh any cached data.
</span><del>-        
</del><ins>+
</ins><span class="cx">         @return: L{Deferred}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         self.cachedRecords.clear()
</span><span class="cx">         return succeed(None)
</span><del>-    
</del><ins>+
+
</ins><span class="cx">     def clean(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Remove all records.
</span><del>-        
</del><ins>+
</ins><span class="cx">         @return: L{Deferred}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         raise NotImplementedError(&quot;Child class must define this.&quot;)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class AugmentXMLDB(AugmentDB):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     XMLFile based augment database implementation.
</span><span class="lines">@@ -257,7 +263,7 @@
</span><span class="cx"> 
</span><span class="cx">         super(AugmentXMLDB, self).__init__()
</span><span class="cx">         self.xmlFiles = [fullServerPath(config.DataRoot, path) for path in xmlFiles]
</span><del>-        self.xmlFileStats = { }
</del><ins>+        self.xmlFileStats = {}
</ins><span class="cx">         for path in self.xmlFiles:
</span><span class="cx">             self.xmlFileStats[path] = (0, 0) # mtime, size
</span><span class="cx"> 
</span><span class="lines">@@ -290,16 +296,17 @@
</span><span class="cx"> 
</span><span class="cx">         @param uid: directory UID to lookup
</span><span class="cx">         @type uid: C{str}
</span><del>-        
</del><ins>+
</ins><span class="cx">         @return: L{Deferred}
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        
</del><ins>+
</ins><span class="cx">         # May need to re-cache
</span><span class="cx">         if time.time() - self.lastCached &gt; self.statSeconds:
</span><span class="cx">             self.refresh()
</span><del>-            
</del><ins>+
</ins><span class="cx">         return succeed(self.db.get(uid))
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def addAugmentRecords(self, records):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Add an AugmentRecord to the DB.
</span><span class="lines">@@ -308,13 +315,13 @@
</span><span class="cx">         @type records: C{list} of L{AugmentRecord}
</span><span class="cx">         @param update: C{True} if changing an existing record
</span><span class="cx">         @type update: C{bool}
</span><del>-        
</del><ins>+
</ins><span class="cx">         @return: L{Deferred}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         # Look at each record and determine whether it is new or a modify
</span><span class="cx">         new_records = list()
</span><del>-        existing_records = list() 
</del><ins>+        existing_records = list()
</ins><span class="cx">         for record in records:
</span><span class="cx">             (existing_records if record.uid in self.db else new_records).append(record)
</span><span class="cx"> 
</span><span class="lines">@@ -332,6 +339,7 @@
</span><span class="cx"> 
</span><span class="cx">         return succeed(None)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def _doAddToFile(self, xmlfile, records):
</span><span class="cx"> 
</span><span class="cx">         if not os.path.exists(xmlfile):
</span><span class="lines">@@ -343,7 +351,6 @@
</span><span class="cx">             for record in self.db.itervalues():
</span><span class="cx">                 self._addRecordToXMLDB(record, augments_node)
</span><span class="cx"> 
</span><del>-
</del><span class="cx">             writeXML(xmlfile, augments_node)
</span><span class="cx"> 
</span><span class="cx">             # Set permissions
</span><span class="lines">@@ -362,33 +369,33 @@
</span><span class="cx">             if uid != -1 and gid != -1:
</span><span class="cx">                 os.chown(xmlfile, uid, gid)
</span><span class="cx"> 
</span><del>-
</del><span class="cx">         _ignore_etree, augments_node = readXML(xmlfile)
</span><span class="cx"> 
</span><span class="cx">         # Create new record
</span><span class="cx">         for record in records:
</span><span class="cx">             self._addRecordToXMLDB(record, augments_node)
</span><del>-        
</del><ins>+
</ins><span class="cx">         # Modify xmlfile
</span><span class="cx">         writeXML(xmlfile, augments_node)
</span><del>-        
</del><ins>+
+
</ins><span class="cx">     def _doModifyInFile(self, xmlfile, records):
</span><del>-    
</del><ins>+
</ins><span class="cx">         if not os.path.exists(xmlfile):
</span><span class="cx">             return
</span><span class="cx"> 
</span><span class="cx">         _ignore_etree, augments_node = readXML(xmlfile)
</span><del>-    
</del><ins>+
</ins><span class="cx">         # Map uid-&gt;record for fast lookup
</span><span class="cx">         recordMap = dict([(record.uid, record) for record in records])
</span><span class="cx"> 
</span><span class="cx">         # Make sure UID is present
</span><span class="cx">         changed = False
</span><span class="cx">         for record_node in augments_node:
</span><del>-            
</del><ins>+
</ins><span class="cx">             if record_node.tag != xmlaugmentsparser.ELEMENT_RECORD:
</span><span class="cx">                 continue
</span><del>-    
</del><ins>+
</ins><span class="cx">             uid = record_node.find(xmlaugmentsparser.ELEMENT_UID).text
</span><span class="cx">             if uid in recordMap:
</span><span class="cx">                 # Modify record
</span><span class="lines">@@ -400,13 +407,14 @@
</span><span class="cx">         if changed:
</span><span class="cx">             writeXML(xmlfile, augments_node)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def removeAugmentRecords(self, uids):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Remove AugmentRecords with the specified UIDs.
</span><span class="cx"> 
</span><span class="cx">         @param uids: list of uids to remove
</span><span class="cx">         @type uids: C{list} of C{str}
</span><del>-        
</del><ins>+
</ins><span class="cx">         @return: L{Deferred}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -423,10 +431,11 @@
</span><span class="cx"> 
</span><span class="cx">         return succeed(None)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def _doRemoveFromFile(self, xmlfile, uids):
</span><del>-    
</del><ins>+
</ins><span class="cx">         _ignore_etree, augments_node = readXML(xmlfile)
</span><del>-    
</del><ins>+
</ins><span class="cx">         # Remove all UIDs present
</span><span class="cx">         changed = False
</span><span class="cx">         for child in augments_node:
</span><span class="lines">@@ -440,20 +449,19 @@
</span><span class="cx">         # Modify xmlfile
</span><span class="cx">         if changed:
</span><span class="cx">             writeXML(xmlfile, augments_node)
</span><del>-        
-        
</del><ins>+
+
</ins><span class="cx">     def _addRecordToXMLDB(self, record, parentNode):
</span><span class="cx">         record_node = addSubElement(parentNode, xmlaugmentsparser.ELEMENT_RECORD)
</span><span class="cx">         self._updateRecordInXMLDB(record, record_node)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def _updateRecordInXMLDB(self, record, recordNode):
</span><span class="cx">         del recordNode[:]
</span><span class="cx">         addSubElement(recordNode, xmlaugmentsparser.ELEMENT_UID, record.uid)
</span><span class="cx">         addSubElement(recordNode, xmlaugmentsparser.ELEMENT_ENABLE, &quot;true&quot; if record.enabled else &quot;false&quot;)
</span><span class="cx">         if record.serverID:
</span><span class="cx">             addSubElement(recordNode, xmlaugmentsparser.ELEMENT_SERVERID, record.serverID)
</span><del>-        if record.partitionID:
-            addSubElement(recordNode, xmlaugmentsparser.ELEMENT_PARTITIONID, record.partitionID)
</del><span class="cx">         addSubElement(recordNode, xmlaugmentsparser.ELEMENT_ENABLECALENDAR, &quot;true&quot; if record.enabledForCalendaring else &quot;false&quot;)
</span><span class="cx">         addSubElement(recordNode, xmlaugmentsparser.ELEMENT_ENABLEADDRESSBOOK, &quot;true&quot; if record.enabledForAddressBooks else &quot;false&quot;)
</span><span class="cx">         addSubElement(recordNode, xmlaugmentsparser.ELEMENT_ENABLELOGIN, &quot;true&quot; if record.enabledForLogin else &quot;false&quot;)
</span><span class="lines">@@ -463,6 +471,7 @@
</span><span class="cx">         if record.autoAcceptGroup:
</span><span class="cx">             addSubElement(recordNode, xmlaugmentsparser.ELEMENT_AUTOACCEPTGROUP, record.autoAcceptGroup)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def refresh(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Refresh any cached data.
</span><span class="lines">@@ -479,6 +488,7 @@
</span><span class="cx"> 
</span><span class="cx">         return succeed(None)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def clean(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Remove all records.
</span><span class="lines">@@ -487,6 +497,7 @@
</span><span class="cx">         self.removeAugmentRecords(self.db.keys())
</span><span class="cx">         return succeed(None)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def _shouldReparse(self, xmlFiles):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Check to see whether any of the given files have been modified since
</span><span class="lines">@@ -501,6 +512,7 @@
</span><span class="cx">                     return True
</span><span class="cx">         return False
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def _parseXML(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Parse self.xmlFiles into AugmentRecords.
</span><span class="lines">@@ -536,19 +548,22 @@
</span><span class="cx"> 
</span><span class="cx">         return results
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> class AugmentADAPI(AugmentDB, AbstractADBAPIDatabase):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     DBAPI based augment database implementation.
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    schema_version = &quot;2&quot;
-    schema_type    = &quot;AugmentDB&quot;
-    
</del><ins>+    schema_version = &quot;3&quot;
+    schema_type = &quot;AugmentDB&quot;
+
</ins><span class="cx">     def __init__(self, dbID, dbapiName, dbapiArgs, **kwargs):
</span><del>-        
</del><ins>+
</ins><span class="cx">         AugmentDB.__init__(self)
</span><span class="cx">         AbstractADBAPIDatabase.__init__(self, dbID, dbapiName, dbapiArgs, True, **kwargs)
</span><del>-        
</del><ins>+
+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def getAllUIDs(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -556,11 +571,12 @@
</span><span class="cx"> 
</span><span class="cx">         @return: L{Deferred}
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        
</del><ins>+
</ins><span class="cx">         # Query for the record information
</span><span class="cx">         results = (yield self.queryList(&quot;select UID from AUGMENTS&quot;, ()))
</span><span class="cx">         returnValue(results)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _lookupAugmentRecord(self, uid):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -571,34 +587,34 @@
</span><span class="cx"> 
</span><span class="cx">         @return: L{Deferred}
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        
</del><ins>+
</ins><span class="cx">         # Query for the record information
</span><del>-        results = (yield self.query(&quot;select UID, ENABLED, SERVERID, PARTITIONID, CALENDARING, ADDRESSBOOKS, AUTOSCHEDULE, AUTOSCHEDULEMODE, AUTOACCEPTGROUP, LOGINENABLED from AUGMENTS where UID = :1&quot;, (uid,)))
</del><ins>+        results = (yield self.query(&quot;select UID, ENABLED, SERVERID, CALENDARING, ADDRESSBOOKS, AUTOSCHEDULE, AUTOSCHEDULEMODE, AUTOACCEPTGROUP, LOGINENABLED from AUGMENTS where UID = :1&quot;, (uid,)))
</ins><span class="cx">         if not results:
</span><span class="cx">             returnValue(None)
</span><span class="cx">         else:
</span><del>-            uid, enabled, serverid, partitionid, enabledForCalendaring, enabledForAddressBooks, autoSchedule, autoScheduleMode, autoAcceptGroup, enabledForLogin = results[0]
-            
</del><ins>+            uid, enabled, serverid, enabledForCalendaring, enabledForAddressBooks, autoSchedule, autoScheduleMode, autoAcceptGroup, enabledForLogin = results[0]
+
</ins><span class="cx">             record = AugmentRecord(
</span><del>-                uid = uid,
-                enabled = enabled == &quot;T&quot;,
-                serverID = serverid,
-                partitionID = partitionid,
-                enabledForCalendaring = enabledForCalendaring == &quot;T&quot;,
-                enabledForAddressBooks = enabledForAddressBooks == &quot;T&quot;,
-                enabledForLogin = enabledForLogin == &quot;T&quot;,
-                autoSchedule = autoSchedule == &quot;T&quot;,
-                autoScheduleMode = autoScheduleMode,
-                autoAcceptGroup = autoAcceptGroup,
</del><ins>+                uid=uid,
+                enabled=enabled == &quot;T&quot;,
+                serverID=serverid,
+                enabledForCalendaring=enabledForCalendaring == &quot;T&quot;,
+                enabledForAddressBooks=enabledForAddressBooks == &quot;T&quot;,
+                enabledForLogin=enabledForLogin == &quot;T&quot;,
+                autoSchedule=autoSchedule == &quot;T&quot;,
+                autoScheduleMode=autoScheduleMode,
+                autoAcceptGroup=autoAcceptGroup,
</ins><span class="cx">             )
</span><del>-            
</del><ins>+
</ins><span class="cx">             returnValue(record)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def addAugmentRecords(self, records):
</span><span class="cx"> 
</span><span class="cx">         for record in records:
</span><del>-            
</del><ins>+
</ins><span class="cx">             results = (yield self.query(&quot;select UID from AUGMENTS where UID = :1&quot;, (record.uid,)))
</span><span class="cx">             update = len(results) &gt; 0
</span><span class="cx"> 
</span><span class="lines">@@ -607,6 +623,7 @@
</span><span class="cx">             else:
</span><span class="cx">                 yield self._addRecord(record)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def removeAugmentRecords(self, uids):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -614,32 +631,36 @@
</span><span class="cx"> 
</span><span class="cx">         @param uids: list of uids to remove
</span><span class="cx">         @type uids: C{list} of C{str}
</span><del>-        
</del><ins>+
</ins><span class="cx">         @return: L{Deferred}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         for uid in uids:
</span><span class="cx">             yield self.execute(&quot;delete from AUGMENTS where UID = :1&quot;, (uid,))
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def clean(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Remove all records.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         return self.execute(&quot;delete from AUGMENTS&quot;, ())
</span><del>-        
</del><ins>+
+
</ins><span class="cx">     def _db_version(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @return: the schema version assigned to this index.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         return AugmentADAPI.schema_version
</span><del>-        
</del><ins>+
+
</ins><span class="cx">     def _db_type(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @return: the collection type assigned to this index.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         return AugmentADAPI.schema_type
</span><del>-    
</del><ins>+
+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _db_init_data_tables(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -652,45 +673,47 @@
</span><span class="cx">         yield self._create_table(
</span><span class="cx">             &quot;AUGMENTS&quot;,
</span><span class="cx">             (
</span><del>-                (&quot;UID&quot;,              &quot;text unique&quot;),
-                (&quot;ENABLED&quot;,          &quot;text(1)&quot;),
-                (&quot;SERVERID&quot;,         &quot;text&quot;),
-                (&quot;PARTITIONID&quot;,      &quot;text&quot;),
-                (&quot;CALENDARING&quot;,      &quot;text(1)&quot;),
-                (&quot;ADDRESSBOOKS&quot;,     &quot;text(1)&quot;),
-                (&quot;AUTOSCHEDULE&quot;,     &quot;text(1)&quot;),
</del><ins>+                (&quot;UID&quot;, &quot;text unique&quot;),
+                (&quot;ENABLED&quot;, &quot;text(1)&quot;),
+                (&quot;SERVERID&quot;, &quot;text&quot;),
+                (&quot;CALENDARING&quot;, &quot;text(1)&quot;),
+                (&quot;ADDRESSBOOKS&quot;, &quot;text(1)&quot;),
+                (&quot;AUTOSCHEDULE&quot;, &quot;text(1)&quot;),
</ins><span class="cx">                 (&quot;AUTOSCHEDULEMODE&quot;, &quot;text&quot;),
</span><del>-                (&quot;AUTOACCEPTGROUP&quot;,  &quot;text&quot;),
-                (&quot;LOGINENABLED&quot;,     &quot;text(1)&quot;),
</del><ins>+                (&quot;AUTOACCEPTGROUP&quot;, &quot;text&quot;),
+                (&quot;LOGINENABLED&quot;, &quot;text(1)&quot;),
</ins><span class="cx">             ),
</span><span class="cx">             ifnotexists=True,
</span><span class="cx">         )
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _db_empty_data_tables(self):
</span><span class="cx">         yield self._db_execute(&quot;delete from AUGMENTS&quot;)
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> class AugmentSqliteDB(ADBAPISqliteMixin, AugmentADAPI):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Sqlite based augment database implementation.
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">     def __init__(self, dbpath):
</span><del>-        
</del><ins>+
</ins><span class="cx">         ADBAPISqliteMixin.__init__(self)
</span><span class="cx">         AugmentADAPI.__init__(self, &quot;Augments&quot;, &quot;sqlite3&quot;, (fullServerPath(config.DataRoot, dbpath),))
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _addRecord(self, record):
</span><span class="cx">         yield self.execute(
</span><span class="cx">             &quot;&quot;&quot;insert or replace into AUGMENTS
</span><del>-            (UID, ENABLED, SERVERID, PARTITIONID, CALENDARING, ADDRESSBOOKS, AUTOSCHEDULE, AUTOSCHEDULEMODE, AUTOACCEPTGROUP, LOGINENABLED)
-            values (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10)&quot;&quot;&quot;,
</del><ins>+            (UID, ENABLED, SERVERID, CALENDARING, ADDRESSBOOKS, AUTOSCHEDULE, AUTOSCHEDULEMODE, AUTOACCEPTGROUP, LOGINENABLED)
+            values (:1, :2, :3, :4, :5, :6, :7, :8, :9)&quot;&quot;&quot;,
</ins><span class="cx">             (
</span><span class="cx">                 record.uid,
</span><span class="cx">                 &quot;T&quot; if record.enabled else &quot;F&quot;,
</span><span class="cx">                 record.serverID,
</span><del>-                record.partitionID,
</del><span class="cx">                 &quot;T&quot; if record.enabledForCalendaring else &quot;F&quot;,
</span><span class="cx">                 &quot;T&quot; if record.enabledForAddressBooks else &quot;F&quot;,
</span><span class="cx">                 &quot;T&quot; if record.autoSchedule else &quot;F&quot;,
</span><span class="lines">@@ -700,30 +723,33 @@
</span><span class="cx">             )
</span><span class="cx">         )
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def _modifyRecord(self, record):
</span><span class="cx">         return self._addRecord(record)
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> class AugmentPostgreSQLDB(ADBAPIPostgreSQLMixin, AugmentADAPI):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     PostgreSQL based augment database implementation.
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">     def __init__(self, host, database, user=None, password=None):
</span><del>-        
</del><ins>+
</ins><span class="cx">         ADBAPIPostgreSQLMixin.__init__(self)
</span><span class="cx">         AugmentADAPI.__init__(self, &quot;Augments&quot;, &quot;pgdb&quot;, (), host=host, database=database, user=user, password=password,)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _addRecord(self, record):
</span><span class="cx">         yield self.execute(
</span><span class="cx">             &quot;&quot;&quot;insert into AUGMENTS
</span><del>-            (UID, ENABLED, SERVERID, PARTITIONID, CALENDARING, ADDRESSBOOKS, AUTOSCHEDULE, AUTOSCHEDULEMODE, AUTOACCEPTGROUP, LOGINENABLED)
-            values (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10)&quot;&quot;&quot;,
</del><ins>+            (UID, ENABLED, SERVERID, CALENDARING, ADDRESSBOOKS, AUTOSCHEDULE, AUTOSCHEDULEMODE, AUTOACCEPTGROUP, LOGINENABLED)
+            values (:1, :2, :3, :4, :5, :6, :7, :8, :9)&quot;&quot;&quot;,
</ins><span class="cx">             (
</span><span class="cx">                 record.uid,
</span><span class="cx">                 &quot;T&quot; if record.enabled else &quot;F&quot;,
</span><span class="cx">                 record.serverID,
</span><del>-                record.partitionID,
</del><span class="cx">                 &quot;T&quot; if record.enabledForCalendaring else &quot;F&quot;,
</span><span class="cx">                 &quot;T&quot; if record.enabledForAddressBooks else &quot;F&quot;,
</span><span class="cx">                 &quot;T&quot; if record.autoSchedule else &quot;F&quot;,
</span><span class="lines">@@ -733,17 +759,17 @@
</span><span class="cx">             )
</span><span class="cx">         )
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _modifyRecord(self, record):
</span><span class="cx">         yield self.execute(
</span><span class="cx">             &quot;&quot;&quot;update AUGMENTS set
</span><del>-            (UID, ENABLED, SERVERID, PARTITIONID, CALENDARING, ADDRESSBOOKS, AUTOSCHEDULE, AUTOSCHEDULEMODE, AUTOACCEPTGROUP, LOGINENABLED) =
-            (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10) where UID = :11&quot;&quot;&quot;,
</del><ins>+            (UID, ENABLED, SERVERID, CALENDARING, ADDRESSBOOKS, AUTOSCHEDULE, AUTOSCHEDULEMODE, AUTOACCEPTGROUP, LOGINENABLED) =
+            (:1, :2, :3, :4, :5, :6, :7, :8, :9) where UID = :10&quot;&quot;&quot;,
</ins><span class="cx">             (
</span><span class="cx">                 record.uid,
</span><span class="cx">                 &quot;T&quot; if record.enabled else &quot;F&quot;,
</span><span class="cx">                 record.serverID,
</span><del>-                record.partitionID,
</del><span class="cx">                 &quot;T&quot; if record.enabledForCalendaring else &quot;F&quot;,
</span><span class="cx">                 &quot;T&quot; if record.enabledForAddressBooks else &quot;F&quot;,
</span><span class="cx">                 &quot;T&quot; if record.autoSchedule else &quot;F&quot;,
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectorycommonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/directory/common.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/common.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/common.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx">     Common ancestor for addressbook/calendar UID provisioning resources.
</span><span class="cx"> 
</span><span class="cx">     Must be mixed in to the hierarchy I{before} the appropriate resource type.
</span><del>-    
</del><ins>+
</ins><span class="cx">     @ivar homeResourceTypeName: The name of the home resource type ('calendars'
</span><span class="cx">         or 'addressbooks').
</span><span class="cx"> 
</span><span class="lines">@@ -78,13 +78,11 @@
</span><span class="cx"> 
</span><span class="cx">         assert len(name) &gt; 4, &quot;Directory record has an invalid GUID: %r&quot; % (
</span><span class="cx">             name,)
</span><del>-        
-        if record.locallyHosted():
</del><ins>+
+        if record.thisServer():
</ins><span class="cx">             child = yield self.homeResourceCreator(record, transaction)
</span><del>-        elif record.thisServer():
</del><ins>+        else:
</ins><span class="cx">             child = DirectoryReverseProxyResource(self, record)
</span><del>-        else:
-            child = None # Use a redirect?
</del><span class="cx"> 
</span><span class="cx">         returnValue(child)
</span><span class="cx"> 
</span><span class="lines">@@ -108,6 +106,7 @@
</span><span class="cx">         # Not a listable collection
</span><span class="cx">         raise HTTPError(responsecode.FORBIDDEN)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     ##
</span><span class="cx">     # ACL
</span><span class="cx">     ##
</span><span class="lines">@@ -115,12 +114,15 @@
</span><span class="cx">     def principalCollections(self):
</span><span class="cx">         return self.parent.principalCollections()
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def principalForRecord(self, record):
</span><span class="cx">         return self.parent.principalForRecord(record)
</span><ins>+
+
</ins><span class="cx">     ##
</span><span class="cx">     # DAV
</span><span class="cx">     ##
</span><del>-    
</del><ins>+
</ins><span class="cx">     def isCollection(self):
</span><span class="cx">         return True
</span><span class="cx"> 
</span><span class="lines">@@ -129,9 +131,11 @@
</span><span class="cx">         raise NotImplementedError(self.__class__.__name__ +
</span><span class="cx">                                   &quot;.getChild no longer exists.&quot;)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def displayName(self):
</span><span class="cx">         return uidsResourceName
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def url(self):
</span><span class="cx">         return joinURL(self.parent.url(), uidsResourceName)
</span><span class="cx"> 
</span><span class="lines">@@ -153,4 +157,3 @@
</span><span class="cx"> 
</span><span class="cx">         child = yield self._parent.homeForDirectoryRecord(record, request)
</span><span class="cx">         returnValue((child, segments[1:]))
</span><del>-
</del></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectorydirectoryprincipalresourcehtml"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/directory/directory-principal-resource.html (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/directory-principal-resource.html        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/directory-principal-resource.html        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -5,8 +5,7 @@
</span><span class="cx"> ---------------------
</span><span class="cx"> Directory GUID: &lt;t:slot name=&quot;directoryGUID&quot;/&gt;
</span><span class="cx"> Realm: &lt;t:slot name=&quot;realm&quot;/&gt;
</span><del>-&lt;t:transparent t:render=&quot;serversEnabled&quot;&gt;Hosted-At: &lt;t:slot name=&quot;hostedAt&quot;/&gt;
-Partition: &lt;t:slot name=&quot;partition&quot;/&gt;&lt;/t:transparent&gt;
</del><ins>+&lt;t:transparent t:render=&quot;serversEnabled&quot;&gt;Hosted-At: &lt;t:slot name=&quot;hostedAt&quot;/&gt;&lt;/t:transparent&gt;
</ins><span class="cx"> Principal Information
</span><span class="cx"> ---------------------
</span><span class="cx"> GUID: &lt;t:slot name=&quot;principalGUID&quot;/&gt;
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectorydirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/directory/directory.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/directory.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/directory.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -89,8 +89,8 @@
</span><span class="cx"> 
</span><span class="cx">     searchContext_location = &quot;location&quot;
</span><span class="cx">     searchContext_resource = &quot;resource&quot;
</span><del>-    searchContext_user     = &quot;user&quot;
-    searchContext_group    = &quot;group&quot;
</del><ins>+    searchContext_user = &quot;user&quot;
+    searchContext_group = &quot;group&quot;
</ins><span class="cx">     searchContext_attendee = &quot;attendee&quot;
</span><span class="cx"> 
</span><span class="cx">     aggregateService = None
</span><span class="lines">@@ -628,6 +628,7 @@
</span><span class="cx">         self.expireSeconds = expireSeconds
</span><span class="cx">         self.lockSeconds = lockSeconds
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def setGroupsFor(self, guid, memberships):
</span><span class="cx">         self.log.debug(&quot;set groups-for %s : %s&quot; % (guid, memberships))
</span><span class="cx">         return self.set(&quot;groups-for:%s&quot; %
</span><span class="lines">@@ -675,7 +676,6 @@
</span><span class="cx">         return self.add(&quot;group-cacher-lock&quot;, &quot;1&quot;, expireTime=self.lockSeconds)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-
</del><span class="cx">     def extendLock(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Update the expiration time of the memcached lock
</span><span class="lines">@@ -694,6 +694,7 @@
</span><span class="cx">         return self.delete(&quot;group-cacher-lock&quot;)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class GroupMembershipCacheUpdater(object):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Responsible for updating memcached with group memberships.  This will run
</span><span class="lines">@@ -1130,7 +1131,7 @@
</span><span class="cx">     implements(IDirectoryRecord, ICalendarStoreDirectoryRecord)
</span><span class="cx"> 
</span><span class="cx">     def __repr__(self):
</span><del>-        return &quot;&lt;%s[%s@%s(%s)] %s(%s) %r @ %s/#%s&gt;&quot; % (
</del><ins>+        return &quot;&lt;%s[%s@%s(%s)] %s(%s) %r @ %s&gt;&quot; % (
</ins><span class="cx">             self.__class__.__name__,
</span><span class="cx">             self.recordType,
</span><span class="cx">             self.service.guid,
</span><span class="lines">@@ -1139,7 +1140,6 @@
</span><span class="cx">             &quot;,&quot;.join(self.shortNames),
</span><span class="cx">             self.fullName,
</span><span class="cx">             self.serverURI(),
</span><del>-            self.partitionID,
</del><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1175,7 +1175,6 @@
</span><span class="cx">         self.uid = uid
</span><span class="cx">         self.enabled = False
</span><span class="cx">         self.serverID = &quot;&quot;
</span><del>-        self.partitionID = &quot;&quot;
</del><span class="cx">         self.shortNames = shortNames
</span><span class="cx">         self.authIDs = authIDs
</span><span class="cx">         self.fullName = fullName
</span><span class="lines">@@ -1257,7 +1256,6 @@
</span><span class="cx">         if augment:
</span><span class="cx">             self.enabled = augment.enabled
</span><span class="cx">             self.serverID = augment.serverID
</span><del>-            self.partitionID = augment.partitionID
</del><span class="cx">             self.enabledForCalendaring = augment.enabledForCalendaring
</span><span class="cx">             self.enabledForAddressBooks = augment.enabledForAddressBooks
</span><span class="cx">             self.autoSchedule = augment.autoSchedule
</span><span class="lines">@@ -1278,7 +1276,6 @@
</span><span class="cx">             # Groups are by default always enabled
</span><span class="cx">             self.enabled = (self.recordType == self.service.recordType_groups)
</span><span class="cx">             self.serverID = &quot;&quot;
</span><del>-            self.partitionID = &quot;&quot;
</del><span class="cx">             self.enabledForCalendaring = False
</span><span class="cx">             self.enabledForAddressBooks = False
</span><span class="cx">             self.enabledForLogin = False
</span><span class="lines">@@ -1496,46 +1493,9 @@
</span><span class="cx">             return None
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def partitionURI(self):
-        &quot;&quot;&quot;
-        URL of the server hosting this record. Return None if hosted on this server.
-        &quot;&quot;&quot;
-        if config.Servers.Enabled and self.serverID:
-            s = Servers.getServerById(self.serverID)
-            if s:
-                return s.getPartitionURIForId(self.partitionID)
-        return None
-
-
-    def locallyHosted(self):
-        &quot;&quot;&quot;
-        Hosted on this server/partition instance.
-        &quot;&quot;&quot;
-
-        if config.Servers.Enabled and self.serverID:
-            s = Servers.getServerById(self.serverID)
-            if s:
-                return s.thisServer and (not s.isPartitioned() or not self.partitionID or self.partitionID == config.ServerPartitionID)
-        return True
-
-
-    def effectivePartitionID(self):
-        &quot;&quot;&quot;
-        Record partition ID taking into account whether the server is partitioned.
-        &quot;&quot;&quot;
-        if config.Servers.Enabled and self.serverID:
-            s = Servers.getServerById(self.serverID)
-            if s and s.isPartitioned():
-                return self.partitionID
-        return &quot;&quot;
-
-
</del><span class="cx">     def thisServer(self):
</span><del>-        if config.Servers.Enabled and self.serverID:
-            s = Servers.getServerById(self.serverID)
-            if s:
-                return s.thisServer
-        return True
</del><ins>+        s = self.server()
+        return s.thisServer if s is not None else True
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def autoAcceptMembers(self):
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectoryidirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/directory/idirectory.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/idirectory.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/idirectory.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -32,20 +32,20 @@
</span><span class="cx">     realmName = Attribute(&quot;The name of the authentication realm this service represents.&quot;)
</span><span class="cx">     guid = Attribute(&quot;A GUID for this service.&quot;)
</span><span class="cx"> 
</span><del>-    def recordTypes():
</del><ins>+    def recordTypes(): #@NoSelf
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @return: a sequence of strings denoting the record types that
</span><span class="cx">             are kept in the directory.  For example: C{[&quot;users&quot;,
</span><span class="cx">             &quot;groups&quot;, &quot;resources&quot;]}.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    def listRecords(recordType):
</del><ins>+    def listRecords(recordType): #@NoSelf
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @param type: the type of records to retrieve.
</span><span class="cx">         @return: an iterable of records of the given type.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    def recordWithShortName(recordType, shortName):
</del><ins>+    def recordWithShortName(recordType, shortName): #@NoSelf
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @param recordType: the type of the record to look up.
</span><span class="cx">         @param shortName: the short name of the record to look up.
</span><span class="lines">@@ -53,21 +53,21 @@
</span><span class="cx">             C{None} if no such record exists.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    def recordWithUID(uid):
</del><ins>+    def recordWithUID(uid): #@NoSelf
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @param uid: the UID of the record to look up.
</span><span class="cx">         @return: an L{IDirectoryRecord} with the given UID, or C{None}
</span><span class="cx">             if no such record exists.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    def recordWithGUID(guid):
</del><ins>+    def recordWithGUID(guid): #@NoSelf
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @param guid: the GUID of the record to look up.
</span><span class="cx">         @return: an L{IDirectoryRecord} with the given GUID, or
</span><span class="cx">             C{None} if no such record exists.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    def recordWithCalendarUserAddress(address):
</del><ins>+    def recordWithCalendarUserAddress(address): #@NoSelf
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @param address: the calendar user address of the record to look up.
</span><span class="cx">         @type address: C{str}
</span><span class="lines">@@ -81,7 +81,7 @@
</span><span class="cx">             directory service may not be aware of these addresses.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    def recordWithCachedGroupsAlias(recordType, alias):
</del><ins>+    def recordWithCachedGroupsAlias(recordType, alias): #@NoSelf
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @param recordType: the type of the record to look up.
</span><span class="cx">         @param alias: the cached-groups alias of the record to look up.
</span><span class="lines">@@ -91,14 +91,13 @@
</span><span class="cx">             alias, or C{None} if no such record is found.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-
-    def recordsMatchingFields(fields):
</del><ins>+    def recordsMatchingFields(fields): #@NoSelf
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @return: a deferred sequence of L{IDirectoryRecord}s which
</span><span class="cx">             match the given fields.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    def recordsMatchingTokens(tokens, context=None):
</del><ins>+    def recordsMatchingTokens(tokens, context=None): #@NoSelf
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @param tokens: The tokens to search on
</span><span class="cx">         @type tokens: C{list} of C{str} (utf-8 bytes)
</span><span class="lines">@@ -119,31 +118,31 @@
</span><span class="cx">             &quot;attendee&quot;, only users, groups, and resources are considered.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-
-    def setRealm(realmName):
</del><ins>+    def setRealm(realmName): #@NoSelf
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Set a new realm name for this (and nested services if any)
</span><span class="cx"> 
</span><span class="cx">         @param realmName: the realm name this service should use.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> class IDirectoryRecord(Interface):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Directory Record
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    service               = Attribute(&quot;The L{IDirectoryService} this record exists in.&quot;)
-    recordType            = Attribute(&quot;The type of this record.&quot;)
-    guid                  = Attribute(&quot;The GUID of this record.&quot;)
-    uid                   = Attribute(&quot;The UID of this record.&quot;)
-    enabled               = Attribute(&quot;Determines whether this record should allow a principal to be created.&quot;)
-    serverID              = Attribute(&quot;Identifies the server that actually hosts data for the record.&quot;)
-    partitionID           = Attribute(&quot;Identifies the partition node that actually hosts data for the record.&quot;)
-    shortNames            = Attribute(&quot;The names for this record.&quot;)
-    authIDs               = Attribute(&quot;Alternative security identities for this record.&quot;)
-    fullName              = Attribute(&quot;The full name of this record.&quot;)
-    firstName             = Attribute(&quot;The first name of this record.&quot;)
-    lastName              = Attribute(&quot;The last name of this record.&quot;)
-    emailAddresses        = Attribute(&quot;The email addresses of this record.&quot;)
</del><ins>+    service = Attribute(&quot;The L{IDirectoryService} this record exists in.&quot;)
+    recordType = Attribute(&quot;The type of this record.&quot;)
+    guid = Attribute(&quot;The GUID of this record.&quot;)
+    uid = Attribute(&quot;The UID of this record.&quot;)
+    enabled = Attribute(&quot;Determines whether this record should allow a principal to be created.&quot;)
+    serverID = Attribute(&quot;Identifies the server that actually hosts data for the record.&quot;)
+    shortNames = Attribute(&quot;The names for this record.&quot;)
+    authIDs = Attribute(&quot;Alternative security identities for this record.&quot;)
+    fullName = Attribute(&quot;The full name of this record.&quot;)
+    firstName = Attribute(&quot;The first name of this record.&quot;)
+    lastName = Attribute(&quot;The last name of this record.&quot;)
+    emailAddresses = Attribute(&quot;The email addresses of this record.&quot;)
</ins><span class="cx">     enabledForCalendaring = Attribute(&quot;Determines whether this record creates a principal with a calendar home.&quot;)
</span><span class="cx">     enabledForAddressBooks = Attribute(&quot;Determines whether this record creates a principal with an address book home.&quot;)
</span><span class="cx">     calendarUserAddresses = Attribute(
</span><span class="lines">@@ -159,19 +158,19 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">     )
</span><span class="cx"> 
</span><del>-    def members():
</del><ins>+    def members(): #@NoSelf
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @return: an iterable of L{IDirectoryRecord}s for the members of this
</span><span class="cx">             (group) record.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    def groups():
</del><ins>+    def groups(): #@NoSelf
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @return: an iterable of L{IDirectoryRecord}s for the groups this
</span><span class="cx">             record is a member of.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    def verifyCredentials(credentials):
</del><ins>+    def verifyCredentials(credentials): #@NoSelf
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Verify that the given credentials can authenticate the principal
</span><span class="cx">         represented by this record.
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectoryldapdirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/directory/ldapdirectory.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/ldapdirectory.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/ldapdirectory.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -75,12 +75,13 @@
</span><span class="cx">         return &quot;&lt;%s %r: %r&gt;&quot; % (self.__class__.__name__, self.realmName,
</span><span class="cx">             self.uri)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def __init__(self, params):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @param params: a dictionary containing the following keys:
</span><span class="cx">             cacheTimeout, realmName, uri, tls, tlsCACertFile, tlsCACertDir,
</span><span class="cx">             tlsRequireCert, credentials, rdnSchema, groupSchema, resourceSchema
</span><del>-            partitionSchema
</del><ins>+            poddingSchema
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         defaults = {
</span><span class="lines">@@ -188,9 +189,8 @@
</span><span class="cx">                 &quot;readOnlyProxyAttr&quot;: None, # list of GUIDs
</span><span class="cx">                 &quot;autoAcceptGroupAttr&quot;: None, # single group GUID
</span><span class="cx">             },
</span><del>-            &quot;partitionSchema&quot;: {
</del><ins>+            &quot;poddingSchema&quot;: {
</ins><span class="cx">                 &quot;serverIdAttr&quot;: None, # maps to augments server-id
</span><del>-                &quot;partitionIdAttr&quot;: None, # maps to augments partition-id
</del><span class="cx">             },
</span><span class="cx">         }
</span><span class="cx">         ignored = None
</span><span class="lines">@@ -222,7 +222,7 @@
</span><span class="cx">         self.rdnSchema = params[&quot;rdnSchema&quot;]
</span><span class="cx">         self.groupSchema = params[&quot;groupSchema&quot;]
</span><span class="cx">         self.resourceSchema = params[&quot;resourceSchema&quot;]
</span><del>-        self.partitionSchema = params[&quot;partitionSchema&quot;]
</del><ins>+        self.poddingSchema = params[&quot;poddingSchema&quot;]
</ins><span class="cx"> 
</span><span class="cx">         self.base = ldap.dn.str2dn(self.rdnSchema[&quot;base&quot;])
</span><span class="cx"> 
</span><span class="lines">@@ -272,10 +272,8 @@
</span><span class="cx">             attrSet.add(self.resourceSchema[&quot;proxyAttr&quot;])
</span><span class="cx">         if self.resourceSchema[&quot;readOnlyProxyAttr&quot;]:
</span><span class="cx">             attrSet.add(self.resourceSchema[&quot;readOnlyProxyAttr&quot;])
</span><del>-        if self.partitionSchema[&quot;serverIdAttr&quot;]:
-            attrSet.add(self.partitionSchema[&quot;serverIdAttr&quot;])
-        if self.partitionSchema[&quot;partitionIdAttr&quot;]:
-            attrSet.add(self.partitionSchema[&quot;partitionIdAttr&quot;])
</del><ins>+        if self.poddingSchema[&quot;serverIdAttr&quot;]:
+            attrSet.add(self.poddingSchema[&quot;serverIdAttr&quot;])
</ins><span class="cx">         self.attrlist = list(attrSet)
</span><span class="cx"> 
</span><span class="cx">         self.typeDNs = {}
</span><span class="lines">@@ -284,10 +282,8 @@
</span><span class="cx">                 self.rdnSchema[recordType][&quot;rdn&quot;].lower()
</span><span class="cx">             ) + self.base
</span><span class="cx"> 
</span><del>-
</del><span class="cx">         self.ldap = None
</span><span class="cx"> 
</span><del>-
</del><span class="cx">         # Separate LDAP connection used solely for authenticating clients
</span><span class="cx">         self.authLDAP = None
</span><span class="cx"> 
</span><span class="lines">@@ -314,7 +310,7 @@
</span><span class="cx"> 
</span><span class="cx">         # Query the LDAP server
</span><span class="cx">         self.log.debug(&quot;Querying ldap for records matching base {base} and &quot;
</span><del>-            &quot;filter {filter} for attributes {attrs}.&quot;, 
</del><ins>+            &quot;filter {filter} for attributes {attrs}.&quot;,
</ins><span class="cx">             base=ldap.dn.dn2str(base), filter=filterstr, attrs=self.attrlist)
</span><span class="cx"> 
</span><span class="cx">         # This takes a while, so if you don't want to have a &quot;long request&quot;
</span><span class="lines">@@ -353,6 +349,7 @@
</span><span class="cx"> 
</span><span class="cx">         return records
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def recordWithCachedGroupsAlias(self, recordType, alias):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -373,6 +370,7 @@
</span><span class="cx">         else:
</span><span class="cx">             returnValue(None)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def getExternalProxyAssignments(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Retrieve proxy assignments for locations and resources from the
</span><span class="lines">@@ -425,6 +423,7 @@
</span><span class="cx"> 
</span><span class="cx">         return assignments
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def getLDAPConnection(self):
</span><span class="cx">         if self.ldap is None:
</span><span class="cx">             self.log.info(&quot;Connecting to LDAP {uri}&quot;, uri=repr(self.uri))
</span><span class="lines">@@ -443,6 +442,7 @@
</span><span class="cx">                     raise DirectoryConfigurationError()
</span><span class="cx">         return self.ldap
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def createLDAPConnection(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Create and configure LDAP connection
</span><span class="lines">@@ -478,7 +478,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         TRIES = 3
</span><span class="cx"> 
</span><del>-        for i in xrange(TRIES):
</del><ins>+        for _ignore_i in xrange(TRIES):
</ins><span class="cx">             self.log.debug(&quot;Authenticating %s&quot; % (dn,))
</span><span class="cx"> 
</span><span class="cx">             if self.authLDAP is None:
</span><span class="lines">@@ -555,11 +555,11 @@
</span><span class="cx">                 self.log.warn(&quot;LDAP timeout exceeded: %d seconds&quot; % (timeoutSeconds,))
</span><span class="cx">             except ldap.SERVER_DOWN:
</span><span class="cx">                 self.ldap = None
</span><del>-                self.log.error(&quot;LDAP server unavailable (tried %d times)&quot; % (i+1,))
</del><ins>+                self.log.error(&quot;LDAP server unavailable (tried %d times)&quot; % (i + 1,))
</ins><span class="cx">                 continue
</span><span class="cx"> 
</span><span class="cx">             # change format, ignoring resultsType
</span><del>-            result = [resultItem for resultType, resultItem in s.allResults]
</del><ins>+            result = [resultItem for _ignore_resultType, resultItem in s.allResults]
</ins><span class="cx"> 
</span><span class="cx">             totalTime = time.time() - startTime
</span><span class="cx">             if totalTime &gt; self.warningThresholdSeconds:
</span><span class="lines">@@ -769,7 +769,6 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         guid = None
</span><del>-        shortNames = ()
</del><span class="cx">         authIDs = set()
</span><span class="cx">         fullName = None
</span><span class="cx">         firstName = &quot;&quot;
</span><span class="lines">@@ -891,30 +890,27 @@
</span><span class="cx">                     autoAcceptGroup = self._getUniqueLdapAttribute(attrs,
</span><span class="cx">                         self.resourceSchema[&quot;autoAcceptGroupAttr&quot;])
</span><span class="cx"> 
</span><del>-        serverID = partitionID = None
-        if self.partitionSchema[&quot;serverIdAttr&quot;]:
</del><ins>+        serverID = None
+        if self.poddingSchema[&quot;serverIdAttr&quot;]:
</ins><span class="cx">             serverID = self._getUniqueLdapAttribute(attrs,
</span><del>-                self.partitionSchema[&quot;serverIdAttr&quot;])
-        if self.partitionSchema[&quot;partitionIdAttr&quot;]:
-            partitionID = self._getUniqueLdapAttribute(attrs,
-                self.partitionSchema[&quot;partitionIdAttr&quot;])
</del><ins>+                self.poddingSchema[&quot;serverIdAttr&quot;])
</ins><span class="cx"> 
</span><span class="cx">         record = LdapDirectoryRecord(
</span><del>-            service                 = self,
-            recordType              = recordType,
-            guid                    = guid,
-            shortNames              = shortNames,
-            authIDs                 = authIDs,
-            fullName                = fullName,
-            firstName               = firstName,
-            lastName                = lastName,
-            emailAddresses          = emailAddresses,
-            uid                     = uid,
-            dn                      = dn,
-            memberGUIDs             = memberGUIDs,
-            extProxies              = proxyGUIDs,
-            extReadOnlyProxies      = readOnlyProxyGUIDs,
-            attrs                   = attrs,
</del><ins>+            service=self,
+            recordType=recordType,
+            guid=guid,
+            shortNames=shortNames,
+            authIDs=authIDs,
+            fullName=fullName,
+            firstName=firstName,
+            lastName=lastName,
+            emailAddresses=emailAddresses,
+            uid=uid,
+            dn=dn,
+            memberGUIDs=memberGUIDs,
+            extProxies=proxyGUIDs,
+            extReadOnlyProxies=readOnlyProxyGUIDs,
+            attrs=attrs,
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         if self.augmentService is not None:
</span><span class="lines">@@ -924,7 +920,7 @@
</span><span class="cx">             # immediately.
</span><span class="cx">             d = self.augmentService.getAugmentRecord(record.guid,
</span><span class="cx">                 recordType)
</span><del>-            d.addCallback(lambda x:record.addAugmentInformation(x))
</del><ins>+            d.addCallback(lambda x: record.addAugmentInformation(x))
</ins><span class="cx"> 
</span><span class="cx">         else:
</span><span class="cx">             # Generate augment record based on information retrieved from LDAP
</span><span class="lines">@@ -932,7 +928,6 @@
</span><span class="cx">                 guid,
</span><span class="cx">                 enabled=True,
</span><span class="cx">                 serverID=serverID,
</span><del>-                partitionID=partitionID,
</del><span class="cx">                 enabledForCalendaring=enabledForCalendaring,
</span><span class="cx">                 autoSchedule=autoSchedule,
</span><span class="cx">                 autoAcceptGroup=autoAcceptGroup,
</span><span class="lines">@@ -965,7 +960,7 @@
</span><span class="cx">         matching the indexType and indexKey parameters.
</span><span class="cx"> 
</span><span class="cx">         recordTypes is a list of record types to limit the search to.
</span><del>-        indexType specifies one of the CachingDirectoryService contstants
</del><ins>+        indexType specifies one of the CachingDirectoryService constants
</ins><span class="cx">             identifying which attribute to search on.
</span><span class="cx">         indexKey is the value to search for.
</span><span class="cx"> 
</span><span class="lines">@@ -994,7 +989,8 @@
</span><span class="cx">                 # Query on guid only works if guid attribute has been defined.
</span><span class="cx">                 # Support for query on guid even if is auto-generated should
</span><span class="cx">                 # be added.
</span><del>-                if not guidAttr: return
</del><ins>+                if not guidAttr:
+                    return
</ins><span class="cx">                 filterstr = &quot;(&amp;%s(%s=%s))&quot; % (filterstr, guidAttr, indexKey)
</span><span class="cx"> 
</span><span class="cx">             elif indexType == self.INDEX_TYPE_SHORTNAME:
</span><span class="lines">@@ -1157,7 +1153,6 @@
</span><span class="cx"> 
</span><span class="cx">                 self.log.debug(&quot;LDAP search returned %d results, %d usable&quot; % (len(results), typeCounts[recordType]))
</span><span class="cx"> 
</span><del>-
</del><span class="cx">         typeCountsStr = &quot;, &quot;.join([&quot;%s:%d&quot; % (rt, ct) for (rt, ct) in typeCounts.iteritems()])
</span><span class="cx">         totalTime = time.time() - startTime
</span><span class="cx">         self.log.info(&quot;Calendar user search for %s matched %d records (%s) in %.2f seconds&quot; % (tokens, len(records), typeCountsStr, totalTime))
</span><span class="lines">@@ -1172,7 +1167,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         records = []
</span><span class="cx"> 
</span><del>-        self.log.debug(&quot;Peforming principal property search for %s&quot; % (fields,))
</del><ins>+        self.log.debug(&quot;Performing principal property search for %s&quot; % (fields,))
</ins><span class="cx"> 
</span><span class="cx">         if recordType is None:
</span><span class="cx">             # Make a copy since we're modifying it
</span><span class="lines">@@ -1324,6 +1319,7 @@
</span><span class="cx"> 
</span><span class="cx">         returnValue(recordsByAlias.values())
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def recordTypeForDN(self, dnStr):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Examine a DN to determine which recordType it belongs to
</span><span class="lines">@@ -1339,6 +1335,7 @@
</span><span class="cx">         return None
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def dnContainedIn(child, parent):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Return True if child dn is contained within parent dn, otherwise False.
</span><span class="lines">@@ -1346,6 +1343,7 @@
</span><span class="cx">     return child[-len(parent):] == parent
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def normalizeDNstr(dnStr):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Convert to lowercase and remove extra whitespace
</span><span class="lines">@@ -1356,6 +1354,7 @@
</span><span class="cx">     return ' '.join(ldap.dn.dn2str(ldap.dn.str2dn(dnStr.lower())).split())
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def _convertValue(value, matchType):
</span><span class="cx">     if matchType == &quot;starts-with&quot;:
</span><span class="cx">         value = &quot;%s*&quot; % (ldapEsc(value),)
</span><span class="lines">@@ -1366,6 +1365,8 @@
</span><span class="cx">         value = ldapEsc(value)
</span><span class="cx">     return value
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> def buildFilter(recordType, mapping, fields, operand=&quot;or&quot;, optimizeMultiName=False):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Create an LDAP filter string from a list of tuples representing directory
</span><span class="lines">@@ -1403,8 +1404,8 @@
</span><span class="cx">                 # try the various firstName/lastName permutations:
</span><span class="cx">                 if recordType == &quot;users&quot;:
</span><span class="cx">                     converted = []
</span><del>-                    for firstName, firstCaseless, firstMatchType in combined[&quot;firstName&quot;]:
-                        for lastName, lastCaseless, lastMatchType in combined[&quot;lastName&quot;]:
</del><ins>+                    for firstName, _ignore_firstCaseless, firstMatchType in combined[&quot;firstName&quot;]:
+                        for lastName, _ignore_lastCaseless, lastMatchType in combined[&quot;lastName&quot;]:
</ins><span class="cx">                             if firstName != lastName:
</span><span class="cx">                                 firstValue = _convertValue(firstName, firstMatchType)
</span><span class="cx">                                 lastValue = _convertValue(lastName, lastMatchType)
</span><span class="lines">@@ -1427,7 +1428,7 @@
</span><span class="cx">         # name, guid)
</span><span class="cx">         additional = []
</span><span class="cx">         for key in (&quot;recordName&quot;, &quot;guid&quot;):
</span><del>-            if mapping.has_key(key):
</del><ins>+            if key in mapping:
</ins><span class="cx">                 additional.append(&quot;(%s=*)&quot; % (mapping.get(key),))
</span><span class="cx">         if additional:
</span><span class="cx">             filterstr = &quot;(&amp;%s%s)&quot; % (&quot;&quot;.join(additional), filterstr)
</span><span class="lines">@@ -1435,6 +1436,7 @@
</span><span class="cx">     return filterstr
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def buildFilterFromTokens(recordType, mapping, tokens, extra=None):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Create an LDAP filter string from a list of query tokens.  Each token is
</span><span class="lines">@@ -1497,6 +1499,7 @@
</span><span class="cx">     return filterStr
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class LdapDirectoryRecord(CachingDirectoryRecord):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     LDAP implementation of L{IDirectoryRecord}.
</span><span class="lines">@@ -1509,18 +1512,18 @@
</span><span class="cx">         attrs
</span><span class="cx">     ):
</span><span class="cx">         super(LdapDirectoryRecord, self).__init__(
</span><del>-            service               = service,
-            recordType            = recordType,
-            guid                  = guid,
-            shortNames            = shortNames,
-            authIDs               = authIDs,
-            fullName              = fullName,
-            firstName             = firstName,
-            lastName              = lastName,
-            emailAddresses        = emailAddresses,
-            extProxies            = extProxies,
-            extReadOnlyProxies    = extReadOnlyProxies,
-            uid                   = uid,
</del><ins>+            service=service,
+            recordType=recordType,
+            guid=guid,
+            shortNames=shortNames,
+            authIDs=authIDs,
+            fullName=fullName,
+            firstName=firstName,
+            lastName=lastName,
+            emailAddresses=emailAddresses,
+            extProxies=extProxies,
+            extReadOnlyProxies=extReadOnlyProxies,
+            uid=uid,
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         # Save attributes of dn and attrs in case you might need them later
</span><span class="lines">@@ -1548,6 +1551,7 @@
</span><span class="cx">             self._members_storage = self._members()
</span><span class="cx">             return self._members_storage
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def _members(self):
</span><span class="cx">         &quot;&quot;&quot; Fault in records for the members of this group &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -1578,7 +1582,7 @@
</span><span class="cx"> 
</span><span class="cx">                 dn, attrs = result.pop()
</span><span class="cx">                 dn = normalizeDNstr(dn)
</span><del>-                self.log.debug(&quot;Retrieved: %s %s&quot; % (dn,attrs))
</del><ins>+                self.log.debug(&quot;Retrieved: %s %s&quot; % (dn, attrs))
</ins><span class="cx">                 recordType = self.service.recordTypeForDN(dn)
</span><span class="cx">                 if recordType is None:
</span><span class="cx">                     self.log.error(&quot;Unable to map %s to a record type&quot; % (dn,))
</span><span class="lines">@@ -1595,6 +1599,7 @@
</span><span class="cx"> 
</span><span class="cx">         return results
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def groups(self):
</span><span class="cx">         &quot;&quot;&quot; Return the records representing groups this record is a member of &quot;&quot;&quot;
</span><span class="cx">         try:
</span><span class="lines">@@ -1603,6 +1608,7 @@
</span><span class="cx">             self._groups_storage = self._groups()
</span><span class="cx">             return self._groups_storage
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def _groups(self):
</span><span class="cx">         &quot;&quot;&quot; Fault in the groups of which this record is a member &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -1618,7 +1624,7 @@
</span><span class="cx">         if len(membersAttrs) == 1:
</span><span class="cx">             filterstr = &quot;(%s=%s)&quot; % (membersAttrs[0], self._memberId)
</span><span class="cx">         else:
</span><del>-            filterstr = &quot;(|%s)&quot; % ( &quot;&quot;.join(
</del><ins>+            filterstr = &quot;(|%s)&quot; % (&quot;&quot;.join(
</ins><span class="cx">                     [&quot;(%s=%s)&quot; % (a, self._memberId) for a in membersAttrs]
</span><span class="cx">                 ),
</span><span class="cx">             )
</span><span class="lines">@@ -1641,6 +1647,7 @@
</span><span class="cx"> 
</span><span class="cx">         return groups
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def cachedGroupsAlias(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         See directory.py for full description
</span><span class="lines">@@ -1650,6 +1657,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         return self._memberId
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def memberGUIDs(self):
</span><span class="cx">         return set(self._memberGUIDs)
</span><span class="cx"> 
</span><span class="lines">@@ -1717,10 +1725,13 @@
</span><span class="cx">         return super(LdapDirectoryRecord, self).verifyCredentials(credentials)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class MissingRecordNameException(Exception):
</span><span class="cx">     &quot;&quot;&quot; Raised when LDAP record is missing recordName &quot;&quot;&quot;
</span><span class="cx">     pass
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> class MissingGuidException(Exception):
</span><span class="cx">     &quot;&quot;&quot; Raised when LDAP record is missing guidAttr and it's required &quot;&quot;&quot;
</span><span class="cx">     pass
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectoryprincipalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/directory/principal.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/principal.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/principal.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -601,7 +601,6 @@
</span><span class="cx">         record = self.resource.record
</span><span class="cx">         return tag.fillSlots(
</span><span class="cx">             hostedAt=str(record.serverURI()),
</span><del>-            partition=str(record.effectivePartitionID()),
</del><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1066,14 +1065,6 @@
</span><span class="cx">         return self.record.server()
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def partitionURI(self):
-        return self.record.partitionURI()
-
-
-    def locallyHosted(self):
-        return self.record.locallyHosted()
-
-
</del><span class="cx">     def thisServer(self):
</span><span class="cx">         return self.record.thisServer()
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectoryresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/directory/resource.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/resource.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/resource.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -25,14 +25,13 @@
</span><span class="cx"> __all__ = [&quot;DirectoryReverseProxyResource&quot;]
</span><span class="cx"> 
</span><span class="cx"> class DirectoryReverseProxyResource(ReverseProxyResource):
</span><del>-    
</del><ins>+
</ins><span class="cx">     def __init__(self, parent, record):
</span><span class="cx">         self.parent = parent
</span><span class="cx">         self.record = record
</span><del>-        
-        super(DirectoryReverseProxyResource, self).__init__(self.record.partitionID)
-    
-    def url(self):
-        return joinURL(self.parent.url(), self.record.uid)
</del><span class="cx"> 
</span><ins>+        super(DirectoryReverseProxyResource, self).__init__(self.record.serverID)
</ins><span class="cx"> 
</span><ins>+
+    def url(self):
+        return joinURL(self.parent.url(), self.record.uid)
</ins></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectorytestaugmentstestdefaultxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/directory/test/augments-test-default.xml (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/test/augments-test-default.xml        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/test/augments-test-default.xml        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -24,40 +24,34 @@
</span><span class="cx">     &lt;enable&gt;true&lt;/enable&gt;
</span><span class="cx">     &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
</span><span class="cx">     &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
</span><del>-    &lt;partition-id&gt;00001&lt;/partition-id&gt;
</del><span class="cx">   &lt;/record&gt;
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;Location-Default&lt;/uid&gt;
</span><span class="cx">     &lt;enable&gt;true&lt;/enable&gt;
</span><span class="cx">     &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
</span><del>-    &lt;partition-id&gt;00004&lt;/partition-id&gt;
</del><span class="cx">     &lt;auto-schedule&gt;true&lt;/auto-schedule&gt;
</span><span class="cx">   &lt;/record&gt;
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;Location-AA*&lt;/uid&gt;
</span><span class="cx">     &lt;enable&gt;true&lt;/enable&gt;
</span><span class="cx">     &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
</span><del>-    &lt;partition-id&gt;00005&lt;/partition-id&gt;
</del><span class="cx">     &lt;auto-schedule&gt;true&lt;/auto-schedule&gt;
</span><span class="cx">   &lt;/record&gt;
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;Resource-Default&lt;/uid&gt;
</span><span class="cx">     &lt;enable&gt;true&lt;/enable&gt;
</span><span class="cx">     &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
</span><del>-    &lt;partition-id&gt;00006&lt;/partition-id&gt;
</del><span class="cx">     &lt;auto-schedule&gt;true&lt;/auto-schedule&gt;
</span><span class="cx">   &lt;/record&gt;
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;Resource-AA*&lt;/uid&gt;
</span><span class="cx">     &lt;enable&gt;true&lt;/enable&gt;
</span><span class="cx">     &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
</span><del>-    &lt;partition-id&gt;00007&lt;/partition-id&gt;
</del><span class="cx">     &lt;auto-schedule&gt;true&lt;/auto-schedule&gt;
</span><span class="cx">   &lt;/record&gt;
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;AA*&lt;/uid&gt;
</span><span class="cx">     &lt;enable&gt;true&lt;/enable&gt;
</span><del>-    &lt;partition-id&gt;00001&lt;/partition-id&gt;
</del><span class="cx">   &lt;/record&gt;
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;AB*&lt;/uid&gt;
</span><span class="lines">@@ -66,14 +60,12 @@
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;B*&lt;/uid&gt;
</span><span class="cx">     &lt;enable&gt;true&lt;/enable&gt;
</span><del>-    &lt;partition-id&gt;00002&lt;/partition-id&gt;
</del><span class="cx">     &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
</span><span class="cx">     &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
</span><span class="cx">   &lt;/record&gt;
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;C*&lt;/uid&gt;
</span><span class="cx">     &lt;enable&gt;true&lt;/enable&gt;
</span><del>-    &lt;partition-id&gt;00003&lt;/partition-id&gt;
</del><span class="cx">     &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
</span><span class="cx">     &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
</span><span class="cx">     &lt;auto-schedule&gt;true&lt;/auto-schedule&gt;
</span><span class="lines">@@ -102,17 +94,14 @@
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&lt;/uid&gt;
</span><span class="cx">     &lt;enable&gt;true&lt;/enable&gt;
</span><del>-    &lt;partition-id&gt;00001&lt;/partition-id&gt;
</del><span class="cx">   &lt;/record&gt;
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;543D28BA-F74F-4D5F-9243-B3E3A61171E5&lt;/uid&gt;
</span><span class="cx">     &lt;enable&gt;true&lt;/enable&gt;
</span><del>-    &lt;partition-id&gt;00002&lt;/partition-id&gt;
</del><span class="cx">   &lt;/record&gt;
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;6A73326A-F781-47E7-A9F8-AF47364D4152&lt;/uid&gt;
</span><span class="cx">     &lt;enable&gt;true&lt;/enable&gt;
</span><del>-    &lt;partition-id&gt;00002&lt;/partition-id&gt;
</del><span class="cx">     &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
</span><span class="cx">     &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
</span><span class="cx">     &lt;auto-schedule&gt;true&lt;/auto-schedule&gt;
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectorytestaugmentstestxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/directory/test/augments-test.xml (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/test/augments-test.xml        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/test/augments-test.xml        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -42,12 +42,10 @@
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&lt;/uid&gt;
</span><span class="cx">     &lt;enable&gt;true&lt;/enable&gt;
</span><del>-    &lt;partition-id&gt;00001&lt;/partition-id&gt;
</del><span class="cx">   &lt;/record&gt;
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;543D28BA-F74F-4D5F-9243-B3E3A61171E5&lt;/uid&gt;
</span><span class="cx">     &lt;enable&gt;true&lt;/enable&gt;
</span><del>-    &lt;partition-id&gt;00002&lt;/partition-id&gt;
</del><span class="cx">   &lt;/record&gt;
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;6A73326A-F781-47E7-A9F8-AF47364D4152&lt;/uid&gt;
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectorytestresourcescaldavdplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/directory/test/resources/caldavd.plist (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/test/resources/caldavd.plist        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/test/resources/caldavd.plist        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -175,7 +175,6 @@
</span><span class="cx">         Augments for the directory service records to add calendar specific attributes.
</span><span class="cx"> 
</span><span class="cx">         A variety of augment services are available for use.
</span><del>-        When using a partitioned server, a service that can be accessed from each host will be needed.
</del><span class="cx">       --&gt;
</span><span class="cx"> 
</span><span class="cx">     &lt;!-- XML File Augment Service --&gt;
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectorytestsudoersplist"></a>
<div class="delfile"><h4>Deleted: CalendarServer/trunk/twistedcaldav/directory/test/sudoers.plist (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/test/sudoers.plist        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/test/sudoers.plist        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -1,28 +0,0 @@
</span><del>-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-&lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
-&lt;plist version=&quot;1.0&quot;&gt;
-  &lt;dict&gt;
-    &lt;key&gt;users&lt;/key&gt;
-      &lt;array&gt;
-        &lt;dict&gt;
-          &lt;key&gt;authorize-as&lt;/key&gt;
-          &lt;dict&gt;
-            &lt;key&gt;allow&lt;/key&gt;
-            &lt;true /&gt;
-            &lt;key&gt;principals&lt;/key&gt;
-            &lt;array&gt;
-              &lt;string&gt;all&lt;/string&gt;
-            &lt;/array&gt;
-          &lt;/dict&gt;
-          &lt;key&gt;authorize-from&lt;/key&gt;
-          &lt;array&gt;
-            &lt;string&gt;127.0.0.1&lt;/string&gt;
-          &lt;/array&gt;
-          &lt;key&gt;password&lt;/key&gt;
-          &lt;string&gt;alice&lt;/string&gt;
-          &lt;key&gt;username&lt;/key&gt;
-          &lt;string&gt;alice&lt;/string&gt;
-        &lt;/dict&gt;
-      &lt;/array&gt;
-  &lt;/dict&gt;
-&lt;/plist&gt;
</del></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectorytestsudoers2plist"></a>
<div class="delfile"><h4>Deleted: CalendarServer/trunk/twistedcaldav/directory/test/sudoers2.plist (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/test/sudoers2.plist        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/test/sudoers2.plist        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -1,47 +0,0 @@
</span><del>-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-&lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
-&lt;plist version=&quot;1.0&quot;&gt;
-  &lt;dict&gt;
-    &lt;key&gt;users&lt;/key&gt;
-      &lt;array&gt;
-        &lt;dict&gt;
-          &lt;key&gt;authorize-as&lt;/key&gt;
-          &lt;dict&gt;
-            &lt;key&gt;allow&lt;/key&gt;
-            &lt;true /&gt;
-            &lt;key&gt;principals&lt;/key&gt;
-            &lt;array&gt;
-              &lt;string&gt;all&lt;/string&gt;
-            &lt;/array&gt;
-          &lt;/dict&gt;
-          &lt;key&gt;authorize-from&lt;/key&gt;
-          &lt;array&gt;
-            &lt;string&gt;127.0.0.1&lt;/string&gt;
-          &lt;/array&gt;
-          &lt;key&gt;password&lt;/key&gt;
-          &lt;string&gt;alice&lt;/string&gt;
-          &lt;key&gt;username&lt;/key&gt;
-          &lt;string&gt;alice&lt;/string&gt;
-        &lt;/dict&gt;
-        &lt;dict&gt;
-          &lt;key&gt;authorize-as&lt;/key&gt;
-          &lt;dict&gt;
-            &lt;key&gt;allow&lt;/key&gt;
-            &lt;true /&gt;
-            &lt;key&gt;principals&lt;/key&gt;
-            &lt;array&gt;
-              &lt;string&gt;all&lt;/string&gt;
-            &lt;/array&gt;
-          &lt;/dict&gt;
-          &lt;key&gt;authorize-from&lt;/key&gt;
-          &lt;array&gt;
-            &lt;string&gt;127.0.0.1&lt;/string&gt;
-          &lt;/array&gt;
-          &lt;key&gt;password&lt;/key&gt;
-          &lt;string&gt;bob&lt;/string&gt;
-          &lt;key&gt;username&lt;/key&gt;
-          &lt;string&gt;bob&lt;/string&gt;
-        &lt;/dict&gt;
-      &lt;/array&gt;
-  &lt;/dict&gt;
-&lt;/plist&gt;
</del></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectorytesttest_augmentpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_augment.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/test/test_augment.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_augment.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -15,7 +15,7 @@
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav.test.util import TestCase
</span><del>-from twistedcaldav.directory.augment import AugmentXMLDB, AugmentSqliteDB,\
</del><ins>+from twistedcaldav.directory.augment import AugmentXMLDB, AugmentSqliteDB, \
</ins><span class="cx">     AugmentPostgreSQLDB, AugmentRecord
</span><span class="cx"> from twistedcaldav.directory.directory import DirectoryService
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="lines">@@ -32,46 +32,46 @@
</span><span class="cx"> xmlFileNormalization = os.path.join(os.path.dirname(__file__), &quot;augments-normalization.xml&quot;)
</span><span class="cx"> 
</span><span class="cx"> testRecords = (
</span><del>-    {&quot;uid&quot;:&quot;D11F03A0-97EA-48AF-9A6C-FAC7F3975766&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;&quot;, &quot;enabledForCalendaring&quot;:False, &quot;enabledForAddressBooks&quot;:False, &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;&quot;, &quot;enabledForCalendaring&quot;:True, &quot;enabledForAddressBooks&quot;:True, &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;5A985493-EE2C-4665-94CF-4DFEA3A89500&quot;, &quot;enabled&quot;:False, &quot;partitionID&quot;:&quot;&quot;, &quot;enabledForCalendaring&quot;:False, &quot;enabledForAddressBooks&quot;:False, &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;8B4288F6-CC82-491D-8EF9-642EF4F3E7D0&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;&quot;, &quot;enabledForCalendaring&quot;:False, &quot;enabledForAddressBooks&quot;:False, &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;00001&quot;, &quot;enabledForCalendaring&quot;:False, &quot;enabledForAddressBooks&quot;:False, &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;543D28BA-F74F-4D5F-9243-B3E3A61171E5&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;00002&quot;, &quot;enabledForCalendaring&quot;:False, &quot;enabledForAddressBooks&quot;:False, &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;6A73326A-F781-47E7-A9F8-AF47364D4152&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;00002&quot;, &quot;enabledForCalendaring&quot;:True, &quot;enabledForAddressBooks&quot;:True, &quot;autoSchedule&quot;:True, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;C5BAADEE-6B35-4FD5-A98A-5DF6BBAAC47A&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;&quot;, &quot;enabledForCalendaring&quot;:True, &quot;enabledForAddressBooks&quot;:True, &quot;autoSchedule&quot;:True, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;8AB34DF9-0297-4BA3-AADB-DB557DDD21E7&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;&quot;, &quot;enabledForCalendaring&quot;:True, &quot;enabledForAddressBooks&quot;:True, &quot;autoSchedule&quot;:True, &quot;autoScheduleMode&quot;:&quot;accept-always&quot;},
-    {&quot;uid&quot;:&quot;FC674703-8008-4A77-B80E-0DB55A9CE620&quot;, &quot;enabledForLogin&quot;:False,}, # Explicitly false
-    {&quot;uid&quot;:&quot;B473DC32-1B0D-45EE-9BAC-DA878AE9CE74&quot;, &quot;enabledForLogin&quot;:True,}, # Explicitly True
-    {&quot;uid&quot;:&quot;9F2B176D-B3F5-483A-AA63-0A1FC6E6D54B&quot;, &quot;enabledForLogin&quot;:True,}, # Default is True
</del><ins>+    {&quot;uid&quot;: &quot;D11F03A0-97EA-48AF-9A6C-FAC7F3975766&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: False, &quot;enabledForAddressBooks&quot;: False, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: True, &quot;enabledForAddressBooks&quot;: True, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;5A985493-EE2C-4665-94CF-4DFEA3A89500&quot;, &quot;enabled&quot;: False, &quot;enabledForCalendaring&quot;: False, &quot;enabledForAddressBooks&quot;: False, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;8B4288F6-CC82-491D-8EF9-642EF4F3E7D0&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: False, &quot;enabledForAddressBooks&quot;: False, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: False, &quot;enabledForAddressBooks&quot;: False, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;543D28BA-F74F-4D5F-9243-B3E3A61171E5&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: False, &quot;enabledForAddressBooks&quot;: False, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;6A73326A-F781-47E7-A9F8-AF47364D4152&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: True, &quot;enabledForAddressBooks&quot;: True, &quot;autoSchedule&quot;: True, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;C5BAADEE-6B35-4FD5-A98A-5DF6BBAAC47A&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: True, &quot;enabledForAddressBooks&quot;: True, &quot;autoSchedule&quot;: True, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;8AB34DF9-0297-4BA3-AADB-DB557DDD21E7&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: True, &quot;enabledForAddressBooks&quot;: True, &quot;autoSchedule&quot;: True, &quot;autoScheduleMode&quot;: &quot;accept-always&quot;},
+    {&quot;uid&quot;: &quot;FC674703-8008-4A77-B80E-0DB55A9CE620&quot;, &quot;enabledForLogin&quot;: False, }, # Explicitly false
+    {&quot;uid&quot;: &quot;B473DC32-1B0D-45EE-9BAC-DA878AE9CE74&quot;, &quot;enabledForLogin&quot;: True, }, # Explicitly True
+    {&quot;uid&quot;: &quot;9F2B176D-B3F5-483A-AA63-0A1FC6E6D54B&quot;, &quot;enabledForLogin&quot;: True, }, # Default is True
</ins><span class="cx"> )
</span><span class="cx"> 
</span><span class="cx"> testRecordWildcardDefault = (
</span><del>-    {&quot;uid&quot;:&quot;A4318887-F2C7-4A70-9056-B88CC8DB26F1&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;00001&quot;, &quot;enabledForCalendaring&quot;:True,  &quot;enabledForAddressBooks&quot;:True,  &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;AA5F935F-3358-4510-A649-B391D63279F2&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;00001&quot;, &quot;enabledForCalendaring&quot;:False, &quot;enabledForAddressBooks&quot;:False, &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;ABF1A83B-1A29-4E04-BDC3-A6A66ECF27CA&quot;, &quot;enabled&quot;:False, &quot;partitionID&quot;:&quot;&quot;,      &quot;enabledForCalendaring&quot;:False, &quot;enabledForAddressBooks&quot;:False, &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;BC22A734-5E41-4FB7-B5C1-51DC0656DC2F&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;00002&quot;, &quot;enabledForCalendaring&quot;:True,  &quot;enabledForAddressBooks&quot;:True,  &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;C6DEEBB1-E14A-47F2-98BA-7E3BB4353E3A&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;00003&quot;, &quot;enabledForCalendaring&quot;:True,  &quot;enabledForAddressBooks&quot;:True,  &quot;autoSchedule&quot;:True,  &quot;autoScheduleMode&quot;:&quot;accept-always&quot;},
-    {&quot;uid&quot;:&quot;AA859321-2C72-4974-ADCF-0CBA0C76F95D&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;00001&quot;, &quot;enabledForCalendaring&quot;:False, &quot;enabledForAddressBooks&quot;:False, &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;AB7C488B-9ED2-4265-881C-7E2E38A63584&quot;, &quot;enabled&quot;:False, &quot;partitionID&quot;:&quot;&quot;,      &quot;enabledForCalendaring&quot;:False, &quot;enabledForAddressBooks&quot;:False, &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;BB0C0DA1-0545-45F6-8D08-917C554D93A4&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;00002&quot;, &quot;enabledForCalendaring&quot;:True,  &quot;enabledForAddressBooks&quot;:True,  &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
-    {&quot;uid&quot;:&quot;CCD30AD3-582F-4682-8B65-2EDE92C5656E&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;00003&quot;, &quot;enabledForCalendaring&quot;:True,  &quot;enabledForAddressBooks&quot;:True,  &quot;autoSchedule&quot;:True,  &quot;autoScheduleMode&quot;:&quot;accept-always&quot;},
</del><ins>+    {&quot;uid&quot;: &quot;A4318887-F2C7-4A70-9056-B88CC8DB26F1&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: True, &quot;enabledForAddressBooks&quot;: True, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;AA5F935F-3358-4510-A649-B391D63279F2&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: False, &quot;enabledForAddressBooks&quot;: False, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;ABF1A83B-1A29-4E04-BDC3-A6A66ECF27CA&quot;, &quot;enabled&quot;: False, &quot;enabledForCalendaring&quot;: False, &quot;enabledForAddressBooks&quot;: False, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;BC22A734-5E41-4FB7-B5C1-51DC0656DC2F&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: True, &quot;enabledForAddressBooks&quot;: True, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;C6DEEBB1-E14A-47F2-98BA-7E3BB4353E3A&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: True, &quot;enabledForAddressBooks&quot;: True, &quot;autoSchedule&quot;: True, &quot;autoScheduleMode&quot;: &quot;accept-always&quot;},
+    {&quot;uid&quot;: &quot;AA859321-2C72-4974-ADCF-0CBA0C76F95D&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: False, &quot;enabledForAddressBooks&quot;: False, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;AB7C488B-9ED2-4265-881C-7E2E38A63584&quot;, &quot;enabled&quot;: False, &quot;enabledForCalendaring&quot;: False, &quot;enabledForAddressBooks&quot;: False, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;BB0C0DA1-0545-45F6-8D08-917C554D93A4&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: True, &quot;enabledForAddressBooks&quot;: True, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
+    {&quot;uid&quot;: &quot;CCD30AD3-582F-4682-8B65-2EDE92C5656E&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: True, &quot;enabledForAddressBooks&quot;: True, &quot;autoSchedule&quot;: True, &quot;autoScheduleMode&quot;: &quot;accept-always&quot;},
</ins><span class="cx"> )
</span><span class="cx"> 
</span><span class="cx"> testRecordTypeDefault = (
</span><del>-    (&quot;locations&quot;, {&quot;uid&quot;:&quot;A4318887-F2C7-4A70-9056-B88CC8DB26F1&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;00004&quot;, &quot;enabledForCalendaring&quot;:True,  &quot;enabledForAddressBooks&quot;:False,  &quot;autoSchedule&quot;:True, &quot;autoScheduleMode&quot;:&quot;default&quot;}),
-    (&quot;locations&quot;, {&quot;uid&quot;:&quot;AA5F935F-3358-4510-A649-B391D63279F2&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;00005&quot;, &quot;enabledForCalendaring&quot;:True, &quot;enabledForAddressBooks&quot;:False, &quot;autoSchedule&quot;:True, &quot;autoScheduleMode&quot;:&quot;default&quot;}),
-    (&quot;resources&quot;, {&quot;uid&quot;:&quot;A5318887-F2C7-4A70-9056-B88CC8DB26F1&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;00006&quot;, &quot;enabledForCalendaring&quot;:True,  &quot;enabledForAddressBooks&quot;:False,  &quot;autoSchedule&quot;:True, &quot;autoScheduleMode&quot;:&quot;default&quot;}),
-    (&quot;resources&quot;, {&quot;uid&quot;:&quot;AA6F935F-3358-4510-A649-B391D63279F2&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;00007&quot;, &quot;enabledForCalendaring&quot;:True, &quot;enabledForAddressBooks&quot;:False, &quot;autoSchedule&quot;:True, &quot;autoScheduleMode&quot;:&quot;default&quot;}),
</del><ins>+    (&quot;locations&quot;, {&quot;uid&quot;: &quot;A4318887-F2C7-4A70-9056-B88CC8DB26F1&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: True, &quot;enabledForAddressBooks&quot;: False, &quot;autoSchedule&quot;: True, &quot;autoScheduleMode&quot;: &quot;default&quot;}),
+    (&quot;locations&quot;, {&quot;uid&quot;: &quot;AA5F935F-3358-4510-A649-B391D63279F2&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: True, &quot;enabledForAddressBooks&quot;: False, &quot;autoSchedule&quot;: True, &quot;autoScheduleMode&quot;: &quot;default&quot;}),
+    (&quot;resources&quot;, {&quot;uid&quot;: &quot;A5318887-F2C7-4A70-9056-B88CC8DB26F1&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: True, &quot;enabledForAddressBooks&quot;: False, &quot;autoSchedule&quot;: True, &quot;autoScheduleMode&quot;: &quot;default&quot;}),
+    (&quot;resources&quot;, {&quot;uid&quot;: &quot;AA6F935F-3358-4510-A649-B391D63279F2&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: True, &quot;enabledForAddressBooks&quot;: False, &quot;autoSchedule&quot;: True, &quot;autoScheduleMode&quot;: &quot;default&quot;}),
</ins><span class="cx"> )
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> testAddRecords = (
</span><del>-    {&quot;uid&quot;:&quot;D11F03A0-97EA-48AF-9A6C-FAC7F3975767&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;&quot;, &quot;enabledForCalendaring&quot;:False, &quot;enabledForAddressBooks&quot;:False, &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
</del><ins>+    {&quot;uid&quot;: &quot;D11F03A0-97EA-48AF-9A6C-FAC7F3975767&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: False, &quot;enabledForAddressBooks&quot;: False, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
</ins><span class="cx"> )
</span><span class="cx"> 
</span><span class="cx"> testModifyRecords = (
</span><del>-    {&quot;uid&quot;:&quot;D11F03A0-97EA-48AF-9A6C-FAC7F3975767&quot;, &quot;enabled&quot;:True,  &quot;partitionID&quot;:&quot;&quot;, &quot;enabledForCalendaring&quot;:True, &quot;enabledForAddressBooks&quot;:True, &quot;autoSchedule&quot;:False, &quot;autoScheduleMode&quot;:&quot;default&quot;},
</del><ins>+    {&quot;uid&quot;: &quot;D11F03A0-97EA-48AF-9A6C-FAC7F3975767&quot;, &quot;enabled&quot;: True, &quot;enabledForCalendaring&quot;: True, &quot;enabledForAddressBooks&quot;: True, &quot;autoSchedule&quot;: False, &quot;autoScheduleMode&quot;: &quot;default&quot;},
</ins><span class="cx"> )
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -79,27 +79,31 @@
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _checkRecord(self, db, items, recordType=DirectoryService.recordType_users):
</span><del>-        
</del><ins>+
</ins><span class="cx">         record = (yield db.getAugmentRecord(items[&quot;uid&quot;], recordType))
</span><span class="cx">         self.assertTrue(record is not None, &quot;Failed record uid: %s&quot; % (items[&quot;uid&quot;],))
</span><del>-        
-        for k,v in items.iteritems():
-            self.assertEqual(getattr(record, k), v, &quot;Failed record uid: %s, attribute: %s&quot; % (items[&quot;uid&quot;], k, ))
</del><span class="cx"> 
</span><ins>+        for k, v in items.iteritems():
+            self.assertEqual(getattr(record, k), v, &quot;Failed record uid: %s, attribute: %s&quot; % (items[&quot;uid&quot;], k,))
+
+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _checkRecordExists(self, db, uid, recordType=DirectoryService.recordType_users):
</span><del>-        
</del><ins>+
</ins><span class="cx">         record = (yield db.getAugmentRecord(uid, recordType))
</span><span class="cx">         self.assertTrue(record is not None, &quot;Failed record uid: %s&quot; % (uid,))
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> class AugmentTestsMixin(object):
</span><span class="cx"> 
</span><span class="cx">     def _db(self, dbpath=None):
</span><span class="cx">         raise NotImplementedError
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_read(self):
</span><del>-        
</del><ins>+
</ins><span class="cx">         dbpath = os.path.abspath(self.mktemp())
</span><span class="cx">         db = self._db(dbpath)
</span><span class="cx"> 
</span><span class="lines">@@ -113,9 +117,10 @@
</span><span class="cx">         # in the DB
</span><span class="cx">         yield self._checkRecordExists(db, &quot;D11F03A0-97EA-48AF-9A6C-FAC7F3975767&quot;)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_read_default(self):
</span><del>-        
</del><ins>+
</ins><span class="cx">         dbpath = os.path.abspath(self.mktemp())
</span><span class="cx">         db = self._db(dbpath)
</span><span class="cx"> 
</span><span class="lines">@@ -132,6 +137,7 @@
</span><span class="cx">         for item in testRecordWildcardDefault:
</span><span class="cx">             yield self._checkRecord(db, item)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_read_typed_default(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -159,7 +165,7 @@
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_add_modify(self):
</span><del>-        
</del><ins>+
</ins><span class="cx">         dbpath = os.path.abspath(self.mktemp())
</span><span class="cx">         db = self._db(dbpath)
</span><span class="cx"> 
</span><span class="lines">@@ -195,11 +201,13 @@
</span><span class="cx">             yield self._checkRecord(newdb, item)
</span><span class="cx">         yield self._checkRecord(newdb, testModifyRecords[0])
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> class AugmentXMLTests(AugmentTests):
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_read(self):
</span><del>-        
</del><ins>+
</ins><span class="cx">         db = AugmentXMLDB((xmlFile,))
</span><span class="cx"> 
</span><span class="cx">         for item in testRecords:
</span><span class="lines">@@ -209,9 +217,10 @@
</span><span class="cx">         # in the DB
</span><span class="cx">         yield self._checkRecordExists(db, &quot;D11F03A0-97EA-48AF-9A6C-FAC7F3975767&quot;)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_read_default(self):
</span><del>-        
</del><ins>+
</ins><span class="cx">         db = AugmentXMLDB((xmlFileDefault,))
</span><span class="cx"> 
</span><span class="cx">         for item in testRecords:
</span><span class="lines">@@ -220,8 +229,9 @@
</span><span class="cx">         for item in testRecordWildcardDefault:
</span><span class="cx">             yield self._checkRecord(db, item)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def test_parseErrors(self):
</span><del>-        
</del><ins>+
</ins><span class="cx">         db = {}
</span><span class="cx">         self.assertRaises(RuntimeError, XMLAugmentsParser, cStringIO.StringIO(&quot;&quot;), db)
</span><span class="cx">         self.assertRaises(RuntimeError, XMLAugmentsParser, cStringIO.StringIO(&quot;&quot;&quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="lines">@@ -249,13 +259,14 @@
</span><span class="cx">   &lt;/record&gt;
</span><span class="cx"> &quot;&quot;&quot;), db)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_add_modify(self):
</span><del>-        
</del><ins>+
</ins><span class="cx">         # Duplicate file as we will change it
</span><span class="cx">         newxmlfile = FilePath(self.mktemp())
</span><span class="cx">         FilePath(xmlFile).copyTo(newxmlfile)
</span><del>-        
</del><ins>+
</ins><span class="cx">         db = AugmentXMLDB((newxmlfile.path,))
</span><span class="cx"> 
</span><span class="cx">         for item in testRecords:
</span><span class="lines">@@ -283,6 +294,7 @@
</span><span class="cx">             yield self._checkRecord(newdb, item)
</span><span class="cx">         yield self._checkRecord(newdb, testModifyRecords[0])
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def test_shouldReparse(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Verify that a change to the file will get noticed
</span><span class="lines">@@ -294,6 +306,7 @@
</span><span class="cx">         newxmlfile.setContent(&quot;&quot;) # Change the file
</span><span class="cx">         self.assertTrue(db._shouldReparse([newxmlfile.path])) # Need to parse
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def test_refresh(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Ensure that a refresh without any file changes doesn't zero out the
</span><span class="lines">@@ -304,6 +317,7 @@
</span><span class="cx">         dbxml.refresh()
</span><span class="cx">         self.assertEquals(keys, dbxml.db.keys())
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def uidsFromFile(self, filename):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Return all uids from the augments xml file
</span><span class="lines">@@ -316,6 +330,7 @@
</span><span class="cx">             uid = record_node.find(xmlaugmentsparser.ELEMENT_UID).text
</span><span class="cx">             yield uid
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def test_normalize(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Ensure augment uids are normalized upon opening
</span><span class="lines">@@ -328,11 +343,15 @@
</span><span class="cx">         uids = list(self.uidsFromFile(newxmlfile.path))
</span><span class="cx">         self.assertEquals(uids, ['AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA'])
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> class AugmentSqliteTests(AugmentTests, AugmentTestsMixin):
</span><span class="cx"> 
</span><span class="cx">     def _db(self, dbpath=None):
</span><span class="cx">         return AugmentSqliteDB(dbpath if dbpath else os.path.abspath(self.mktemp()))
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> class AugmentPostgreSQLTests(AugmentTests, AugmentTestsMixin):
</span><span class="cx"> 
</span><span class="cx">     def _db(self, dbpath=None):
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectorytesttest_ldapdirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_ldapdirectory.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/test/test_ldapdirectory.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_ldapdirectory.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -276,6 +276,7 @@
</span><span class="cx">                     entry[&quot;expected&quot;]
</span><span class="cx">                 )
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     class StubList(object):
</span><span class="cx">         def __init__(self, wrapper):
</span><span class="cx">             self.ldap = wrapper
</span><span class="lines">@@ -293,6 +294,7 @@
</span><span class="cx">             self.allResults = self.ldap.search_s(self.base, self.scope,
</span><span class="cx">                 self.filterstr, attrlist=self.attrList)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     class StubAsync(object):
</span><span class="cx">         def List(self, wrapper):
</span><span class="cx">             return StubList(wrapper)
</span><span class="lines">@@ -304,7 +306,6 @@
</span><span class="cx">         whatever you have previously called addTestResults( ) with.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-
</del><span class="cx">         def __init__(self, actual, records):
</span><span class="cx">             self.actual = actual
</span><span class="cx">             self.async = StubAsync()
</span><span class="lines">@@ -587,9 +588,8 @@
</span><span class="cx">                     &quot;readOnlyProxyAttr&quot;: &quot;read-only-proxy&quot;,
</span><span class="cx">                     &quot;autoAcceptGroupAttr&quot;: None,
</span><span class="cx">                 },
</span><del>-                &quot;partitionSchema&quot;: {
</del><ins>+                &quot;poddingSchema&quot;: {
</ins><span class="cx">                     &quot;serverIdAttr&quot;: &quot;server-id&quot;, # maps to augments server-id
</span><del>-                    &quot;partitionIdAttr&quot;: &quot;partition-id&quot;, # maps to augments partition-id
</del><span class="cx">                 },
</span><span class="cx">             }
</span><span class="cx">         )
</span><span class="lines">@@ -803,9 +803,8 @@
</span><span class="cx">                     &quot;readOnlyProxyAttr&quot;: None,
</span><span class="cx">                     &quot;autoAcceptGroupAttr&quot;: None,
</span><span class="cx">                 },
</span><del>-                &quot;partitionSchema&quot;: {
</del><ins>+                &quot;poddingSchema&quot;: {
</ins><span class="cx">                     &quot;serverIdAttr&quot;: &quot;server-id&quot;, # maps to augments server-id
</span><del>-                    &quot;partitionIdAttr&quot;: &quot;partition-id&quot;, # maps to augments partition-id
</del><span class="cx">                 },
</span><span class="cx">             }
</span><span class="cx">         )
</span><span class="lines">@@ -1021,9 +1020,8 @@
</span><span class="cx">                     &quot;readOnlyProxyAttr&quot;: None,
</span><span class="cx">                     &quot;autoAcceptGroupAttr&quot;: None,
</span><span class="cx">                 },
</span><del>-                &quot;partitionSchema&quot;: {
</del><ins>+                &quot;poddingSchema&quot;: {
</ins><span class="cx">                     &quot;serverIdAttr&quot;: &quot;server-id&quot;, # maps to augments server-id
</span><del>-                    &quot;partitionIdAttr&quot;: &quot;partition-id&quot;, # maps to augments partition-id
</del><span class="cx">                 },
</span><span class="cx">             }
</span><span class="cx">         )
</span><span class="lines">@@ -1235,9 +1233,8 @@
</span><span class="cx">                     &quot;readOnlyProxyAttr&quot;: None,
</span><span class="cx">                     &quot;autoAcceptGroupAttr&quot;: None,
</span><span class="cx">                 },
</span><del>-                &quot;partitionSchema&quot;: {
</del><ins>+                &quot;poddingSchema&quot;: {
</ins><span class="cx">                     &quot;serverIdAttr&quot;: &quot;server-id&quot;, # maps to augments server-id
</span><del>-                    &quot;partitionIdAttr&quot;: &quot;partition-id&quot;, # maps to augments partition-id
</del><span class="cx">                 },
</span><span class="cx">             }
</span><span class="cx">         )
</span><span class="lines">@@ -1295,7 +1292,6 @@
</span><span class="cx">             self.assertEquals(record.firstName, 'Amanda')
</span><span class="cx">             self.assertEquals(record.lastName, 'Test')
</span><span class="cx">             self.assertEquals(record.serverID, None)
</span><del>-            self.assertEquals(record.partitionID, None)
</del><span class="cx">             self.assertFalse(record.enabledForCalendaring)
</span><span class="cx"> 
</span><span class="cx">             # User with enabled-for-calendaring specified
</span><span class="lines">@@ -1325,13 +1321,11 @@
</span><span class="cx">                 'apple-generateduid': [guid],
</span><span class="cx">                 'cn': ['Amanda Test'],
</span><span class="cx">                 'server-id' : [&quot;test-server-id&quot;],
</span><del>-                'partition-id' : [&quot;test-partition-id&quot;],
</del><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             record = self.service._ldapResultToRecord(dn, attrs,
</span><span class="cx">                 self.service.recordType_users)
</span><span class="cx">             self.assertEquals(record.serverID, &quot;test-server-id&quot;)
</span><del>-            self.assertEquals(record.partitionID, &quot;test-partition-id&quot;)
</del><span class="cx"> 
</span><span class="cx">             # User missing guidAttr
</span><span class="cx"> 
</span><span class="lines">@@ -1471,7 +1465,6 @@
</span><span class="cx">             self.assertFalse(record.autoSchedule)
</span><span class="cx">             self.assertEquals(record.autoAcceptGroup, &quot;&quot;)
</span><span class="cx"> 
</span><del>-
</del><span class="cx">             # Now switch off the resourceInfoAttr and switch to individual
</span><span class="cx">             # attributes...
</span><span class="cx">             self.service.resourceSchema = {
</span><span class="lines">@@ -1625,7 +1618,6 @@
</span><span class="cx">                 self.assertFalse(self.service.isAllowedByRestrictToGroup(dn, attrs))
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-
</del><span class="cx">         @inlineCallbacks
</span><span class="cx">         def test_groupMembershipAliases(self):
</span><span class="cx">             &quot;&quot;&quot;
</span><span class="lines">@@ -1680,7 +1672,6 @@
</span><span class="cx">             )
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-
</del><span class="cx">         def test_splitIntoBatches(self):
</span><span class="cx">             self.setupService(self.nestedUsingDifferentAttributeUsingDN)
</span><span class="cx">             # Data is perfect multiple of size
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectoryxmlaugmentsparserpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/directory/xmlaugmentsparser.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/xmlaugmentsparser.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/directory/xmlaugmentsparser.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -30,38 +30,36 @@
</span><span class="cx"> 
</span><span class="cx"> log = Logger()
</span><span class="cx"> 
</span><del>-ELEMENT_AUGMENTS          = &quot;augments&quot;
-ELEMENT_RECORD            = &quot;record&quot;
</del><ins>+ELEMENT_AUGMENTS = &quot;augments&quot;
+ELEMENT_RECORD = &quot;record&quot;
</ins><span class="cx"> 
</span><del>-ELEMENT_UID               = &quot;uid&quot;
-ELEMENT_ENABLE            = &quot;enable&quot;
-ELEMENT_SERVERID          = &quot;server-id&quot;
-ELEMENT_PARTITIONID       = &quot;partition-id&quot;
-ELEMENT_HOSTEDAT          = &quot;hosted-at&quot;   # Backwards compatibility
-ELEMENT_ENABLECALENDAR    = &quot;enable-calendar&quot;
</del><ins>+ELEMENT_UID = &quot;uid&quot;
+ELEMENT_ENABLE = &quot;enable&quot;
+ELEMENT_SERVERID = &quot;server-id&quot;
+ELEMENT_PARTITIONID = &quot;partition-id&quot;   # Backwards compatibility
+ELEMENT_HOSTEDAT = &quot;hosted-at&quot;   # Backwards compatibility
+ELEMENT_ENABLECALENDAR = &quot;enable-calendar&quot;
</ins><span class="cx"> ELEMENT_ENABLEADDRESSBOOK = &quot;enable-addressbook&quot;
</span><del>-ELEMENT_ENABLELOGIN       = &quot;enable-login&quot;
-ELEMENT_AUTOSCHEDULE      = &quot;auto-schedule&quot;
</del><ins>+ELEMENT_ENABLELOGIN = &quot;enable-login&quot;
+ELEMENT_AUTOSCHEDULE = &quot;auto-schedule&quot;
</ins><span class="cx"> ELEMENT_AUTOSCHEDULE_MODE = &quot;auto-schedule-mode&quot;
</span><del>-ELEMENT_AUTOACCEPTGROUP   = &quot;auto-accept-group&quot;
</del><ins>+ELEMENT_AUTOACCEPTGROUP = &quot;auto-accept-group&quot;
</ins><span class="cx"> 
</span><del>-ATTRIBUTE_REPEAT          = &quot;repeat&quot;
</del><ins>+ATTRIBUTE_REPEAT = &quot;repeat&quot;
</ins><span class="cx"> 
</span><del>-VALUE_TRUE                = &quot;true&quot;
-VALUE_FALSE               = &quot;false&quot;
</del><ins>+VALUE_TRUE = &quot;true&quot;
+VALUE_FALSE = &quot;false&quot;
</ins><span class="cx"> 
</span><span class="cx"> ELEMENT_AUGMENTRECORD_MAP = {
</span><del>-    ELEMENT_UID:               &quot;uid&quot;,
-    ELEMENT_ENABLE:            &quot;enabled&quot;,
-    ELEMENT_SERVERID:          &quot;serverID&quot;,
-    ELEMENT_PARTITIONID:       &quot;partitionID&quot;,
-    ELEMENT_HOSTEDAT:          &quot;partitionID&quot;,   # Backwards compatibility
-    ELEMENT_ENABLECALENDAR:    &quot;enabledForCalendaring&quot;,
</del><ins>+    ELEMENT_UID: &quot;uid&quot;,
+    ELEMENT_ENABLE: &quot;enabled&quot;,
+    ELEMENT_SERVERID: &quot;serverID&quot;,
+    ELEMENT_ENABLECALENDAR: &quot;enabledForCalendaring&quot;,
</ins><span class="cx">     ELEMENT_ENABLEADDRESSBOOK: &quot;enabledForAddressBooks&quot;,
</span><del>-    ELEMENT_ENABLELOGIN:       &quot;enabledForLogin&quot;,
-    ELEMENT_AUTOSCHEDULE:      &quot;autoSchedule&quot;,
</del><ins>+    ELEMENT_ENABLELOGIN: &quot;enabledForLogin&quot;,
+    ELEMENT_AUTOSCHEDULE: &quot;autoSchedule&quot;,
</ins><span class="cx">     ELEMENT_AUTOSCHEDULE_MODE: &quot;autoScheduleMode&quot;,
</span><del>-    ELEMENT_AUTOACCEPTGROUP:   &quot;autoAcceptGroup&quot;,
</del><ins>+    ELEMENT_AUTOACCEPTGROUP: &quot;autoAcceptGroup&quot;,
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> class XMLAugmentsParser(object):
</span><span class="lines">@@ -71,6 +69,7 @@
</span><span class="cx">     def __repr__(self):
</span><span class="cx">         return &quot;&lt;%s %r&gt;&quot; % (self.__class__.__name__, self.xmlFile)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def __init__(self, xmlFile, items):
</span><span class="cx"> 
</span><span class="cx">         self.items = items
</span><span class="lines">@@ -84,13 +83,14 @@
</span><span class="cx"> 
</span><span class="cx">         self._parseXML(augments_node)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def _parseXML(self, rootnode):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Parse the XML root node from the augments configuration document.
</span><span class="cx">         @param rootnode: the L{Element} to parse.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         for child in rootnode:
</span><del>-            
</del><ins>+
</ins><span class="cx">             if child.tag != ELEMENT_RECORD:
</span><span class="cx">                 raise RuntimeError(&quot;Unknown augment type: '%s' in augment file: '%s'&quot; % (child.tag, self.xmlFile,))
</span><span class="cx"> 
</span><span class="lines">@@ -98,7 +98,7 @@
</span><span class="cx"> 
</span><span class="cx">             fields = {}
</span><span class="cx">             for node in child:
</span><del>-                
</del><ins>+
</ins><span class="cx">                 if node.tag in (
</span><span class="cx">                     ELEMENT_UID,
</span><span class="cx">                     ELEMENT_SERVERID,
</span><span class="lines">@@ -118,33 +118,35 @@
</span><span class="cx">                     fields[node.tag] = node.text == VALUE_TRUE
</span><span class="cx">                 else:
</span><span class="cx">                     raise RuntimeError(&quot;Invalid element '%s' in augment file: '%s'&quot; % (node.tag, self.xmlFile,))
</span><del>-                    
</del><ins>+
</ins><span class="cx">             # Must have at least a uid
</span><span class="cx">             if ELEMENT_UID not in fields:
</span><span class="cx">                 raise RuntimeError(&quot;Invalid record '%s' without a uid in augment file: '%s'&quot; % (child, self.xmlFile,))
</span><del>-                
</del><ins>+
</ins><span class="cx">             if repeat &gt; 1:
</span><del>-                for i in xrange(1, repeat+1):
</del><ins>+                for i in xrange(1, repeat + 1):
</ins><span class="cx">                     self.buildRecord(fields, i)
</span><span class="cx">             else:
</span><span class="cx">                 self.buildRecord(fields)
</span><del>-    
</del><ins>+
+
</ins><span class="cx">     def buildRecord(self, fields, count=None):
</span><del>-        
</del><ins>+
</ins><span class="cx">         from twistedcaldav.directory.augment import AugmentRecord
</span><span class="cx"> 
</span><span class="cx">         def expandCount(value, count):
</span><del>-            
</del><ins>+
</ins><span class="cx">             if type(value) in types.StringTypes:
</span><span class="cx">                 return value % (count,) if count and &quot;%&quot; in value else value
</span><span class="cx">             elif type(value) == set:
</span><span class="cx">                 return set([item % (count,) if count and &quot;%&quot; in item else item for item in value])
</span><span class="cx">             else:
</span><span class="cx">                 return value
</span><del>-        
</del><ins>+
</ins><span class="cx">         actualFields = {}
</span><del>-        for k,v in fields.iteritems():
-            actualFields[ELEMENT_AUGMENTRECORD_MAP[k]] = expandCount(v, count)
</del><ins>+        for k, v in fields.iteritems():
+            if k in ELEMENT_AUGMENTRECORD_MAP:
+                actualFields[ELEMENT_AUGMENTRECORD_MAP[k]] = expandCount(v, count)
</ins><span class="cx"> 
</span><span class="cx">         record = AugmentRecord(**actualFields)
</span><span class="cx">         self.items[record.uid] = record
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavstdconfigpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/stdconfig.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/stdconfig.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/twistedcaldav/stdconfig.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -156,9 +156,8 @@
</span><span class="cx">             &quot;resourceInfoAttr&quot;: None, # contains location/resource info
</span><span class="cx">             &quot;autoAcceptGroupAttr&quot;: None, # auto accept group
</span><span class="cx">         },
</span><del>-        &quot;partitionSchema&quot;: {
</del><ins>+        &quot;poddingSchema&quot;: {
</ins><span class="cx">             &quot;serverIdAttr&quot;: None, # maps to augments server-id
</span><del>-            &quot;partitionIdAttr&quot;: None, # maps to augments partition-id
</del><span class="cx">         },
</span><span class="cx">     },
</span><span class="cx"> }
</span><span class="lines">@@ -806,12 +805,11 @@
</span><span class="cx">     # Support multiple hosts within a domain
</span><span class="cx">     #
</span><span class="cx">     &quot;Servers&quot; : {
</span><del>-        &quot;Enabled&quot;: False,                   # Multiple servers/partitions enabled or not
</del><ins>+        &quot;Enabled&quot;: False,                   # Multiple servers enabled or not
</ins><span class="cx">         &quot;ConfigFile&quot;: &quot;localservers.xml&quot;,   # File path for server information
</span><del>-        &quot;MaxClients&quot;: 5,                    # Pool size for connections to each partition
</del><ins>+        &quot;MaxClients&quot;: 5,                    # Pool size for connections to between servers
</ins><span class="cx">         &quot;InboxName&quot;: &quot;podding&quot;,             # Name for top-level inbox resource
</span><span class="cx">     },
</span><del>-    &quot;ServerPartitionID&quot;: &quot;&quot;, # Unique ID for this server's partition instance.
</del><span class="cx"> 
</span><span class="cx">     #
</span><span class="cx">     # Performance tuning
</span><span class="lines">@@ -1012,7 +1010,8 @@
</span><span class="cx">     # means no automatic shutdown.
</span><span class="cx">     &quot;AgentInactivityTimeoutSeconds&quot;  : 4 * 60 * 60,
</span><span class="cx"> 
</span><del>-    # These two aren't relative to ConfigRoot:
</del><ins>+    # These aren't relative to ConfigRoot:
+    &quot;ImportConfig&quot;: &quot;&quot;, # Config to read first and merge
</ins><span class="cx">     &quot;Includes&quot;: [], # Other plists to parse after this one
</span><span class="cx">     &quot;WritableConfigFile&quot; : &quot;&quot;, # which config file calendarserver_config should
</span><span class="cx">         # write to for changes; empty string means the main config file.
</span><span class="lines">@@ -1044,19 +1043,41 @@
</span><span class="cx">         if self._configFileName:
</span><span class="cx">             configDict = self._parseConfigFromFile(self._configFileName)
</span><span class="cx">         configDict = ConfigDict(configDict)
</span><del>-        # Now check for Includes and parse and add each of those
-        if &quot;Includes&quot; in configDict:
-            configRoot = os.path.join(configDict.ServerRoot, configDict.ConfigRoot)
-            for include in configDict.Includes:
-                # Includes are not relative to ConfigRoot
-                path = _expandPath(fullServerPath(configRoot, include))
</del><ins>+
+        def _loadImport(childDict):
+            # Look for an import and read that one as the main config and merge the current one into that
+            if &quot;ImportConfig&quot; in childDict and childDict.ImportConfig:
+                configRoot = os.path.join(childDict.ServerRoot, childDict.ConfigRoot)
+                path = _expandPath(fullServerPath(configRoot, childDict.ImportConfig))
</ins><span class="cx">                 if os.path.exists(path):
</span><del>-                    additionalDict = ConfigDict(self._parseConfigFromFile(path))
-                    if additionalDict:
-                        log.info(&quot;Adding configuration from file: '%s'&quot; % (path,))
-                        mergeData(configDict, additionalDict)
-                else:
-                    log.debug(&quot;Missing configuration file: '%s'&quot; % (path,))
</del><ins>+                    importDict = ConfigDict(self._parseConfigFromFile(path))
+                    if importDict:
+                        self.importedFiles.append(path)
+                        importDict = _loadImport(importDict)
+                        mergeData(importDict, childDict)
+                        return importDict
+                raise ConfigurationError(&quot;Import configuration file '{path}' must exist and be valid.&quot;.format(path=path))
+            else:
+                return childDict
+
+        def _loadIncludes(parentDict):
+            # Now check for Includes and parse and add each of those
+            if &quot;Includes&quot; in parentDict:
+                configRoot = os.path.join(parentDict.ServerRoot, parentDict.ConfigRoot)
+                for include in parentDict.Includes:
+                    # Includes are not relative to ConfigRoot
+                    path = _expandPath(fullServerPath(configRoot, include))
+                    if os.path.exists(path):
+                        additionalDict = ConfigDict(self._parseConfigFromFile(path))
+                        if additionalDict:
+                            self.includedFiles.append(path)
+                            _loadIncludes(additionalDict)
+                            mergeData(parentDict, additionalDict)
+                    else:
+                        self.missingFiles.append(path)
+
+        configDict = _loadImport(configDict)
+        _loadIncludes(configDict)
</ins><span class="cx">         return configDict
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1520,8 +1541,7 @@
</span><span class="cx">     from txdav.caldav.datastore.scheduling.ischedule.localservers import Servers
</span><span class="cx">     if configDict.Servers.Enabled:
</span><span class="cx">         Servers.load()
</span><del>-        Servers.getThisServer().installReverseProxies(
-            configDict.ServerPartitionID,
</del><ins>+        Servers.installReverseProxies(
</ins><span class="cx">             configDict.Servers.MaxClients,
</span><span class="cx">         )
</span><span class="cx">     else:
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingaddressmappingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/addressmapping.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/addressmapping.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/addressmapping.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -53,7 +53,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def getCalendarUser(self, cuaddr, principal):
</span><span class="cx"> 
</span><del>-        # If we have a principal always treat the user as local or partitioned
</del><ins>+        # If we have a principal always treat the user as local
</ins><span class="cx">         if principal:
</span><span class="cx">             returnValue(calendarUserFromPrincipal(cuaddr, principal))
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingcaldavdeliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/caldav/delivery.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/caldav/delivery.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/caldav/delivery.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -26,8 +26,7 @@
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> 
</span><span class="cx"> from txdav.base.propertystore.base import PropertyName
</span><del>-from txdav.caldav.datastore.scheduling.cuaddress import LocalCalendarUser, RemoteCalendarUser, \
-    PartitionedCalendarUser, OtherServerCalendarUser
</del><ins>+from txdav.caldav.datastore.scheduling.cuaddress import LocalCalendarUser, RemoteCalendarUser, OtherServerCalendarUser
</ins><span class="cx"> from txdav.caldav.datastore.scheduling.delivery import DeliveryService
</span><span class="cx"> from txdav.caldav.datastore.scheduling.freebusy import processAvailabilityFreeBusy, \
</span><span class="cx">     generateFreeBusyInfo, buildFreeBusyResult
</span><span class="lines">@@ -99,7 +98,7 @@
</span><span class="cx">         uid = self.scheduler.calendar.resourceUID()
</span><span class="cx"> 
</span><span class="cx">         organizerPrincipal = None
</span><del>-        if type(self.scheduler.organizer) in (LocalCalendarUser, PartitionedCalendarUser, OtherServerCalendarUser,):
</del><ins>+        if type(self.scheduler.organizer) in (LocalCalendarUser, OtherServerCalendarUser,):
</ins><span class="cx">             organizerPrincipal = self.scheduler.organizer.principal.uid
</span><span class="cx"> 
</span><span class="cx">         for recipient in self.recipients:
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingcaldavschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/caldav/scheduler.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/caldav/scheduler.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/caldav/scheduler.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -102,7 +102,7 @@
</span><span class="cx">             ))
</span><span class="cx">         else:
</span><span class="cx">             if not (originatorPrincipal.calendarsEnabled() and originatorPrincipal.thisServer()):
</span><del>-                log.err(&quot;Originator not enabled or hosted on this server: %s&quot; % (self.originator,))
</del><ins>+                log.error(&quot;Originator not enabled or hosted on this server: %s&quot; % (self.originator,))
</ins><span class="cx">                 raise HTTPError(self.errorResponse(
</span><span class="cx">                     responsecode.FORBIDDEN,
</span><span class="cx">                     self.errorElements[&quot;originator-denied&quot;],
</span><span class="lines">@@ -136,7 +136,7 @@
</span><span class="cx">                 # Map recipient to their inbox
</span><span class="cx">                 inbox = None
</span><span class="cx">                 if principal.calendarsEnabled():
</span><del>-                    if principal.locallyHosted():
</del><ins>+                    if principal.thisServer():
</ins><span class="cx">                         recipient_home = yield self.txn.calendarHomeWithUID(principal.uid, create=True)
</span><span class="cx">                         if recipient_home:
</span><span class="cx">                             inbox = (yield recipient_home.calendarWithName(&quot;inbox&quot;))
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingcuaddresspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/cuaddress.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/cuaddress.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/cuaddress.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -21,7 +21,6 @@
</span><span class="cx"> 
</span><span class="cx"> __all__ = [
</span><span class="cx">     &quot;LocalCalendarUser&quot;,
</span><del>-    &quot;PartitionedCalendarUser&quot;,
</del><span class="cx">     &quot;OtherServerCalendarUser&quot;,
</span><span class="cx">     &quot;RemoteCalendarUser&quot;,
</span><span class="cx">     &quot;EmailCalendarUser&quot;,
</span><span class="lines">@@ -53,19 +52,6 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-class PartitionedCalendarUser(CalendarUser):
-
-    def __init__(self, cuaddr, principal):
-        self.cuaddr = cuaddr
-        self.principal = principal
-        self.serviceType = DeliveryService.serviceType_ischedule
-
-
-    def __str__(self):
-        return &quot;Partitioned calendar user: %s&quot; % (self.cuaddr,)
-
-
-
</del><span class="cx"> class OtherServerCalendarUser(CalendarUser):
</span><span class="cx"> 
</span><span class="cx">     def __init__(self, cuaddr, principal):
</span><span class="lines">@@ -145,9 +131,7 @@
</span><span class="cx">     Get the appropriate calendar user address class for the provided principal.
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    if principal.locallyHosted():
</del><ins>+    if principal.thisServer():
</ins><span class="cx">         return LocalCalendarUser(recipient, principal, inbox)
</span><del>-    elif principal.thisServer():
-        return PartitionedCalendarUser(recipient, principal)
</del><span class="cx">     else:
</span><span class="cx">         return OtherServerCalendarUser(recipient, principal)
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingimplicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/implicit.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/implicit.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/implicit.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -29,7 +29,7 @@
</span><span class="cx"> from txdav.caldav.datastore.scheduling import addressmapping
</span><span class="cx"> from txdav.caldav.datastore.scheduling.caldav.scheduler import CalDAVScheduler
</span><span class="cx"> from txdav.caldav.datastore.scheduling.cuaddress import InvalidCalendarUser, \
</span><del>-    LocalCalendarUser, PartitionedCalendarUser, OtherServerCalendarUser, \
</del><ins>+    LocalCalendarUser, OtherServerCalendarUser, \
</ins><span class="cx">     normalizeCUAddr
</span><span class="cx"> from txdav.caldav.datastore.scheduling.icaldiff import iCalDiff
</span><span class="cx"> from txdav.caldav.datastore.scheduling.itip import iTipGenerator, iTIPRequestStatus
</span><span class="lines">@@ -251,7 +251,7 @@
</span><span class="cx">         # to create new scheduling resources.
</span><span class="cx">         if self.action == &quot;create&quot;:
</span><span class="cx">             if self.organizerPrincipal and not self.organizerPrincipal.enabledAsOrganizer():
</span><del>-                log.error(&quot;ORGANIZER not allowed to be an Organizer: %s&quot; % (self.organizer,))
</del><ins>+                log.error(&quot;ORGANIZER not allowed to be an Organizer: {organizer}&quot;, organizer=self.organizer)
</ins><span class="cx">                 raise HTTPError(ErrorResponse(
</span><span class="cx">                     responsecode.FORBIDDEN,
</span><span class="cx">                     (caldav_namespace, &quot;organizer-allowed&quot;),
</span><span class="lines">@@ -427,7 +427,7 @@
</span><span class="cx">             self.organizer = self.calendar.validOrganizerForScheduling()
</span><span class="cx">         except ValueError:
</span><span class="cx">             # We have different ORGANIZERs in the same iCalendar object - this is an error
</span><del>-            log.error(&quot;Only one ORGANIZER is allowed in an iCalendar object:\n%s&quot; % (self.calendar,))
</del><ins>+            log.error(&quot;Only one ORGANIZER is allowed in an iCalendar object:\n{calendar}&quot;, calendar=self.calendar)
</ins><span class="cx">             raise HTTPError(ErrorResponse(
</span><span class="cx">                 responsecode.FORBIDDEN,
</span><span class="cx">                 (caldav_namespace, &quot;single-organizer&quot;),
</span><span class="lines">@@ -462,7 +462,7 @@
</span><span class="cx">         # Check for matching resource somewhere else in the home
</span><span class="cx">         foundElsewhere = (yield self.calendar_home.hasCalendarResourceUIDSomewhereElse(self.uid, check_resource, mode))
</span><span class="cx">         if foundElsewhere is not None:
</span><del>-            log.debug(&quot;Implicit - found component with same UID in a different collection: %s&quot; % (check_resource,))
</del><ins>+            log.debug(&quot;Implicit - found component with same UID in a different collection: {resource}&quot;, resource=check_resource)
</ins><span class="cx">             raise HTTPError(ErrorResponse(
</span><span class="cx">                 responsecode.FORBIDDEN,
</span><span class="cx">                 (caldav_namespace, &quot;unique-scheduling-object-resource&quot;),
</span><span class="lines">@@ -531,7 +531,7 @@
</span><span class="cx">         # Check for a delete
</span><span class="cx">         if self.action == &quot;remove&quot;:
</span><span class="cx"> 
</span><del>-            log.debug(&quot;Implicit - organizer '%s' is removing UID: '%s'&quot; % (self.organizer, self.uid))
</del><ins>+            log.debug(&quot;Implicit - organizer '{organizer}' is removing UID: '{uid}'&quot;, organizer=self.organizer, uid=self.uid)
</ins><span class="cx">             self.oldcalendar = self.calendar
</span><span class="cx"> 
</span><span class="cx">             # Cancel all attendees
</span><span class="lines">@@ -557,16 +557,16 @@
</span><span class="cx">             no_change, self.changed_rids, self.needs_action_rids, reinvites, recurrence_reschedule = self.isOrganizerChangeInsignificant()
</span><span class="cx">             if no_change:
</span><span class="cx">                 if reinvites:
</span><del>-                    log.debug(&quot;Implicit - organizer '%s' is re-inviting UID: '%s', attendees: %s&quot; % (self.organizer, self.uid, &quot;, &quot;.join(reinvites)))
</del><ins>+                    log.debug(&quot;Implicit - organizer '{organizer}' is re-inviting UID: '{uid}', attendees: {attendees}&quot;, organizer=self.organizer, uid=self.uid, attendees=&quot;, &quot;.join(reinvites))
</ins><span class="cx">                     self.reinvites = reinvites
</span><span class="cx">                 else:
</span><span class="cx">                     # Nothing to do
</span><del>-                    log.debug(&quot;Implicit - organizer '%s' is modifying UID: '%s' but change is not significant&quot; % (self.organizer, self.uid))
</del><ins>+                    log.debug(&quot;Implicit - organizer '{organizer}' is modifying UID: '{uid}' but change is not significant&quot;, organizer=self.organizer, uid=self.uid)
</ins><span class="cx">                     returnValue(None)
</span><span class="cx">             else:
</span><span class="cx">                 # Do not change PARTSTATs for a split operation
</span><span class="cx">                 if self.split_details is None:
</span><del>-                    log.debug(&quot;Implicit - organizer '%s' is modifying UID: '%s'&quot; % (self.organizer, self.uid))
</del><ins>+                    log.debug(&quot;Implicit - organizer '{organizer}' is modifying UID: '{uid}'&quot;, organizer=self.organizer, uid=self.uid)
</ins><span class="cx"> 
</span><span class="cx">                     for rid in self.needs_action_rids:
</span><span class="cx">                         comp = self.calendar.overriddenComponent(rid)
</span><span class="lines">@@ -587,7 +587,7 @@
</span><span class="cx"> 
</span><span class="cx">                                 attendee.setParameter(&quot;PARTSTAT&quot;, &quot;NEEDS-ACTION&quot;)
</span><span class="cx">                 else:
</span><del>-                    log.debug(&quot;Implicit - organizer '%s' is splitting UID: '%s'&quot; % (self.organizer, self.uid))
</del><ins>+                    log.debug(&quot;Implicit - organizer '{organizer}' is splitting UID: '{uid}'&quot;, organizer=self.organizer, uid=self.uid)
</ins><span class="cx"> 
</span><span class="cx">                 # Check for removed attendees
</span><span class="cx">                 if not recurrence_reschedule:
</span><span class="lines">@@ -601,10 +601,10 @@
</span><span class="cx"> 
</span><span class="cx">         elif self.action == &quot;create&quot;:
</span><span class="cx">             if self.split_details is None:
</span><del>-                log.debug(&quot;Implicit - organizer '%s' is creating UID: '%s'&quot; % (self.organizer, self.uid))
</del><ins>+                log.debug(&quot;Implicit - organizer '{organizer}' is creating UID: '{uid}'&quot;, organizer=self.organizer, uid=self.uid)
</ins><span class="cx">                 self.coerceAttendeesPartstatOnCreate()
</span><span class="cx">             else:
</span><del>-                log.debug(&quot;Implicit - organizer '%s' is creating a split UID: '%s'&quot; % (self.organizer, self.uid))
</del><ins>+                log.debug(&quot;Implicit - organizer '{organizer}' is creating a split UID: '{uid}'&quot;, organizer=self.organizer, uid=self.uid)
</ins><span class="cx">                 self.needs_sequence_change = False
</span><span class="cx"> 
</span><span class="cx">         # Always set RSVP=TRUE for any NEEDS-ACTION
</span><span class="lines">@@ -698,7 +698,7 @@
</span><span class="cx">                 oldOrganizer = self.oldcalendar.getOrganizer()
</span><span class="cx">                 newOrganizer = self.calendar.getOrganizer()
</span><span class="cx">                 if oldOrganizer != newOrganizer:
</span><del>-                    log.error(&quot;Cannot change ORGANIZER: UID:%s&quot; % (self.uid,))
</del><ins>+                    log.error(&quot;Cannot change ORGANIZER: UID:{uid}&quot;, uid=self.uid)
</ins><span class="cx">                     raise HTTPError(ErrorResponse(
</span><span class="cx">                         responsecode.FORBIDDEN,
</span><span class="cx">                         (caldav_namespace, &quot;valid-organizer-change&quot;),
</span><span class="lines">@@ -906,7 +906,7 @@
</span><span class="cx">                 if cuaddr not in coerced:
</span><span class="cx">                     attendeePrincipal = self.calendar_home.directoryService().recordWithCalendarUserAddress(cuaddr)
</span><span class="cx">                     attendeeAddress = (yield addressmapping.mapper.getCalendarUser(cuaddr, attendeePrincipal))
</span><del>-                    local_attendee = type(attendeeAddress) in (LocalCalendarUser, PartitionedCalendarUser, OtherServerCalendarUser,)
</del><ins>+                    local_attendee = type(attendeeAddress) in (LocalCalendarUser, OtherServerCalendarUser,)
</ins><span class="cx">                     coerced[cuaddr] = local_attendee
</span><span class="cx">                 if coerced[cuaddr]:
</span><span class="cx">                     attendee.removeParameter(&quot;SCHEDULE-AGENT&quot;)
</span><span class="lines">@@ -977,7 +977,7 @@
</span><span class="cx">                 scheduler = self.makeScheduler()
</span><span class="cx"> 
</span><span class="cx">                 # Do the PUT processing
</span><del>-                log.info(&quot;Implicit CANCEL - organizer: '%s' to attendee: '%s', UID: '%s', RIDs: '%s'&quot; % (self.organizer, attendee, self.uid, rids))
</del><ins>+                log.info(&quot;Implicit CANCEL - organizer: '{organizer}' to attendee: '{attendee}', UID: '{uid}', RIDs: '{rids}'&quot;, organizer=self.organizer, attendee=attendee, uid=self.uid, rids=rids)
</ins><span class="cx">                 response = (yield scheduler.doSchedulingViaPUT(self.originator, (attendee,), itipmsg, internal_request=True, suppress_refresh=self.suppress_refresh))
</span><span class="cx">                 self.handleSchedulingResponse(response, True)
</span><span class="cx"> 
</span><span class="lines">@@ -1034,7 +1034,7 @@
</span><span class="cx">                 scheduler = self.makeScheduler()
</span><span class="cx"> 
</span><span class="cx">                 # Do the PUT processing
</span><del>-                log.info(&quot;Implicit REQUEST - organizer: '%s' to attendee: '%s', UID: '%s'&quot; % (self.organizer, attendee, self.uid,))
</del><ins>+                log.info(&quot;Implicit REQUEST - organizer: '{organizer}' to attendee: '{attendee}', UID: '{uid}'&quot;, organizer=self.organizer, attendee=attendee, uid=self.uid)
</ins><span class="cx">                 response = (yield scheduler.doSchedulingViaPUT(self.originator, (attendee,), itipmsg, internal_request=True, suppress_refresh=self.suppress_refresh))
</span><span class="cx">                 self.handleSchedulingResponse(response, True)
</span><span class="cx"> 
</span><span class="lines">@@ -1069,19 +1069,19 @@
</span><span class="cx"> 
</span><span class="cx">         if self.action == &quot;remove&quot;:
</span><span class="cx">             if self.calendar.hasPropertyValueInAllComponents(Property(&quot;STATUS&quot;, &quot;CANCELLED&quot;)):
</span><del>-                log.debug(&quot;Implicit - attendee '%s' is removing cancelled UID: '%s'&quot; % (self.attendee, self.uid))
</del><ins>+                log.debug(&quot;Implicit - attendee '{attendee}' is removing cancelled UID: '{uid}'&quot;, attendee=self.attendee, uid=self.uid)
</ins><span class="cx">                 # Nothing else to do
</span><span class="cx">             elif doScheduling:
</span><span class="cx">                 # If attendee is already marked as declined in all components - nothing to do
</span><span class="cx">                 attendees = self.calendar.getAttendeeProperties((self.attendee,))
</span><span class="cx">                 if all([attendee.parameterValue(&quot;PARTSTAT&quot;, &quot;NEEDS-ACTION&quot;) == &quot;DECLINED&quot; for attendee in attendees]):
</span><del>-                    log.debug(&quot;Implicit - attendee '%s' is removing fully declined UID: '%s'&quot; % (self.attendee, self.uid))
</del><ins>+                    log.debug(&quot;Implicit - attendee '{attendee}' is removing fully declined UID: '{uid}'&quot;, attendee=self.attendee, uid=self.uid)
</ins><span class="cx">                     # Nothing else to do
</span><span class="cx">                 else:
</span><del>-                    log.debug(&quot;Implicit - attendee '%s' is cancelling UID: '%s'&quot; % (self.attendee, self.uid))
</del><ins>+                    log.debug(&quot;Implicit - attendee '{attendee}' is cancelling UID: '{uid}'&quot;, attendee=self.attendee, uid=self.uid)
</ins><span class="cx">                     yield self.scheduleCancelWithOrganizer()
</span><span class="cx">             else:
</span><del>-                log.debug(&quot;Implicit - attendee '%s' is removing UID without server scheduling: '%s'&quot; % (self.attendee, self.uid))
</del><ins>+                log.debug(&quot;Implicit - attendee '{attendee}' is removing UID without server scheduling: '{uid}'&quot;, attendee=self.attendee, uid=self.uid)
</ins><span class="cx">                 # Nothing else to do
</span><span class="cx">             returnValue(None)
</span><span class="cx"> 
</span><span class="lines">@@ -1092,7 +1092,7 @@
</span><span class="cx">                 oldOrganizer = self.oldcalendar.getOrganizer()
</span><span class="cx">                 newOrganizer = self.calendar.getOrganizer()
</span><span class="cx">                 if oldOrganizer != newOrganizer:
</span><del>-                    log.error(&quot;Cannot change ORGANIZER: UID:%s&quot; % (self.uid,))
</del><ins>+                    log.error(&quot;Cannot change ORGANIZER: UID:{uid}&quot;, uid=self.uid)
</ins><span class="cx">                     raise HTTPError(ErrorResponse(
</span><span class="cx">                         responsecode.FORBIDDEN,
</span><span class="cx">                         (caldav_namespace, &quot;valid-attendee-change&quot;),
</span><span class="lines">@@ -1107,7 +1107,7 @@
</span><span class="cx"> 
</span><span class="cx">                 # If Organizer copy exists we cannot allow SCHEDULE-AGENT=CLIENT or NONE
</span><span class="cx">                 if not doScheduling:
</span><del>-                    log.error(&quot;Attendee '%s' is not allowed to change SCHEDULE-AGENT on organizer: UID:%s&quot; % (self.attendeePrincipal, self.uid,))
</del><ins>+                    log.error(&quot;Attendee '{attendee}' is not allowed to change SCHEDULE-AGENT on organizer: UID:{uid}&quot;, attendee=self.attendeePrincipal, uid=self.uid)
</ins><span class="cx">                     raise HTTPError(ErrorResponse(
</span><span class="cx">                         responsecode.FORBIDDEN,
</span><span class="cx">                         (caldav_namespace, &quot;valid-attendee-change&quot;),
</span><span class="lines">@@ -1121,11 +1121,11 @@
</span><span class="cx"> 
</span><span class="cx">                 if not changeAllowed:
</span><span class="cx">                     if self.calendar.hasPropertyValueInAllComponents(Property(&quot;STATUS&quot;, &quot;CANCELLED&quot;)):
</span><del>-                        log.debug(&quot;Attendee '%s' is creating CANCELLED event for mismatched UID: '%s' - removing entire event&quot; % (self.attendee, self.uid,))
</del><ins>+                        log.debug(&quot;Attendee '{attendee}' is creating CANCELLED event for mismatched UID: '{uid}' - removing entire event&quot;, attendee=self.attendee, uid=self.uid)
</ins><span class="cx">                         self.return_status = ImplicitScheduler.STATUS_ORPHANED_EVENT
</span><span class="cx">                         returnValue(None)
</span><span class="cx">                     else:
</span><del>-                        log.error(&quot;Attendee '%s' is not allowed to make an unauthorized change to an organized event: UID:%s&quot; % (self.attendeePrincipal, self.uid,))
</del><ins>+                        log.error(&quot;Attendee '{attendee}' is not allowed to make an unauthorized change to an organized event: UID:{uid}&quot;, attendee=self.attendeePrincipal, uid=self.uid)
</ins><span class="cx">                         raise HTTPError(ErrorResponse(
</span><span class="cx">                             responsecode.FORBIDDEN,
</span><span class="cx">                             (caldav_namespace, &quot;valid-attendee-change&quot;),
</span><span class="lines">@@ -1135,21 +1135,21 @@
</span><span class="cx">                 # Check that the return calendar actually has any components left - this can happen if a cancelled
</span><span class="cx">                 # component is removed and replaced by another cancelled or invalid one
</span><span class="cx">                 if self.calendar.mainType() is None:
</span><del>-                    log.debug(&quot;Attendee '%s' is replacing CANCELLED event: '%s' - removing entire event&quot; % (self.attendee, self.uid,))
</del><ins>+                    log.debug(&quot;Attendee '{attendee}' is replacing CANCELLED event: '{uid}' - removing entire event&quot;, attendee=self.attendee, uid=self.uid)
</ins><span class="cx">                     self.return_status = ImplicitScheduler.STATUS_ORPHANED_EVENT
</span><span class="cx">                     returnValue(None)
</span><span class="cx"> 
</span><span class="cx">                 if not doITipReply:
</span><del>-                    log.debug(&quot;Implicit - attendee '%s' is updating UID: '%s' but change is not significant&quot; % (self.attendee, self.uid))
</del><ins>+                    log.debug(&quot;Implicit - attendee '{attendee}' is updating UID: '{uid}' but change is not significant&quot;, attendee=self.attendee, uid=self.uid)
</ins><span class="cx">                     returnValue(self.return_calendar)
</span><del>-                log.debug(&quot;Attendee '%s' is allowed to update UID: '%s' with local organizer '%s'&quot; % (self.attendee, self.uid, self.organizer))
</del><ins>+                log.debug(&quot;Attendee '{attendee}' is allowed to update UID: '{uid}' with local organizer '{organizer}'&quot;, attendee=self.attendee, uid=self.uid, organizer=self.organizer)
</ins><span class="cx"> 
</span><span class="cx">             elif isinstance(self.organizerAddress, LocalCalendarUser):
</span><span class="cx">                 # If Organizer copy does not exists we cannot allow SCHEDULE-AGENT=SERVER
</span><span class="cx">                 if doScheduling:
</span><span class="cx">                     # Check to see whether all instances are CANCELLED
</span><span class="cx">                     if self.calendar.hasPropertyValueInAllComponents(Property(&quot;STATUS&quot;, &quot;CANCELLED&quot;)):
</span><del>-                        log.debug(&quot;Attendee '%s' is creating CANCELLED event for missing UID: '%s' - removing entire event&quot; % (self.attendee, self.uid,))
</del><ins>+                        log.debug(&quot;Attendee '{attendee}' is creating CANCELLED event for missing UID: '{uid}' - removing entire event&quot;, attendee=self.attendee, uid=self.uid)
</ins><span class="cx">                         self.return_status = ImplicitScheduler.STATUS_ORPHANED_CANCELLED_EVENT
</span><span class="cx">                         returnValue(None)
</span><span class="cx">                     else:
</span><span class="lines">@@ -1157,25 +1157,25 @@
</span><span class="cx">                         if self.oldcalendar:
</span><span class="cx">                             oldScheduling = self.oldcalendar.getOrganizerScheduleAgent()
</span><span class="cx">                             if not oldScheduling:
</span><del>-                                log.error(&quot;Attendee '%s' is not allowed to set SCHEDULE-AGENT=SERVER on organizer: UID:%s&quot; % (self.attendeePrincipal, self.uid,))
</del><ins>+                                log.error(&quot;Attendee '{attendee}' is not allowed to set SCHEDULE-AGENT=SERVER on organizer: UID:{uid}&quot;, attendee=self.attendeePrincipal, uid=self.uid)
</ins><span class="cx">                                 raise HTTPError(ErrorResponse(
</span><span class="cx">                                     responsecode.FORBIDDEN,
</span><span class="cx">                                     (caldav_namespace, &quot;valid-attendee-change&quot;),
</span><span class="cx">                                     &quot;Attendee cannot change organizer state&quot;,
</span><span class="cx">                                 ))
</span><span class="cx"> 
</span><del>-                        log.debug(&quot;Attendee '%s' is not allowed to update UID: '%s' - missing organizer copy - removing entire event&quot; % (self.attendee, self.uid,))
</del><ins>+                        log.debug(&quot;Attendee '{attendee}' is not allowed to update UID: '{uid}' - missing organizer copy - removing entire event&quot;, attendee=self.attendee, uid=self.uid)
</ins><span class="cx">                         self.return_status = ImplicitScheduler.STATUS_ORPHANED_EVENT
</span><span class="cx">                         returnValue(None)
</span><span class="cx">                 else:
</span><del>-                    log.debug(&quot;Implicit - attendee '%s' is modifying UID without server scheduling: '%s'&quot; % (self.attendee, self.uid))
</del><ins>+                    log.debug(&quot;Implicit - attendee '{attendee}' is modifying UID without server scheduling: '{uid}'&quot;, attendee=self.attendee, uid=self.uid)
</ins><span class="cx">                     # Nothing else to do
</span><span class="cx">                     returnValue(None)
</span><span class="cx"> 
</span><span class="cx">             elif isinstance(self.organizerAddress, InvalidCalendarUser):
</span><span class="cx">                 # We will allow the attendee to do anything in this case, but we will mark the organizer
</span><span class="cx">                 # with an schedule-status error
</span><del>-                log.debug(&quot;Attendee '%s' is allowed to update UID: '%s' with invalid organizer '%s'&quot; % (self.attendee, self.uid, self.organizer))
</del><ins>+                log.debug(&quot;Attendee '{attendee}' is allowed to update UID: '{uid}' with invalid organizer '{organizer}'&quot;, attendee=self.attendee, uid=self.uid, organizer=self.organizer)
</ins><span class="cx">                 if doScheduling:
</span><span class="cx">                     self.calendar.setParameterToValueForPropertyWithValue(
</span><span class="cx">                         &quot;SCHEDULE-STATUS&quot;,
</span><span class="lines">@@ -1189,14 +1189,14 @@
</span><span class="cx">                 # to make any change they like as we cannot verify what is reasonable. In reality
</span><span class="cx">                 # we ought to be comparing the Attendee changes against the attendee's own copy
</span><span class="cx">                 # and restrict changes based on that when the organizer's copy is not available.
</span><del>-                log.debug(&quot;Attendee '%s' is allowed to update UID: '%s' with remote organizer '%s'&quot; % (self.attendee, self.uid, self.organizer))
</del><ins>+                log.debug(&quot;Attendee '{attendee}' is allowed to update UID: '{uid}' with remote organizer '{organizer}'&quot;, attendee=self.attendee, uid=self.uid, organizer=self.organizer)
</ins><span class="cx">                 changedRids = None
</span><span class="cx"> 
</span><span class="cx">             if doScheduling:
</span><del>-                log.debug(&quot;Implicit - attendee '%s' is updating UID: '%s'&quot; % (self.attendee, self.uid))
</del><ins>+                log.debug(&quot;Implicit - attendee '{attendee}' is updating UID: '{uid}'&quot;, attendee=self.attendee, uid=self.uid)
</ins><span class="cx">                 yield self.scheduleWithOrganizer(changedRids)
</span><span class="cx">             else:
</span><del>-                log.debug(&quot;Implicit - attendee '%s' is updating UID without server scheduling: '%s'&quot; % (self.attendee, self.uid))
</del><ins>+                log.debug(&quot;Implicit - attendee '{attendee}' is updating UID without server scheduling: '{uid}'&quot;, attendee=self.attendee, uid=self.uid)
</ins><span class="cx">                 # Nothing else to do
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1205,7 +1205,7 @@
</span><span class="cx"> 
</span><span class="cx">         if self.action == &quot;remove&quot;:
</span><span class="cx">             # Nothing else to do
</span><del>-            log.debug(&quot;Implicit - missing attendee is removing UID without server scheduling: '%s'&quot; % (self.uid,))
</del><ins>+            log.debug(&quot;Implicit - missing attendee is removing UID without server scheduling: '{uid}'&quot;, uid=self.uid)
</ins><span class="cx"> 
</span><span class="cx">         else:
</span><span class="cx">             # Make sure ORGANIZER is not changed if originally SCHEDULE-AGENT=SERVER
</span><span class="lines">@@ -1214,7 +1214,7 @@
</span><span class="cx">                 oldOrganizer = self.oldcalendar.getOrganizer()
</span><span class="cx">                 newOrganizer = self.calendar.getOrganizer()
</span><span class="cx">                 if oldOrganizer != newOrganizer and self.oldcalendar.getOrganizerScheduleAgent():
</span><del>-                    log.error(&quot;Cannot change ORGANIZER: UID:%s&quot; % (self.uid,))
</del><ins>+                    log.error(&quot;Cannot change ORGANIZER: UID:{uid}&quot;, uid=self.uid)
</ins><span class="cx">                     raise HTTPError(ErrorResponse(
</span><span class="cx">                         responsecode.FORBIDDEN,
</span><span class="cx">                         (caldav_namespace, &quot;valid-attendee-change&quot;),
</span><span class="lines">@@ -1223,7 +1223,7 @@
</span><span class="cx"> 
</span><span class="cx">             # Never allow a missing attendee with a locally hosted organizer
</span><span class="cx">             if isinstance(self.organizerAddress, LocalCalendarUser):
</span><del>-                log.error(&quot;Cannot remove ATTENDEE: UID:%s&quot; % (self.uid,))
</del><ins>+                log.error(&quot;Cannot remove ATTENDEE: UID:{uid}&quot;, uid=self.uid)
</ins><span class="cx">                 raise HTTPError(ErrorResponse(
</span><span class="cx">                     responsecode.FORBIDDEN,
</span><span class="cx">                     (caldav_namespace, &quot;valid-attendee-change&quot;),
</span><span class="lines">@@ -1232,7 +1232,7 @@
</span><span class="cx"> 
</span><span class="cx">             # We will allow the attendee to do anything in this case, but we will mark the organizer
</span><span class="cx">             # with an schedule-status error and schedule-agent none
</span><del>-            log.debug(&quot;Missing attendee is allowed to update UID: '%s' with invalid organizer '%s'&quot; % (self.uid, self.organizer))
</del><ins>+            log.debug(&quot;Missing attendee is allowed to update UID: '{uid}' with invalid organizer '{organizer}'&quot;, uid=self.uid, organizer=self.organizer)
</ins><span class="cx"> 
</span><span class="cx">             # Check SCHEDULE-AGENT and coerce SERVER to NONE
</span><span class="cx">             if self.calendar.getOrganizerScheduleAgent():
</span><span class="lines">@@ -1243,14 +1243,14 @@
</span><span class="cx">     def checkOrganizerScheduleAgent(self):
</span><span class="cx"> 
</span><span class="cx">         is_server = self.calendar.getOrganizerScheduleAgent()
</span><del>-        local_organizer = type(self.organizerAddress) in (LocalCalendarUser, PartitionedCalendarUser, OtherServerCalendarUser,)
</del><ins>+        local_organizer = type(self.organizerAddress) in (LocalCalendarUser, OtherServerCalendarUser,)
</ins><span class="cx"> 
</span><span class="cx">         if config.Scheduling.iMIP.Enabled and self.organizerAddress.cuaddr.lower().startswith(&quot;mailto:&quot;):
</span><span class="cx">             return is_server
</span><span class="cx"> 
</span><span class="cx">         if not config.Scheduling.iSchedule.Enabled and not local_organizer and is_server:
</span><span class="cx">             # Coerce ORGANIZER to SCHEDULE-AGENT=NONE
</span><del>-            log.debug(&quot;Attendee '%s' is not allowed to use SCHEDULE-AGENT=SERVER on organizer: UID:%s&quot; % (self.attendeePrincipal, self.uid,))
</del><ins>+            log.debug(&quot;Attendee '{attendee}' is not allowed to use SCHEDULE-AGENT=SERVER on organizer: UID:{uid}&quot;, attendee=self.attendeePrincipal, uid=self.uid)
</ins><span class="cx">             self.calendar.setParameterToValueForPropertyWithValue(&quot;SCHEDULE-AGENT&quot;, &quot;NONE&quot;, &quot;ORGANIZER&quot;, None)
</span><span class="cx">             self.calendar.setParameterToValueForPropertyWithValue(&quot;SCHEDULE-STATUS&quot;, iTIPRequestStatus.NO_USER_SUPPORT_CODE, &quot;ORGANIZER&quot;, None)
</span><span class="cx">             is_server = False
</span><span class="lines">@@ -1272,8 +1272,8 @@
</span><span class="cx">         calendar_resource = (yield getCalendarObjectForRecord(self.calendar_home.transaction(), self.organizerPrincipal, self.uid))
</span><span class="cx">         if calendar_resource is not None:
</span><span class="cx">             self.organizer_calendar = (yield calendar_resource.componentForUser())
</span><del>-        elif type(self.organizerAddress) in (PartitionedCalendarUser, OtherServerCalendarUser,):
-            # For partitioning where the organizer is on a different node, we will assume that the attendee's copy
</del><ins>+        elif type(self.organizerAddress) in (OtherServerCalendarUser,):
+            # For podding where the organizer is on a different node, we will assume that the attendee's copy
</ins><span class="cx">             # of the event is up to date and &quot;authoritative&quot;. So we pretend that is the organizer copy
</span><span class="cx">             self.organizer_calendar = self.oldcalendar
</span><span class="cx"> 
</span><span class="lines">@@ -1290,7 +1290,7 @@
</span><span class="cx">             oldcalendar = self.organizer_calendar
</span><span class="cx">             oldcalendar.attendeesView((self.attendee,), onlyScheduleAgentServer=True)
</span><span class="cx">             if oldcalendar.mainType() is None:
</span><del>-                log.debug(&quot;Implicit - attendee '%s' cannot use an event they are not an attendee of, UID: '%s'&quot; % (self.attendee, self.uid))
</del><ins>+                log.debug(&quot;Implicit - attendee '{attendee}' cannot use an event they are not an attendee of, UID: '{uid}'&quot;, attendee=self.attendee, uid=self.uid)
</ins><span class="cx">                 raise HTTPError(ErrorResponse(
</span><span class="cx">                     responsecode.FORBIDDEN,
</span><span class="cx">                     (caldav_namespace, &quot;valid-attendee-change&quot;),
</span><span class="lines">@@ -1339,7 +1339,7 @@
</span><span class="cx">         def _gotResponse(response):
</span><span class="cx">             self.handleSchedulingResponse(response, False)
</span><span class="cx"> 
</span><del>-        log.info(&quot;Implicit %s - attendee: '%s' to organizer: '%s', UID: '%s'&quot; % (action, self.attendee, self.organizer, self.uid,))
</del><ins>+        log.info(&quot;Implicit {action} - attendee: '{attendee}' to organizer: '{organizer}', UID: '{uid}'&quot;, action=action, attendee=self.attendee, organizer=self.organizer, uid=self.uid)
</ins><span class="cx">         d = scheduler.doSchedulingViaPUT(self.originator, (self.organizer,), itipmsg, internal_request=True)
</span><span class="cx">         d.addCallback(_gotResponse)
</span><span class="cx">         return d
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingischeduledeliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/delivery.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/delivery.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/delivery.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -40,8 +40,7 @@
</span><span class="cx"> from twistedcaldav.ical import normalizeCUAddress, Component
</span><span class="cx"> from twistedcaldav.util import utf8String
</span><span class="cx"> 
</span><del>-from txdav.caldav.datastore.scheduling.cuaddress import PartitionedCalendarUser, RemoteCalendarUser, \
-    OtherServerCalendarUser
</del><ins>+from txdav.caldav.datastore.scheduling.cuaddress import RemoteCalendarUser, OtherServerCalendarUser
</ins><span class="cx"> from txdav.caldav.datastore.scheduling.delivery import DeliveryService
</span><span class="cx"> from txdav.caldav.datastore.scheduling.ischedule.dkim import DKIMRequest, DKIMUtils
</span><span class="cx"> from txdav.caldav.datastore.scheduling.ischedule.remoteservers import IScheduleServerRecord
</span><span class="lines">@@ -58,7 +57,7 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> Handles the sending of iSchedule scheduling messages. Used for both cross-domain scheduling,
</span><del>-as well as internal partitioning or podding.
</del><ins>+as well as internal podding.
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx"> __all__ = [
</span><span class="lines">@@ -140,8 +139,6 @@
</span><span class="cx">             if isinstance(recipient, RemoteCalendarUser):
</span><span class="cx">                 # Map the recipient's domain to a server
</span><span class="cx">                 server = (yield self.serverForDomain(recipient.domain))
</span><del>-            elif isinstance(recipient, PartitionedCalendarUser):
-                server = self._getServerForPartitionedUser(recipient)
</del><span class="cx">             elif isinstance(recipient, OtherServerCalendarUser):
</span><span class="cx">                 server = self._getServerForOtherServerUser(recipient)
</span><span class="cx">             else:
</span><span class="lines">@@ -186,23 +183,6 @@
</span><span class="cx">         yield DeferredList(deferreds)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def _getServerForPartitionedUser(self, recipient):
-
-        if not hasattr(self, &quot;partitionedServers&quot;):
-            self.partitionedServers = {}
-
-        partition = recipient.principal.partitionURI()
-        if partition not in self.partitionedServers:
-            self.partitionedServers[partition] = IScheduleServerRecord(
-                uri=joinURL(partition, config.Servers.InboxName),
-                unNormalizeAddresses=False,
-                moreHeaders=[recipient.principal.server().secretHeader(), ],
-                podding=True,
-            )
-
-        return self.partitionedServers[partition]
-
-
</del><span class="cx">     def _getServerForOtherServerUser(self, recipient):
</span><span class="cx"> 
</span><span class="cx">         if not hasattr(self, &quot;otherServers&quot;):
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingischedulelocalserverspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/localservers.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/localservers.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/localservers.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -31,18 +31,12 @@
</span><span class="cx"> the principals across the whole domain need to be able to directly schedule each other and know of each others
</span><span class="cx"> existence. A common scenario would be a production server and a development/test server.
</span><span class="cx"> 
</span><del>-Each server is identified by an id and url. The id is used when assigning principals to a specific server. Each
-server can also support multiple partitions, and each of those is identified by an id and url, with the id also
-being used to assign principals to a specific partition.
</del><ins>+Each server is identified by an id and url. The id is used when assigning principals to a specific server.
</ins><span class="cx"> 
</span><del>-These servers support the concept of &quot;partitioning&quot; and &quot;podding&quot;.
</del><ins>+These servers support the concept of &quot;podding&quot;.
</ins><span class="cx"> 
</span><del>-A &quot;partitioned&quot; service is one that spreads its
-users out across multiple stores and does reverse proxying of incoming requests to the appropriate partitioned host.
-All servers within the same partition have to be running the same version of the software etc.
-
</del><span class="cx"> A &quot;podded&quot; service is one where different groups of users are hosted on different servers, which may be of
</span><del>-different versions etc. A &quot;pod&quot; may itself be &quot;partitioned&quot;, but the partitioning is &quot;invisible&quot; to the outside world.
</del><ins>+different versions etc.
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx"> __all__ = [
</span><span class="lines">@@ -104,13 +98,31 @@
</span><span class="cx">     def getThisServer(self):
</span><span class="cx">         return self._thisServer
</span><span class="cx"> 
</span><ins>+
+    def installReverseProxies(self, maxClients):
+        &quot;&quot;&quot;
+        Install a reverse proxy for each of the other servers in the &quot;pod&quot;.
+
+        @param maxClients: maximum number of clients in the pool.
+        @type maxClients: C{int}
+        &quot;&quot;&quot;
+
+        for server in self._servers.values():
+            if server.thisServer:
+                continue
+            installPool(
+                server.id,
+                server.uri,
+                maxClients,
+            )
+
</ins><span class="cx"> Servers = ServersDB()   # Global server DB
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> class Server(object):
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    Represents a server which may itself be partitioned.
</del><ins>+    Represents a server.
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">     def __init__(self):
</span><span class="lines">@@ -120,8 +132,6 @@
</span><span class="cx">         self.ips = set()
</span><span class="cx">         self.allowed_from_ips = set()
</span><span class="cx">         self.shared_secret = None
</span><del>-        self.partitions = {}
-        self.partitions_ips = set()
</del><span class="cx">         self.isImplicit = True
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -164,25 +174,12 @@
</span><span class="cx">                 actual_ips.add(item)
</span><span class="cx">         self.allowed_from_ips = actual_ips
</span><span class="cx"> 
</span><del>-        for uri in self.partitions.values():
-            parsed_uri = urlparse.urlparse(uri)
-            try:
-                ips = getIPsFromHost(parsed_uri.hostname)
-            except socket.gaierror, e:
-                msg = &quot;Unable to lookup ip-addr for partition '%s': %s&quot; % (parsed_uri.hostname, str(e))
-                log.error(msg)
-                if ignoreIPLookupFailures:
-                    ips = ()
-                else:
-                    raise ValueError(msg)
-            self.partitions_ips.update(ips)
</del><span class="cx"> 
</span><del>-
</del><span class="cx">     def checkThisIP(self, ip):
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        Check that the passed in IP address corresponds to this server or one of its partitions.
</del><ins>+        Check that the passed in IP address corresponds to this server.
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        return (ip in self.ips) or (ip in self.partitions_ips)
</del><ins>+        return (ip in self.ips)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def hasAllowedFromIP(self):
</span><span class="lines">@@ -218,38 +215,13 @@
</span><span class="cx">         return (SERVER_SECRET_HEADER, self.shared_secret,)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def addPartition(self, id, uri):
-        self.partitions[id] = uri
</del><span class="cx"> 
</span><del>-
-    def getPartitionURIForId(self, id):
-        return self.partitions.get(id)
-
-
-    def isPartitioned(self):
-        return len(self.partitions) != 0
-
-
-    def installReverseProxies(self, ownUID, maxClients):
-
-        for partition, url in self.partitions.iteritems():
-            if partition != ownUID:
-                installPool(
-                    partition,
-                    url,
-                    maxClients,
-                )
-
-
-
</del><span class="cx"> ELEMENT_SERVERS = &quot;servers&quot;
</span><span class="cx"> ELEMENT_SERVER = &quot;server&quot;
</span><span class="cx"> ELEMENT_ID = &quot;id&quot;
</span><span class="cx"> ELEMENT_URI = &quot;uri&quot;
</span><span class="cx"> ELEMENT_ALLOWED_FROM = &quot;allowed-from&quot;
</span><span class="cx"> ELEMENT_SHARED_SECRET = &quot;shared-secret&quot;
</span><del>-ELEMENT_PARTITIONS = &quot;partitions&quot;
-ELEMENT_PARTITION = &quot;partition&quot;
</del><span class="cx"> ATTR_IMPLICIT = &quot;implicit&quot;
</span><span class="cx"> ATTR_VALUE_YES = &quot;yes&quot;
</span><span class="cx"> ATTR_VALUE_NO = &quot;no&quot;
</span><span class="lines">@@ -286,39 +258,13 @@
</span><span class="cx">                     server.allowed_from_ips.add(node.text)
</span><span class="cx">                 elif node.tag == ELEMENT_SHARED_SECRET:
</span><span class="cx">                     server.shared_secret = node.text
</span><del>-                elif node.tag == ELEMENT_PARTITIONS:
-                    ServersParser._parsePartition(xmlFile, node, server)
</del><span class="cx">                 else:
</span><span class="cx">                     raise RuntimeError(&quot;Invalid element '%s' in servers file: '%s'&quot; % (node.tag, xmlFile,))
</span><span class="cx"> 
</span><span class="cx">             if server.id is None or server.uri is None:
</span><del>-                raise RuntimeError(&quot;Invalid partition '%s' in servers file: '%s'&quot; % (child.tag, xmlFile,))
</del><ins>+                raise RuntimeError(&quot;Invalid server '%s' in servers file: '%s'&quot; % (child.tag, xmlFile,))
</ins><span class="cx"> 
</span><span class="cx">             server.check(ignoreIPLookupFailures=ignoreIPLookupFailures)
</span><span class="cx">             results[server.id] = server
</span><span class="cx"> 
</span><span class="cx">         return results
</span><del>-
-
-    @staticmethod
-    def _parsePartition(xmlFile, partitions, server):
-
-        for child in partitions:
-
-            if child.tag != ELEMENT_PARTITION:
-                raise RuntimeError(&quot;Unknown partition type: '%s' in servers file: '%s'&quot; % (child.tag, xmlFile,))
-
-            id = None
-            uri = None
-            for node in child:
-                if node.tag == ELEMENT_ID:
-                    id = node.text
-                elif node.tag == ELEMENT_URI:
-                    uri = node.text
-                else:
-                    raise RuntimeError(&quot;Invalid element '%s' in augment file: '%s'&quot; % (node.tag, xmlFile,))
-
-            if id is None or uri is None:
-                raise RuntimeError(&quot;Invalid partition '%s' in servers file: '%s'&quot; % (child.tag, xmlFile,))
-
-            server.addPartition(id, uri)
</del></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingischeduleremoteserverspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/remoteservers.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/remoteservers.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/remoteservers.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -23,7 +23,7 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> XML based iSchedule configuration file handling. This is for handling of remote servers. The localservers.py module
</span><del>-handles servers that are local (partitioned or podded).
</del><ins>+handles servers that are local (podded).
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx"> __all__ = [
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingischeduleschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/scheduler.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/scheduler.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/scheduler.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -231,7 +231,7 @@
</span><span class="cx">         originatorPrincipal = self.txn.directoryService().recordWithCalendarUserAddress(self.originator)
</span><span class="cx">         localUser = (yield addressmapping.mapper.isCalendarUserInMyDomain(self.originator))
</span><span class="cx">         if originatorPrincipal or localUser:
</span><del>-            if originatorPrincipal.locallyHosted():
</del><ins>+            if originatorPrincipal.thisServer():
</ins><span class="cx">                 log.error(&quot;Cannot use originator that is on this server: %s&quot; % (self.originator,))
</span><span class="cx">                 raise HTTPError(self.errorResponse(
</span><span class="cx">                     responsecode.FORBIDDEN,
</span><span class="lines">@@ -309,23 +309,17 @@
</span><span class="cx"> 
</span><span class="cx">     def _validAlternateServer(self, principal):
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        Check the validity of the partitioned host.
</del><ins>+        Check the validity of the podded host.
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-        # Extract expected host/port. This will be the partitionURI, or if no partitions,
-        # the serverURI
-        expected_uri = principal.partitionURI()
-        if expected_uri is None:
-            expected_uri = principal.serverURI()
</del><ins>+        # Extract expected host/port. This will be the serverURI.
+        expected_uri = principal.serverURI()
</ins><span class="cx">         expected_uri = urlparse.urlparse(expected_uri)
</span><span class="cx"> 
</span><span class="cx">         # Get the request IP and map to hostname.
</span><span class="cx">         clientip = self.remoteAddr.host
</span><span class="cx"> 
</span><del>-        # Check against this server (or any of its partitions). We need this because an external iTIP message
-        # may be addressed to users on different partitions, and the node receiving the iTIP message will need to
-        # forward it to the partition nodes, thus the client ip seen by the partitions will in fact be the initial
-        # receiving node.
</del><ins>+        # Check against this server.
</ins><span class="cx">         matched = False
</span><span class="cx">         if Servers.getThisServer().checkThisIP(clientip):
</span><span class="cx">             matched = True
</span><span class="lines">@@ -377,7 +371,7 @@
</span><span class="cx">         if organizer:
</span><span class="cx">             organizerPrincipal = self.txn.directoryService().recordWithCalendarUserAddress(organizer)
</span><span class="cx">             if organizerPrincipal:
</span><del>-                if organizerPrincipal.locallyHosted():
</del><ins>+                if organizerPrincipal.thisServer():
</ins><span class="cx">                     log.error(&quot;Invalid ORGANIZER in calendar data: %s&quot; % (self.calendar,))
</span><span class="cx">                     raise HTTPError(self.errorResponse(
</span><span class="cx">                         responsecode.FORBIDDEN,
</span><span class="lines">@@ -385,7 +379,7 @@
</span><span class="cx">                         &quot;Organizer is not local to server&quot;,
</span><span class="cx">                     ))
</span><span class="cx">                 else:
</span><del>-                    # Check that the origin server is the correct partition
</del><ins>+                    # Check that the origin server is the correct pod
</ins><span class="cx">                     self.organizer = calendarUserFromPrincipal(organizer, organizerPrincipal)
</span><span class="cx">                     self._validAlternateServer(self.organizer.principal)
</span><span class="cx">             else:
</span><span class="lines">@@ -418,7 +412,7 @@
</span><span class="cx">         # Attendee cannot be local.
</span><span class="cx">         attendeePrincipal = self.txn.directoryService().recordWithCalendarUserAddress(self.attendee)
</span><span class="cx">         if attendeePrincipal:
</span><del>-            if attendeePrincipal.locallyHosted():
</del><ins>+            if attendeePrincipal.thisServer():
</ins><span class="cx">                 log.error(&quot;Invalid ATTENDEE in calendar data: %s&quot; % (self.calendar,))
</span><span class="cx">                 raise HTTPError(self.errorResponse(
</span><span class="cx">                     responsecode.FORBIDDEN,
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingischeduletesttest_localserverspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -37,16 +37,6 @@
</span><span class="cx">   &lt;server&gt;
</span><span class="cx">     &lt;id&gt;00002&lt;/id&gt;
</span><span class="cx">     &lt;uri&gt;https://caldav2.example.com:8843&lt;/uri&gt;
</span><del>-    &lt;partitions&gt;
-        &lt;partition&gt;
-            &lt;id&gt;A&lt;/id&gt;
-            &lt;uri&gt;https://machine1.example.com:8443&lt;/uri&gt;
-        &lt;/partition&gt;
-        &lt;partition&gt;
-            &lt;id&gt;B&lt;/id&gt;
-            &lt;uri&gt;https://machine2.example.com:8443&lt;/uri&gt;
-        &lt;/partition&gt;
-    &lt;/partitions&gt;
</del><span class="cx">   &lt;/server&gt;
</span><span class="cx"> &lt;/servers&gt;
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="lines">@@ -62,16 +52,6 @@
</span><span class="cx">   &lt;server&gt;
</span><span class="cx">     &lt;id&gt;00002&lt;/id&gt;
</span><span class="cx">     &lt;uri&gt;https://caldav2.example.com:8843&lt;/uri&gt;
</span><del>-    &lt;partitions&gt;
-        &lt;partition&gt;
-            &lt;id&gt;A&lt;/id&gt;
-            &lt;uri&gt;https://machine1.example.com:8443&lt;/uri&gt;
-        &lt;/partition&gt;
-        &lt;partition&gt;
-            &lt;id&gt;B&lt;/id&gt;
-            &lt;uri&gt;https://machine2.example.com:8443&lt;/uri&gt;
-        &lt;/partition&gt;
-    &lt;/partitions&gt;
</del><span class="cx">   &lt;/server&gt;
</span><span class="cx"> &lt;/servers&gt;
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="lines">@@ -103,13 +83,7 @@
</span><span class="cx">         self.assertEqual(servers.getServerById(&quot;00001&quot;).shared_secret, &quot;foobar&quot;)
</span><span class="cx">         self.assertEqual(servers.getServerById(&quot;00002&quot;).shared_secret, None)
</span><span class="cx"> 
</span><del>-        self.assertEqual(len(servers.getServerById(&quot;00001&quot;).partitions), 0)
-        self.assertEqual(len(servers.getServerById(&quot;00002&quot;).partitions), 2)
</del><span class="cx"> 
</span><del>-        self.assertEqual(servers.getServerById(&quot;00002&quot;).getPartitionURIForId(&quot;A&quot;), &quot;https://machine1.example.com:8443&quot;)
-        self.assertEqual(servers.getServerById(&quot;00002&quot;).getPartitionURIForId(&quot;B&quot;), &quot;https://machine2.example.com:8443&quot;)
-
-
</del><span class="cx">     def test_this_server(self):
</span><span class="cx"> 
</span><span class="cx">         servers = self._setupServers()
</span><span class="lines">@@ -129,14 +103,6 @@
</span><span class="cx">         self.assertTrue(servers.getServerById(&quot;00002&quot;).thisServer)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def test_check_is_partitioned(self):
-
-        servers = self._setupServers()
-
-        self.assertFalse(servers.getServerById(&quot;00001&quot;).isPartitioned())
-        self.assertTrue(servers.getServerById(&quot;00002&quot;).isPartitioned())
-
-
</del><span class="cx">     def test_check_this_ip(self):
</span><span class="cx"> 
</span><span class="cx">         servers = self._setupServers()
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/scheduler.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/scheduler.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/scheduler.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -38,7 +38,6 @@
</span><span class="cx"> from txdav.caldav.datastore.scheduling.cuaddress import LocalCalendarUser
</span><span class="cx"> from txdav.caldav.datastore.scheduling.cuaddress import RemoteCalendarUser
</span><span class="cx"> from txdav.caldav.datastore.scheduling.cuaddress import EmailCalendarUser
</span><del>-from txdav.caldav.datastore.scheduling.cuaddress import PartitionedCalendarUser
</del><span class="cx"> from txdav.caldav.datastore.scheduling.imip.delivery import ScheduleViaIMip
</span><span class="cx"> from txdav.caldav.datastore.scheduling.ischedule.delivery import ScheduleViaISchedule
</span><span class="cx"> from txdav.caldav.datastore.scheduling.itip import iTIPRequestStatus
</span><span class="lines">@@ -50,8 +49,8 @@
</span><span class="cx"> This module handles the delivery of scheduling messages to organizer and attendees. The basic idea is to first
</span><span class="cx"> confirm the integrity of the incoming scheduling message, check authorization. Appropriate L{DeliveryService}s
</span><span class="cx"> are then used to deliver the message to attendees or organizer. Delivery responses are processed and returned.
</span><del>-This takes into account partitioning and podding of users by detecting the appropriate host for a calendar
-user and then dispatching the delivery accordingly.
</del><ins>+This takes into account podding of users by detecting the appropriate host for a calendar user and then
+dispatching the delivery accordingly.
</ins><span class="cx"> 
</span><span class="cx"> The L{Scheduler} class defines the basic behavior for processing deliveries. Sub-classes are defined for the
</span><span class="cx"> different ways a deliver can be triggered.
</span><span class="lines">@@ -434,7 +433,6 @@
</span><span class="cx"> 
</span><span class="cx">         # Loop over each recipient and aggregate into lists by service types.
</span><span class="cx">         caldav_recipients = []
</span><del>-        partitioned_recipients = []
</del><span class="cx">         otherserver_recipients = []
</span><span class="cx">         remote_recipients = []
</span><span class="cx">         imip_recipients = []
</span><span class="lines">@@ -456,9 +454,6 @@
</span><span class="cx">             elif isinstance(recipient, LocalCalendarUser):
</span><span class="cx">                 caldav_recipients.append(recipient)
</span><span class="cx"> 
</span><del>-            elif isinstance(recipient, PartitionedCalendarUser):
-                partitioned_recipients.append(recipient)
-
</del><span class="cx">             elif isinstance(recipient, OtherServerCalendarUser):
</span><span class="cx">                 otherserver_recipients.append(recipient)
</span><span class="cx"> 
</span><span class="lines">@@ -480,10 +475,6 @@
</span><span class="cx">         if caldav_recipients:
</span><span class="cx">             yield self.generateLocalSchedulingResponses(caldav_recipients, responses, freebusy)
</span><span class="cx"> 
</span><del>-        # Now process partitioned recipients
-        if partitioned_recipients:
-            yield self.generateRemoteSchedulingResponses(partitioned_recipients, responses, freebusy, getattr(self.txn, 'doing_attendee_refresh', False))
-
</del><span class="cx">         # Now process other server recipients
</span><span class="cx">         if otherserver_recipients:
</span><span class="cx">             yield self.generateRemoteSchedulingResponses(otherserver_recipients, responses, freebusy, getattr(self.txn, 'doing_attendee_refresh', False))
</span><span class="lines">@@ -572,8 +563,8 @@
</span><span class="cx">             else:
</span><span class="cx">                 # Map recipient to their inbox
</span><span class="cx">                 inbox = None
</span><del>-                if principal.calendarsEnabled() and principal.thisServer():
-                    if principal.locallyHosted():
</del><ins>+                if principal.calendarsEnabled():
+                    if principal.thisServer():
</ins><span class="cx">                         recipient_home = yield self.txn.calendarHomeWithUID(principal.uid, create=True)
</span><span class="cx">                         if recipient_home:
</span><span class="cx">                             inbox = (yield recipient_home.calendarWithName(&quot;inbox&quot;))
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingutilspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/utils.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/utils.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/utils.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -29,7 +29,7 @@
</span><span class="cx">     one of them to avoid scheduling problems.
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    if record and record.locallyHosted():
</del><ins>+    if record and record.thisServer():
</ins><span class="cx">         # Get record's calendar-home
</span><span class="cx">         calendar_home = yield txn.calendarHomeWithUID(record.uid)
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoretestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/test/util.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/test/util.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/util.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -61,7 +61,6 @@
</span><span class="cx">         fullName,
</span><span class="cx">         calendarUserAddresses,
</span><span class="cx">         cutype=&quot;INDIVIDUAL&quot;,
</span><del>-        locallyHosted=True,
</del><span class="cx">         thisServer=True,
</span><span class="cx">     ):
</span><span class="cx"> 
</span><span class="lines">@@ -72,7 +71,6 @@
</span><span class="cx">         self.displayName = self.fullName if self.fullName else self.shortNames[0]
</span><span class="cx">         self.calendarUserAddresses = calendarUserAddresses
</span><span class="cx">         self.cutype = cutype
</span><del>-        self._locallyHosted = locallyHosted
</del><span class="cx">         self._thisServer = thisServer
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -92,10 +90,6 @@
</span><span class="cx">         return cua
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def locallyHosted(self):
-        return self._locallyHosted
-
-
</del><span class="cx">     def thisServer(self):
</span><span class="cx">         return self._thisServer
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavicalendardirectoryservicepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/icalendardirectoryservice.py (11900 => 11901)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/icalendardirectoryservice.py        2013-11-07 02:00:24 UTC (rev 11900)
+++ CalendarServer/trunk/txdav/caldav/icalendardirectoryservice.py        2013-11-07 17:02:26 UTC (rev 11901)
</span><span class="lines">@@ -60,18 +60,9 @@
</span><span class="cx">         @rtype: C{str}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    def locallyHosted(): #@NoSelf
-        &quot;&quot;&quot;
-        Indicates whether the record is host on this specific server &quot;pod&quot;.
-
-        @return: C{True} if locally hosted.
-        @rtype: C{bool}
-        &quot;&quot;&quot;
-
</del><span class="cx">     def thisServer(): #@NoSelf
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        Indicates whether the record is hosted on this server or another &quot;pod&quot;
-        that hosts the same directory service.
</del><ins>+        Indicates whether the record is hosted on this server &quot;pod&quot;.
</ins><span class="cx"> 
</span><span class="cx">         @return: C{True} if hosted by this service.
</span><span class="cx">         @rtype: C{bool}
</span></span></pre>
</div>
</div>

</body>
</html>