Repository: ansible/ansible

Issue:
have the ios_interface module include CDP when checking neighbors
##### ISSUE TYPE
 - Feature Idea

##### COMPONENT NAME
ios_interface

##### ANSIBLE VERSION
```
ansible 2.6
```

##### SUMMARY
<!--- Explain the problem briefly -->
Currently `ios_interface` only check for neighbors using the LLDP protocol. Many environments only have the CDP protocol enabled. 

The suggestion is to also include CDP neighbors when cheking neighbors intent. It could be done with a different option if you think is more appropriate. IMO using both protocols would be simpler.
 

##### STEPS TO REPRODUCE
Run a simple playbook using neighbors intent parameters
```
- name: Check neighbors intent arguments
  ios_interface:
    name: Gi0/0
    neighbors:
    - port: eth0
      host: netdev
```

##### EXPECTED RESULTS
Should check CDP and LLDP neighbors

##### ACTUAL RESULTS
Only checks LLDP neighbors



Discussion:
Files identified in the description:
* [lib/ansible/modules/network/ios/ios_interface.py](https://github.com/ansible/ansible/blob/devel/lib/ansible/modules/network/ios/ios_interface.py)

If these files are inaccurate, please update the `component name` section of the description or use the `!component` bot command.

[click here for bot help](https://github.com/ansible/ansibullbot/blob/master/ISSUE_HELP.md)
<!--- boilerplate: components_banner --->
cc @ganeshrn @privateip @rcarrillocruz
[click here for bot help](https://github.com/ansible/ansibullbot/blob/master/ISSUE_HELP.md)
<!--- boilerplate: notify --->

Resolving patch:
diff --git a/lib/ansible/modules/network/ios/ios_interface.py b/lib/ansible/modules/network/ios/ios_interface.py
--- a/lib/ansible/modules/network/ios/ios_interface.py
+++ b/lib/ansible/modules/network/ios/ios_interface.py
@@ -328,7 +328,8 @@ def map_obj_to_commands(updates):
 
 def check_declarative_intent_params(module, want, result):
     failed_conditions = []
-    have_neighbors = None
+    have_neighbors_lldp = None
+    have_neighbors_cdp = None
     for w in want:
         want_state = w.get('state')
         want_tx_rate = w.get('tx_rate')
@@ -375,13 +376,15 @@ def check_declarative_intent_params(module, want, result):
         if want_neighbors:
             have_host = []
             have_port = []
-            if have_neighbors is None:
-                rc, have_neighbors, err = exec_command(module, 'show lldp neighbors detail')
+
+            # Process LLDP neighbors
+            if have_neighbors_lldp is None:
+                rc, have_neighbors_lldp, err = exec_command(module, 'show lldp neighbors detail')
                 if rc != 0:
                     module.fail_json(msg=to_text(err, errors='surrogate_then_replace'), command=command, rc=rc)
 
-            if have_neighbors:
-                lines = have_neighbors.strip().split('Local Intf: ')
+            if have_neighbors_lldp:
+                lines = have_neighbors_lldp.strip().split('Local Intf: ')
                 for line in lines:
                     field = line.split('\n')
                     if field[0].strip() == w['name']:
@@ -390,6 +393,20 @@ def check_declarative_intent_params(module, want, result):
                                 have_host.append(item.split(':')[1].strip())
                             if item.startswith('Port Description:'):
                                 have_port.append(item.split(':')[1].strip())
+
+            # Process CDP neighbors
+            if have_neighbors_cdp is None:
+                rc, have_neighbors_cdp, err = exec_command(module, 'show cdp neighbors detail')
+                if rc != 0:
+                    module.fail_json(msg=to_text(err, errors='surrogate_then_replace'), command=command, rc=rc)
+
+            if have_neighbors_cdp:
+                neighbors_cdp = re.findall('Device ID: (.*?)\n.*?Interface: (.*?),  Port ID .outgoing port.: (.*?)\n', have_neighbors_cdp, re.S)
+                for host, localif, remoteif in neighbors_cdp:
+                    if localif == w['name']:
+                        have_host.append(host)
+                        have_port.append(remoteif)
+
             for item in want_neighbors:
                 host = item.get('host')
                 port = item.get('port')


Test patch: