William Grant has proposed merging lp:~wgrant/launchpad/separate-zopeless-mail into lp:launchpad.
Requested reviews: Launchpad code reviewers (launchpad-reviewers) For more details, see: https://code.launchpad.net/~wgrant/launchpad/separate-zopeless-mail/+merge/76923 This branch splits Zopeless mail delivery out of the rest of the obsolete Zopeless infrastructure, and renames it to something hopefully a bit less misleading. Since Zopeless no longer exists except as a compatibility layer, the environments seen by scripts and appservers have largely converged. Except for mail delivery: initZopeless overrides lp.services.mail.sendmail to bypass normal transactional Zope mail delivery, instead delivering immediately directly via SMTP. Bug #29744 asks for this to converge as well, but some scripts still depend on this immediate delivery behaviour. This branch untangles immediate delivery and ZopelessTransactionManager. For compatibility, all non-test initZopeless callsites now call set_immediate_mail_delivery(True) -- they will hopefully eventually be gradually removed as part of the bug #29744 migration. The 'zopeless' config section has been renamed as well, as it pertains entirely to mail configuration. Only one production config mentions it: dogfood sets zopeless.send_mail = True, which is the default anyway -- I intend to remove it before landing this. Suggestions for better names than 'immediate mail delivery' are very welcome. -- https://code.launchpad.net/~wgrant/launchpad/separate-zopeless-mail/+merge/76923 Your team Launchpad code reviewers is requested to review the proposed merge of lp:~wgrant/launchpad/separate-zopeless-mail into lp:launchpad.
=== modified file 'configs/development/launchpad-lazr.conf' --- configs/development/launchpad-lazr.conf 2011-09-21 14:38:47 +0000 +++ configs/development/launchpad-lazr.conf 2011-09-26 00:35:27 +0000 @@ -353,7 +353,7 @@ [vhost.vostok] hostname: vostok.dev -[zopeless] +[immediate_mail] # XXX sinzui 2008-03-26: # A development box should never send email to the outer world, # so disable that here. note that the testrunner config inherits === modified file 'configs/testrunner-appserver/launchpad-lazr.conf' --- configs/testrunner-appserver/launchpad-lazr.conf 2011-04-05 23:36:31 +0000 +++ configs/testrunner-appserver/launchpad-lazr.conf 2011-09-26 00:35:27 +0000 @@ -55,7 +55,7 @@ [vhost.feeds] rooturl: http://feeds.launchpad.dev:8085/ -[zopeless] +[immediate_mail] # BarryWarsaw 04-Dec-2008: AppServerLayer tests should send email to the fake # SMTP server that the layer starts up, so that they can be collected and # tested. === modified file 'daemons/buildd-manager.tac' --- daemons/buildd-manager.tac 2011-09-18 09:49:40 +0000 +++ daemons/buildd-manager.tac 2011-09-26 00:35:27 +0000 @@ -8,15 +8,19 @@ from twisted.scripts.twistd import ServerOptions from twisted.web import server -from lp.buildmaster.manager import BuilddManager -from lp.services.twistedsupport.loggingsupport import RotatableFileLogObserver from canonical.config import config from canonical.database.sqlbase import ZopelessTransactionManager from canonical.launchpad.daemons import readyservice from canonical.launchpad.scripts import execute_zcml_for_scripts +from lp.buildmaster.manager import BuilddManager +from lp.services.mail.sendmail import set_immediate_mail_delivery +from lp.services.twistedsupport.loggingsupport import RotatableFileLogObserver execute_zcml_for_scripts() ZopelessTransactionManager.initZopeless(dbuser='buildd_manager') +# XXX wgrant 2011-09-24 bug=29744: initZopeless used to do this. +# Should be removed from callsites verified to not need it. +set_immediate_mail_delivery(True) options = ServerOptions() options.parseOptions() === modified file 'lib/canonical/config/schema-lazr.conf' --- lib/canonical/config/schema-lazr.conf 2011-09-21 14:38:47 +0000 +++ lib/canonical/config/schema-lazr.conf 2011-09-26 00:35:27 +0000 @@ -2037,10 +2037,10 @@ root: /var/tmp/testkeyserver -# Configuration specific for code that is running in the Zopeless -# environment. Hopefully this section will disappear when the -# Zope and Zopeless environments grow closer. -[zopeless] +# Immediate mail delivery configuration, for scripts that bypass Zope +# queued mail delivery. Will disappear once scripts are updated to use +# normal queued delivery. +[immediate_mail] # datatype: port_number smtp_port: 25 === modified file 'lib/canonical/testing/layers.py' --- lib/canonical/testing/layers.py 2011-09-22 19:59:40 +0000 +++ lib/canonical/testing/layers.py 2011-09-26 00:35:27 +0000 @@ -140,6 +140,7 @@ IMailBox, TestMailBox, ) +from lp.services.mail.sendmail import set_immediate_mail_delivery import lp.services.mail.stub from lp.services.memcache.client import memcache_client_factory from lp.services.osutils import kill_by_pidfile @@ -1535,6 +1536,10 @@ raise LayerIsolationError( "Last test using Zopeless failed to tearDown correctly") ZopelessTransactionManager.initZopeless(dbuser='launchpad_main') + # XXX wgrant 2011-09-24 bug=29744: initZopeless used to do this. + # Tests that still need it should eventually set this directly, + # so the whole layer is not polluted. + set_immediate_mail_delivery(True) # Connect Storm reconnect_stores() @@ -1548,6 +1553,11 @@ "Failed to uninstall ZopelessTransactionManager") # LaunchpadScriptLayer will disconnect the stores for us. + # XXX wgrant 2011-09-24 bug=29744: uninstall used to do this. + # Tests that still need immediate delivery should eventually do + # this directly. + set_immediate_mail_delivery(False) + @classmethod @profiled def commit(cls): === modified file 'lib/lp/services/job/runner.py' --- lib/lp/services/job/runner.py 2011-09-18 07:15:22 +0000 +++ lib/lp/services/job/runner.py 2011-09-26 00:35:27 +0000 @@ -64,7 +64,10 @@ LeaseHeld, SuspendJobException, ) -from lp.services.mail.sendmail import MailController +from lp.services.mail.sendmail import ( + MailController, + set_immediate_mail_delivery, + ) from lp.services.scripts.base import LaunchpadCronScript from lp.services.twistedsupport import run_reactor @@ -370,6 +373,9 @@ scripts.execute_zcml_for_scripts(use_web_security=False) signal(SIGHUP, handler) ZopelessTransactionManager.initZopeless(dbuser=cls.dbuser) + # XXX wgrant 2011-09-24 bug=29744: initZopeless used to do this. + # Should be removed from callsites verified to not need it. + set_immediate_mail_delivery(True) @staticmethod def __exit__(exc_type, exc_val, exc_tb): === modified file 'lib/lp/services/mail/sendmail.py' --- lib/lp/services/mail/sendmail.py 2011-09-18 07:22:34 +0000 +++ lib/lp/services/mail/sendmail.py 2011-09-26 00:35:27 +0000 @@ -21,6 +21,7 @@ 'get_msgid', 'MailController', 'sendmail', + 'set_immediate_mail_delivery', 'simple_sendmail', 'simple_sendmail_from_person', 'validate_message', @@ -51,7 +52,6 @@ from zope.sendmail.interfaces import IMailDelivery from canonical.config import config -from canonical.database.sqlbase import ZopelessTransactionManager from lp.app import versioninfo from lp.services.encoding import is_ascii_only from lp.services.mail.stub import TestMailer @@ -64,6 +64,7 @@ Charset.add_charset('utf-8', Charset.SHORTEST, Charset.QP, 'utf-8') Charset.add_alias('utf8', 'utf-8') + def do_paranoid_email_content_validation(from_addr, to_addrs, subject, body): """Validate various bits of the email. @@ -161,6 +162,20 @@ return format_address(person.displayname, email_address) +_immediate_mail_delivery = False + + +def set_immediate_mail_delivery(enabled): + """Enable or disable immediate mail delivery. + + Mail is by default queued until the transaction is committed. But if + a script requires that mail violate transactions, immediate mail + delivery can be enabled. + """ + global _immediate_mail_delivery + _immediate_mail_delivery = enabled + + def simple_sendmail(from_addr, to_addrs, subject, body, headers=None, bulk=True): """Send an email from from_addr to to_addrs with the subject and body @@ -422,11 +437,11 @@ raw_message = message.as_string() message_detail = message['Subject'] - if ZopelessTransactionManager._installed is not None: - # Zopeless email sending is not unit tested, and won't be. - # The zopeless specific stuff is pretty simple though so this + if _immediate_mail_delivery: + # Immediate email delivery is not unit tested, and won't be. + # The immediate-specific stuff is pretty simple though so this # should be fine. - # TODO: Store a timeline action for zopeless mail. + # TODO: Store a timeline action for immediate mail. if config.isTestRunner(): # when running in the testing environment, store emails @@ -436,12 +451,13 @@ # For debugging, from process-one-mail, just print it. sys.stdout.write(raw_message) else: - if config.zopeless.send_email: + if config.immediate_mail.send_email: # Note that we simply throw away dud recipients. This is fine, # as it emulates the Z3 API which doesn't report this either # (because actual delivery is done later). smtp = SMTP( - config.zopeless.smtp_host, config.zopeless.smtp_port) + config.immediate_mail.smtp_host, + config.immediate_mail.smtp_port) # The "MAIL FROM" is set to the bounce address, to behave in a # way similar to mailing list software. === modified file 'lib/lp/services/scripts/base.py' --- lib/lp/services/scripts/base.py 2011-09-18 08:28:20 +0000 +++ lib/lp/services/scripts/base.py 2011-09-26 00:35:27 +0000 @@ -51,6 +51,7 @@ install_feature_controller, make_script_feature_controller, ) +from lp.services.mail.sendmail import set_immediate_mail_delivery from lp.services.scripts.interfaces.scriptactivity import IScriptActivitySet @@ -322,6 +323,10 @@ self._init_zca(use_web_security=use_web_security) self._init_db(isolation=isolation) + # XXX wgrant 2011-09-24 bug=29744: initZopeless used to do this. + # Should be called directly by scripts that actually need it. + set_immediate_mail_delivery(True) + date_started = datetime.datetime.now(UTC) profiler = None if self.options.profile: === modified file 'scripts/bug-import.py' --- scripts/bug-import.py 2010-12-16 14:53:36 +0000 +++ scripts/bug-import.py 2011-09-26 00:35:27 +0000 @@ -48,7 +48,7 @@ # don't send email send_email_data = """ - [zopeless] + [immediate_mail] send_email: False """ config.push('send_email_data', send_email_data) === modified file 'scripts/mlist-import.py' --- scripts/mlist-import.py 2010-04-27 19:48:39 +0000 +++ scripts/mlist-import.py 2011-09-26 00:35:27 +0000 @@ -71,7 +71,7 @@ # switch. Notifications are disabled by default because they can # cause huge amounts to be sent to the team owner. send_email_config = """ - [zopeless] + [immediate_mail] send_email: %s """ % self.options.notifications config.push('send_email_config', send_email_config)
_______________________________________________ Mailing list: https://launchpad.net/~launchpad-reviewers Post to : [email protected] Unsubscribe : https://launchpad.net/~launchpad-reviewers More help : https://help.launchpad.net/ListHelp

