Skip to content

Commit c786b3d

Browse files
authored
[CLI] fix ssh listing stopped components (#15810)
* [CLI] fix ssh listing stopped components * update CHANGELOG
1 parent 657bfc5 commit c786b3d

File tree

4 files changed

+41
-6
lines changed

4 files changed

+41
-6
lines changed

src/lightning_app/CHANGELOG.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
3636
### Fixed
3737

3838
- Fixed debugging with VSCode IDE ([#15747](https://github.com/Lightning-AI/lightning/pull/15747))
39-
40-
39+
- Fixed SSH CLI command listing stopped components ([#15810](https://github.com/Lightning-AI/lightning/pull/15810))
4140
- Fixed the work not stopped when successful when passed directly to the LightningApp ([#15801](https://github.com/Lightning-AI/lightning/pull/15801))
4241

4342
- Fixed the PyTorch Inference locally on GPU ([#15813](https://github.com/Lightning-AI/lightning/pull/15813))

src/lightning_app/cli/cmd_apps.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,13 @@ def list_apps(
5454
apps = apps + resp.lightningapps
5555
return apps
5656

57-
def list_components(self, app_id: str) -> List[Externalv1Lightningwork]:
57+
def list_components(self, app_id: str, phase_in: List[str] = []) -> List[Externalv1Lightningwork]:
5858
project = _get_project(self.api_client)
59-
resp = self.api_client.lightningwork_service_list_lightningwork(project_id=project.project_id, app_id=app_id)
59+
resp = self.api_client.lightningwork_service_list_lightningwork(
60+
project_id=project.project_id,
61+
app_id=app_id,
62+
phase_in=phase_in,
63+
)
6064
return resp.lightningworks
6165

6266
def list(self, cluster_id: str = None, limit: int = 100) -> None:

src/lightning_app/cli/lightning_cli.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import click
99
import inquirer
1010
import rich
11-
from lightning_cloud.openapi import Externalv1LightningappInstance, V1LightningappInstanceState
11+
from lightning_cloud.openapi import Externalv1LightningappInstance, V1LightningappInstanceState, V1LightningworkState
1212
from lightning_cloud.openapi.rest import ApiException
1313
from lightning_utilities.core.imports import RequirementCache
1414
from requests.exceptions import ConnectionError
@@ -420,7 +420,7 @@ def ssh(app_name: str = None, component_name: str = None) -> None:
420420
except ApiException:
421421
raise click.ClickException("failed fetching app instance")
422422

423-
components = app_manager.list_components(app_id=app_id)
423+
components = app_manager.list_components(app_id=app_id, phase_in=[V1LightningworkState.RUNNING])
424424
available_component_names = [work.name for work in components] + ["flow"]
425425
if component_name is None:
426426
available_components = [

tests/tests_app/cli/test_cmd_apps.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
V1LightningappInstanceSpec,
88
V1LightningappInstanceState,
99
V1LightningappInstanceStatus,
10+
V1LightningworkState,
1011
V1ListLightningappInstancesResponse,
12+
V1ListLightningworkResponse,
1113
V1ListMembershipsResponse,
1214
V1Membership,
1315
)
@@ -97,6 +99,36 @@ def test_list_all_apps(list_memberships: mock.MagicMock, list_instances: mock.Ma
9799
list_instances.assert_called_once_with(project_id="default-project", limit=100, phase_in=[])
98100

99101

102+
@mock.patch("lightning_cloud.login.Auth.authenticate", MagicMock())
103+
@mock.patch("lightning_app.utilities.network.LightningClient.lightningwork_service_list_lightningwork")
104+
@mock.patch("lightning_app.utilities.network.LightningClient.projects_service_list_memberships")
105+
def test_list_components(list_memberships: mock.MagicMock, list_components: mock.MagicMock):
106+
list_memberships.return_value = V1ListMembershipsResponse(memberships=[V1Membership(project_id="default-project")])
107+
list_components.return_value = V1ListLightningworkResponse(lightningworks=[])
108+
109+
cluster_manager = _AppManager()
110+
cluster_manager.list_components(app_id="cheese")
111+
112+
list_memberships.assert_called_once()
113+
list_components.assert_called_once_with(project_id="default-project", app_id="cheese", phase_in=[])
114+
115+
116+
@mock.patch("lightning_cloud.login.Auth.authenticate", MagicMock())
117+
@mock.patch("lightning_app.utilities.network.LightningClient.lightningwork_service_list_lightningwork")
118+
@mock.patch("lightning_app.utilities.network.LightningClient.projects_service_list_memberships")
119+
def test_list_components_with_phase(list_memberships: mock.MagicMock, list_components: mock.MagicMock):
120+
list_memberships.return_value = V1ListMembershipsResponse(memberships=[V1Membership(project_id="default-project")])
121+
list_components.return_value = V1ListLightningworkResponse(lightningworks=[])
122+
123+
cluster_manager = _AppManager()
124+
cluster_manager.list_components(app_id="cheese", phase_in=[V1LightningworkState.RUNNING])
125+
126+
list_memberships.assert_called_once()
127+
list_components.assert_called_once_with(
128+
project_id="default-project", app_id="cheese", phase_in=[V1LightningworkState.RUNNING]
129+
)
130+
131+
100132
@mock.patch("lightning_cloud.login.Auth.authenticate", MagicMock())
101133
@mock.patch("lightning_app.utilities.network.LightningClient.lightningapp_instance_service_list_lightningapp_instances")
102134
@mock.patch("lightning_app.utilities.network.LightningClient.projects_service_list_memberships")

0 commit comments

Comments
 (0)