[xray] Add Travis build for testing xray on Linux. (#2047)

* Run xray tests in travis.

* Comment out TaskTests.testSubmittingManyTasks.

* Comment out failing tests.

* Comment out hanging test.

* Linting

* Comment out failing test.

* Comment out failing test.

* Ignore test_dataframe.py for now.

* Comment out testDriverExitingQuickly.
This commit is contained in:
Robert Nishihara 2018-05-13 21:22:01 -07:00 committed by Philipp Moritz
parent 4ff900e131
commit 52b0f3734a
8 changed files with 174 additions and 3 deletions

View file

@ -97,6 +97,58 @@ matrix:
- PYTHON=3.5 - PYTHON=3.5
- RAY_USE_NEW_GCS=on - RAY_USE_NEW_GCS=on
- os: linux
dist: trusty
env: PYTHON=3.5 RAY_USE_XRAY=1
install:
- ./.travis/install-dependencies.sh
- export PATH="$HOME/miniconda/bin:$PATH"
- ./.travis/install-ray.sh
- ./.travis/install-cython-examples.sh
script:
- export PATH="$HOME/miniconda/bin:$PATH"
- python python/ray/common/test/test.py
- python python/ray/common/redis_module/runtest.py
- python python/ray/plasma/test/test.py
# - python python/ray/local_scheduler/test/test.py
# - python python/ray/global_scheduler/test/test.py
- python -m pytest test/xray_test.py
- python test/runtest.py
- python test/array_test.py
- python test/actor_test.py
- python test/autoscaler_test.py
- python test/tensorflow_test.py
- python test/failure_test.py
- python test/microbenchmarks.py
- python test/stress_tests.py
# - python test/component_failures_test.py
- python test/multi_node_test.py
- python test/recursion_test.py
# - python test/monitor_test.py
- python test/cython_test.py
- python test/credis_test.py
# ray dataframe tests
# - python -m pytest python/ray/dataframe/test/test_dataframe.py
- python -m pytest python/ray/dataframe/test/test_concat.py
- python -m pytest python/ray/dataframe/test/test_io.py
# ray tune tests
# - python python/ray/tune/test/dependency_test.py
# - python -m pytest python/ray/tune/test/trial_runner_test.py
- python -m pytest python/ray/tune/test/trial_scheduler_test.py
# - python -m pytest python/ray/tune/test/tune_server_test.py
# ray rllib tests
- python -m pytest python/ray/rllib/test/test_catalog.py
- python -m pytest python/ray/rllib/test/test_filters.py
- python -m pytest python/ray/rllib/test/test_optimizers.py
- python -m pytest python/ray/rllib/test/test_evaluators.py
install: install:
- ./.travis/install-dependencies.sh - ./.travis/install-dependencies.sh
- export PATH="$HOME/miniconda/bin:$PATH" - export PATH="$HOME/miniconda/bin:$PATH"

View file

@ -4,6 +4,7 @@ from __future__ import print_function
import click import click
import json import json
import os
import subprocess import subprocess
import ray.services as services import ray.services as services
@ -144,7 +145,7 @@ def cli():
@click.option( @click.option(
"--use-raylet", "--use-raylet",
is_flag=True, is_flag=True,
default=False, default=None,
help="use the raylet code path, this is not supported yet") help="use the raylet code path, this is not supported yet")
def start(node_ip_address, redis_address, redis_port, num_redis_shards, def start(node_ip_address, redis_address, redis_port, num_redis_shards,
redis_max_clients, redis_shard_ports, object_manager_port, redis_max_clients, redis_shard_ports, object_manager_port,
@ -157,6 +158,11 @@ def start(node_ip_address, redis_address, redis_port, num_redis_shards,
if redis_address is not None: if redis_address is not None:
redis_address = services.address_to_ip(redis_address) redis_address = services.address_to_ip(redis_address)
if use_raylet is None and os.environ.get("RAY_USE_XRAY") == "1":
# This environment variable is used in our testing setup.
print("Detected environment variable 'RAY_USE_XRAY'.")
use_raylet = True
try: try:
resources = json.loads(resources) resources = json.loads(resources)
except Exception as e: except Exception as e:

View file

@ -1440,6 +1440,11 @@ def _init(address_info=None,
raise Exception("Driver_mode must be in [ray.SCRIPT_MODE, " raise Exception("Driver_mode must be in [ray.SCRIPT_MODE, "
"ray.PYTHON_MODE, ray.SILENT_MODE].") "ray.PYTHON_MODE, ray.SILENT_MODE].")
if use_raylet is None and os.environ.get("RAY_USE_XRAY") == "1":
# This environment variable is used in our testing setup.
print("Detected environment variable 'RAY_USE_XRAY'.")
use_raylet = True
# Get addresses of existing services. # Get addresses of existing services.
if address_info is None: if address_info is None:
address_info = {} address_info = {}
@ -1580,7 +1585,7 @@ def init(redis_address=None,
huge_pages=False, huge_pages=False,
include_webui=True, include_webui=True,
object_store_memory=None, object_store_memory=None,
use_raylet=False): use_raylet=None):
"""Connect to an existing Ray cluster or start one and connect to it. """Connect to an existing Ray cluster or start one and connect to it.
This method handles two cases. Either a Ray cluster already exists and we This method handles two cases. Either a Ray cluster already exists and we
@ -1635,6 +1640,11 @@ def init(redis_address=None,
Exception: An exception is raised if an inappropriate combination of Exception: An exception is raised if an inappropriate combination of
arguments is passed in. arguments is passed in.
""" """
if use_raylet is None and os.environ.get("RAY_USE_XRAY") == "1":
# This environment variable is used in our testing setup.
print("Detected environment variable 'RAY_USE_XRAY'.")
use_raylet = True
# Convert hostnames to numerical IP address. # Convert hostnames to numerical IP address.
if node_ip_address is not None: if node_ip_address is not None:
node_ip_address = services.address_to_ip(node_ip_address) node_ip_address = services.address_to_ip(node_ip_address)

View file

@ -18,6 +18,9 @@ class ActorAPI(unittest.TestCase):
def tearDown(self): def tearDown(self):
ray.worker.cleanup() ray.worker.cleanup()
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testKeywordArgs(self): def testKeywordArgs(self):
ray.init(num_workers=0, driver_mode=ray.SILENT_MODE) ray.init(num_workers=0, driver_mode=ray.SILENT_MODE)
@ -68,6 +71,9 @@ class ActorAPI(unittest.TestCase):
with self.assertRaises(Exception): with self.assertRaises(Exception):
ray.get(actor.get_values.remote()) ray.get(actor.get_values.remote())
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testVariableNumberOfArgs(self): def testVariableNumberOfArgs(self):
ray.init(num_workers=0) ray.init(num_workers=0)
@ -234,6 +240,9 @@ class ActorAPI(unittest.TestCase):
def __init__(self): def __init__(self):
pass pass
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testRandomIDGeneration(self): def testRandomIDGeneration(self):
ray.init(num_workers=0) ray.init(num_workers=0)
@ -327,6 +336,9 @@ class ActorMethods(unittest.TestCase):
with self.assertRaises(Exception): with self.assertRaises(Exception):
t.f(1) t.f(1)
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testActorDeletion(self): def testActorDeletion(self):
ray.init(num_workers=0) ray.init(num_workers=0)
@ -359,6 +371,9 @@ class ActorMethods(unittest.TestCase):
# called. # called.
self.assertEqual(ray.get(Actor.remote().method.remote()), 1) self.assertEqual(ray.get(Actor.remote().method.remote()), 1)
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testActorDeletionWithGPUs(self): def testActorDeletionWithGPUs(self):
ray.init(num_workers=0, num_gpus=1) ray.init(num_workers=0, num_gpus=1)
@ -549,6 +564,9 @@ class ActorNesting(unittest.TestCase):
actor2 = Actor2.remote(3, 4) actor2 = Actor2.remote(3, 4)
self.assertEqual(ray.get(actor2.get_values.remote(5)), (3, 4)) self.assertEqual(ray.get(actor2.get_values.remote(5)), (3, 4))
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testDefineActorWithinRemoteFunction(self): def testDefineActorWithinRemoteFunction(self):
# Make sure we can define and actors within remote funtions. # Make sure we can define and actors within remote funtions.
ray.init(num_cpus=10) ray.init(num_cpus=10)
@ -684,6 +702,9 @@ class ActorsOnMultipleNodes(unittest.TestCase):
def tearDown(self): def tearDown(self):
ray.worker.cleanup() ray.worker.cleanup()
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testActorsOnNodesWithNoCPUs(self): def testActorsOnNodesWithNoCPUs(self):
ray.init(num_cpus=0) ray.init(num_cpus=0)
@ -1098,6 +1119,9 @@ class ActorsWithGPUs(unittest.TestCase):
ready_ids, remaining_ids = ray.wait(results, timeout=1000) ready_ids, remaining_ids = ray.wait(results, timeout=1000)
self.assertEqual(len(ready_ids), 0) self.assertEqual(len(ready_ids), 0)
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testActorsAndTasksWithGPUsVersionTwo(self): def testActorsAndTasksWithGPUsVersionTwo(self):
# Create tasks and actors that both use GPUs and make sure that they # Create tasks and actors that both use GPUs and make sure that they
# are given different GPUs # are given different GPUs
@ -1170,6 +1194,9 @@ class ActorsWithGPUs(unittest.TestCase):
self.assertLess(interval1[1], interval2[0]) self.assertLess(interval1[1], interval2[0])
self.assertLess(interval2[0], interval2[1]) self.assertLess(interval2[0], interval2[1])
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testBlockingActorTask(self): def testBlockingActorTask(self):
ray.init(num_cpus=1, num_gpus=1) ray.init(num_cpus=1, num_gpus=1)
@ -1763,6 +1790,9 @@ class DistributedActorHandles(unittest.TestCase):
return Queue.remote() return Queue.remote()
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testFork(self): def testFork(self):
queue = self.setup_queue_actor() queue = self.setup_queue_actor()
@ -1778,6 +1808,9 @@ class DistributedActorHandles(unittest.TestCase):
filtered_items = [item[1] for item in items if item[0] == i] filtered_items = [item[1] for item in items if item[0] == i]
self.assertEqual(filtered_items, list(range(1))) self.assertEqual(filtered_items, list(range(1)))
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testForkConsistency(self): def testForkConsistency(self):
queue = self.setup_queue_actor() queue = self.setup_queue_actor()
@ -1871,6 +1904,9 @@ class ActorPlacementAndResources(unittest.TestCase):
def tearDown(self): def tearDown(self):
ray.worker.cleanup() ray.worker.cleanup()
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testLifetimeAndTransientResources(self): def testLifetimeAndTransientResources(self):
ray.init(num_cpus=1) ray.init(num_cpus=1)
@ -1928,6 +1964,9 @@ class ActorPlacementAndResources(unittest.TestCase):
for location in locations2: for location in locations2:
self.assertNotEqual(location, local_plasma) self.assertNotEqual(location, local_plasma)
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testCreatingMoreActorsThanResources(self): def testCreatingMoreActorsThanResources(self):
ray.init( ray.init(
num_workers=0, num_workers=0,

View file

@ -257,6 +257,9 @@ class WorkerDeath(unittest.TestCase):
def tearDown(self): def tearDown(self):
ray.worker.cleanup() ray.worker.cleanup()
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testWorkerRaisingException(self): def testWorkerRaisingException(self):
ray.init(num_workers=1, driver_mode=ray.SILENT_MODE) ray.init(num_workers=1, driver_mode=ray.SILENT_MODE)
@ -272,6 +275,9 @@ class WorkerDeath(unittest.TestCase):
wait_for_errors(b"worker_died", 1) wait_for_errors(b"worker_died", 1)
self.assertEqual(len(ray.error_info()), 2) self.assertEqual(len(ray.error_info()), 2)
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testWorkerDying(self): def testWorkerDying(self):
ray.init(num_workers=0, driver_mode=ray.SILENT_MODE) ray.init(num_workers=0, driver_mode=ray.SILENT_MODE)
@ -288,6 +294,9 @@ class WorkerDeath(unittest.TestCase):
self.assertIn("died or was killed while executing the task", self.assertIn("died or was killed while executing the task",
ray.error_info()[0][b"message"].decode("ascii")) ray.error_info()[0][b"message"].decode("ascii"))
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testActorWorkerDying(self): def testActorWorkerDying(self):
ray.init(num_workers=0, driver_mode=ray.SILENT_MODE) ray.init(num_workers=0, driver_mode=ray.SILENT_MODE)
@ -306,6 +315,9 @@ class WorkerDeath(unittest.TestCase):
self.assertRaises(Exception, lambda: ray.get(consume.remote(obj))) self.assertRaises(Exception, lambda: ray.get(consume.remote(obj)))
wait_for_errors(b"worker_died", 1) wait_for_errors(b"worker_died", 1)
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testActorWorkerDyingFutureTasks(self): def testActorWorkerDyingFutureTasks(self):
ray.init(num_workers=0, driver_mode=ray.SILENT_MODE) ray.init(num_workers=0, driver_mode=ray.SILENT_MODE)
@ -328,6 +340,9 @@ class WorkerDeath(unittest.TestCase):
wait_for_errors(b"worker_died", 1) wait_for_errors(b"worker_died", 1)
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testActorWorkerDyingNothingInProgress(self): def testActorWorkerDyingNothingInProgress(self):
ray.init(num_workers=0, driver_mode=ray.SILENT_MODE) ray.init(num_workers=0, driver_mode=ray.SILENT_MODE)

View file

@ -2,12 +2,13 @@ from __future__ import absolute_import
from __future__ import division from __future__ import division
from __future__ import print_function from __future__ import print_function
import unittest import os
import ray import ray
import subprocess import subprocess
import sys import sys
import tempfile import tempfile
import time import time
import unittest
from ray.test.test_utils import run_and_get_output from ray.test.test_utils import run_and_get_output
@ -153,6 +154,9 @@ print("success")
# Make sure the other driver succeeded. # Make sure the other driver succeeded.
self.assertIn("success", out) self.assertIn("success", out)
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testDriverExitingQuickly(self): def testDriverExitingQuickly(self):
# This test will create some drivers that submit some tasks and then # This test will create some drivers that submit some tasks and then
# exit without waiting for the tasks to complete. # exit without waiting for the tasks to complete.

View file

@ -689,6 +689,9 @@ class APITest(unittest.TestCase):
self.assertEqual(ray.get(k2.remote(1)), 2) self.assertEqual(ray.get(k2.remote(1)), 2)
self.assertEqual(ray.get(m.remote(1)), 2) self.assertEqual(ray.get(m.remote(1)), 2)
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testSubmitAPI(self): def testSubmitAPI(self):
self.init_ray(num_gpus=1, resources={"Custom": 1}, num_workers=1) self.init_ray(num_gpus=1, resources={"Custom": 1}, num_workers=1)
@ -720,6 +723,9 @@ class APITest(unittest.TestCase):
results = ray.get([object_ids[i] for i in indices]) results = ray.get([object_ids[i] for i in indices])
self.assertEqual(results, indices) self.assertEqual(results, indices)
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testWait(self): def testWait(self):
self.init_ray(num_cpus=1) self.init_ray(num_cpus=1)
@ -785,6 +791,9 @@ class APITest(unittest.TestCase):
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
ray.wait([1]) ray.wait([1])
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testMultipleWaitsAndGets(self): def testMultipleWaitsAndGets(self):
# It is important to use three workers here, so that the three tasks # It is important to use three workers here, so that the three tasks
# launched in this experiment can run at the same time. # launched in this experiment can run at the same time.
@ -887,6 +896,9 @@ class APITest(unittest.TestCase):
self.assertTrue("fake_directory" not in ray.get(get_path2.remote())) self.assertTrue("fake_directory" not in ray.get(get_path2.remote()))
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testLoggingAPI(self): def testLoggingAPI(self):
self.init_ray(driver_mode=ray.SILENT_MODE) self.init_ray(driver_mode=ray.SILENT_MODE)
@ -1033,6 +1045,9 @@ class PythonModeTest(unittest.TestCase):
def tearDown(self): def tearDown(self):
ray.worker.cleanup() ray.worker.cleanup()
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testPythonMode(self): def testPythonMode(self):
reload(test_functions) reload(test_functions)
ray.init(driver_mode=ray.PYTHON_MODE) ray.init(driver_mode=ray.PYTHON_MODE)
@ -1229,6 +1244,9 @@ class ResourcesTest(unittest.TestCase):
self.assertLess(duration, 1 + time_buffer) self.assertLess(duration, 1 + time_buffer)
self.assertGreater(duration, 1) self.assertGreater(duration, 1)
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testGPUIDs(self): def testGPUIDs(self):
num_gpus = 10 num_gpus = 10
ray.init(num_cpus=10, num_gpus=num_gpus) ray.init(num_cpus=10, num_gpus=num_gpus)
@ -1659,6 +1677,9 @@ class CudaVisibleDevicesTest(unittest.TestCase):
else: else:
del os.environ["CUDA_VISIBLE_DEVICES"] del os.environ["CUDA_VISIBLE_DEVICES"]
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testSpecificGPUs(self): def testSpecificGPUs(self):
allowed_gpu_ids = [4, 5, 6] allowed_gpu_ids = [4, 5, 6]
os.environ["CUDA_VISIBLE_DEVICES"] = ",".join( os.environ["CUDA_VISIBLE_DEVICES"] = ",".join(
@ -1699,6 +1720,9 @@ class WorkerPoolTests(unittest.TestCase):
ray.get([f.remote() for _ in range(100)]) ray.get([f.remote() for _ in range(100)])
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testBlockingTasks(self): def testBlockingTasks(self):
ray.init(num_workers=1) ray.init(num_workers=1)
@ -1728,6 +1752,9 @@ class WorkerPoolTests(unittest.TestCase):
ray.get(sleep.remote()) ray.get(sleep.remote())
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testMaxCallTasks(self): def testMaxCallTasks(self):
ray.init(num_cpus=1) ray.init(num_cpus=1)
@ -1838,6 +1865,9 @@ class GlobalStateAPI(unittest.TestCase):
def tearDown(self): def tearDown(self):
ray.worker.cleanup() ray.worker.cleanup()
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testGlobalStateAPI(self): def testGlobalStateAPI(self):
with self.assertRaises(Exception): with self.assertRaises(Exception):
ray.global_state.object_table() ray.global_state.object_table()
@ -1995,6 +2025,9 @@ class GlobalStateAPI(unittest.TestCase):
self.assertEqual(found_message, True) self.assertEqual(found_message, True)
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testTaskProfileAPI(self): def testTaskProfileAPI(self):
ray.init(redirect_output=True) ray.init(redirect_output=True)
@ -2053,6 +2086,9 @@ class GlobalStateAPI(unittest.TestCase):
self.assertIn("stderr_file", info) self.assertIn("stderr_file", info)
self.assertIn("stdout_file", info) self.assertIn("stdout_file", info)
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testDumpTraceFile(self): def testDumpTraceFile(self):
ray.init(redirect_output=True) ray.init(redirect_output=True)
@ -2091,6 +2127,9 @@ class GlobalStateAPI(unittest.TestCase):
# the visualization actually renders (e.g., the context of the dumped # the visualization actually renders (e.g., the context of the dumped
# trace could be malformed). # trace could be malformed).
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testFlushAPI(self): def testFlushAPI(self):
ray.init(num_cpus=1) ray.init(num_cpus=1)

View file

@ -71,6 +71,9 @@ class TaskTests(unittest.TestCase):
self.assertTrue(ray.services.all_processes_alive()) self.assertTrue(ray.services.all_processes_alive())
ray.worker.cleanup() ray.worker.cleanup()
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testSubmittingManyTasks(self): def testSubmittingManyTasks(self):
ray.init() ray.init()
@ -118,6 +121,9 @@ class TaskTests(unittest.TestCase):
self.assertTrue(ray.services.all_processes_alive()) self.assertTrue(ray.services.all_processes_alive())
ray.worker.cleanup() ray.worker.cleanup()
@unittest.skipIf(
os.environ.get("RAY_USE_XRAY") == "1",
"This test does not work with xray yet.")
def testWait(self): def testWait(self):
for num_local_schedulers in [1, 4]: for num_local_schedulers in [1, 4]:
for num_workers_per_scheduler in [4]: for num_workers_per_scheduler in [4]: