diff --git a/python/ray/autoscaler/autoscaler.py b/python/ray/autoscaler/autoscaler.py index 42a166a47..deec0386d 100644 --- a/python/ray/autoscaler/autoscaler.py +++ b/python/ray/autoscaler/autoscaler.py @@ -430,6 +430,8 @@ class StandardAutoscaler: return fields def _get_node_specific_docker_config(self, node_id): + if "docker" not in self.config: + return {} docker_config = copy.deepcopy(self.config.get("docker", {})) node_specific_docker = self._get_node_type_specific_fields( node_id, "docker") diff --git a/python/ray/tests/test_resource_demand_scheduler.py b/python/ray/tests/test_resource_demand_scheduler.py index 23c2aab21..70c6d9688 100644 --- a/python/ray/tests/test_resource_demand_scheduler.py +++ b/python/ray/tests/test_resource_demand_scheduler.py @@ -605,6 +605,32 @@ class AutoscalingTest(unittest.TestCase): autoscaler.update() self.waitForNodes(0) + def testEmptyDocker(self): + config = MULTI_WORKER_CLUSTER.copy() + del config["docker"] + config["min_workers"] = 0 + config["max_workers"] = 10 + config_path = self.write_config(config) + self.provider = MockProvider() + runner = MockProcessRunner() + autoscaler = StandardAutoscaler( + config_path, + LoadMetrics(), + max_failures=0, + process_runner=runner, + update_interval_s=0) + assert len(self.provider.non_terminated_nodes({})) == 0 + autoscaler.update() + self.waitForNodes(0) + autoscaler.request_resources([{"CPU": 1}]) + autoscaler.update() + self.waitForNodes(1) + assert self.provider.mock_nodes[0].node_type == "m4.large" + autoscaler.request_resources([{"GPU": 8}]) + autoscaler.update() + self.waitForNodes(2) + assert self.provider.mock_nodes[1].node_type == "p2.8xlarge" + if __name__ == "__main__": import sys