Skip to content

Commit a688e4e

Browse files
authored
Merge pull request #212 from simon-begin/remove_trunk_vlan
Implement remove_trunk_vlan for Juniper MX
2 parents 69181e7 + 1d67b6e commit a688e4e

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
@@ -174,10 +174,10 @@ def remove_vlan(self, number):
174174
update.add_interface(interface_unit_interface_removal(l3_if_type, l3_if_name))
175175

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

179179
if len(members_modifications) > 0:
180-
update.add_interface(interface_vlan_members_update(
180+
update.add_interface(self.custom_strategies.interface_vlan_members_update(
181181
first(interface_node.xpath("name")).text,
182182
first(interface_node.xpath("unit/name")).text,
183183
members_modifications)
@@ -416,7 +416,7 @@ def remove_trunk_vlan(self, interface_id, vlan):
416416
vlan_node = self.custom_strategies.vlan_node(config, vlan)
417417
vlan_name = first(vlan_node.xpath("name")).text
418418

419-
modifications = craft_members_modification_to_remove_vlan(interface_node, vlan_name, vlan)
419+
modifications = self.custom_strategies.craft_members_modification_to_remove_vlan(interface_node, vlan_name, vlan)
420420
if len(modifications) == 0:
421421
raise TrunkVlanNotSet(interface_id)
422422

@@ -948,28 +948,6 @@ def rstp_interface_removal(interface_id):
948948
""".format(interface_id))
949949

950950

951-
def interface_vlan_members_update(name, unit, members_modification):
952-
content = to_ele("""
953-
<interface>
954-
<name>{}</name>
955-
<unit>
956-
<name>{}</name>
957-
<family>
958-
<ethernet-switching>
959-
<vlan />
960-
</ethernet-switching>
961-
</family>
962-
</unit>
963-
</interface>
964-
""".format(name, unit))
965-
966-
vlan_node = first(content.xpath("//vlan"))
967-
for m in members_modification:
968-
vlan_node.append(m)
969-
970-
return content
971-
972-
973951
def interface_main_update(name, attributes):
974952
content = to_ele("""
975953
<interface>
@@ -1029,27 +1007,6 @@ def bond_number(name):
10291007
return int(name[2:])
10301008

10311009

1032-
def craft_members_modification_to_remove_vlan(interface_node, vlan_name, number):
1033-
members_modifications = []
1034-
for vlan_members_node in interface_node.xpath("unit/family/ethernet-switching/vlan/members"):
1035-
if vlan_members_node.text == vlan_name:
1036-
members_modifications.append(to_ele("<members operation=\"delete\">{}</members>".format(vlan_members_node.text)))
1037-
else:
1038-
vlan_list = parse_range(vlan_members_node.text)
1039-
if number in vlan_list:
1040-
members_modifications.append(to_ele("<members operation=\"delete\">{}</members>".format(vlan_members_node.text)))
1041-
1042-
below = vlan_list[:vlan_list.index(number)]
1043-
if len(below) > 0:
1044-
members_modifications.append(to_ele("<members>{}</members>".format(to_range(below))))
1045-
1046-
above = vlan_list[vlan_list.index(number) + 1:]
1047-
if len(above) > 0:
1048-
members_modifications.append(to_ele("<members>{}</members>".format(to_range(above))))
1049-
1050-
return members_modifications
1051-
1052-
10531010
def free_from_bond_operation(interface_name):
10541011
return to_ele("""
10551012
<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

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

0 commit comments

Comments
 (0)