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 commit a7421e8611)

* fix nxos_vrf and migrate get_interface_type to module_utils (#40825)

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>
(cherry picked from commit b4baa2d484)

* 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 commit 17b6ecf101)

* 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 commit 9f026309a6)
This commit is contained in:
Trishna Guha 2018-05-30 10:40:25 +05:30 committed by GitHub
parent 828d878bf9
commit 58f018e367
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
41 changed files with 557 additions and 280 deletions

View file

@ -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'

View file

@ -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)

View file

@ -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:

View file

@ -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:

View file

@ -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():

View file

@ -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']

View 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
"""

View file

@ -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:

View file

@ -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)

View file

@ -454,21 +454,31 @@ def parse_vni(module, vlan_id):
return str(vni)
def get_vlan_int(interfaces):
vlan_int = []
for i in interfaces.split(','):
if 'eth' in i.lower() and '-' in i:
int_range = i.split('-')
stop = int((int_range)[1])
start = int(int_range[0].split('/')[1])
eth = int_range[0].split('/')[0]
for r in range(start, stop + 1):
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:
for i in interfaces.split(','):
if 'eth' in i.lower() and '-' in i:
int_range = i.split('-')
stop = int((int_range)[1])
start = int(int_range[0].split('/')[1])
eth = int_range[0].split('/')[0]
for r in range(start, stop + 1):
vlan_int.append(eth + '/' + str(r))
else:
vlan_int.append(i)
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

View file

@ -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,7 +262,8 @@ def map_obj_to_commands(updates, module):
if interfaces and interfaces[0] != 'default':
for i in interfaces:
commands.append('interface {0}'.format(i))
commands.append('no switchport')
if get_interface_type(i) in ('ethernet', 'portchannel'):
commands.append('no switchport')
commands.append('vrf member {0}'.format(name))
else:
@ -296,7 +297,8 @@ def map_obj_to_commands(updates, module):
commands.append('vrf context {0}'.format(name))
commands.append('exit')
commands.append('interface {0}'.format(i))
commands.append('no switchport')
if get_interface_type(i) in ('ethernet', 'portchannel'):
commands.append('no switchport')
commands.append('vrf member {0}'.format(name))
elif set(interfaces) != set(obj_in_have['interfaces']):
@ -305,7 +307,8 @@ def map_obj_to_commands(updates, module):
commands.append('vrf context {0}'.format(name))
commands.append('exit')
commands.append('interface {0}'.format(i))
commands.append('no switchport')
if get_interface_type(i) in ('ethernet', 'portchannel'):
commands.append('no switchport')
commands.append('vrf member {0}'.format(name))
superfluous_interfaces = list(set(obj_in_have['interfaces']) - set(interfaces))
@ -313,7 +316,8 @@ def map_obj_to_commands(updates, module):
commands.append('vrf context {0}'.format(name))
commands.append('exit')
commands.append('interface {0}'.format(i))
commands.append('no switchport')
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':
if obj_in_have['interfaces']:
@ -321,7 +325,8 @@ def map_obj_to_commands(updates, module):
commands.append('vrf context {0}'.format(name))
commands.append('exit')
commands.append('interface {0}'.format(i))
commands.append('no switchport')
if get_interface_type(i) in ('ethernet', 'portchannel'):
commands.append('no switchport')
commands.append('no vrf member {0}'.format(name))
if purge:

View file

@ -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 = {}

View file

@ -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)

View file

@ -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()):

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,2 @@
---
testcase: "upgrade"

View file

@ -0,0 +1,2 @@
dependencies:
- prepare_nxos_tests

View 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

View 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'] }

View 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=network_cli)
include: "{{ test_case_to_run }} ansible_connection=network_cli"
with_items: "{{ test_items }}"
loop_control:
loop_var: test_case_to_run

View 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 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

View 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

View file

@ -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'] }}"

View file

@ -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

View file

@ -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 }}"

View file

@ -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 }}"

View file

@ -0,0 +1,5 @@
---
- name: "Setup - Turn on feature scp-server"
nxos_feature:
feature: scp-server
state: enabled

View file

@ -0,0 +1,6 @@
---
- name: "Setup - Turn on feature scp-server using provider"
nxos_feature:
feature: scp-server
state: enabled
provider: "{{ connection }}"

View file

@ -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'] }}"

View file

@ -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'] }}"

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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"

View file

@ -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