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