Skip to content

Commit 16a8799

Browse files
committed
address comments
1 parent 097216d commit 16a8799

2 files changed

Lines changed: 82 additions & 3 deletions

File tree

centml/cli/cluster.py

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@
33
from typing import Dict
44
import click
55
from tabulate import tabulate
6-
from centml.sdk import DeploymentType, DeploymentStatus, ServiceStatus, ApiException, HardwareInstanceResponse
6+
from centml.sdk import (
7+
DeploymentType,
8+
DeploymentStatus,
9+
ServiceStatus,
10+
RolloutStatus,
11+
ApiException,
12+
HardwareInstanceResponse,
13+
)
714
from centml.sdk.api import get_centml_client
815

916
# convert deployment type enum to a user friendly name
@@ -27,6 +34,12 @@
2734
"compute": DeploymentType.COMPUTE_V2,
2835
"rag": DeploymentType.RAG,
2936
}
37+
rollout_status_to_service_status_map = {
38+
RolloutStatus.HEALTHY: ServiceStatus.HEALTHY,
39+
RolloutStatus.MISSING: ServiceStatus.MISSING,
40+
RolloutStatus.PROGRESSING: ServiceStatus.INITIALIZING,
41+
RolloutStatus.DEGRADED: ServiceStatus.ERROR,
42+
}
3043

3144

3245
def handle_exception(func):
@@ -82,8 +95,11 @@ def _get_ready_status(deployment, service_status):
8295
(DeploymentStatus.PAUSED, None): ("paused", "yellow", "black"),
8396
(DeploymentStatus.DELETED, None): ("deleted", "white", "black"),
8497
(DeploymentStatus.ACTIVE, ServiceStatus.HEALTHY): ("ready", "green", "black"),
98+
(DeploymentStatus.ACTIVE, ServiceStatus.SCALINGUP): ("starting", "black", "white"),
99+
(DeploymentStatus.ACTIVE, ServiceStatus.PULLING): ("starting", "black", "white"),
85100
(DeploymentStatus.ACTIVE, ServiceStatus.INITIALIZING): ("starting", "black", "white"),
86101
(DeploymentStatus.ACTIVE, ServiceStatus.MISSING): ("starting", "black", "white"),
102+
(DeploymentStatus.ACTIVE, ServiceStatus.NOTREADY): ("starting", "black", "white"),
87103
(DeploymentStatus.ACTIVE, ServiceStatus.ERROR): ("error", "red", "black"),
88104
(DeploymentStatus.ACTIVE, ServiceStatus.CREATECONTAINERCONFIGERROR): (
89105
"createContainerConfigError",
@@ -100,6 +116,32 @@ def _get_ready_status(deployment, service_status):
100116
return click.style(style[0], fg=style[1], bg=style[2])
101117

102118

119+
def _get_service_status(status_response, revision_number):
120+
if status_response is None:
121+
return None
122+
123+
service_status = getattr(status_response, "service_status", None)
124+
if service_status is not None:
125+
return service_status
126+
127+
revision_pod_details_list = getattr(status_response, "revision_pod_details_list", None) or []
128+
current_revision = next(
129+
(
130+
revision
131+
for revision in revision_pod_details_list
132+
if getattr(revision, "revision_number", None) == revision_number
133+
),
134+
(
135+
revision_pod_details_list[0]
136+
if revision_pod_details_list and getattr(revision_pod_details_list[0], "revision_number") is None
137+
else None
138+
),
139+
)
140+
revision_status = getattr(current_revision, "revision_status", None)
141+
142+
return revision_status or rollout_status_to_service_status_map.get(getattr(status_response, "rollout_status", None))
143+
144+
103145
def _append_status_error_message(messages, seen_messages, label, error_message):
104146
if not error_message or error_message in seen_messages:
105147
return
@@ -177,7 +219,8 @@ def get(type, id):
177219
sys.exit("Please enter correct deployment type")
178220

179221
deployment_status = cclient.get_status(deployment.id) if deployment.status == DeploymentStatus.ACTIVE else None
180-
service_status = deployment_status.service_status if deployment_status is not None else None
222+
revision_number = getattr(deployment, "revision_number", None)
223+
service_status = _get_service_status(deployment_status, revision_number)
181224
ready_status = _get_ready_status(deployment, service_status)
182225
status_error_messages = _get_status_error_messages(deployment_status)
183226
_, id_to_hw_map = _get_hw_to_id_map(cclient, deployment.cluster_id)

tests/test_cli_cluster.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,42 @@
11
from types import SimpleNamespace
22

3-
from centml.cli.cluster import _get_status_error_messages
3+
from centml.cli.cluster import _get_service_status, _get_status_error_messages
4+
from centml.sdk import RolloutStatus, ServiceStatus
5+
6+
7+
def test_service_status_uses_legacy_service_status_when_present():
8+
status_response = SimpleNamespace(service_status=ServiceStatus.HEALTHY)
9+
10+
assert _get_service_status(status_response, revision_number=None) == ServiceStatus.HEALTHY
11+
12+
13+
def test_service_status_maps_v3_healthy_rollout_status():
14+
status_response = SimpleNamespace(rollout_status=RolloutStatus.HEALTHY)
15+
16+
assert _get_service_status(status_response, revision_number=None) == ServiceStatus.HEALTHY
17+
18+
19+
def test_service_status_uses_current_v3_revision_status():
20+
status_response = SimpleNamespace(
21+
rollout_status=RolloutStatus.PROGRESSING,
22+
revision_pod_details_list=[
23+
SimpleNamespace(revision_number=1, revision_status=ServiceStatus.HEALTHY),
24+
SimpleNamespace(revision_number=2, revision_status=ServiceStatus.SCALINGUP),
25+
],
26+
)
27+
28+
assert _get_service_status(status_response, revision_number=2) == ServiceStatus.SCALINGUP
29+
30+
31+
def test_service_status_uses_v3_revision_without_revision_number_as_fallback():
32+
status_response = SimpleNamespace(
33+
rollout_status=RolloutStatus.DEGRADED,
34+
revision_pod_details_list=[
35+
SimpleNamespace(revision_number=None, revision_status=ServiceStatus.IMAGEPULLBACKOFF)
36+
],
37+
)
38+
39+
assert _get_service_status(status_response, revision_number=2) == ServiceStatus.IMAGEPULLBACKOFF
440

541

642
def test_status_error_messages_include_revision_and_pod_messages():

0 commit comments

Comments
 (0)