@@ -92,6 +92,7 @@ def __init__(
9292 self .set_ipv4 = set_ipv4
9393 self .set_ipv6 = set_ipv6
9494 self .max_unavailable = max_unavailable
95+ self .res = None
9596 if self .node_selector :
9697 self ._node_selector = {
9798 f"{ self .ApiGroup .KUBERNETES_IO } /hostname" : self .node_selector
@@ -118,21 +119,28 @@ def set_interface(self, interface):
118119 self .desired_state ["interfaces" ] = interfaces
119120
120121 def to_dict (self ):
121- res = super ().to_dict ()
122+ self . res = super ().to_dict ()
122123 if self .yaml_file :
123- return res
124+ return self . res
124125
125126 if self .dns_resolver or self .routes or self .iface :
126- res .setdefault ("spec" , {}).setdefault ("desiredState" , {})
127+ self . res .setdefault ("spec" , {}).setdefault ("desiredState" , {})
127128
128129 if self ._node_selector :
129- res .setdefault ("spec" , {}).setdefault ("nodeSelector" , self ._node_selector )
130+ self .res .setdefault ("spec" , {}).setdefault (
131+ "nodeSelector" , self ._node_selector
132+ )
130133
131134 if self .dns_resolver :
132- res ["spec" ]["desiredState" ]["dns-resolver" ] = self .dns_resolver
135+ self . res ["spec" ]["desiredState" ]["dns-resolver" ] = self .dns_resolver
133136
134137 if self .routes :
135- res ["spec" ]["desiredState" ]["routes" ] = self .routes
138+ self .res ["spec" ]["desiredState" ]["routes" ] = self .routes
139+
140+ if self .max_unavailable :
141+ self .res .setdefault ("spec" , {}).setdefault (
142+ "maxUnavailable" , self .max_unavailable
143+ )
136144
137145 if self .iface :
138146 """
@@ -141,30 +149,65 @@ def to_dict(self):
141149 is a valid desired state and therefore not blocked in the code, but nmstate would
142150 reject it. Such configuration might be used for negative tests.
143151 """
144- if self .set_ipv4 :
145- self .iface ["ipv4" ] = {
146- "enabled" : self .ipv4_enable ,
147- "dhcp" : self .ipv4_dhcp ,
148- "auto-dns" : self .ipv4_auto_dns ,
149- }
150- if self .ipv4_addresses :
151- self .iface ["ipv4" ]["address" ] = self .ipv4_addresses
152+ self .res = self .add_interface (
153+ iface = self .iface ,
154+ state = self .Interface .State .UP ,
155+ set_ipv4 = self .set_ipv4 ,
156+ ipv4_enable = self .ipv4_enable ,
157+ ipv4_dhcp = self .ipv4_dhcp ,
158+ ipv4_auto_dns = self .ipv4_auto_dns ,
159+ ipv4_addresses = self .ipv4_addresses ,
160+ set_ipv6 = self .set_ipv6 ,
161+ ipv6_enable = self .ipv6_enable ,
162+ )
152163
153- if self .set_ipv6 :
154- self .iface ["ipv6" ] = {"enabled" : self .ipv6_enable }
164+ return self .res
155165
156- self .set_interface (interface = self .iface )
157- if self .iface ["name" ] not in [_iface ["name" ] for _iface in self .ifaces ]:
158- self .ifaces .append (self .iface )
166+ def add_interface (
167+ self ,
168+ iface = None ,
169+ name = None ,
170+ type_ = None ,
171+ state = None ,
172+ set_ipv4 = True ,
173+ ipv4_enable = False ,
174+ ipv4_dhcp = False ,
175+ ipv4_auto_dns = True ,
176+ ipv4_addresses = None ,
177+ set_ipv6 = True ,
178+ ipv6_enable = False ,
179+ ):
180+ # If self.res is already defined (from to_dict()), don't call it again.
181+ if not self .res :
182+ self .res = self .to_dict ()
183+
184+ self .res .setdefault ("spec" , {}).setdefault ("desiredState" , {})
185+ if not iface :
186+ iface = {
187+ "name" : name ,
188+ "type" : type_ ,
189+ "state" : state ,
190+ }
191+ if set_ipv4 :
192+ iface ["ipv4" ] = {
193+ "enabled" : ipv4_enable ,
194+ "dhcp" : ipv4_dhcp ,
195+ "auto-dns" : ipv4_auto_dns ,
196+ }
197+ if ipv4_addresses :
198+ iface ["ipv4" ]["address" ] = ipv4_addresses
159199
160- res ["spec" ]["desiredState" ]["interfaces" ] = self .desired_state ["interfaces" ]
200+ if set_ipv6 :
201+ iface ["ipv6" ] = {"enabled" : ipv6_enable }
161202
162- if self .max_unavailable :
163- res .setdefault ("spec" , {}).setdefault (
164- "maxUnavailable" , self .max_unavailable
165- )
203+ self .set_interface (interface = iface )
204+ if iface ["name" ] not in [_iface ["name" ] for _iface in self .ifaces ]:
205+ self .ifaces .append (iface )
166206
167- return res
207+ self .res ["spec" ]["desiredState" ]["interfaces" ] = self .desired_state [
208+ "interfaces"
209+ ]
210+ return self .res
168211
169212 def apply (self , resource = None ):
170213 resource = resource if resource else super ().to_dict ()
@@ -194,7 +237,7 @@ def deploy(self):
194237 )
195238 self .mtu_dict [port ] = mtu
196239
197- self .create ()
240+ self .create (body = self . res )
198241
199242 try :
200243 self .wait_for_status_success ()
@@ -244,8 +287,8 @@ def clean_up(self):
244287 self ._absent_interface ()
245288 self .wait_for_status_success ()
246289 self .wait_for_interface_deleted ()
247- except Exception as e :
248- LOGGER .error (e )
290+ except Exception as exp :
291+ LOGGER .error (exp )
249292
250293 self .delete ()
251294
0 commit comments