[CalendarServer-changes] [11599] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Mon Aug 12 11:56:46 PDT 2013


Revision: 11599
          http://trac.calendarserver.org//changeset/11599
Author:   sagen at apple.com
Date:     2013-08-12 11:56:46 -0700 (Mon, 12 Aug 2013)
Log Message:
-----------
Linux may not have OpenDirectory, but don't let that stop us

Modified Paths:
--------------
    CalendarServer/trunk/calendarserver/tap/caldav.py
    CalendarServer/trunk/calendarserver/tools/test/test_agent.py
    CalendarServer/trunk/calendarserver/tools/test/test_resources.py
    CalendarServer/trunk/twistedcaldav/upgrade.py

Modified: CalendarServer/trunk/calendarserver/tap/caldav.py
===================================================================
--- CalendarServer/trunk/calendarserver/tap/caldav.py	2013-08-12 18:17:19 UTC (rev 11598)
+++ CalendarServer/trunk/calendarserver/tap/caldav.py	2013-08-12 18:56:46 UTC (rev 11599)
@@ -107,7 +107,6 @@
 from calendarserver.push.notifier import PushDistributor
 from calendarserver.push.amppush import AMPPushMaster, AMPPushForwarder
 from calendarserver.push.applepush import ApplePushNotifierService
-from calendarserver.tools.agent import makeAgentService
 
 try:
     from calendarserver.version import version
@@ -1260,6 +1259,7 @@
         config.EnableCalDAV = config.EnableCardDAV = True
 
         def agentServiceCreator(pool, store, ignored, storageService):
+            from calendarserver.tools.agent import makeAgentService
             if storageService is not None:
                 # Shut down if DataRoot becomes unavailable
                 from twisted.internet import reactor
@@ -1409,12 +1409,12 @@
                 return pgserv
             elif config.DBType == 'postgres':
                 # Connect to a postgres database that is already running.
-                return createSubServiceFactory()(pgConnectorFromConfig(config))
+                return createSubServiceFactory()(pgConnectorFromConfig(config), None)
             elif config.DBType == 'oracle':
                 # Connect to an Oracle database that is already running.
                 return createSubServiceFactory(dialect=ORACLE_DIALECT,
                                                paramstyle='numeric')(
-                    oracleConnectorFromConfig(config)
+                    oracleConnectorFromConfig(config), None
                 )
             else:
                 raise UsageError("Unknown database type %r" (config.DBType,))

Modified: CalendarServer/trunk/calendarserver/tools/test/test_agent.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/test/test_agent.py	2013-08-12 18:17:19 UTC (rev 11598)
+++ CalendarServer/trunk/calendarserver/tools/test/test_agent.py	2013-08-12 18:56:46 UTC (rev 11599)
@@ -14,163 +14,168 @@
 # limitations under the License.
 ##
 
-from calendarserver.tools.agent import AgentRealm
-from calendarserver.tools.agent import CustomDigestCredentialFactory
-from calendarserver.tools.agent import DirectoryServiceChecker
-from calendarserver.tools.agent import InactivityDetector
-from twistedcaldav.test.util import TestCase
-from twisted.internet.defer import inlineCallbacks
-from twisted.internet.task import Clock
-from twisted.cred.error import UnauthorizedLogin 
-from twisted.web.resource import IResource
-from twisted.web.resource import ForbiddenResource
+try:
+    from calendarserver.tools.agent import AgentRealm
+    from calendarserver.tools.agent import CustomDigestCredentialFactory
+    from calendarserver.tools.agent import DirectoryServiceChecker
+    from calendarserver.tools.agent import InactivityDetector
+    from twistedcaldav.test.util import TestCase
+    from twisted.internet.defer import inlineCallbacks
+    from twisted.internet.task import Clock
+    from twisted.cred.error import UnauthorizedLogin 
+    from twisted.web.resource import IResource
+    from twisted.web.resource import ForbiddenResource
+    RUN_TESTS = True
+except ImportError:
+    RUN_TESTS = False
 
 
 
 
-class AgentTestCase(TestCase):
+if RUN_TESTS:
+    class AgentTestCase(TestCase):
 
