Skip to content

Commit cf1f4c2

Browse files
committed
Create seprate proxmox_zone_info
- Split proxmox_zone and create proxmox_zone_info - Rename variable type to zone_type
1 parent 4693b66 commit cf1f4c2

File tree

2 files changed

+167
-92
lines changed

2 files changed

+167
-92
lines changed

plugins/modules/proxmox_zone.py

Lines changed: 22 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@
99

1010
__metaclass__ = type
1111

12-
# from ansible_collections.community.sap_libs.plugins.modules.sap_control_exec import choices
13-
# from pygments.lexer import default
14-
1512
DOCUMENTATION = r"""
1613
module: proxmox_zone
1714
short_description: Manage Proxmox zone configurations
@@ -166,22 +163,6 @@
166163
"""
167164

168165
EXAMPLES = r"""
169-
- name: Get all zones
170-
community.proxmox.proxmox_zone:
171-
api_user: "root@pam"
172-
api_password: "{{ vault.proxmox.root_password }}"
173-
api_host: "{{ pc.proxmox.api_host }}"
174-
validate_certs: no
175-
176-
- name: Get all simple zones
177-
community.proxmox.proxmox_zone:
178-
api_user: "root@pam"
179-
api_password: "{{ vault.proxmox.root_password }}"
180-
api_host: "{{ pc.proxmox.api_host }}"
181-
validate_certs: no
182-
type: simple
183-
register: zones
184-
185166
- name: create a simple zones
186167
community.proxmox.proxmox_zone:
187168
api_user: "root@pam"
@@ -233,56 +214,13 @@
233214
type: str
234215
sample:
235216
test
236-
zones:
237-
description:
238-
- List of zones.
239-
- If type is passed it'll filter based on type
240-
returned: on success
241-
type: list
242-
elements: dict
243-
sample:
244-
[
245-
{
246-
"digest": "e29dea494461aa699ab3bfb7264d95631c8d0e0d",
247-
"type": "simple",
248-
"zone": "ans1"
249-
},
250-
{
251-
"bridge": "vmbr0",
252-
"digest": "e29dea494461aa699ab3bfb7264d95631c8d0e0d",
253-
"mtu": 1200,
254-
"type": "vlan",
255-
"zone": "ansible"
256-
},
257-
{
258-
"bridge": "vmbr100",
259-
"digest": "e29dea494461aa699ab3bfb7264d95631c8d0e0d",
260-
"ipam": "pve",
261-
"type": "vlan",
262-
"zone": "lab"
263-
},
264-
{
265-
"dhcp": "dnsmasq",
266-
"digest": "e29dea494461aa699ab3bfb7264d95631c8d0e0d",
267-
"ipam": "pve",
268-
"type": "simple",
269-
"zone": "test1"
270-
},
271-
{
272-
"digest": "e29dea494461aa699ab3bfb7264d95631c8d0e0d",
273-
"ipam": "pve",
274-
"type": "simple",
275-
"zone": "tsjsfv"
276-
}
277-
]
278-
279217
"""
280218

281219
from ansible.module_utils.basic import AnsibleModule
220+
from ansible_collections.community.proxmox.plugins.module_utils.proxmox_sdn import ProxmoxSdnAnsible
282221
from ansible_collections.community.proxmox.plugins.module_utils.proxmox import (
283222
proxmox_auth_argument_spec,
284-
ansible_to_proxmox_bool,
285-
ProxmoxAnsible
223+
ansible_to_proxmox_bool
286224
)
287225

288226

@@ -336,21 +274,21 @@ def get_ansible_module():
336274
)
337275

338276

339-
class ProxmoxZoneAnsible(ProxmoxAnsible):
277+
class ProxmoxZoneAnsible(ProxmoxSdnAnsible):
340278
def __init__(self, module):
341279
super(ProxmoxZoneAnsible, self).__init__(module)
342280
self.params = module.params
343281

344282
def validate_params(self):
345-
type = self.params.get('type')
283+
zone_type = self.params.get('type')
346284
if self.params.get('state') in ['present', 'update']:
347-
if type == 'vlan':
285+
if zone_type == 'vlan':
348286
return self.params.get('bridge')
349-
elif type == 'qinq':
287+
elif zone_type == 'qinq':
350288
return self.params.get('tag') and self.params.get('vlan_protocol')
351-
elif type == 'vxlan':
289+
elif zone_type == 'vxlan':
352290
return self.params.get('fabric')
353-
elif type == 'evpn':
291+
elif zone_type == 'evpn':
354292
return self.params.get('controller') and self.params.get('vrf_vxlan')
355293
else:
356294
return True
@@ -360,7 +298,7 @@ def validate_params(self):
360298
def run(self):
361299
state = self.params.get("state")
362300
force = self.params.get("force")
363-
type = self.params['type']
301+
zone_type = self.params.get('type')
364302

