Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 3 additions & 46 deletions netman/adapters/switches/juniper/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,10 +178,10 @@ def remove_vlan(self, number):
update.add_interface(interface_unit_interface_removal(l3_if_type, l3_if_name))

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

if len(members_modifications) > 0:
update.add_interface(interface_vlan_members_update(
update.add_interface(self.custom_strategies.interface_vlan_members_update(
first(interface_node.xpath("name")).text,
first(interface_node.xpath("unit/name")).text,
members_modifications)
Expand Down Expand Up @@ -420,7 +420,7 @@ def remove_trunk_vlan(self, interface_id, vlan):
vlan_node = self.custom_strategies.get_vlan_config(vlan, config)
vlan_name = first(vlan_node.xpath("name")).text

modifications = craft_members_modification_to_remove_vlan(interface_node, vlan_name, vlan)
modifications = self.custom_strategies.craft_members_modification_to_remove_vlan(interface_node, vlan_name, vlan)
if len(modifications) == 0:
raise TrunkVlanNotSet(interface_id)

Expand Down Expand Up @@ -955,28 +955,6 @@ def rstp_interface_removal(interface_id):
""".format(interface_id))


def interface_vlan_members_update(name, unit, members_modification):
content = to_ele("""
<interface>
<name>{}</name>
<unit>
<name>{}</name>
<family>
<ethernet-switching>
<vlan />
</ethernet-switching>
</family>
</unit>
</interface>
""".format(name, unit))

vlan_node = first(content.xpath("//vlan"))
for m in members_modification:
vlan_node.append(m)

return content


def interface_main_update(name, attributes):
content = to_ele("""
<interface>
Expand Down Expand Up @@ -1036,27 +1014,6 @@ def bond_number(name):
return int(name[2:])


def craft_members_modification_to_remove_vlan(interface_node, vlan_name, number):
members_modifications = []
for vlan_members_node in interface_node.xpath("unit/family/ethernet-switching/vlan/members"):
if vlan_members_node.text == vlan_name:
members_modifications.append(to_ele("<members operation=\"delete\">{}</members>".format(vlan_members_node.text)))
else:
vlan_list = parse_range(vlan_members_node.text)
if number in vlan_list:
members_modifications.append(to_ele("<members operation=\"delete\">{}</members>".format(vlan_members_node.text)))

below = vlan_list[:vlan_list.index(number)]
if len(below) > 0:
members_modifications.append(to_ele("<members>{}</members>".format(to_range(below))))

above = vlan_list[vlan_list.index(number) + 1:]
if len(above) > 0:
members_modifications.append(to_ele("<members>{}</members>".format(to_range(above))))

return members_modifications


def free_from_bond_operation(interface_name):
return to_ele("""
<interface>
Expand Down
56 changes: 49 additions & 7 deletions netman/adapters/switches/juniper/mx.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@
# limitations under the License.
from ncclient.xml_ import to_ele, new_ele
from netaddr import IPNetwork
from netman.adapters.switches.juniper.base import first, Juniper, Update, one_interface, parse_range
from netman.adapters.switches.juniper.base import first_text

from netman.adapters.switches.juniper.base import first, Juniper, Update, one_interface, parse_range, to_range, \
first_text
from netman.adapters.switches.juniper.qfx_copper import JuniperQfxCopperCustomStrategies
from netman.core.objects.exceptions import BadVlanName, BadVlanNumber, VlanAlreadyExist, \
UnknownVlan, IPAlreadySet, \
UnknownIP, AccessVlanNotSet, UnknownInterface, VrrpDoesNotExistForVlan
UnknownVlan, IPAlreadySet, UnknownIP, AccessVlanNotSet, UnknownInterface, VrrpDoesNotExistForVlan

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

def remove_trunk_vlan(self, interface_id, vlan):
raise NotImplementedError()

def set_interface_state(self, interface_id, state):
raise NotImplementedError()

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

def craft_members_modification_to_remove_vlan(self, interface_node, vlan_name, number):
members_modifications = []

vlan_id_list = interface_node.xpath("unit/family/bridge/vlan-id-list") + interface_node.xpath("unit/family/bridge/vlan-id")

for vlan_members_node in vlan_id_list:
if vlan_members_node.text == vlan_name:
members_modifications.append(to_ele("<{tag} operation=\"delete\">{id}</{tag}>".format(
tag=vlan_members_node.tag,
id=vlan_members_node.text)
))
else:
vlan_list = parse_range(vlan_members_node.text)
if number in vlan_list:
members_modifications.append(to_ele("<vlan-id-list operation=\"delete\">{}</vlan-id-list>".format(vlan_members_node.text)))

below = vlan_list[:vlan_list.index(number)]
if len(below) > 0:
members_modifications.append(to_ele("<vlan-id-list>{}</vlan-id-list>".format(to_range(below))))

above = vlan_list[vlan_list.index(number) + 1:]
if len(above) > 0:
members_modifications.append(to_ele("<vlan-id-list>{}</vlan-id-list>".format(to_range(above))))

return members_modifications

def interface_vlan_members_update(self, name, unit, members_modification):
content = to_ele("""
<interface>
<name>{}</name>
<unit>
<name>{}</name>
<family>
<bridge/>
</family>
</unit>
</interface>
""".format(name, unit))

vlan_node = first(content.xpath("//bridge"))
for m in members_modification:
vlan_node.append(m)

return content


def one_interface_vlan(vlan_number):
def m():
Expand Down
43 changes: 42 additions & 1 deletion netman/adapters/switches/juniper/standard.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from ncclient.xml_ import to_ele, new_ele

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


Expand Down Expand Up @@ -165,3 +165,44 @@ def update_vlan_members(self, interface_node, vlan_members, vlan):
for members in interface_node.xpath("unit/family/ethernet-switching/vlan/members"):
vlan_members.append(to_ele('<members operation="delete">{}</members>'.format(members.text)))
vlan_members.append(to_ele("<members>{}</members>".format(vlan)))

def craft_members_modification_to_remove_vlan(self, interface_node, vlan_name, number):
members_modifications = []
for vlan_members_node in interface_node.xpath("unit/family/ethernet-switching/vlan/members"):
if vlan_members_node.text == vlan_name:
members_modifications.append(to_ele("<members operation=\"delete\">{}</members>".format(vlan_members_node.text)))
else:
vlan_list = parse_range(vlan_members_node.text)
if number in vlan_list:
members_modifications.append(to_ele("<members operation=\"delete\">{}</members>".format(vlan_members_node.text)))

below = vlan_list[:vlan_list.index(number)]
if len(below) > 0:
members_modifications.append(to_ele("<members>{}</members>".format(to_range(below))))

above = vlan_list[vlan_list.index(number) + 1:]
if len(above) > 0:
members_modifications.append(to_ele("<members>{}</members>".format(to_range(above))))

return members_modifications

def interface_vlan_members_update(self, name, unit, members_modification):
content = to_ele("""
<interface>
<name>{}</name>
<unit>
<name>{}</name>
<family>
<ethernet-switching>
<vlan />
</ethernet-switching>
</family>
</unit>
</interface>
""".format(name, unit))

vlan_node = first(content.xpath("//vlan"))
for m in members_modification:
vlan_node.append(m)

return content
Loading