golem-vm-provider 0.1.0__py3-none-any.whl → 0.1.1__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.
- {golem_vm_provider-0.1.0.dist-info → golem_vm_provider-0.1.1.dist-info}/METADATA +1 -1
- {golem_vm_provider-0.1.0.dist-info → golem_vm_provider-0.1.1.dist-info}/RECORD +5 -5
- provider/main.py +124 -1
- {golem_vm_provider-0.1.0.dist-info → golem_vm_provider-0.1.1.dist-info}/WHEEL +0 -0
- {golem_vm_provider-0.1.0.dist-info → golem_vm_provider-0.1.1.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: golem-vm-provider
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.1
|
4
4
|
Summary: VM on Golem Provider Node - Run your own provider node to offer VMs on the Golem Network
|
5
5
|
Home-page: https://github.com/cryptobench/vm-on-golem
|
6
6
|
Keywords: golem,vm,provider,cloud,decentralized
|
@@ -6,7 +6,7 @@ provider/config.py,sha256=Q6xmU6cPRBUYkVusv-Fc1U4ekr4OYLXfOfEtaWL9miM,5000
|
|
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
|
9
|
-
provider/main.py,sha256=
|
9
|
+
provider/main.py,sha256=A5qWwO0LQrfz6aaHDXPEluYgSsS1bDH_fQ9iYHk1kds,8992
|
10
10
|
provider/network/port_verifier.py,sha256=0ku_wa8QlQKjrHQd2Ih2G0kUZX4d87WDIzmiZMR7Uqc,12183
|
11
11
|
provider/security/ethereum.py,sha256=SDRDbcjynbVy44kNnxlDcYLL0BZ3Qnc0DvmneQ-WKLE,1383
|
12
12
|
provider/utils/ascii_art.py,sha256=ykBFsztk57GIiz1NJ-EII5UvN74iECqQL4h9VmiW6Z8,3161
|
@@ -20,7 +20,7 @@ provider/vm/multipass.py,sha256=kS0HkKZT6--YEjxxdr4Ot0oF24T128hLrq-STKsuCK4,1640
|
|
20
20
|
provider/vm/name_mapper.py,sha256=MrshNeJ4Dw-WBsyiIVcn9N5xyOxaBKX4Yqhyh_m5IFg,4103
|
21
21
|
provider/vm/port_manager.py,sha256=UeAp64UQXy-yxt-xGOB4aJkctFTLxDyouuwX5twhJpI,7428
|
22
22
|
provider/vm/proxy_manager.py,sha256=UEoxpkqtyreqB4ypvIi190Xnr6WYbiID4v50xooKezs,9130
|
23
|
-
golem_vm_provider-0.1.
|
24
|
-
golem_vm_provider-0.1.
|
25
|
-
golem_vm_provider-0.1.
|
26
|
-
golem_vm_provider-0.1.
|
23
|
+
golem_vm_provider-0.1.1.dist-info/METADATA,sha256=ZlaXgpdjp7hcUMsoR0C9RDnxUPYdzdY-WL-EIhh3Evo,10449
|
24
|
+
golem_vm_provider-0.1.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
25
|
+
golem_vm_provider-0.1.1.dist-info/entry_points.txt,sha256=E4rCWo_Do_2zCG_GewNuftfVlHF_8b_OvioZre0dfeA,54
|
26
|
+
golem_vm_provider-0.1.1.dist-info/RECORD,,
|
provider/main.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import asyncio
|
2
|
+
import os
|
2
3
|
from fastapi import FastAPI
|
3
4
|
from typing import Optional
|
4
5
|
|
@@ -122,4 +123,126 @@ from .api import routes
|
|
122
123
|
app.include_router(routes.router, prefix="/api/v1")
|
123
124
|
|
124
125
|
# Export app for uvicorn
|
125
|
-
__all__ = ["app"]
|
126
|
+
__all__ = ["app", "start"]
|
127
|
+
|
128
|
+
def check_requirements():
|
129
|
+
"""Check if all requirements are met."""
|
130
|
+
import os
|
131
|
+
from pathlib import Path
|
132
|
+
|
133
|
+
# Check if multipass is installed
|
134
|
+
multipass_path = os.environ.get('GOLEM_PROVIDER_MULTIPASS_BINARY_PATH', '/usr/local/bin/multipass')
|
135
|
+
if not Path(multipass_path).exists():
|
136
|
+
logger.error(f"Multipass binary not found at {multipass_path}")
|
137
|
+
return False
|
138
|
+
|
139
|
+
# Check required directories
|
140
|
+
vm_data_dir = os.environ.get(
|
141
|
+
'GOLEM_PROVIDER_VM_DATA_DIR',
|
142
|
+
str(Path.home() / '.golem' / 'provider' / 'vms')
|
143
|
+
)
|
144
|
+
ssh_key_dir = os.environ.get(
|
145
|
+
'GOLEM_PROVIDER_SSH_KEY_DIR',
|
146
|
+
str(Path.home() / '.golem' / 'provider' / 'ssh')
|
147
|
+
)
|
148
|
+
proxy_state_dir = os.environ.get(
|
149
|
+
'GOLEM_PROVIDER_PROXY_STATE_DIR',
|
150
|
+
str(Path.home() / '.golem' / 'provider' / 'proxy')
|
151
|
+
)
|
152
|
+
|
153
|
+
try:
|
154
|
+
# Create and secure directories
|
155
|
+
for directory in [vm_data_dir, ssh_key_dir, proxy_state_dir]:
|
156
|
+
path = Path(directory)
|
157
|
+
path.mkdir(parents=True, exist_ok=True)
|
158
|
+
if directory == ssh_key_dir:
|
159
|
+
path.chmod(0o700) # Secure permissions for SSH keys
|
160
|
+
except Exception as e:
|
161
|
+
logger.error(f"Failed to create required directories: {e}")
|
162
|
+
return False
|
163
|
+
|
164
|
+
return True
|
165
|
+
|
166
|
+
async def verify_ports():
|
167
|
+
"""Verify port accessibility before starting server."""
|
168
|
+
from .vm.port_manager import PortManager
|
169
|
+
from .utils.port_display import PortVerificationDisplay
|
170
|
+
from .config import settings
|
171
|
+
|
172
|
+
display = PortVerificationDisplay(
|
173
|
+
provider_port=settings.PORT,
|
174
|
+
port_range_start=settings.PORT_RANGE_START,
|
175
|
+
port_range_end=settings.PORT_RANGE_END
|
176
|
+
)
|
177
|
+
display.print_header()
|
178
|
+
|
179
|
+
# Initialize port manager
|
180
|
+
logger.process("🔄 Verifying port accessibility...")
|
181
|
+
port_manager = PortManager(
|
182
|
+
start_port=settings.PORT_RANGE_START,
|
183
|
+
end_port=settings.PORT_RANGE_END,
|
184
|
+
discovery_port=settings.PORT
|
185
|
+
)
|
186
|
+
if not await port_manager.initialize():
|
187
|
+
logger.error("Port verification failed. Please ensure:")
|
188
|
+
logger.error(f"1. Port {settings.PORT} is accessible for provider access")
|
189
|
+
logger.error(f"2. Some ports in range {settings.PORT_RANGE_START}-{settings.PORT_RANGE_END} are accessible for VM access")
|
190
|
+
logger.error("3. Your firewall/router is properly configured")
|
191
|
+
return False
|
192
|
+
|
193
|
+
logger.success(f"✅ Port verification successful - {len(port_manager.verified_ports)} ports available")
|
194
|
+
return True
|
195
|
+
|
196
|
+
def start():
|
197
|
+
"""Start the provider server."""
|
198
|
+
import sys
|
199
|
+
import asyncio
|
200
|
+
from pathlib import Path
|
201
|
+
from dotenv import load_dotenv
|
202
|
+
import uvicorn
|
203
|
+
from .utils.logging import setup_logger
|
204
|
+
from .config import settings
|
205
|
+
|
206
|
+
# Configure logging with debug mode
|
207
|
+
logger = setup_logger(__name__, debug=True)
|
208
|
+
|
209
|
+
try:
|
210
|
+
# Load environment variables from .env file
|
211
|
+
env_path = Path(__file__).parent.parent / '.env'
|
212
|
+
load_dotenv(dotenv_path=env_path)
|
213
|
+
|
214
|
+
# Log environment variables
|
215
|
+
logger.info("Environment variables:")
|
216
|
+
for key, value in os.environ.items():
|
217
|
+
if key.startswith('GOLEM_PROVIDER_'):
|
218
|
+
logger.info(f"{key}={value}")
|
219
|
+
|
220
|
+
# Check requirements
|
221
|
+
if not check_requirements():
|
222
|
+
logger.error("Requirements check failed")
|
223
|
+
sys.exit(1)
|
224
|
+
|
225
|
+
# Verify ports before starting server
|
226
|
+
if not asyncio.run(verify_ports()):
|
227
|
+
logger.error("Port verification failed")
|
228
|
+
sys.exit(1)
|
229
|
+
|
230
|
+
# Configure uvicorn logging
|
231
|
+
log_config = uvicorn.config.LOGGING_CONFIG
|
232
|
+
log_config["formatters"]["access"]["fmt"] = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
233
|
+
|
234
|
+
# Run server
|
235
|
+
logger.process(f"🚀 Starting provider server on {settings.HOST}:{settings.PORT}")
|
236
|
+
uvicorn.run(
|
237
|
+
"provider:app",
|
238
|
+
host=settings.HOST,
|
239
|
+
port=settings.PORT,
|
240
|
+
reload=settings.DEBUG,
|
241
|
+
log_level="info" if not settings.DEBUG else "debug",
|
242
|
+
log_config=log_config,
|
243
|
+
timeout_keep_alive=60, # Increase keep-alive timeout
|
244
|
+
limit_concurrency=100, # Limit concurrent connections
|
245
|
+
)
|
246
|
+
except Exception as e:
|
247
|
+
logger.error(f"Failed to start provider server: {e}")
|
248
|
+
sys.exit(1)
|
File without changes
|
File without changes
|