365303
if not self.validate_params():
366304
required_params = {
@@ -370,7 +308,7 @@ def run(self):
370308
'evpn': ['controller', 'vrf_vxlan']
371309
}
372310
self.module.fail_json(
373-
msg=f'to create zone of type {type} it needs - {required_params[type]}'
311+
msg=f'to create zone of type {zone_type} it needs - {required_params[zone_type]}'
374312
)
375313

376314
zone_params = {
@@ -419,64 +357,56 @@ def run(self):
419357
)
420358
else:
421359
zones = self.get_zones(
422-
type=self.params.get('type')
360+
zone_type=self.params.get('type')
423361
)
424362
self.module.exit_json(
425363
changed=False, zones=zones, msg="Successfully retrieved zone info."
426364
)
427365

428-
def get_zones(self, type=None):
429-
try:
430-
return self.proxmox_api.cluster().sdn().zones().get(type=type)
431-
except Exception as e:
432-
self.module.fail_json(
433-
msg=f'Failed to retrieve zone information from cluster: {e}'
434-
)
435-
436366
def zone_present(self, force, **kwargs):
437367
available_zones = {x.get('zone'): {'type': x.get('type'), 'digest': x.get('digest')} for x in self.get_zones()}
438-
zone = kwargs.get("zone")
439-
type = kwargs.get("type")
368+
zone_name = kwargs.get("zone")
369+
zone_type = kwargs.get("type")
440370
lock = kwargs.get('lock-token')
441371

442372
# Check if zone already exists
443-
if zone in available_zones.keys() and force:
444-
if type != available_zones[zone]['type']:
373+
if zone_name in available_zones.keys() and force:
374+
if zone_type != available_zones[zone_name]['type']:
445375
self.release_lock(lock)
446376
self.module.fail_json(
447-
msg=f'zone {zone} exists with different type and we cannot change type post fact.'
377+
msg=f'zone {zone_name} exists with different type and we cannot change type post fact.'
448378
)
449379
else:
450380
self.zone_update(**kwargs)
451-
elif zone in available_zones.keys() and not force:
381+
elif zone_name in available_zones.keys() and not force:
452382
self.release_lock(lock)
453383
self.module.exit_json(
454-
changed=False, zone=zone, msg=f'Zone {zone} already exists and force is false!'
384+
changed=False, zone=zone_name, msg=f'Zone {zone_name} already exists and force is false!'
455385
)
456386
else:
457387
try:
458388
self.proxmox_api.cluster().sdn().zones().post(**kwargs)
459389
self.apply_sdn_changes_and_release_lock(lock)
460390
self.module.exit_json(
461-
changed=True, zone=zone, msg=f'Created new Zone - {zone}'
391+
changed=True, zone=zone_name, msg=f'Created new Zone - {zone_name}'
462392
)
463393
except Exception as e:
464394
self.rollback_sdn_changes_and_release_lock(lock)
465395
self.module.fail_json(
466-
msg=f'Failed to create zone {zone}'
396+
msg=f'Failed to create zone {zone_name} - {e}'
467397
)
468398

469399
def zone_update(self, **kwargs):
470400
available_zones = {x.get('zone'): {'type': x.get('type'), 'digest': x.get('digest')} for x in self.get_zones()}
471-
type = kwargs.get("type")
401+
zone_type = kwargs.get("type")
472402
zone_name = kwargs.get("zone")
473403
lock = kwargs.get('lock-token')
474404

