Skip to content

Commit bc14436

Browse files
authored
feat: List Pending Runners in cli (#590)
* feat: List Pending Runners in cli * Make RunnerInfo State an enum * Bump isolate_proto maximum version * Correctly set isolate_proto minumum version * check only running runners in test_kill_runner
1 parent e3a070d commit bc14436

File tree

5 files changed

+36
-7
lines changed

5 files changed

+36
-7
lines changed

projects/fal/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ readme = "README.md"
2323
requires-python = ">=3.8"
2424
dependencies = [
2525
"isolate[build]>=0.18.0,<0.19.0",
26-
"isolate-proto>=0.10.2,<0.11.0",
26+
"isolate-proto>=0.11.0,<0.12.0",
2727
"grpcio>=1.64.0,<2",
2828
"dill==0.3.7",
2929
"cloudpickle==3.0.0",

projects/fal/src/fal/cli/apps.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from typing import TYPE_CHECKING
66

77
import fal.cli.runners as runners
8+
from fal.sdk import RunnerState
89

910
from ._utils import get_client
1011
from .parser import FalClientParser
@@ -298,7 +299,11 @@ def _runners(args):
298299
alias_runners = connection.list_alias_runners(alias=args.app_name)
299300

300301
runners_table = runners.runners_table(alias_runners)
301-
args.console.print(f"Runners: {len(alias_runners)}")
302+
pending_runners = [
303+
runner for runner in alias_runners if runner.state == RunnerState.PENDING
304+
]
305+
args.console.print(f"Runners: {len(alias_runners) - len(pending_runners)}")
306+
args.console.print(f"Pending Runners: {len(pending_runners)}")
302307
# Drop the alias column, which is the first column
303308
runners_table.columns.pop(0)
304309
args.console.print(runners_table)

projects/fal/src/fal/cli/runners.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from typing import List
44

5-
from fal.sdk import RunnerInfo
5+
from fal.sdk import RunnerInfo, RunnerState
66

77
from ._utils import get_client
88
from .parser import FalClientParser
@@ -19,6 +19,7 @@ def runners_table(runners: List[RunnerInfo]):
1919
table.add_column("Expires In")
2020
table.add_column("Uptime")
2121
table.add_column("Revision")
22+
table.add_column("State")
2223

2324
for runner in runners:
2425
external_metadata = runner.external_metadata
@@ -45,6 +46,7 @@ def runners_table(runners: List[RunnerInfo]):
4546
),
4647
f"{runner.uptime} ({runner.uptime.total_seconds()}s)",
4748
runner.revision,
49+
runner.state.value,
4850
)
4951

5052
return table
@@ -82,7 +84,11 @@ def _list(args):
8284
client = get_client(args.host, args.team)
8385
with client.connect() as connection:
8486
runners = connection.list_runners()
85-
args.console.print(f"Runners: {len(runners)}")
87+
pending_runners = [
88+
runner for runner in runners if runner.state == RunnerState.PENDING
89+
]
90+
args.console.print(f"Runners: {len(runners) - len(pending_runners)}")
91+
args.console.print(f"Pending Runners: {len(pending_runners)}")
8692
args.console.print(runners_table(runners))
8793

8894
requests_table = runners_requests_table(runners)

projects/fal/src/fal/sdk.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,21 @@ class AliasInfo:
261261
valid_regions: list[str]
262262

263263

264+
class RunnerState(Enum):
265+
RUNNING = "running"
266+
PENDING = "pending"
267+
UNKNOWN = "unknown"
268+
269+
@staticmethod
270+
def from_proto(proto: isolate_proto.RunnerInfo.State) -> RunnerState:
271+
if proto is isolate_proto.RunnerInfo.State.RUNNING:
272+
return RunnerState.RUNNING
273+
elif proto is isolate_proto.RunnerInfo.State.PENDING:
274+
return RunnerState.PENDING
275+
else:
276+
return RunnerState.UNKNOWN
277+
278+
264279
@dataclass
265280
class RunnerInfo:
266281
runner_id: str
@@ -270,6 +285,7 @@ class RunnerInfo:
270285
external_metadata: dict[str, Any]
271286
revision: str
272287
alias: str
288+
state: RunnerState
273289

274290

275291
@dataclass
@@ -421,6 +437,7 @@ def _from_grpc_runner_info(message: isolate_proto.RunnerInfo) -> RunnerInfo:
421437
external_metadata=external_metadata,
422438
revision=message.revision,
423439
alias=message.alias,
440+
state=RunnerState.from_proto(message.state),
424441
)
425442

426443

@@ -769,7 +786,7 @@ def list_aliases(self) -> list[AliasInfo]:
769786
return [from_grpc(alias) for alias in response.aliases]
770787

771788
def list_alias_runners(self, alias: str) -> list[RunnerInfo]:
772-
request = isolate_proto.ListAliasRunnersRequest(alias=alias)
789+
request = isolate_proto.ListAliasRunnersRequest(alias=alias, list_pending=True)
773790
response = self.stub.ListAliasRunners(request)
774791
return [from_grpc(runner) for runner in response.runners]
775792

@@ -797,6 +814,6 @@ def kill_runner(self, runner_id: str) -> None:
797814
self.stub.KillRunner(request)
798815

799816
def list_runners(self) -> list[RunnerInfo]:
800-
request = isolate_proto.ListRunnersRequest()
817+
request = isolate_proto.ListRunnersRequest(list_pending=True)
801818
response = self.stub.ListRunners(request)
802819
return [from_grpc(runner) for runner in response.runners]

projects/fal/tests/test_apps.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1015,7 +1015,8 @@ def test_kill_runner(host: api.FalServerlessHost, test_sleep_app: str):
10151015
client.kill_runner(runners[0].runner_id)
10161016

10171017
runners = client.list_alias_runners(app_alias)
1018-
assert len(runners) == 0
1018+
num_runners = len([runner for runner in runners if runner.state == "running"])
1019+
assert num_runners == 0
10191020

10201021

10211022
def test_container_app_client(test_container_app: str):

0 commit comments

Comments
 (0)