nxos_interfaces_ospf: fix passive-interface states & check_mode (#54260)

* nxos_interfaces_ospf: fix passive-interface states & check_mode

This fix addresses issues #41704 and #45343.

The crux of the problem is that `passive-interface` should have been treated as a tri-state value instead of a boolean.

The `no` form of the command disables the passive state on an interface (allows it to form adjacencies and send routing updates).  It's essentially an override for `passive-interface default` which enables passive state on all OSPF interfaces.\*
This `no` config will be present in `running-config`.

   \**See `router ospf` configuration.*

Since both enable and disable states are explicit configs, the proper way to remove either of these is with the `default` syntax.

Passive-interface config syntax:
```
  ip ospf passive-interface              # enable  (nvgens)
  no ip ospf passive-interface           # disable (nvgens)
  default ip ospf passive-interface      # default (removes config, does not nvgen)
```

Code changes:

* `passive_interface` param changed from boolean to string, restricted to `true`,`false`,`default`.

* Several passive-interface specific checks were added because the existing module logic tends to test for true or false and doesn't handle the None case.

* Fixed `check_mode`.

Sanity verified on: N9K,N7K,N3K,N6K

* Fix doc header

* Unit tests for passive-interface

* doc fix #2

* Fix indent for SA

* Remove 'default' keyword, restore bool behavior

* remove changes to sanity
This commit is contained in:
Chris Van Heuveln
2019-03-26 23:45:50 -04:00
committed by Trishna Guha
parent 98a3fa2dac
commit 20fb77c49b
3 changed files with 58 additions and 7 deletions

View File

@@ -0,0 +1,7 @@
interface Ethernet1/33
interface Ethernet1/34
ip router ospf 1 area 0.0.0.1
ip ospf passive-interface
interface Ethernet1/35
ip router ospf 1 area 0.0.0.1
no ip ospf passive-interface

View File

@@ -56,3 +56,33 @@ class TestNxosInterfaceOspfModule(TestNxosModule):
self.execute_module(failed=True, changed=False)
set_module_args(dict(interface='loopback0', ospf=1, area=0, network='broadcast'))
self.execute_module(failed=True, changed=False)
def test_nxos_interface_ospf_passive(self):
# default -> True
set_module_args(dict(interface='ethernet1/33', ospf=1, area=1, passive_interface=True))
self.execute_module(changed=True, commands=['interface Ethernet1/33',
'ip router ospf 1 area 0.0.0.1',
'ip ospf passive-interface'])
# default -> False
set_module_args(dict(interface='ethernet1/33', ospf=1, area=1, passive_interface=False))
self.execute_module(changed=True, commands=['interface Ethernet1/33',
'ip router ospf 1 area 0.0.0.1',
'no ip ospf passive-interface'])
# True -> False
set_module_args(dict(interface='ethernet1/34', ospf=1, area=1, passive_interface=False))
self.execute_module(changed=True, commands=['interface Ethernet1/34',
'no ip ospf passive-interface'])
# True -> default (absent)
set_module_args(dict(interface='ethernet1/34', ospf=1, area=1, state='absent'))
self.execute_module(changed=True, commands=['interface Ethernet1/34',
'no ip router ospf 1 area 0.0.0.1',
'default ip ospf passive-interface'])
# False -> True
set_module_args(dict(interface='ethernet1/35', ospf=1, area=1, passive_interface=True))
self.execute_module(changed=True, commands=['interface Ethernet1/35',
'ip ospf passive-interface'])
# False -> default (absent)
set_module_args(dict(interface='ethernet1/35', ospf=1, area=1, state='absent'))
self.execute_module(changed=True, commands=['interface Ethernet1/35',
'no ip router ospf 1 area 0.0.0.1',
'default ip ospf passive-interface'])