-    def test_CustomDigestCredentialFactory(self):
-        f = CustomDigestCredentialFactory("md5", "/Local/Default")
-        challenge = f.getChallenge(FakeRequest())
-        self.assertTrue("qop" not in challenge)
-        self.assertEquals(challenge["algorithm"], "md5")
-        self.assertEquals(challenge["realm"], "/Local/Default")
+        def test_CustomDigestCredentialFactory(self):
+            f = CustomDigestCredentialFactory("md5", "/Local/Default")
+            challenge = f.getChallenge(FakeRequest())
+            self.assertTrue("qop" not in challenge)
+            self.assertEquals(challenge["algorithm"], "md5")
+            self.assertEquals(challenge["realm"], "/Local/Default")
 
-    @inlineCallbacks
-    def test_DirectoryServiceChecker(self):
-        c = DirectoryServiceChecker("/Local/Default")
-        fakeOpenDirectory = FakeOpenDirectory()
-        c.directoryModule = fakeOpenDirectory
+        @inlineCallbacks
+        def test_DirectoryServiceChecker(self):
+            c = DirectoryServiceChecker("/Local/Default")
+            fakeOpenDirectory = FakeOpenDirectory()
+            c.directoryModule = fakeOpenDirectory
 
-        fields = {
-            "username" : "foo",
-            "realm" : "/Local/Default",
-            "nonce" : 1,
-            "uri" : "/gateway",
-            "response" : "abc",
-            "algorithm" : "md5",
-        }
-        creds = FakeCredentials("foo", fields)
+            fields = {
+                "username" : "foo",
+                "realm" : "/Local/Default",
+                "nonce" : 1,
+                "uri" : "/gateway",
+                "response" : "abc",
+                "algorithm" : "md5",
+            }
+            creds = FakeCredentials("foo", fields)
 
-        # Record does not exist:
-        fakeOpenDirectory.returnThisRecord(None)
-        try:
-            yield c.requestAvatarId(creds)
-        except UnauthorizedLogin:
-            pass
-        else:
-            self.fail("Didn't raise UnauthorizedLogin")
+            # Record does not exist:
+            fakeOpenDirectory.returnThisRecord(None)
+            try:
+                yield c.requestAvatarId(creds)
+            except UnauthorizedLogin:
+                pass
+            else:
+                self.fail("Didn't raise UnauthorizedLogin")
 
 
-        # Record exists, but invalid credentials
-        fakeOpenDirectory.returnThisRecord("fooRecord")
-        fakeOpenDirectory.returnThisAuthResponse(False)
-        try:
-            yield c.requestAvatarId(creds)
-        except UnauthorizedLogin:
-            pass
-        else:
-            self.fail("Didn't raise UnauthorizedLogin")
+            # Record exists, but invalid credentials
+            fakeOpenDirectory.returnThisRecord("fooRecord")
+            fakeOpenDirectory.returnThisAuthResponse(False)
+            try:
+                yield c.requestAvatarId(creds)
+            except UnauthorizedLogin:
+                pass
+            else:
+                self.fail("Didn't raise UnauthorizedLogin")
 
 
-        # Record exists, valid credentials
-        fakeOpenDirectory.returnThisRecord("fooRecord")
-        fakeOpenDirectory.returnThisAuthResponse(True)
-        avatar = (yield c.requestAvatarId(creds))
-        self.assertEquals(avatar, "foo")
+            # Record exists, valid credentials
+            fakeOpenDirectory.returnThisRecord("fooRecord")
+            fakeOpenDirectory.returnThisAuthResponse(True)
+            avatar = (yield c.requestAvatarId(creds))
+            self.assertEquals(avatar, "foo")
 
 
-        # Record exists, but missing fields in credentials
-        del creds.fields["nonce"]
-        fakeOpenDirectory.returnThisRecord("fooRecord")
-        fakeOpenDirectory.returnThisAuthResponse(False)
-        try:
-            yield c.requestAvatarId(creds)
-        except UnauthorizedLogin:
-            pass
-        else:
-            self.fail("Didn't raise UnauthorizedLogin")
+            # Record exists, but missing fields in credentials
+            del creds.fields["nonce"]
+            fakeOpenDirectory.returnThisRecord("fooRecord")
+            fakeOpenDirectory.returnThisAuthResponse(False)
+            try:
+                yield c.requestAvatarId(creds)
+            except UnauthorizedLogin:
+                pass
+            else:
+                self.fail("Didn't raise UnauthorizedLogin")
 
 
-    def test_AgentRealm(self):
-        realm = AgentRealm("root", ["abc"])
+        def test_AgentRealm(self):
+            realm = AgentRealm("root", ["abc"])
 
