portacode 1.4.17.dev0__py3-none-any.whl → 1.4.17.dev1__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.
portacode/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '1.4.17.dev0'
32
- __version_tuple__ = version_tuple = (1, 4, 17, 'dev0')
31
+ __version__ = version = '1.4.17.dev1'
32
+ __version_tuple__ = version_tuple = (1, 4, 17, 'dev1')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -48,6 +48,7 @@ UNIT_DIR = Path("/etc/systemd/system")
48
48
  _MANAGED_CONTAINERS_CACHE_TTL_S = 30.0
49
49
  _MANAGED_CONTAINERS_CACHE: Dict[str, Any] = {"timestamp": 0.0, "summary": None}
50
50
  _MANAGED_CONTAINERS_CACHE_LOCK = threading.Lock()
51
+ _CAPACITY_LOCK = threading.Lock()
51
52
  TEMPLATES_REFRESH_INTERVAL_S = 300
52
53
 
53
54
  ProgressCallback = Callable[[int, int, Dict[str, Any], str, Optional[Dict[str, Any]]], None]
@@ -1153,18 +1154,19 @@ def _start_container(proxmox: Any, node: str, vmid: int) -> Tuple[Dict[str, Any]
1153
1154
  logger.info("Container %s already running (%ss)", vmid, uptime)
1154
1155
  return status, 0.0
1155
1156
 
1156
- # Validate capacity using the same math as the dashboard.
1157
- summary = _get_managed_containers_summary(force=True)
1158
- cfg = proxmox.nodes(node).lxc(vmid).config.get()
1159
- payload = {
1160
- "ram_mib": _to_mib(cfg.get("memory")),
1161
- "disk_gib": _pick_container_disk_gib("lxc", cfg, {"rootfs": cfg.get("rootfs")}),
1162
- "cpus": _pick_container_cpu_share("lxc", cfg, {}),
1163
- }
1164
- try:
1165
- _assert_capacity_for_payload(payload, summary)
1166
- except RuntimeError as exc:
1167
- raise RuntimeError(f"Not enough resources to start container {vmid}: {exc}") from exc
1157
+ # Validate capacity using the same math as the dashboard and serialize allocation.
1158
+ with _CAPACITY_LOCK:
1159
+ summary = _get_managed_containers_summary(force=True)
1160
+ cfg = proxmox.nodes(node).lxc(vmid).config.get()
1161
+ payload = {
1162
+ "ram_mib": _to_mib(cfg.get("memory")),
1163
+ "disk_gib": _pick_container_disk_gib("lxc", cfg, {"rootfs": cfg.get("rootfs")}),
1164
+ "cpus": _pick_container_cpu_share("lxc", cfg, {}),
1165
+ }
1166
+ try:
1167
+ _assert_capacity_for_payload(payload, summary)
1168
+ except RuntimeError as exc:
1169
+ raise RuntimeError(f"Not enough resources to start container {vmid}: {exc}") from exc
1168
1170
 
1169
1171
  upid = proxmox.nodes(node).lxc(vmid).status.start.post()
1170
1172
  return _wait_for_task(proxmox, node, upid)
@@ -1902,12 +1904,14 @@ class CreateProxmoxContainerHandler(SyncHandler):
1902
1904
  payload["cores"] = int(max(math.ceil(payload["cpus"]), 1))
1903
1905
  payload["memory"] = int(payload["ram_mib"])
1904
1906
  payload["node"] = node
1905
- # Validate against current free resources (same math as dashboard charts).
1906
- summary = _get_managed_containers_summary(force=True)
1907
- try:
1908
- _assert_capacity_for_payload(payload, summary)
1909
- except RuntimeError as exc:
1910
- raise RuntimeError(f"Not enough resources to create the container safely: {exc}") from exc
1907
+ # Validate against current free resources (same math as dashboard charts) with serialization.
1908
+ with _CAPACITY_LOCK:
1909
+ summary = _get_managed_containers_summary(force=True)
1910
+ try:
1911
+ _assert_capacity_for_payload(payload, summary)
1912
+ except RuntimeError as exc:
1913
+ raise RuntimeError(f"Not enough resources to create the container safely: {exc}") from exc
1914
+ vmid, _ = _instantiate_container(proxmox, node, payload)
1911
1915
  logger.debug(
1912
1916
  "Provisioning container node=%s template=%s ram=%s cpu=%s storage=%s",
1913
1917
  node,
@@ -1916,7 +1920,6 @@ class CreateProxmoxContainerHandler(SyncHandler):
1916
1920
  payload["cpus"],
1917
1921
  payload["storage"],
1918
1922
  )
1919
- vmid, _ = _instantiate_container(proxmox, node, payload)
1920
1923
  payload["vmid"] = vmid
1921
1924
  payload["created_at"] = datetime.utcnow().isoformat() + "Z"
1922
1925
  payload["status"] = "creating"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: portacode
3
- Version: 1.4.17.dev0
3
+ Version: 1.4.17.dev1
4
4
  Summary: Portacode CLI client and SDK
5
5
  Home-page: https://github.com/portacode/portacode
6
6
  Author: Meena Erian
@@ -1,7 +1,7 @@
1
1
  portacode/README.md,sha256=4dKtpvR8LNgZPVz37GmkQCMWIr_u25Ao63iW56s7Ke4,775
2
2
  portacode/__init__.py,sha256=oB3sV1wXr-um-RXio73UG8E5Xx6cF2ZVJveqjNmC-vQ,1086
3
3
  portacode/__main__.py,sha256=jmHTGC1hzmo9iKJLv-SSYe9BSIbPPZ2IOpecI03PlTs,296
4
- portacode/_version.py,sha256=bQ-FAL2ble5i7ZHjLXfiacqJWiDcpjxBVD73svWzbjg,719
4
+ portacode/_version.py,sha256=30JbXF45c9c1UEsvLScl1Hcz0g1qPk9RGMCBErXUK0c,719
5
5
  portacode/cli.py,sha256=mGLKoZ-T2FBF7IA9wUq0zyG0X9__-A1ao7gajjcVRH8,21828
6
6
  portacode/data.py,sha256=5-s291bv8J354myaHm1Y7CQZTZyRzMU3TGe5U4hb-FA,1591
7
7
  portacode/keypair.py,sha256=0OO4vHDcF1XMxCDqce61xFTlFwlTcmqe5HyGsXFEt7s,5838
@@ -22,7 +22,7 @@ portacode/connection/handlers/diff_handlers.py,sha256=iYTIRCcpEQ03vIPKZCsMTE5aZb
22
22
  portacode/connection/handlers/file_handlers.py,sha256=nAJH8nXnX07xxD28ngLpgIUzcTuRwZBNpEGEKdRqohw,39507
23
23
  portacode/connection/handlers/project_aware_file_handlers.py,sha256=AqgMnDqX2893T2NsrvUSCwjN5VKj4Pb2TN0S_SuboOE,9803
24
24
  portacode/connection/handlers/project_state_handlers.py,sha256=v6ZefGW9i7n1aZLq2jOGumJIjYb6aHlPI4m1jkYewm8,1686
25
- portacode/connection/handlers/proxmox_infra.py,sha256=GjGB0BICYR5eI-tUYwg7p2qnBWvLu_UcMshP5XTTLr0,87397
25
+ portacode/connection/handlers/proxmox_infra.py,sha256=afndfVsjcHWHsa8F2PkRnHmc67c39k5VMmJeUoSSnok,87601
26
26
  portacode/connection/handlers/registry.py,sha256=qXGE60sYEWg6ZtVQzFcZ5YI2XWR6lMgw4hAL9x5qR1I,6181
27
27
  portacode/connection/handlers/session.py,sha256=uNGfiO_1B9-_yjJKkpvmbiJhIl6b-UXlT86UTfd6WYE,42219
28
28
  portacode/connection/handlers/system_handlers.py,sha256=fr12QpOr_Z8KYGUU-AYrTQwRPAcrLK85hvj3SEq1Kw8,14757
@@ -65,7 +65,7 @@ portacode/utils/__init__.py,sha256=NgBlWTuNJESfIYJzP_3adI1yJQJR0XJLRpSdVNaBAN0,3
65
65
  portacode/utils/diff_apply.py,sha256=4Oi7ft3VUCKmiUE4VM-OeqO7Gk6H7PF3WnN4WHXtjxI,15157
66
66
  portacode/utils/diff_renderer.py,sha256=S76StnQ2DLfsz4Gg0m07UwPfRp8270PuzbNaQq-rmYk,13850
67
67
  portacode/utils/ntp_clock.py,sha256=VqCnWCTehCufE43W23oB-WUdAZGeCcLxkmIOPwInYHc,2499
68
- portacode-1.4.17.dev0.dist-info/licenses/LICENSE,sha256=2FGbCnUDgRYuQTkB1O1dUUpu5CVAjK1j4_p6ack9Z54,1066
68
+ portacode-1.4.17.dev1.dist-info/licenses/LICENSE,sha256=2FGbCnUDgRYuQTkB1O1dUUpu5CVAjK1j4_p6ack9Z54,1066
69
69
  test_modules/README.md,sha256=Do_agkm9WhSzueXjRAkV_xEj6Emy5zB3N3VKY5Roce8,9274
70
70
  test_modules/__init__.py,sha256=1LcbHodIHsB0g-g4NGjSn6AMuCoGbymvXPYLOb6Z7F0,53
71
71
  test_modules/test_device_online.py,sha256=QtYq0Dq9vME8Gp2O4fGSheqVf8LUtpsSKosXXk56gGM,1654
@@ -91,8 +91,8 @@ testing_framework/core/playwright_manager.py,sha256=Tw46qwxIhOFkS48C2IWIQHHNpEe-
91
91
  testing_framework/core/runner.py,sha256=j2QwNJmAxVBmJvcbVS7DgPJUKPNzqfLmt_4NNdaKmZU,19297
92
92
  testing_framework/core/shared_cli_manager.py,sha256=BESSNtyQb7BOlaOvZmm04T8Uezjms4KCBs2MzTxvzYQ,8790
93
93
  testing_framework/core/test_discovery.py,sha256=2FZ9fJ8Dp5dloA-fkgXoJ_gCMC_nYPBnA3Hs2xlagzM,4928
94
- portacode-1.4.17.dev0.dist-info/METADATA,sha256=F-YQ9c2OK7Ck8xlpNpfdypteq_TEfZMKpB-HGLVhllg,13051
95
- portacode-1.4.17.dev0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
96
- portacode-1.4.17.dev0.dist-info/entry_points.txt,sha256=lLUUL-BM6_wwe44Xv0__5NQ1BnAz6jWjSMFvZdWW3zU,48
97
- portacode-1.4.17.dev0.dist-info/top_level.txt,sha256=TGhTYUxfW8SyVZc_zGgzjzc24gGT7nSw8Qf73liVRKM,41
98
- portacode-1.4.17.dev0.dist-info/RECORD,,
94
+ portacode-1.4.17.dev1.dist-info/METADATA,sha256=fiXLmOIToLe48UzncEAQCZnpib1ITZpl0gS06M5fmFA,13051
95
+ portacode-1.4.17.dev1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
96
+ portacode-1.4.17.dev1.dist-info/entry_points.txt,sha256=lLUUL-BM6_wwe44Xv0__5NQ1BnAz6jWjSMFvZdWW3zU,48
97
+ portacode-1.4.17.dev1.dist-info/top_level.txt,sha256=TGhTYUxfW8SyVZc_zGgzjzc24gGT7nSw8Qf73liVRKM,41
98
+ portacode-1.4.17.dev1.dist-info/RECORD,,