Changeset dd55acce in trunk


Ignore:
Timestamp:
2019-06-26T20:42:43Z (6 years ago)
Author:
meejah <meejah@…>
Branches:
master
Children:
47633fb
Parents:
016413b (diff), c169246 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' into 3031-replace-pycryptopp

Files:
6 added
17 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified .circleci/Dockerfile.centos

    r016413b rdd55acce  
    2424COPY . ${BUILD_SRC_ROOT}
    2525
    26 RUN "${BUILD_SRC_ROOT}"/.circleci/prepare-image.sh "${WHEELHOUSE_PATH}" "${VIRTUALENV_PATH}" "${BUILD_SRC_ROOT}"
     26RUN "${BUILD_SRC_ROOT}"/.circleci/prepare-image.sh "${WHEELHOUSE_PATH}" "${VIRTUALENV_PATH}" "${BUILD_SRC_ROOT}" "python2.7"
  • TabularUnified .circleci/Dockerfile.debian

    r016413b rdd55acce  
    2424COPY . ${BUILD_SRC_ROOT}
    2525
    26 RUN "${BUILD_SRC_ROOT}"/.circleci/prepare-image.sh "${WHEELHOUSE_PATH}" "${VIRTUALENV_PATH}" "${BUILD_SRC_ROOT}"
     26RUN "${BUILD_SRC_ROOT}"/.circleci/prepare-image.sh "${WHEELHOUSE_PATH}" "${VIRTUALENV_PATH}" "${BUILD_SRC_ROOT}" "python2.7"
    2727
    2828# Only the integration tests currently need this but it doesn't hurt to always
  • TabularUnified .circleci/Dockerfile.fedora

    r016413b rdd55acce  
    2424COPY . ${BUILD_SRC_ROOT}
    2525
    26 RUN "${BUILD_SRC_ROOT}"/.circleci/prepare-image.sh "${WHEELHOUSE_PATH}" "${VIRTUALENV_PATH}" "${BUILD_SRC_ROOT}"
     26RUN "${BUILD_SRC_ROOT}"/.circleci/prepare-image.sh "${WHEELHOUSE_PATH}" "${VIRTUALENV_PATH}" "${BUILD_SRC_ROOT}" "python2.7"
  • TabularUnified .circleci/Dockerfile.slackware

    r016413b rdd55acce  
    4747COPY . ${BUILD_SRC_ROOT}
    4848
    49 RUN "${BUILD_SRC_ROOT}"/.circleci/prepare-image.sh "${WHEELHOUSE_PATH}" "${VIRTUALENV_PATH}" "${BUILD_SRC_ROOT}"
     49RUN "${BUILD_SRC_ROOT}"/.circleci/prepare-image.sh "${WHEELHOUSE_PATH}" "${VIRTUALENV_PATH}" "${BUILD_SRC_ROOT}" "python2.7"
  • TabularUnified .circleci/Dockerfile.ubuntu

    r016413b rdd55acce  
    2727COPY . ${BUILD_SRC_ROOT}
    2828
    29 RUN "${BUILD_SRC_ROOT}"/.circleci/prepare-image.sh "${WHEELHOUSE_PATH}" "${VIRTUALENV_PATH}" "${BUILD_SRC_ROOT}"
     29RUN "${BUILD_SRC_ROOT}"/.circleci/prepare-image.sh "${WHEELHOUSE_PATH}" "${VIRTUALENV_PATH}" "${BUILD_SRC_ROOT}" "python2.7"
  • TabularUnified .circleci/config.yml

    r016413b rdd55acce  
    2525
    2626      - "slackware-14.2"
     27
     28      # Test against PyPy 2.7/7.1.1
     29      - "pypy2.7-7.1"
    2730
    2831      # Other assorted tasks and configurations
     
    6063      - "build-image-centos-7"
    6164      - "build-image-slackware-14.2"
     65      - "build-image-pypy-2.7-7.1.1-jessie"
    6266
    6367
     
    8690
    8791    environment: &UTF_8_ENVIRONMENT
     92      # In general, the test suite is not allowed to fail while the job
     93      # succeeds.  But you can set this to "yes" if you want it to be
     94      # otherwise.
     95      ALLOWED_FAILURE: "no"
    8896      # Tell Hypothesis which configuration we want it to use.
    8997      TAHOE_LAFS_HYPOTHESIS_PROFILE: "ci"
     
    92100      LANG: "en_US.UTF-8"
    93101      # Select a tox environment to run for this job.
    94       TAHOE_LAFS_TOX_ENVIRONMENT: "coverage"
     102      TAHOE_LAFS_TOX_ENVIRONMENT: "py27-coverage"
    95103      # Additional arguments to pass to tox.
    96104      TAHOE_LAFS_TOX_ARGS: ""
     
    124132                "/tmp/venv" \
    125133                "/tmp/project" \
     134                "${ALLOWED_FAILURE}" \
    126135                "${ARTIFACTS_OUTPUT_PATH}" \
    127136                "${TAHOE_LAFS_TOX_ENVIRONMENT}" \
     
    156165      - image: "tahoelafsci/debian:8"
    157166        user: "nobody"
     167
     168
     169  pypy2.7-7.1:
     170    <<: *DEBIAN
     171    docker:
     172      - image: "tahoelafsci/pypy:2.7-7.1.1-jessie"
     173        user: "nobody"
     174
     175    environment:
     176      <<: *UTF_8_ENVIRONMENT
     177      TAHOE_LAFS_TOX_ENVIRONMENT: "pypy27-coverage"
     178      ALLOWED_FAILURE: "yes"
    158179
    159180
     
    407428      DISTRO: "slackware"
    408429      TAG: "14.2"
     430
     431
     432  build-image-pypy-2.7-7.1.1-jessie:
     433    <<: *BUILD_IMAGE
     434
     435    environment:
     436      DISTRO: "pypy"
     437      TAG: "2.7-7.1.1-jessie"
  • TabularUnified .circleci/create-virtualenv.sh

    r016413b rdd55acce  
    1414shift
    1515
     16# The basename of the Python executable (found on PATH) that will be used with
     17# this image.  This lets us create a virtualenv that uses the correct Python.
     18PYTHON="$1"
     19shift
     20
    1621# Set up the virtualenv as a non-root user so we can run the test suite as a
    1722# non-root user.  See below.
    18 virtualenv --python python2.7 "${BOOTSTRAP_VENV}"
     23virtualenv --python "${PYTHON}" "${BOOTSTRAP_VENV}"
    1924
    2025# For convenience.
  • TabularUnified .circleci/prepare-image.sh

    r016413b rdd55acce  
    1919shift
    2020
     21# The basename of the Python executable (found on PATH) that will be used with
     22# this image.  This lets us create a virtualenv that uses the correct Python.
     23PYTHON="$1"
     24shift
     25
    2126"${PROJECT_ROOT}"/.circleci/fix-permissions.sh "${WHEELHOUSE_PATH}" "${BOOTSTRAP_VENV}" "${PROJECT_ROOT}"
    22 sudo --set-home -u nobody "${PROJECT_ROOT}"/.circleci/create-virtualenv.sh "${WHEELHOUSE_PATH}" "${BOOTSTRAP_VENV}"
     27sudo --set-home -u nobody "${PROJECT_ROOT}"/.circleci/create-virtualenv.sh "${WHEELHOUSE_PATH}" "${BOOTSTRAP_VENV}" "${PYTHON}"
    2328sudo --set-home -u nobody "${PROJECT_ROOT}"/.circleci/populate-wheelhouse.sh "${WHEELHOUSE_PATH}" "${BOOTSTRAP_VENV}" "${PROJECT_ROOT}"
  • TabularUnified .circleci/run-tests.sh

    r016413b rdd55acce  
    1212# know what wheels to get/build, of course.
    1313PROJECT_ROOT="$1"
     14shift
     15
     16ALLOWED_FAILURE="$1"
    1417shift
    1518
     
    5558export PIP_NO_INDEX="1"
    5659
     60if [ "${ALLOWED_FAILURE}" = "yes" ]; then
     61    alternative="true"
     62else
     63    alternative="false"
     64fi
     65
    5766${BOOTSTRAP_VENV}/bin/tox \
    5867    -c ${PROJECT_ROOT}/tox.ini \
    5968    --workdir /tmp/tahoe-lafs.tox \
    6069    -e "${TAHOE_LAFS_TOX_ENVIRONMENT}" \
    61     ${TAHOE_LAFS_TOX_ARGS}
     70    ${TAHOE_LAFS_TOX_ARGS} || "${alternative}"
    6271
    6372if [ -n "${ARTIFACTS}" ]; then
    6473    # Create a junitxml results area.
    6574    mkdir -p "$(dirname "${JUNITXML}")"
    66     ${BOOTSTRAP_VENV}/bin/subunit2junitxml < "${SUBUNIT2}" > "${JUNITXML}"
     75    ${BOOTSTRAP_VENV}/bin/subunit2junitxml < "${SUBUNIT2}" > "${JUNITXML}" || "${alternative}"
    6776fi
  • TabularUnified src/allmydata/_auto_deps.py

    r016413b rdd55acce  
    108108    # A great way to define types of values.
    109109    "attrs >= 18.2.0",
     110
     111    # WebSocket library for twisted and asyncio
     112    "autobahn >= 19.5.2",
    110113]
    111114
  • TabularUnified src/allmydata/client.py

    r016413b rdd55acce  
    206206        )
    207207    except Exception:
    208         return Failure()
     208        return defer.fail()
    209209
    210210
     
    260260        return defer.succeed(client)
    261261    except Exception:
    262         return Failure()
     262        return defer.fail()
    263263
    264264
  • TabularUnified src/allmydata/scripts/tahoe_daemonize.py

    r016413b rdd55acce  
    106106    subCommands = [("DaemonizeTahoeNode", None, usage.Options, "node")]
    107107
     108    stderr = sys.stderr
     109
    108110
    109111class DaemonizeTheRealService(Service, HookMixin):
     
    123125            "running": None,
    124126        }
     127        self.stderr = options.parent.stderr
    125128
    126129    def startService(self):
     
    144147            def handle_config_error(fail):
    145148                fail.trap(UnknownConfigError)
    146                 sys.stderr.write("\nConfiguration error:\n{}\n\n".format(fail.value))
     149                self.stderr.write("\nConfiguration error:\n{}\n\n".format(fail.value))
    147150                reactor.stop()
    148151                return
     
    205208
    206209    twistd_config = MyTwistdConfig()
     210    twistd_config.stdout = out
     211    twistd_config.stderr = err
    207212    try:
    208213        twistd_config.parseOptions(twistd_args)
  • TabularUnified src/allmydata/storage_client.py

    r016413b rdd55acce  
    3535from twisted.internet import defer
    3636from twisted.application import service
    37 
     37from eliot import (
     38    log_call,
     39)
    3840from foolscap.api import eventually
    3941from allmydata.interfaces import (
     
    9193        self._connected_high_water_mark = 0
    9294
     95    @log_call(action_type=u"storage-client:broker:set-static-servers")
    9396    def set_static_servers(self, servers):
    94         for (server_id, server) in servers.items():
    95             assert isinstance(server_id, unicode) # from YAML
    96             server_id = server_id.encode("ascii")
    97             self._static_server_ids.add(server_id)
    98             handler_overrides = server.get("connections", {})
    99             s = NativeStorageServer(server_id, server["ann"],
    100                                     self._tub_maker, handler_overrides)
    101             s.on_status_changed(lambda _: self._got_connection())
    102             s.setServiceParent(self)
    103             self.servers[server_id] = s
    104             s.start_connecting(self._trigger_connections)
     97        # Sorting the items gives us a deterministic processing order.  This
     98        # doesn't really matter but it makes the logging behavior more
     99        # predictable and easier to test (and at least one test does depend on
     100        # this sorted order).
     101        for (server_id, server) in sorted(servers.items()):
     102            try:
     103                storage_server = self._make_storage_server(server_id, server)
     104            except Exception:
     105                pass
     106            else:
     107                self._static_server_ids.add(server_id)
     108                self.servers[server_id] = storage_server
     109                storage_server.setServiceParent(self)
     110                storage_server.start_connecting(self._trigger_connections)
     111
     112    @log_call(
     113        action_type=u"storage-client:broker:make-storage-server",
     114        include_args=["server_id"],
     115        include_result=False,
     116    )
     117    def _make_storage_server(self, server_id, server):
     118        assert isinstance(server_id, unicode) # from YAML
     119        server_id = server_id.encode("ascii")
     120        handler_overrides = server.get("connections", {})
     121        s = NativeStorageServer(server_id, server["ann"],
     122                                self._tub_maker, handler_overrides)
     123        s.on_status_changed(lambda _: self._got_connection())
     124        return s
    105125
    106126    def when_connected_enough(self, threshold):
     
    255275        return "?"
    256276
     277
    257278@implementer(IServer)
    258279class NativeStorageServer(service.MultiService):
  • TabularUnified src/allmydata/test/cli/test_daemonize.py

    r016413b rdd55acce  
    99from allmydata.scripts.tahoe_daemonize import DaemonizeTahoeNodePlugin
    1010from allmydata.scripts.tahoe_daemonize import DaemonizeOptions
     11from allmydata.scripts.tahoe_daemonize import MyTwistdConfig
    1112
    1213
    1314class Util(unittest.TestCase):
     15    def setUp(self):
     16        self.twistd_options = MyTwistdConfig()
     17        self.twistd_options.parseOptions(["DaemonizeTahoeNode"])
     18        self.options = self.twistd_options.subOptions
    1419
    1520    def test_node_type_nothing(self):
     
    4045            r.stop = lambda: None
    4146            r.callWhenRunning = call
    42             service = plug.makeService(None)
     47            service = plug.makeService(self.options)
    4348            service.parent = Mock()
    4449            service.startService()
     
    5661            r.callWhenRunning = call
    5762            r.stop = 'foo'
    58             service = plug.makeService(None)
     63            service = plug.makeService(self.options)
    5964            service.parent = Mock()
    6065            # we'll raise ValueError because there's no key-generator
     
    8186            r.stop = lambda: None
    8287            r.callWhenRunning = call
    83             service = plug.makeService(None)
     88            service = plug.makeService(self.options)
    8489            service.parent = Mock()
    8590            with self.assertRaises(ValueError) as ctx:
  • TabularUnified src/allmydata/test/cli/test_start.py

    r016413b rdd55acce  
    11import os
    2 import sys
    32import shutil
    43import subprocess
     
    256255
    257256        i, o, e = StringIO(), StringIO(), StringIO()
    258         with patch.object(sys, 'stdout', o), patch.object(sys, 'stderr', e):
    259             runner.dispatch(config, i, o, e)
    260 
    261         output = o.getvalue()
     257        runner.dispatch(config, i, o, e)
     258
     259        output = e.getvalue()
    262260        # should print out the collected logs and an error-code
    263261        self.assertIn(
  • TabularUnified src/allmydata/test/test_client.py

    r016413b rdd55acce  
    22import mock
    33import twisted
     4from yaml import (
     5    safe_dump,
     6)
     7from fixtures import (
     8    Fixture,
     9    TempDir,
     10)
     11from eliot.testing import (
     12    capture_logging,
     13    assertHasAction,
     14)
    415from twisted.trial import unittest
    516from twisted.application import service
    617from twisted.internet import defer
     18from twisted.python.filepath import (
     19    FilePath,
     20)
     21from testtools.matchers import (
     22    Equals,
     23    AfterPreprocessing,
     24)
     25from testtools.twistedsupport import (
     26    succeeded,
     27)
    728
    829import allmydata
     
    2142from foolscap.api import flushEventualQueue
    2243import allmydata.test.common_util as testutil
     44from allmydata.test.common import (
     45    SyncTestCase,
     46)
    2347
    2448
     
    667691
    668692
     693def get_known_server_details(a_client):
     694    """
     695    Get some details about known storage servers from a client.
     696
     697    :param _Client a_client: The client to inspect.
     698
     699    :return: A ``list`` of two-tuples.  Each element of the list corresponds
     700        to a "known server".  The first element of each tuple is a server id.
     701        The second is the server's announcement.
     702    """
     703    return list(
     704        (s.get_serverid(), s.get_announcement())
     705        for s
     706        in a_client.storage_broker.get_known_servers()
     707    )
     708
     709
     710class StaticServers(Fixture):
     711    """
     712    Create a ``servers.yaml`` file.
     713    """
     714    def __init__(self, basedir, server_details):
     715        super(StaticServers, self).__init__()
     716        self._basedir = basedir
     717        self._server_details = server_details
     718
     719    def _setUp(self):
     720        private = self._basedir.child(u"private")
     721        private.makedirs()
     722        servers = private.child(u"servers.yaml")
     723        servers.setContent(safe_dump({
     724            u"storage": {
     725                serverid: {
     726                    u"ann": announcement,
     727                }
     728                for (serverid, announcement)
     729                in self._server_details
     730            },
     731        }))
     732
     733
     734class StorageClients(SyncTestCase):
     735    """
     736    Tests for storage-related behavior of ``_Client``.
     737    """
     738    def setUp(self):
     739        super(StorageClients, self).setUp()
     740        # Some other tests create Nodes and Node mutates tempfile.tempdir and
     741        # that screws us up because we're *not* making a Node.  "Fix" it.  See
     742        # https://tahoe-lafs.org/trac/tahoe-lafs/ticket/3052 for the real fix,
     743        # though.
     744        import tempfile
     745        tempfile.tempdir = None
     746
     747        tempdir = TempDir()
     748        self.useFixture(tempdir)
     749        self.basedir = FilePath(tempdir.path)
     750
     751    @capture_logging(
     752        lambda case, logger: assertHasAction(
     753            case,
     754            logger,
     755            actionType=u"storage-client:broker:set-static-servers",
     756            succeeded=True,
     757        ),
     758    )
     759    def test_static_servers(self, logger):
     760        """
     761        Storage servers defined in ``private/servers.yaml`` are loaded into the
     762        storage broker.
     763        """
     764        serverid = u"v0-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
     765        announcement = {
     766            u"nickname": u"some-storage-server",
     767            u"anonymous-storage-FURL": u"pb://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@tcp:storage.example:100/swissnum",
     768        }
     769        self.useFixture(
     770            StaticServers(
     771                self.basedir,
     772                [(serverid, announcement)],
     773            ),
     774        )
     775        self.assertThat(
     776            client.create_client(self.basedir.asTextMode().path),
     777            succeeded(
     778                AfterPreprocessing(
     779                    get_known_server_details,
     780                    Equals([(serverid, announcement)]),
     781                ),
     782            ),
     783        )
     784
     785    @capture_logging(
     786        lambda case, logger: assertHasAction(
     787            case,
     788            logger,
     789            actionType=u"storage-client:broker:make-storage-server",
     790            succeeded=False,
     791        ),
     792    )
     793    def test_invalid_static_server(self, logger):
     794        """
     795        An invalid announcement for a static server does not prevent other static
     796        servers from being loaded.
     797        """
     798        # Some good details
     799        serverid = u"v1-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
     800        announcement = {
     801            u"nickname": u"some-storage-server",
     802            u"anonymous-storage-FURL": u"pb://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@tcp:storage.example:100/swissnum",
     803        }
     804        self.useFixture(
     805            StaticServers(
     806                self.basedir,
     807                [(serverid, announcement),
     808                 # Along with a "bad" server announcement.  Order in this list
     809                 # doesn't matter, yaml serializer and Python dicts are going
     810                 # to shuffle everything around kind of randomly.
     811                 (u"v0-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
     812                  {u"nickname": u"another-storage-server",
     813                   u"anonymous-storage-FURL": None,
     814                  }),
     815                ],
     816            ),
     817        )
     818        self.assertThat(
     819            client.create_client(self.basedir.asTextMode().path),
     820            succeeded(
     821                AfterPreprocessing(
     822                    get_known_server_details,
     823                    # It should have the good server details.
     824                    Equals([(serverid, announcement)]),
     825                ),
     826            ),
     827        )
     828
     829
    669830class Run(unittest.TestCase, testutil.StallMixin):
    670831
  • TabularUnified tox.ini

    r016413b rdd55acce  
    88
    99[tox]
    10 envlist = py27
     10envlist = {py27,pypy27}{-coverage,}
    1111minversion = 2.4
    1212
Note: See TracChangeset for help on using the changeset viewer.