~abompard/mailman/import21

« back to all changes in this revision

Viewing changes to src/mailman/testing/layers.py

  • Committer: Barry Warsaw
  • Date: 2013-06-17 13:36:43 UTC
  • Revision ID: barry@list.org-20130617133643-uj7atdykh2whwabw
 * `bin/runner` command has been simplified and its command line options
   reduced.  Now, only one `-r/--runner` option may be provided and the
   round-robin feature has been removed.
 * Fixed REST server crash on `reopen` command.  Identification and test
   provided by Aurélien Bompard.  (LP: #1184376)

Also:

 * bin/runner now uses standard argparse instead of ScriptOptions.
 * The entire bin/runner machinery has bee reorganized and simplified.  There
 * is no more Loop class.  Signal setting is moved directly into the base
   Runner class and overrided in specific subclasses (e.g. RESTRunner which
   must cleanly shutdown its TCPServer).  The runner exit status is now set
   directly on the Runner instance.
 * Fixed a few minor style issues.
 * In order to cleanly shutdown the RESTRunner's WSGI server, we must start a
   subthread which only watches for an Event and then calls the server's
   shutdown() method.  It has to be this way because the WSGI server itself
   (due to interactions with SQLite), and the signal handlers (due to Python's
   signal handling semantics) must both run in the main thread.  However, the
   shutdown() must be invoked from a subthread in order to prevent deadlock.
 * Refactor the RESTLayer to eliminate duplication of code.

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
import datetime
46
46
import tempfile
47
47
 
48
 
from base64 import b64encode
49
 
from lazr.config import as_boolean, as_timedelta
 
48
from lazr.config import as_boolean
50
49
from pkg_resources import resource_string
51
50
from textwrap import dedent
52
 
from urllib2 import Request, URLError, urlopen
53
51
from zope.component import getUtility
54
52
 
55
53
from mailman.config import config
59
57
from mailman.database.transaction import transaction
60
58
from mailman.interfaces.domain import IDomainManager
61
59
from mailman.testing.helpers import (
62
 
    TestableMaster, get_lmtp_client, reset_the_world)
 
60
    TestableMaster, get_lmtp_client, reset_the_world, wait_for_webservice)
63
61
from mailman.testing.mta import ConnectionCountingController
64
62
from mailman.utilities.string import expand
65
63
 
315
313
 
316
314
    server = None
317
315
 
318
 
    @staticmethod
319
 
    def _wait_for_rest_server():
320
 
        until = datetime.datetime.now() + as_timedelta(config.devmode.wait)
321
 
        while datetime.datetime.now() < until:
322
 
            try:
323
 
                request = Request('http://localhost:9001/3.0/system')
324
 
                basic_auth = '{0}:{1}'.format(config.webservice.admin_user,
325
 
                                              config.webservice.admin_pass)
326
 
                request.add_header('Authorization',
327
 
                                   'Basic ' + b64encode(basic_auth))
328
 
                fp = urlopen(request)
329
 
            except URLError:
330
 
                pass
331
 
            else:
332
 
                fp.close()
333
 
                break
334
 
        else:
335
 
            raise RuntimeError('REST server did not start up')
336
 
 
337
316
    @classmethod
338
317
    def setUp(cls):
339
318
        assert cls.server is None, 'Layer already set up'
340
 
        cls.server = TestableMaster(cls._wait_for_rest_server)
 
319
        cls.server = TestableMaster(wait_for_webservice)
341
320
        cls.server.start('rest')
342
321
 
343
322
    @classmethod