-        # Valid avatar
-        interface, resource, ignored = realm.requestAvatar("abc", None, IResource)
-        self.assertEquals(resource, "root")
+            # Valid avatar
+            interface, resource, ignored = realm.requestAvatar("abc", None, IResource)
+            self.assertEquals(resource, "root")
 
-        # Not allowed avatar
-        interface, resource, ignored = realm.requestAvatar("def", None, IResource)
-        self.assertTrue(isinstance(resource, ForbiddenResource))
+            # Not allowed avatar
+            interface, resource, ignored = realm.requestAvatar("def", None, IResource)
+            self.assertTrue(isinstance(resource, ForbiddenResource))
 
-        # Interface unhandled
-        try:
-            realm.requestAvatar("def", None, None)
-        except NotImplementedError:
-            pass
-        else:
-            self.fail("Didn't raise NotImplementedError")
+            # Interface unhandled
+            try:
+                realm.requestAvatar("def", None, None)
+            except NotImplementedError:
+                pass
+            else:
+                self.fail("Didn't raise NotImplementedError")
 
 
 
-class InactivityDectectorTestCase(TestCase):
+    class InactivityDectectorTestCase(TestCase):
 
-    def test_inactivity(self):
-        clock = Clock()
+        def test_inactivity(self):
+            clock = Clock()
 
-        self.inactivityReached = False
-        def becameInactive():
-            self.inactivityReached = True
+            self.inactivityReached = False
+            def becameInactive():
+                self.inactivityReached = True
 
-        id = InactivityDetector(clock, 5, becameInactive)
+            id = InactivityDetector(clock, 5, becameInactive)
 
-        # After 3 seconds, not inactive
-        clock.advance(3)
-        self.assertFalse(self.inactivityReached)
+            # After 3 seconds, not inactive
+            clock.advance(3)
+            self.assertFalse(self.inactivityReached)
 
-        # Activity happens, pushing out the inactivity threshold
-        id.activity()
-        clock.advance(3)
-        self.assertFalse(self.inactivityReached)
+            # Activity happens, pushing out the inactivity threshold
+            id.activity()
+            clock.advance(3)
+            self.assertFalse(self.inactivityReached)
 
-        # Time passes without activity
-        clock.advance(3)
-        self.assertTrue(self.inactivityReached)
+            # Time passes without activity
+            clock.advance(3)
+            self.assertTrue(self.inactivityReached)
 
-        id.stop()
+            id.stop()
 
 
 
-class FakeRequest(object):
+    class FakeRequest(object):
 
-    def getClientIP(self):
-        return "127.0.0.1"
+        def getClientIP(self):
+            return "127.0.0.1"
 
 
 
-class FakeOpenDirectory(object):
+    class FakeOpenDirectory(object):
 
-    def returnThisRecord(self, response):
-        self.recordResponse = response
+        def returnThisRecord(self, response):
+            self.recordResponse = response
 
