dayhoff-tools 1.13.6__tar.gz → 1.13.7__tar.gz

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.
Files changed (53) hide show
  1. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/PKG-INFO +1 -1
  2. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/engine_commands.py +56 -23
  3. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/pyproject.toml +1 -1
  4. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/README.md +0 -0
  5. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/__init__.py +0 -0
  6. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/chemistry/standardizer.py +0 -0
  7. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/chemistry/utils.py +0 -0
  8. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/__init__.py +0 -0
  9. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/cloud_commands.py +0 -0
  10. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engine1/__init__.py +0 -0
  11. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engine1/engine_core.py +0 -0
  12. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engine1/engine_lifecycle.py +0 -0
  13. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engine1/engine_maintenance.py +0 -0
  14. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engine1/engine_management.py +0 -0
  15. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engine1/shared.py +0 -0
  16. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engine1/studio_commands.py +0 -0
  17. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/__init__.py +0 -0
  18. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/api_client.py +0 -0
  19. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/auth.py +0 -0
  20. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/engine-studio-cli.md +0 -0
  21. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/progress.py +0 -0
  22. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/simulators/cli-simulators.md +0 -0
  23. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/simulators/demo.sh +0 -0
  24. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/simulators/engine_list_simulator.py +0 -0
  25. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/simulators/engine_status_simulator.py +0 -0
  26. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/simulators/idle_status_simulator.py +0 -0
  27. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/simulators/simulator_utils.py +0 -0
  28. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/simulators/studio_list_simulator.py +0 -0
  29. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/simulators/studio_status_simulator.py +0 -0
  30. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/engines_studios/studio_commands.py +0 -0
  31. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/main.py +0 -0
  32. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/swarm_commands.py +0 -0
  33. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/cli/utility_commands.py +0 -0
  34. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/deployment/base.py +0 -0
  35. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/deployment/deploy_aws.py +0 -0
  36. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/deployment/deploy_gcp.py +0 -0
  37. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/deployment/deploy_utils.py +0 -0
  38. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/deployment/job_runner.py +0 -0
  39. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/deployment/processors.py +0 -0
  40. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/deployment/swarm.py +0 -0
  41. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/embedders.py +0 -0
  42. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/fasta.py +0 -0
  43. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/file_ops.py +0 -0
  44. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/h5.py +0 -0
  45. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/intake/gcp.py +0 -0
  46. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/intake/gtdb.py +0 -0
  47. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/intake/kegg.py +0 -0
  48. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/intake/mmseqs.py +0 -0
  49. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/intake/structure.py +0 -0
  50. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/intake/uniprot.py +0 -0
  51. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/logs.py +0 -0
  52. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/sqlite.py +0 -0
  53. {dayhoff_tools-1.13.6 → dayhoff_tools-1.13.7}/dayhoff_tools/warehouse.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dayhoff-tools
3
- Version: 1.13.6
3
+ Version: 1.13.7
4
4
  Summary: Common tools for all the repos at Dayhoff Labs
5
5
  Author: Daniel Martin-Alarcon
6
6
  Author-email: dma@dayhofflabs.com
@@ -69,11 +69,14 @@ 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")
75
78
  config_entries.append(
76
- f" ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'\n"
79
+ f" ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile {profile}\n"
77
80
  )
78
81
 
79
82
  config_entries.append(managed_end)
