golem-vm-provider 0.1.35__tar.gz → 0.1.36__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.
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/PKG-INFO +1 -1
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/api/routes.py +5 -4
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/config.py +31 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/main.py +7 -6
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/vm/service.py +3 -3
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/pyproject.toml +1 -1
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/README.md +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/__init__.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/api/__init__.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/api/models.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/container.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/discovery/__init__.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/discovery/advertiser.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/discovery/golem_base_advertiser.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/discovery/golem_base_utils.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/discovery/resource_monitor.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/discovery/resource_tracker.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/discovery/service.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/network/port_verifier.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/security/ethereum.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/security/faucet.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/service.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/utils/__init__.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/utils/ascii_art.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/utils/logging.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/utils/port_display.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/utils/retry.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/utils/setup.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/vm/__init__.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/vm/cloud_init.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/vm/models.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/vm/multipass.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/vm/multipass_adapter.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/vm/name_mapper.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/vm/port_manager.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/vm/provider.py +0 -0
- {golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/vm/proxy_manager.py +0 -0
@@ -122,18 +122,19 @@ async def get_vm_access(
|
|
122
122
|
raise HTTPException(status_code=500, detail="An unexpected error occurred")
|
123
123
|
|
124
124
|
|
125
|
-
@router.post("/vms/{requestor_name}/stop")
|
125
|
+
@router.post("/vms/{requestor_name}/stop", response_model=VMInfo)
|
126
126
|
@inject
|
127
127
|
async def stop_vm(
|
128
128
|
requestor_name: str,
|
129
129
|
vm_service: VMService = Depends(Provide[Container.vm_service]),
|
130
|
-
) ->
|
130
|
+
) -> VMInfo:
|
131
131
|
"""Stop a VM."""
|
132
132
|
try:
|
133
133
|
logger.process(f"🛑 Stopping VM '{requestor_name}'")
|
134
|
-
await vm_service.stop_vm(requestor_name)
|
135
|
-
vm_status_change(requestor_name,
|
134
|
+
vm_info = await vm_service.stop_vm(requestor_name)
|
135
|
+
vm_status_change(requestor_name, vm_info.status.value, "VM stopped")
|
136
136
|
logger.success(f"✨ Successfully stopped VM '{requestor_name}'")
|
137
|
+
return vm_info
|
137
138
|
except VMNotFoundError as e:
|
138
139
|
logger.error(f"VM not found: {e}")
|
139
140
|
raise HTTPException(status_code=404, detail=str(e))
|
@@ -11,6 +11,37 @@ from .utils.logging import setup_logger
|
|
11
11
|
logger = setup_logger(__name__)
|
12
12
|
|
13
13
|
|
14
|
+
def ensure_config() -> None:
|
15
|
+
"""Ensure the provider configuration directory and defaults exist."""
|
16
|
+
base_dir = Path.home() / ".golem" / "provider"
|
17
|
+
env_file = base_dir / ".env"
|
18
|
+
subdirs = ["keys", "ssh", "vms", "proxy"]
|
19
|
+
created = False
|
20
|
+
|
21
|
+
for sub in subdirs:
|
22
|
+
path = base_dir / sub
|
23
|
+
if not path.exists():
|
24
|
+
path.mkdir(parents=True, exist_ok=True)
|
25
|
+
created = True
|
26
|
+
|
27
|
+
if not env_file.exists():
|
28
|
+
env_file.write_text("GOLEM_PROVIDER_ENVIRONMENT=production\n")
|
29
|
+
created = True
|
30
|
+
|
31
|
+
from .security.ethereum import EthereumIdentity
|
32
|
+
|
33
|
+
identity = EthereumIdentity(str(base_dir / "keys"))
|
34
|
+
if not identity.key_file.exists():
|
35
|
+
identity.get_or_create_identity()
|
36
|
+
created = True
|
37
|
+
|
38
|
+
if created:
|
39
|
+
print("Using default settings – run with --help to customize")
|
40
|
+
|
41
|
+
|
42
|
+
ensure_config()
|
43
|
+
|
44
|
+
|
14
45
|
class Settings(BaseSettings):
|
15
46
|
"""Provider configuration settings."""
|
16
47
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
from .api import routes
|
2
1
|
import asyncio
|
3
2
|
import os
|
4
3
|
import socket
|
@@ -6,14 +5,16 @@ from fastapi import FastAPI
|
|
6
5
|
from fastapi.middleware.cors import CORSMiddleware
|
7
6
|
from typing import Optional
|
8
7
|
|
9
|
-
from .config import settings
|
10
|
-
from .utils.logging import setup_logger
|
8
|
+
from .config import settings, ensure_config
|
9
|
+
from .utils.logging import setup_logger
|
11
10
|
from .utils.ascii_art import startup_animation
|
12
11
|
from .discovery.resource_tracker import ResourceTracker
|
13
12
|
from .discovery.advertiser import DiscoveryServerAdvertiser
|
14
13
|
from .container import Container
|
15
14
|
from .service import ProviderService
|
16
|
-
|
15
|
+
|
16
|
+
|
17
|
+
logger = setup_logger(__name__)
|
17
18
|
|
18
19
|
app = FastAPI(title="VM on Golem Provider")
|
19
20
|
container = Container()
|
@@ -62,6 +63,7 @@ async def shutdown_event():
|
|
62
63
|
await provider_service.cleanup()
|
63
64
|
|
64
65
|
# Import routes after app creation to avoid circular imports
|
66
|
+
from .api import routes
|
65
67
|
app.include_router(routes.router, prefix="/api/v1")
|
66
68
|
|
67
69
|
# Export app for uvicorn
|
@@ -134,6 +136,7 @@ def print_version(ctx: typer.Context, value: bool):
|
|
134
136
|
def main(
|
135
137
|
version: bool = typer.Option(None, "--version", callback=print_version, is_eager=True, help="Show the version and exit.")
|
136
138
|
):
|
139
|
+
ensure_config()
|
137
140
|
pass
|
138
141
|
|
139
142
|
@cli.command()
|
@@ -152,8 +155,6 @@ def run_server(dev_mode: bool, no_verify_port: bool):
|
|
152
155
|
from pathlib import Path
|
153
156
|
from dotenv import load_dotenv
|
154
157
|
import uvicorn
|
155
|
-
from .utils.logging import setup_logger
|
156
|
-
|
157
158
|
# Load appropriate .env file
|
158
159
|
env_file = ".env.dev" if dev_mode else ".env"
|
159
160
|
env_path = Path(__file__).parent.parent / env_file
|
@@ -69,12 +69,12 @@ class VMService:
|
|
69
69
|
finally:
|
70
70
|
await self.name_mapper.remove_mapping(vm_id)
|
71
71
|
|
72
|
-
async def stop_vm(self, vm_id: str) ->
|
73
|
-
"""Stop a VM."""
|
72
|
+
async def stop_vm(self, vm_id: str) -> VMInfo:
|
73
|
+
"""Stop a VM and return its updated status."""
|
74
74
|
multipass_name = await self.name_mapper.get_multipass_name(vm_id)
|
75
75
|
if not multipass_name:
|
76
76
|
raise VMNotFoundError(f"VM {vm_id} not found")
|
77
|
-
await self.provider.stop_vm(multipass_name)
|
77
|
+
return await self.provider.stop_vm(multipass_name)
|
78
78
|
|
79
79
|
async def list_vms(self) -> List[VMInfo]:
|
80
80
|
"""List all VMs."""
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "golem-vm-provider"
|
3
|
-
version = "0.1.
|
3
|
+
version = "0.1.36"
|
4
4
|
description = "VM on Golem Provider Node - Run your own provider node to offer VMs on the Golem Network"
|
5
5
|
authors = ["Phillip Jensen <phillip+vm-on-golem@golemgrid.com>"]
|
6
6
|
readme = "README.md"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/discovery/golem_base_advertiser.py
RENAMED
File without changes
|
{golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/discovery/golem_base_utils.py
RENAMED
File without changes
|
{golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/discovery/resource_monitor.py
RENAMED
File without changes
|
{golem_vm_provider-0.1.35 → golem_vm_provider-0.1.36}/provider/discovery/resource_tracker.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|