golem-vm-provider 0.1.48__py3-none-any.whl → 0.1.50__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: golem-vm-provider
3
- Version: 0.1.48
3
+ Version: 0.1.50
4
4
  Summary: VM on Golem Provider Node - Run your own provider node to offer VMs on the Golem Network
5
5
  Keywords: golem,vm,provider,cloud,decentralized
6
6
  Author: Phillip Jensen
@@ -247,9 +247,9 @@ Enable on‑chain stream‑gated rentals funded in native ETH. By default, the p
247
247
 
248
248
  Optional background automation (all disabled by default):
249
249
 
250
- - `STREAM_MIN_REMAINING_SECONDS` — minimum remaining runway to keep a VM running (default 3600)
251
- - `STREAM_MONITOR_ENABLED` — stop VMs when remaining runway < threshold (default false)
252
- - `STREAM_MONITOR_INTERVAL_SECONDS` — how frequently to check runway (default 60)
250
+ - `STREAM_MIN_REMAINING_SECONDS` — minimum remaining runway to keep a VM running (default 0)
251
+ - `STREAM_MONITOR_ENABLED` — stop VMs when remaining runway < threshold (default true)
252
+ - `STREAM_MONITOR_INTERVAL_SECONDS` — how frequently to check runway (default 30)
253
253
  - `STREAM_WITHDRAW_ENABLED` — periodically withdraw vested funds (default false)
254
254
  - `STREAM_WITHDRAW_INTERVAL_SECONDS` — how often to attempt withdrawals (default 1800)
255
255
  - `STREAM_MIN_WITHDRAW_WEI` — only withdraw when >= this amount (gas‑aware)
@@ -2,7 +2,7 @@ provider/__init__.py,sha256=HO1fkPpZqPO3z8O8-eVIyx8xXSMIVuTR_b1YF0RtXOg,45
2
2
  provider/api/__init__.py,sha256=ssX1ugDqEPt8Fn04IymgmG-Ev8PiXLsCSaiZVvHQnec,344
3
3
  provider/api/models.py,sha256=CmfgXqSH3m0HLqY6JvUFI-2IrdGf3EhNKtZ5kbIAX-U,4304
4
4
  provider/api/routes.py,sha256=RaOhdUZLJVmCHFWHyhYF9kdBmsFSe5rThIYsW6meMrQ,13194
5
- provider/config.py,sha256=HVbINPi3mRDSvrjZfgu4SRwLPvIWD_IEW_M5GECsIEQ,24936
5
+ provider/config.py,sha256=GsrhbZYvMla1WWSHUg6q4wn0_SK3zgSPtlWGve_H2e8,24932
6
6
  provider/container.py,sha256=81x5LiA-qjYN1Uh_JdOxqvuIXiNDr9X3OXNN0VqYFCI,3681
7
7
  provider/data/deployments/l2.json,sha256=XTNN2C5LkBfp4YbDKdUKfWMdp1fKnfv8D3TgcwVWxtQ,249
8
8
  provider/discovery/__init__.py,sha256=Y6o8RxGevBpuQS3k32y-zSVbP6HBXG3veBl9ElVPKaU,349
@@ -16,7 +16,7 @@ provider/discovery/service.py,sha256=vX_mVSxvn3arnb2cKDM_SeJp1ZgPdImP2aUubeXgdRg
16
16
  provider/main.py,sha256=RSq2_dbBjQYkNwohxuwgzKbnzcqzEgJH1wcPMMf00t0,18925
17
17
  provider/network/port_verifier.py,sha256=3l6WNwBHydggJRFYkAsuBp1eCxaU619kjWuM-zSVj2o,13267
18
18
  provider/payments/blockchain_service.py,sha256=4GrzDKwCSUVoENqjD4RLyJ0qwBOJKMyVk5Li-XNsyTc,3567
