golem-vm-provider 0.1.10__py3-none-any.whl → 0.1.13__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.10
3
+ Version: 0.1.13
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
@@ -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=JOzoNf1oE5N97UqTN5xuIrTkqn2tCHqPDaIzGA3jUyo,3513
4
4
  provider/api/routes.py,sha256=P27RQvNqFWn6PacRwr1PaVz-yv5KAWsp9KeORejkXSI,6452
5
- provider/config.py,sha256=vEYg-DxijleAwqfyjCHM6OLK1pmj6hzG75jrHvco3p4,5005
5
+ provider/config.py,sha256=41FhWAzPJrbyu1VJC4YOMLl79RzYmzFpOjEuS2MZSm4,9128
6
6
  provider/discovery/__init__.py,sha256=VR3NRoQtZRH5Vs8FG7jnGLR7p7wn7XeZdLaBb3t8e1g,123
7
7
  provider/discovery/advertiser.py,sha256=yv7RbRf1K43qOLAEa2Olj9hhN8etl2qsBuoHok0xoVs,6784
8
8
  provider/discovery/resource_tracker.py,sha256=8dYhJxoe_jLRwisHoA0jr575YhUKmLIqSXfW88KshcQ,6000
@@ -20,7 +20,7 @@ provider/vm/multipass.py,sha256=RLUqCeoYz4PG8RL7dBu_TzjNEAmgIz9NonBtSuYc4kw,1643
20
20
  provider/vm/name_mapper.py,sha256=MrshNeJ4Dw-WBsyiIVcn9N5xyOxaBKX4Yqhyh_m5IFg,4103
21
21
  provider/vm/port_manager.py,sha256=d03uwU76vx6LgADMN8ffBT9t400XQ3vtYlXr6cLIFN0,9831
22
22
  provider/vm/proxy_manager.py,sha256=cu0FPPbeCc3CR6NRE_CnLjiRg7xVdSFUylVUOL1g1sI,10154
23
- golem_vm_provider-0.1.10.dist-info/METADATA,sha256=QLachbvexsgzxaUKfGG_Ckzme9OJJ2Z4iS4wfUW3lpA,10594
24
- golem_vm_provider-0.1.10.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
25
- golem_vm_provider-0.1.10.dist-info/entry_points.txt,sha256=E4rCWo_Do_2zCG_GewNuftfVlHF_8b_OvioZre0dfeA,54
26
- golem_vm_provider-0.1.10.dist-info/RECORD,,
23
+ golem_vm_provider-0.1.13.dist-info/METADATA,sha256=zaGnsTHOW6OEZAOOpl-a3gchR9ESFbDNNfOR35JJUSQ,10594
24
+ golem_vm_provider-0.1.13.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
25
+ golem_vm_provider-0.1.13.dist-info/entry_points.txt,sha256=E4rCWo_Do_2zCG_GewNuftfVlHF_8b_OvioZre0dfeA,54
26
+ golem_vm_provider-0.1.13.dist-info/RECORD,,
provider/config.py CHANGED
@@ -3,7 +3,10 @@ from pathlib import Path
3
3
  from typing import Optional
4
4
  import uuid
5
5
 
6
- from pydantic import BaseSettings, validator
6
+ from pydantic import BaseSettings, validator, Field
7
+ from .utils.logging import setup_logger
8
+
9
+ logger = setup_logger(__name__)
7
10
 
8
11
 
9
12
  class Settings(BaseSettings):
@@ -88,41 +91,131 @@ class Settings(BaseSettings):
88
91
  RATE_LIMIT_PER_MINUTE: int = 100
89
92
 
90
93
  # Multipass Settings
91
- MULTIPASS_BINARY_PATH: str = ""
94
+ MULTIPASS_BINARY_PATH: str = Field(
95
+ default="",
96
+ description="Path to multipass binary"
97
+ )
92
98
 
93
- @validator("MULTIPASS_BINARY_PATH", pre=True)
99
+ @validator("MULTIPASS_BINARY_PATH")
94
100
  def detect_multipass_path(cls, v: str) -> str:
95
101
  """Detect and validate Multipass binary path."""
102
+ import platform
103
+ import subprocess
104
+
105
+ def validate_path(path: str) -> bool:
106
+ """Validate that a path exists and is executable."""
107
+ return os.path.isfile(path) and os.access(path, os.X_OK)
108
+
109
+ # If path provided via environment variable, ONLY validate that path
96
110
  if v:
