dayhoff-tools 1.6.5__py3-none-any.whl → 1.6.7__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.
Potentially problematic release.
This version of dayhoff-tools might be problematic. Click here for more details.
- dayhoff_tools/cli/engine_commands.py +54 -18
- {dayhoff_tools-1.6.5.dist-info → dayhoff_tools-1.6.7.dist-info}/METADATA +1 -1
- {dayhoff_tools-1.6.5.dist-info → dayhoff_tools-1.6.7.dist-info}/RECORD +5 -5
- {dayhoff_tools-1.6.5.dist-info → dayhoff_tools-1.6.7.dist-info}/WHEEL +0 -0
- {dayhoff_tools-1.6.5.dist-info → dayhoff_tools-1.6.7.dist-info}/entry_points.txt +0 -0
|
@@ -1710,6 +1710,23 @@ 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
|
+
resp = make_api_request("GET", f"/studios/{target_studio_id}")
|
|
1722
|
+
if resp.status_code != 200:
|
|
1723
|
+
return False
|
|
1724
|
+
data = resp.json()
|
|
1725
|
+
return (
|
|
1726
|
+
data.get("status") == "in-use"
|
|
1727
|
+
and data.get("attached_vm_id") == target_vm_id
|
|
1728
|
+
)
|
|
1729
|
+
|
|
1713
1730
|
# Determine retry strategy based on whether we just started the engine
|
|
1714
1731
|
if engine_started_now:
|
|
1715
1732
|
max_attempts = 40 # About 7 minutes total with exponential backoff
|
|
@@ -1734,6 +1751,12 @@ def attach_studio(
|
|
|
1734
1751
|
last_error = None
|
|
1735
1752
|
|
|
1736
1753
|
for attempt in range(max_attempts):
|
|
1754
|
+
# If the attach already completed in the previous iteration (but we
|
|
1755
|
+
# didn't notice because the operation table wasn’t updated yet),
|
|
1756
|
+
# bail out early.
|
|
1757
|
+
if _is_studio_attached(studio["studio_id"], engine["instance_id"]):
|
|
1758
|
+
success = True
|
|
1759
|
+
break
|
|
1737
1760
|
success, error_msg = _attempt_studio_attach(
|
|
1738
1761
|
studio, engine, target_user, public_key
|
|
1739
1762
|
)
|
|
@@ -1860,27 +1883,40 @@ def _attempt_studio_attach(studio, engine, target_user, public_key):
|
|
|
1860
1883
|
|
|
1861
1884
|
|
|
1862
1885
|
def _poll_operation(operation_id: str, timeout: int = 600) -> Tuple[bool, str]:
|
|
1863
|
-
"""Poll
|
|
1886
|
+
"""Poll `/operations/<id>` until it reports COMPLETED or FAILED.
|
|
1864
1887
|
|
|
1865
|
-
Returns (True, "") on success or (False, error_message) on failure
|
|
1866
|
-
|
|
1888
|
+
Returns (True, "") on success or (False, error_message) on failure or
|
|
1889
|
+
timeout.
|
|
1890
|
+
|
|
1891
|
+
IMPORTANT: This helper deliberately *avoids* creating its own Rich Live/
|
|
1892
|
+
spinner so that it can be called from inside another Progress/Live context
|
|
1893
|
+
(the outer "Attaching studio…" progress bar). Nested Live renderables lead
|
|
1894
|
+
to constant hide/show repaint cycles, which is what caused the flickering
|
|
1895
|
+
the user observed.
|
|
1867
1896
|
"""
|
|
1868
1897
|
start_ts = time.time()
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1898
|
+
while True:
|
|
1899
|
+
# ---- timeout guard -------------------------------------------------
|
|
1900
|
+
if time.time() - start_ts > timeout:
|
|
1901
|
+
return False, "Timed out waiting for attach operation to complete"
|
|
1902
|
+
|
|
1903
|
+
# ---- fetch status ---------------------------------------------------
|
|
1904
|
+
op_resp = make_api_request("GET", f"/operations/{operation_id}")
|
|
1905
|
+
if op_resp.status_code != 200:
|
|
1906
|
+
return False, (
|
|
1907
|
+
f"Failed to fetch operation status (HTTP {op_resp.status_code})"
|
|
1908
|
+
)
|
|
1909
|
+
data = op_resp.json()
|
|
1910
|
+
op_status = data.get("status")
|
|
1911
|
+
|
|
1912
|
+
# ---- interpret state -----------------------------------------------
|
|
1913
|
+
if op_status == "COMPLETED":
|
|
1914
|
+
return True, ""
|
|
1915
|
+
if op_status == "FAILED":
|
|
1916
|
+
return False, data.get("error", "Operation failed")
|
|
1917
|
+
|
|
1918
|
+
# Not finished yet – wait a little and poll again (no live spinner)
|
|
1919
|
+
time.sleep(3)
|
|
1884
1920
|
|
|
1885
1921
|
|
|
1886
1922
|
@studio_app.command("detach")
|
|
@@ -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=
|
|
6
|
+
dayhoff_tools/cli/engine_commands.py,sha256=ge6GMrXUcc3xy_tt_Gn3bQUh5eqjYVEE4FDjoXO7-PM,95156
|
|
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.
|
|
31
|
-
dayhoff_tools-1.6.
|
|
32
|
-
dayhoff_tools-1.6.
|
|
33
|
-
dayhoff_tools-1.6.
|
|
30
|
+
dayhoff_tools-1.6.7.dist-info/METADATA,sha256=_yxPKFxAXvOiL8eKqa3b4AKAOCk6F-bl_rQINQe44NU,2914
|
|
31
|
+
dayhoff_tools-1.6.7.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
32
|
+
dayhoff_tools-1.6.7.dist-info/entry_points.txt,sha256=iAf4jteNqW3cJm6CO6czLxjW3vxYKsyGLZ8WGmxamSc,49
|
|
33
|
+
dayhoff_tools-1.6.7.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|