@@ -213,46 +216,71 @@ def launch_engine(
213
216
 
214
217
  except Exception as e:
215
218
  error_msg = str(e)
216
-
219
+
217
220
  # Check for quota/limit errors
218
221
  if "VcpuLimitExceeded" in error_msg or "vCPU limit" in error_msg:
219
222
  click.echo(f"✗ Failed to launch engine: vCPU quota exceeded", err=True)
220
223
  click.echo("", err=True)
221
- click.echo(f"The {env} AWS account has insufficient vCPU quota for {engine_type} instances.", err=True)
224
+ click.echo(
225
+ f"The {env} AWS account has insufficient vCPU quota for {engine_type} instances.",
226
+ err=True,
227
+ )
222
228
  click.echo("", err=True)
223
229
  click.echo("Solutions:", err=True)
224
- click.echo(" 1. Use a different instance type (e.g., --type cpu)", err=True)
230
+ click.echo(
231
+ " 1. Use a different instance type (e.g., --type cpu)", err=True
232
+ )
225
233
  click.echo(" 2. Request a quota increase:", err=True)
226
234
  click.echo(" • AWS Console → Service Quotas → Amazon EC2", err=True)
227
235
  click.echo(" • Find quota for the instance family", err=True)
228
- click.echo(" • Request increase (typically approved within 24h)", err=True)
236
+ click.echo(
237
+ " • Request increase (typically approved within 24h)", err=True
238
+ )
229
239
  click.echo("", err=True)
230
- click.echo("For testing infrastructure, use CPU instances instead of GPU.", err=True)
240
+ click.echo(
241
+ "For testing infrastructure, use CPU instances instead of GPU.",
242
+ err=True,
243
+ )
231
244
  raise click.Abort()
232
-
245
+
233
246
  # Check for insufficient capacity errors
234
247
  if "InsufficientInstanceCapacity" in error_msg:
235
- click.echo(f"✗ Failed to launch engine: insufficient EC2 capacity", err=True)
248
+ click.echo(
249
+ f"✗ Failed to launch engine: insufficient EC2 capacity", err=True
250
+ )
236
251
  click.echo("", err=True)
237
- click.echo(f"AWS does not have available {engine_type} capacity in your region/AZ.", err=True)
252
+ click.echo(
253
+ f"AWS does not have available {engine_type} capacity in your region/AZ.",
254
+ err=True,
255
+ )
238
256
  click.echo("", err=True)
239
257
  click.echo("Solutions:", err=True)
240
- click.echo(" 1. Try again in a few minutes (capacity fluctuates)", err=True)
258
+ click.echo(
259
+ " 1. Try again in a few minutes (capacity fluctuates)", err=True
260
+ )
241
261
  click.echo(" 2. Use a different instance type", err=True)
242
262
  click.echo(" 3. Contact AWS support for capacity reservations", err=True)
243
263
  raise click.Abort()
244
-
264
+
245
265
  # Check for instance limit errors
246
- if "InstanceLimitExceeded" in error_msg or "instance limit" in error_msg.lower():
266
+ if (
267
+ "InstanceLimitExceeded" in error_msg
268
+ or "instance limit" in error_msg.lower()
269
+ ):
247
270
  click.echo(f"✗ Failed to launch engine: instance limit exceeded", err=True)
248
271
  click.echo("", err=True)
249
- click.echo(f"You have reached the maximum number of running instances in {env}.", err=True)
272
+ click.echo(
273
+ f"You have reached the maximum number of running instances in {env}.",
274
+ err=True,
275
+ )
250
276
  click.echo("", err=True)
251
277
  click.echo("Solutions:", err=True)
252
- click.echo(" 1. Terminate unused engines: dh engine2 list --env {env}", err=True)
278
+ click.echo(
279
+ " 1. Terminate unused engines: dh engine2 list --env {env}", err=True
280
+ )
253
281
  click.echo(" 2. Request a limit increase via AWS Service Quotas", err=True)
254
282
  raise click.Abort()
255
-
283
+
256
284
  # Generic error
257
285
  click.echo(f"✗ Failed to launch engine: {e}", err=True)
258
286
  raise click.Abort()
@@ -594,19 +622,24 @@ def engine_status(name_or_id: str, env: Optional[str]):
594
622
  remaining = readiness["estimated_time_remaining_seconds"]
595
623
  click.echo(f"Estimated Time Remaining: {remaining}s")
596
624
 
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
625
  # Show idle state (only for running engines) - always detailed per user request
626
+ attached_studios = status_data.get("attached_studios", [])
606
627
  if status_data.get("idle_state"):
607
628
  click.echo(
608
629
  f"\n{format_idle_state(status_data['idle_state'], detailed=True, attached_studios=attached_studios)}"
609
630
  )
631
+ else:
632
+ # If no idle state yet, still show attached studios
633
+ if attached_studios:
634
+ studio_names = ", ".join(
635
+ [
636
+ f"\033[35m{s.get('user', 'unknown')}\033[0m"
637
+ for s in attached_studios
638
+ ]
639
+ )
640
+ click.echo(f"\nAttached Studios: {studio_names}")
641
+ else:
642
+ click.echo(f"\nAttached Studios: None")
610
643
 
611
644
  except Exception as e:
612
645
  click.echo(f"✗ Error: {e}", err=True)
@@ -5,7 +5,7 @@ build-backend = "poetry.core.masonry.api"
5
5
 
6
6
  [project]
7
7
  name = "dayhoff-tools"
8
- version = "1.13.6"
8
+ version = "1.13.7"
9
9
  description = "Common tools for all the repos at Dayhoff Labs"
10
10
  authors = [
11
11
  {name = "Daniel Martin-Alarcon", email = "dma@dayhofflabs.com"}
File without changes