-    def getUserRecord(self, ignored, username):
-        return self.recordResponse
+        def getUserRecord(self, ignored, username):
+            return self.recordResponse
 
-    def returnThisAuthResponse(self, response):
-        self.authResponse = response
+        def returnThisAuthResponse(self, response):
+            self.authResponse = response
 
-    def authenticateUserDigest(self, ignored, node, username, challenge, response,
-        method):
-        return self.authResponse
+        def authenticateUserDigest(self, ignored, node, username, challenge, response,
+            method):
+            return self.authResponse
 
-    ODNSerror = "Error"
+        ODNSerror = "Error"
 
 
 
-class FakeCredentials(object):
+    class FakeCredentials(object):
 
-    def __init__(self, username, fields):
-        self.username = username
-        self.fields = fields
-        self.method = "POST"
+        def __init__(self, username, fields):
+            self.username = username
+            self.fields = fields
+            self.method = "POST"

Modified: CalendarServer/trunk/calendarserver/tools/test/test_resources.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/test/test_resources.py	2013-08-12 18:17:19 UTC (rev 11598)
+++ CalendarServer/trunk/calendarserver/tools/test/test_resources.py	2013-08-12 18:56:46 UTC (rev 11599)
@@ -14,151 +14,149 @@
 # limitations under the License.
 ##
 
-from calendarserver.tools.resources import migrateResources
-from twisted.internet.defer import inlineCallbacks, succeed
-from twistedcaldav.directory.directory import DirectoryService
-from twistedcaldav.test.util import TestCase
 
-
 try:
+    from calendarserver.tools.resources import migrateResources
+    from twisted.internet.defer import inlineCallbacks, succeed
+    from twistedcaldav.directory.directory import DirectoryService
+    from twistedcaldav.test.util import TestCase
     import dsattributes
     strGUID = dsattributes.kDS1AttrGeneratedUID
     strName = dsattributes.kDS1AttrDistinguishedName
+    RUN_TESTS = True
 except ImportError:
-    dsattributes = None
+    RUN_TESTS = False
 
 
 
-class StubDirectoryRecord(object):
+if RUN_TESTS:
+    class StubDirectoryRecord(object):
 
-    def __init__(self, recordType, guid=None, shortNames=None, fullName=None):
-        self.recordType = recordType
-        self.guid = guid
-        self.shortNames = shortNames
-        self.fullName = fullName
+        def __init__(self, recordType, guid=None, shortNames=None, fullName=None):
+            self.recordType = recordType
+            self.guid = guid
+            self.shortNames = shortNames
+            self.fullName = fullName
 
 
-class StubDirectoryService(object):
+    class StubDirectoryService(object):
 
-    def __init__(self, augmentService):
-        self.records = {}
-        self.augmentService = augmentService
+        def __init__(self, augmentService):
+            self.records = {}
+            self.augmentService = augmentService
 
-    def recordWithGUID(self, guid):
-        return None
+        def recordWithGUID(self, guid):
+            return None
 
-    def createRecords(self, data):
-        for recordType, recordData in data:
-            guid = recordData["guid"]
-            record = StubDirectoryRecord(recordType, guid=guid,
-                shortNames=recordData['shortNames'],
-                fullName=recordData['fullName'])
-            self.records[guid] = record
+        def createRecords(self, data):
+            for recordType, recordData in data:
+                guid = recordData["guid"]
+                record = StubDirectoryRecord(recordType, guid=guid,
+                    shortNames=recordData['shortNames'],
+                    fullName=recordData['fullName'])
+                self.records[guid] = record
 
-    def updateRecord(self, recordType, guid=None, shortNames=None,
-        fullName=None):
-        pass
+        def updateRecord(self, recordType, guid=None, shortNames=None,
+            fullName=None):
+            pass
 
 
-class StubAugmentRecord(object):
+    class StubAugmentRecord(object):
 