475405
try:
476406
# If zone is not present create it
477407
if zone_name not in available_zones.keys():
478408
self.zone_present(force=False, **kwargs)
479-
elif type == available_zones[zone_name]['type']:
409+
elif zone_type == available_zones[zone_name]['type']:
480410
del kwargs['type']
481411
del kwargs['zone']
482412
kwargs['digest'] = available_zones[zone_name]['digest']
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
#!/usr/bin/python
2+
# -*- coding: utf-8 -*-
3+
4+
# Copyright (c) 2025, Jana Hoch <[email protected]>
5+
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
6+
# SPDX-License-Identifier: GPL-3.0-or-later
7+
8+
from __future__ import absolute_import, division, print_function
9+
10+
__metaclass__ = type
11+
12+
DOCUMENTATION = r"""
13+
module: proxmox_zone
14+
short_description: Get Proxmox zone info.
15+
description:
16+
- List all available zones.
17+
author: 'Jana Hoch <[email protected]> (!UNKNOWN)'
18+
options:
19+
type:
20+
description:
21+
- Filter zones on based on type
22+
type: str
23+
choices:
24+
- evpn
25+
- faucet
26+
- qinq
27+
- simple
28+
- vlan
29+
- vxlan
30+
extends_documentation_fragment:
31+
- community.proxmox.proxmox.actiongroup_proxmox
32+
- community.proxmox.proxmox.documentation
33+
- community.proxmox.attributes
34+
- community.proxmox.attributes.info_module
35+
"""
36+
37+
EXAMPLES = r"""
38+
- name: Get all zones
39+
community.proxmox.proxmox_zone_info:
40+
api_user: "root@pam"
41+
api_password: "{{ vault.proxmox.root_password }}"
42+
api_host: "{{ pc.proxmox.api_host }}"
43+
validate_certs: no
44+
45+
- name: Get all simple zones
46+
community.proxmox.proxmox_zone_info:
47+
api_user: "root@pam"
48+
api_password: "{{ vault.proxmox.root_password }}"
49+
api_host: "{{ pc.proxmox.api_host }}"
50+
validate_certs: no
51+
type: simple
52+
register: zones
53+
"""
54+
55+
RETURN = r"""
56+
zones:
57+
description:
58+
- List of zones.
59+
- If type is passed it'll filter based on type
60+
returned: on success
61+
type: list
62+
elements: dict
63+
sample:
64+
[
65+
{
66+
"digest": "e29dea494461aa699ab3bfb7264d95631c8d0e0d",
67+
"type": "simple",
68+
"zone": "ans1"
69+
},
70+
{
71+
"bridge": "vmbr0",
72+
"digest": "e29dea494461aa699ab3bfb7264d95631c8d0e0d",
73+
"mtu": 1200,
74+
"type": "vlan",
75+
"zone": "ansible"
76+
},
77+
{
78+
"bridge": "vmbr100",
79+
"digest": "e29dea494461aa699ab3bfb7264d95631c8d0e0d",
80+
"ipam": "pve",
81+
"type": "vlan",
82+
"zone": "lab"
83+
},
84+
{
85+
"dhcp": "dnsmasq",
86+
"digest": "e29dea494461aa699ab3bfb7264d95631c8d0e0d",
87+
"ipam": "pve",
88+
"type": "simple",
89+
"zone": "test1"
90+
},
91+
{
92+
"digest": "e29dea494461aa699ab3bfb7264d95631c8d0e0d",
93+
"ipam": "pve",
94+
"type": "simple",
95+
"zone": "tsjsfv"
96+
}
97+
]
98+
99+
"""
100+
101+
from ansible.module_utils.basic import AnsibleModule
102+
from ansible_collections.community.proxmox.plugins.module_utils.proxmox_sdn import ProxmoxSdnAnsible
103+
from ansible_collections.community.proxmox.plugins.module_utils.proxmox import proxmox_auth_argument_spec
104+
105+
106+
def get_proxmox_args():
107+
return dict(
108+
type=dict(type='str', choices=["evpn", "faucet", "qinq", "simple", "vlan", "vxlan"], required=False)
109+
)
110+
111+
112+
def get_ansible_module():
113+
module_args = proxmox_auth_argument_spec()
114+
module_args.update(get_proxmox_args())
115+
return AnsibleModule(
116+
argument_spec=module_args,
117+
)
118+
119+
120+
class ProxmoxZoneInfoAnsible(ProxmoxSdnAnsible):
121+
def __init__(self, module):
122+
super(ProxmoxZoneInfoAnsible, self).__init__(module)
123+
self.params = module.params
124+
125+
def run(self):
126+
zones = self.get_zones(
127+
zone_type=self.params.get('type')
128+
)
129+
self.module.exit_json(
130+
changed=False, zones=zones, msg="Successfully retrieved zone info."
131+
)
132+
133+
134+
def main():
135+
module = get_ansible_module()
136+
proxmox = ProxmoxZoneInfoAnsible(module)
137+
138+
try:
139+
proxmox.run()
140+
except Exception as e:
141+
module.fail_json(msg=f'An error occurred: {e}')
142+
143+
144+
if __name__ == "__main__":
145+
main()

0 commit comments

Comments
 (0)