Skip to content

Commit 60f2422

Browse files
committed
proxmox_vnet: New modules. Implemnted create vnet
1 parent 0d15777 commit 60f2422

File tree

1 file changed

+134
-0
lines changed

1 file changed

+134
-0
lines changed

plugins/modules/proxmox_vnet.py

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
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"], required=False),
30+
force=dict(type="bool", default=False, required=False),
31+
vnet=dict(type="str", required=False),
32+
zone=dict(type="str", required=False),
33+
alias=dict(type="str", required=False),
34+
isolate_ports=dict(type="bool", default=False, required=False),
35+
lock_token=dict(type="str", required=False),
36+
tag=dict(type="int", required=False),
37+
type=dict(type="str", choices=['vnet'], required=False),
38+
vlanaware=dict(type="str", required=False)
39+
)
40+
41+
def get_ansible_module():
42+
module_args = proxmox_auth_argument_spec()
43+
module_args.update(get_proxmox_args())
44+
45+
return AnsibleModule(
46+
argument_spec=module_args,
47+
required_if=[
48+
]
49+
)
50+
51+
class ProxmoxVnetAnsible(ProxmoxAnsible):
52+
def __init__(self, module):
53+
super(ProxmoxVnetAnsible, self).__init__(module)
54+
self.params = module.params
55+
56+
def run(self):
57+
state = self.params.get("state")
58+
force = self.params.get("force")
59+
60+
vnet_params = {
61+
'vnet': self.params.get('vnet'),
62+
'zone': self.params.get('zone'),
63+
'alias': self.params.get('alias'),
64+
'isolate-ports': ansible_to_proxmox_bool(self.params.get('isolate_ports')),
65+
'lock-token': self.params.get('lock_token') or self.get_global_sdn_lock(),
66+
'tag': self.params.get('tag'),
67+
'type': self.params.get('type'),
68+
'vlanaware': self.params.get('vlanaware')
69+
}
70+
71+
if state == 'present':
72+
self.vnet_present(force=force, **vnet_params)
73+
elif state == 'update':
74+
self.vnet_update(
75+
76+
)
77+
elif state == 'absent':
78+
self.vnet_absent(
79+
80+
)
81+
82+
def get_vnet_detail(self):
83+
try:
84+
return self.proxmox_api.cluster().sdn().vnets().get()
85+
except Exception as e:
86+
self.module.fail_json(
87+
msg=f'Failed to retrieve vnet information from cluster: {e}'
88+
)
89+
90+
def vnet_present(self, force, **vnet_args):
91+
vnet = vnet_args['vnet']
92+
lock = vnet_args['lock-token']
93+
available_vnets = [vnet['vnet'] for vnet in self.get_vnet_detail()]
94+
95+
# Check if vnet already exists
96+
if vnet in available_vnets:
97+
if force:
98+
self.vnet_update(force=force, **vnet_args)
99+
else:
100+
self.release_lock(lock)
101+
self.module.fail_json(
102+
msg=f'vnet {vnet} already exists and force is false.'
103+
)
104+
else:
105+
try:
106+
self.proxmox_api.cluster().sdn().vnets().post(**vnet_args)
107+
self.apply_sdn_changes_and_release_lock(lock)
108+
self.module.exit_json(
109+
changed=True, vnet=vnet, msg=f'Create new vnet {vnet}'
110+
)
111+
except Exception as e:
112+
self.rollback_sdn_changes_and_release_lock(lock)
113+
self.module.fail_json(
114+
msg=f'Failed to create vnet - {e}. Rolling back all changes.'
115+
)
116+
117+
def vnet_update(self):
118+
pass
119+
120+
def vnet_absent(self):
121+
pass
122+
123+
124+
def main():
125+
module = get_ansible_module()
126+
proxmox = ProxmoxVnetAnsible(module)
127+
128+
try:
129+
proxmox.run()
130+
except Exception as e:
131+
module.fail_json(msg=f'An error occurred: {e}')
132+
133+
if __name__ == "__main__":
134+
main()

0 commit comments

Comments
 (0)