1111 V1Alpha1Exporter ,
1212 V1Alpha1ExporterStatus ,
1313)
14- from kubernetes_asyncio .client .models import V1ObjectMeta
14+ from kubernetes_asyncio .client .models import V1ObjectMeta , V1ObjectReference
1515
1616from .create import create
1717from jumpstarter .config import (
3434 api_version = "jumpstarter.dev/v1alpha1" ,
3535 kind = "Client" ,
3636 metadata = V1ObjectMeta (namespace = "default" , name = CLIENT_NAME , creation_timestamp = "2024-01-01T21:00:00Z" ),
37- status = V1Alpha1ClientStatus (endpoint = CLIENT_ENDPOINT , credential = None ),
37+ status = V1Alpha1ClientStatus (
38+ endpoint = CLIENT_ENDPOINT , credential = V1ObjectReference (name = f"{ CLIENT_NAME } -credential" )
39+ ),
3840)
3941
42+ CLIENT_JSON = """{{
43+ "apiVersion": "jumpstarter.dev/v1alpha1",
44+ "kind": "Client",
45+ "metadata": {{
46+ "creationTimestamp": "2024-01-01T21:00:00Z",
47+ "name": "{name}",
48+ "namespace": "default"
49+ }},
50+ "status": {{
51+ "credential": {{
52+ "name": "{name}-credential"
53+ }},
54+ "endpoint": "{endpoint}"
55+ }}
56+ }}
57+ """ .format (name = CLIENT_NAME , endpoint = CLIENT_ENDPOINT )
58+
59+ CLIENT_YAML = """apiVersion: jumpstarter.dev/v1alpha1
60+ kind: Client
61+ metadata:
62+ creationTimestamp: '2024-01-01T21:00:00Z'
63+ name: {name}
64+ namespace: default
65+ status:
66+ credential:
67+ name: {name}-credential
68+ endpoint: {endpoint}
69+
70+ """ .format (name = CLIENT_NAME , endpoint = CLIENT_ENDPOINT )
71+
4072UNSAFE_CLIENT_CONFIG = ClientConfigV1Alpha1 (
4173 alias = CLIENT_NAME ,
4274 metadata = ObjectMeta (namespace = "default" , name = CLIENT_NAME ),
@@ -108,6 +140,34 @@ async def test_create_client(
108140 mock_save_client .assert_called_once_with (CLIENT_CONFIG , None )
109141 mock_save_client .reset_mock ()
110142
143+ # Save with nointeractive
144+ result = await runner .invoke (create , ["client" , CLIENT_NAME , "--nointeractive" ])
145+ assert result .exit_code == 0
146+ assert "Creating client" in result .output
147+ mock_save_client .assert_not_called ()
148+ mock_save_client .reset_mock ()
149+
150+ # With JSON output
151+ result = await runner .invoke (create , ["client" , CLIENT_NAME , "--nointeractive" , "--output" , "json" ])
152+ assert result .exit_code == 0
153+ assert result .output == CLIENT_JSON
154+ mock_save_client .assert_not_called ()
155+ mock_save_client .reset_mock ()
156+
157+ # With YAML output
158+ result = await runner .invoke (create , ["client" , CLIENT_NAME , "--nointeractive" , "--output" , "yaml" ])
159+ assert result .exit_code == 0
160+ assert result .output == CLIENT_YAML
161+ mock_save_client .assert_not_called ()
162+ mock_save_client .reset_mock ()
163+
164+ # With name output
165+ result = await runner .invoke (create , ["client" , CLIENT_NAME , "--nointeractive" , "--output" , "name" ])
166+ assert result .exit_code == 0
167+ assert result .output == f"client.jumpstarter.dev/{ CLIENT_NAME } \n "
168+ mock_save_client .assert_not_called ()
169+ mock_save_client .reset_mock ()
170+
111171
112172# Generate a random exporter name
113173EXPORTER_NAME = uuid .uuid4 ().hex
@@ -120,8 +180,43 @@ async def test_create_client(
120180 api_version = "jumpstarter.dev/v1alpha1" ,
121181 kind = "Exporter" ,
122182 metadata = V1ObjectMeta (namespace = "default" , name = EXPORTER_NAME , creation_timestamp = "2024-01-01T21:00:00Z" ),
123- status = V1Alpha1ExporterStatus (endpoint = EXPORTER_ENDPOINT , credential = None , devices = []),
183+ status = V1Alpha1ExporterStatus (
184+ endpoint = EXPORTER_ENDPOINT , credential = V1ObjectReference (name = f"{ EXPORTER_NAME } -credential" ), devices = []
185+ ),
124186)
187+
188+ EXPORTER_JSON = """{{
189+ "apiVersion": "jumpstarter.dev/v1alpha1",
190+ "kind": "Exporter",
191+ "metadata": {{
192+ "creationTimestamp": "2024-01-01T21:00:00Z",
193+ "name": "{name}",
194+ "namespace": "default"
195+ }},
196+ "status": {{
197+ "credential": {{
198+ "name": "{name}-credential"
199+ }},
200+ "devices": [],
201+ "endpoint": "{endpoint}"
202+ }}
203+ }}
204+ """ .format (name = EXPORTER_NAME , endpoint = EXPORTER_ENDPOINT )
205+
206+ EXPORTER_YAML = """apiVersion: jumpstarter.dev/v1alpha1
207+ kind: Exporter
208+ metadata:
209+ creationTimestamp: '2024-01-01T21:00:00Z'
210+ name: {name}
211+ namespace: default
212+ status:
213+ credential:
214+ name: {name}-credential
215+ devices: []
216+ endpoint: {endpoint}
217+
218+ """ .format (name = EXPORTER_NAME , endpoint = EXPORTER_ENDPOINT )
219+
125220EXPORTER_CONFIG = ExporterConfigV1Alpha1 (
126221 alias = EXPORTER_NAME ,
127222 metadata = ObjectMeta (namespace = "default" , name = EXPORTER_NAME ),
@@ -171,6 +266,34 @@ async def test_create_exporter(
171266 save_exporter_mock .assert_called_once_with (EXPORTER_CONFIG , out )
172267 save_exporter_mock .reset_mock ()
173268
269+ # Save with nointeractive
270+ result = await runner .invoke (create , ["exporter" , EXPORTER_NAME , "--nointeractive" ])
271+ assert result .exit_code == 0
272+ assert "Creating exporter" in result .output
273+ save_exporter_mock .assert_not_called ()
274+ save_exporter_mock .reset_mock ()
275+
276+ # Save with JSON output
277+ result = await runner .invoke (create , ["exporter" , EXPORTER_NAME , "--nointeractive" , "--output" , "json" ])
278+ assert result .exit_code == 0
279+ assert result .output == EXPORTER_JSON
280+ save_exporter_mock .assert_not_called ()
281+ save_exporter_mock .reset_mock ()
282+
283+ # Save with YAML output
284+ result = await runner .invoke (create , ["exporter" , EXPORTER_NAME , "--nointeractive" , "--output" , "yaml" ])
285+ assert result .exit_code == 0
286+ assert result .output == EXPORTER_YAML
287+ save_exporter_mock .assert_not_called ()
288+ save_exporter_mock .reset_mock ()
289+
290+ # Save with name output
291+ result = await runner .invoke (create , ["exporter" , EXPORTER_NAME , "--nointeractive" , "--output" , "name" ])
292+ assert result .exit_code == 0
293+ assert result .output == f"exporter.jumpstarter.dev/{ EXPORTER_NAME } \n "
294+ save_exporter_mock .assert_not_called ()
295+ save_exporter_mock .reset_mock ()
296+
174297
175298@pytest .fixture
176299def anyio_backend ():
0 commit comments