Skip to content

Commit 1d67b6e

Browse files
author
Simon Begin
committed
Implement remove_trunk_vlan
Bonus: Add more tests for remove_vlan
1 parent 334730f commit 1d67b6e

File tree

4 files changed

+615
-56
lines changed

4 files changed

+615
-56
lines changed

netman/adapters/switches/juniper/base.py

Lines changed: 3 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,10 @@ def remove_vlan(self, number):
178178
update.add_interface(interface_unit_interface_removal(l3_if_type, l3_if_name))
179179

180180
for interface_node in config.xpath("data/configuration/interfaces/interface"):
181-
members_modifications = craft_members_modification_to_remove_vlan(interface_node, vlan_name, number)
181+
members_modifications = self.custom_strategies.craft_members_modification_to_remove_vlan(interface_node, vlan_name, number)
182182

183183
if len(members_modifications) > 0:
184-
update.add_interface(interface_vlan_members_update(
184+
update.add_interface(self.custom_strategies.interface_vlan_members_update(
185185
first(interface_node.xpath("name")).text,
186186
first(interface_node.xpath("unit/name")).text,
187187
members_modifications)
@@ -420,7 +420,7 @@ def remove_trunk_vlan(self, interface_id, vlan):
420420
vlan_node = self.custom_strategies.get_vlan_config(vlan, config)
421421
vlan_name = first(vlan_node.xpath("name")).text
422422

423-
modifications = craft_members_modification_to_remove_vlan(interface_node, vlan_name, vlan)
423+
modifications = self.custom_strategies.craft_members_modification_to_remove_vlan(interface_node, vlan_name, vlan)
424424
if len(modifications) == 0:
425425
raise TrunkVlanNotSet(interface_id)
426426

@@ -955,28 +955,6 @@ def rstp_interface_removal(interface_id):
955955
""".format(interface_id))
956956

957957

958-
def interface_vlan_members_update(name, unit, members_modification):
959-
content = to_ele("""
960-
<interface>
961-
<name>{}</name>
962-
<unit>
963-
<name>{}</name>
964-
<family>
965-
<ethernet-switching>
966-
<vlan />
967-
</ethernet-switching>
968-
</family>
969-
</unit>
970-
</interface>
971-
""".format(name, unit))
972-
973-
vlan_node = first(content.xpath("//vlan"))
974-
for m in members_modification:
975-
vlan_node.append(m)
976-
977-
return content
978-
979-
980958
def interface_main_update(name, attributes):
981959
content = to_ele("""
982960
<interface>
@@ -1036,27 +1014,6 @@ def bond_number(name):
10361014
return int(name[2:])
10371015

10381016

1039-
def craft_members_modification_to_remove_vlan(interface_node, vlan_name, number):
1040-
members_modifications = []
1041-
for vlan_members_node in interface_node.xpath("unit/family/ethernet-switching/vlan/members"):
1042-
if vlan_members_node.text == vlan_name:
1043-
members_modifications.append(to_ele("<members operation=\"delete\">{}</members>".format(vlan_members_node.text)))
1044-
else:
1045-
vlan_list = parse_range(vlan_members_node.text)
1046-
if number in vlan_list:
1047-
members_modifications.append(to_ele("<members operation=\"delete\">{}</members>".format(vlan_members_node.text)))
1048-
1049-
below = vlan_list[:vlan_list.index(number)]
1050-
if len(below) > 0:
1051-
members_modifications.append(to_ele("<members>{}</members>".format(to_range(below))))
1052-
1053-
above = vlan_list[vlan_list.index(number) + 1:]
1054-
if len(above) > 0:
1055-
members_modifications.append(to_ele("<members>{}</members>".format(to_range(above))))
1056-
1057-
return members_modifications
1058-
1059-
10601017
def free_from_bond_operation(interface_name):
10611018
return to_ele("""
10621019
<interface>

netman/adapters/switches/juniper/mx.py

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@
1313
# limitations under the License.
1414
from ncclient.xml_ import to_ele, new_ele
1515
from netaddr import IPNetwork
16-
from netman.adapters.switches.juniper.base import first, Juniper, Update, one_interface, parse_range
17-
from netman.adapters.switches.juniper.base import first_text
16+
17+
from netman.adapters.switches.juniper.base import first, Juniper, Update, one_interface, parse_range, to_range, \
18+
first_text
1819
from netman.adapters.switches.juniper.qfx_copper import JuniperQfxCopperCustomStrategies
1920
from netman.core.objects.exceptions import BadVlanName, BadVlanNumber, VlanAlreadyExist, \
20-
UnknownVlan, IPAlreadySet, \
21-
UnknownIP, AccessVlanNotSet, UnknownInterface, VrrpDoesNotExistForVlan
21+
UnknownVlan, IPAlreadySet, UnknownIP, AccessVlanNotSet, UnknownInterface, VrrpDoesNotExistForVlan
2222

2323
IRB = "irb"
2424
PREEMPT_HOLD_TIME = 60
@@ -37,9 +37,6 @@ def unset_interface_access_vlan(self, interface_id):
3737
update.add_interface(self.custom_strategies.interface_update(interface_id, "0", [to_ele('<vlan-id operation="delete" />')]))
3838
self._push(update)
3939

40-
def remove_trunk_vlan(self, interface_id, vlan):
41-
raise NotImplementedError()
42-
4340
def set_interface_state(self, interface_id, state):
4441
raise NotImplementedError()
4542

@@ -399,6 +396,51 @@ def update_vlan_members(self, interface_node, vlan_members, vlan):
399396
vlan_members.append(to_ele('<vlan-id operation="delete">{}</vlan-id>'.format(members.text)))
400397
vlan_members.append(to_ele("<vlan-id>{}</vlan-id>".format(vlan)))
401398

399+
def craft_members_modification_to_remove_vlan(self, interface_node, vlan_name, number):
400+
members_modifications = []
401+
402+
vlan_id_list = interface_node.xpath("unit/family/bridge/vlan-id-list") + interface_node.xpath("unit/family/bridge/vlan-id")
403+
404+
for vlan_members_node in vlan_id_list:
405+
if vlan_members_node.text == vlan_name:
406+
members_modifications.append(to_ele("<{tag} operation=\"delete\">{id}</{tag}>".format(
407+
tag=vlan_members_node.tag,
408+
id=vlan_members_node.text)
409+
))
410+
else:
411+
vlan_list = parse_range(vlan_members_node.text)
412+
if number in vlan_list:
413+
members_modifications.append(to_ele("<vlan-id-list operation=\"delete\">{}</vlan-id-list>".format(vlan_members_node.text)))
414+
415+
below = vlan_list[:vlan_list.index(number)]
416+
if len(below) > 0:
417+
members_modifications.append(to_ele("<vlan-id-list>{}</vlan-id-list>".format(to_range(below))))
418+
419+
above = vlan_list[vlan_list.index(number) + 1:]
420+
if len(above) > 0:
421+
members_modifications.append(to_ele("<vlan-id-list>{}</vlan-id-list>".format(to_range(above))))
422+
423+
return members_modifications
424+
425+
def interface_vlan_members_update(self, name, unit, members_modification):
426+
content = to_ele("""
427+
<interface>
428+
<name>{}</name>
429+
<unit>
430+
<name>{}</name>
431+
<family>
432+
<bridge/>
433+
</family>
434+
</unit>
435+
</interface>
436+
""".format(name, unit))
437+
438+
vlan_node = first(content.xpath("//bridge"))
439+
for m in members_modification:
440+
vlan_node.append(m)
441+
442+
return content
443+
402444

403445
def one_interface_vlan(vlan_number):
404446
def m():

netman/adapters/switches/juniper/standard.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from ncclient.xml_ import to_ele, new_ele
1515

1616
from netman.adapters.switches.juniper.base import interface_speed, interface_replace, interface_speed_update, \
17-
first_text, bond_name, Juniper, first, value_of, parse_range
17+
first_text, bond_name, Juniper, first, value_of, parse_range, to_range
1818
from netman.core.objects.exceptions import BadVlanName, BadVlanNumber, VlanAlreadyExist, UnknownVlan
1919

2020

@@ -165,3 +165,44 @@ def update_vlan_members(self, interface_node, vlan_members, vlan):
165165
for members in interface_node.xpath("unit/family/ethernet-switching/vlan/members"):
166166
vlan_members.append(to_ele('<members operation="delete">{}</members>'.format(members.text)))
167167
vlan_members.append(to_ele("<members>{}</members>".format(vlan)))
168+
169+
def craft_members_modification_to_remove_vlan(self, interface_node, vlan_name, number):
170+
members_modifications = []
171+
for vlan_members_node in interface_node.xpath("unit/family/ethernet-switching/vlan/members"):
172+
if vlan_members_node.text == vlan_name:
173+
members_modifications.append(to_ele("<members operation=\"delete\">{}</members>".format(vlan_members_node.text)))
174+
else:
175+
vlan_list = parse_range(vlan_members_node.text)
176+
if number in vlan_list:
177+
members_modifications.append(to_ele("<members operation=\"delete\">{}</members>".format(vlan_members_node.text)))
178+
179+
below = vlan_list[:vlan_list.index(number)]
180+
if len(below) > 0:
181+
members_modifications.append(to_ele("<members>{}</members>".format(to_range(below))))
182+
183+
above = vlan_list[vlan_list.index(number) + 1:]
184+
if len(above) > 0:
185+
members_modifications.append(to_ele("<members>{}</members>".format(to_range(above))))
186+
187+
return members_modifications
188+
189+
def interface_vlan_members_update(self, name, unit, members_modification):
190+
content = to_ele("""
191+
<interface>
192+
<name>{}</name>
193+
<unit>
194+
<name>{}</name>
195+
<family>
196+
<ethernet-switching>
197+
<vlan />
198+
</ethernet-switching>
199+
</family>
200+
</unit>
201+
</interface>
202+
""".format(name, unit))
203+
204+
vlan_node = first(content.xpath("//vlan"))
205+
for m in members_modification:
206+
vlan_node.append(m)
207+
208+
return content

0 commit comments

Comments
 (0)