97
- path = v
98
- else:
99
- # Common Multipass binary locations
100
- binary_name = "multipass"
111
+ logger.debug(f"Using provided multipass path: {v}")
112
+ if not validate_path(v):
113
+ logger.error(f"Provided path {v} is invalid or not executable")
114
+ raise ValueError(f"Invalid multipass binary path: {v}")
115
+ return v
116
+
117
+ logger.debug("No multipass path provided, attempting auto-detection")
118
+ system = platform.system().lower()
119
+ logger.debug(f"Detected OS: {system}")
120
+ binary_name = "multipass.exe" if system == "windows" else "multipass"
121
+
122
+ # Try to find multipass based on OS
123
+ if system == "linux":
124
+ logger.debug("Checking for snap installation on Linux")
125
+ # First try to find snap and check if multipass is installed
126
+ try:
127
+ # Check if snap exists
128
+ snap_result = subprocess.run(
129
+ ["which", "snap"],
130
+ capture_output=True,
131
+ text=True,
132
+ check=True
133
+ )
134
+ if snap_result.returncode == 0:
135
+ logger.debug("Found snap, checking for multipass installation")
136
+ # Check if multipass is installed via snap
137
+ try:
138
+ snap_list = subprocess.run(
139
+ ["snap", "list", "multipass"],
140
+ capture_output=True,
141
+ text=True,
142
+ check=True
143
+ )
144
+ if snap_list.returncode == 0:
145
+ snap_path = "/snap/bin/multipass"
146
+ if validate_path(snap_path):
147
+ logger.debug(f"Found multipass via snap at {snap_path}")
148
+ return snap_path
149
+ except subprocess.CalledProcessError:
150
+ logger.debug("Multipass not installed via snap")
151
+ pass
152
+ except subprocess.CalledProcessError:
153
+ logger.debug("Snap not found")
154
+ pass
155
+
156
+ # Common Linux paths if snap installation not found
101
157
  search_paths = [
102
- "/usr/local/bin", # Common Unix/Linux
103
- "/usr/bin", # Linux
104
- "/opt/homebrew/bin", # macOS M1 (Homebrew)
105
- "/snap/bin", # Linux (Snap)
158
+ "/usr/local/bin",
159
+ "/usr/bin",
160
+ "/snap/bin"
106
161
  ]
107
-
108
- # Search for multipass binary
109
- for directory in search_paths:
110
- path = os.path.join(directory, binary_name)
111
- if os.path.isfile(path) and os.access(path, os.X_OK):
112
- return path
113
-
162
+ logger.debug(f"Checking common Linux paths: {search_paths}")
163
+
164
+ elif system == "darwin": # macOS
165
+ search_paths = [
166
+ "/opt/homebrew/bin", # M1 Mac
167
+ "/usr/local/bin", # Intel Mac
168
+ "/opt/local/bin" # MacPorts
169
+ ]
170
+ logger.debug(f"Checking macOS paths: {search_paths}")
171
+
172
+ elif system == "windows":
173
+ search_paths = [
174
+ os.path.expandvars(r"%ProgramFiles%\Multipass"),
175
+ os.path.expandvars(r"%ProgramFiles(x86)%\Multipass"),
176
+ os.path.expandvars(r"%LocalAppData%\Multipass")
177
+ ]
178
+ logger.debug(f"Checking Windows paths: {search_paths}")
179
+
180
+ else:
181
+ search_paths = ["/usr/local/bin", "/usr/bin"]
182
+ logger.debug(f"Checking default paths: {search_paths}")
183
+
184
+ # Search for multipass binary in OS-specific paths
185
+ for directory in search_paths:
186
+ path = os.path.join(directory, binary_name)
187
+ logger.debug(f"Checking path: {path}")
188
+ if validate_path(path):
189
+ logger.debug(f"Found valid multipass binary at: {path}")
190
+ return path
191
+ else:
192
+ logger.debug(f"No valid multipass binary at: {path}")
193
+
194
+ # OS-specific installation instructions
195
+ if system == "linux":
196
+ raise ValueError(
197
+ "Multipass binary not found. Please install using:\n"
198
+ "sudo snap install multipass\n"
199
+ "Or set GOLEM_PROVIDER_MULTIPASS_BINARY_PATH to your Multipass binary path."
200
+ )
201
+ elif system == "darwin":
202
+ raise ValueError(
203
+ "Multipass binary not found. Please install using:\n"
204
+ "brew install multipass\n"
205
+ "Or set GOLEM_PROVIDER_MULTIPASS_BINARY_PATH to your Multipass binary path."
206
+ )
207
+ elif system == "windows":
208
+ raise ValueError(
209
+ "Multipass binary not found. Please install from:\n"
210
+ "Microsoft Store or https://multipass.run/download/windows\n"
211
+ "Or set GOLEM_PROVIDER_MULTIPASS_BINARY_PATH to your Multipass binary path."
212
+ )
213
+ else:
114
214
  raise ValueError(
115
215
  "Multipass binary not found. Please install Multipass or set "
116
216
  "GOLEM_PROVIDER_MULTIPASS_BINARY_PATH to your Multipass binary path."
117
217
  )
118
218
 
119
- # Validate the path
120
- if not os.path.isfile(path):
121
- raise ValueError(f"Multipass binary not found at: {path}")
122
- if not os.access(path, os.X_OK):
123
- raise ValueError(f"Multipass binary at {path} is not executable")
124
- return path
125
-
126
219
  # Proxy Settings
127
220
  PORT_RANGE_START: int = 50800
128
221
  PORT_RANGE_END: int = 50900