From 47b527224af92cc2acd6f8771a0217714767ea83 Mon Sep 17 00:00:00 2001 From: Tim Rupp Date: Sat, 18 Aug 2018 14:44:23 -0400 Subject: [PATCH] Renames the security_port_list module (#44350) Renames the module by adding a symlink, introducing the new module, and naming the symlink so that it identifies as deprecated. --- .../network/f5/_bigip_security_port_list.py | 1 + ...rt_list.py => bigip_firewall_port_list.py} | 14 +- .../f5/test_bigip_firewall_port_list.py | 130 ++++++++++++++++++ 3 files changed, 138 insertions(+), 7 deletions(-) create mode 120000 lib/ansible/modules/network/f5/_bigip_security_port_list.py rename lib/ansible/modules/network/f5/{bigip_security_port_list.py => bigip_firewall_port_list.py} (98%) create mode 100644 test/units/modules/network/f5/test_bigip_firewall_port_list.py diff --git a/lib/ansible/modules/network/f5/_bigip_security_port_list.py b/lib/ansible/modules/network/f5/_bigip_security_port_list.py new file mode 120000 index 00000000000..a78176b5bf3 --- /dev/null +++ b/lib/ansible/modules/network/f5/_bigip_security_port_list.py @@ -0,0 +1 @@ +bigip_firewall_port_list.py \ No newline at end of file diff --git a/lib/ansible/modules/network/f5/bigip_security_port_list.py b/lib/ansible/modules/network/f5/bigip_firewall_port_list.py similarity index 98% rename from lib/ansible/modules/network/f5/bigip_security_port_list.py rename to lib/ansible/modules/network/f5/bigip_firewall_port_list.py index 30e26c44c47..3da4736706e 100644 --- a/lib/ansible/modules/network/f5/bigip_security_port_list.py +++ b/lib/ansible/modules/network/f5/bigip_firewall_port_list.py @@ -14,7 +14,7 @@ ANSIBLE_METADATA = {'metadata_version': '1.1', DOCUMENTATION = r''' --- -module: bigip_security_port_list +module: bigip_firewall_port_list short_description: Manage port lists on BIG-IP AFM description: - Manages the AFM port lists on a BIG-IP. This module can be used to add @@ -62,7 +62,7 @@ author: EXAMPLES = r''' - name: Create a simple port list - bigip_security_port_list: + bigip_firewall_port_list: name: foo ports: - 80 @@ -74,7 +74,7 @@ EXAMPLES = r''' delegate_to: localhost - name: Override the above list of ports with a new list - bigip_security_port_list: + bigip_firewall_port_list: name: foo ports: - 3389 @@ -87,7 +87,7 @@ EXAMPLES = r''' delegate_to: localhost - name: Create port list with series of ranges - bigip_security_port_list: + bigip_firewall_port_list: name: foo port_ranges: - 25-30 @@ -100,7 +100,7 @@ EXAMPLES = r''' delegate_to: localhost - name: Use multiple types of port arguments - bigip_security_port_list: + bigip_firewall_port_list: name: foo port_ranges: - 25-30 @@ -116,7 +116,7 @@ EXAMPLES = r''' delegate_to: localhost - name: Remove port list - bigip_security_port_list: + bigip_firewall_port_list: name: foo password: secret server: lb.mydomain.com @@ -125,7 +125,7 @@ EXAMPLES = r''' delegate_to: localhost - name: Create port list from a file with one port per line - bigip_security_port_list: + bigip_firewall_port_list: name: lot-of-ports ports: "{{ lookup('file', 'my-large-port-list.txt').split('\n') }}" password: secret diff --git a/test/units/modules/network/f5/test_bigip_firewall_port_list.py b/test/units/modules/network/f5/test_bigip_firewall_port_list.py new file mode 100644 index 00000000000..c37a7a636ea --- /dev/null +++ b/test/units/modules/network/f5/test_bigip_firewall_port_list.py @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- +# +# Copyright: (c) 2017, F5 Networks Inc. +# GNU General Public License v3.0 (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import os +import json +import pytest +import sys + +from nose.plugins.skip import SkipTest +if sys.version_info < (2, 7): + raise SkipTest("F5 Ansible modules require Python >= 2.7") + +from ansible.compat.tests import unittest +from ansible.compat.tests.mock import Mock +from ansible.compat.tests.mock import patch +from ansible.module_utils.basic import AnsibleModule + +try: + from library.modules.bigip_firewall_port_list import ApiParameters + from library.modules.bigip_firewall_port_list import ModuleParameters + from library.modules.bigip_firewall_port_list import ModuleManager + from library.modules.bigip_firewall_port_list import ArgumentSpec + from library.module_utils.network.f5.common import F5ModuleError + from library.module_utils.network.f5.common import iControlUnexpectedHTTPError + from test.unit.modules.utils import set_module_args +except ImportError: + try: + from ansible.modules.network.f5.bigip_firewall_port_list import ApiParameters + from ansible.modules.network.f5.bigip_firewall_port_list import ModuleParameters + from ansible.modules.network.f5.bigip_firewall_port_list import ModuleManager + from ansible.modules.network.f5.bigip_firewall_port_list import ArgumentSpec + from ansible.module_utils.network.f5.common import F5ModuleError + from ansible.module_utils.network.f5.common import iControlUnexpectedHTTPError + from units.modules.utils import set_module_args + except ImportError: + raise SkipTest("F5 Ansible modules require the f5-sdk Python library") + +fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures') +fixture_data = {} + + +def load_fixture(name): + path = os.path.join(fixture_path, name) + + if path in fixture_data: + return fixture_data[path] + + with open(path) as f: + data = f.read() + + try: + data = json.loads(data) + except Exception: + pass + + fixture_data[path] = data + return data + + +class TestParameters(unittest.TestCase): + def test_module_parameters(self): + args = dict( + name='foo', + description='this is a description', + ports=[1, 2, 3, 4], + port_ranges=['10-20', '30-40', '50-60'], + port_lists=['/Common/foo', 'foo'] + ) + + p = ModuleParameters(params=args) + assert p.name == 'foo' + assert p.description == 'this is a description' + assert len(p.ports) == 4 + assert len(p.port_ranges) == 3 + assert len(p.port_lists) == 2 + + def test_api_parameters(self): + args = load_fixture('load_security_port_list_1.json') + + p = ApiParameters(params=args) + assert len(p.ports) == 4 + assert len(p.port_ranges) == 3 + assert len(p.port_lists) == 1 + assert sorted(p.ports) == [1, 2, 3, 4] + assert sorted(p.port_ranges) == ['10-20', '30-40', '50-60'] + assert p.port_lists[0] == '/Common/_sys_self_allow_tcp_defaults' + + +class TestManager(unittest.TestCase): + + def setUp(self): + self.spec = ArgumentSpec() + + def test_create(self, *args): + set_module_args(dict( + name='foo', + description='this is a description', + ports=[1, 2, 3, 4], + port_ranges=['10-20', '30-40', '50-60'], + port_lists=['/Common/foo', 'foo'], + password='password', + server='localhost', + user='admin' + )) + + module = AnsibleModule( + argument_spec=self.spec.argument_spec, + supports_check_mode=self.spec.supports_check_mode + ) + mm = ModuleManager(module=module) + + # Override methods to force specific logic in the module to happen + mm.exists = Mock(side_effect=[False, True]) + mm.create_on_device = Mock(return_value=True) + + results = mm.exec_module() + + assert results['changed'] is True + assert 'ports' in results + assert 'port_lists' in results + assert 'port_ranges' in results + assert len(results['ports']) == 4 + assert len(results['port_ranges']) == 3 + assert len(results['port_lists']) == 2 + assert results['description'] == 'this is a description'