From b62e5a290f4123ca7170cea2ff4a4dc2276e88c3 Mon Sep 17 00:00:00 2001 From: Tiit Pikma Date: Mon, 6 Apr 2026 15:51:12 +0300 Subject: [PATCH 1/6] Update test_mixed_success_predict to handle V3 fail-fast --- tests/client/test_image_predict.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/client/test_image_predict.py b/tests/client/test_image_predict.py index 049124bd..c992e83e 100644 --- a/tests/client/test_image_predict.py +++ b/tests/client/test_image_predict.py @@ -203,16 +203,16 @@ def test_mixed_success_predict(channel_key): resources_pb2.Input( data=resources_pb2.Data(image=resources_pb2.Image(url=DOG_IMAGE_URL)) ), - resources_pb2.Input( - data=resources_pb2.Data(image=resources_pb2.Image(url=NON_EXISTING_IMAGE_URL)) - ), + resources_pb2.Input(), # No data, gives a status code distinct from generic INPUT_FAILED. ], ) response = post_model_outputs_and_maybe_allow_retries( stub, request, metadata=metadata(pat=True) ) - assert response.status.code == status_code_pb2.MIXED_STATUS + # For V2 predict, the API will respond with MIXED_SUCCESS and one SUCCESS input. + # For V3 predict, the API does not do partial predicts on early failures, so it will respond with FAILURE and two failed inputs. + assert response.status.code in [status_code_pb2.MIXED_STATUS, status_code_pb2.FAILURE] - assert response.outputs[0].status.code == status_code_pb2.SUCCESS - assert response.outputs[1].status.code == status_code_pb2.INPUT_DOWNLOAD_FAILED + assert response.outputs[0].status.code in [status_code_pb2.SUCCESS, status_code_pb2.INPUT_FAILED] + assert response.outputs[1].status.code == status_code_pb2.INPUT_INVALID_ARGUMENT From 298e35e5bb6f3f59db08145d0188e426dd71494a Mon Sep 17 00:00:00 2001 From: Tiit Pikma Date: Mon, 6 Apr 2026 16:12:34 +0300 Subject: [PATCH 2/6] clarify comment --- tests/client/test_image_predict.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/client/test_image_predict.py b/tests/client/test_image_predict.py index c992e83e..221a60b6 100644 --- a/tests/client/test_image_predict.py +++ b/tests/client/test_image_predict.py @@ -210,7 +210,7 @@ def test_mixed_success_predict(channel_key): stub, request, metadata=metadata(pat=True) ) - # For V2 predict, the API will respond with MIXED_SUCCESS and one SUCCESS input. + # For V2 predict, the API will respond with MIXED_STATUS and one of the inputs will be SUCCESS. # For V3 predict, the API does not do partial predicts on early failures, so it will respond with FAILURE and two failed inputs. assert response.status.code in [status_code_pb2.MIXED_STATUS, status_code_pb2.FAILURE] From 0ea70bd9443ecd524d306eee8b26d8003344738b Mon Sep 17 00:00:00 2001 From: Tiit Pikma Date: Mon, 6 Apr 2026 16:20:27 +0300 Subject: [PATCH 3/6] run pre-commit --- tests/client/test_image_predict.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/client/test_image_predict.py b/tests/client/test_image_predict.py index 221a60b6..859c3719 100644 --- a/tests/client/test_image_predict.py +++ b/tests/client/test_image_predict.py @@ -214,5 +214,8 @@ def test_mixed_success_predict(channel_key): # For V3 predict, the API does not do partial predicts on early failures, so it will respond with FAILURE and two failed inputs. assert response.status.code in [status_code_pb2.MIXED_STATUS, status_code_pb2.FAILURE] - assert response.outputs[0].status.code in [status_code_pb2.SUCCESS, status_code_pb2.INPUT_FAILED] + assert response.outputs[0].status.code in [ + status_code_pb2.SUCCESS, + status_code_pb2.INPUT_FAILED, + ] assert response.outputs[1].status.code == status_code_pb2.INPUT_INVALID_ARGUMENT From a451d2ba57f590acf6187a4d15ff75ea9f2c0e26 Mon Sep 17 00:00:00 2001 From: Tiit Pikma Date: Mon, 6 Apr 2026 16:29:12 +0300 Subject: [PATCH 4/6] fix channel name in Slack Notify job --- .github/workflows/run_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 1efd06d0..13d9544e 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -58,7 +58,7 @@ jobs: env: SLACK_ICON: "https://raw.githubusercontent.com/github/explore/2c7e603b797535e5ad8b4beb575ab3b7354666e1/topics/actions/actions.png" SLACK_USERNAME: "GitHub Alerts" - SLACK_CHANNEL: "#grpc-client-repo-alerts" + SLACK_CHANNEL: "#alerts-grpc-client-repo" SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} SLACK_COLOR: ${{ job.status }} SLACK_MESSAGE: "Test failure" From 8bfe4851e0f76582318c71a9e59def95187771cc Mon Sep 17 00:00:00 2001 From: Tiit Pikma Date: Mon, 6 Apr 2026 18:01:15 +0300 Subject: [PATCH 5/6] Add digitalocean and local to unsupported skycatalog providers skypilot-catalog has no vms.csv for these providers, causing all their instance types to be flagged as missing. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- tests/instance_types/test_instance_types_ids.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/instance_types/test_instance_types_ids.py b/tests/instance_types/test_instance_types_ids.py index a699af8d..63bbf6aa 100644 --- a/tests/instance_types/test_instance_types_ids.py +++ b/tests/instance_types/test_instance_types_ids.py @@ -212,7 +212,7 @@ def collect_all_instance_types(stub, metadata_tuple) -> Dict[str, Dict[str, List return all_instance_types -UNSUPPORTED_SKYCATALOG_PROVIDERS = {"vultr", "oracle"} +UNSUPPORTED_SKYCATALOG_PROVIDERS = {"vultr", "oracle", "digitalocean", "local"} def is_provider_supported(provider_id: str) -> bool: From faac03285adc70afa6cd0f9625615e6c4e8d1ffc Mon Sep 17 00:00:00 2001 From: Tiit Pikma Date: Mon, 6 Apr 2026 18:21:21 +0300 Subject: [PATCH 6/6] add support for digitalocean instead of ignoring --- tests/instance_types/test_instance_types_ids.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/instance_types/test_instance_types_ids.py b/tests/instance_types/test_instance_types_ids.py index 63bbf6aa..d29c2405 100644 --- a/tests/instance_types/test_instance_types_ids.py +++ b/tests/instance_types/test_instance_types_ids.py @@ -22,6 +22,13 @@ 'g4-standard-96', 'tpu7x-standard-1t', 'tpu7x-standard-4t', + 's-2vcpu-2gb', + 'gpu-h100x2-160gb', + 'gpu-h100x4-320gb', + 'gpu-mi300x1-192gb', + 'gpu-mi300x8-1536gb', + 'gpu-mi350x1-288gb-contracted', + 'gpu-mi350x8-2304gb-contracted', ] @@ -112,6 +119,7 @@ def fetch_skypilot_instance_types_by_provider(cloud_provider_id): 'aws': 'aws', 'gcp': 'gcp', 'azure': 'azure', + 'digitalocean': 'do', 'local': 'local', # if local is supported } @@ -212,7 +220,7 @@ def collect_all_instance_types(stub, metadata_tuple) -> Dict[str, Dict[str, List return all_instance_types -UNSUPPORTED_SKYCATALOG_PROVIDERS = {"vultr", "oracle", "digitalocean", "local"} +UNSUPPORTED_SKYCATALOG_PROVIDERS = {"vultr", "oracle"} def is_provider_supported(provider_id: str) -> bool: