Skip to content

Commit a886479

Browse files
authored
Merge pull request #261 from vilnitsky/lacp_force_up
support lacp force up in juniper switches
2 parents 8e48641 + 76d0e6f commit a886479

12 files changed

Lines changed: 116 additions & 13 deletions

File tree

netman/adapters/switches/cached.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,14 @@ def unset_interface_auto_negotiation_state(self, interface_id):
308308
self.real_switch.unset_interface_auto_negotiation_state(interface_id)
309309
self.interfaces_cache[interface_id].auto_negotiation = None
310310

311+
def set_interface_lacp_force_up(self, interface_id):
312+
self.real_switch.set_interface_lacp_force_up(interface_id)
313+
self.interfaces_cache[interface_id].force_up = True
314+
315+
def unset_interface_lacp_force_up(self, interface_id):
316+
self.real_switch.unset_interface_lacp_force_up(interface_id)
317+
self.interfaces_cache[interface_id].force_up = None
318+
311319
def add_bond(self, number):
312320
self.real_switch.add_bond(number)
313321
self.bonds_cache.refresh_items.add(number)

netman/adapters/switches/juniper/base.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,46 @@ def unset_interface_auto_negotiation_state(self, interface_id):
356356

357357
self._push_interface_update(interface_id, update)
358358

359+
def set_interface_lacp_force_up(self, interface_id):
360+
content = to_ele("""
361+
<interface>
362+
<name>{0}</name>
363+
</interface>
364+
""".format(interface_id))
365+
content.append(to_ele("""
366+
<ether-options>
367+
<ieee-802.3ad>
368+
<lacp>
369+
<force-up/>
370+
</lacp>
371+
</ieee-802.3ad>
372+
</ether-options>
373+
"""))
374+
update = Update()
375+
update.add_interface(content)
376+
377+
self._push_interface_update(interface_id, update)
378+
379+
def unset_interface_lacp_force_up(self, interface_id):
380+
content = to_ele("""
381+
<interface>
382+
<name>{0}</name>
383+
</interface>
384+
""".format(interface_id))
385+
content.append(
386+
to_ele("""
387+
<ether-options>
388+
<ieee-802.3ad>
389+
<lacp operation=\"delete\"></lacp>
390+
</ieee-802.3ad>
391+
</ether-options>
392+
""")
393+
)
394+
update = Update()
395+
update.add_interface(content)
396+
397+
self._push_interface_update(interface_id, update)
398+
359399
def reset_interface(self, interface_id):
360400
content = to_ele("""
361401
<interface operation=\"delete\">
@@ -738,6 +778,8 @@ def fill_interface_from_node(self, interface, interface_node, config):
738778
interface.auto_negotiation = True
739779
elif first(interface_node.xpath('ether-options/no-auto-negotiation')) is not None:
740780
interface.auto_negotiation = False
781+
if first(interface_node.xpath('ether-options/ieee-802.3ad/lacp/force-up')) is not None:
782+
interface.force_up = True
741783
return interface
742784

743785
def node_to_interface(self, interface_node, config):

netman/adapters/switches/remote.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,12 @@ def set_interface_auto_negotiation_state(self, interface_id, state):
270270
def unset_interface_auto_negotiation_state(self, interface_id):
271271
self.delete("/interfaces/" + interface_id + '/auto-negotiation')
272272

273+
def set_interface_lacp_force_up(self, interface_id):
274+
self.put("/interfaces/" + interface_id + '/lacp-force-up')
275+
276+
def unset_interface_lacp_force_up(self, interface_id):
277+
self.delete("/interfaces/" + interface_id + '/lacp-force-up')
278+
273279
def add_bond(self, number):
274280
self.post("/bonds", data={'number': number})
275281

netman/api/doc_config/api_samples/get_switch_hostname_bond_v1.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"trunk_native_vlan": null,
1212
"trunk_vlans": [],
1313
"auto_negotiation": null,
14-
"mtu": 1500
14+
"mtu": 1500,
15+
"force_up": null
1516
}
1617
}

netman/api/doc_config/api_samples/get_switch_hostname_bonds_v1.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
"trunk_native_vlan": null,
1313
"trunk_vlans": [],
1414
"auto_negotiation": null,
15-
"mtu": 1500
15+
"mtu": 1500,
16+
"force_up": null
1617
}
1718
},
1819
{
@@ -35,7 +36,8 @@
3536
3002
3637
],
3738
"auto_negotiation": null,
38-
"mtu": null
39+
"mtu": null,
40+
"force_up": null
3941
}
4042
},
4143
{
@@ -55,7 +57,8 @@
5557
3002
5658
],
5759
"auto_negotiation": null,
58-
"mtu": null
60+
"mtu": null,
61+
"force_up": null
5962
}
6063
}
6164
]

netman/api/doc_config/api_samples/get_switch_hostname_interface.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@
77
"trunk_native_vlan": 2999,
88
"trunk_vlans": [3000, 3001, 3002],
99
"auto_negotiation": null,
10-
"mtu": 1500
11-
}
10+
"mtu": 1500,
11+
"force_up": null
12+
}

netman/api/doc_config/api_samples/get_switch_hostname_interfaces.json

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
"trunk_native_vlan": 2999,
99
"trunk_vlans": [3000, 3001, 3002],
1010
"auto_negotiation": null,
11-
"mtu": 1500
11+
"mtu": 1500,
12+
"force_up": null
1213
},
1314
{
1415
"name": "FastEthernet0/3",
@@ -19,7 +20,8 @@
1920
"trunk_native_vlan": null,
2021
"trunk_vlans": [],
2122
"auto_negotiation": null,
22-
"mtu": null
23+
"mtu": null,
24+
"force_up": null
2325
},
2426
{
2527
"name": "GigabitEthernet0/6",
@@ -30,7 +32,8 @@
3032
"trunk_native_vlan": 2999,
3133
"trunk_vlans": [3000, 3001, 3002],
3234
"auto_negotiation": true,
33-
"mtu": null
35+
"mtu": null,
36+
"force_up": null
3437
},
3538
{
3639
"name": "GigabitEthernet0/8",
@@ -41,6 +44,7 @@
4144
"trunk_native_vlan": null,
4245
"trunk_vlans": [],
4346
"auto_negotiation": false,
44-
"mtu": null
47+
"mtu": null,
48+
"force_up": null
4549
}
4650
]

netman/api/objects/interface.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,13 @@ def to_api(self, interface):
2828
base_interface.to_api(interface),
2929
name=interface.name,
3030
bond_master=interface.bond_master,
31-
auto_negotiation=interface.auto_negotiation
31+
auto_negotiation=interface.auto_negotiation,
32+
force_up=interface.force_up
3233
)
3334

3435
def to_core(self, serialized):
3536
params = dict(vars(base_interface.to_core(serialized)))
36-
params.update(sub_dict(serialized, 'name', 'bond_master', 'auto_negotiation'))
37+
params.update(sub_dict(serialized, 'name', 'bond_master', 'auto_negotiation', 'force_up'))
3738
return Interface(**params)
3839

3940

netman/api/switch_api.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ def hook_to(self, server):
7575
server.add_url_rule('/switches/<hostname>/interfaces/<path:interface_id>/lldp', view_func=self.set_interface_lldp_state, methods=['PUT'])
7676
server.add_url_rule('/switches/<hostname>/interfaces/<path:interface_id>/auto-negotiation', view_func=self.set_interface_auto_negotiation_state, methods=['PUT'])
7777
server.add_url_rule('/switches/<hostname>/interfaces/<path:interface_id>/auto-negotiation', view_func=self.unset_interface_auto_negotiation_state, methods=['DELETE'])
78+
server.add_url_rule('/switches/<hostname>/interfaces/<path:interface_id>/lacp-force-up', view_func=self.set_interface_lacp_force_up, methods=['PUT'])
79+
server.add_url_rule('/switches/<hostname>/interfaces/<path:interface_id>/lacp-force-up', view_func=self.unset_interface_lacp_force_up, methods=['DELETE'])
7880
server.add_url_rule('/switches/<hostname>/interfaces/<path:interface_id>/mtu', view_func=self.set_interface_mtu, methods=['PUT'])
7981
server.add_url_rule('/switches/<hostname>/interfaces/<path:interface_id>/mtu', view_func=self.unset_interface_mtu, methods=['DELETE'])
8082
server.add_url_rule('/switches/<hostname>/bonds', view_func=self.get_bonds, methods=['GET'])
@@ -500,6 +502,31 @@ def unset_interface_auto_negotiation_state(self, switch, interface_id):
500502
switch.unset_interface_auto_negotiation_state(interface_id)
501503
return 204, None
502504

505+
@to_response
506+
@resource(Switch, Interface)
507+
def set_interface_lacp_force_up(self, switch, interface_id):
508+
"""
509+
Sets lacp force_up state of an interface
510+
511+
:arg str hostname: Hostname or IP of the switch
512+
:arg str interface_id: Interface name (ex. ``FastEthernet0/1``, ``ethernet1/11``)
513+
"""
514+
switch.set_interface_lacp_force_up(interface_id)
515+
return 204, None
516+
517+
@to_response
518+
@resource(Switch, Interface)
519+
def unset_interface_lacp_force_up(self, switch, interface_id):
520+
"""
521+
Unsets lacp force_up state of an interface
522+
523+
:arg str hostname: Hostname or IP of the switch
524+
:arg str interface_id: Interface name (ex. ``FastEthernet0/1``, ``ethernet1/11``)
525+
"""
526+
527+
switch.unset_interface_lacp_force_up(interface_id)
528+
return 204, None
529+
503530
@to_response
504531
@content(is_int)
505532
@resource(Switch, Interface)

netman/core/objects/interface.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ def __init__(self, shutdown=None, port_mode=None, access_vlan=None,
2727

2828

2929
class Interface(BaseInterface):
30-
def __init__(self, name=None, bond_master=None, auto_negotiation=None, **interface):
30+
def __init__(self, name=None, bond_master=None, auto_negotiation=None, force_up=None, **interface):
3131
super(Interface, self).__init__(**interface)
3232
self.name = name
3333
self.bond_master = bond_master
3434
self.auto_negotiation = auto_negotiation
35+
self.force_up = force_up

0 commit comments

Comments
 (0)