summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrajaspachipulusu17 <rajas.pachipulusu@calsoftinc.com>2019-05-09 10:31:06 +0530
committerSumit Jaiswal <sjaiswal@redhat.com>2019-05-09 10:31:06 +0530
commit458b473d0640c6048c15ade8741c9fdac8e49927 (patch)
tree971320ca57b7546aecbe19dd49924957f6fb5254
parent05e81b28e99da067fd2de005322f9e6a320f73a4 (diff)
downloadansible-458b473d0640c6048c15ade8741c9fdac8e49927.tar.gz
Pluribus network prefix list module (#55686)
* Pluribus network prefix list module * Doc fix and unit test fix * Added default value with args spec change * Sanity fix
-rw-r--r--lib/ansible/modules/network/netvisor/pn_prefix_list.py165
-rw-r--r--test/units/modules/network/netvisor/test_pn_prefix_list.py62
2 files changed, 227 insertions, 0 deletions
diff --git a/lib/ansible/modules/network/netvisor/pn_prefix_list.py b/lib/ansible/modules/network/netvisor/pn_prefix_list.py
new file mode 100644
index 0000000000..c3ab7dfbb7
--- /dev/null
+++ b/lib/ansible/modules/network/netvisor/pn_prefix_list.py
@@ -0,0 +1,165 @@
+#!/usr/bin/python
+# Copyright: (c) 2018, Pluribus Networks
+# 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
+
+
+ANSIBLE_METADATA = {'metadata_version': '1.1',
+ 'status': ['preview'],
+ 'supported_by': 'community'}
+
+
+DOCUMENTATION = """
+---
+module: pn_prefix_list
+author: "Pluribus Networks (@rajaspachipulusu17)"
+version_added: "2.9"
+short_description: CLI command to create/delete prefix-list
+description:
+ - This module can be used to create or delete prefix list.
+options:
+ pn_cliswitch:
+ description:
+ - Target switch to run the CLI on.
+ required: false
+ type: str
+ state:
+ description:
+ - State the action to perform. Use C(present) to create prefix-list and
+ C(absent) to delete prefix-list.
+ required: false
+ type: str
+ choices: ['present', 'absent']
+ default: 'present'
+ pn_name:
+ description:
+ - Prefix List Name.
+ required: true
+ type: str
+ pn_scope:
+ description:
+ - scope of prefix-list.
+ required: false
+ type: str
+ choices: ['local', 'fabric']
+"""
+
+EXAMPLES = """
+- name: Create prefix list
+ pn_prefix_list:
+ pn_cliswitch: "sw01"
+ pn_name: "foo"
+ pn_scope: "local"
+ state: "present"
+
+- name: Delete prefix list
+ pn_prefix_list:
+ pn_cliswitch: "sw01"
+ pn_name: "foo"
+ state: "absent"
+"""
+
+RETURN = """
+command:
+ description: the CLI command run on the target node.
+ returned: always
+ type: str
+stdout:
+ description: set of responses from the prefix-list command.
+ returned: always
+ type: list
+stderr:
+ description: set of error responses from the prefix-list command.
+ returned: on error
+ type: list
+changed:
+ description: indicates whether the CLI caused changes on the target.
+ returned: always
+ type: bool
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
+from ansible.module_utils.network.netvisor.netvisor import run_commands
+
+
+def check_cli(module, cli):
+ """
+ This method checks for idempotency using the prefix-list-show command.
+ If a name exists, return True if name exists else False.
+ :param module: The Ansible module to fetch input parameters
+ :param cli: The CLI string
+ """
+ name = module.params['pn_name']
+
+ cli += ' prefix-list-show format name no-show-headers'
+ out = run_commands(module, cli)[1]
+
+ if out:
+ out = out.split()
+
+ return True if name in out else False
+
+
+def main():
+ """ This section is for arguments parsing """
+
+ state_map = dict(
+ present='prefix-list-create',
+ absent='prefix-list-delete'
+ )
+
+ argument_spec = dict(
+ pn_cliswitch=dict(required=False, type='str'),
+ state=dict(required=False, type='str',
+ choices=state_map.keys(), default='present'),
+ pn_name=dict(required=True, type='str'),
+ pn_scope=dict(required=False, type='str',
+ choices=['local', 'fabric']),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ required_if=(
+ ["state", "present", ["pn_name", "pn_scope"]],
+ ["state", "absent", ["pn_name"]],
+ ),
+ )
+
+ # Accessing the arguments
+ cliswitch = module.params['pn_cliswitch']
+ state = module.params['state']
+ name = module.params['pn_name']
+ scope = module.params['pn_scope']
+
+ command = state_map[state]
+
+ # Building the CLI command string
+ cli = pn_cli(module, cliswitch)
+
+ NAME_EXISTS = check_cli(module, cli)
+
+ cli += ' %s name %s ' % (command, name)
+
+ if command == 'prefix-list-delete':
+ if NAME_EXISTS is False:
+ module.exit_json(
+ skipped=True,
+ msg='prefix-list with name %s does not exist' % name
+ )
+ else:
+ if command == 'prefix-list-create':
+ if NAME_EXISTS is True:
+ module.exit_json(
+ skipped=True,
+ msg='prefix list with name %s already exists' % name
+ )
+ cli += ' scope %s ' % scope
+
+ run_cli(module, cli, state_map)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/test/units/modules/network/netvisor/test_pn_prefix_list.py b/test/units/modules/network/netvisor/test_pn_prefix_list.py
new file mode 100644
index 0000000000..66368be9c5
--- /dev/null
+++ b/test/units/modules/network/netvisor/test_pn_prefix_list.py
@@ -0,0 +1,62 @@
+# Copyright: (c) 2018, Pluribus Networks
+# 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 json
+
+from units.compat.mock import patch
+from ansible.modules.network.netvisor import pn_prefix_list
+from units.modules.utils import set_module_args
+from .nvos_module import TestNvosModule, load_fixture
+
+
+class TestPrefixListModule(TestNvosModule):
+
+ module = pn_prefix_list
+
+ def setUp(self):
+ self.mock_run_nvos_commands = patch('ansible.modules.network.netvisor.pn_prefix_list.run_cli')
+ self.run_nvos_commands = self.mock_run_nvos_commands.start()
+
+ self.mock_run_check_cli = patch('ansible.modules.network.netvisor.pn_prefix_list.check_cli')
+ self.run_check_cli = self.mock_run_check_cli.start()
+
+ def tearDown(self):
+ self.mock_run_nvos_commands.stop()
+ self.mock_run_check_cli.stop()
+
+ def run_cli_patch(self, module, cli, state_map):
+ if state_map['present'] == 'prefix-list-create':
+ results = dict(
+ changed=True,
+ cli_cmd=cli
+ )
+ elif state_map['absent'] == 'prefix-list-delete':
+ results = dict(
+ changed=True,
+ cli_cmd=cli
+ )
+ module.exit_json(**results)
+
+ def load_fixtures(self, commands=None, state=None, transport='cli'):
+ self.run_nvos_commands.side_effect = self.run_cli_patch
+ if state == 'present':
+ self.run_check_cli.return_value = False
+ if state == 'absent':
+ self.run_check_cli.return_value = True
+
+ def test_prefix_list_create(self):
+ set_module_args({'pn_cliswitch': 'sw01', 'pn_name': 'foo',
+ 'pn_scope': 'local', 'state': 'present'})
+ result = self.execute_module(changed=True, state='present')
+ expected_cmd = ' switch sw01 prefix-list-create name foo scope local '
+ self.assertEqual(result['cli_cmd'], expected_cmd)
+
+ def test_prefix_list_delete(self):
+ set_module_args({'pn_cliswitch': 'sw01', 'pn_name': 'foo',
+ 'state': 'absent'})
+ result = self.execute_module(changed=True, state='absent')
+ expected_cmd = ' switch sw01 prefix-list-delete name foo '
+ self.assertEqual(result['cli_cmd'], expected_cmd)