-    def __init__(self, guid=None):
-        self.guid = guid
-        self.autoSchedule = True
+        def __init__(self, guid=None):
+            self.guid = guid
+            self.autoSchedule = True
 
 
-class StubAugmentService(object):
+    class StubAugmentService(object):
 
-    records = {}
+        records = {}
 
-    @classmethod
-    def getAugmentRecord(cls, guid, recordType):
-        if not cls.records.has_key(guid):
-            record = StubAugmentRecord(guid=guid)
-            cls.records[guid] = record
-        return succeed(cls.records[guid])
+        @classmethod
+        def getAugmentRecord(cls, guid, recordType):
+            if not cls.records.has_key(guid):
+                record = StubAugmentRecord(guid=guid)
+                cls.records[guid] = record
+            return succeed(cls.records[guid])
 
-    @classmethod
-    def addAugmentRecords(cls, records):
-        for record in records:
-            cls.records[record.guid] = record
-        return succeed(True)
+        @classmethod
+        def addAugmentRecords(cls, records):
+            for record in records:
+                cls.records[record.guid] = record
+            return succeed(True)
 
 
-class MigrateResourcesTestCase(TestCase):
+    class MigrateResourcesTestCase(TestCase):
 
-    if dsattributes is None:
-        skip = "dsattributes module not available"
+        @inlineCallbacks
+        def test_migrateResources(self):
 
-    @inlineCallbacks
-    def test_migrateResources(self):
+            data = {
+                    dsattributes.kDSStdRecordTypeResources :
+                    [
+                        ['projector1', {
+                            strGUID : '6C99E240-E915-4012-82FA-99E0F638D7EF',
+                            strName : 'Projector 1'
+                        }],
+                        ['projector2', {
+                            strGUID : '7C99E240-E915-4012-82FA-99E0F638D7EF',
+                            strName : 'Projector 2'
+                        }],
+                    ],
+                    dsattributes.kDSStdRecordTypePlaces :
+                    [
+                        ['office1', {
+                            strGUID : '8C99E240-E915-4012-82FA-99E0F638D7EF',
+                            strName : 'Office 1'
+                        }],
+                    ],
+                }
 
-        data = {
-                dsattributes.kDSStdRecordTypeResources :
-                [
-                    ['projector1', {
-                        strGUID : '6C99E240-E915-4012-82FA-99E0F638D7EF',
-                        strName : 'Projector 1'
-                    }],
-                    ['projector2', {
-                        strGUID : '7C99E240-E915-4012-82FA-99E0F638D7EF',
-                        strName : 'Projector 2'
-                    }],
-                ],
-                dsattributes.kDSStdRecordTypePlaces :
-                [
-                    ['office1', {
-                        strGUID : '8C99E240-E915-4012-82FA-99E0F638D7EF',
-                        strName : 'Office 1'
-                    }],
-                ],
-            }
+            def queryMethod(sourceService, recordType, verbose=False):
+                return data[recordType]
 
