Skip to content
This repository was archived by the owner on Jan 23, 2026. It is now read-only.

Commit fc63e79

Browse files
authored
Merge pull request #336 from jumpstarter-dev/client-svc
Implement jmp client list-exporters command
2 parents 001c38b + ad69005 commit fc63e79

14 files changed

Lines changed: 439 additions & 167 deletions

File tree

buf.gen.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ version: v2
22
managed:
33
enabled: true
44
plugins:
5-
- remote: buf.build/protocolbuffers/python
5+
- remote: buf.build/protocolbuffers/python:v29.3
66
out: ./packages/jumpstarter-protocol/jumpstarter_protocol
77
- remote: buf.build/grpc/python
88
out: ./packages/jumpstarter-protocol/jumpstarter_protocol

packages/jumpstarter-cli-client/jumpstarter_cli_client/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from jumpstarter_cli_common import AliasedGroup, opt_log_level, version
66

77
from .client_config import create_client_config, delete_client_config, list_client_configs, use_client_config
8+
from .client_exporter import list_client_exporters
89
from .client_lease import client_lease
910
from .client_login import client_login
1011
from .client_shell import client_shell
@@ -29,6 +30,7 @@ def j():
2930
client.add_command(create_client_config)
3031
client.add_command(delete_client_config)
3132
client.add_command(list_client_configs)
33+
client.add_command(list_client_exporters)
3234
client.add_command(use_client_config)
3335
client.add_command(client_lease)
3436
client.add_command(client_login)
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import asyncclick as click
2+
from jumpstarter_cli_common import OutputMode, OutputType, make_table, opt_labels, opt_output_all
3+
from jumpstarter_cli_common.exceptions import handle_exceptions
4+
5+
from jumpstarter.config import (
6+
ClientConfigV1Alpha1,
7+
UserConfigV1Alpha1,
8+
)
9+
10+
11+
@click.command("list-exporters", short_help="List available exporters.")
12+
@click.argument("name", type=str, default="")
13+
@opt_labels
14+
@opt_output_all
15+
@handle_exceptions
16+
def list_client_exporters(name: str | None, labels: list[(str, str)], output: OutputType):
17+
if name:
18+
config = ClientConfigV1Alpha1.load(name)
19+
else:
20+
config = UserConfigV1Alpha1.load_or_create().config.current_client
21+
if not config:
22+
raise click.BadParameter(
23+
"no client specified, and no default client set: specify a client name, or use jmp client use-config ",
24+
param_hint="name",
25+
)
26+
27+
exporters = config.list_exporters(filter=",".join("{}={}".format(i[0], i[1]) for i in labels))
28+
29+
if output == OutputMode.JSON:
30+
click.echo(exporters.dump_json())
31+
elif output == OutputMode.YAML:
32+
click.echo(exporters.dump_yaml())
33+
elif output == OutputMode.NAME:
34+
for exporter in exporters.exporters:
35+
click.echo(exporter.name)
36+
else:
37+
columns = ["NAME", "LABELS"]
38+
39+
def make_row(exporter):
40+
return {
41+
"NAME": exporter.name,
42+
"LABELS": ",".join(("{}={}".format(i[0], i[1]) for i in exporter.labels.items())),
43+
}
44+
45+
rows = list(map(make_row, exporters.exporters))
46+
click.echo(make_table(columns, rows))

packages/jumpstarter-protocol/jumpstarter_protocol/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from .jumpstarter.v1 import (
2+
client_pb2,
3+
client_pb2_grpc,
24
jumpstarter_pb2,
35
jumpstarter_pb2_grpc,
46
kubernetes_pb2,
@@ -8,6 +10,8 @@
810
)
911

