dayhoff-tools 1.6.6__py3-none-any.whl → 1.6.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.
@@ -1710,6 +1710,36 @@ def attach_studio(
1710
1710
 
1711
1711
  console.print(f"Attaching studio to engine [cyan]{engine['name']}[/cyan]...")
1712
1712
 
1713
+ # Helper --------------------------------------------------------------
1714
+ def _is_studio_attached(target_studio_id: str, target_vm_id: str) -> bool:
1715
+ """Return True when the given studio already shows as attached to the VM.
1716
+
1717
+ Using this extra check lets us stop the outer retry loop as soon as the
1718
+ asynchronous attach operation actually finishes, even in the unlikely
1719
+ event that the operation-tracking DynamoDB record is not yet updated.
1720
+ """
1721
+ # First try the per-studio endpoint – fastest.
1722
+ resp = make_api_request("GET", f"/studios/{target_studio_id}")
1723
+ if resp.status_code == 200:
1724
+ data = resp.json()
1725
+ if (
1726
+ data.get("status") == "in-use"
1727
+ and data.get("attached_vm_id") == target_vm_id
1728
+ ):
1729
+ return True
1730
+ # Fallback: list + filter (covers edge-cases where the direct endpoint
1731
+ # is slower to update IAM/APIGW mapping than the list endpoint).
1732
+ list_resp = make_api_request("GET", "/studios")
1733
+ if list_resp.status_code == 200:
1734
+ for stu in list_resp.json().get("studios", []):
1735
+ if (
1736
+ stu.get("studio_id") == target_studio_id
1737
+ and stu.get("status") == "in-use"
1738
+ and stu.get("attached_vm_id") == target_vm_id
1739
+ ):
1740
+ return True
1741
+ return False
1742
+
1713
1743
  # Determine retry strategy based on whether we just started the engine
1714
1744
  if engine_started_now:
1715
1745
  max_attempts = 40 # About 7 minutes total with exponential backoff
@@ -1734,6 +1764,12 @@ def attach_studio(
1734
1764
  last_error = None
1735
1765
 
1736
1766
  for attempt in range(max_attempts):
1767
+ # If the attach already completed in the previous iteration (but we
1768
+ # didn't notice because the operation table wasn’t updated yet),
1769
+ # bail out early.
1770
+ if _is_studio_attached(studio["studio_id"], engine["instance_id"]):
1771
+ success = True
1772
+ break
1737
1773
  success, error_msg = _attempt_studio_attach(
1738
1774
  studio, engine, target_user, public_key
1739
1775
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: dayhoff-tools
3
- Version: 1.6.6
3
+ Version: 1.6.8
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
@@ -3,7 +3,7 @@ dayhoff_tools/chemistry/standardizer.py,sha256=uMn7VwHnx02nc404eO6fRuS4rsl4dvSPf
3
3
  dayhoff_tools/chemistry/utils.py,sha256=jt-7JgF-GeeVC421acX-bobKbLU_X94KNOW24p_P-_M,2257
4
4
  dayhoff_tools/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  dayhoff_tools/cli/cloud_commands.py,sha256=33qcWLmq-FwEXMdL3F0OHm-5Stlh2r65CldyEZgQ1no,40904
6
- dayhoff_tools/cli/engine_commands.py,sha256=7wjf_LN2Woa3cZPcyG7nBY6w-vDTqVGj3JvQCU1nXxM,94059
6
+ dayhoff_tools/cli/engine_commands.py,sha256=_S1JZHB_7qWXpae_eeILSTiN3lOd3-zluJGb4eiVlTU,95816
7
7
  dayhoff_tools/cli/main.py,sha256=tRN7WCBHg6uyNp6rA54pKTCoVmBntta2i0Yas3bUpZ4,4853
8
8
  dayhoff_tools/cli/swarm_commands.py,sha256=5EyKj8yietvT5lfoz8Zx0iQvVaNgc3SJX1z2zQR6o6M,5614
9
9
  dayhoff_tools/cli/utility_commands.py,sha256=FRZTPrjsG_qmIIqoNxd1Q1vVkS_5w8aY33IrVYVNCLg,18131
@@ -27,7 +27,7 @@ dayhoff_tools/intake/uniprot.py,sha256=BZYJQF63OtPcBBnQ7_P9gulxzJtqyorgyuDiPeOJq
27
27
  dayhoff_tools/logs.py,sha256=DKdeP0k0kliRcilwvX0mUB2eipO5BdWUeHwh-VnsICs,838
28
28
  dayhoff_tools/sqlite.py,sha256=jV55ikF8VpTfeQqqlHSbY8OgfyfHj8zgHNpZjBLos_E,18672
29
29
  dayhoff_tools/warehouse.py,sha256=heaYc64qplgN3_1WVPFmqj53goStioWwY5NqlWc4c0s,24453
30
- dayhoff_tools-1.6.6.dist-info/METADATA,sha256=UG7p9G_i-15hK8hWyeWmY8Sg3rvLoNjKQTt3VyprOpQ,2914
31
- dayhoff_tools-1.6.6.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
32
- dayhoff_tools-1.6.6.dist-info/entry_points.txt,sha256=iAf4jteNqW3cJm6CO6czLxjW3vxYKsyGLZ8WGmxamSc,49
33
- dayhoff_tools-1.6.6.dist-info/RECORD,,
30
+ dayhoff_tools-1.6.8.dist-info/METADATA,sha256=V5sgvfjlpSA4Lhk-i9SHA0G5lkiHtKp5SSngi_ovVhA,2914
31
+ dayhoff_tools-1.6.8.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
32
+ dayhoff_tools-1.6.8.dist-info/entry_points.txt,sha256=iAf4jteNqW3cJm6CO6czLxjW3vxYKsyGLZ8WGmxamSc,49
33
+ dayhoff_tools-1.6.8.dist-info/RECORD,,