nxos and httpapi cherry-pick (#40859)
* httpapi fix nxos (#40806) * httpapi fix nxos Signed-off-by: Trishna Guha <trishnaguha17@gmail.com> * nxos_hsrp fix Signed-off-by: Trishna Guha <trishnaguha17@gmail.com> (cherry picked from commita7421e8611
) * fix nxos_vrf and migrate get_interface_type to module_utils (#40825) Signed-off-by: Trishna Guha <trishnaguha17@gmail.com> (cherry picked from commitb4baa2d484
) * nxos_vlan fix (#40822) * nxos_vlan fix Signed-off-by: Trishna Guha <trishnaguha17@gmail.com> * uncomment mode test as nxapi now has get_capabilities Signed-off-by: Trishna Guha <trishnaguha17@gmail.com> (cherry picked from commit17b6ecf101
) * Update nxos_install_os module (#40102) * Add nxos_install_os integration tests * Update call to check timers * Update check_ansible_timer method * Modify network_cli integration tests * Add timer check for nxos_install_os * Add comments for clear_persistent_sockets * Update connection info for tests * More updates * Restructure files for provider and non-provider testing * Update env var name and add check for ISSU switchover (cherry picked from commit9f026309a6
)
This commit is contained in:
parent
828d878bf9
commit
58f018e367
41 changed files with 557 additions and 280 deletions
|
@ -479,3 +479,24 @@ def normalize_interface(name):
|
|||
proper_interface = name
|
||||
|
||||
return proper_interface
|
||||
|
||||
|
||||
def get_interface_type(interface):
|
||||
"""Gets the type of interface
|
||||
"""
|
||||
if interface.upper().startswith('ET'):
|
||||
return 'ethernet'
|
||||
elif interface.upper().startswith('VL'):
|
||||
return 'svi'
|
||||
elif interface.upper().startswith('LO'):
|
||||
return 'loopback'
|
||||
elif interface.upper().startswith('MG'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('MA'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('PO'):
|
||||
return 'portchannel'
|
||||
elif interface.upper().startswith('NV'):
|
||||
return 'nve'
|
||||
else:
|
||||
return 'unknown'
|
||||
|
|
|
@ -179,6 +179,7 @@ except ImportError:
|
|||
|
||||
from ansible.module_utils.network.nxos.nxos import load_config, run_commands
|
||||
from ansible.module_utils.network.nxos.nxos import get_capabilities, nxos_argument_spec
|
||||
from ansible.module_utils.network.nxos.nxos import get_interface_type
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
|
||||
|
||||
|
@ -209,23 +210,6 @@ def execute_show_command(command, module):
|
|||
return body
|
||||
|
||||
|
||||
def get_interface_type(interface):
|
||||
if interface.upper().startswith('ET'):
|
||||
return 'ethernet'
|
||||
elif interface.upper().startswith('VL'):
|
||||
return 'svi'
|
||||
elif interface.upper().startswith('LO'):
|
||||
return 'loopback'
|
||||
elif interface.upper().startswith('MG'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('MA'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('PO'):
|
||||
return 'portchannel'
|
||||
else:
|
||||
return 'unknown'
|
||||
|
||||
|
||||
def is_default(interface, module):
|
||||
command = 'show run interface {0}'.format(interface)
|
||||
|
||||
|
|
|
@ -119,34 +119,10 @@ commands:
|
|||
|
||||
from ansible.module_utils.network.nxos.nxos import load_config, run_commands
|
||||
from ansible.module_utils.network.nxos.nxos import get_capabilities, nxos_argument_spec
|
||||
from ansible.module_utils.network.nxos.nxos import get_interface_type
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
|
||||
|
||||
def get_interface_type(interface):
|
||||
"""Gets the type of interface
|
||||
Args:
|
||||
interface (str): full name of interface, i.e. Ethernet1/1, loopback10,
|
||||
port-channel20, vlan20
|
||||
Returns:
|
||||
type of interface: ethernet, svi, loopback, management, portchannel,
|
||||
or unknown
|
||||
"""
|
||||
if interface.upper().startswith('ET'):
|
||||
return 'ethernet'
|
||||
elif interface.upper().startswith('VL'):
|
||||
return 'svi'
|
||||
elif interface.upper().startswith('LO'):
|
||||
return 'loopback'
|
||||
elif interface.upper().startswith('MG'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('MA'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('PO'):
|
||||
return 'portchannel'
|
||||
else:
|
||||
return 'unknown'
|
||||
|
||||
|
||||
def get_interface_mode(interface, module):
|
||||
"""Gets current mode of interface: layer2 or layer3
|
||||
Args:
|
||||
|
|
|
@ -148,6 +148,7 @@ commands:
|
|||
|
||||
from ansible.module_utils.network.nxos.nxos import load_config, run_commands
|
||||
from ansible.module_utils.network.nxos.nxos import get_capabilities, nxos_argument_spec
|
||||
from ansible.module_utils.network.nxos.nxos import get_interface_type
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
|
||||
|
||||
|
@ -159,21 +160,6 @@ PARAM_TO_DEFAULT_KEYMAP = {
|
|||
}
|
||||
|
||||
|
||||
def execute_show_command(command, module):
|
||||
device_info = get_capabilities(module)
|
||||
network_api = device_info.get('network_api', 'nxapi')
|
||||
|
||||
if network_api == 'cliconf':
|
||||
command += ' | json'
|
||||
cmds = [command]
|
||||
body = run_commands(module, cmds)
|
||||
elif network_api == 'nxapi':
|
||||
cmds = [command]
|
||||
body = run_commands(module, cmds)
|
||||
|
||||
return body
|
||||
|
||||
|
||||
def apply_key_map(key_map, table):
|
||||
new_dict = {}
|
||||
for key in table:
|
||||
|
@ -187,29 +173,12 @@ def apply_key_map(key_map, table):
|
|||
return new_dict
|
||||
|
||||
|
||||
def get_interface_type(interface):
|
||||
if interface.upper().startswith('ET'):
|
||||
return 'ethernet'
|
||||
elif interface.upper().startswith('VL'):
|
||||
return 'svi'
|
||||
elif interface.upper().startswith('LO'):
|
||||
return 'loopback'
|
||||
elif interface.upper().startswith('MG'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('MA'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('PO'):
|
||||
return 'portchannel'
|
||||
else:
|
||||
return 'unknown'
|
||||
|
||||
|
||||
def get_interface_mode(interface, intf_type, module):
|
||||
command = 'show interface {0}'.format(interface)
|
||||
command = 'show interface {0} | json'.format(interface)
|
||||
interface = {}
|
||||
mode = 'unknown'
|
||||
try:
|
||||
body = execute_show_command(command, module)[0]
|
||||
body = run_commands(module, [command])[0]
|
||||
except IndexError:
|
||||
return None
|
||||
|
||||
|
@ -224,7 +193,7 @@ def get_interface_mode(interface, intf_type, module):
|
|||
|
||||
|
||||
def get_hsrp_group(group, interface, module):
|
||||
command = 'show hsrp group {0} all'.format(group)
|
||||
command = 'show hsrp group {0} all | json'.format(group)
|
||||
hsrp = {}
|
||||
|
||||
hsrp_key = {
|
||||
|
@ -240,9 +209,9 @@ def get_hsrp_group(group, interface, module):
|
|||
}
|
||||
|
||||
try:
|
||||
body = execute_show_command(command, module)[0]
|
||||
body = run_commands(module, [command])[0]
|
||||
hsrp_table = body['TABLE_grp_detail']['ROW_grp_detail']
|
||||
except (AttributeError, IndexError, TypeError):
|
||||
except (AttributeError, IndexError, TypeError, KeyError):
|
||||
return {}
|
||||
|
||||
if isinstance(hsrp_table, dict):
|
||||
|
@ -365,7 +334,7 @@ def is_default(interface, module):
|
|||
command = 'show run interface {0}'.format(interface)
|
||||
|
||||
try:
|
||||
body = execute_show_command(command, module)[0]
|
||||
body = run_commands(module, [command], check_rc=False)[0]
|
||||
if 'invalid' in body.lower():
|
||||
return 'DNE'
|
||||
else:
|
||||
|
|
|
@ -191,6 +191,7 @@ changed:
|
|||
|
||||
from ansible.module_utils.network.nxos.nxos import get_config, load_config, run_commands
|
||||
from ansible.module_utils.network.nxos.nxos import nxos_argument_spec, check_args
|
||||
from ansible.module_utils.network.nxos.nxos import get_interface_type
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
|
||||
import re
|
||||
|
@ -227,23 +228,6 @@ def get_interface_mode(interface, intf_type, module):
|
|||
return mode
|
||||
|
||||
|
||||
def get_interface_type(interface):
|
||||
if interface.upper().startswith('ET'):
|
||||
return 'ethernet'
|
||||
elif interface.upper().startswith('VL'):
|
||||
return 'svi'
|
||||
elif interface.upper().startswith('LO'):
|
||||
return 'loopback'
|
||||
elif interface.upper().startswith('MG'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('MA'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('PO'):
|
||||
return 'portchannel'
|
||||
else:
|
||||
return 'unknown'
|
||||
|
||||
|
||||
def apply_key_map(key_map, table):
|
||||
new_dict = {}
|
||||
for key, value in table.items():
|
||||
|
|
|
@ -35,13 +35,9 @@ notes:
|
|||
- N9k 7.0(3)I4(6), 7.0(3)I5(3), 7.0(3)I6(1), 7.0(3)I7(1), 7.0(3)F2(2), 7.0(3)F3(2)
|
||||
- N3k 6.0(2)A8(6), 6.0(2)A8(8), 7.0(3)I6(1), 7.0(3)I7(1)
|
||||
- N7k 7.3(0)D1(1), 8.0(1), 8.2(1)
|
||||
- This module executes longer then the default ansible timeout value and
|
||||
will generate errors unless the module timeout parameter is set to a
|
||||
value of 500 seconds or higher.
|
||||
The example time is sufficent for most upgrades but this can be
|
||||
tuned higher based on specific upgrade time requirements.
|
||||
The module will exit with a failure message if the timer is
|
||||
not set to 500 seconds or higher.
|
||||
- This module requires both the ANSIBLE_PERSISTENT_CONNECT_TIMEOUT and
|
||||
ANSIBLE_PERSISTENT_COMMAND_TIMEOUT timers to be set to 600 seconds or higher.
|
||||
The module will exit if the timers are not set properly.
|
||||
- Do not include full file paths, just the name of the file(s) stored on
|
||||
the top level flash directory.
|
||||
- This module attempts to install the software immediately,
|
||||
|
@ -81,7 +77,6 @@ EXAMPLES = '''
|
|||
nxos_install_os:
|
||||
system_image_file: nxos.7.0.3.I6.1.bin
|
||||
issu: desired
|
||||
provider: "{{ connection | combine({'timeout': 500}) }}"
|
||||
|
||||
- name: Wait for device to come back up with new image
|
||||
wait_for:
|
||||
|
@ -129,25 +124,6 @@ from ansible.module_utils.network.nxos.nxos import nxos_argument_spec, check_arg
|
|||
from ansible.module_utils.basic import AnsibleModule
|
||||
|
||||
|
||||
def check_ansible_timer(module):
|
||||
'''Check Ansible Timer Values'''
|
||||
msg = "The 'timeout' provider param value for this module to execute\n"
|
||||
msg = msg + 'properly is too low.\n'
|
||||
msg = msg + 'Upgrades can take a long time so the value needs to be set\n'
|
||||
msg = msg + 'to the recommended value of 500 seconds or higher in the\n'
|
||||
msg = msg + 'ansible playbook for the nxos_install_os module.\n'
|
||||
msg = msg + '\n'
|
||||
msg = msg + 'provider: "{{ connection | combine({\'timeout\': 500}) }}"'
|
||||
data = module.params.get('provider')
|
||||
timer_low = False
|
||||
if data.get('timeout') is None:
|
||||
timer_low = True
|
||||
if data.get('timeout') is not None and data.get('timeout') < 500:
|
||||
timer_low = True
|
||||
if timer_low:
|
||||
module.fail_json(msg=msg.split('\n'))
|
||||
|
||||
|
||||
# Output options are 'text' or 'json'
|
||||
def execute_show_command(module, command, output='text'):
|
||||
cmds = [{
|
||||
|
@ -276,6 +252,9 @@ def parse_show_install(data):
|
|||
if re.search(r'Install has been successful', x):
|
||||
ud['upgrade_succeeded'] = True
|
||||
break
|
||||
if re.search(r'Switching over onto standby', x):
|
||||
ud['upgrade_succeeded'] = True
|
||||
break
|
||||
|
||||
# We get these messages when the upgrade is non-disruptive and
|
||||
# we loose connection with the switchover but far enough along that
|
||||
|
@ -539,10 +518,6 @@ def main():
|
|||
warnings = list()
|
||||
check_args(module, warnings)
|
||||
|
||||
# This module will error out if the Ansible task timeout value is not
|
||||
# tuned high enough.
|
||||
check_ansible_timer(module)
|
||||
|
||||
# Get system_image_file(sif), kickstart_image_file(kif) and
|
||||
# issu settings from module params.
|
||||
sif = module.params['system_image_file']
|
||||
|
|
|
@ -203,6 +203,7 @@ from copy import deepcopy
|
|||
|
||||
from ansible.module_utils.network.nxos.nxos import load_config, run_commands
|
||||
from ansible.module_utils.network.nxos.nxos import nxos_argument_spec, normalize_interface
|
||||
from ansible.module_utils.network.nxos.nxos import get_interface_type
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.network.common.utils import conditional, remove_default_spec
|
||||
|
||||
|
@ -231,27 +232,6 @@ def search_obj_in_list(name, lst):
|
|||
return None
|
||||
|
||||
|
||||
def get_interface_type(interface):
|
||||
"""Gets the type of interface
|
||||
"""
|
||||
if interface.upper().startswith('ET'):
|
||||
return 'ethernet'
|
||||
elif interface.upper().startswith('VL'):
|
||||
return 'svi'
|
||||
elif interface.upper().startswith('LO'):
|
||||
return 'loopback'
|
||||
elif interface.upper().startswith('MG'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('MA'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('PO'):
|
||||
return 'portchannel'
|
||||
elif interface.upper().startswith('NV'):
|
||||
return 'nve'
|
||||
else:
|
||||
return 'unknown'
|
||||
|
||||
|
||||
def get_interfaces_dict(module):
|
||||
"""Gets all active interfaces on a given switch
|
||||
"""
|
||||
|
|
|
@ -120,36 +120,11 @@ import re
|
|||
from copy import deepcopy
|
||||
|
||||
from ansible.module_utils.network.nxos.nxos import get_config, load_config, run_commands
|
||||
from ansible.module_utils.network.nxos.nxos import nxos_argument_spec
|
||||
from ansible.module_utils.network.nxos.nxos import nxos_argument_spec, get_interface_type
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.network.common.utils import remove_default_spec
|
||||
|
||||
|
||||
def get_interface_type(name):
|
||||
"""Gets the type of interface
|
||||
Args:
|
||||
interface (str): full name of interface, i.e. Ethernet1/1, loopback10,
|
||||
port-channel20, vlan20
|
||||
Returns:
|
||||
type of interface: ethernet, svi, loopback, management, portchannel,
|
||||
or unknown
|
||||
"""
|
||||
if name.upper().startswith('ET'):
|
||||
return 'ethernet'
|
||||
elif name.upper().startswith('VL'):
|
||||
return 'svi'
|
||||
elif name.upper().startswith('LO'):
|
||||
return 'loopback'
|
||||
elif name.upper().startswith('MG'):
|
||||
return 'management'
|
||||
elif name.upper().startswith('MA'):
|
||||
return 'management'
|
||||
elif name.upper().startswith('PO'):
|
||||
return 'portchannel'
|
||||
else:
|
||||
return 'unknown'
|
||||
|
||||
|
||||
def get_interface_mode(name, module):
|
||||
"""Gets current mode of interface: layer2 or layer3
|
||||
Args:
|
||||
|
|
|
@ -135,6 +135,7 @@ import re
|
|||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.network.nxos.nxos import get_config, load_config, run_commands
|
||||
from ansible.module_utils.network.nxos.nxos import nxos_argument_spec, check_args
|
||||
from ansible.module_utils.network.nxos.nxos import get_interface_type
|
||||
from ansible.module_utils.six import string_types
|
||||
|
||||
|
||||
|
@ -200,23 +201,6 @@ def local_existing(gexisting):
|
|||
return gexisting, jp_bidir, isauth
|
||||
|
||||
|
||||
def get_interface_type(interface):
|
||||
if interface.upper().startswith('ET'):
|
||||
return 'ethernet'
|
||||
elif interface.upper().startswith('VL'):
|
||||
return 'svi'
|
||||
elif interface.upper().startswith('LO'):
|
||||
return 'loopback'
|
||||
elif interface.upper().startswith('MG'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('MA'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('PO'):
|
||||
return 'portchannel'
|
||||
else:
|
||||
return 'unknown'
|
||||
|
||||
|
||||
def get_interface_mode(interface, intf_type, module):
|
||||
mode = 'unknown'
|
||||
command = 'show interface {0}'.format(interface)
|
||||
|
|
|
@ -454,10 +454,8 @@ def parse_vni(module, vlan_id):
|
|||
return str(vni)
|
||||
|
||||
|
||||
def parse_interfaces(module, vlan):
|
||||
def get_vlan_int(interfaces):
|
||||
vlan_int = []
|
||||
interfaces = vlan.get('vlanshowplist-ifidx')
|
||||
if interfaces:
|
||||
for i in interfaces.split(','):
|
||||
if 'eth' in i.lower() and '-' in i:
|
||||
int_range = i.split('-')
|
||||
|
@ -468,7 +466,19 @@ def parse_interfaces(module, vlan):
|
|||
vlan_int.append(eth + '/' + str(r))
|
||||
else:
|
||||
vlan_int.append(i)
|
||||
return vlan_int
|
||||
|
||||
|
||||
def parse_interfaces(module, vlan):
|
||||
vlan_int = []
|
||||
interfaces = vlan.get('vlanshowplist-ifidx')
|
||||
if interfaces:
|
||||
if isinstance(interfaces, list):
|
||||
interfaces_list = [i.strip() for i in interfaces]
|
||||
interfaces_str = ','.join(interfaces_list)
|
||||
vlan_int = get_vlan_int(interfaces_str)
|
||||
else:
|
||||
vlan_int = get_vlan_int(interfaces)
|
||||
return vlan_int
|
||||
|
||||
|
||||
|
|
|
@ -175,7 +175,7 @@ from copy import deepcopy
|
|||
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.network.nxos.nxos import load_config, run_commands
|
||||
from ansible.module_utils.network.nxos.nxos import nxos_argument_spec
|
||||
from ansible.module_utils.network.nxos.nxos import nxos_argument_spec, get_interface_type
|
||||
from ansible.module_utils.network.common.utils import remove_default_spec
|
||||
|
||||
|
||||
|
@ -262,6 +262,7 @@ def map_obj_to_commands(updates, module):
|
|||
if interfaces and interfaces[0] != 'default':
|
||||
for i in interfaces:
|
||||
commands.append('interface {0}'.format(i))
|
||||
if get_interface_type(i) in ('ethernet', 'portchannel'):
|
||||
commands.append('no switchport')
|
||||
commands.append('vrf member {0}'.format(name))
|
||||
|
||||
|
@ -296,6 +297,7 @@ def map_obj_to_commands(updates, module):
|
|||
commands.append('vrf context {0}'.format(name))
|
||||
commands.append('exit')
|
||||
commands.append('interface {0}'.format(i))
|
||||
if get_interface_type(i) in ('ethernet', 'portchannel'):
|
||||
commands.append('no switchport')
|
||||
commands.append('vrf member {0}'.format(name))
|
||||
|
||||
|
@ -305,6 +307,7 @@ def map_obj_to_commands(updates, module):
|
|||
commands.append('vrf context {0}'.format(name))
|
||||
commands.append('exit')
|
||||
commands.append('interface {0}'.format(i))
|
||||
if get_interface_type(i) in ('ethernet', 'portchannel'):
|
||||
commands.append('no switchport')
|
||||
commands.append('vrf member {0}'.format(name))
|
||||
|
||||
|
@ -313,6 +316,7 @@ def map_obj_to_commands(updates, module):
|
|||
commands.append('vrf context {0}'.format(name))
|
||||
commands.append('exit')
|
||||
commands.append('interface {0}'.format(i))
|
||||
if get_interface_type(i) in ('ethernet', 'portchannel'):
|
||||
commands.append('no switchport')
|
||||
commands.append('no vrf member {0}'.format(name))
|
||||
elif interfaces and interfaces[0] == 'default':
|
||||
|
@ -321,6 +325,7 @@ def map_obj_to_commands(updates, module):
|
|||
commands.append('vrf context {0}'.format(name))
|
||||
commands.append('exit')
|
||||
commands.append('interface {0}'.format(i))
|
||||
if get_interface_type(i) in ('ethernet', 'portchannel'):
|
||||
commands.append('no switchport')
|
||||
commands.append('no vrf member {0}'.format(name))
|
||||
|
||||
|
|
|
@ -82,6 +82,7 @@ import re
|
|||
|
||||
from ansible.module_utils.network.nxos.nxos import load_config, run_commands
|
||||
from ansible.module_utils.network.nxos.nxos import get_capabilities, nxos_argument_spec
|
||||
from ansible.module_utils.network.nxos.nxos import get_interface_type
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
|
||||
|
||||
|
@ -97,23 +98,6 @@ def execute_show_command(command, module):
|
|||
return run_commands(module, cmds)[0]
|
||||
|
||||
|
||||
def get_interface_type(interface):
|
||||
if interface.upper().startswith('ET'):
|
||||
return 'ethernet'
|
||||
elif interface.upper().startswith('VL'):
|
||||
return 'svi'
|
||||
elif interface.upper().startswith('LO'):
|
||||
return 'loopback'
|
||||
elif interface.upper().startswith('MG'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('MA'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('PO'):
|
||||
return 'portchannel'
|
||||
else:
|
||||
return 'unknown'
|
||||
|
||||
|
||||
def get_interface_mode(interface, intf_type, module):
|
||||
command = 'show interface {0}'.format(interface)
|
||||
interface = {}
|
||||
|
|
|
@ -118,6 +118,7 @@ commands:
|
|||
|
||||
from ansible.module_utils.network.nxos.nxos import load_config, run_commands
|
||||
from ansible.module_utils.network.nxos.nxos import get_capabilities, nxos_argument_spec
|
||||
from ansible.module_utils.network.nxos.nxos import get_interface_type
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
|
||||
|
||||
|
@ -154,23 +155,6 @@ def apply_key_map(key_map, table):
|
|||
return new_dict
|
||||
|
||||
|
||||
def get_interface_type(interface):
|
||||
if interface.upper().startswith('ET'):
|
||||
return 'ethernet'
|
||||
elif interface.upper().startswith('VL'):
|
||||
return 'svi'
|
||||
elif interface.upper().startswith('LO'):
|
||||
return 'loopback'
|
||||
elif interface.upper().startswith('MG'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('MA'):
|
||||
return 'management'
|
||||
elif interface.upper().startswith('PO'):
|
||||
return 'portchannel'
|
||||
else:
|
||||
return 'unknown'
|
||||
|
||||
|
||||
def is_default(interface, module):
|
||||
command = 'show run interface {0}'.format(interface)
|
||||
|
||||
|
|
|
@ -55,6 +55,12 @@ class ActionModule(_ActionModule):
|
|||
elif self._play_context.connection == 'local':
|
||||
self._task.args['username'] = self._play_context.connection_user
|
||||
|
||||
if self._task.action == 'nxos_install_os':
|
||||
if C.PERSISTENT_COMMAND_TIMEOUT < 600 or C.PERSISTENT_CONNECT_TIMEOUT < 600:
|
||||
msg = 'PERSISTENT_COMMAND_TIMEOUT and PERSISTENT_CONNECT_TIMEOUT'
|
||||
msg += ' must be set to 600 seconds or higher when using nxos_install_os module'
|
||||
return {'failed': True, 'msg': msg}
|
||||
|
||||
if self._play_context.connection in ('network_cli', 'httpapi'):
|
||||
provider = self._task.args.get('provider', {})
|
||||
if any(provider.values()):
|
||||
|
|
|
@ -94,8 +94,11 @@ class Cliconf(CliconfBase):
|
|||
def get_capabilities(self):
|
||||
result = {}
|
||||
result['rpc'] = self.get_base_rpc()
|
||||
result['network_api'] = 'cliconf'
|
||||
result['device_info'] = self.get_device_info()
|
||||
if isinstance(self._connection, NetworkCli):
|
||||
result['network_api'] = 'cliconf'
|
||||
else:
|
||||
result['network_api'] = 'eapi'
|
||||
return json.dumps(result)
|
||||
|
||||
# Imported from module_utils
|
||||
|
|
|
@ -95,8 +95,11 @@ class Cliconf(CliconfBase):
|
|||
def get_capabilities(self):
|
||||
result = {}
|
||||
result['rpc'] = self.get_base_rpc()
|
||||
result['network_api'] = 'cliconf'
|
||||
result['device_info'] = self.get_device_info()
|
||||
if isinstance(self._connection, NetworkCli):
|
||||
result['network_api'] = 'cliconf'
|
||||
else:
|
||||
result['network_api'] = 'nxapi'
|
||||
return json.dumps(result)
|
||||
|
||||
# Migrated from module_utils
|
||||
|
|
|
@ -89,9 +89,13 @@ class HttpApi:
|
|||
out = to_text(exc)
|
||||
|
||||
out = to_list(out)
|
||||
if not out[0]:
|
||||
return out
|
||||
|
||||
for index, response in enumerate(out):
|
||||
if response[0] == '{':
|
||||
out[index] = json.loads(response)
|
||||
|
||||
return out
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
---
|
||||
testcase: "upgrade"
|
2
test/integration/targets/nxos_install_os/meta/main.yml
Normal file
2
test/integration/targets/nxos_install_os/meta/main.yml
Normal file
|
@ -0,0 +1,2 @@
|
|||
dependencies:
|
||||
- prepare_nxos_tests
|
16
test/integration/targets/nxos_install_os/tasks/httpapi.yaml
Normal file
16
test/integration/targets/nxos_install_os/tasks/httpapi.yaml
Normal file
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
- name: collect common test cases
|
||||
find:
|
||||
paths: "{{ role_path }}/tests/common"
|
||||
patterns: "{{ testcase }}.yaml"
|
||||
connection: local
|
||||
register: test_cases
|
||||
|
||||
- name: set test_items
|
||||
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
|
||||
|
||||
- name: run test cases (ansible_connection=httpapi)
|
||||
include: "{{ test_case_to_run }} ansible_connection=httpapi"
|
||||
with_items: "{{ test_items }}"
|
||||
loop_control:
|
||||
loop_var: test_case_to_run
|
5
test/integration/targets/nxos_install_os/tasks/main.yaml
Normal file
5
test/integration/targets/nxos_install_os/tasks/main.yaml
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
- { include: network_cli.yaml, tags: ['cli'] }
|
||||
- { include: network_local.yaml, tags: ['local'] }
|
||||
- { include: httpapi.yaml, tags: ['httpapi'] }
|
||||
- { include: nxapi.yaml, tags: ['nxapi'] }
|
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
- name: collect common test cases
|
||||
find:
|
||||
paths: "{{ role_path }}/tests/common"
|
||||
patterns: "{{ testcase }}.yaml"
|
||||
connection: local
|
||||
register: test_cases
|
||||
|
||||
- name: set test_items
|
||||
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
|
||||
|
||||
- name: run test cases (ansible_connection=network_cli)
|
||||
include: "{{ test_case_to_run }} ansible_connection=network_cli"
|
||||
with_items: "{{ test_items }}"
|
||||
loop_control:
|
||||
loop_var: test_case_to_run
|
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
- name: collect common test cases
|
||||
find:
|
||||
paths: "{{ role_path }}/tests/common"
|
||||
patterns: "{{ testcase }}.yaml"
|
||||
connection: local
|
||||
register: test_cases
|
||||
|
||||
- name: set test_items
|
||||
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
|
||||
|
||||
- name: run test case (ansible_connection=local transport=ssh)
|
||||
include: "{{ test_case_to_run }} ansible_connection=local connection={{ cli }}"
|
||||
with_first_found: "{{ test_items }}"
|
||||
loop_control:
|
||||
loop_var: test_case_to_run
|
16
test/integration/targets/nxos_install_os/tasks/nxapi.yaml
Normal file
16
test/integration/targets/nxos_install_os/tasks/nxapi.yaml
Normal file
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
- name: collect common test cases
|
||||
find:
|
||||
paths: "{{ role_path }}/tests/common"
|
||||
patterns: "{{ testcase }}.yaml"
|
||||
connection: local
|
||||
register: test_cases
|
||||
|
||||
- name: set test_items
|
||||
set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
|
||||
|
||||
- name: run test cases (ansible_connection=local transport=nxapi)
|
||||
include: "{{ test_case_to_run }} ansible_connection=local connection={{ nxapi }}"
|
||||
with_items: "{{ test_items }}"
|
||||
loop_control:
|
||||
loop_var: test_case_to_run
|
|
@ -0,0 +1,19 @@
|
|||
---
|
||||
# This playbook is only provided for reference as a brute force way to
|
||||
# clear persistent connections on an Ansible server. This was a workaround
|
||||
# for a problem with meta: reset_connection but should not be used in
|
||||
# ansible release 2.6 or later.
|
||||
- name: Clean up sockets with file module
|
||||
file:
|
||||
state: absent
|
||||
path: "{{ home }}/.ansible/pc/"
|
||||
delegate_to: 127.0.0.1
|
||||
|
||||
- name: "Display socket info after delete"
|
||||
shell: "/bin/ls {{ home }}/.ansible"
|
||||
args:
|
||||
executable: /bin/bash
|
||||
delegate_to: 127.0.0.1
|
||||
register: output
|
||||
|
||||
- debug: msg="Local Socket Info {{ output['stdout_lines'] }}"
|
|
@ -0,0 +1,41 @@
|
|||
---
|
||||
- set_fact: ignore_errors_httpapi='no'
|
||||
- set_fact: ignore_errors_httpapi='yes'
|
||||
when: ansible_connection == 'httpapi'
|
||||
|
||||
- include: targets/nxos_install_os/tasks/upgrade/enable_scp_server.yaml
|
||||
when: connection is not defined
|
||||
|
||||
- include: targets/nxos_install_os/tasks/upgrade/enable_scp_server_provider.yaml
|
||||
when: connection is defined
|
||||
|
||||
- name: "Copy {{ si }} to bootflash"
|
||||
nxos_file_copy:
|
||||
local_file: "{{image_dir}}{{ si }}"
|
||||
file_system: "bootflash:"
|
||||
register: result
|
||||
ignore_errors: "{{ ignore_errors_httpapi }}"
|
||||
|
||||
- name: "Copy {{ si }} to bootflash"
|
||||
nxos_file_copy:
|
||||
local_file: "{{image_dir}}{{ si }}"
|
||||
file_system: "bootflash:"
|
||||
register: result
|
||||
ignore_errors: "{{ ignore_errors_httpapi }}"
|
||||
|
||||
- debug:
|
||||
msg: "{{ item.key }} {{ item.value }}"
|
||||
with_dict: "{{ result }}"
|
||||
|
||||
- name: "Copy {{ ki }} to bootflash"
|
||||
nxos_file_copy:
|
||||
local_file: "{{image_dir}}/{{ ki }}"
|
||||
file_system: "bootflash:"
|
||||
register: result
|
||||
when: ki is defined
|
||||
ignore_errors: "{{ ignore_errors_httpapi }}"
|
||||
|
||||
- debug:
|
||||
msg: "{{ item.key }} {{ item.value }}"
|
||||
with_dict: "{{ result }}"
|
||||
when: ki is defined
|
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
- name: "Delete Files To Make Room On Bootflash"
|
||||
nxos_config: &remove_file
|
||||
lines:
|
||||
- terminal dont-ask
|
||||
- allow delete boot-image
|
||||
- "delete {{ item }}"
|
||||
match: none
|
||||
ignore_errors: yes
|
||||
with_items: "{{ delete_image_list }}"
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
- name: "Delete Files To Make Room On Bootflash using provider"
|
||||
nxos_config: &remove_file
|
||||
lines:
|
||||
- terminal dont-ask
|
||||
- allow delete boot-image
|
||||
- "delete {{ item }}"
|
||||
match: none
|
||||
provider: "{{ connection }}"
|
||||
ignore_errors: yes
|
||||
with_items: "{{ delete_image_list }}"
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
- name: "Setup - Turn on feature scp-server"
|
||||
nxos_feature:
|
||||
feature: scp-server
|
||||
state: enabled
|
|
@ -0,0 +1,6 @@
|
|||
---
|
||||
- name: "Setup - Turn on feature scp-server using provider"
|
||||
nxos_feature:
|
||||
feature: scp-server
|
||||
state: enabled
|
||||
provider: "{{ connection }}"
|
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
- include: targets/nxos_install_os/tasks/upgrade/delete_files.yaml
|
||||
when: delete_image_list is defined
|
||||
|
||||
- include: targets/nxos_install_os/tasks/upgrade/copy_kick_system_images.yaml
|
||||
|
||||
- include: targets/nxos_install_os/tasks/upgrade/install_with_kick.yaml
|
||||
when: ki is defined and combined is undefined
|
||||
|
||||
- include: targets/nxos_install_os/tasks/upgrade/install_system.yaml
|
||||
when: combined is defined
|
||||
|
||||
# Only needed when - meta: reset_connection does not work. Fixed in 2.6
|
||||
#- include: targets/nxos_install_os/tasks/upgrade/clear_persistent_sockets.yaml
|
||||
|
||||
- meta: reset_connection
|
||||
|
||||
- name: "Check installed OS for newly installed version {{ tv }}"
|
||||
nxos_command:
|
||||
commands: ['show version | json']
|
||||
register: output
|
||||
|
||||
- debug: msg="Version detected {{ output['stdout_lines'][0]['kickstart_ver_str'] }}"
|
|
@ -0,0 +1,24 @@
|
|||
---
|
||||
- include: targets/nxos_install_os/tasks/upgrade/delete_files_provider.yaml
|
||||
when: delete_image_list is defined
|
||||
|
||||
- include: targets/nxos_install_os/tasks/upgrade/copy_kick_system_images.yaml
|
||||
|
||||
- include: targets/nxos_install_os/tasks/upgrade/install_with_kick_provider.yaml
|
||||
when: ki is defined and combined is undefined
|
||||
|
||||
- include: targets/nxos_install_os/tasks/upgrade/install_system_provider.yaml
|
||||
when: combined is defined
|
||||
|
||||
# Only needed when - meta: reset_connection does not work. Fixed in 2.6
|
||||
#- include: targets/nxos_install_os/tasks/upgrade/clear_persistent_sockets.yaml
|
||||
|
||||
- meta: reset_connection
|
||||
|
||||
- name: "Check installed OS for newly installed version {{ tv }}"
|
||||
nxos_command:
|
||||
commands: ['show version | json']
|
||||
provider: "{{ connection }}"
|
||||
register: output
|
||||
|
||||
- debug: msg="Version detected {{ output['stdout_lines'][0]['kickstart_ver_str'] }}"
|
|
@ -0,0 +1,24 @@
|
|||
---
|
||||
- name: "Install OS image {{ si }}"
|
||||
check_mode: "{{ checkmode }}"
|
||||
nxos_install_os:
|
||||
system_image_file: "{{ si }}"
|
||||
issu: "{{ issu }}"
|
||||
register: result
|
||||
|
||||
- debug: msg=" {{ result['install_state'] }}"
|
||||
|
||||
- name: Wait for device to come back up with new image
|
||||
wait_for:
|
||||
port: 22
|
||||
state: started
|
||||
timeout: 500
|
||||
delay: 60
|
||||
host: "{{ inventory_hostname }}"
|
||||
when: result.changed and not checkmode
|
||||
|
||||
- debug: msg='Wait 5 mins to allow system to stabilize'
|
||||
when: result.changed and not checkmode
|
||||
- pause:
|
||||
seconds: 300
|
||||
when: result.changed and not checkmode
|
|
@ -0,0 +1,25 @@
|
|||
---
|
||||
- name: "Install OS image {{ si }} using provider"
|
||||
check_mode: "{{ checkmode }}"
|
||||
nxos_install_os:
|
||||
system_image_file: "{{ si }}"
|
||||
issu: "{{ issu }}"
|
||||
provider: "{{ connection }}"
|
||||
register: result
|
||||
|
||||
- debug: msg=" {{ result['install_state'] }}"
|
||||
|
||||
- name: Wait for device to come back up with new image
|
||||
wait_for:
|
||||
port: 22
|
||||
state: started
|
||||
timeout: 500
|
||||
delay: 60
|
||||
host: "{{ inventory_hostname }}"
|
||||
when: result.changed and not checkmode
|
||||
|
||||
- debug: msg='Wait 5 mins to allow system to stabilize'
|
||||
when: result.changed and not checkmode
|
||||
- pause:
|
||||
seconds: 300
|
||||
when: result.changed and not checkmode
|
|
@ -0,0 +1,25 @@
|
|||
---
|
||||
- name: "Install OS image {{ si }}"
|
||||
check_mode: "{{ checkmode }}"
|
||||
nxos_install_os:
|
||||
system_image_file: "{{ si }}"
|
||||
kickstart_image_file: "{{ ki }}"
|
||||
issu: "{{ issu }}"
|
||||
register: result
|
||||
|
||||
- debug: msg=" {{ result['install_state'] }}"
|
||||
|
||||
- name: Wait for device to come back up with new image
|
||||
wait_for:
|
||||
port: 22
|
||||
state: started
|
||||
timeout: 500
|
||||
delay: 60
|
||||
host: "{{ inventory_hostname }}"
|
||||
when: result.changed and not checkmode
|
||||
|
||||
- debug: msg='Wait 5 mins to allow system to stabilize'
|
||||
when: result.changed and not checkmode
|
||||
- pause:
|
||||
seconds: 300
|
||||
when: result.changed and not checkmode
|
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
- name: "Install OS image {{ si }} using provider"
|
||||
check_mode: "{{ checkmode }}"
|
||||
nxos_install_os:
|
||||
system_image_file: "{{ si }}"
|
||||
kickstart_image_file: "{{ ki }}"
|
||||
issu: "{{ issu }}"
|
||||
provider: "{{ connection }}"
|
||||
register: result
|
||||
|
||||
- debug: msg=" {{ result['install_state'] }}"
|
||||
|
||||
- name: Wait for device to come back up with new image
|
||||
wait_for:
|
||||
port: 22
|
||||
state: started
|
||||
timeout: 500
|
||||
delay: 60
|
||||
host: "{{ inventory_hostname }}"
|
||||
when: result.changed and not checkmode
|
||||
|
||||
- debug: msg='Wait 5 mins to allow system to stabilize'
|
||||
when: result.changed and not checkmode
|
||||
- pause:
|
||||
seconds: 300
|
||||
when: result.changed and not checkmode
|
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
- debug: msg="***WARNING*** Remove meta end_play to verify this module ***WARNING***"
|
||||
|
||||
- meta: end_play
|
||||
|
||||
- include: targets/nxos_install_os/tasks/upgrade/install_os.yaml
|
||||
when: connection is not defined
|
||||
|
||||
- include: targets/nxos_install_os/tasks/upgrade/install_os_provider.yaml
|
||||
when: connection is defined
|
|
@ -0,0 +1,22 @@
|
|||
---
|
||||
- name: "Reload to upgrade to OS image {{ si }}"
|
||||
nxos_config:
|
||||
lines:
|
||||
- terminal dont-ask
|
||||
- no boot nxos
|
||||
- "boot nxos bootflash:{{ si }}"
|
||||
- reload
|
||||
match: none
|
||||
ignore_errors: yes
|
||||
|
||||
- name: Wait for device to come back up with new image
|
||||
wait_for:
|
||||
port: 22
|
||||
state: started
|
||||
timeout: 500
|
||||
delay: 60
|
||||
host: "{{ inventory_hostname }}"
|
||||
|
||||
- debug: msg='Wait 5 mins to allow system to stabilize'
|
||||
- pause:
|
||||
seconds: 300
|
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
- name: "Reload to upgrade to OS image {{ si }} using provider"
|
||||
nxos_config:
|
||||
lines:
|
||||
- terminal dont-ask
|
||||
- no boot nxos
|
||||
- "boot nxos bootflash:{{ si }}"
|
||||
- reload
|
||||
match: none
|
||||
provider: "{{ connection }}"
|
||||
ignore_errors: yes
|
||||
|
||||
- name: Wait for device to come back up with new image
|
||||
wait_for:
|
||||
port: 22
|
||||
state: started
|
||||
timeout: 500
|
||||
delay: 60
|
||||
host: "{{ inventory_hostname }}"
|
||||
|
||||
- debug: msg='Wait 5 mins to allow system to stabilize'
|
||||
- pause:
|
||||
seconds: 300
|
|
@ -0,0 +1,56 @@
|
|||
---
|
||||
- debug: msg="START connection={{ ansible_connection }} nxos_os_install upgrade"
|
||||
- debug: msg="Using provider={{ connection.transport }}"
|
||||
when: connection is defined
|
||||
|
||||
- set_fact: checkmode='no'
|
||||
- set_fact: issu='desired'
|
||||
|
||||
- set_fact: image_dir='/Users/mwiebe/Projects/nxos_ansible/images/'
|
||||
|
||||
- set_fact:
|
||||
delete_image_list:
|
||||
- nxos.7.0.3.I7.2.bin
|
||||
- nxos.7.0.3.I7.3.bin
|
||||
|
||||
#---------------------------------------------------------#
|
||||
# Upgrade to 6.0(2)U6(1a) #
|
||||
#---------------------------------------------------------#
|
||||
|
||||
- set_fact: si='n3000-uk9.6.0.2.U6.1a.bin'
|
||||
- set_fact: ki='n3000-uk9-kickstart.6.0.2.U6.1a.bin'
|
||||
|
||||
- name: Upgrade to U6.1a
|
||||
include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml
|
||||
|
||||
#---------------------------------------------------------#
|
||||
# Upgrade to 6.0(2)U6(2a) #
|
||||
#---------------------------------------------------------#
|
||||
|
||||
- set_fact: si='n3000-uk9.6.0.2.U6.2a.bin'
|
||||
- set_fact: ki='n3000-uk9-kickstart.6.0.2.U6.2a.bin'
|
||||
|
||||
- name: Upgrade to U6.2a
|
||||
include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml
|
||||
|
||||
#---------------------------------------------------------#
|
||||
# Upgrade to 6.0(2)U6(3a) #
|
||||
#---------------------------------------------------------#
|
||||
|
||||
- set_fact: si='n3000-uk9.6.0.2.U6.3a.bin'
|
||||
- set_fact: ki='n3000-uk9-kickstart.6.0.2.U6.3a.bin'
|
||||
|
||||
- name: Upgrade to U6.3a
|
||||
include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml
|
||||
|
||||
#---------------------------------------------------------#
|
||||
# Upgrade to 7.0(3)I7(3) #
|
||||
#---------------------------------------------------------#
|
||||
|
||||
- set_fact: si='nxos.7.0.3.I7.2.bin'
|
||||
- set_fact: combined='true'
|
||||
|
||||
- name: Upgrade to 7.0.3.I7.2
|
||||
include: targets/nxos_install_os/tasks/upgrade/main_os_install.yaml
|
||||
|
||||
- debug: msg="END connection={{ ansible_connection }} nxos_os_install upgrade"
|
|
@ -7,6 +7,13 @@
|
|||
- set_fact: testint2="{{ nxos_int2 }}"
|
||||
|
||||
- block:
|
||||
- name: Install and Enable FabricPath feature set
|
||||
nxos_config:
|
||||
lines:
|
||||
- install feature-set fabricpath
|
||||
- feature-set fabricpath
|
||||
when: platform is search('N5K|N7K')
|
||||
|
||||
- name: "Enable feature vn segment"
|
||||
nxos_config:
|
||||
commands:
|
||||
|
@ -114,41 +121,41 @@
|
|||
when: platform is search('N3K|N7K')
|
||||
|
||||
# Uncomment this once the get_capabilities() work on nxapi as well
|
||||
# - name: Change mode
|
||||
# nxos_vlan: &mode1
|
||||
# vlan_id: 50
|
||||
# mode: fabricpath
|
||||
# register: result
|
||||
# when: platform is search('N5k|N7K')
|
||||
#
|
||||
# - assert: *true
|
||||
# when: platform is search('N5k|N7K')
|
||||
#
|
||||
# - name: "mode1 Idempotence"
|
||||
# nxos_vlan: *mode1
|
||||
# register: result
|
||||
# when: platform is search('N5k|N7K')
|
||||
#
|
||||
# - assert: *false
|
||||
# when: platform is search('N5k|N7K')
|
||||
#
|
||||
# - name: Change mode again
|
||||
# nxos_vlan: &mode2
|
||||
# vlan_id: 50
|
||||
# mode: ce
|
||||
# register: result
|
||||
# when: platform is search('N5k|N7K')
|
||||
#
|
||||
# - assert: *true
|
||||
# when: platform is search('N5k|N7K')
|
||||
#
|
||||
# - name: "mode2 Idempotence"
|
||||
# nxos_vlan: *mode2
|
||||
# register: result
|
||||
# when: platform is search('N5k|N7K')
|
||||
#
|
||||
# - assert: *false
|
||||
# when: platform is search('N5k|N7K')
|
||||
- name: Change mode
|
||||
nxos_vlan: &mode1
|
||||
vlan_id: 50
|
||||
mode: fabricpath
|
||||
register: result
|
||||
when: platform is search('N5K|N7K')
|
||||
|
||||
- assert: *true
|
||||
when: platform is search('N5K|N7K')
|
||||
|
||||
- name: "mode1 Idempotence"
|
||||
nxos_vlan: *mode1
|
||||
register: result
|
||||
when: platform is search('N5K|N7K')
|
||||
|
||||
- assert: *false
|
||||
when: platform is search('N5K|N7K')
|
||||
|
||||
- name: Change mode again
|
||||
nxos_vlan: &mode2
|
||||
vlan_id: 50
|
||||
mode: ce
|
||||
register: result
|
||||
when: platform is search('N5K|N7K')
|
||||
|
||||
- assert: *true
|
||||
when: platform is search('N5K|N7K')
|
||||
|
||||
- name: "mode2 Idempotence"
|
||||
nxos_vlan: *mode2
|
||||
register: result
|
||||
when: platform is search('N5K|N7K')
|
||||
|
||||
- assert: *false
|
||||
when: platform is search('N5K|N7K')
|
||||
|
||||
- name: Ensure VLAN is NOT on the device
|
||||
nxos_vlan: &no_vlan
|
||||
|
|
Loading…
Reference in a new issue