-        def queryMethod(sourceService, recordType, verbose=False):
-            return data[recordType]
+            directoryService = StubDirectoryService(StubAugmentService())
+            yield migrateResources(None, directoryService, queryMethod=queryMethod)
+            for guid, recordType in (
+                ('6C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
+                ('7C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
+                ('8C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_locations),
+            ):
+                self.assertTrue(guid in directoryService.records)
+                record = directoryService.records[guid]
+                self.assertEquals(record.recordType, recordType)
 
-        directoryService = StubDirectoryService(StubAugmentService())
-        yield migrateResources(None, directoryService, queryMethod=queryMethod)
-        for guid, recordType in (
-            ('6C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
-            ('7C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
-            ('8C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_locations),
-        ):
-            self.assertTrue(guid in directoryService.records)
-            record = directoryService.records[guid]
-            self.assertEquals(record.recordType, recordType)
+                self.assertTrue(guid in StubAugmentService.records)
 
-            self.assertTrue(guid in StubAugmentService.records)
 
+            #
+            # Add more to OD and re-migrate
+            #
 
-        #
-        # Add more to OD and re-migrate
-        #
+            data[dsattributes.kDSStdRecordTypeResources].append(
+                ['projector3', {
+                    strGUID : '9C99E240-E915-4012-82FA-99E0F638D7EF',
+                    strName : 'Projector 3'
+                }]
+            )
+            data[dsattributes.kDSStdRecordTypePlaces].append(
+                ['office2', {
+                    strGUID : 'AC99E240-E915-4012-82FA-99E0F638D7EF',
+                    strName : 'Office 2'
+                }]
+            )
 
-        data[dsattributes.kDSStdRecordTypeResources].append(
-            ['projector3', {
-                strGUID : '9C99E240-E915-4012-82FA-99E0F638D7EF',
-                strName : 'Projector 3'
-            }]
-        )
-        data[dsattributes.kDSStdRecordTypePlaces].append(
-            ['office2', {
-                strGUID : 'AC99E240-E915-4012-82FA-99E0F638D7EF',
-                strName : 'Office 2'
-            }]
-        )
+            yield migrateResources(None, directoryService, queryMethod=queryMethod)
 
-        yield migrateResources(None, directoryService, queryMethod=queryMethod)
+            for guid, recordType in (
+                ('6C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
+                ('7C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
+                ('9C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
+                ('8C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_locations),
+                ('AC99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_locations),
+            ):
+                self.assertTrue(guid in directoryService.records)
+                record = directoryService.records[guid]
+                self.assertEquals(record.recordType, recordType)
 
-        for guid, recordType in (
-            ('6C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
-            ('7C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
-            ('9C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_resources),
-            ('8C99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_locations),
-            ('AC99E240-E915-4012-82FA-99E0F638D7EF', DirectoryService.recordType_locations),
-        ):
-            self.assertTrue(guid in directoryService.records)
-            record = directoryService.records[guid]
-            self.assertEquals(record.recordType, recordType)
-
-            self.assertTrue(guid in StubAugmentService.records)
+                self.assertTrue(guid in StubAugmentService.records)

Modified: CalendarServer/trunk/twistedcaldav/upgrade.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/upgrade.py	2013-08-12 18:17:19 UTC (rev 11598)
+++ CalendarServer/trunk/twistedcaldav/upgrade.py	2013-08-12 18:56:46 UTC (rev 11599)
@@ -38,7 +38,6 @@
 
 from twistedcaldav import caldavxml
 from twistedcaldav.directory import calendaruserproxy
-from twistedcaldav.directory.appleopendirectory import OpenDirectoryService
 from twistedcaldav.directory.calendaruserproxyloader import XMLCalendarUserProxyLoader
 from twistedcaldav.directory.directory import DirectoryService
 from twistedcaldav.directory.directory import GroupMembershipCacheUpdater
@@ -62,12 +61,10 @@
 from twisted.protocols.amp import AMP, Command, String, Boolean
 
 from calendarserver.tap.util import getRootResource, FakeRequest, directoryFromConfig
-from calendarserver.tools.resources import migrateResources
 from calendarserver.tools.util import getDirectory
 
 from txdav.caldav.datastore.scheduling.imip.mailgateway import migrateTokensToStore
 
-
 deadPropertyXattrPrefix = namedAny(
     "txdav.base.propertystore.xattr.PropertyStore.deadPropertyXattrPrefix"
 )
@@ -912,6 +909,12 @@
     #
     # Migrates locations and resources from OD
     #
+    try:
+        from twistedcaldav.directory.appleopendirectory import OpenDirectoryService
+        from calendarserver.tools.resources import migrateResources
+    except ImportError:
+        return succeed(None)
+
     log.warn("Migrating locations and resources")
 
     userService = directory.serviceForRecordType("users")
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130812/94370c9a/attachment-0001.html>


More information about the calendarserver-changes mailing list