@@ -56,7 +56,7 @@ def get_ansible_module():
56
56
return AnsibleModule (
57
57
argument_spec = module_args ,
58
58
required_if = [
59
- ('state' , 'present' , ['subnet' , 'type' , 'vnet' ]),
59
+ ('state' , 'present' , ['subnet' , 'type' , 'vnet' , 'zone' ]),
60
60
('state' , 'update' , ['zone' , 'vnet' , 'subnet' ]),
61
61
('state' , 'absent' , ['zone' , 'vnet' , 'subnet' ]),
62
62
]
@@ -84,9 +84,9 @@ def run(self):
84
84
}
85
85
86
86
if state == 'present' :
87
- self .subnet_present (** subnet_params )
87
+ self .subnet_present (force = force , ** subnet_params )
88
88
elif state == 'update' :
89
- self .subnet_update (** subnet_params )
89
+ self .subnet_update (force = force , ** subnet_params )
90
90
elif state == 'absent' :
91
91
self .subnet_absent (** subnet_params )
92
92
@@ -96,44 +96,65 @@ def get_dhcp_range(self):
96
96
dhcp_range = [f"start-address={ x ['start' ]} ,end-address={ x ['end' ]} " for x in self .params .get ('dhcp_range' )]
97
97
return dhcp_range
98
98
99
- def subnet_present (self , ** subnet_params ):
99
+ def subnet_present (self ,force , ** subnet_params ):
100
100
vnet_name = subnet_params ['vnet' ]
101
101
lock = subnet_params ['lock-token' ]
102
102
subnet = subnet_params ['subnet' ]
103
+ subnet_id = f"{ self .params ['zone' ]} -{ subnet_params ['subnet' ].replace ('/' , '-' )} "
103
104
104
105
try :
105
106
vnet = getattr (self .proxmox_api .cluster ().sdn ().vnets (), vnet_name )
106
- vnet .subnets ().post (** subnet_params )
107
- self .apply_sdn_changes_and_release_lock (lock = lock )
108
- self .module .exit_json (
109
- changed = True , subnet = subnet , msg = f'Created new subnet { subnet } '
110
- )
107
+
108
+ # Check if subnet already present
109
+ if subnet_id in [x ['subnet' ] for x in vnet ().subnets ().get ()]:
110
+ if force :
111
+ self .subnet_update (force = False , ** subnet_params )
112
+ else :
113
+ self .release_lock (lock = lock )
114
+ self .module .exit_json (
115
+ changed = False , subnet = subnet_id , msg = f'subnet { subnet_id } already present and force is false.'
116
+ )
117
+ else :
118
+ vnet .subnets ().post (** subnet_params )
119
+ self .apply_sdn_changes_and_release_lock (lock = lock )
120
+ self .module .exit_json (
121
+ changed = True , subnet = subnet_id , msg = f'Created new subnet { subnet } '
122
+ )
111
123
except Exception as e :
112
124
self .rollback_sdn_changes_and_release_lock (lock = lock )
113
125
self .module .fail_json (
114
126
msg = f'Failed to create subnet. Rolling back all changes. : { e } '
115
127
)
116
128
117
- def subnet_update (self , ** subnet_params ):
129
+ def subnet_update (self ,force , ** subnet_params ):
118
130
lock = subnet_params ['lock-token' ]
119
131
vnet_id = subnet_params ['vnet' ]
120
132
subnet_id = f"{ self .params ['zone' ]} -{ subnet_params ['subnet' ].replace ('/' , '-' )} "
121
133
122
- subnet_params ['delete' ] = self .params .get ('delete' )
123
- del subnet_params ['type' ]
124
- del subnet_params ['subnet' ]
125
-
126
134
try :
127
135
vnet = getattr (self .proxmox_api .cluster ().sdn ().vnets (), vnet_id )
128
- subnet = getattr (vnet ().subnets (), subnet_id )
129
136
130
- subnet_params ['digest' ] = subnet .get ()['digest' ]
131
-
132
- subnet .put (** subnet_params )
133
- self .apply_sdn_changes_and_release_lock (lock = lock )
134
- self .module .exit_json (
135
- changed = True , subnet = subnet_id , msg = f'Updated subnet { subnet_id } '
136
- )
137
+ # Check if subnet already present
138
+ if subnet_id in [x ['subnet' ] for x in vnet ().subnets ().get ()]:
139
+ subnet = getattr (vnet ().subnets (), subnet_id )
140
+ subnet_params ['digest' ] = subnet .get ()['digest' ]
141
+ subnet_params ['delete' ] = self .params .get ('delete' )
142
+ del subnet_params ['type' ]
143
+ del subnet_params ['subnet' ]
144
+
145
+ subnet .put (** subnet_params )
146
+ self .apply_sdn_changes_and_release_lock (lock = lock )
147
+ self .module .exit_json (
148
+ changed = True , subnet = subnet_id , msg = f'Updated subnet { subnet_id } '
149
+ )
150
+ else :
151
+ if force :
152
+ self .subnet_present (force = False , ** subnet_params )
153
+ else :
154
+ self .release_lock (lock = lock )
155
+ self .module .exit_json (
156
+ changed = False , subnet = subnet_id , msg = f'subnet { subnet_id } not present and force is false.'
157
+ )
137
158
except Exception as e :
138
159
self .rollback_sdn_changes_and_release_lock (lock = lock )
139
160
self .module .fail_json (
@@ -153,12 +174,20 @@ def subnet_absent(self, **subnet_params):
153
174
154
175
try :
155
176
vnet = getattr (self .proxmox_api .cluster ().sdn ().vnets (), vnet_id )
156
- subnet = getattr (vnet ().subnets (), subnet_id )
157
- subnet .delete (** params )
158
- self .apply_sdn_changes_and_release_lock (lock = lock )
159
- self .module .exit_json (
160
- changed = True , subnet = subnet_id , msg = f'Deleted subnet { subnet_id } '
161
- )
177
+
178
+ # Check if subnet already present
179
+ if subnet_id in [x ['subnet' ] for x in vnet ().subnets ().get ()]:
180
+ subnet = getattr (vnet ().subnets (), subnet_id )
181
+ subnet .delete (** params )
182
+ self .apply_sdn_changes_and_release_lock (lock = lock )
183
+ self .module .exit_json (
184
+ changed = True , subnet = subnet_id , msg = f'Deleted subnet { subnet_id } '
185
+ )
186
+ else :
187
+ self .release_lock (lock = lock )
188
+ self .module .exit_json (
189
+ changed = False , subnet = subnet_id , msg = f'subnet { subnet_id } already not present.'
190
+ )
162
191
except Exception as e :
163
192
self .rollback_sdn_changes_and_release_lock (lock = lock )
164
193
self .module .fail_json (
0 commit comments