Skip to content

Commit a99fd60

Browse files
authored
Merge pull request #315 from myakove/nncp-support-multiple-ifaces
NNCP: support adding interfaces
2 parents c6f406e + 2e26163 commit a99fd60

File tree

1 file changed

+71
-28
lines changed

1 file changed

+71
-28
lines changed

ocp_resources/node_network_configuration_policy.py

Lines changed: 71 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)