dayhoff-tools 1.13.6__py3-none-any.whl → 1.13.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dayhoff_tools/cli/engines_studios/engine_commands.py +58 -23
- {dayhoff_tools-1.13.6.dist-info → dayhoff_tools-1.13.8.dist-info}/METADATA +1 -1
- {dayhoff_tools-1.13.6.dist-info → dayhoff_tools-1.13.8.dist-info}/RECORD +5 -5
- {dayhoff_tools-1.13.6.dist-info → dayhoff_tools-1.13.8.dist-info}/WHEEL +0 -0
- {dayhoff_tools-1.13.6.dist-info → dayhoff_tools-1.13.8.dist-info}/entry_points.txt +0 -0
|
@@ -69,11 +69,15 @@ def _update_ssh_config_silent(client: StudioManagerClient, env: str) -> bool:
|
|
|
69
69
|
if state != "running":
|
|
70
70
|
continue
|
|
71
71
|
|
|
72
|
+
# Map environment to AWS profile
|
|
73
|
+
profile = f"{env}-devaccess"
|
|
74
|
+
|
|
72
75
|
config_entries.append(f"\nHost {name}\n")
|
|
73
76
|
config_entries.append(f" HostName {instance_id}\n")
|
|
74
77
|
config_entries.append(f" User {user}\n")
|
|
78
|
+
config_entries.append(f" ForwardAgent yes\n")
|
|
75
79
|
config_entries.append(
|
|
76
|
-
f" ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'\n"
|
|
80
|
+
f" ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile {profile}\n"
|
|
77
81
|
)
|
|
78
82
|
|
|
79
83
|
config_entries.append(managed_end)
|
|
@@ -213,46 +217,71 @@ def launch_engine(
|
|
|
213
217
|
|
|
214
218
|
except Exception as e:
|
|
215
219
|
error_msg = str(e)
|
|
216
|
-
|
|
220
|
+
|
|
217
221
|
# Check for quota/limit errors
|
|
218
222
|
if "VcpuLimitExceeded" in error_msg or "vCPU limit" in error_msg:
|
|
219
223
|
click.echo(f"✗ Failed to launch engine: vCPU quota exceeded", err=True)
|
|
220
224
|
click.echo("", err=True)
|
|
221
|
-
click.echo(
|
|
225
|
+
click.echo(
|
|
226
|
+
f"The {env} AWS account has insufficient vCPU quota for {engine_type} instances.",
|
|
227
|
+
err=True,
|
|
228
|
+
)
|
|
222
229
|
click.echo("", err=True)
|
|
223
230
|
click.echo("Solutions:", err=True)
|
|
224
|
-
click.echo(
|
|
231
|
+
click.echo(
|
|
232
|
+
" 1. Use a different instance type (e.g., --type cpu)", err=True
|
|
233
|
+
)
|
|
225
234
|
click.echo(" 2. Request a quota increase:", err=True)
|
|
226
235
|
click.echo(" • AWS Console → Service Quotas → Amazon EC2", err=True)
|
|
227
236
|
click.echo(" • Find quota for the instance family", err=True)
|
|
228
|
-
click.echo(
|
|
237
|
+
click.echo(
|
|
238
|
+
" • Request increase (typically approved within 24h)", err=True
|
|
239
|
+
)
|
|
229
240
|
click.echo("", err=True)
|
|
230
|
-
click.echo(
|
|
241
|
+
click.echo(
|
|
242
|
+
"For testing infrastructure, use CPU instances instead of GPU.",
|
|
243
|
+
err=True,
|
|
244
|
+
)
|
|
231
245
|
raise click.Abort()
|
|
232
|
-
|
|
246
|
+
|
|
233
247
|
# Check for insufficient capacity errors
|
|
234
248
|
if "InsufficientInstanceCapacity" in error_msg:
|
|
235
|
-
click.echo(
|
|
249
|
+
click.echo(
|
|
250
|
+
f"✗ Failed to launch engine: insufficient EC2 capacity", err=True
|
|
251
|
+
)
|
|
236
252
|
click.echo("", err=True)
|
|
237
|
-
click.echo(
|
|
253
|
+
click.echo(
|
|
254
|
+
f"AWS does not have available {engine_type} capacity in your region/AZ.",
|
|
255
|
+
err=True,
|
|
256
|
+
)
|
|
238
257
|
click.echo("", err=True)
|
|
239
258
|
click.echo("Solutions:", err=True)
|
|
240
|
-
click.echo(
|
|
259
|
+
click.echo(
|
|
260
|
+
" 1. Try again in a few minutes (capacity fluctuates)", err=True
|
|
261
|
+
)
|
|
241
262
|
click.echo(" 2. Use a different instance type", err=True)
|
|
242
263
|
click.echo(" 3. Contact AWS support for capacity reservations", err=True)
|
|
243
264
|
raise click.Abort()
|
|
244
|
-
|
|
265
|
+
|
|
245
266
|
# Check for instance limit errors
|
|
246
|
-
if
|
|
267
|
+
if (
|
|
268
|
+
"InstanceLimitExceeded" in error_msg
|
|
269
|
+
or "instance limit" in error_msg.lower()
|
|
270
|
+
):
|
|
247
271
|
click.echo(f"✗ Failed to launch engine: instance limit exceeded", err=True)
|
|
248
272
|
click.echo("", err=True)
|
|
249
|
-
click.echo(
|
|
273
|
+
click.echo(
|
|
274
|
+
f"You have reached the maximum number of running instances in {env}.",
|
|
275
|
+
err=True,
|
|
276
|
+
)
|
|
250
277
|
click.echo("", err=True)
|
|
251
278
|
click.echo("Solutions:", err=True)
|
|
252
|
-
click.echo(
|
|
279
|
+
click.echo(
|
|
280
|
+
" 1. Terminate unused engines: dh engine2 list --env {env}", err=True
|
|
281
|
+
)
|
|
253
282
|
click.echo(" 2. Request a limit increase via AWS Service Quotas", err=True)
|
|
254
283
|
raise click.Abort()
|
|
255
|
-
|
|
284
|
+
|
|
256
285
|
# Generic error
|
|
257
286
|
click.echo(f"✗ Failed to launch engine: {e}", err=True)
|
|
258
287
|
raise click.Abort()
|
|
@@ -594,19 +623,24 @@ def engine_status(name_or_id: str, env: Optional[str]):
|
|
|
594
623
|
remaining = readiness["estimated_time_remaining_seconds"]
|
|
595
624
|
click.echo(f"Estimated Time Remaining: {remaining}s")
|
|
596
625
|
|
|
597
|
-
# Show attached studios (always, even without idle state)
|
|
598
|
-
attached_studios = status_data.get("attached_studios", [])
|
|
599
|
-
if attached_studios:
|
|
600
|
-
studio_names = ", ".join([f"\033[35m{s.get('user', 'unknown')}\033[0m" for s in attached_studios])
|
|
601
|
-
click.echo(f"\nAttached Studios: {studio_names}")
|
|
602
|
-
else:
|
|
603
|
-
click.echo(f"\nAttached Studios: None")
|
|
604
|
-
|
|
605
626
|
# Show idle state (only for running engines) - always detailed per user request
|
|
627
|
+
attached_studios = status_data.get("attached_studios", [])
|
|
606
628
|
if status_data.get("idle_state"):
|
|
607
629
|
click.echo(
|
|
608
630
|
f"\n{format_idle_state(status_data['idle_state'], detailed=True, attached_studios=attached_studios)}"
|
|
609
631
|
)
|
|
632
|
+
else:
|
|
633
|
+
# If no idle state yet, still show attached studios
|
|
634
|
+
if attached_studios:
|
|
635
|
+
studio_names = ", ".join(
|
|
636
|
+
[
|
|
637
|
+
f"\033[35m{s.get('user', 'unknown')}\033[0m"
|
|
638
|
+
for s in attached_studios
|
|
639
|
+
]
|
|
640
|
+
)
|
|
641
|
+
click.echo(f"\nAttached Studios: {studio_names}")
|
|
642
|
+
else:
|
|
643
|
+
click.echo(f"\nAttached Studios: None")
|
|
610
644
|
|
|
611
645
|
except Exception as e:
|
|
612
646
|
click.echo(f"✗ Error: {e}", err=True)
|
|
@@ -853,6 +887,7 @@ def config_ssh(clean: bool, all: bool, admin: bool, env: Optional[str]):
|
|
|
853
887
|
config_entries.append(f"\nHost {name}\n")
|
|
854
888
|
config_entries.append(f" HostName {instance_id}\n")
|
|
855
889
|
config_entries.append(f" User {username}\n")
|
|
890
|
+
config_entries.append(f" ForwardAgent yes\n")
|
|
856
891
|
config_entries.append(
|
|
857
892
|
f" ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile {aws_profile}\n"
|
|
858
893
|
)
|
|
@@ -14,7 +14,7 @@ dayhoff_tools/cli/engines_studios/__init__.py,sha256=E6aG0C6qjJnJuClemSKRFlYvLUL
|
|
|
14
14
|
dayhoff_tools/cli/engines_studios/api_client.py,sha256=McZyyh5H36gkrK6s6Z7s9hl7yLLSLrHjsBtR4Opg6Ko,13491
|
|
15
15
|
dayhoff_tools/cli/engines_studios/auth.py,sha256=rwetV5hp4jSvK8FyvKgXCnezLOZx1aW8oiSDc6U83iE,5189
|
|
16
16
|
dayhoff_tools/cli/engines_studios/engine-studio-cli.md,sha256=or4k7ZZKPMTkvu67PdcUTE2_cxjnj0HQxxTuJZR1uiA,29924
|
|
17
|
-
dayhoff_tools/cli/engines_studios/engine_commands.py,sha256=
|
|
17
|
+
dayhoff_tools/cli/engines_studios/engine_commands.py,sha256=8utssuiLfxrff3Pk3PjMSUIVMU83mm9N8-Ny1uQr9es,38371
|
|
18
18
|
dayhoff_tools/cli/engines_studios/progress.py,sha256=SMahdG2YmO5bEPSONrfAXVTdS6m_69Ep02t3hc2DdKQ,9264
|
|
19
19
|
dayhoff_tools/cli/engines_studios/simulators/cli-simulators.md,sha256=FZJl6nehdr2Duht2cx3yijcak0yKyOaHTrTzvFTAfZs,4976
|
|
20
20
|
dayhoff_tools/cli/engines_studios/simulators/demo.sh,sha256=8tYABSCxLNXqGs-4r071V9mpKNZ5DTQ34WZ-v3d5s94,5364
|
|
@@ -48,7 +48,7 @@ dayhoff_tools/intake/uniprot.py,sha256=BZYJQF63OtPcBBnQ7_P9gulxzJtqyorgyuDiPeOJq
|
|
|
48
48
|
dayhoff_tools/logs.py,sha256=DKdeP0k0kliRcilwvX0mUB2eipO5BdWUeHwh-VnsICs,838
|
|
49
49
|
dayhoff_tools/sqlite.py,sha256=jV55ikF8VpTfeQqqlHSbY8OgfyfHj8zgHNpZjBLos_E,18672
|
|
50
50
|
dayhoff_tools/warehouse.py,sha256=UETBtZD3r7WgvURqfGbyHlT7cxoiVq8isjzMuerKw8I,24475
|
|
51
|
-
dayhoff_tools-1.13.
|
|
52
|
-
dayhoff_tools-1.13.
|
|
53
|
-
dayhoff_tools-1.13.
|
|
54
|
-
dayhoff_tools-1.13.
|
|
51
|
+
dayhoff_tools-1.13.8.dist-info/METADATA,sha256=I4Yu04pcP7t7LZv_9Ilado80GtOBzURE8saHY-viyTk,2980
|
|
52
|
+
dayhoff_tools-1.13.8.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
53
|
+
dayhoff_tools-1.13.8.dist-info/entry_points.txt,sha256=iAf4jteNqW3cJm6CO6czLxjW3vxYKsyGLZ8WGmxamSc,49
|
|
54
|
+
dayhoff_tools-1.13.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|