Skip to content

Commit 439ed05

Browse files
committed
proxmox_zone: Get lock just before making changes
- also fix minor issues in proxmox_zone,proxmox_zone_info, proxmox_sdn.
1 parent 5741796 commit 439ed05

File tree

3 files changed

+28
-44
lines changed

3 files changed

+28
-44
lines changed

plugins/module_utils/proxmox_sdn.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,8 @@
88

99
__metaclass__ = type
1010

11-
import traceback
1211
from typing import List, Dict
1312

14-
PROXMOXER_IMP_ERR = None
15-
try:
16-
from proxmoxer import ProxmoxAPI
17-
from proxmoxer import __version__ as proxmoxer_version
18-
19-
HAS_PROXMOXER = True
20-
except ImportError:
21-
HAS_PROXMOXER = False
22-
PROXMOXER_IMP_ERR = traceback.format_exc()
23-
2413
from ansible_collections.community.proxmox.plugins.module_utils.proxmox import (
2514
ansible_to_proxmox_bool,
2615
ProxmoxAnsible

plugins/modules/proxmox_zone.py

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111

1212
DOCUMENTATION = r"""
1313
module: proxmox_zone
14-
short_description: Manage Proxmox zone configurations
14+
short_description: Manage Proxmox zone configurations.
1515
description:
16-
- list/create/update/delete proxmox sdn zones
16+
- Create/Update/Delete proxmox sdn zones.
1717
author: 'Jana Hoch <[email protected]> (!UNKNOWN)'
1818
attributes:
1919
check_mode:
@@ -28,10 +28,10 @@
2828
choices:
2929
- present
3030
- absent
31-
- update
31+
default: present
3232
update:
3333
description:
34-
- If state is present and zone exists it'll update.
34+
- If O(state=present) and zone exists it'll update.
3535
type: bool
3636
default: true
3737
type:
@@ -77,11 +77,11 @@
7777
type: bool
7878
dns:
7979
description:
80-
- dns api server.
80+
- DNS api server.
8181
type: str
8282
dnszone:
8383
description:
84-
- dns domain zone.
84+
- DNS domain zone.
8585
type: str
8686
dp_id:
8787
description:
@@ -105,12 +105,7 @@
105105
type: str
106106
ipam:
107107
description:
108-
- use a specific ipam.
109-
type: str
110-
lock_token:
111-
description:
112-
- the token for unlocking the global SDN configuration. If not provided it will generate new token
113-
- If the playbook fails for some reason you can manually clear lock token by deleting `/etc/pve/sdn/.lock`
108+
- Use a specific ipam.
114109
type: str
115110
mac:
116111
description:
@@ -214,7 +209,7 @@
214209

215210
def get_proxmox_args():
216211
return dict(
217-
state=dict(type="str", choices=["present", "absent"], required=True),
212+
state=dict(type="str", default="present", choices=["present", "absent"]),
218213
update=dict(type="bool", default=True),
219214
type=dict(type="str",
220215
choices=["evpn", "faucet", "qinq", "simple", "vlan", "vxlan"],
@@ -234,7 +229,6 @@ def get_proxmox_args():
234229
exitnodes_primary=dict(type="str", required=False),
235230
fabric=dict(type="str", required=False),
236231
ipam=dict(type="str", required=False),
237-
lock_token=dict(type="str", required=False, no_log=False),
238232
mac=dict(type="str", required=False),
239233
mtu=dict(type="int", required=False),
240234
nodes=dict(type="str", required=False),
@@ -316,7 +310,7 @@ def run(self):
316310
"exitnodes-primary": self.params.get("exitnodes_primary"),
317311
"fabric": self.params.get("fabric"),
318312
"ipam": self.params.get("ipam"),
319-
"lock-token": self.params.get("lock_token"),
313+
"lock-token": None,
320314
"mac": self.params.get("mac"),
321315
"mtu": self.params.get("mtu"),
322316
"nodes": self.params.get("nodes"),
@@ -329,9 +323,6 @@ def run(self):
329323
"vxlan-port": self.params.get("vxlan_port"),
330324
}
331325

332-
if zone_params['lock-token'] is None and state is not None:
333-
zone_params['lock-token'] = self.get_global_sdn_lock()
334-
335326
if state == "present":
336327
self.zone_present(update, **zone_params)
337328

@@ -345,67 +336,70 @@ def zone_present(self, update, **kwargs):
345336
available_zones = {x.get('zone'): {'type': x.get('type'), 'digest': x.get('digest')} for x in self.get_zones()}
346337
zone_name = kwargs.get("zone")
347338
zone_type = kwargs.get("type")
348-
lock = kwargs.get('lock-token')
349339

350340
# Check if zone already exists
351341
if zone_name in available_zones.keys() and update:
352342
if zone_type != available_zones[zone_name]['type']:
353-
self.release_lock(lock)
354343
self.module.fail_json(
355344
msg=f'zone {zone_name} exists with different type and we cannot change type post fact.'
356345
)
357346
else:
358347
try:
348+
kwargs['lock-token'] = self.get_global_sdn_lock()
359349
kwargs['digest'] = available_zones[zone_name]['digest']
350+
del kwargs['zone']
351+
del kwargs['type']
352+
360353
zone = getattr(self.proxmox_api.cluster().sdn().zones(), zone_name)
361354
zone.put(**kwargs)
362-
self.apply_sdn_changes_and_release_lock(lock)
355+
self.apply_sdn_changes_and_release_lock(kwargs['lock-token'])
363356
self.module.exit_json(
364357
changed=True, zone=zone_name, msg=f'Updated zone - {zone_name}'
365358
)
366359
except Exception as e:
367-
self.rollback_sdn_changes_and_release_lock(lock)
360+
self.rollback_sdn_changes_and_release_lock(kwargs['lock-token'])
368361
self.module.fail_json(
369362
msg=f'Failed to update zone {zone_name} - {e}'
370363
)
371364

372365
elif zone_name in available_zones.keys() and not update:
373-
self.release_lock(lock)
374366
self.module.exit_json(
375-
changed=False, zone=zone_name, msg=f'Zone {zone_name} already exists and force is false!'
367+
changed=False, zone=zone_name, msg=f'Zone {zone_name} already exists and update is false!'
376368
)
377369
else:
378370
try:
371+
kwargs['lock-token'] = self.get_global_sdn_lock()
372+
379373
self.proxmox_api.cluster().sdn().zones().post(**kwargs)
380-
self.apply_sdn_changes_and_release_lock(lock)
374+
self.apply_sdn_changes_and_release_lock(kwargs['lock-token'])
381375
self.module.exit_json(
382376
changed=True, zone=zone_name, msg=f'Created new Zone - {zone_name}'
383377
)
384378
except Exception as e:
385-
self.rollback_sdn_changes_and_release_lock(lock)
379+
self.rollback_sdn_changes_and_release_lock(kwargs['lock-token'])
386380
self.module.fail_json(
387381
msg=f'Failed to create zone {zone_name} - {e}'
388382
)
389383

390-
def zone_absent(self, zone_name, lock):
384+
def zone_absent(self, zone_name, lock=None):
391385
available_zones = [x.get('zone') for x in self.get_zones()]
392386
params = {'lock-token': lock}
393387

394388
try:
395389
if zone_name not in available_zones:
396-
self.release_lock(lock)
397390
self.module.exit_json(
398-
changed=False, zone=zone_name, msg=f"zone {zone_name} already doesn't exist."
391+
changed=False, zone=zone_name, msg=f"zone {zone_name} is absent."
399392
)
400393
else:
394+
params['lock-token'] = self.get_global_sdn_lock()
401395
zone = getattr(self.proxmox_api.cluster().sdn().zones(), zone_name)
402396
zone.delete(**params)
403-
self.apply_sdn_changes_and_release_lock(lock)
397+
self.apply_sdn_changes_and_release_lock(params['lock-token'])
404398
self.module.exit_json(
405399
changed=True, zone=zone_name, msg=f'Successfully deleted zone {zone_name}'
406400
)
407401
except Exception as e:
408-
self.rollback_sdn_changes_and_release_lock(lock)
402+
self.rollback_sdn_changes_and_release_lock(params['lock-token'])
409403
self.module.fail_json(
410404
msg=f'Failed to delete zone {zone_name} {e}. Rolling back all pending changes.'
411405
)

plugins/modules/proxmox_zone_info.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@
1010
__metaclass__ = type
1111

1212
DOCUMENTATION = r"""
13-
module: proxmox_zone
13+
module: proxmox_zone_info
1414
short_description: Get Proxmox zone info.
1515
description:
1616
- List all available zones.
1717
author: 'Jana Hoch <[email protected]> (!UNKNOWN)'
1818
options:
1919
type:
2020
description:
21-
- Filter zones on based on type
21+
- Filter zones on based on type.
2222
type: str
2323
choices:
2424
- evpn
@@ -114,6 +114,7 @@ def get_ansible_module():
114114
module_args.update(get_proxmox_args())
115115
return AnsibleModule(
116116
argument_spec=module_args,
117+
supports_check_mode=True,
117118
)
118119

119120

0 commit comments

Comments
 (0)