def inbox5to6(old): """ Copy over all attributes except C{scheduler}. """ new = old.upgradeVersion( Inbox.typeName, 5, 6, privateApplication=old.privateApplication, messageSource=old.messageSource, quotientPrefs=old.quotientPrefs, messageDisplayPrefs=old.messageDisplayPrefs, deliveryAgent=old.deliveryAgent, uiComplexity=old.uiComplexity, showMoreDetail=old.showMoreDetail, filter=old.filter, focus=old.focus, ) # If the old item was original schema version 5 in the database, focus and # filter have already been installed, because the 4 to 5 upgrader used to # install them. However, now that 5 is not the newest version of Inbox, it # cannot do that. Only the upgrader to the newest version can. So do it # here, instead, if it is necessary (which is when the original schema # version was older than 5). if installedOn(new.filter) is None: installOn(new.filter, new.store) if installedOn(new.focus) is None: installOn(new.focus, new.store) return new
def test_properOrphaning(self): """ If two installed items both depend on a third, it should be removed as soon as both installed items are removed, but no sooner. """ foo = Kitchen(store=self.store) e = Toaster(store=self.store) dependency.installOn(e, foo) ps = self.store.findUnique(PowerStrip) bb = self.store.findUnique(Breadbox) f = Blender(store=self.store) dependency.installOn(f, foo) self.assertEquals(list(self.store.query(PowerStrip)), [ps]) #XXX does ordering matter? self.assertEquals(set(dependency.installedDependents(ps, foo)), set([e, f])) self.assertEquals(set(dependency.installedRequirements(e, foo)), set([bb, ps])) self.assertEquals(list(dependency.installedRequirements(f, foo)), [ps]) dependency.uninstallFrom(e, foo) self.assertEquals(dependency.installedOn(ps), foo) dependency.uninstallFrom(f, foo) self.assertEquals(dependency.installedOn(ps), None)
def test_installOffering(self): """ L{OfferingConfiguration.installOffering} should install the given offering on the Mantissa server. """ conf = self.adminAccount.avatars.open().findUnique( offering.OfferingConfiguration) io = conf.installOffering(self.offering, None) # InstalledOffering should be returned, and installed on the site store foundIO = self.store.findUnique(offering.InstalledOffering, offering.InstalledOffering.offeringName == self.offering.name) self.assertIdentical(io, foundIO) # Site store requirements should be on the site store tsr = self.store.findUnique(TestSiteRequirement) self.failUnless(installedOn(tsr), self.store) # App store should have been created appStore = self.userbase.accountByAddress(self.offering.name, None) self.assertNotEqual(appStore, None) # App store requirements should be on the app store ss = appStore.avatars.open() tap = ss.findUnique(TestAppPowerup) self.failUnless(installedOn(tap), ss) self.assertRaises(offering.OfferingAlreadyInstalled, conf.installOffering, self.offering, None)
def test_installOffering(self): """ L{OfferingConfiguration.installOffering} should install the given offering on the Mantissa server. """ conf = self.adminAccount.avatars.open().findUnique( offering.OfferingConfiguration) io = conf.installOffering(self.offering, None) # InstalledOffering should be returned, and installed on the site store foundIO = self.store.findUnique( offering.InstalledOffering, offering.InstalledOffering.offeringName == self.offering.name) self.assertIdentical(io, foundIO) # Site store requirements should be on the site store tsr = self.store.findUnique(TestSiteRequirement) self.failUnless(installedOn(tsr), self.store) # App store should have been created appStore = self.userbase.accountByAddress(self.offering.name, None) self.assertNotEqual(appStore, None) # App store requirements should be on the app store ss = appStore.avatars.open() tap = ss.findUnique(TestAppPowerup) self.failUnless(installedOn(tap), ss) self.assertRaises(offering.OfferingAlreadyInstalled, conf.installOffering, self.offering, None)
def inbox5to6(old): """ Copy over all attributes except C{scheduler}. """ new = old.upgradeVersion( Inbox.typeName, 5, 6, privateApplication=old.privateApplication, messageSource=old.messageSource, quotientPrefs=old.quotientPrefs, messageDisplayPrefs=old.messageDisplayPrefs, deliveryAgent=old.deliveryAgent, uiComplexity=old.uiComplexity, showMoreDetail=old.showMoreDetail, filter=old.filter, focus=old.focus) # If the old item was original schema version 5 in the database, focus and # filter have already been installed, because the 4 to 5 upgrader used to # install them. However, now that 5 is not the newest version of Inbox, it # cannot do that. Only the upgrader to the newest version can. So do it # here, instead, if it is necessary (which is when the original schema # version was older than 5). if installedOn(new.filter) is None: installOn(new.filter, new.store) if installedOn(new.focus) is None: installOn(new.focus, new.store) return new
def test_basicUninstall(self): """ Ensure that uninstallation removes the adapter from the former install target and all orphaned dependencies. """ foo = Kitchen(store=self.store) e = Toaster(store=self.store) dependency.installOn(e, foo) dependency.uninstallFrom(e, foo) self.assertEqual(dependency.installedOn(e), None) self.assertEqual(dependency.installedOn(e.powerStrip), None)
def test_recursiveInstall(self): """ Installing an item should install all of its dependencies, and all of its dependencies, and so forth. """ foo = Kitchen(store=self.store) ic = IceCrusher(store=self.store) dependency.installOn(ic, foo) blender = self.store.findUnique(Blender) ps = self.store.findUnique(PowerStrip) self.assertEquals(dependency.installedOn(blender), foo) self.assertEquals(dependency.installedOn(ps), foo) self.assertEquals(list(dependency.installedRequirements(ic, foo)), [blender])
def inbox4to5(old): """ Copy over all attributes and add a reference to a newly created Focus item. Focus did not exist prior to the addition of this dependency, so there is no way one could exist in the store of an existing Inbox. Additionally, find or create a spam.Filter. See inbox3to4. """ focus = Focus(store=old.store) new = old.upgradeVersion( Inbox.typeName, 4, 5, privateApplication=old.privateApplication, messageSource=old.messageSource, quotientPrefs=old.quotientPrefs, deliveryAgent=old.deliveryAgent, messageDisplayPrefs=old.messageDisplayPrefs, uiComplexity=old.uiComplexity, showMoreDetail=old.showMoreDetail, ) src = old.store.findUnique(MessageSource) if installedOn(src) is None: # MessageSource was created in pre-dependency-system days _DependencyConnector(installee=src, target=old.store, explicitlyInstalled=True, store=old.store) filter = new.store.findFirst(spam.Filter, default=None) if filter is None: filter = spam.Filter(store=new.store) new.filter = filter new.focus = focus return new
def inbox4to5(old): """ Copy over all attributes and add a reference to a newly created Focus item. Focus did not exist prior to the addition of this dependency, so there is no way one could exist in the store of an existing Inbox. Additionally, find or create a spam.Filter. See inbox3to4. """ focus = Focus(store=old.store) new = old.upgradeVersion( Inbox.typeName, 4, 5, privateApplication=old.privateApplication, messageSource=old.messageSource, quotientPrefs=old.quotientPrefs, deliveryAgent=old.deliveryAgent, messageDisplayPrefs=old.messageDisplayPrefs, uiComplexity=old.uiComplexity, showMoreDetail=old.showMoreDetail) src = old.store.findUnique(MessageSource) if installedOn(src) is None: #MessageSource was created in pre-dependency-system days _DependencyConnector(installee=src, target=old.store, explicitlyInstalled=True, store=old.store) filter = new.store.findFirst(spam.Filter, default=None) if filter is None: filter = spam.Filter(store=new.store) new.filter = filter new.focus = focus return new
def test_recursiveUninstall(self): """ Removal of items should recursively remove orphaned dependencies. """ foo = Kitchen(store=self.store) ic = IceCrusher(store=self.store) dependency.installOn(ic, foo) blender = self.store.findUnique(Blender) ps = self.store.findUnique(PowerStrip) dependency.uninstallFrom(ic, foo) self.failIf(dependency.installedOn(blender)) self.failIf(dependency.installedOn(ps)) self.failIf(dependency.installedOn(ic))
def test_anonymousSite(self): """ An L{AnonymousSite} is created and installed on the site store. """ resource = self.store.findUnique(AnonymousSite) self.assertEqual(list(self.store.interfacesFor(resource)), [IResource, IMantissaSite, IWebViewer]) self.assertIdentical(installedOn(resource), self.store) self.assertIdentical(resource.loginSystem, IRealm(self.store))
def test_portNumber(self): """ Test that the MailTransferAgent's portNumber attribute is transformed into a TCPPort instance. """ mta = self.store.findUnique(MailTransferAgent) ports = list(self.store.query(TCPPort, TCPPort.factory == mta)) self.assertEqual(len(ports), 1) self.assertEqual(ports[0].portNumber, 5025) self.assertEqual(installedOn(ports[0]), self.store) self.assertEqual(list(self.store.interfacesFor(ports[0])), [IService])
def test_portNumber(self): """ Test that the WebSite's portNumber attribute is transformed into a TCPPort instance. """ site = self.store.findUnique(SiteConfiguration) ports = list(self.store.query(TCPPort, TCPPort.factory == site)) self.assertEqual(len(ports), 1) self.assertEqual(ports[0].portNumber, 8088) self.assertEqual(installedOn(ports[0]), self.store) self.assertEqual(list(self.store.interfacesFor(ports[0])), [IService])
def test_portNumber(self): """ Test that the POP3Listener's portNumber attribute is transformed into a TCPPort instance. """ pop3 = self.store.findUnique(POP3Listener) ports = list(self.store.query(TCPPort, TCPPort.factory == pop3)) self.assertEqual(len(ports), 1) self.assertEqual(ports[0].portNumber, 2110) self.assertEqual(installedOn(ports[0]), self.store) self.assertEqual(list(self.store.interfacesFor(ports[0])), [IService])
def test_securePortNumber(self): """ Test that the MailTransferAgent's securePortNumber attribute is transformed into an SSLPort instance. """ mta = self.store.findUnique(MailTransferAgent) ports = list(self.store.query(SSLPort, SSLPort.factory == mta)) self.assertEqual(len(ports), 1) self.assertEqual(ports[0].portNumber, 5465) certPath = self.store.newFilePath('mta.pem') self.assertEqual(ports[0].certificatePath, certPath) self.assertEqual(certPath.getContent(), '--- PEM ---\n') self.assertEqual(installedOn(ports[0]), self.store) self.assertEqual(list(self.store.interfacesFor(ports[0])), [IService])
def test_securePortNumber(self): """ Test that the POP3Listener's securePortNumber attribute is transformed into an SSLPort instance. """ pop3 = self.store.findUnique(POP3Listener) ports = list(self.store.query(SSLPort, SSLPort.factory == pop3)) self.assertEqual(len(ports), 1) self.assertEqual(ports[0].portNumber, 2995) certPath = self.store.newFilePath('pop3.pem') self.assertEqual(ports[0].certificatePath, certPath) self.assertEqual(certPath.getContent(), '--- PEM ---\n') self.assertEqual(installedOn(ports[0]), self.store) self.assertEqual(list(self.store.interfacesFor(ports[0])), [IService])
def test_securePortNumber(self): """ Test that the WebSite's securePortNumber attribute is transformed into an SSLPort instance. """ site = self.store.findUnique(SiteConfiguration) ports = list(self.store.query(SSLPort, SSLPort.factory == site)) self.assertEqual(len(ports), 1) self.assertEqual(ports[0].portNumber, 6443) certPath = self.store.newFilePath('server.pem') self.assertEqual(ports[0].certificatePath, certPath) self.assertEqual(certPath.getContent(), cert) self.assertEqual(installedOn(ports[0]), self.store) self.assertEqual(list(self.store.interfacesFor(ports[0])), [IService])
def test_explicitInstall(self): """ If an item is explicitly installed, it should not be implicitly uninstalled. Also, dependsOn attributes should be filled in properly even if a dependent item is not installed automatically. """ foo = Kitchen(store=self.store) ps = PowerStrip(store=self.store) dependency.installOn(ps, foo) e = Toaster(store=self.store) dependency.installOn(e, foo) self.assertEqual(e.powerStrip, ps) dependency.uninstallFrom(e, foo) self.assertEquals(dependency.installedOn(ps), foo)
def locateChild(self, context, segments): store = IStore(context) if segments: content = store.findFirst(Content, AND(Content.type == self.contentType)) return AdminContentEditPage(dependency.installedOn(content)), segments[1:]
def _makeSiteConfiguration(currentVersion, oldSite, couldHavePorts): from xmantissa.publicweb import AnonymousSite newSite = oldSite.upgradeVersion( 'mantissa_web_powerup', currentVersion, 6, hitCount=oldSite.hitCount) if newSite.store.parent is not None: return newSite # SiteConfiguration dependsOn LoginSystem. LoginSystem was probably # installed by the mantissa axiomatic command. During the dependency # system conversion, that command was changed to use installOn on the # LoginSystem. However, no upgrader was supplied to create the new # dependency state. Consequently, there may be none. Consequently, a new # LoginSystem will be created if an item which dependsOn LoginSystem is # installed. This would be bad. So, set up the necessary dependency state # here, before instantiating SiteConfiguration. -exarkun # Addendum: it is almost certainly the case that there are not legitimate # configurations which lack a LoginSystem. However, a large number of # database upgrade tests construct unrealistic databases. One aspect of # the unrealism is that they lack a LoginSystem. Therefore, rather than # changing all the bogus stubs and regenerating the stubs, I will just # support the case where LoginSystem is missing. However, note that a # LoginSystem upgrader may invalidate this check and result in a duplicate # being created anyway. -exarkun loginSystem = oldSite.store.findUnique(LoginSystem, default=None) if loginSystem is not None and installedOn(loginSystem) is None: installOn(loginSystem, oldSite.store) uninstallFrom(oldSite.store, oldSite) site = SiteConfiguration( store=oldSite.store, httpLog=oldSite.store.filesdir.child('httpd.log'), hostname=getattr(oldSite, "hostname", None) or u"localhost") installOn(site, site.store) anonymousAvatar = AnonymousSite(store=oldSite.store) installOn(anonymousAvatar, oldSite.store) if couldHavePorts: for tcp in site.store.query(TCPPort, TCPPort.factory == oldSite): tcp.factory = site for ssl in site.store.query(SSLPort, SSLPort.factory == oldSite): ssl.factory = site else: if oldSite.portNumber is not None: port = TCPPort( store=oldSite.store, portNumber=oldSite.portNumber, factory=site) installOn(port, oldSite.store) securePortNumber = oldSite.securePortNumber certificateFile = oldSite.certificateFile if securePortNumber is not None and certificateFile: oldCertPath = site.store.dbdir.preauthChild(certificateFile) newCertPath = site.store.newFilePath('server.pem') oldCertPath.moveTo(newCertPath) port = SSLPort( store=site.store, portNumber=oldSite.securePortNumber, certificatePath=newCertPath, factory=site) installOn(port, site.store) newSite.deleteFromStore()
def getContentForType(self, contentType): return [dependency.installedOn(content) for content in self.store.query(Content, AND(Content.type == contentType, ContentType.site == self)).distinct()]