Skip to content

Commit 258e1a1

Browse files
JanaHochThulium-Drake
authored andcommitted
proxmox_subnet: New module
- Added method to create subnet
1 parent 80dc876 commit 258e1a1

File tree

1 file changed

+121
-0
lines changed

1 file changed

+121
-0
lines changed

plugins/modules/proxmox_subnet.py

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
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+
from pygments.lexer import default
13+
14+
DOCUMENTATION = r""""""
15+
16+
EXAMPLES = r""""""
17+
18+
RETURN = r""""""
19+
20+
from ansible.module_utils.basic import AnsibleModule
21+
from ansible_collections.community.proxmox.plugins.module_utils.proxmox import (
22+
proxmox_auth_argument_spec,
23+
ansible_to_proxmox_bool,
24+
ProxmoxAnsible
25+
)
26+
27+
def get_proxmox_args():
28+
return dict(
29+
state=dict(type="str", choices=["present", "absent", "update"], default='present', required=False),
30+
force=dict(type="bool", default=False, required=False),
31+
subnet=dict(type="str", required=True),
32+
type=dict(type="str", choices=['subnet'], default='subnet', required=False),
33+
vnet=dict(type="str", required=True),
34+
dhcp_dns_server=dict(type="str", required=False),
35+
dhcp_range=dict(
36+
type='list',
37+
elements='dict',
38+
options=dict(
39+
start=dict(type='str'),
40+
end=dict(type='str')
41+
)
42+
),
43+
dnszoneprefix=dict(type='str', required=False),
44+
gateway=dict(type='str', required=False),
45+
lock_token=dict(type="str", required=False),
46+
snat=dict(type='bool', default=False, required=False),
47+
delete=dict(type="str", required=False)
48+
)
49+
50+
def get_ansible_module():
51+
module_args = proxmox_auth_argument_spec()
52+
module_args.update(get_proxmox_args())
53+
54+
return AnsibleModule(
55+
argument_spec=module_args,
56+
required_if=[
57+
('state', 'present', ['subnet', 'type', 'vnet']),
58+
]
59+
)
60+
61+
class ProxmoxSubnetAnsible(ProxmoxAnsible):
62+
def __init__(self, module):
63+
super(ProxmoxSubnetAnsible, self).__init__(module)
64+
self.params = module.params
65+
66+
def run(self):
67+
state = self.params.get("state")
68+
force = self.params.get("force")
69+
70+
subnet_params = {
71+
'subnet': self.params.get('subnet'),
72+
'type': self.params.get('type'),
73+
'vnet': self.params.get('vnet'),
74+
'dhcp-dns-server': self.params.get('dhcp_dns_server'),
75+
'dhcp-range': self.get_dhcp_range(),
76+
'dnszoneprefix': self.params.get('dnszoneprefix'),
77+
'gateway': self.params.get('gateway'),
78+
'lock-token': self.params.get('lock_token') or self.get_global_sdn_lock(),
79+
'snat': ansible_to_proxmox_bool(self.params.get('snat'))
80+
}
81+
82+
if state == 'present':
83+
self.subnet_present(force=force, **subnet_params)
84+
85+
def get_dhcp_range(self):
86+
if self.params.get('dhcp_range') is None:
87+
return None
88+
dhcp_range = [f"start-address={x['start']},end-address={x['end']}" for x in self.params.get('dhcp_range')]
89+
return dhcp_range
90+
91+
def subnet_present(self, **subnet_params):
92+
vnet_name = subnet_params['vnet']
93+
lock = subnet_params['lock-token']
94+
subnet = subnet_params['subnet']
95+
96+
try:
97+
vnet = getattr(self.proxmox_api.cluster().sdn().vnets(), vnet_name)
98+
vnet.subnets().post(**subnet_params)
99+
self.apply_sdn_changes_and_release_lock(lock=lock)
100+
self.module.exit_json(
101+
changed=True, subnet=subnet, msg=f'Created new subnet {subnet}'
102+
)
103+
except Exception as e:
104+
self.rollback_sdn_changes_and_release_lock(lock=lock)
105+
self.module.fail_json(
106+
msg=f'Failed to create subnet. Rolling back all changes. : {e}'
107+
)
108+
109+
110+
def main():
111+
module = get_ansible_module()
112+
proxmox = ProxmoxSubnetAnsible(module)
113+
114+
try:
115+
proxmox.run()
116+
except Exception as e:
117+
module.fail_json(msg=f'An error occurred: {e}')
118+
119+
120+
if __name__ == "__main__":
121+
main()

0 commit comments

Comments
 (0)