diff --git a/.gitignore b/.gitignore index 029bf45e..237ed8ca 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ lib +lib64 bin include man @@ -8,3 +9,5 @@ tokenserver.egg-info loadtest/*.xml* loadtest/assertions.py loadtest/html +nosetests.xml +.channel diff --git a/Makefile b/Makefile index 9917ef9a..00f383db 100644 --- a/Makefile +++ b/Makefile @@ -11,8 +11,7 @@ COVERAGE = bin/coverage PYLINT = bin/pylint SERVER = dev-auth.services.mozilla.com SCHEME = https -PYPI = http://c.pypi.python.org/simple -PYPI2 = http://c.pypi.python.org/packages +PYPI = https://pypi.python.org/simple PYPI2RPM = bin/pypi2rpm.py --index=$(PYPI) PYPIOPTIONS = -i $(PYPI) CHANNEL = dev @@ -63,10 +62,9 @@ build: $(INSTALL) circus $(INSTALL) WebTest $(INSTALL) wsgi_intercept - $(INSTALL) pyzmq==2.1.11 + $(INSTALL) Cython + $(INSTALL) https://github.com/rfk/pyzmq/archive/green-ioloop-instance.zip bin/easy_install `bin/python ezm2c.py` - bin/easy_install `bin/python ezgevent.py` - bin/easy_install `bin/python ezgeventzmq.py` $(CURDIR)/ezpylibmc.sh $(BUILDAPP) -t $(TIMEOUT) -c $(CHANNEL) $(PYPIOPTIONS) $(DEPS) @@ -96,7 +94,7 @@ build_rpms2: PYTHONPATH=$(CURDIR)/lib/*/site-packages bin/pypi2rpm.py ${BUILD_TMP}/master.zip --dist-dir=$(RPMDIR) wget -O ${BUILD_TMP}/nose-0.11.4.tar.gz http://pypi.python.org/packages/source/n/nose/nose-0.11.4.tar.gz bin/pypi2rpm.py ${BUILD_TMP}/nose-0.11.4.tar.gz --dist-dir=$(RPMDIR) - cd ${BUILD_TMP} && wget $(PYPI2)/source/M/M2Crypto/M2Crypto-0.21.1.tar.gz#md5=f93d8462ff7646397a9f77a2fe602d17 + cd ${BUILD_TMP} && wget $(PYPI)/source/M/M2Crypto/M2Crypto-0.21.1.tar.gz#md5=f93d8462ff7646397a9f77a2fe602d17 cd ${BUILD_TMP} && tar -xzvf M2Crypto-0.21.1.tar.gz && cd M2Crypto-0.21.1 && sed -i -e 's/opensslconf\./opensslconf-x86_64\./' SWIG/_ec.i && sed -i -e 's/opensslconf\./opensslconf-x86_64\./' SWIG/_evp.i && SWIG_FEATURES=-cpperraswarn $(PYTHON) setup.py --command-packages=pypi2rpm.command bdist_rpm2 --binary-only --dist-dir=$(RPMDIR) --name=python26-m2crypto rm -rf ${BUILD_TMP}/M2Crypto* wget -O $(BUILD_TMP)/certifi-0.0.8.tar.gz http://pypi.python.org/packages/source/c/certifi/certifi-0.0.8.tar.gz diff --git a/dev-reqs.txt b/dev-reqs.txt index f9ea71b7..78168bc9 100644 --- a/dev-reqs.txt +++ b/dev-reqs.txt @@ -1,46 +1,47 @@ -venusian==1.0a3 -cornice==0.10 -SQLAlchemy==0.7.6 -Chameleon==2.5.3 -Jinja2==2.6 -Mako==0.5 -MarkupSafe==0.15 +venusian==1.0a8 +cornice==0.16.2 +SQLAlchemy==0.9.1 +Chameleon==2.14 +Jinja2==2.7.1 +Mako==0.9.1 +MarkupSafe==0.18 Paste==1.7.5.1 -PasteDeploy==1.5 +PasteDeploy==1.5.2 PasteScript==1.7.5 -WebOb==1.2b3 -pyramid==1.3 -pyramid_jinja2==1.2 -pyramid_debugtoolbar==0.9.4 -repoze.lru==0.4 -simplejson==2.2.1 +WebOb==1.3.1 +pyramid==1.4.3 +pyramid_jinja2==1.9 +pyramid_debugtoolbar==1.0.9 +repoze.lru==0.6 +simplejson==3.3.1 translationstring==1.1 -wsgi_intercept==0.5.1 -zope.component==3.11 -zope.deprecation==3.5 -zope.event==3.5.1 -zope.interface==3.8 -psutil==0.4.1 +wsgi_intercept==0.6 +zope.component==4.1.0 +zope.deprecation==4.1.0 +zope.event==4.0.2 +zope.interface==4.0.5 +psutil==1.2.1 ordereddict==1.1 unittest2==0.5.1 -WebTest==1.3.3 -Sphinx==1.1.2 -docutils==0.8.1 -coverage==3.5.1 -greenlet==0.3.4 -Pygments==1.4 -cef==0.3 -PyMySQL==0.5 +WebTest==2.0.11 +Sphinx==1.2 +docutils==0.11 +coverage==3.7.1 +greenlet==0.4.1 +Pygments==1.6 +cef==0.5 +PyMySQL==0.6.1 pymysql_sa==1.0 -protobuf==2.4.1 -gevent==0.13.7 -pylibmc==1.2.2 -requests==0.11.1 -chardet==1.0.1 -metlog-py==0.9.5 -wimms==0.3 +protobuf==2.5 +gevent==1.0 +pylibmc==1.2.3 +requests==2.1 +chardet==2.2.1 +metlog-py==0.10 +/home/rfk/repos/mozilla/services/wimms powerhose==0.7 -tokenlib==0.1 -mozsvc==0.6 -PyBrowserID==0.8 +tokenlib==0.2 +mozsvc==0.7 +PyBrowserID==0.9.1 argparse==1.2.1 +circus==0.10 diff --git a/ezgevent.py b/ezgevent.py deleted file mode 100644 index 8efd1e8a..00000000 --- a/ezgevent.py +++ /dev/null @@ -1,20 +0,0 @@ -import sys - -is_64bits = sys.maxsize > 2**32 -major = '2' -minor = sys.version_info[1] -plat = sys.platform - -HOST = "http://people.mozilla.com/~ametaireau/eggs/" - -releases = { - (False, 6, 'darwin'): 'gevent-0.13.7-py2.6-macosx-10.7-intel.egg', - (True, 6, 'darwin'): 'gevent-0.13.7-py2.6-macosx-10.7-intel.egg', - (False, 7, 'darwin'): 'gevent-0.13.7-py2.7-macosx-10.7-intel.egg', - (True, 7, 'darwin'): 'gevent-0.13.7-py2.7-macosx-10.7-intel.egg', -} - -try: - print HOST + releases[is_64bits, minor, plat] -except KeyError: - print 'http://pypi.python.org/packages/source/g/gevent/gevent-0.13.7.tar.gz' diff --git a/ezgeventzmq.py b/ezgeventzmq.py deleted file mode 100644 index 66507b30..00000000 --- a/ezgeventzmq.py +++ /dev/null @@ -1,22 +0,0 @@ -import sys - -is_64bits = sys.maxsize > 2**32 -major = '2' -minor = sys.version_info[1] -plat = sys.platform - -HOST = "http://people.mozilla.com/~ametaireau/eggs/" - -releases = { - (False, 6, 'darwin'): 'gevent_zeromq-0.2.2-py2.6-macosx-10.7-intel.egg', - (True, 6, 'darwin'): 'gevent_zeromq-0.2.2-py2.6-macosx-10.7-intel.egg', - (False, 7, 'darwin'): 'gevent_zeromq-0.2.2-py2.7-macosx-10.7-intel.egg', - (True, 7, 'darwin'): 'gevent_zeromq-0.2.2-py2.7-macosx-10.7-intel.egg', - (False, 6, 'linux2'): 'gevent_zeromq-0.2.2-py2.6.egg', - (False, 7, 'linux2'): 'gevent_zeromq-0.2.2-py2.7.egg', -} - -try: - print HOST + releases[is_64bits, minor, plat] -except KeyError: - print HOST + 'gevent_zeromq-0.2.2-py2.6.egg' diff --git a/ezpylibmc.sh b/ezpylibmc.sh index c68bfdfe..cd21fad9 100755 --- a/ezpylibmc.sh +++ b/ezpylibmc.sh @@ -1,6 +1,6 @@ if [ -e "/opt/local/include/libmemcached/memcached.h" ] then - LIBMEMCACHED=/opt/local/ bin/pip install pylibmc==1.2.2 + LIBMEMCACHED=/opt/local/ bin/pip install pylibmc==1.2.3 else - bin/pip install pylibmc==1.2.2 + bin/pip install pylibmc==1.2.3 fi diff --git a/tokenserver/__init__.py b/tokenserver/__init__.py index 99732dfb..d3f206d6 100644 --- a/tokenserver/__init__.py +++ b/tokenserver/__init__.py @@ -1,17 +1,14 @@ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. + import sys +from tokenserver.util import monkey_patch_gevent + runner = sys.argv[0] if runner.endswith('nosetests'): - try: - from gevent import monkey - from gevent_zeromq import monkey_patch - monkey.patch_all() - monkey_patch() - except ImportError: - pass + monkey_patch_gevent() import logging @@ -31,13 +28,7 @@ def includeme(config): - try: - from gevent import monkey - from gevent_zeromq import monkey_patch - monkey.patch_all() - monkey_patch() - except ImportError: - pass + monkey_patch_gevent() config.include("cornice") config.include("mozsvc") diff --git a/tokenserver/tests/support.py b/tokenserver/tests/support.py index b0c28237..f81b72dd 100644 --- a/tokenserver/tests/support.py +++ b/tokenserver/tests/support.py @@ -160,4 +160,5 @@ def get_assertion(email, audience="*", issuer='browserid.org', kwargs['email_keypair'] =\ get_keypair(hostname="not-the-right-host.com") - return make_assertion(email, audience, issuer=issuer, **kwargs) + assertion = make_assertion(email, audience, issuer=issuer, **kwargs) + return assertion.encode('ascii') diff --git a/tokenserver/tests/test_powerhose.py b/tokenserver/tests/test_powerhose.py index 565bdb9e..de8fdb33 100644 --- a/tokenserver/tests/test_powerhose.py +++ b/tokenserver/tests/test_powerhose.py @@ -9,7 +9,7 @@ from logging.config import fileConfig from ConfigParser import NoSectionError -from cornice.tests import CatchErrors +from cornice.tests.support import CatchErrors from mozsvc.config import load_into_settings from mozsvc.plugin import load_and_register, load_from_settings diff --git a/tokenserver/tests/test_service.py b/tokenserver/tests/test_service.py index 1235450a..a531c363 100644 --- a/tokenserver/tests/test_service.py +++ b/tokenserver/tests/test_service.py @@ -7,7 +7,7 @@ from webtest import TestApp from pyramid import testing -from cornice.tests import CatchErrors +from cornice.tests.support import CatchErrors from mozsvc.config import load_into_settings from mozsvc.plugin import load_and_register, load_from_settings @@ -60,7 +60,7 @@ def tearDown(self): def _getassertion(self): email = 'tarek@mozilla.com' url = 'http://tokenserver.services.mozilla.com' - return make_assertion(email, url) + return make_assertion(email, url).encode('ascii') def test_unknown_app(self): headers = {'Authorization': 'Browser-ID %s' % self._getassertion()} diff --git a/tokenserver/util.py b/tokenserver/util.py index 57c35f9b..0e3f86c3 100644 --- a/tokenserver/util.py +++ b/tokenserver/util.py @@ -4,6 +4,7 @@ from base64 import b32encode from hashlib import sha1 import os +import sys from pyramid.threadlocal import get_current_registry @@ -14,6 +15,41 @@ from mozsvc.secrets import Secrets +def monkey_patch_gevent(): + """Monkey-patch gevent into core and zmq.""" + try: + from gevent import monkey + except ImportError: + return + monkey.patch_all() + try: + import zmq + import zmq.eventloop + import zmq.eventloop.ioloop + import zmq.eventloop.zmqstream + import zmq.green + import zmq.green.eventloop + import zmq.green.eventloop.ioloop + import zmq.green.eventloop.zmqstream + except ImportError: + return + TO_PATCH = ((zmq, zmq.green), + (zmq.eventloop, zmq.green.eventloop), + (zmq.eventloop.ioloop, zmq.green.eventloop.ioloop), + (zmq.eventloop.zmqstream, zmq.green.eventloop.zmqstream)) + for (red, green) in TO_PATCH: + for name in dir(red): + redval = getattr(red, name) + if name.startswith('__') or type(redval) is type(zmq): + continue + try: + greenval = getattr(green, name) + except AttributeError: + continue + if redval is not greenval: + setattr(red, name, greenval) + + def hash_email(email): digest = sha1(email.lower()).digest() return b32encode(digest).lower()