1
0
mirror of https://github.com/CumulusNetworks/ifupdown2.git synced 2024-05-06 15:54:50 +00:00

addons: vxlan: vxlan-vni: support vni change on existing config

Signed-off-by: Julien Fortin <jfortin@nvidia.com>
This commit is contained in:
Julien Fortin
2022-02-22 12:31:21 +01:00
parent 0500d5d882
commit 2fbbfa7211
2 changed files with 32 additions and 4 deletions

View File

@ -1187,10 +1187,6 @@ class vxlan(Vxlan, moduleBase):
user_request_vxlan_info_data.get(Link.IFLA_VXLAN_PORT),
vxlan_ttl
)
try:
self.iproute2.bridge_vni_add(ifname, vxlan_vni)
except Exception as e:
self.logger.warning("%s: l3 vxlan vni failure: %s" % (ifname, e))
else:
try:
if flap_vxlan_device:
@ -1207,6 +1203,30 @@ class vxlan(Vxlan, moduleBase):
self.log_error("%s: vxlan creation failed: %s" % (ifname, str(e)), ifaceobj)
return
if ifaceobj.link_privflags & ifaceLinkPrivFlags.L3VXI:
add_vni = True
if link_exists:
running_vxlan_vni_set = set()
for obj in json.loads(utils.exec_command("bridge -j -p vni show dev %s" % ifname) or "[]"):
for vni_obj in obj.get("vnis", []):
start = vni_obj.get("vni")
end = vni_obj.get("vniEnd")
for vni in utils.ranges_to_ints(["%s-%s" % (start, end if end else start)]):
running_vxlan_vni_set.add(vni)
if running_vxlan_vni_set != set(utils.ranges_to_ints([vxlan_vni])):
self.iproute2.bridge_vni_int_set_del(ifname, running_vxlan_vni_set)
else:
add_vni = False
if add_vni:
try:
self.iproute2.bridge_vni_add(ifname, vxlan_vni)
except Exception as e:
self.logger.warning("%s: l3 vxlan vni failure: %s" % (ifname, e))
if ifaceobj.link_privflags & ifaceLinkPrivFlags.SINGLE_VXLAN:
if vxlan_vnifilter and utils.get_boolean_from_string(vxlan_vnifilter):
self.single_vxlan_device_vni_filter(ifaceobj, vxlan_mcast_grp_map)

View File

@ -962,6 +962,14 @@ class IPRoute2(Cache, Requirements):
"vni add dev %s vni %s" % (vxlan_device, ','.join(vni.split()))
)
def bridge_vni_int_set_del(self, vxlan_device, vni):
# bridge vni del understands ranges:
# bridge vni del dev vx0 vni 10,11,20-30
self.__execute_or_batch(
utils.bridge_cmd,
"vni del dev %s vni %s" % (vxlan_device, ','.join([str(x) for x in vni]))
)
def bridge_vni_del_list(self, vxlandev, vnis):
cmd_args = "vni del dev %s vni %s" % (vxlandev, ','.join(vnis))
self.__execute_or_batch(utils.bridge_cmd, cmd_args)