19
- provider/payments/monitor.py,sha256=TD88OrVfqGdzgfZkGNcCQMnGr0MLoj2p-bunDoalT8M,3814
19
+ provider/payments/monitor.py,sha256=Rw17zYsxZre0zU6R0oeRNvVIzMdXLsgoUvSPHpJy6I0,4488
20
20
  provider/payments/stream_map.py,sha256=qk6Y8hS72DplAifZ0ZMWPHBAyc_3IWIQyWUBuCU3_To,1191
21
21
  provider/security/ethereum.py,sha256=EwPZj4JR8OEpto6LhKjuuT3Z9pBX6P7-UQaqJtqFkYQ,1242
22
22
  provider/security/faucet.py,sha256=8T4lW1fVQgUk8EQILgbrr9UUosw9e7eA40tlZ2_KCPQ,4368
@@ -38,7 +38,7 @@ provider/vm/port_manager.py,sha256=iYSwjTjD_ziOhG8aI7juKHw1OwwRUTJQyQoRUNQvz9w,1
38
38
  provider/vm/provider.py,sha256=A7QN89EJjcSS40_SmKeinG1Jp_NGffJaLse-XdKciAs,1164
39
39
  provider/vm/proxy_manager.py,sha256=n4NTsyz2rtrvjtf_ceKBk-g2q_mzqPwruB1q7UlQVBc,14928
40
40
  provider/vm/service.py,sha256=Ki4SGNIZUq3XmaPMwAOoNzdZzKQsmFXid374wgjFPes,4636
41
- golem_vm_provider-0.1.48.dist-info/METADATA,sha256=yHYPPOgmUxx55qWY93wvUqrjyzwOt2zNOS2ql3crvEc,16589
42
- golem_vm_provider-0.1.48.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
43
- golem_vm_provider-0.1.48.dist-info/entry_points.txt,sha256=5Jiie1dIXygmxmDW66bKKxQpmBLJ7leSKRrb8bkQALw,52
44
- golem_vm_provider-0.1.48.dist-info/RECORD,,
41
+ golem_vm_provider-0.1.50.dist-info/METADATA,sha256=h4dTmyA9UOyvi8R3pp13bW34sxr8W8JSoYzALN8gRmA,16585
42
+ golem_vm_provider-0.1.50.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
43
+ golem_vm_provider-0.1.50.dist-info/entry_points.txt,sha256=5Jiie1dIXygmxmDW66bKKxQpmBLJ7leSKRrb8bkQALw,52
44
+ golem_vm_provider-0.1.50.dist-info/RECORD,,
provider/config.py CHANGED
@@ -150,11 +150,11 @@ class Settings(BaseSettings):
150
150
  description="Token address (0x0 means native ETH). Defaults from l2.json"
151
151
  )
152
152
  STREAM_MIN_REMAINING_SECONDS: int = Field(
153
- default=3600,
153
+ default=0,
154
154
  description="Minimum remaining seconds required to keep a VM running"
155
155
  )
156
156
  STREAM_MONITOR_ENABLED: bool = Field(
157
- default=False,
157
+ default=True,
158
158
  description="Enable background monitor to stop VMs when runway < threshold"
159
159
  )
160
160
  STREAM_WITHDRAW_ENABLED: bool = Field(
@@ -162,7 +162,7 @@ class Settings(BaseSettings):
162
162
  description="Enable background withdrawals for active streams"
163
163
  )
164
164
  STREAM_MONITOR_INTERVAL_SECONDS: int = Field(
165
- default=60,
165
+ default=30,
166
166
  description="How frequently to check stream runway"
167
167
  )
