request-vm-on-golem 0.1.49__tar.gz → 0.1.50__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.
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/PKG-INFO +1 -1
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/pyproject.toml +1 -1
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/cli/commands.py +84 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/README.md +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/__init__.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/api/main.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/cli/__init__.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/config.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/data/deployments/l2.json +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/db/__init__.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/db/sqlite.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/errors.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/payments/blockchain_service.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/provider/__init__.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/provider/client.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/run.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/security/faucet.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/services/__init__.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/services/database_service.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/services/provider_service.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/services/ssh_service.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/services/vm_service.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/ssh/__init__.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/ssh/manager.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/utils/logging.py +0 -0
- {request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/utils/spinner.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "request-vm-on-golem"
|
3
|
-
version = "0.1.
|
3
|
+
version = "0.1.50"
|
4
4
|
description = "VM on Golem Requestor CLI - Create and manage virtual machines on the Golem Network"
|
5
5
|
authors = ["Phillip Jensen <phillip+vm-on-golem@golemgrid.com>"]
|
6
6
|
readme = "README.md"
|
@@ -340,6 +340,90 @@ def vm_stream():
|
|
340
340
|
pass
|
341
341
|
|
342
342
|
|
343
|
+
@vm_stream.command('list')
|
344
|
+
@click.option('--json', 'as_json', is_flag=True, help='Output in JSON format')
|
345
|
+
@async_command
|
346
|
+
async def stream_list(as_json: bool):
|
347
|
+
"""List payment stream status for all known VMs."""
|
348
|
+
try:
|
349
|
+
vms = await db_service.list_vms()
|
350
|
+
if not vms:
|
351
|
+
logger.warning("No VMs found in local database")
|
352
|
+
click.echo(json.dumps({"streams": []}, indent=2) if as_json else "No VMs found.")
|
353
|
+
return {"streams": []}
|
354
|
+
|
355
|
+
results = []
|
356
|
+
for vm in vms:
|
357
|
+
item: dict = {
|
358
|
+
"name": vm.get("name"),
|
359
|
+
"provider_ip": vm.get("provider_ip"),
|
360
|
+
"stream_id": None,
|
361
|
+
"verified": False,
|
362
|
+
"reason": None,
|
363
|
+
"computed": {},
|
364
|
+
"error": None,
|
365
|
+
}
|
366
|
+
try:
|
367
|
+
provider_url = config.get_provider_url(vm['provider_ip'])
|
368
|
+
async with ProviderClient(provider_url) as client:
|
369
|
+
status = await client.get_vm_stream_status(vm['vm_id'])
|
370
|
+
item.update({
|
371
|
+
"stream_id": status.get("stream_id"),
|
372
|
+
"verified": bool(status.get("verified")),
|
373
|
+
"reason": status.get("reason"),
|
374
|
+
"computed": status.get("computed", {}),
|
375
|
+
})
|
376
|
+
except Exception as e:
|
377
|
+
msg = str(e)
|
378
|
+
# Normalize common provider errors
|
379
|
+
if "no stream mapped" in msg.lower():
|
380
|
+
item.update({
|
381
|
+
"stream_id": None,
|
382
|
+
"verified": False,
|
383
|
+
"reason": "unmapped",
|
384
|
+
})
|
385
|
+
else:
|
386
|
+
item["error"] = msg
|
387
|
+
results.append(item)
|
388
|
+
|
389
|
+
out = {"streams": results}
|
390
|
+
|
391
|
+
if as_json:
|
392
|
+
click.echo(json.dumps(out, indent=2))
|
393
|
+
else:
|
394
|
+
# Render a concise table
|
395
|
+
headers = [
|
396
|
+
"VM",
|
397
|
+
"Stream ID",
|
398
|
+
"Verified",
|
399
|
+
"Reason",
|
400
|
+
"Remaining (s)",
|
401
|
+
"Withdrawable (wei)",
|
402
|
+
]
|
403
|
+
rows = []
|
404
|
+
for r in results:
|
405
|
+
comp = r.get("computed") or {}
|
406
|
+
rows.append([
|
407
|
+
r.get("name"),
|
408
|
+
r.get("stream_id") if r.get("stream_id") is not None else "—",
|
409
|
+
"✔" if r.get("verified") else "✖",
|
410
|
+
r.get("reason") or ("error: " + r.get("error") if r.get("error") else ""),
|
411
|
+
comp.get("remaining_seconds", ""),
|
412
|
+
comp.get("withdrawable_wei", ""),
|
413
|
+
])
|
414
|
+
click.echo("\n" + "─" * 60)
|
415
|
+
click.echo(click.style(f" 💸 Streams ({len(results)} VMs)", fg="blue", bold=True))
|
416
|
+
click.echo("─" * 60)
|
417
|
+
click.echo("\n" + tabulate(rows, headers=[click.style(h, bold=True) for h in headers], tablefmt="grid"))
|
418
|
+
click.echo("\n" + "─" * 60)
|
419
|
+
|
420
|
+
return out
|
421
|
+
|
422
|
+
except Exception as e:
|
423
|
+
logger.error(f"Failed to list streams: {e}")
|
424
|
+
raise click.Abort()
|
425
|
+
|
426
|
+
|
343
427
|
@vm_stream.command('open')
|
344
428
|
@click.option('--provider-id', required=True, help='Provider ID to use')
|
345
429
|
@click.option('--cpu', type=int, required=True, help='CPU cores for rate calc')
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/data/deployments/l2.json
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/payments/blockchain_service.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/services/database_service.py
RENAMED
File without changes
|
{request_vm_on_golem-0.1.49 → request_vm_on_golem-0.1.50}/requestor/services/provider_service.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|