1012
__all__ = [
13+
"client_pb2",
14+
"client_pb2_grpc",
1115
"jumpstarter_pb2",
1216
"jumpstarter_pb2_grpc",
1317
"kubernetes_pb2",

packages/jumpstarter-protocol/jumpstarter_protocol/jumpstarter/v1/client_pb2.py

Lines changed: 71 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2+
"""Client and server classes corresponding to protobuf-defined services."""
3+
import grpc
4+
5+
from . import client_pb2 as jumpstarter_dot_v1_dot_client__pb2
6+
7+
8+
class ClientServiceStub(object):
9+
"""Missing associated documentation comment in .proto file."""
10+
11+
def __init__(self, channel):
12+
"""Constructor.
13+
14+
Args:
15+
channel: A grpc.Channel.
16+
"""
17+
self.GetExporter = channel.unary_unary(
18+
'/jumpstarter.v1.ClientService/GetExporter',
19+
request_serializer=jumpstarter_dot_v1_dot_client__pb2.GetExporterRequest.SerializeToString,
20+
response_deserializer=jumpstarter_dot_v1_dot_client__pb2.Exporter.FromString,
21+
_registered_method=True)
22+
self.ListExporters = channel.unary_unary(
23+
'/jumpstarter.v1.ClientService/ListExporters',
24+
request_serializer=jumpstarter_dot_v1_dot_client__pb2.ListExportersRequest.SerializeToString,
25+
response_deserializer=jumpstarter_dot_v1_dot_client__pb2.ListExportersResponse.FromString,
26+
_registered_method=True)
27+
28+
29+
class ClientServiceServicer(object):
30+
"""Missing associated documentation comment in .proto file."""
31+
32+
def GetExporter(self, request, context):
33+
"""Missing associated documentation comment in .proto file."""
34+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
35+
context.set_details('Method not implemented!')
36+
raise NotImplementedError('Method not implemented!')
37+
38+
def ListExporters(self, request, context):
39+
"""Missing associated documentation comment in .proto file."""
40+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
41+
context.set_details('Method not implemented!')
42+
raise NotImplementedError('Method not implemented!')
43+
44+
45+
def add_ClientServiceServicer_to_server(servicer, server):
46+
rpc_method_handlers = {
47+
'GetExporter': grpc.unary_unary_rpc_method_handler(
48+
servicer.GetExporter,
49+
request_deserializer=jumpstarter_dot_v1_dot_client__pb2.GetExporterRequest.FromString,
50+
response_serializer=jumpstarter_dot_v1_dot_client__pb2.Exporter.SerializeToString,
51+
),
52+
'ListExporters': grpc.unary_unary_rpc_method_handler(
53+
servicer.ListExporters,
54+
request_deserializer=jumpstarter_dot_v1_dot_client__pb2.ListExportersRequest.FromString,
55+
response_serializer=jumpstarter_dot_v1_dot_client__pb2.ListExportersResponse.SerializeToString,
56+
),
57+
}
58+
generic_handler = grpc.method_handlers_generic_handler(
59+
'jumpstarter.v1.ClientService', rpc_method_handlers)
60+
server.add_generic_rpc_handlers((generic_handler,))
61+
server.add_registered_method_handlers('jumpstarter.v1.ClientService', rpc_method_handlers)
62+
63+
64+
# This class is part of an EXPERIMENTAL API.
65+
class ClientService(object):
66+
"""Missing associated documentation comment in .proto file."""
67+
68+
@staticmethod
69+
def GetExporter(request,
70+
target,
71+
options=(),
72+
channel_credentials=None,
73+
call_credentials=None,
74+
insecure=False,
75+
compression=None,
76+
wait_for_ready=None,
77+
timeout=None,
78+
metadata=None):
79+
return grpc.experimental.unary_unary(
80+
request,
81+
target,
82+
'/jumpstarter.v1.ClientService/GetExporter',
83+
jumpstarter_dot_v1_dot_client__pb2.GetExporterRequest.SerializeToString,
84+
jumpstarter_dot_v1_dot_client__pb2.Exporter.FromString,
85+
options,
86+
channel_credentials,
87+
insecure,
88+
call_credentials,
89+
compression,
90+
wait_for_ready,
91+
timeout,
92+
metadata,
93+
_registered_method=True)
94+
95+
@staticmethod
96+
def ListExporters(request,
97+
target,
98+
options=(),
99+
channel_credentials=None,
100+
call_credentials=None,
101+
insecure=False,
102+
compression=None,
103+
wait_for_ready=None,
104+
timeout=None,
105+
metadata=None):
106+
return grpc.experimental.unary_unary(
107+
request,
108+
target,
109+
'/jumpstarter.v1.ClientService/ListExporters',
110+
jumpstarter_dot_v1_dot_client__pb2.ListExportersRequest.SerializeToString,
111+
jumpstarter_dot_v1_dot_client__pb2.ListExportersResponse.FromString,
112+
options,
113+
channel_credentials,
114+
insecure,
115+
call_credentials,
116+
compression,
117+
wait_for_ready,
118+
timeout,
119+
metadata,
120+
_registered_method=True)

0 commit comments

Comments
 (0)