golem-vm-provider 0.1.19__py3-none-any.whl → 0.1.20__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.19.dist-info → golem_vm_provider-0.1.20.dist-info}/METADATA +1 -1
- {golem_vm_provider-0.1.19.dist-info → golem_vm_provider-0.1.20.dist-info}/RECORD +6 -6
- provider/vm/multipass.py +4 -1
- provider/vm/proxy_manager.py +32 -23
- {golem_vm_provider-0.1.19.dist-info → golem_vm_provider-0.1.20.dist-info}/WHEEL +0 -0
- {golem_vm_provider-0.1.19.dist-info → golem_vm_provider-0.1.20.dist-info}/entry_points.txt +0 -0
@@ -17,11 +17,11 @@ provider/utils/setup.py,sha256=Z5dLuBQkb5vdoQsu1HJZwXmu9NWsiBYJ7Vq9-C-_tY8,2932
|
|
17
17
|
provider/vm/__init__.py,sha256=JGs50tUmzOR1rQ_w4fMY_3XWylmiA1G7KKWZkVw51mY,501
|
18
18
|
provider/vm/cloud_init.py,sha256=E5dDH7dqStRcJNDfbarBBe83-c9N63W8B5ycIrHI8eU,4627
|
19
19
|
provider/vm/models.py,sha256=zkfvP5Z50SPDNajwZTt9NTDIMRQIsZLvSOsuirHEcJM,6256
|
20
|
-
provider/vm/multipass.py,sha256=
|
20
|
+
provider/vm/multipass.py,sha256=RufJbl39d_mEXruX0gX1zCmEEiQ_DytPXgW6F1qVQaM,16667
|
21
21
|
provider/vm/name_mapper.py,sha256=MrshNeJ4Dw-WBsyiIVcn9N5xyOxaBKX4Yqhyh_m5IFg,4103
|
22
22
|
provider/vm/port_manager.py,sha256=d03uwU76vx6LgADMN8ffBT9t400XQ3vtYlXr6cLIFN0,9831
|
23
|
-
provider/vm/proxy_manager.py,sha256=
|
24
|
-
golem_vm_provider-0.1.
|
25
|
-
golem_vm_provider-0.1.
|
26
|
-
golem_vm_provider-0.1.
|
27
|
-
golem_vm_provider-0.1.
|
23
|
+
provider/vm/proxy_manager.py,sha256=ZrLm6S6aaCvmwYmqd_9ne1_3T7M8qxoNDdAtYX8ZDRE,11704
|
24
|
+
golem_vm_provider-0.1.20.dist-info/METADATA,sha256=jKbkVW9HxnSHl7I0qGSFqV799kPjq7LGv54HwHJBRx0,10594
|
25
|
+
golem_vm_provider-0.1.20.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
|
26
|
+
golem_vm_provider-0.1.20.dist-info/entry_points.txt,sha256=E4rCWo_Do_2zCG_GewNuftfVlHF_8b_OvioZre0dfeA,54
|
27
|
+
golem_vm_provider-0.1.20.dist-info/RECORD,,
|
provider/vm/multipass.py
CHANGED
@@ -37,8 +37,11 @@ class MultipassProvider(VMProvider):
|
|
37
37
|
self.vm_data_dir.mkdir(parents=True, exist_ok=True)
|
38
38
|
|
39
39
|
# Initialize managers
|
40
|
-
self.proxy_manager = PythonProxyManager(port_manager=port_manager)
|
41
40
|
self.name_mapper = VMNameMapper(self.vm_data_dir / "vm_names.json")
|
41
|
+
self.proxy_manager = PythonProxyManager(
|
42
|
+
port_manager=port_manager,
|
43
|
+
name_mapper=self.name_mapper
|
44
|
+
)
|
42
45
|
|
43
46
|
def _verify_installation(self) -> None:
|
44
47
|
"""Verify multipass is installed and get version."""
|
provider/vm/proxy_manager.py
CHANGED
@@ -147,17 +147,20 @@ class PythonProxyManager:
|
|
147
147
|
def __init__(
|
148
148
|
self,
|
149
149
|
port_manager: PortManager,
|
150
|
+
name_mapper: "VMNameMapper",
|
150
151
|
state_file: Optional[str] = None
|
151
152
|
):
|
152
153
|
"""Initialize the proxy manager.
|
153
154
|
|
154
155
|
Args:
|
155
156
|
port_manager: Port allocation manager
|
157
|
+
name_mapper: VM name mapping manager
|
156
158
|
state_file: Path to persist proxy state
|
157
159
|
"""
|
158
160
|
self.port_manager = port_manager
|
161
|
+
self.name_mapper = name_mapper
|
159
162
|
self.state_file = state_file or os.path.expanduser("~/.golem/provider/proxy_state.json")
|
160
|
-
self._proxies: Dict[str, ProxyServer] = {} #
|
163
|
+
self._proxies: Dict[str, ProxyServer] = {} # multipass_name -> ProxyServer
|
161
164
|
# Note: _load_state is now async and will be called explicitly during provider setup
|
162
165
|
|
163
166
|
async def _load_state(self) -> None:
|
@@ -169,14 +172,19 @@ class PythonProxyManager:
|
|
169
172
|
state = json.load(f)
|
170
173
|
# Restore proxy servers from saved state
|
171
174
|
restore_tasks = []
|
172
|
-
for
|
173
|
-
#
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
175
|
+
for requestor_name, proxy_info in state.items():
|
176
|
+
# Get current multipass name for the requestor's VM
|
177
|
+
multipass_name = await self.name_mapper.get_multipass_name(requestor_name)
|
178
|
+
if multipass_name:
|
179
|
+
# Create task to restore proxy
|
180
|
+
task = self.add_vm(
|
181
|
+
vm_id=multipass_name, # Use multipass name for internal tracking
|
182
|
+
vm_ip=proxy_info['target'],
|
183
|
+
port=proxy_info['port']
|
184
|
+
)
|
185
|
+
restore_tasks.append(task)
|
186
|
+
else:
|
187
|
+
logger.warning(f"No multipass name found for requestor VM {requestor_name}")
|
180
188
|
|
181
189
|
# Wait for all proxies to be restored
|
182
190
|
if restore_tasks:
|
@@ -186,16 +194,17 @@ class PythonProxyManager:
|
|
186
194
|
except Exception as e:
|
187
195
|
logger.error(f"Failed to load proxy state: {e}")
|
188
196
|
|
189
|
-
def _save_state(self) -> None:
|
190
|
-
"""Save current proxy state to file."""
|
197
|
+
async def _save_state(self) -> None:
|
198
|
+
"""Save current proxy state to file using requestor names."""
|
191
199
|
try:
|
192
|
-
state = {
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
200
|
+
state = {}
|
201
|
+
for multipass_name, proxy in self._proxies.items():
|
202
|
+
requestor_name = await self.name_mapper.get_requestor_name(multipass_name)
|
203
|
+
if requestor_name:
|
204
|
+
state[requestor_name] = {
|
205
|
+
'port': proxy.listen_port,
|
206
|
+
'target': proxy.target_host
|
207
|
+
}
|
199
208
|
os.makedirs(os.path.dirname(self.state_file), exist_ok=True)
|
200
209
|
with open(self.state_file, 'w') as f:
|
201
210
|
json.dump(state, f)
|
@@ -206,7 +215,7 @@ class PythonProxyManager:
|
|
206
215
|
"""Add proxy configuration for a new VM.
|
207
216
|
|
208
217
|
Args:
|
209
|
-
vm_id: Unique identifier for the VM
|
218
|
+
vm_id: Unique identifier for the VM (multipass name)
|
210
219
|
vm_ip: IP address of the VM
|
211
220
|
port: Optional specific port to use, if not provided one will be allocated
|
212
221
|
|
@@ -226,7 +235,7 @@ class PythonProxyManager:
|
|
226
235
|
await proxy.start()
|
227
236
|
|
228
237
|
self._proxies[vm_id] = proxy
|
229
|
-
self._save_state()
|
238
|
+
await self._save_state()
|
230
239
|
|
231
240
|
logger.info(f"Started proxy for VM {vm_id} on port {port}")
|
232
241
|
return True
|
@@ -242,14 +251,14 @@ class PythonProxyManager:
|
|
242
251
|
"""Remove proxy configuration for a VM.
|
243
252
|
|
244
253
|
Args:
|
245
|
-
vm_id: Unique identifier for the VM
|
254
|
+
vm_id: Unique identifier for the VM (multipass name)
|
246
255
|
"""
|
247
256
|
try:
|
248
257
|
if vm_id in self._proxies:
|
249
258
|
proxy = self._proxies.pop(vm_id)
|
250
259
|
await proxy.stop()
|
251
260
|
self.port_manager.deallocate_port(vm_id)
|
252
|
-
self._save_state()
|
261
|
+
await self._save_state()
|
253
262
|
logger.info(f"Removed proxy for VM {vm_id}")
|
254
263
|
except Exception as e:
|
255
264
|
logger.error(f"Failed to remove proxy for VM {vm_id}: {e}")
|
@@ -270,7 +279,7 @@ class PythonProxyManager:
|
|
270
279
|
cleanup_errors.append(f"Failed to remove proxy for VM {vm_id}: {e}")
|
271
280
|
|
272
281
|
try:
|
273
|
-
self._save_state()
|
282
|
+
await self._save_state()
|
274
283
|
except Exception as e:
|
275
284
|
cleanup_errors.append(f"Failed to save state: {e}")
|
276
285
|
|
File without changes
|
File without changes
|