Skip to content

Commit

Permalink
Refactos nxos_ip_interface module (ansible#24885)
Browse files Browse the repository at this point in the history
  • Loading branch information
rcarrillocruz authored May 22, 2017
1 parent 7fba316 commit b12beca
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 6 deletions.
11 changes: 5 additions & 6 deletions lib/ansible/modules/network/nxos/nxos_ip_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@
{"addr": "20.20.20.20", "mask": 24, "tag": 100, "secondary": true}],
"interface": "ethernet1/32", "prefixes": ["11.11.0.0/17", "20.20.20.0/24"],
"type": "ethernet", "vrf": "default"}
updates:
commands:
description: commands sent to the device
returned: always
type: list
Expand Down Expand Up @@ -274,7 +274,7 @@ def parse_unstructured_data(body, interface_name, version, module):
address = each_line.strip().split(' ')[0]
if address not in address_list:
address_list.append(address)
interface['prefixes'].append(str(ipaddress.ip_interface(address.decode('utf-8')).network))
interface['prefixes'].append(str(ipaddress.ip_interface(address).network))

if address_list:
for ipv6 in address_list:
Expand All @@ -299,7 +299,7 @@ def parse_unstructured_data(body, interface_name, version, module):
match_dict['secondary'] = True
match_dict['tag'] = int(match_dict['tag'])
interface['addresses'].append(match_dict)
prefix = str(ipaddress.ip_interface("{addr}/{mask}".format(**match_dict).decode('utf-8')).network)
prefix = str(ipaddress.ip_interface(u"%(addr)s/%(mask)s" % match_dict).network)
interface['prefixes'].append(prefix)

try:
Expand All @@ -319,7 +319,6 @@ def parse_unstructured_data(body, interface_name, version, module):
def get_ip_interface(interface_name, version, module):
body = send_show_command(interface_name, version, module)
interface = parse_unstructured_data(body, interface_name, version, module)

return interface


Expand Down Expand Up @@ -435,7 +434,7 @@ def validate_params(addr, interface, mask, tag, allow_secondary, version, state,
mask=mask)
if addr is not None and mask is not None:
try:
ipaddress.ip_interface('{}/{}'.format(addr, mask).decode('utf-8'))
ipaddress.ip_interface(u'%s/%s' % (addr, mask))
except ValueError:
module.fail_json(msg="Warning! Invalid ip address or mask set.", addr=addr, mask=mask)

Expand Down Expand Up @@ -532,7 +531,7 @@ def main():
results['proposed'] = proposed
results['existing'] = existing
results['end_state'] = end_state
results['updates'] = cmds
results['commands'] = cmds
results['changed'] = changed
results['warnings'] = warnings

Expand Down
1 change: 1 addition & 0 deletions test/runner/requirements/units.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ redis
setuptools > 0.6 # pytest-xdist installed via requirements does not work with very old setuptools (sanity_ok)
unittest2 ; python_version < '2.7'
netaddr
ipaddress

# requirements for F5 specific modules
f5-sdk ; python_version >= '2.7'
Expand Down
30 changes: 30 additions & 0 deletions test/units/modules/network/nxos/fixtures/nxos_ip_interface.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
IP Interface Status for VRF "default"(1)
Ethernet2/4, Interface status: protocol-up/link-up/admin-up, iod: 39,
IP address: 1.1.1.1, IP subnet: 1.1.1.0/8 route-preference: 0, tag: 0
IP broadcast address: 255.255.255.255
IP multicast groups locally joined: none
IP MTU: 1500 bytes (using link MTU)
IP primary address route-preference: 0, tag: 0
IP proxy ARP : disabled
IP Local Proxy ARP : disabled
IP multicast routing: disabled
IP icmp redirects: enabled
IP directed-broadcast: disabled
IP Forwarding: disabled
IP icmp unreachables (except port): disabled
IP icmp port-unreachable: enabled
IP unicast reverse path forwarding: none
IP load sharing: none
IP interface statistics last reset: never
IP interface software stats: (sent/received/forwarded/originated/consumed)
Unicast packets : 0/0/0/0/0
Unicast bytes : 0/0/0/0/0
Multicast packets : 0/0/0/0/0
Multicast bytes : 0/0/0/0/0
Broadcast packets : 0/0/0/0/0
Broadcast bytes : 0/0/0/0/0
Labeled packets : 0/0/0/0/0
Labeled bytes : 0/0/0/0/0
WCCP Redirect outbound: disabled
WCCP Redirect inbound: disabled
WCCP Redirect exclude: disabled
74 changes: 74 additions & 0 deletions test/units/modules/network/nxos/test_nxos_ip_interface.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# (c) 2016 Red Hat Inc.
#
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.

# Make coding more python3-ish
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type

import json

from ansible.compat.tests.mock import patch
from ansible.modules.network.nxos import nxos_ip_interface
from .nxos_module import TestNxosModule, load_fixture, set_module_args


class TestNxosIPInterfaceModule(TestNxosModule):

module = nxos_ip_interface

def setUp(self):
self.mock_get_interface_mode = patch(
'ansible.modules.network.nxos.nxos_ip_interface.get_interface_mode')
self.get_interface_mode = self.mock_get_interface_mode.start()

self.mock_send_show_command = patch(
'ansible.modules.network.nxos.nxos_ip_interface.send_show_command')
self.send_show_command = self.mock_send_show_command.start()

self.mock_load_config = patch('ansible.modules.network.nxos.nxos_ip_interface.load_config')
self.load_config = self.mock_load_config.start()

def tearDown(self):
self.mock_get_interface_mode.stop()
self.mock_send_show_command.stop()
self.mock_load_config.stop()

def load_fixtures(self, commands=None):
self.get_interface_mode.return_value = 'layer3'
self.send_show_command.return_value = [load_fixture('nxos_ip_interface.cfg')]
self.load_config.return_value = None

def test_nxos_ip_interface_ip_present(self):
set_module_args(dict(interface='eth2/1', addr='1.1.1.2', mask=8))
result = self.execute_module(changed=True)
self.assertEqual(result['commands'],
['interface eth2/1',
'no ip address 1.1.1.1/8',
'interface eth2/1',
'ip address 1.1.1.2/8'])

def test_nxos_ip_interface_ip_idempotent(self):
set_module_args(dict(interface='eth2/1', addr='1.1.1.1', mask=8))
result = self.execute_module(changed=False)
self.assertEqual(result['commands'], [])

def test_nxos_ip_interface_ip_absent(self):
set_module_args(dict(interface='eth2/1', state='absent',
addr='1.1.1.1', mask=8))
result = self.execute_module(changed=True)
self.assertEqual(result['commands'],
['interface eth2/1', 'no ip address 1.1.1.1/8'])

0 comments on commit b12beca

Please sign in to comment.