@@ -245,3 +245,67 @@ def get_storage_content(self, node, storage, content=None, vmid=None):
245
245
msg = "Unable to list content on %s, %s for %s and %s: %s"
246
246
% (node , storage , content , vmid , e )
247
247
)
248
+
249
+ def get_global_sdn_lock (self ):
250
+ """Acquire global SDN lock. Needed for any changes under SDN.
251
+
252
+ @return: lock-token
253
+ """
254
+ try :
255
+ return self .proxmox_api .cluster ().sdn ().lock ().post ()
256
+ except Exception as e :
257
+ self .module .fail_json (
258
+ msg = f'Failed to acquire global sdn lock { e } '
259
+ )
260
+
261
+ def apply_sdn_changes_and_release_lock (self , lock , release_lock = True ):
262
+ """Apply all SDN changes done under a lock token.
263
+
264
+ @param lock: Global SDN lock token
265
+ @param release_lock: if True release lock after successfully applying changes
266
+ """
267
+ lock_params = {
268
+ 'lock-token' : lock ,
269
+ 'release-lock' : ansible_to_proxmox_bool (release_lock )
270
+ }
271
+ try :
272
+ self .proxmox_api .cluster ().sdn ().put (** lock_params )
273
+ except Exception as e :
274
+ self .rollback_sdn_changes_and_release_lock (lock )
275
+ self .module .fail_json (
276
+ msg = f'Failed to apply sdn changes { e } . Rolling back all pending changes.'
277
+ )
278
+
279
+ def rollback_sdn_changes_and_release_lock (self , lock , release_lock = True ):
280
+ """Rollback all changes done under a lock token.
281
+
282
+ @param lock: Global SDN lock token
283
+ @param release_lock: if True release lock after successfully rolling back changes
284
+ """
285
+ lock_params = {
286
+ 'lock-token' : lock ,
287
+ 'release-lock' : ansible_to_proxmox_bool (release_lock )
288
+ }
289
+ try :
290
+ self .proxmox_api .cluster ().sdn ().rollback ().post (** lock_params )
291
+ except Exception as e :
292
+ self .module .fail_json (
293
+ msg = f'Rollback attempt failed - { e } . Manually clear lock by deleting /etc/pve/sdn/.lock'
294
+ )
295
+
296
+ def release_lock (self , lock , force = False ):
297
+ """Release lock
298
+
299
+ @param lock: Global SDN lock token
300
+ @param force: if true, allow releasing lock without providing the token
301
+ """
302
+ lock_params = {
303
+ 'lock-token' : lock ,
304
+ 'force' : ansible_to_proxmox_bool (force )
305
+ }
306
+ try :
307
+ self .proxmox_api .cluster ().sdn ().lock ().delete (** lock_params )
308
+ except Exception as e :
309
+ self .module .fail_json (
310
+ msg = f'Failed to release lock - { e } . Manually clear lock by deleting /etc/pve/sdn/.lock'
311
+ )
0 commit comments