def test_deploy_app_update_timestamp(self, client: ServeControllerClient): assert client.get_serve_status().app_status.deployment_timestamp == 0 config = ServeApplicationSchema.parse_obj(self.get_test_config()) client.deploy_app(config) assert client.get_serve_status().app_status.deployment_timestamp > 0 first_deploy_time = client.get_serve_status().app_status.deployment_timestamp time.sleep(0.1) config = self.get_test_config() config["deployments"] = [ { "name": "Adder", "num_replicas": 2, }, ] client.deploy_app(ServeApplicationSchema.parse_obj(config)) assert ( client.get_serve_status().app_status.deployment_timestamp > first_deploy_time ) assert client.get_serve_status().app_status.status in { ApplicationStatus.DEPLOYING, ApplicationStatus.RUNNING, }
def test_controller_recover_and_deploy(self, client: ServeControllerClient): """Ensure that in-progress deploy can finish even after controller dies.""" config = ServeApplicationSchema.parse_obj(self.get_test_config()) client.deploy_app(config) # Wait for app to deploy wait_for_condition( lambda: requests.post("http://localhost:8000/", json=["ADD", 2]).json() == "4 pizzas please!" ) wait_for_condition( lambda: requests.post("http://localhost:8000/", json=["MUL", 3]).json() == "9 pizzas please!" ) deployment_timestamp = client.get_serve_status().app_status.deployment_timestamp # Delete all deployments, but don't update config client.delete_deployments( ["Router", "Multiplier", "Adder", "create_order", "DAGDriver"] ) ray.kill(client._controller, no_restart=False) # When controller restarts, it should redeploy config automatically wait_for_condition( lambda: requests.post("http://localhost:8000/", json=["ADD", 2]).json() == "4 pizzas please!" ) wait_for_condition( lambda: requests.post("http://localhost:8000/", json=["MUL", 3]).json() == "9 pizzas please!" ) assert ( deployment_timestamp == client.get_serve_status().app_status.deployment_timestamp ) serve.shutdown() client = serve.start(detached=True) # Ensure config checkpoint has been deleted assert client.get_serve_status().app_status.deployment_timestamp == 0
def test_deploy_app_update_num_replicas(self, client: ServeControllerClient): config = ServeApplicationSchema.parse_obj(self.get_test_config()) client.deploy_app(config) wait_for_condition( lambda: requests.post("http://localhost:8000/", json=["ADD", 2] ).json() == "4 pizzas please!") wait_for_condition( lambda: requests.post("http://localhost:8000/", json=["MUL", 3] ).json() == "9 pizzas please!") actors = ray.util.list_named_actors(all_namespaces=True) config = self.get_test_config() config["deployments"] = [ { "name": "Adder", "num_replicas": 2, "user_config": { "increment": 0, }, "ray_actor_options": { "num_cpus": 0.1 }, }, { "name": "Multiplier", "num_replicas": 3, "user_config": { "factor": 0, }, "ray_actor_options": { "num_cpus": 0.1 }, }, ] client.deploy_app(ServeApplicationSchema.parse_obj(config)) wait_for_condition( lambda: requests.post("http://localhost:8000/", json=["ADD", 2] ).json() == "2 pizzas please!") wait_for_condition( lambda: requests.post("http://localhost:8000/", json=["MUL", 3] ).json() == "0 pizzas please!") wait_for_condition( lambda: client.get_serve_status().app_status.status == ApplicationStatus.RUNNING, timeout=15, ) updated_actors = ray.util.list_named_actors(all_namespaces=True) assert len(updated_actors) == len(actors) + 3