168
168
  STREAM_WITHDRAW_INTERVAL_SECONDS: int = Field(
@@ -15,11 +15,21 @@ class StreamMonitor:
15
15
  self.settings = settings
16
16
  self._task: Optional[asyncio.Task] = None
17
17
 
18
+ def _get(self, key: str, default=None):
19
+ """Safely read setting from either an object with attributes or a dict-like mapping."""
20
+ try:
21
+ return getattr(self.settings, key)
22
+ except Exception:
23
+ try:
24
+ return self.settings.get(key, default)
25
+ except Exception:
26
+ return default
27
+
18
28
  def start(self):
19
- if self.settings.STREAM_MONITOR_ENABLED or self.settings.STREAM_WITHDRAW_ENABLED:
29
+ if self._get("STREAM_MONITOR_ENABLED", False) or self._get("STREAM_WITHDRAW_ENABLED", False):
20
30
  logger.info(
21
- f"⏱️ Stream monitor enabled (check={self.settings.STREAM_MONITOR_ENABLED}, withdraw={self.settings.STREAM_WITHDRAW_ENABLED}) "
22
- f"interval={self.settings.STREAM_MONITOR_INTERVAL_SECONDS}s"
31
+ f"⏱️ Stream monitor enabled (check={self._get('STREAM_MONITOR_ENABLED', False)}, "
32
+ f"withdraw={self._get('STREAM_WITHDRAW_ENABLED', False)}) interval={self._get('STREAM_MONITOR_INTERVAL_SECONDS', 60)}s"
23
33
  )
24
34
  self._task = asyncio.create_task(self._run(), name="stream-monitor")
25
35
 
@@ -35,7 +45,7 @@ class StreamMonitor:
35
45
  last_withdraw = 0
36
46
  while True:
37
47
  try:
38
- await asyncio.sleep(self.settings.STREAM_MONITOR_INTERVAL_SECONDS)
48
+ await asyncio.sleep(int(self._get("STREAM_MONITOR_INTERVAL_SECONDS", 60)))
39
49
  items = await self.stream_map.all_items()
40
50
  now = int(self.reader.web3.eth.get_block("latest")["timestamp"]) if items else 0
41
51
  logger.debug(f"stream monitor tick: {len(items)} streams, now={now}")
@@ -51,20 +61,24 @@ class StreamMonitor:
51
61
  f"stream {stream_id} for VM {vm_id}: start={s['startTime']} stop={s['stopTime']} "
52
62
  f"rate={s['ratePerSecond']} withdrawn={s['withdrawn']} halted={s['halted']} remaining={remaining}s"
53
63
  )
54
- if self.settings.STREAM_MONITOR_ENABLED and remaining < self.settings.STREAM_MIN_REMAINING_SECONDS:
64
+ if self._get("STREAM_MONITOR_ENABLED", False) and remaining < int(self._get("STREAM_MIN_REMAINING_SECONDS", 0)):
55
65
  logger.info(f"Stopping VM {vm_id} due to low stream runway ({remaining}s)")
56
66
  try:
57
67
  await self.vm_service.stop_vm(vm_id)
58
68
  except Exception as e:
59
69
  logger.warning(f"stop_vm failed for {vm_id}: {e}")
70
+ else:
71
+ logger.debug(
72
+ f"VM {vm_id} stream {stream_id} healthy (remaining={remaining}s, threshold={self._get('STREAM_MIN_REMAINING_SECONDS', 0)}s)"
73
+ )
60
74
  # Withdraw if enough vested and configured
61
- if self.settings.STREAM_WITHDRAW_ENABLED and self.client:
75
+ if self._get("STREAM_WITHDRAW_ENABLED", False) and self.client:
62
76
  vested = max(min(now, s["stopTime"]) - s["startTime"], 0) * s["ratePerSecond"]
63
77
  withdrawable = max(vested - s["withdrawn"], 0)
64
78
  logger.debug(f"withdraw check stream {stream_id}: vested={vested} withdrawable={withdrawable}")
65
79
  # Enforce a minimum interval between withdrawals
66
- if withdrawable >= self.settings.STREAM_MIN_WITHDRAW_WEI and (
67
- now - last_withdraw >= self.settings.STREAM_WITHDRAW_INTERVAL_SECONDS
80
+ if withdrawable >= int(self._get("STREAM_MIN_WITHDRAW_WEI", 0)) and (
81
+ now - last_withdraw >= int(self._get("STREAM_WITHDRAW_INTERVAL_SECONDS", 1800))
68
82
  ):
69
83
  try:
70
84
  self.client.withdraw(stream_id)