1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2026-04-15 16:31:30 +00:00

Initial commit

This commit is contained in:
Ansible Core Team 2020-03-09 09:11:07 +00:00
commit aebc1b03fd
4861 changed files with 812621 additions and 0 deletions

View file

@ -0,0 +1,166 @@
#!/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_access_list
author: "Pluribus Networks (@amitsi)"
short_description: CLI command to create/delete access-list
description:
- This module can be used to create and delete an access list.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: False
type: str
state:
description:
- State the action to perform. Use 'present' to create access-list and
'absent' to delete access-list.
required: True
choices: [ "present", "absent"]
pn_name:
description:
- Access List Name.
required: false
type: str
pn_scope:
description:
- 'scope. Available valid values - local or fabric.'
required: false
choices: ['local', 'fabric']
'''
EXAMPLES = """
- name: access list functionality
pn_access_list:
pn_cliswitch: "sw01"
pn_name: "foo"
pn_scope: "local"
state: "present"
- name: access list functionality
pn_access_list:
pn_cliswitch: "sw01"
pn_name: "foo"
pn_scope: "local"
state: "absent"
- name: access list functionality
pn_access_list:
pn_cliswitch: "sw01"
pn_name: "foo"
pn_scope: "fabric"
state: "present"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the access-list command.
returned: always
type: list
stderr:
description: set of error responses from the access-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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the access-list-show command.
If a list with given name exists, return True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
list_name = module.params['pn_name']
cli += ' access-list-show format name no-show-headers'
out = run_commands(module, cli)[1]
if out:
out = out.split()
return True if list_name in out else False
def main():
""" This section is for arguments parsing """
state_map = dict(
present='access-list-create',
absent='access-list-delete',
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_name=dict(required=False, type='str'),
pn_scope=dict(required=False, type='str',
choices=['local', 'fabric']),
),
required_if=(
["state", "present", ["pn_name", "pn_scope"]],
["state", "absent", ["pn_name"]],
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
list_name = module.params['pn_name']
scope = module.params['pn_scope']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
ACC_LIST_EXISTS = check_cli(module, cli)
cli += ' %s name %s ' % (command, list_name)
if command == 'access-list-delete':
if ACC_LIST_EXISTS is False:
module.exit_json(
skipped=True,
msg='access-list with name %s does not exist' % list_name
)
else:
if command == 'access-list-create':
if ACC_LIST_EXISTS is True:
module.exit_json(
skipped=True,
msg='access list with name %s already exists' % list_name
)
cli += ' scope %s ' % scope
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,172 @@
#!/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_access_list_ip
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to add/remove access-list-ip
description:
- This modules can be used to add and remove IPs associated with access list.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: False
type: str
state:
description:
- State the action to perform. Use 'present' to add access-list-ip and
'absent' to remove access-list-ip.
required: True
choices: ["present", "absent"]
pn_ip:
description:
- IP associated with the access list.
required: False
default: '::'
type: str
pn_name:
description:
- Access List Name.
required: False
type: str
'''
EXAMPLES = """
- name: access list ip functionality
pn_access_list_ip:
pn_cliswitch: "sw01"
pn_name: "foo"
pn_ip: "172.16.3.1"
state: "present"
- name: access list ip functionality
pn_access_list_ip:
pn_cliswitch: "sw01"
pn_name: "foo"
pn_ip: "172.16.3.1"
state: "absent"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the access-list-ip command.
returned: always
type: list
stderr:
description: set of error responses from the access-list-ip 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the access-list-ip-show command.
If ip exists, return True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
name = module.params['pn_name']
ip = module.params['pn_ip']
clicopy = cli
cli += ' access-list-show name %s no-show-headers ' % name
out = run_commands(module, cli)[1]
if name not in out:
module.fail_json(
failed=True,
msg='access-list with name %s does not exist' % name
)
cli = clicopy
cli += ' access-list-ip-show name %s format ip no-show-headers' % name
out = run_commands(module, cli)[1]
out = out.split()
return True if ip in out else False
def main():
""" This section is for arguments parsing """
state_map = dict(
present='access-list-ip-add',
absent='access-list-ip-remove',
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_ip=dict(required=False, type='str', default='::'),
pn_name=dict(required=False, type='str'),
),
required_if=(
["state", "present", ["pn_name"]],
["state", "absent", ["pn_name", "pn_ip"]],
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
ip = module.params['pn_ip']
name = module.params['pn_name']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
IP_EXISTS = check_cli(module, cli)
cli += ' %s name %s ' % (command, name)
if command == 'access-list-ip-remove':
if IP_EXISTS is False:
module.exit_json(
skipped=True,
msg='access-list with ip %s does not exist' % ip
)
if ip:
cli += ' ip ' + ip
else:
if command == 'access-list-ip-add':
if IP_EXISTS is True:
module.exit_json(
skipped=True,
msg='access list with ip %s already exists' % ip
)
if ip:
cli += ' ip ' + ip
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,207 @@
#!/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_admin_service
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify admin-service
description:
- This module is used to modify services on the server-switch.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: False
type: str
state:
description:
- State the action to perform. Use C(update) to modify the admin-service.
required: True
type: str
choices: ['update']
pn_web:
description:
- Web (HTTP) to enable or disable.
required: False
type: bool
pn_web_ssl:
description:
- Web SSL (HTTPS) to enable or disable.
required: False
type: bool
pn_snmp:
description:
- Simple Network Monitoring Protocol (SNMP) to enable or disable.
required: False
type: bool
pn_web_port:
description:
- Web (HTTP) port to enable or disable.
required: False
type: str
pn_web_ssl_port:
description:
- Web SSL (HTTPS) port to enable or disable.
required: False
type: str
pn_nfs:
description:
- Network File System (NFS) to enable or disable.
required: False
type: bool
pn_ssh:
description:
- Secure Shell to enable or disable.
required: False
type: bool
pn_web_log:
description:
- Web logging to enable or disable.
required: False
type: bool
pn__if:
description:
- administrative service interface.
required: False
type: str
choices: ['mgmt', 'data']
pn_icmp:
description:
- Internet Message Control Protocol (ICMP) to enable or disable.
required: False
type: bool
pn_net_api:
description:
- Netvisor API to enable or disable APIs.
required: False
type: bool
'''
EXAMPLES = """
- name: admin service functionality
pn_admin_service:
pn_cliswitch: "sw01"
state: "update"
pn__if: "mgmt"
pn_web: False
pn_icmp: True
- name: admin service functionality
pn_admin_service:
pn_cliswitch: "sw01"
state: "update"
pn_web: False
pn__if: "mgmt"
pn_snmp: True
pn_net_api: True
pn_ssh: True
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the admin-service command.
returned: always
type: list
stderr:
description: set of error responses from the admin-service 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, booleanArgs, run_cli
def main():
""" This section is for arguments parsing """
state_map = dict(
update='admin-service-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_web=dict(required=False, type='bool'),
pn_web_ssl=dict(required=False, type='bool'),
pn_snmp=dict(required=False, type='bool'),
pn_web_port=dict(required=False, type='str'),
pn_web_ssl_port=dict(required=False, type='str'),
pn_nfs=dict(required=False, type='bool'),
pn_ssh=dict(required=False, type='bool'),
pn_web_log=dict(required=False, type='bool'),
pn__if=dict(required=False, type='str', choices=['mgmt', 'data']),
pn_icmp=dict(required=False, type='bool'),
pn_net_api=dict(required=False, type='bool'),
),
required_if=([['state', 'update', ['pn__if']]]),
required_one_of=[['pn_web', 'pn_web_ssl', 'pn_snmp',
'pn_web_port', 'pn_web_ssl_port', 'pn_nfs',
'pn_ssh', 'pn_web_log', 'pn_icmp', 'pn_net_api']]
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
web = module.params['pn_web']
web_ssl = module.params['pn_web_ssl']
snmp = module.params['pn_snmp']
web_port = module.params['pn_web_port']
web_ssl_port = module.params['pn_web_ssl_port']
nfs = module.params['pn_nfs']
ssh = module.params['pn_ssh']
web_log = module.params['pn_web_log']
_if = module.params['pn__if']
icmp = module.params['pn_icmp']
net_api = module.params['pn_net_api']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
if command == 'admin-service-modify':
cli += ' %s ' % command
if _if:
cli += ' if ' + _if
if web_port:
cli += ' web-port ' + web_port
if web_ssl_port:
cli += ' web-ssl-port ' + web_ssl_port
cli += booleanArgs(web, 'web', 'no-web')
cli += booleanArgs(web_ssl, 'web-ssl', 'no-web-ssl')
cli += booleanArgs(snmp, 'snmp', 'no-snmp')
cli += booleanArgs(nfs, 'nfs', 'no-nfs')
cli += booleanArgs(ssh, 'ssh', 'no-ssh')
cli += booleanArgs(icmp, 'icmp', 'no-icmp')
cli += booleanArgs(net_api, 'net-api', 'no-net-api')
cli += booleanArgs(web_log, 'web-log', 'no-web-log')
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,120 @@
#!/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_admin_session_timeout
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify admin-session-timeout
description:
- This module can be used to modify admin session timeout.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: False
type: str
state:
description:
- State the action to perform.
C(update) to modify the admin-session-timeout.
required: True
type: str
choices: ['update']
pn_timeout:
description:
- Maximum time to wait for user activity before
terminating login session. Minimum should be 60s.
required: False
type: str
'''
EXAMPLES = """
- name: admin session timeout functionality
pn_admin_session_timeout:
pn_cliswitch: "sw01"
state: "update"
pn_timeout: "61s"
- name: admin session timeout functionality
pn_admin_session_timeout:
pn_cliswitch: "sw01"
state: "update"
pn_timeout: "1d"
- name: admin session timeout functionality
pn_admin_session_timeout:
pn_cliswitch: "sw01"
state: "update"
pn_timeout: "10d20m3h15s"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the admin-session-timeout command.
returned: always
type: list
stderr:
description: set of error responses from the admin-session-timeout 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
def main():
""" This section is for arguments parsing """
state_map = dict(
update='admin-session-timeout-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_timeout=dict(required=False, type='str'),
),
required_together=[['state', 'pn_timeout']],
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
timeout = module.params['pn_timeout']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
if command == 'admin-session-timeout-modify':
cli += ' %s ' % command
if timeout:
cli += ' timeout ' + timeout
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,229 @@
#!/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_admin_syslog
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to create/modify/delete admin-syslog
description:
- This module can be used to create the scope and other parameters of syslog event collection.
- This module can be used to modify parameters of syslog event collection.
- This module can be used to delete the scope and other parameters of syslog event collection.
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 admin-syslog and
C(absent) to delete admin-syslog C(update) to modify the admin-syslog.
required: True
type: str
choices: ['present', 'absent', 'update']
pn_scope:
description:
- Scope of the system log.
required: False
type: str
choices: ['local', 'fabric']
pn_host:
description:
- Hostname to log system events.
required: False
type: str
pn_port:
description:
- Host port.
required: False
type: str
pn_transport:
description:
- Transport for log events - tcp/tls or udp.
required: False
type: str
choices: ['tcp-tls', 'udp']
default: 'udp'
pn_message_format:
description:
- message-format for log events - structured or legacy.
required: False
choices: ['structured', 'legacy']
type: str
pn_name:
description:
- name of the system log.
required: False
type: str
'''
EXAMPLES = """
- name: admin-syslog functionality
pn_admin_syslog:
pn_cliswitch: "sw01"
state: "absent"
pn_name: "foo"
pn_scope: "local"
- name: admin-syslog functionality
pn_admin_syslog:
pn_cliswitch: "sw01"
state: "present"
pn_name: "foo"
pn_scope: "local"
pn_host: "166.68.224.46"
pn_message_format: "structured"
- name: admin-syslog functionality
pn_admin_syslog:
pn_cliswitch: "sw01"
state: "update"
pn_name: "foo"
pn_host: "166.68.224.10"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the admin-syslog command.
returned: always
type: list
stderr:
description: set of error responses from the admin-syslog 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the admin-syslog-show command.
If a user with given name exists, return as True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
name = module.params['pn_name']
cli += ' admin-syslog-show format name no-show-headers'
out = run_commands(module, cli)[1]
out = out.split()
return True if name in out else False
def main():
""" This section is for arguments parsing """
state_map = dict(
present='admin-syslog-create',
absent='admin-syslog-delete',
update='admin-syslog-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_scope=dict(required=False, type='str',
choices=['local', 'fabric']),
pn_host=dict(required=False, type='str'),
pn_port=dict(required=False, type='str'),
pn_transport=dict(required=False, type='str',
choices=['tcp-tls', 'udp'], default='udp'),
pn_message_format=dict(required=False, type='str',
choices=['structured', 'legacy']),
pn_name=dict(required=False, type='str'),
),
required_if=(
['state', 'present', ['pn_name', 'pn_host', 'pn_scope']],
['state', 'absent', ['pn_name']],
['state', 'update', ['pn_name']]
),
required_one_of=[['pn_port', 'pn_message_format',
'pn_host', 'pn_transport', 'pn_scope']]
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
scope = module.params['pn_scope']
host = module.params['pn_host']
port = module.params['pn_port']
transport = module.params['pn_transport']
message_format = module.params['pn_message_format']
name = module.params['pn_name']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
SYSLOG_EXISTS = check_cli(module, cli)
cli += ' %s name %s ' % (command, name)
if command == 'admin-syslog-modify':
if SYSLOG_EXISTS is False:
module.fail_json(
failed=True,
msg='admin syslog with name %s does not exist' % name
)
if command == 'admin-syslog-delete':
if SYSLOG_EXISTS is False:
module.exit_json(
skipped=True,
msg='admin syslog with name %s does not exist' % name
)
if command == 'admin-syslog-create':
if SYSLOG_EXISTS is True:
module.exit_json(
skipped=True,
msg='admin syslog user with name %s already exists' % name
)
if command == 'admin-syslog-create':
if scope:
cli += ' scope ' + scope
if command != 'admin-syslog-delete':
if host:
cli += ' host ' + host
if port:
cli += ' port ' + port
if transport:
cli += ' transport ' + transport
if message_format:
cli += ' message-format ' + message_format
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,322 @@
#!/usr/bin/python
""" PN CLI cluster-create/cluster-delete """
#
# 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/>.
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['deprecated'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
module: pn_cluster
author: "Pluribus Networks (@amitsi)"
short_description: CLI command to create/delete a cluster.
deprecated:
removed_in: '2.12'
why: Doesn't support latest Pluribus Networks netvisor
alternative: Latest modules will be pushed in Ansible future versions.
description:
- Execute cluster-create or cluster-delete command.
- A cluster allows two switches to cooperate in high-availability (HA)
deployments. The nodes that form the cluster must be members of the same
fabric. Clusters are typically used in conjunction with a virtual link
aggregation group (VLAG) that allows links physically connected to two
separate switches appear as a single trunk to a third device. The third
device can be a switch,server, or any Ethernet device.
options:
pn_cliusername:
description:
- Provide login username if user is not root.
required: False
pn_clipassword:
description:
- Provide login password if user is not root.
required: False
pn_cliswitch:
description:
- Target switch to run the cli on.
required: False
default: 'local'
state:
description:
- Specify action to perform. Use 'present' to create cluster and 'absent'
to delete cluster.
required: true
choices: ['present', 'absent']
pn_name:
description:
- Specify the name of the cluster.
required: true
pn_cluster_node1:
description:
- Specify the name of the first switch in the cluster.
- Required for 'cluster-create'.
pn_cluster_node2:
description:
- Specify the name of the second switch in the cluster.
- Required for 'cluster-create'.
pn_validate:
description:
- Validate the inter-switch links and state of switches in the cluster.
type: bool
'''
EXAMPLES = """
- name: create spine cluster
pn_cluster:
state: 'present'
pn_name: 'spine-cluster'
pn_cluster_node1: 'spine01'
pn_cluster_node2: 'spine02'
pn_validate: True
pn_quiet: True
- name: delete spine cluster
pn_cluster:
state: 'absent'
pn_name: 'spine-cluster'
pn_quiet: True
"""
RETURN = """
command:
description: The CLI command run on the target node(s).
returned: always
type: str
stdout:
description: The set of responses from the cluster command.
returned: always
type: list
stderr:
description: The set of error responses from the cluster command.
returned: on error
type: list
changed:
description: Indicates whether the CLI caused changes on the target.
returned: always
type: bool
"""
import shlex
# AnsibleModule boilerplate
from ansible.module_utils.basic import AnsibleModule
NAME_EXISTS = None
NODE1_EXISTS = None
NODE2_EXISTS = None
def pn_cli(module):
"""
This method is to generate the cli portion to launch the Netvisor cli.
It parses the username, password, switch parameters from module.
:param module: The Ansible module to fetch username, password and switch
:return: returns the cli string for further processing
"""
username = module.params['pn_cliusername']
password = module.params['pn_clipassword']
cliswitch = module.params['pn_cliswitch']
if username and password:
cli = '/usr/bin/cli --quiet --user %s:%s ' % (username, password)
else:
cli = '/usr/bin/cli --quiet '
if cliswitch == 'local':
cli += ' switch-local '
else:
cli += ' switch ' + cliswitch
return cli
def check_cli(module, cli):
"""
This method checks for idempotency using the cluster-show command.
If a cluster with given name exists, return NAME_EXISTS as True else False.
If the given cluster-node-1 is already a part of another cluster, return
NODE1_EXISTS as True else False.
If the given cluster-node-2 is already a part of another cluster, return
NODE2_EXISTS as True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
:return Global Booleans: NAME_EXISTS, NODE1_EXISTS, NODE2_EXISTS
"""
name = module.params['pn_name']
node1 = module.params['pn_cluster_node1']
node2 = module.params['pn_cluster_node2']
show = cli + ' cluster-show format name,cluster-node-1,cluster-node-2 '
show = shlex.split(show)
out = module.run_command(show)[1]
out = out.split()
# Global flags
global NAME_EXISTS, NODE1_EXISTS, NODE2_EXISTS
if name in out:
NAME_EXISTS = True
else:
NAME_EXISTS = False
if node1 in out:
NODE1_EXISTS = True
else:
NODE2_EXISTS = False
if node2 in out:
NODE2_EXISTS = True
else:
NODE2_EXISTS = False
def run_cli(module, cli):
"""
This method executes the cli command on the target node(s) and returns the
output. The module then exits based on the output.
:param cli: the complete cli string to be executed on the target node(s).
:param module: The Ansible module to fetch command
"""
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
command = get_command_from_state(state)
cmd = shlex.split(cli)
# 'out' contains the output
# 'err' contains the error messages
result, out, err = module.run_command(cmd)
print_cli = cli.split(cliswitch)[1]
# Response in JSON format
if result != 0:
module.exit_json(
command=print_cli,
stderr=err.strip(),
msg="%s operation failed" % command,
changed=False
)
if out:
module.exit_json(
command=print_cli,
stdout=out.strip(),
msg="%s operation completed" % command,
changed=True
)
else:
module.exit_json(
command=print_cli,
msg="%s operation completed" % command,
changed=True
)
def get_command_from_state(state):
"""
This method gets appropriate command name for the state specified. It
returns the command name for the specified state.
:param state: The state for which the respective command name is required.
"""
command = None
if state == 'present':
command = 'cluster-create'
if state == 'absent':
command = 'cluster-delete'
return command
def main():
""" This section is for arguments parsing """
module = AnsibleModule(
argument_spec=dict(
pn_cliusername=dict(required=False, type='str'),
pn_clipassword=dict(required=False, type='str', no_log=True),
pn_cliswitch=dict(required=False, type='str', default='local'),
state=dict(required=True, type='str',
choices=['present', 'absent']),
pn_name=dict(required=True, type='str'),
pn_cluster_node1=dict(type='str'),
pn_cluster_node2=dict(type='str'),
pn_validate=dict(type='bool')
),
required_if=(
["state", "present",
["pn_name", "pn_cluster_node1", "pn_cluster_node2"]],
["state", "absent", ["pn_name"]]
)
)
# Accessing the parameters
state = module.params['state']
name = module.params['pn_name']
cluster_node1 = module.params['pn_cluster_node1']
cluster_node2 = module.params['pn_cluster_node2']
validate = module.params['pn_validate']
command = get_command_from_state(state)
# Building the CLI command string
cli = pn_cli(module)
if command == 'cluster-create':
check_cli(module, cli)
if NAME_EXISTS is True:
module.exit_json(
skipped=True,
msg='Cluster with name %s already exists' % name
)
if NODE1_EXISTS is True:
module.exit_json(
skipped=True,
msg='Node %s already part of a cluster' % cluster_node1
)
if NODE2_EXISTS is True:
module.exit_json(
skipped=True,
msg='Node %s already part of a cluster' % cluster_node2
)
cli += ' %s name %s ' % (command, name)
cli += 'cluster-node-1 %s cluster-node-2 %s ' % (cluster_node1,
cluster_node2)
if validate is True:
cli += ' validate '
if validate is False:
cli += ' no-validate '
if command == 'cluster-delete':
check_cli(module, cli)
if NAME_EXISTS is False:
module.exit_json(
skipped=True,
msg='Cluster with name %s does not exist' % name
)
cli += ' %s name %s ' % (command, name)
run_cli(module, cli)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,267 @@
#!/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_connection_stats_settings
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify connection-stats-settings
description:
- This module can be used to modify the settings for collecting statistical
data about connections.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: False
type: str
state:
description:
- State the action to perform. Use C(update) to modify the
connection-stats-settings.
required: True
type: str
choices: ['update']
pn_enable:
description:
- Enable or disable collecting connections statistics.
required: False
type: bool
pn_connection_backup_enable:
description:
- Enable backup for connection statistics collection.
required: False
type: bool
pn_client_server_stats_max_memory:
description:
- maximum memory for client server statistics.
required: False
type: str
pn_connection_stats_log_disk_space:
description:
- disk-space allocated for statistics (including rotated log files).
required: False
type: str
pn_client_server_stats_log_enable:
description:
- Enable or disable statistics.
required: False
type: bool
pn_service_stat_max_memory:
description:
- maximum memory allowed for service statistics.
required: False
type: str
pn_connection_stats_log_interval:
description:
- interval to collect statistics.
required: False
type: str
pn_fabric_connection_backup_interval:
description:
- backup interval for fabric connection statistics collection.
required: False
type: str
pn_connection_backup_interval:
description:
- backup interval for connection statistics collection.
required: False
type: str
pn_connection_stats_log_enable:
description:
- enable or disable statistics.
required: False
type: bool
pn_fabric_connection_max_memory:
description:
- maximum memory allowed for fabric connection statistics.
required: False
type: str
pn_fabric_connection_backup_enable:
description:
- enable backup for fabric connection statistics collection.
required: False
type: bool
pn_client_server_stats_log_disk_space:
description:
- disk-space allocated for statistics (including rotated log files).
required: False
type: str
pn_connection_max_memory:
description:
- maximum memory allowed for connection statistics.
required: False
type: str
pn_connection_stats_max_memory:
description:
- maximum memory allowed for connection statistics.
required: False
type: str
pn_client_server_stats_log_interval:
description:
- interval to collect statistics.
required: False
type: str
'''
EXAMPLES = """
- name: "Modify connection stats settings"
pn_connection_stats_settings:
pn_cliswitch: "sw01"
state: "update"
pn_enable: False
pn_fabric_connection_max_memory: "1000"
- name: "Modify connection stats settings"
pn_connection_stats_settings:
pn_cliswitch: "sw01"
state: "update"
pn_enable: True
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the connection-stats-settings command.
returned: always
type: list
stderr:
description: set of error responses from the connection-stats-settings 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli, booleanArgs
def main():
""" This section is for arguments parsing """
state_map = dict(
update='connection-stats-settings-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_enable=dict(required=False, type='bool'),
pn_connection_backup_enable=dict(required=False, type='bool'),
pn_client_server_stats_max_memory=dict(required=False, type='str'),
pn_connection_stats_log_disk_space=dict(required=False,
type='str'),
pn_client_server_stats_log_enable=dict(required=False,
type='bool'),
pn_service_stat_max_memory=dict(required=False, type='str'),
pn_connection_stats_log_interval=dict(required=False, type='str'),
pn_fabric_connection_backup_interval=dict(required=False,
type='str'),
pn_connection_backup_interval=dict(required=False, type='str'),
pn_connection_stats_log_enable=dict(required=False, type='bool'),
pn_fabric_connection_max_memory=dict(required=False, type='str'),
pn_fabric_connection_backup_enable=dict(required=False,
type='bool'),
pn_client_server_stats_log_disk_space=dict(required=False,
type='str'),
pn_connection_max_memory=dict(required=False, type='str'),
pn_connection_stats_max_memory=dict(required=False, type='str'),
pn_client_server_stats_log_interval=dict(required=False,
type='str'),
),
required_one_of=[['pn_enable', 'pn_connection_backup_enable',
'pn_client_server_stats_max_memory',
'pn_connection_stats_log_disk_space',
'pn_client_server_stats_log_enable',
'pn_service_stat_max_memory',
'pn_connection_stats_log_interval',
'pn_connection_backup_interval',
'pn_connection_stats_log_enable',
'pn_fabric_connection_max_memory',
'pn_fabric_connection_backup_enable',
'pn_client_server_stats_log_disk_space',
'pn_connection_max_memory',
'pn_connection_stats_max_memory',
'pn_client_server_stats_log_interval']]
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
enable = module.params['pn_enable']
connection_backup_enable = module.params['pn_connection_backup_enable']
client_server_stats_max_memory = module.params['pn_client_server_stats_max_memory']
connection_stats_log_disk_space = module.params['pn_connection_stats_log_disk_space']
client_server_stats_log_enable = module.params['pn_client_server_stats_log_enable']
service_stat_max_memory = module.params['pn_service_stat_max_memory']
connection_stats_log_interval = module.params['pn_connection_stats_log_interval']
fabric_connection_backup_interval = module.params['pn_fabric_connection_backup_interval']
connection_backup_interval = module.params['pn_connection_backup_interval']
connection_stats_log_enable = module.params['pn_connection_stats_log_enable']
fabric_connection_max_memory = module.params['pn_fabric_connection_max_memory']
fabric_connection_backup_enable = module.params['pn_fabric_connection_backup_enable']
client_server_stats_log_disk_space = module.params['pn_client_server_stats_log_disk_space']
connection_max_memory = module.params['pn_connection_max_memory']
connection_stats_max_memory = module.params['pn_connection_stats_max_memory']
client_server_stats_log_interval = module.params['pn_client_server_stats_log_interval']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
if command == 'connection-stats-settings-modify':
cli += ' %s ' % command
cli += booleanArgs(enable, 'enable', 'disable')
cli += booleanArgs(connection_backup_enable, 'connection-backup-enable', 'connection-backup-disable')
cli += booleanArgs(client_server_stats_log_enable, 'client-server-stats-log-enable', 'client-server-stats-log-disable')
cli += booleanArgs(connection_stats_log_enable, 'connection-stats-log-enable', 'connection-stats-log-disable')
cli += booleanArgs(fabric_connection_backup_enable, 'fabric-connection-backup-enable', 'fabric-connection-backup-disable')
if client_server_stats_max_memory:
cli += ' client-server-stats-max-memory ' + client_server_stats_max_memory
if connection_stats_log_disk_space:
cli += ' connection-stats-log-disk-space ' + connection_stats_log_disk_space
if service_stat_max_memory:
cli += ' service-stat-max-memory ' + service_stat_max_memory
if connection_stats_log_interval:
cli += ' connection-stats-log-interval ' + connection_stats_log_interval
if fabric_connection_backup_interval:
cli += ' fabric-connection-backup-interval ' + fabric_connection_backup_interval
if connection_backup_interval:
cli += ' connection-backup-interval ' + connection_backup_interval
if fabric_connection_max_memory:
cli += ' fabric-connection-max-memory ' + fabric_connection_max_memory
if client_server_stats_log_disk_space:
cli += ' client-server-stats-log-disk-space ' + client_server_stats_log_disk_space
if connection_max_memory:
cli += ' connection-max-memory ' + connection_max_memory
if connection_stats_max_memory:
cli += ' connection-stats-max-memory ' + connection_stats_max_memory
if client_server_stats_log_interval:
cli += ' client-server-stats-log-interval ' + client_server_stats_log_interval
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,212 @@
#!/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_cpu_class
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to create/modify/delete cpu-class
description:
- This module can be used to create, modify and delete CPU class information.
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 cpu-class and
C(absent) to delete cpu-class C(update) to modify the cpu-class.
required: True
type: str
choices: ['present', 'absent', 'update']
pn_scope:
description:
- scope for CPU class.
required: false
choices: ['local', 'fabric']
pn_hog_protect:
description:
- enable host-based hog protection.
required: False
type: str
choices: ['disable', 'enable', 'enable-and-drop']
pn_rate_limit:
description:
- rate-limit for CPU class.
required: False
type: str
pn_name:
description:
- name for the CPU class.
required: False
type: str
'''
EXAMPLES = """
- name: create cpu class
pn_cpu_class:
pn_cliswitch: 'sw01'
state: 'present'
pn_name: 'icmp'
pn_rate_limit: '1000'
pn_scope: 'local'
- name: delete cpu class
pn_cpu_class:
pn_cliswitch: 'sw01'
state: 'absent'
pn_name: 'icmp'
- name: modify cpu class
pn_cpu_class:
pn_cliswitch: 'sw01'
state: 'update'
pn_name: 'icmp'
pn_rate_limit: '2000'
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the cpu-class command.
returned: always
type: list
stderr:
description: set of error responses from the cpu-class 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the cpu-class-show command.
If a user with given name exists, return True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
name = module.params['pn_name']
clicopy = cli
cli += ' system-settings-show format cpu-class-enable no-show-headers'
out = run_commands(module, cli)[1]
out = out.split()
if 'on' not in out:
module.fail_json(
failed=True,
msg='Enable CPU class before creating or deleting'
)
cli = clicopy
cli += ' cpu-class-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='cpu-class-create',
absent='cpu-class-delete',
update='cpu-class-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_scope=dict(required=False, type='str',
choices=['local', 'fabric']),
pn_hog_protect=dict(required=False, type='str',
choices=['disable', 'enable',
'enable-and-drop']),
pn_rate_limit=dict(required=False, type='str'),
pn_name=dict(required=False, type='str'),
),
required_if=(
['state', 'present', ['pn_name', 'pn_scope', 'pn_rate_limit']],
['state', 'absent', ['pn_name']],
['state', 'update', ['pn_name']],
)
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
scope = module.params['pn_scope']
hog_protect = module.params['pn_hog_protect']
rate_limit = module.params['pn_rate_limit']
name = module.params['pn_name']
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 == 'cpu-class-modify':
if NAME_EXISTS is False:
module.fail_json(
failed=True,
msg='cpu class with name %s does not exist' % name
)
if command == 'cpu-class-delete':
if NAME_EXISTS is False:
module.exit_json(
skipped=True,
msg='cpu class with name %s does not exist' % name
)
if command == 'cpu-class-create':
if NAME_EXISTS is True:
module.exit_json(
skipped=True,
msg='cpu class with name %s already exists' % name
)
if scope:
cli += ' scope %s ' % scope
if command != 'cpu-class-delete':
if hog_protect:
cli += ' hog-protect %s ' % hog_protect
if rate_limit:
cli += ' rate-limit %s ' % rate_limit
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,141 @@
#!/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_cpu_mgmt_class
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify cpu-mgmt-class
description:
- This module can we used to update mgmt port ingress policers.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
type: str
required: false
state:
description:
- State the action to perform. Use C(update) to modify cpu-mgmt-class.
type: str
required: true
choices: ['update']
pn_burst_size:
description:
- ingress traffic burst size (bytes) or default.
required: false
type: str
pn_name:
description:
- mgmt port ingress traffic class.
type: str
required: false
choices: ['arp', 'icmp', 'ssh', 'snmp', 'fabric', 'bcast', 'nfs',
'web', 'web-ssl', 'net-api']
pn_rate_limit:
description:
- ingress rate limit on mgmt port(bps) or unlimited.
type: str
required: false
'''
EXAMPLES = """
- name: cpu mgmt class modify ingress policers
pn_cpu_mgmt_class:
pn_cliswitch: "sw01"
state: "update"
pn_name: "icmp"
pn_rate_limit: "10000"
pn_burst_size: "14000"
- name: cpu mgmt class modify ingress policers
pn_cpu_mgmt_class:
pn_cliswitch: "sw01"
state: "update"
pn_name: "snmp"
pn_burst_size: "8000"
pn_rate_limit: "100000"
- name: cpu mgmt class modify ingress policers
pn_cpu_mgmt_class:
pn_cliswitch: "sw01"
state: "update"
pn_name: "web"
pn_rate_limit: "10000"
pn_burst_size: "1000"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the cpu-mgmt-class command.
returned: always
type: list
stderr:
description: set of error responses from the cpu-mgmt-class 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
def main():
""" This section is for arguments parsing """
state_map = dict(
update='cpu-mgmt-class-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str', choices=state_map.keys()),
pn_burst_size=dict(required=False, type='str'),
pn_name=dict(required=False, type='str',
choices=['arp', 'icmp', 'ssh', 'snmp',
'fabric', 'bcast', 'nfs', 'web',
'web-ssl', 'net-api']),
pn_rate_limit=dict(required=False, type='str'),
),
required_if=([['state', 'update', ['pn_name', 'pn_burst_size', 'pn_rate_limit']]]),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
burst_size = module.params['pn_burst_size']
name = module.params['pn_name']
rate_limit = module.params['pn_rate_limit']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
if command == 'cpu-mgmt-class-modify':
cli += ' %s name %s ' % (command, name)
cli += ' burst-size %s rate-limit %s' % (burst_size, rate_limit)
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,175 @@
#!/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_dhcp_filter
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to create/modify/delete dhcp-filter
description:
- This module can be used to create, delete and modify a DHCP filter config.
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 dhcp-filter and
C(absent) to delete dhcp-filter C(update) to modify the dhcp-filter.
required: True
type: str
choices: ['present', 'absent', 'update']
pn_trusted_ports:
description:
- trusted ports of dhcp config.
required: False
type: str
pn_name:
description:
- name of the DHCP filter.
required: false
type: str
'''
EXAMPLES = """
- name: dhcp filter create
pn_dhcp_filter:
pn_cliswitch: "sw01"
pn_name: "foo"
state: "present"
pn_trusted_ports: "1"
- name: dhcp filter delete
pn_dhcp_filter:
pn_cliswitch: "sw01"
pn_name: "foo"
state: "absent"
pn_trusted_ports: "1"
- name: dhcp filter modify
pn_dhcp_filter:
pn_cliswitch: "sw01"
pn_name: "foo"
state: "update"
pn_trusted_ports: "1,2"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the dhcp-filter command.
returned: always
type: list
stderr:
description: set of error responses from the dhcp-filter 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the dhcp-filter-show command.
If a user with given name exists, return True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
user_name = module.params['pn_name']
cli += ' dhcp-filter-show format name no-show-headers'
out = run_commands(module, cli)[1]
if out:
out = out.split()
return True if user_name in out else False
def main():
""" This section is for arguments parsing """
state_map = dict(
present='dhcp-filter-create',
absent='dhcp-filter-delete',
update='dhcp-filter-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_trusted_ports=dict(required=False, type='str'),
pn_name=dict(required=False, type='str'),
),
required_if=[
["state", "present", ["pn_name", "pn_trusted_ports"]],
["state", "absent", ["pn_name"]],
["state", "update", ["pn_name", "pn_trusted_ports"]]
]
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
trusted_ports = module.params['pn_trusted_ports']
name = module.params['pn_name']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
USER_EXISTS = check_cli(module, cli)
cli += ' %s name %s ' % (command, name)
if command == 'dhcp-filter-modify':
if USER_EXISTS is False:
module.fail_json(
failed=True,
msg='dhcp-filter with name %s does not exist' % name
)
if command == 'dhcp-filter-delete':
if USER_EXISTS is False:
module.exit_json(
skipped=True,
msg='dhcp-filter with name %s does not exist' % name
)
if command == 'dhcp-filter-create':
if USER_EXISTS is True:
module.exit_json(
skipped=True,
msg='dhcp-filter with name %s already exists' % name
)
if command != 'dhcp-filter-delete':
if trusted_ports:
cli += ' trusted-ports ' + trusted_ports
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,161 @@
#!/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_dscp_map
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to create/delete dscp-map
description:
- This module can be used to create a DSCP priority mapping table.
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 dscp-map and
C(absent) to delete.
required: True
type: str
choices: ["present", "absent"]
pn_name:
description:
- Name for the DSCP map.
required: False
type: str
pn_scope:
description:
- Scope for dscp map.
required: False
choices: ["local", "fabric"]
'''
EXAMPLES = """
- name: dscp map create
pn_dscp_map:
pn_cliswitch: "sw01"
state: "present"
pn_name: "foo"
pn_scope: "local"
- name: dscp map delete
pn_dscp_map:
pn_cliswitch: "sw01"
state: "absent"
pn_name: "foo"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the dscp-map command.
returned: always
type: list
stderr:
description: set of error responses from the dscp-map 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the dscp-map-show name command.
If a user with given name exists, return True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
name = module.params['pn_name']
cli += ' dscp-map-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='dscp-map-create',
absent='dscp-map-delete'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_name=dict(required=False, type='str'),
pn_scope=dict(required=False, type='str',
choices=['local', 'fabric']),
),
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 == 'dscp-map-delete':
if NAME_EXISTS is False:
module.exit_json(
skipped=True,
msg='dscp map with name %s does not exist' % name
)
else:
if command == 'dscp-map-create':
if NAME_EXISTS is True:
module.exit_json(
skipped=True,
msg='dscp map with name %s already exists' % name
)
if scope:
cli += ' scope ' + scope
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,163 @@
#!/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_dscp_map_pri_map
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify dscp-map-pri-map
description:
- This module can be used to update priority mappings in tables.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: False
type: str
state:
description:
- State the action to perform. Use C(update) to modify
the dscp-map-pri-map.
required: True
type: str
choices: ['update']
pn_pri:
description:
- CoS priority.
required: False
type: str
pn_name:
description:
- Name for the DSCP map.
required: False
type: str
pn_dsmap:
description:
- DSCP value(s).
required: False
type: str
'''
EXAMPLES = """
- name: dscp map pri map modify
pn_dscp_map_pri_map:
pn_cliswitch: 'sw01'
state: 'update'
pn_name: 'foo'
pn_pri: '0'
pn_dsmap: '40'
- name: dscp map pri map modify
pn_dscp_map_pri_map:
pn_cliswitch: 'sw01'
state: 'update'
pn_name: 'foo'
pn_pri: '1'
pn_dsmap: '8,10,12,14'
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the dscp-map-pri-map command.
returned: always
type: list
stderr:
description: set of error responses from the dscp-map-pri-map 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the dscp-map-show name command.
If a user with given name exists, return True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
name = module.params['pn_name']
cli += ' dscp-map-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(
update='dscp-map-pri-map-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_pri=dict(required=False, type='str'),
pn_name=dict(required=False, type='str'),
pn_dsmap=dict(required=False, type='str'),
),
required_if=(
['state', 'update', ['pn_name', 'pn_pri']],
)
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
pri = module.params['pn_pri']
name = module.params['pn_name']
dsmap = module.params['pn_dsmap']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
NAME_EXISTS = check_cli(module, cli)
if command == 'dscp-map-pri-map-modify':
if NAME_EXISTS is False:
module.fail_json(
failed=True,
msg='Create dscp map with name %s before updating' % name
)
cli += ' %s ' % command
if pri:
cli += ' pri ' + pri
if name:
cli += ' name ' + name
if dsmap:
cli += ' dsmap ' + dsmap
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,167 @@
#!/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_fabric_local
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify fabric-local
description:
- This module can be used to modify fabric local information.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: true
type: str
state:
description:
- State the action to perform. Use C(update) to modify the fabric-local.
required: false
type: str
choices: ['update']
default: 'update'
pn_fabric_network:
description:
- fabric administration network.
required: false
choices: ['in-band', 'mgmt', 'vmgmt']
default: 'mgmt'
pn_vlan:
description:
- VLAN assigned to fabric.
required: false
type: str
pn_control_network:
description:
- control plane network.
required: false
choices: ['in-band', 'mgmt', 'vmgmt']
pn_fabric_advertisement_network:
description:
- network to send fabric advertisements on.
required: false
choices: ['inband-mgmt', 'inband-only', 'inband-vmgmt', 'mgmt-only']
'''
EXAMPLES = """
- name: Fabric local module
pn_fabric_local:
pn_cliswitch: "sw01"
pn_vlan: "500"
- name: Fabric local module
pn_fabric_local:
pn_cliswitch: "sw01"
pn_fabric_advertisement_network: "mgmt-only"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the fabric-local command.
returned: always
type: list
stderr:
description: set of error responses from the fabric-local 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def main():
""" This section is for arguments parsing """
state_map = dict(
update='fabric-local-modify'
)
argument_spec = dict(
pn_cliswitch=dict(required=True, type='str'),
state=dict(required=False, type='str', choices=state_map.keys(), default='update'),
pn_fabric_network=dict(required=False, type='str',
choices=['mgmt', 'in-band', 'vmgmt'], default='mgmt'),
pn_vlan=dict(required=False, type='str'),
pn_control_network=dict(required=False, type='str',
choices=['in-band', 'mgmt', 'vmgmt']),
pn_fabric_advertisement_network=dict(required=False, type='str',
choices=['inband-mgmt', 'inband-only', 'inband-vmgmt', 'mgmt-only']),
)
module = AnsibleModule(
argument_spec=argument_spec,
required_one_of=[['pn_fabric_network', 'pn_vlan',
'pn_control_network',
'pn_fabric_advertisement_network']],
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
fabric_network = module.params['pn_fabric_network']
vlan = module.params['pn_vlan']
control_network = module.params['pn_control_network']
fabric_adv_network = module.params['pn_fabric_advertisement_network']
command = state_map[state]
if vlan:
if int(vlan) < 1 or int(vlan) > 4092:
module.fail_json(
failed=True,
msg='Valid vlan range is 1 to 4092'
)
cli = pn_cli(module, cliswitch)
cli += ' vlan-show format id no-show-headers'
out = run_commands(module, cli)[1].split()
if vlan in out and vlan != '1':
module.fail_json(
failed=True,
msg='vlan %s is already in used. Specify unused vlan' % vlan
)
# Building the CLI command string
cli = pn_cli(module, cliswitch)
if command == 'fabric-local-modify':
cli += ' %s ' % command
if fabric_network:
cli += ' fabric-network ' + fabric_network
if vlan:
cli += ' vlan ' + vlan
if control_network:
cli += ' control-network ' + control_network
if fabric_adv_network:
cli += ' fabric-advertisement-network ' + fabric_adv_network
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,209 @@
#!/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_igmp_snooping
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify igmp-snooping
description:
- This module can be used to modify Internet Group Management Protocol (IGMP) snooping.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: False
type: str
state:
description:
- State the action to perform. Use C(update) to modify the igmp-snooping.
required: True
type: str
choices: ['update']
pn_enable:
description:
- enable or disable IGMP snooping.
required: False
type: bool
pn_query_interval:
description:
- IGMP query interval in seconds.
required: False
type: str
pn_igmpv2_vlans:
description:
- VLANs on which to use IGMPv2 protocol.
required: False
type: str
pn_igmpv3_vlans:
description:
- VLANs on which to use IGMPv3 protocol.
required: False
type: str
pn_enable_vlans:
description:
- enable per VLAN IGMP snooping.
required: False
type: str
pn_vxlan:
description:
- enable or disable IGMP snooping on vxlans.
required: False
type: bool
pn_query_max_response_time:
description:
- maximum response time, in seconds, advertised in IGMP queries.
required: False
type: str
pn_scope:
description:
- IGMP snooping scope - fabric or local.
required: False
choices: ['local', 'fabric']
pn_no_snoop_linklocal_vlans:
description:
- Remove snooping of link-local groups(224.0.0.0/24) on these vlans.
required: False
type: str
pn_snoop_linklocal_vlans:
description:
- Allow snooping of link-local groups(224.0.0.0/24) on these vlans.
required: False
type: str
'''
EXAMPLES = """
- name: 'Modify IGMP Snooping'
pn_igmp_snooping:
pn_cliswitch: 'sw01'
state: 'update'
pn_vxlan: True
pn_enable_vlans: '1-399,401-4092'
pn_no_snoop_linklocal_vlans: 'none'
pn_igmpv3_vlans: '1-399,401-4092'
- name: 'Modify IGMP Snooping'
pn_igmp_snooping:
pn_cliswitch: 'sw01'
state: 'update'
pn_vxlan: False
pn_enable_vlans: '1-399'
pn_no_snoop_linklocal_vlans: 'none'
pn_igmpv3_vlans: '1-399'
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the igmp-snooping command.
returned: always
type: list
stderr:
description: set of error responses from the igmp-snooping 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli, booleanArgs
def main():
""" This section is for arguments parsing """
state_map = dict(
update='igmp-snooping-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_enable=dict(required=False, type='bool'),
pn_query_interval=dict(required=False, type='str'),
pn_igmpv2_vlans=dict(required=False, type='str'),
pn_igmpv3_vlans=dict(required=False, type='str'),
pn_enable_vlans=dict(required=False, type='str'),
pn_vxlan=dict(required=False, type='bool'),
pn_query_max_response_time=dict(required=False, type='str'),
pn_scope=dict(required=False, type='str',
choices=['local', 'fabric']),
pn_no_snoop_linklocal_vlans=dict(required=False, type='str'),
pn_snoop_linklocal_vlans=dict(required=False, type='str'),
),
required_one_of=[['pn_enable', 'pn_query_interval',
'pn_igmpv2_vlans',
'pn_igmpv3_vlans',
'pn_enable_vlans',
'pn_vxlan',
'pn_query_max_response_time',
'pn_scope',
'pn_no_snoop_linklocal_vlans',
'pn_snoop_linklocal_vlans']]
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
enable = module.params['pn_enable']
query_interval = module.params['pn_query_interval']
igmpv2_vlans = module.params['pn_igmpv2_vlans']
igmpv3_vlans = module.params['pn_igmpv3_vlans']
enable_vlans = module.params['pn_enable_vlans']
vxlan = module.params['pn_vxlan']
query_max_response_time = module.params['pn_query_max_response_time']
scope = module.params['pn_scope']
no_snoop_linklocal_vlans = module.params['pn_no_snoop_linklocal_vlans']
snoop_linklocal_vlans = module.params['pn_snoop_linklocal_vlans']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
if command == 'igmp-snooping-modify':
cli += ' %s ' % command
cli += booleanArgs(enable, 'enable', 'disable')
cli += booleanArgs(vxlan, 'vxlan', 'no-vxlan')
if query_interval:
cli += ' query-interval ' + query_interval
if igmpv2_vlans:
cli += ' igmpv2-vlans ' + igmpv2_vlans
if igmpv3_vlans:
cli += ' igmpv3-vlans ' + igmpv3_vlans
if enable_vlans:
cli += ' enable-vlans ' + enable_vlans
if query_max_response_time:
cli += ' query-max-response-time ' + query_max_response_time
if scope:
cli += ' scope ' + scope
if no_snoop_linklocal_vlans:
cli += ' no-snoop-linklocal-vlans ' + no_snoop_linklocal_vlans
if snoop_linklocal_vlans:
cli += ' snoop-linklocal-vlans ' + snoop_linklocal_vlans
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,238 @@
#!/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_ipv6security_raguard
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to create/modify/delete ipv6security-raguard
description:
- This module can be used to add ipv6 RA Guard Policy, Update ipv6 RA guard Policy and Remove ipv6 RA Guard Policy.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: false
type: str
state:
description:
- ipv6security-raguard configuration command.
required: false
choices: ['present', 'update', 'absent']
type: str
default: 'present'
pn_device:
description:
- RA Guard Device. host or router.
required: false
choices: ['host', 'router']
type: str
pn_access_list:
description:
- RA Guard Access List of Source IPs.
required: false
type: str
pn_prefix_list:
description:
- RA Guard Prefix List.
required: false
type: str
pn_router_priority:
description:
- RA Guard Router Priority.
required: false
type: str
choices: ['low', 'medium', 'high']
pn_name:
description:
- RA Guard Policy Name.
required: true
type: str
'''
EXAMPLES = """
- name: ipv6 security ragurad create
pn_ipv6security_raguard:
pn_cliswitch: "sw01"
pn_name: "foo"
pn_device: "host"
- name: ipv6 security ragurad create
pn_ipv6security_raguard:
pn_cliswitch: "sw01"
pn_name: "foo1"
pn_device: "host"
pn_access_list: "sample"
pn_prefix_list: "sample"
pn_router_priority: "low"
- name: ipv6 security ragurad modify
pn_ipv6security_raguard:
pn_cliswitch: "sw01"
pn_name: "foo1"
pn_device: "router"
pn_router_priority: "medium"
state: "update"
- name: ipv6 security ragurad delete
pn_ipv6security_raguard:
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 ipv6security-raguard command.
returned: always
type: list
stderr:
description: set of error responses from the ipv6security-raguard 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module):
"""
This method checks for idempotency using the ipv6security-raguard-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 = 'ipv6security-raguard-show format name parsable-delim ,'
out = run_commands(module, cli)[1]
if out:
out = out.split()
return True if name in out else False
def check_list(module, list_name, command):
"""
This method checks for idempotency using provided command.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
cli = '%s format name no-show-headers' % command
out = run_commands(module, cli)[1]
if out:
out = out.split()
if list_name not in out:
module.fail_json(
failed=True,
msg='%s name %s does not exists' % (command, list_name)
)
def main():
""" This section is for arguments parsing """
state_map = dict(
present='ipv6security-raguard-create',
absent='ipv6security-raguard-delete',
update='ipv6security-raguard-modify'
)
argument_spec = dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=False, type='str', choices=state_map.keys(), default='present'),
pn_device=dict(required=False, type='str', choices=['host', 'router']),
pn_access_list=dict(required=False, type='str'),
pn_prefix_list=dict(required=False, type='str'),
pn_router_priority=dict(required=False, type='str', choices=['low', 'medium', 'high']),
pn_name=dict(required=True, type='str'),
)
module = AnsibleModule(
argument_spec=argument_spec,
required_if=(
["state", "present", ['pn_device']],
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
device = module.params['pn_device']
access_list = module.params['pn_access_list']
prefix_list = module.params['pn_prefix_list']
router_priority = module.params['pn_router_priority']
name = module.params['pn_name']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
NAME_EXISTS = check_cli(module)
if command == 'ipv6security-raguard-modify':
if not device and not access_list and not prefix_list and not router_priority:
module.fail_json(
failed=True,
msg='required one of device, access_list, prefix_list or router_priority'
)
if command == 'ipv6security-raguard-create':
if NAME_EXISTS is True:
module.exit_json(
skipped=True,
msg='ipv6 security raguard with name %s already exists' % name
)
if command != 'ipv6security-raguard-create':
if NAME_EXISTS is False:
module.exit_json(
skipped=True,
msg='ipv6 security raguard with name %s does not exist' % name
)
cli += ' %s name %s ' % (command, name)
if command != 'ipv6security-raguard-delete':
if device == 'router':
cli += ' device ' + device
if access_list:
check_list(module, access_list, 'access-list-show')
cli += ' access-list ' + access_list
if prefix_list:
check_list(module, prefix_list, 'prefix-list-show')
cli += ' prefix-list ' + prefix_list
if router_priority:
cli += ' router-priority ' + router_priority
if device == 'host':
cli += ' device ' + device
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,148 @@
#!/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_ipv6security_raguard_port
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to add/remove ipv6security-raguard-port
description:
- This module can be used to add ports to RA Guard Policy and remove ports to RA Guard Policy.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: false
type: str
state:
description:
- ipv6security-raguard-port configuration command.
required: false
type: str
choices: ['present', 'absent']
default: 'present'
pn_name:
description:
- RA Guard Policy Name.
required: true
type: str
pn_ports:
description:
- Ports attached to RA Guard Policy.
required: true
type: str
'''
EXAMPLES = """
- name: ipv6 security raguard port add
pn_ipv6security_raguard_port:
pn_cliswitch: "sw01"
pn_name: "foo"
pn_ports: "1"
- name: ipv6 security raguard port remove
pn_ipv6security_raguard_port:
pn_cliswitch: "sw01"
pn_name: "foo"
state: "absent"
pn_ports: "1"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the ipv6security-raguard-port command.
returned: always
type: list
stderr:
description: set of error responses from the ipv6security-raguard-port 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module):
"""
This method checks for idempotency using the ipv6security-raguard-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 = 'ipv6security-raguard-show format name parsable-delim ,'
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='ipv6security-raguard-port-add',
absent='ipv6security-raguard-port-remove'
)
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_ports=dict(required=True, type='str')
)
module = AnsibleModule(
argument_spec=argument_spec
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
name = module.params['pn_name']
ports = module.params['pn_ports']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
NAME_EXISTS = check_cli(module)
if command:
if NAME_EXISTS is False:
module.fail_json(
failed=True,
msg='ipv6 security raguard with name %s does not exist to add ports' % name
)
cli += ' %s name %s ports %s' % (command, name, ports)
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,182 @@
#!/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_ipv6security_raguard_vlan
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to add/remove ipv6security-raguard-vlan
description:
- This module can be used to Add vlans to RA Guard Policy and Remove vlans to RA Guard Policy.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: false
type: str
state:
description:
- ipv6security-raguard-vlan configuration command.
required: false
type: str
choices: ['present', 'absent']
default: 'present'
pn_vlans:
description:
- Vlans attached to RA Guard Policy.
required: true
type: str
pn_name:
description:
- RA Guard Policy Name.
required: true
type: str
'''
EXAMPLES = """
- name: ipv6 security raguard vlan add
pn_ipv6security_raguard_vlan:
pn_cliswitch: "sw01"
pn_name: "foo"
pn_vlans: "100-105"
- name: ipv6 security raguard vlan add
pn_ipv6security_raguard_vlan:
pn_cliswitch: "sw01"
pn_name: "foo"
pn_vlans: "100"
- name: ipv6 security raguard vlan remove
pn_ipv6security_raguard_vlan:
pn_cliswitch: "sw01"
pn_name: "foo"
pn_vlans: "100-105"
state: 'absent'
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the ipv6security-raguard-vlan command.
returned: always
type: list
stderr:
description: set of error responses from the ipv6security-raguard-vlan 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the ipv6-security-reguard 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']
vlans = module.params['pn_vlans']
show = cli
cli += ' ipv6security-raguard-show format name no-show-headers'
out = run_commands(module, cli)[1]
if out:
out = out.split()
NAME_EXISTS = True if name in out else False
show += ' vlan-show format id no-show-headers'
out = run_commands(module, show)[1]
if out:
out = out.split()
if vlans and '-' in vlans:
vlan_list = list()
vlans = vlans.strip().split('-')
for vlan in range(int(vlans[0]), int(vlans[1]) + 1):
vlan_list.append(str(vlan))
for vlan in vlan_list:
if vlan not in out:
module.fail_json(
failed=True,
msg='vlan id %s does not exist. Make sure you create vlan before adding it' % vlan
)
else:
if vlans not in out:
module.fail_json(
failed=True,
msg='vlan id %s does not exist. Make sure you create vlan before adding it' % vlans
)
return NAME_EXISTS
def main():
""" This section is for arguments parsing """
state_map = dict(
present='ipv6security-raguard-vlan-add',
absent='ipv6security-raguard-vlan-remove'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=False, type='str', choices=state_map.keys(), default='present'),
pn_vlans=dict(required=True, type='str'),
pn_name=dict(required=True, type='str'),
)
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
vlans = module.params['pn_vlans']
name = module.params['pn_name']
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:
if NAME_EXISTS is False:
module.exit_json(
skipped=True,
msg='ipv6security raguard with name %s does not exist' % name
)
if vlans:
cli += ' vlans ' + vlans
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,203 @@
#!/usr/bin/python
# Copyright: (c) 2018, Pluribus Networks
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/license/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_log_audit_exception
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to create/delete an audit exception
description:
- This module can be used to create an audit exception and delete an audit exception.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: false
type: str
pn_audit_type:
description:
- Specify the type of audit exception.
required: false
type: str
choices: ['cli', 'shell', 'vtysh']
state:
description:
- State the action to perform. Use 'present' to create audit-exception and
'absent' to delete audit-exception.
required: false
type: str
choices: ['present', 'absent']
default: 'present'
pn_pattern:
description:
- Specify a regular expression to match exceptions.
required: false
type: str
pn_scope:
description:
- scope - local or fabric.
required: false
type: str
choices: ['local', 'fabric']
pn_access:
description:
- Specify the access type to match exceptions.
required: true
type: str
choices: ['any', 'read-only', 'read-write']
'''
EXAMPLES = """
- name: create a log-audit-exception
pn_log_audit_exception:
pn_audit_type: "cli"
pn_pattern: "test"
state: "present"
pn_access: "any"
pn_scope: "local"
- name: delete a log-audit-exception
pn_log_audit_exception:
pn_audit_type: "shell"
pn_pattern: "test"
state: "absent"
pn_access: "any"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the pn_log_audit_exceptions command.
returned: always
type: list
stderr:
description: set of error responses from the log_audit_exceptions 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the log-audit-exception command.
If a list with given name exists, return exists as True else False.
:param module: The Ansible module to fetch input parameters.
:return Booleans: True or False.
"""
state = module.params['state']
audit_type = module.params['pn_audit_type']
pattern = module.params['pn_pattern']
access = module.params['pn_access']
scope = module.params['pn_scope']
cli += ' log-audit-exception-show'
cli += ' no-show-headers format '
cli += ' type,pattern,access,scope parsable-delim DELIM'
stdout = run_commands(module, cli)[1]
if stdout:
linelist = stdout.strip().split('\n')
for line in linelist:
wordlist = line.split('DELIM')
count = 0
if wordlist[0] == audit_type:
count += 1
if wordlist[1] == pattern:
count += 1
if wordlist[2] == access:
count += 1
if state == 'present' and wordlist[3] == scope:
count += 1
elif state == 'absent' and count == 3:
return True
if state == 'present' and count == 4:
return True
return False
def main():
""" This section is for arguments parsing """
state_map = dict(
present='log-audit-exception-create',
absent='log-audit-exception-delete',
)
argument_spec = dict(
pn_cliswitch=dict(required=False, type='str'),
pn_pattern=dict(required=True, type='str'),
state=dict(required=False, type='str',
choices=state_map.keys(), default='present'),
pn_access=dict(required=True, type='str', choices=['any', 'read-only', 'read-write']),
pn_audit_type=dict(required=True, type='str', choices=['cli', 'shell', 'vtysh']),
pn_scope=dict(required=False, type='str', choices=['local', 'fabric']),
)
module = AnsibleModule(
argument_spec=argument_spec,
required_if=(
["state", "present", ["pn_scope"]],
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
access = module.params['pn_access']
audit_type = module.params['pn_audit_type']
pattern = module.params['pn_pattern']
scope = module.params['pn_scope']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
audit_log_exists = check_cli(module, cli)
cli += ' %s %s pattern %s %s' % (command, audit_type, pattern, access)
if state == 'absent':
if audit_log_exists is False:
module.exit_json(
skipped=True,
msg='This audit log exception entry does not exist'
)
run_cli(module, cli, state_map)
elif state == 'present':
if audit_log_exists is True:
module.exit_json(
skipped=True,
msg='This audit log exception entry already exists'
)
cli += ' scope %s ' % scope
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,300 @@
#!/usr/bin/python
""" PN-CLI vrouter-ospf-add/remove """
#
# 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/>.
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['deprecated'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
module: pn_ospf
author: "Pluribus Networks (@amitsi)"
short_description: CLI command to add/remove ospf protocol to a vRouter.
deprecated:
removed_in: '2.12'
why: Doesn't support latest Pluribus Networks netvisor
alternative: Latest modules will be pushed in Ansible future versions.
description:
- Execute vrouter-ospf-add, vrouter-ospf-remove command.
- This command adds/removes Open Shortest Path First(OSPF) routing
protocol to a virtual router(vRouter) service.
options:
pn_cliusername:
description:
- Provide login username if user is not root.
required: False
pn_clipassword:
description:
- Provide login password if user is not root.
required: False
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: False
default: 'local'
state:
description:
- Assert the state of the ospf. Use 'present' to add ospf
and 'absent' to remove ospf.
required: True
default: present
choices: ['present', 'absent']
pn_vrouter_name:
description:
- Specify the name of the vRouter.
required: True
pn_network_ip:
description:
- Specify the network IP (IPv4 or IPv6) address.
required: True
pn_ospf_area:
description:
- Stub area number for the configuration. Required for vrouter-ospf-add.
'''
EXAMPLES = """
- name: "Add OSPF to vrouter"
pn_ospf:
state: present
pn_vrouter_name: name-string
pn_network_ip: 192.168.11.2/24
pn_ospf_area: 1.0.0.0
- name: "Remove OSPF from vrouter"
pn_ospf:
state: absent
pn_vrouter_name: name-string
"""
RETURN = """
command:
description: The CLI command run on the target node(s).
returned: always
type: str
stdout:
description: The set of responses from the ospf command.
returned: always
type: list
stderr:
description: The set of error responses from the ospf command.
returned: on error
type: list
changed:
description: Indicates whether the CLI caused changes on the target.
returned: always
type: bool
"""
import shlex
# AnsibleModule boilerplate
from ansible.module_utils.basic import AnsibleModule
VROUTER_EXISTS = None
NETWORK_EXISTS = None
def pn_cli(module):
"""
This method is to generate the cli portion to launch the Netvisor cli.
It parses the username, password, switch parameters from module.
:param module: The Ansible module to fetch username, password and switch
:return: returns the cli string for further processing
"""
username = module.params['pn_cliusername']
password = module.params['pn_clipassword']
cliswitch = module.params['pn_cliswitch']
if username and password:
cli = '/usr/bin/cli --quiet --user %s:%s ' % (username, password)
else:
cli = '/usr/bin/cli --quiet '
if cliswitch == 'local':
cli += ' switch-local '
else:
cli += ' switch ' + cliswitch
return cli
def check_cli(module, cli):
"""
This method checks if vRouter exists on the target node.
This method also checks for idempotency using the vrouter-ospf-show command.
If the given vRouter exists, return VROUTER_EXISTS as True else False.
If an OSPF network with the given ip exists on the given vRouter,
return NETWORK_EXISTS as True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
:return Global Booleans: VROUTER_EXISTS, NETWORK_EXISTS
"""
vrouter_name = module.params['pn_vrouter_name']
network_ip = module.params['pn_network_ip']
# Global flags
global VROUTER_EXISTS, NETWORK_EXISTS
# Check for vRouter
check_vrouter = cli + ' vrouter-show format name no-show-headers '
check_vrouter = shlex.split(check_vrouter)
out = module.run_command(check_vrouter)[1]
out = out.split()
if vrouter_name in out:
VROUTER_EXISTS = True
else:
VROUTER_EXISTS = False
# Check for OSPF networks
show = cli + ' vrouter-ospf-show vrouter-name %s ' % vrouter_name
show += 'format network no-show-headers'
show = shlex.split(show)
out = module.run_command(show)[1]
out = out.split()
if network_ip in out:
NETWORK_EXISTS = True
else:
NETWORK_EXISTS = False
def run_cli(module, cli):
"""
This method executes the cli command on the target node(s) and returns the
output. The module then exits based on the output.
:param cli: the complete cli string to be executed on the target node(s).
:param module: The Ansible module to fetch command
"""
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
command = get_command_from_state(state)
cmd = shlex.split(cli)
result, out, err = module.run_command(cmd)
print_cli = cli.split(cliswitch)[1]
# Response in JSON format
if result != 0:
module.exit_json(
command=print_cli,
stderr=err.strip(),
msg="%s operation failed" % command,
changed=False
)
if out:
module.exit_json(
command=print_cli,
stdout=out.strip(),
msg="%s operation completed" % command,
changed=True
)
else:
module.exit_json(
command=print_cli,
msg="%s operation completed" % command,
changed=True
)
def get_command_from_state(state):
"""
This method gets appropriate command name for the state specified. It
returns the command name for the specified state.
:param state: The state for which the respective command name is required.
"""
command = None
if state == 'present':
command = 'vrouter-ospf-add'
if state == 'absent':
command = 'vrouter-ospf-remove'
return command
def main():
""" This section is for arguments parsing """
module = AnsibleModule(
argument_spec=dict(
pn_cliusername=dict(required=False, type='str'),
pn_clipassword=dict(required=False, type='str', no_log=True),
pn_cliswitch=dict(required=False, type='str', default='local'),
state=dict(type='str', default='present', choices=['present',
'absent']),
pn_vrouter_name=dict(required=True, type='str'),
pn_network_ip=dict(required=True, type='str'),
pn_ospf_area=dict(type='str')
),
required_if=(
['state', 'present',
['pn_network_ip', 'pn_ospf_area']],
['state', 'absent', ['pn_network_ip']]
)
)
# Accessing the arguments
state = module.params['state']
vrouter_name = module.params['pn_vrouter_name']
network_ip = module.params['pn_network_ip']
ospf_area = module.params['pn_ospf_area']
command = get_command_from_state(state)
# Building the CLI command string
cli = pn_cli(module)
check_cli(module, cli)
if state == 'present':
if VROUTER_EXISTS is False:
module.exit_json(
skipped=True,
msg='vRouter %s does not exist' % vrouter_name
)
if NETWORK_EXISTS is True:
module.exit_json(
skipped=True,
msg=('OSPF with network ip %s already exists on %s'
% (network_ip, vrouter_name))
)
cli += (' %s vrouter-name %s network %s ospf-area %s'
% (command, vrouter_name, network_ip, ospf_area))
if state == 'absent':
if VROUTER_EXISTS is False:
module.exit_json(
skipped=True,
msg='vRouter %s does not exist' % vrouter_name
)
if NETWORK_EXISTS is False:
module.exit_json(
skipped=True,
msg=('OSPF with network ip %s already exists on %s'
% (network_ip, vrouter_name))
)
cli += (' %s vrouter-name %s network %s'
% (command, vrouter_name, network_ip))
run_cli(module, cli)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,226 @@
#!/usr/bin/python
""" PN-CLI vrouter-ospf-add/remove """
#
# 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/>.
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['deprecated'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
module: pn_ospfarea
author: "Pluribus Networks (@amitsi)"
short_description: CLI command to add/remove ospf area to/from a vrouter.
deprecated:
removed_in: '2.12'
why: Doesn't support latest Pluribus Networks netvisor
alternative: Latest modules will be pushed in Ansible future versions.
description:
- Execute vrouter-ospf-add, vrouter-ospf-remove command.
- This command adds/removes Open Shortest Path First(OSPF) area to/from
a virtual router(vRouter) service.
options:
pn_cliusername:
description:
- Login username.
required: true
pn_clipassword:
description:
- Login password.
required: true
pn_cliswitch:
description:
- Target switch(es) to run the CLI on.
required: False
state:
description:
- State the action to perform. Use 'present' to add ospf-area, 'absent'
to remove ospf-area and 'update' to modify ospf-area.
required: true
choices: ['present', 'absent', 'update']
pn_vrouter_name:
description:
- Specify the name of the vRouter.
required: true
pn_ospf_area:
description:
- Specify the OSPF area number.
required: true
pn_stub_type:
description:
- Specify the OSPF stub type.
choices: ['none', 'stub', 'stub-no-summary', 'nssa', 'nssa-no-summary']
pn_prefix_listin:
description:
- OSPF prefix list for filtering incoming packets.
pn_prefix_listout:
description:
- OSPF prefix list for filtering outgoing packets.
pn_quiet:
description:
- Enable/disable system information.
required: false
type: bool
default: true
'''
EXAMPLES = """
- name: "Add OSPF area to vrouter"
pn_ospfarea:
state: present
pn_cliusername: admin
pn_clipassword: admin
pn_ospf_area: 1.0.0.0
pn_stub_type: stub
- name: "Remove OSPF from vrouter"
pn_ospf:
state: absent
pn_cliusername: admin
pn_clipassword: admin
pn_vrouter_name: name-string
pn_ospf_area: 1.0.0.0
"""
RETURN = """
command:
description: The CLI command run on the target node(s).
returned: always
type: str
stdout:
description: The set of responses from the ospf command.
returned: always
type: list
stderr:
description: The set of error responses from the ospf command.
returned: on error
type: list
changed:
description: Indicates whether the CLI caused changes on the target.
returned: always
type: bool
"""
import shlex
# AnsibleModule boilerplate
from ansible.module_utils.basic import AnsibleModule
def get_command_from_state(state):
"""
This method gets appropriate command name for the state specified. It
returns the command name for the specified state.
:param state: The state for which the respective command name is required.
"""
command = None
if state == 'present':
command = 'vrouter-ospf-area-add'
if state == 'absent':
command = 'vrouter-ospf-area-remove'
if state == 'update':
command = 'vrouter-ospf-area-modify'
return command
def main():
""" This section is for arguments parsing """
module = AnsibleModule(
argument_spec=dict(
pn_cliusername=dict(required=True, type='str'),
pn_clipassword=dict(required=True, type='str', no_log=True),
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=['present', 'absent', 'update']),
pn_vrouter_name=dict(required=True, type='str'),
pn_ospf_area=dict(required=True, type='str'),
pn_stub_type=dict(type='str', choices=['none', 'stub', 'nssa',
'stub-no-summary',
'nssa-no-summary']),
pn_prefix_listin=dict(type='str'),
pn_prefix_listout=dict(type='str'),
pn_quiet=dict(type='bool', default='True')
)
)
# Accessing the arguments
cliusername = module.params['pn_cliusername']
clipassword = module.params['pn_clipassword']
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
vrouter_name = module.params['pn_vrouter_name']
ospf_area = module.params['pn_ospf_area']
stub_type = module.params['pn_stub_type']
prefix_listin = module.params['pn_prefix_listin']
prefix_listout = module.params['pn_prefix_listout']
quiet = module.params['pn_quiet']
command = get_command_from_state(state)
# Building the CLI command string
cli = '/usr/bin/cli'
if quiet is True:
cli += ' --quiet '
cli += ' --user %s:%s ' % (cliusername, clipassword)
if cliswitch:
if cliswitch == 'local':
cli += ' switch-local '
else:
cli += ' switch ' + cliswitch
cli += ' %s vrouter-name %s area %s ' % (command, vrouter_name, ospf_area)
if stub_type:
cli += ' stub-type ' + stub_type
if prefix_listin:
cli += ' prefix-list-in ' + prefix_listin
if prefix_listout:
cli += ' prefix-list-out ' + prefix_listout
# Run the CLI command
ospfcommand = shlex.split(cli)
# 'out' contains the output
# 'err' contains the error messages
result, out, err = module.run_command(ospfcommand)
# Response in JSON format
if result != 0:
module.exit_json(
command=cli,
stderr=err.rstrip("\r\n"),
changed=False
)
else:
module.exit_json(
command=cli,
stdout=out.rstrip("\r\n"),
changed=True
)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,382 @@
#!/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_port_config
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify port-config
description:
- This module can be used to modify a port configuration.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: False
type: str
state:
description:
- State the action to perform. Use C(update) to modify the port-config.
required: True
type: str
choices: ['update']
pn_intf:
description:
- physical interface.
required: False
type: str
pn_crc_check_enable:
description:
- CRC check on ingress and rewrite on egress.
required: False
type: bool
pn_dscp_map:
description:
- DSCP map name to enable on port.
required: False
type: str
pn_autoneg:
description:
- physical port autonegotiation.
required: False
type: bool
pn_speed:
description:
- physical port speed.
required: False
choices: ['disable', '10m', '100m', '1g',
'2.5g', '10g', '25g', '40g', '50g', '100g']
pn_port:
description:
- physical port.
required: False
type: str
pn_vxlan_termination:
description:
- physical port vxlan termination setting.
required: False
type: bool
pn_pause:
description:
- physical port pause.
required: False
type: bool
pn_loopback:
description:
- physical port loopback.
required: False
type: bool
pn_loop_vlans:
description:
- looping vlans.
required: False
type: str
pn_routing:
description:
- routing.
required: False
type: bool
pn_edge_switch:
description:
- physical port edge switch.
required: False
type: bool
pn_enable:
description:
- physical port enable.
required: False
type: bool
pn_description:
description:
- physical port description.
required: False
type: str
pn_host_enable:
description:
- Host facing port control setting.
required: False
type: bool
pn_allowed_tpid:
description:
- Allowed TPID in addition to 0x8100 on Vlan header.
required: False
type: str
choices: ['vlan', 'q-in-q', 'q-in-q-old']
pn_mirror_only:
description:
- physical port mirror only.
required: False
type: bool
pn_reflect:
description:
- physical port reflection.
required: False
type: bool
pn_jumbo:
description:
- jumbo frames on physical port.
required: False
type: bool
pn_egress_rate_limit:
description:
- max egress port data rate limit.
required: False
type: str
pn_eth_mode:
description:
- physical Ethernet mode.
required: False
choices: ['1000base-x', 'sgmii', 'disabled', 'GMII']
pn_fabric_guard:
description:
- Fabric guard configuration.
required: False
type: bool
pn_local_switching:
description:
- no-local-switching port cannot bridge traffic to
another no-local-switching port.
required: False
type: bool
pn_lacp_priority:
description:
- LACP priority from 1 to 65535.
required: False
type: str
pn_send_port:
description:
- send port.
required: False
type: str
pn_port_mac_address:
description:
- physical port MAC Address.
required: False
type: str
pn_defer_bringup:
description:
- defer port bringup.
required: False
type: bool
'''
EXAMPLES = """
- name: port config modify
pn_port_config:
pn_cliswitch: "sw01"
state: "update"
pn_port: "all"
pn_dscp_map: "foo"
- name: port config modify
pn_port_config:
pn_cliswitch: "sw01"
state: "update"
pn_port: "all"
pn_host_enable: true
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the port-config command.
returned: always
type: list
stderr:
description: set of error responses from the port-config 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli, booleanArgs
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the dscp-map-show name command.
If a user with given name exists, return True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
name = module.params['pn_dscp_map']
cli += ' dscp-map-show name %s format name no-show-headers' % name
out = run_commands(module, cli)[1]
out = out.split()
return True if name in out[-1] else False
def main():
""" This section is for arguments parsing """
state_map = dict(
update='port-config-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=['update']),
pn_intf=dict(required=False, type='str'),
pn_crc_check_enable=dict(required=False, type='bool'),
pn_dscp_map=dict(required=False, type='str'),
pn_autoneg=dict(required=False, type='bool'),
pn_speed=dict(required=False, type='str',
choices=['disable', '10m', '100m',
'1g', '2.5g', '10g', '25g',
'40g', '50g', '100g']),
pn_port=dict(required=False, type='str'),
pn_vxlan_termination=dict(required=False, type='bool'),
pn_pause=dict(required=False, type='bool'),
pn_loopback=dict(required=False, type='bool'),
pn_loop_vlans=dict(required=False, type='str'),
pn_routing=dict(required=False, type='bool'),
pn_edge_switch=dict(required=False, type='bool'),
pn_enable=dict(required=False, type='bool'),
pn_description=dict(required=False, type='str'),
pn_host_enable=dict(required=False, type='bool'),
pn_allowed_tpid=dict(required=False, type='str',
choices=['vlan', 'q-in-q', 'q-in-q-old']),
pn_mirror_only=dict(required=False, type='bool'),
pn_reflect=dict(required=False, type='bool'),
pn_jumbo=dict(required=False, type='bool'),
pn_egress_rate_limit=dict(required=False, type='str'),
pn_eth_mode=dict(required=False, type='str',
choices=['1000base-x', 'sgmii',
'disabled', 'GMII']),
pn_fabric_guard=dict(required=False, type='bool'),
pn_local_switching=dict(required=False, type='bool'),
pn_lacp_priority=dict(required=False, type='str'),
pn_send_port=dict(required=False, type='str'),
pn_port_mac_address=dict(required=False, type='str'),
pn_defer_bringup=dict(required=False, type='bool'),
),
required_if=(
['state', 'update', ['pn_port']],
),
required_one_of=[['pn_intf', 'pn_crc_check_enable', 'pn_dscp_map',
'pn_speed', 'pn_autoneg',
'pn_vxlan_termination', 'pn_pause',
'pn_fec', 'pn_loopback', 'pn_loop_vlans',
'pn_routing', 'pn_edge_switch',
'pn_enable', 'pn_description',
'pn_host_enable', 'pn_allowed_tpid',
'pn_mirror_only', 'pn_reflect',
'pn_jumbo', 'pn_egress_rate_limit',
'pn_eth_mode', 'pn_fabric_guard',
'pn_local_switching', 'pn_lacp_priority',
'pn_send_port', 'pn_port_mac_address',
'pn_defer_bringup']],
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
intf = module.params['pn_intf']
crc_check_enable = module.params['pn_crc_check_enable']
dscp_map = module.params['pn_dscp_map']
autoneg = module.params['pn_autoneg']
speed = module.params['pn_speed']
port = module.params['pn_port']
vxlan_termination = module.params['pn_vxlan_termination']
pause = module.params['pn_pause']
loopback = module.params['pn_loopback']
loop_vlans = module.params['pn_loop_vlans']
routing = module.params['pn_routing']
edge_switch = module.params['pn_edge_switch']
enable = module.params['pn_enable']
description = module.params['pn_description']
host_enable = module.params['pn_host_enable']
allowed_tpid = module.params['pn_allowed_tpid']
mirror_only = module.params['pn_mirror_only']
reflect = module.params['pn_reflect']
jumbo = module.params['pn_jumbo']
egress_rate_limit = module.params['pn_egress_rate_limit']
eth_mode = module.params['pn_eth_mode']
fabric_guard = module.params['pn_fabric_guard']
local_switching = module.params['pn_local_switching']
lacp_priority = module.params['pn_lacp_priority']
send_port = module.params['pn_send_port']
port_mac_address = module.params['pn_port_mac_address']
defer_bringup = module.params['pn_defer_bringup']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
if dscp_map:
NAME_EXISTS = check_cli(module, cli)
if command == 'port-config-modify':
cli += ' %s ' % command
if dscp_map:
if NAME_EXISTS is False:
module.fail_json(
failed=True,
msg='Create dscp map with name %s before updating' % dscp_map
)
cli += ' dscp-map ' + dscp_map
if intf:
cli += ' intf ' + intf
if speed:
cli += ' speed ' + speed
if port:
cli += ' port ' + port
if allowed_tpid:
cli += ' allowed-tpid ' + allowed_tpid
if egress_rate_limit:
cli += ' egress-rate-limit ' + egress_rate_limit
if eth_mode:
cli += ' eth-mode ' + eth_mode
if lacp_priority:
cli += ' lacp-priority ' + lacp_priority
if send_port:
cli += ' send-port ' + send_port
if port_mac_address:
cli += ' port-mac-address ' + port_mac_address
cli += booleanArgs(crc_check_enable, 'crc-check-enable', 'crc-check-disable')
cli += booleanArgs(autoneg, 'autoneg', 'no-autoneg')
cli += booleanArgs(vxlan_termination, 'vxlan-termination', 'no-vxlan-termination')
cli += booleanArgs(pause, 'pause', 'no-pause')
cli += booleanArgs(loopback, 'loopback', 'no-loopback')
cli += booleanArgs(routing, 'routing', 'no-routing')
cli += booleanArgs(edge_switch, 'edge-switch', 'no-edge-switch')
cli += booleanArgs(enable, 'enable', 'disable')
cli += booleanArgs(host_enable, 'host-enable', 'host-disable')
cli += booleanArgs(mirror_only, 'mirror-only', 'no-mirror-receive-only')
cli += booleanArgs(reflect, 'reflect', 'no-reflect')
cli += booleanArgs(jumbo, 'jumbo', 'no-jumbo')
cli += booleanArgs(fabric_guard, 'fabric-guard', 'no-fabric-guard')
cli += booleanArgs(local_switching, 'local-switching', 'no-local-switching')
cli += booleanArgs(defer_bringup, 'defer-bringup', 'no-defer-bringup')
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,158 @@
#!/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_port_cos_bw
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify port-cos-bw
description:
- This module can be used to update bw settings for CoS queues.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: False
type: str
state:
description:
- State the action to perform. Use C(update) to modify the port-cos-bw.
required: True
type: str
choices: ['update']
pn_max_bw_limit:
description:
- Maximum b/w in percentage.
required: False
type: str
pn_cos:
description:
- CoS priority.
required: False
type: str
pn_port:
description:
- physical port number.
required: False
type: str
pn_weight:
description:
- Scheduling weight (1 to 127) after b/w guarantee met.
required: False
type: str
choices: ['priority', 'no-priority']
pn_min_bw_guarantee:
description:
- Minimum b/w in percentage.
required: False
type: str
'''
EXAMPLES = """
- name: port cos bw modify
pn_port_cos_bw:
pn_cliswitch: "sw01"
state: "update"
pn_port: "1"
pn_cos: "0"
pn_min_bw_guarantee: "60"
- name: port cos bw modify
pn_port_cos_bw:
pn_cliswitch: "sw01"
state: "update"
pn_port: "all"
pn_cos: "0"
pn_weight: "priority"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the port-cos-bw command.
returned: always
type: list
stderr:
description: set of error responses from the port-cos-bw 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
def main():
""" This section is for arguments parsing """
state_map = dict(
update='port-cos-bw-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_max_bw_limit=dict(required=False, type='str'),
pn_cos=dict(required=False, type='str'),
pn_port=dict(required=False, type='str'),
pn_weight=dict(required=False, type='str',
choices=['priority', 'no-priority']),
pn_min_bw_guarantee=dict(required=False, type='str'),
),
required_if=(
['state', 'update', ['pn_cos', 'pn_port']],
),
required_one_of=[['pn_max_bw_limit', 'pn_min_bw_guarantee', 'pn_weight']],
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
max_bw_limit = module.params['pn_max_bw_limit']
cos = module.params['pn_cos']
port = module.params['pn_port']
weight = module.params['pn_weight']
min_bw_guarantee = module.params['pn_min_bw_guarantee']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
if command == 'port-cos-bw-modify':
cli += ' %s ' % command
if max_bw_limit:
cli += ' max-bw-limit ' + max_bw_limit
if cos:
cli += ' cos ' + cos
if port:
cli += ' port ' + port
if weight:
cli += ' weight ' + weight
if min_bw_guarantee:
cli += ' min-bw-guarantee ' + min_bw_guarantee
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,206 @@
#!/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_port_cos_rate_setting
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify port-cos-rate-setting
description:
- This modules can be used to update the port cos rate limit.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: false
type: str
state:
description:
- State the action to perform. Use C(update) to modify
the port-cos-rate-setting.
required: true
type: str
choices: ['update']
pn_cos0_rate:
description:
- cos0 rate limit (pps) unlimited or 0 to 10000000.
required: false
type: str
pn_cos1_rate:
description:
- cos1 rate limit (pps) unlimited or 0 to 10000000.
required: false
type: str
pn_cos2_rate:
description:
- cos2 rate limit (pps) unlimited or 0 to 10000000.
required: false
type: str
pn_cos3_rate:
description:
- cos3 rate limit (pps) unlimited or 0 to 10000000.
required: false
type: str
pn_cos4_rate:
description:
- cos4 rate limit (pps) unlimited or 0 to 10000000.
required: false
type: str
pn_cos5_rate:
description:
- cos5 rate limit (pps) unlimited or 0 to 10000000.
required: false
type: str
pn_cos6_rate:
description:
- cos6 rate limit (pps) unlimited or 0 to 10000000.
required: false
type: str
pn_cos7_rate:
description:
- cos7 rate limit (pps) unlimited or 0 to 10000000.
required: false
type: str
pn_port:
description:
- port.
required: false
type: str
choices: ['control-port', 'data-port', 'span-ports']
'''
EXAMPLES = """
- name: port cos rate modify
pn_port_cos_rate_setting:
pn_cliswitch: "sw01"
state: "update"
pn_port: "control-port"
pn_cos1_rate: "1000"
pn_cos5_rate: "1000"
pn_cos2_rate: "1000"
pn_cos0_rate: "1000"
- name: port cos rate modify
pn_port_cos_rate_setting:
pn_cliswitch: "sw01"
state: "update"
pn_port: "data-port"
pn_cos1_rate: "2000"
pn_cos5_rate: "2000"
pn_cos2_rate: "2000"
pn_cos0_rate: "2000"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the port-cos-rate-setting command.
returned: always
type: list
stderr:
description: set of error responses from the port-cos-rate-setting 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
def main():
""" This section is for arguments parsing """
state_map = dict(
update='port-cos-rate-setting-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_cos1_rate=dict(required=False, type='str'),
pn_cos5_rate=dict(required=False, type='str'),
pn_cos2_rate=dict(required=False, type='str'),
pn_cos0_rate=dict(required=False, type='str'),
pn_cos6_rate=dict(required=False, type='str'),
pn_cos3_rate=dict(required=False, type='str'),
pn_cos4_rate=dict(required=False, type='str'),
pn_cos7_rate=dict(required=False, type='str'),
pn_port=dict(required=False, type='str',
choices=['control-port', 'data-port', 'span-ports']),
),
required_if=(
['state', 'update', ['pn_port']],
),
required_one_of=[['pn_cos0_rate',
'pn_cos1_rate',
'pn_cos2_rate',
'pn_cos3_rate',
'pn_cos4_rate',
'pn_cos5_rate',
'pn_cos6_rate',
'pn_cos7_rate']],
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
cos1_rate = module.params['pn_cos1_rate']
cos5_rate = module.params['pn_cos5_rate']
cos2_rate = module.params['pn_cos2_rate']
cos0_rate = module.params['pn_cos0_rate']
cos6_rate = module.params['pn_cos6_rate']
cos3_rate = module.params['pn_cos3_rate']
cos4_rate = module.params['pn_cos4_rate']
cos7_rate = module.params['pn_cos7_rate']
port = module.params['pn_port']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
if command == 'port-cos-rate-setting-modify':
cli += ' %s ' % command
if cos1_rate:
cli += ' cos1-rate ' + cos1_rate
if cos5_rate:
cli += ' cos5-rate ' + cos5_rate
if cos2_rate:
cli += ' cos2-rate ' + cos2_rate
if cos0_rate:
cli += ' cos0-rate ' + cos0_rate
if cos6_rate:
cli += ' cos6-rate ' + cos6_rate
if cos3_rate:
cli += ' cos3-rate ' + cos3_rate
if cos4_rate:
cli += ' cos4-rate ' + cos4_rate
if cos7_rate:
cli += ' cos7-rate ' + cos7_rate
if port:
cli += ' port ' + port
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,164 @@
#!/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)"
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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.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()

View file

@ -0,0 +1,190 @@
#!/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_network
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to add/remove prefix-list-network
description:
- This module is used to add network associated with prefix list
and remove networks associated with 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-network and C(absent) to delete prefix-list-network.
required: true
type: str
choices: ['present', 'absent']
pn_netmask:
description:
- netmask of the network associated the prefix list.
required: false
type: str
pn_name:
description:
- Prefix List Name.
required: false
type: str
pn_network:
description:
- network associated with the prefix list.
required: false
type: str
'''
EXAMPLES = """
- name: prefix list network add
pn_prefix_list_network:
pn_cliswitch: "sw01"
pn_name: "foo"
pn_network: "172.16.3.1"
pn_netmask: "24"
state: "present"
- name: prefix list network remove
pn_prefix_list_network:
pn_cliswitch: "sw01"
state: "absent"
pn_name: "foo"
pn_network: "172.16.3.1"
pn_netmask: "24"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the prefix-list-network command.
returned: always
type: list
stderr:
description: set of error responses from the prefix-list-network 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using prefix-list-network-show command.
If network exists, return as True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
name = module.params['pn_name']
network = module.params['pn_network']
show = cli
cli += ' prefix-list-show format name no-show-headers'
out = run_commands(module, cli)[1]
if name not in out.split()[-1]:
module.fail_json(
failed=True,
msg='Prefix list with name %s does not exists' % name
)
cli = show
cli += ' prefix-list-network-show name %s format network no-show-headers' % name
rc, out, err = run_commands(module, cli)
if out:
out = out.split()[-1]
return True if network in out.split('/')[0] else False
return False
def main():
""" This section is for arguments parsing """
state_map = dict(
present='prefix-list-network-add',
absent='prefix-list-network-remove'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_netmask=dict(required=False, type='str'),
pn_name=dict(required=False, type='str'),
pn_network=dict(required=False, type='str'),
),
required_if=(
["state", "present", ["pn_name", "pn_network", "pn_netmask"]],
["state", "absent", ["pn_name", "pn_network", "pn_netmask"]],
),
required_together=(
["pn_network", "pn_netmask"],
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
netmask = module.params['pn_netmask']
name = module.params['pn_name']
network = module.params['pn_network']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
NETWORK_EXISTS = check_cli(module, cli)
cli += ' %s ' % command
if command == 'prefix-list-network-remove':
if NETWORK_EXISTS is False:
module.exit_json(
skipped=True,
msg='Prefix list with network %s does not exist' % network
)
if command == 'prefix-list-network-add':
if NETWORK_EXISTS is True:
module.exit_json(
skipped=True,
msg='Prefix list with network %s already exists' % network
)
if name:
cli += ' name ' + name
if network:
cli += ' network ' + network
if netmask:
cli += ' netmask ' + netmask
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,237 @@
#!/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_role
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to create/delete/modify role
description:
- This module can be used to create, delete and modify user roles.
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 role and
C(absent) to delete role and C(update) to modify role.
required: true
type: str
choices: ['present', 'absent', 'update']
pn_scope:
description:
- local or fabric.
required: false
type: str
choices: ['local', 'fabric']
pn_access:
description:
- type of access.
required: false
type: str
choices: ['read-only', 'read-write']
pn_shell:
description:
- allow shell command.
required: false
type: bool
pn_sudo:
description:
- allow sudo from shell.
required: false
type: bool
pn_running_config:
description:
- display running configuration of switch.
required: false
type: bool
pn_name:
description:
- role name.
required: true
type: str
pn_delete_from_users:
description:
- delete from users.
required: false
type: bool
'''
EXAMPLES = """
- name: Role create
pn_role:
pn_cliswitch: 'sw01'
state: 'present'
pn_name: 'foo'
pn_scope: 'local'
pn_access: 'read-only'
- name: Role delete
pn_role:
pn_cliswitch: 'sw01'
state: 'absent'
pn_name: 'foo'
- name: Role modify
pn_role:
pn_cliswitch: 'sw01'
state: 'update'
pn_name: 'foo'
pn_access: 'read-write'
pn_sudo: true
pn_shell: true
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the role command.
returned: always
type: list
stderr:
description: set of error responses from the role 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli, booleanArgs
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the role-show command.
If a role with given name exists, return True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
role_name = module.params['pn_name']
cli += ' role-show format name no-show-headers'
out = run_commands(module, cli)[1]
if out:
out = out.split()
return True if role_name in out else False
def main():
""" This section is for arguments parsing """
state_map = dict(
present='role-create',
absent='role-delete',
update='role-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_scope=dict(required=False, type='str',
choices=['local', 'fabric']),
pn_access=dict(required=False, type='str',
choices=['read-only', 'read-write']),
pn_shell=dict(required=False, type='bool'),
pn_sudo=dict(required=False, type='bool'),
pn_running_config=dict(required=False, type='bool'),
pn_name=dict(required=False, type='str'),
pn_delete_from_users=dict(required=False, type='bool'),
),
required_if=(
["state", "present", ["pn_name", "pn_scope"]],
["state", "absent", ["pn_name"]],
["state", "update", ["pn_name"]],
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
scope = module.params['pn_scope']
access = module.params['pn_access']
shell = module.params['pn_shell']
sudo = module.params['pn_sudo']
running_config = module.params['pn_running_config']
name = module.params['pn_name']
delete_from_users = module.params['pn_delete_from_users']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
ROLE_EXISTS = check_cli(module, cli)
cli += ' %s name %s ' % (command, name)
if shell is (False or '') and sudo is True:
module.fail_json(
failed=True,
msg='sudo access requires shell access'
)
if command == 'role-modify':
if ROLE_EXISTS is False:
module.fail_json(
failed=True,
msg='Role with name %s does not exist' % name
)
if command == 'role-delete':
if ROLE_EXISTS is False:
module.exit_json(
skipped=True,
msg='Role with name %s does not exist' % name
)
if command == 'role-create':
if ROLE_EXISTS is True:
module.exit_json(
skipped=True,
msg='Role with name %s already exists' % name
)
if scope:
cli += ' scope ' + scope
if command != 'role-delete':
if access:
cli += ' access ' + access
cli += booleanArgs(shell, 'shell', 'no-shell')
cli += booleanArgs(sudo, 'sudo', 'no-sudo')
cli += booleanArgs(running_config, 'running-config', 'no-running-config')
if command == 'role-modify':
if delete_from_users:
cli += ' delete-from-users ' + delete_from_users
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,204 @@
#!/usr/bin/python
""" PN CLI show commands """
#
# 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/>.
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['deprecated'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
module: pn_show
author: "Pluribus Networks (@amitsi)"
short_description: Run show commands on nvOS device.
deprecated:
removed_in: '2.12'
why: Doesn't support latest Pluribus Networks netvisor
alternative: Latest modules will be pushed in Ansible future versions.
description:
- Execute show command in the nodes and returns the results
read from the device.
options:
pn_cliusername:
description:
- Provide login username if user is not root.
required: False
pn_clipassword:
description:
- Provide login password if user is not root.
required: False
pn_cliswitch:
description:
- Target switch(es) to run the cli on.
required: False
pn_command:
description:
- The C(pn_command) takes a CLI show command as value.
required: true
pn_parameters:
description:
- Display output using a specific parameter. Use 'all' to display
possible output. List of comma separated parameters.
default: 'all'
pn_options:
description:
- Specify formatting options.
'''
EXAMPLES = """
- name: run the vlan-show command
pn_show:
pn_command: 'vlan-show'
pn_parameters: id,scope,ports
pn_options: 'layout vertical'
- name: run the vlag-show command
pn_show:
pn_command: 'vlag-show'
pn_parameters: 'id,name,cluster,mode'
pn_options: 'no-show-headers'
- name: run the cluster-show command
pn_show:
pn_command: 'cluster-show'
"""
RETURN = """
command:
description: The CLI command run on the target node(s).
returned: always
type: str
stdout:
description: The set of responses from the show command.
returned: always
type: list
stderr:
description: The set of error responses from the show command.
returned: on error
type: list
changed:
description: Indicates whether the CLI caused any change on the target.
returned: always(False)
type: bool
"""
import shlex
# AnsibleModule boilerplate
from ansible.module_utils.basic import AnsibleModule
def pn_cli(module):
"""
This method is to generate the cli portion to launch the Netvisor cli.
It parses the username, password, switch parameters from module.
:param module: The Ansible module to fetch username, password and switch
:return: returns the cli string for further processing
"""
username = module.params['pn_cliusername']
password = module.params['pn_clipassword']
cliswitch = module.params['pn_cliswitch']
if username and password:
cli = '/usr/bin/cli --quiet --user %s:%s ' % (username, password)
else:
cli = '/usr/bin/cli --quiet '
if cliswitch:
if cliswitch == 'local':
cli += ' switch-local '
else:
cli += ' switch ' + cliswitch
return cli
def run_cli(module, cli):
"""
This method executes the cli command on the target node(s) and returns the
output. The module then exits based on the output.
:param cli: the complete cli string to be executed on the target node(s).
:param module: The Ansible module to fetch command
"""
cliswitch = module.params['pn_cliswitch']
command = module.params['pn_command']
cmd = shlex.split(cli)
# 'out' contains the output
# 'err' contains the error messages
result, out, err = module.run_command(cmd)
print_cli = cli.split(cliswitch)[1]
# Response in JSON format
if result != 0:
module.exit_json(
command=print_cli,
msg='%s: ' % command,
stderr=err.strip(),
changed=False
)
if out:
module.exit_json(
command=print_cli,
msg='%s: ' % command,
stdout=out.strip(),
changed=False
)
else:
module.exit_json(
command=cli,
msg='%s: Nothing to display!!!' % command,
changed=False
)
def main():
""" This section is for arguments parsing """
module = AnsibleModule(
argument_spec=dict(
pn_cliusername=dict(required=True, type='str'),
pn_clipassword=dict(required=True, type='str', no_log=True),
pn_cliswitch=dict(required=False, type='str'),
pn_command=dict(required=True, type='str'),
pn_parameters=dict(default='all', type='str'),
pn_options=dict(type='str')
)
)
# Accessing the arguments
command = module.params['pn_command']
parameters = module.params['pn_parameters']
options = module.params['pn_options']
# Building the CLI command string
cli = pn_cli(module)
cli += ' %s format %s ' % (command, parameters)
if options:
cli += options
run_cli(module, cli)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,178 @@
#!/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_snmp_community
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to create/modify/delete snmp-community
description:
- This module can be used to create SNMP communities for SNMPv1 or
delete SNMP communities for SNMPv1 or modify SNMP communities for SNMPv1.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: false
state:
description:
- State the action to perform. Use C(present) to create snmp-community and
C(absent) to delete snmp-community C(update) to update snmp-community.
required: true
type: str
choices: ['present', 'absent', 'update']
pn_community_type:
description:
- community type.
type: str
choices: ['read-only', 'read-write']
pn_community_string:
description:
- community name.
type: str
'''
EXAMPLES = """
- name: Create snmp community
pn_snmp_community:
pn_cliswitch: "sw01"
state: "present"
pn_community_string: "foo"
pn_community_type: "read-write"
- name: Delete snmp community
pn_snmp_community:
pn_cliswitch: "sw01"
state: "absent"
pn_community_string: "foo"
- name: Modify snmp community
pn_snmp_community:
pn_cliswitch: "sw01"
state: "update"
pn_community_string: "foo"
pn_community_type: "read-only"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the snmp-community command.
returned: always
type: list
stderr:
description: set of error responses from the snmp-community 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the snmp-community-show command.
If a user with given name exists, return as True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
comm_str = module.params['pn_community_string']
cli += ' snmp-community-show format community-string no-show-headers'
out = run_commands(module, cli)[1]
if out:
out = out.split()
return True if comm_str in out else False
def main():
""" This section is for arguments parsing """
state_map = dict(
present='snmp-community-create',
absent='snmp-community-delete',
update='snmp-community-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_community_type=dict(required=False, type='str',
choices=['read-only', 'read-write']),
pn_community_string=dict(required=False, type='str'),
),
required_if=(
["state", "present", ["pn_community_type", "pn_community_string"]],
["state", "absent", ["pn_community_string"]],
["state", "update", ["pn_community_type", "pn_community_string"]],
)
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
community_type = module.params['pn_community_type']
comm_str = module.params['pn_community_string']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
COMMUNITY_EXISTS = check_cli(module, cli)
if command == 'snmp-community-modify':
if COMMUNITY_EXISTS is False:
module.fail_json(
failed=True,
msg='snmp community name %s does not exist' % comm_str
)
if command == 'snmp-community-delete':
if COMMUNITY_EXISTS is False:
module.exit_json(
skipped=True,
msg='snmp community name %s does not exist' % comm_str
)
if command == 'snmp-community-create':
if COMMUNITY_EXISTS is True:
module.exit_json(
skipped=True,
msg='snmp community with name %s already exists' % comm_str
)
cli += ' %s community-string %s ' % (command, comm_str)
if command != 'snmp-community-delete' and community_type:
cli += ' community-type ' + community_type
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,214 @@
#!/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_snmp_trap_sink
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to create/delete snmp-trap-sink
description:
- This module can be used to create a SNMP trap sink and delete a SNMP trap sink.
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 snmp-trap-sink and
C(absent) to delete snmp-trap-sink.
required: true
type: str
choices: ['present', 'absent']
pn_dest_host:
description:
- destination host.
type: str
pn_community:
description:
- community type.
type: str
pn_dest_port:
description:
- destination port.
type: str
default: '162'
pn_type:
description:
- trap type.
type: str
choices: ['TRAP_TYPE_V1_TRAP', 'TRAP_TYPE_V2C_TRAP', 'TRAP_TYPE_V2_INFORM']
default: 'TRAP_TYPE_V2C_TRAP'
'''
EXAMPLES = """
- name: snmp trap sink functionality
pn_snmp_trap_sink:
pn_cliswitch: "sw01"
state: "present"
pn_community: "foo"
pn_type: "TRAP_TYPE_V2_INFORM"
pn_dest_host: "192.168.67.8"
- name: snmp trap sink functionality
pn_snmp_trap_sink:
pn_cliswitch: "sw01"
state: "absent"
pn_community: "foo"
pn_type: "TRAP_TYPE_V2_INFORM"
pn_dest_host: "192.168.67.8"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the snmp-trap-sink command.
returned: always
type: list
stderr:
description: set of error responses from the snmp-trap-sink 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the snmp-trap-sink-show command.
If a trap with given name exists, return True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
community = module.params['pn_community']
dest_host = module.params['pn_dest_host']
show = cli
cli += ' snmp-community-show format community-string no-show-headers'
rc, out, err = run_commands(module, cli)
if out:
out = out.split()
if community in out:
cli = show
cli += ' snmp-trap-sink-show community %s format type,dest-host no-show-headers' % community
rc, out, err = run_commands(module, cli)
if out:
out = out.split()
return True if dest_host in out else False
else:
return None
def main():
""" This section is for arguments parsing """
state_map = dict(
present='snmp-trap-sink-create',
absent='snmp-trap-sink-delete'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_dest_host=dict(required=False, type='str'),
pn_community=dict(required=False, type='str'),
pn_dest_port=dict(required=False, type='str', default='162'),
pn_type=dict(required=False, type='str',
choices=['TRAP_TYPE_V1_TRAP',
'TRAP_TYPE_V2C_TRAP',
'TRAP_TYPE_V2_INFORM'],
default='TRAP_TYPE_V2C_TRAP'),
),
required_if=(
["state", "present", ["pn_community", "pn_dest_host"]],
["state", "absent", ["pn_community", "pn_dest_host"]],
)
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
dest_host = module.params['pn_dest_host']
community = module.params['pn_community']
dest_port = module.params['pn_dest_port']
pn_type = module.params['pn_type']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
VALUE_EXISTS = check_cli(module, cli)
cli += ' %s ' % command
if command == 'snmp-trap-sink-create':
if VALUE_EXISTS is True:
module.exit_json(
skipped=True,
msg='snmp trap sink already exists'
)
if VALUE_EXISTS is None:
module.fail_json(
failed=True,
msg='snmp community does not exists to create trap sink'
)
if pn_type:
cli += ' type ' + pn_type
if dest_host:
cli += ' dest-host ' + dest_host
if community:
cli += ' community ' + community
if dest_port:
cli += ' dest-port ' + dest_port
if command == 'snmp-trap-sink-delete':
if VALUE_EXISTS is None:
module.fail_json(
failed=True,
msg='snmp community does not exists to delete trap sink'
)
if VALUE_EXISTS is False:
module.exit_json(
skipped=True,
msg='snmp-trap-sink with community %s does not exist with dest-host %s ' % (community, dest_host)
)
if community:
cli += ' community ' + community
if dest_host:
cli += ' dest-host ' + dest_host
if dest_port:
cli += ' dest-port ' + dest_port
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,229 @@
#!/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_snmp_vacm
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to create/modify/delete snmp-vacm
description:
- This module can be used to create View Access Control Models (VACM),
modify VACM and delete VACM.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
type: str
required: false
state:
description:
- State the action to perform. Use C(present) to create snmp-vacm and
C(absent) to delete snmp-vacm and C(update) to modify snmp-vacm.
type: str
required: true
choices: ['present', 'absent', 'update']
pn_oid_restrict:
description:
- restrict OID.
type: str
pn_priv:
description:
- privileges.
type: bool
pn_auth:
description:
- authentication required.
type: bool
pn_user_type:
description:
- SNMP user type.
type: str
choices: ['rouser', 'rwuser']
pn_user_name:
description:
- SNMP administrator name.
type: str
'''
EXAMPLES = """
- name: create snmp vacm
pn_snmp_vacm:
pn_cliswitch: "sw01"
state: "present"
pn_user_name: "foo"
pn_user_type: "rouser"
- name: update snmp vacm
pn_snmp_vacm:
pn_cliswitch: "sw01"
state: "update"
pn_user_name: "foo"
pn_user_type: "rwuser"
- name: delete snmp vacm
pn_snmp_vacm:
pn_cliswitch: "sw01"
state: "absent"
pn_user_name: "foo"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the snmp-vacm command.
returned: always
type: list
stderr:
description: set of error responses from the snmp-vacm 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli, booleanArgs
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the snmp-vacm-show command.
If a user with given name exists, return True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
user_name = module.params['pn_user_name']
show = cli
cli += ' snmp-user-show format user-name no-show-headers'
rc, out, err = run_commands(module, cli)
if out and user_name in out.split():
pass
else:
return None
cli = show
cli += ' snmp-vacm-show format user-name no-show-headers'
out = run_commands(module, cli)[1]
if out:
out = out.split()
return True if user_name in out else False
def main():
""" This section is for arguments parsing """
state_map = dict(
present='snmp-vacm-create',
absent='snmp-vacm-delete',
update='snmp-vacm-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_oid_restrict=dict(required=False, type='str'),
pn_priv=dict(required=False, type='bool'),
pn_auth=dict(required=False, type='bool'),
pn_user_type=dict(required=False, type='str',
choices=['rouser', 'rwuser']),
pn_user_name=dict(required=False, type='str'),
),
required_if=(
["state", "present", ["pn_user_name"]],
["state", "absent", ["pn_user_name"]],
["state", "update", ["pn_user_name"]]
)
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
oid_restrict = module.params['pn_oid_restrict']
priv = module.params['pn_priv']
auth = module.params['pn_auth']
user_type = module.params['pn_user_type']
user_name = module.params['pn_user_name']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
USER_EXISTS = check_cli(module, cli)
cli += ' %s user-name %s ' % (command, user_name)
if command == 'snmp-vacm-modify':
if USER_EXISTS is None:
module.fail_json(
failed=True,
msg='snmp user with name %s does not exists' % user_name
)
if USER_EXISTS is False:
module.fail_json(
failed=True,
msg='snmp vacm with name %s does not exists' % user_name
)
if command == 'snmp-vacm-delete':
if USER_EXISTS is None:
module.fail_json(
failed=True,
msg='snmp user with name %s does not exists' % user_name
)
if USER_EXISTS is False:
module.exit_json(
skipped=True,
msg='snmp vacm with name %s does not exist' % user_name
)
if command == 'snmp-vacm-create':
if USER_EXISTS is None:
module.fail_json(
failed=True,
msg='snmp user with name %s does not exists' % user_name
)
if USER_EXISTS is True:
module.exit_json(
skipped=True,
msg='snmp vacm with name %s already exists' % user_name
)
if command != 'snmp-vacm-delete':
if oid_restrict:
cli += ' oid-restrict ' + oid_restrict
if user_type:
cli += ' user-type ' + user_type
cli += booleanArgs(auth, 'auth', 'no-auth')
cli += booleanArgs(priv, 'priv', 'no-priv')
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,204 @@
#!/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_stp
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify stp
description:
- This module can be used to modify Spanning Tree Protocol parameters.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
type: str
required: false
state:
description:
- State the action to perform. Use C(update) to stp.
type: str
required: true
choices: ['update']
pn_hello_time:
description:
- STP hello time between 1 and 10 secs.
type: str
default: '2'
pn_enable:
description:
- enable or disable STP
type: bool
pn_root_guard_wait_time:
description:
- root guard wait time between 0 and 300 secs. 0 to disable wait.
type: str
default: '20'
pn_bpdus_bridge_ports:
description:
- BPDU packets to bridge specific port.
type: bool
pn_mst_max_hops:
description:
- maximum hop count for mstp bpdu.
type: str
default: '20'
pn_bridge_id:
description:
- STP bridge id.
type: str
pn_max_age:
description:
- maximum age time between 6 and 40 secs.
type: str
default: '20'
pn_stp_mode:
description:
- STP mode.
type: str
choices: ['rstp', 'mstp']
pn_mst_config_name:
description:
- Name for MST Configuration Instance.
type: str
pn_forwarding_delay:
description:
- STP forwarding delay between 4 and 30 secs.
type: str
default: '15'
pn_bridge_priority:
description:
- STP bridge priority.
type: str
default: '32768'
'''
EXAMPLES = """
- name: Modify stp
pn_stp:
pn_cliswitch: "sw01"
state: "update"
pn_hello_time: "3"
pn_stp_mode: "rstp"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the stp command.
returned: always
type: list
stderr:
description: set of error responses from the stp 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli, booleanArgs
def main():
""" This section is for arguments parsing """
state_map = dict(
update='stp-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_hello_time=dict(required=False, type='str', default='2'),
pn_enable=dict(required=False, type='bool'),
pn_root_guard_wait_time=dict(required=False, type='str', default='20'),
pn_bpdus_bridge_ports=dict(required=False, type='bool'),
pn_mst_max_hops=dict(required=False, type='str', default='20'),
pn_bridge_id=dict(required=False, type='str'),
pn_max_age=dict(required=False, type='str', default='20'),
pn_stp_mode=dict(required=False, type='str',
choices=['rstp', 'mstp']),
pn_mst_config_name=dict(required=False, type='str'),
pn_forwarding_delay=dict(required=False, type='str', default='15'),
pn_bridge_priority=dict(required=False, type='str', default='32768'),
),
required_one_of=[['pn_enable', 'pn_hello_time',
'pn_root_guard_wait_time',
'pn_bpdus_bridge_ports',
'pn_mst_max_hops',
'pn_bridge_id',
'pn_max_age',
'pn_stp_mode',
'pn_mst_config_name',
'pn_forwarding_delay',
'pn_bridge_priority']]
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
hello_time = module.params['pn_hello_time']
enable = module.params['pn_enable']
root_guard_wait_time = module.params['pn_root_guard_wait_time']
bpdus_bridge_ports = module.params['pn_bpdus_bridge_ports']
mst_max_hops = module.params['pn_mst_max_hops']
bridge_id = module.params['pn_bridge_id']
max_age = module.params['pn_max_age']
stp_mode = module.params['pn_stp_mode']
mst_config_name = module.params['pn_mst_config_name']
forwarding_delay = module.params['pn_forwarding_delay']
bridge_priority = module.params['pn_bridge_priority']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
if command == 'stp-modify':
cli += ' %s ' % command
if hello_time:
cli += ' hello-time ' + hello_time
if root_guard_wait_time:
cli += ' root-guard-wait-time ' + root_guard_wait_time
if mst_max_hops:
cli += ' mst-max-hops ' + mst_max_hops
if bridge_id:
cli += ' bridge-id ' + bridge_id
if max_age:
cli += ' max-age ' + max_age
if stp_mode:
cli += ' stp-mode ' + stp_mode
if mst_config_name:
cli += ' mst-config-name ' + mst_config_name
if forwarding_delay:
cli += ' forwarding-delay ' + forwarding_delay
if bridge_priority:
cli += ' bridge-priority ' + bridge_priority
cli += booleanArgs(enable, 'enable', 'disable')
cli += booleanArgs(bpdus_bridge_ports, 'bpdus-bridge-ports', 'bpdus-all-ports')
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,195 @@
#!/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_stp_port
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify stp-port.
description:
- This module can be used modify Spanning Tree Protocol (STP) parameters on ports.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
type: str
required: false
state:
description:
- State the action to perform. Use C(update) to update stp-port.
type: str
required: true
choices: ['update']
pn_priority:
description:
- STP port priority from 0 to 240.
type: str
default: '128'
pn_cost:
description:
- STP port cost from 1 to 200000000.
type: str
default: '2000'
pn_root_guard:
description:
- STP port Root guard.
type: bool
pn_filter:
description:
- STP port filters BPDUs.
type: bool
pn_edge:
description:
- STP port is an edge port.
type: bool
pn_bpdu_guard:
description:
- STP port BPDU guard.
type: bool
pn_port:
description:
- STP port.
type: str
pn_block:
description:
- Specify if a STP port blocks BPDUs.
type: bool
'''
EXAMPLES = """
- name: Modify stp port
pn_stp_port:
pn_cliswitch: "sw01"
state: "update"
pn_port: "1"
pn_filter: True
pn_priority: '144'
- name: Modify stp port
pn_stp_port:
pn_cliswitch: "sw01"
state: "update"
pn_port: "1"
pn_cost: "200"
- name: Modify stp port
pn_stp_port:
pn_cliswitch: "sw01"
state: "update"
pn_port: "1"
pn_edge: True
pn_cost: "200"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the stp-port command.
returned: always
type: list
stderr:
description: set of error responses from the stp-port 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli, booleanArgs
def main():
""" This section is for arguments parsing """
state_map = dict(
update='stp-port-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_priority=dict(required=False, type='str', default='128'),
pn_cost=dict(required=False, type='str', default='2000'),
pn_root_guard=dict(required=False, type='bool'),
pn_filter=dict(required=False, type='bool'),
pn_edge=dict(required=False, type='bool'),
pn_bpdu_guard=dict(required=False, type='bool'),
pn_port=dict(required=False, type='str'),
pn_block=dict(required=False, type='bool'),
),
required_if=(
["state", "update", ["pn_port"]],
),
required_one_of=(
['pn_cost', 'pn_root_guard', 'pn_filter',
'pn_edge', 'pn_bpdu_guard', 'pn_block'],
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
priority = module.params['pn_priority']
cost = module.params['pn_cost']
root_guard = module.params['pn_root_guard']
pn_filter = module.params['pn_filter']
edge = module.params['pn_edge']
bpdu_guard = module.params['pn_bpdu_guard']
port = module.params['pn_port']
block = module.params['pn_block']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
if command == 'stp-port-modify':
cli += ' %s ' % command
if priority and (int(priority) % 16 == 0 and int(priority) < 240):
cli += ' priority ' + priority
else:
module.fail_json(
failed=True,
msg='Priority must be increment of 16 and should be less that 240'
)
if cost and (int(cost) < 200000000):
cli += ' cost ' + cost
else:
module.fail_json(
failed=True,
msg='cost must be between 1 and 200000000'
)
if port:
cli += ' port ' + port
cli += booleanArgs(root_guard, 'root-guard', 'no-root-guard')
cli += booleanArgs(pn_filter, 'filter', 'no-filter')
cli += booleanArgs(edge, 'edge', 'no-edge')
cli += booleanArgs(bpdu_guard, 'bpdu-guard', 'no-bpdu-guard')
cli += booleanArgs(block, 'block', 'no-block')
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,412 @@
#!/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_switch_setup
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify switch-setup
description:
- This module can be used to modify switch setup.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: false
type: str
state:
description:
- State the action to perform. Use C(update) to modify the switch-setup.
required: true
type: str
choices: ['update']
pn_force:
description:
- Force analytics-store change even if it involves removing data.
required: false
type: bool
pn_dns_ip:
description:
- DNS IP address.
required: false
type: str
pn_mgmt_netmask:
description:
- Netmask.
required: false
type: str
pn_gateway_ip6:
description:
- Gateway IPv6 address.
required: false
type: str
pn_in_band_ip6_assign:
description:
- Data IPv6 address assignment.
required: false
type: str
choices: ['none', 'autoconf']
pn_domain_name:
description:
- Domain name.
required: false
type: str
pn_timezone:
description:
- Timezone to be configured.
required: false
type: str
pn_in_band_netmask:
description:
- Data in-band netmask.
required: false
type: str
pn_in_band_ip6:
description:
- Data in-band IPv6 address.
required: false
type: str
pn_in_band_netmask_ip6:
description:
- Data in-band IPv6 netmask.
required: false
type: str
pn_motd:
description:
- Message of the Day.
required: false
type: str
pn_loopback_ip6:
description:
- loopback IPv6 address.
required: false
type: str
pn_mgmt_ip6_assignment:
description:
- IPv6 address assignment.
required: false
choices: ['none', 'autoconf']
pn_ntp_secondary_server:
description:
- Secondary NTP server.
required: false
type: str
pn_in_band_ip:
description:
- data in-band IP address.
required: false
type: str
pn_eula_accepted:
description:
- Accept EULA.
required: false
type: str
choices: ['true', 'false']
pn_mgmt_ip:
description:
- Management IP address.
required: false
type: str
pn_ntp_server:
description:
- NTP server.
required: false
type: str
pn_mgmt_ip_assignment:
description:
- IP address assignment.
required: false
type: str
choices: ['none', 'dhcp']
pn_date:
description:
- Date.
required: false
type: str
pn_password:
description:
- plain text password.
required: false
type: str
pn_banner:
description:
- Banner to display on server-switch.
required: false
type: str
pn_loopback_ip:
description:
- loopback IPv4 address.
required: false
type: str
pn_dns_secondary_ip:
description:
- secondary DNS IP address.
required: false
type: str
pn_switch_name:
description:
- switch name.
required: false
type: str
pn_eula_timestamp:
description:
- EULA timestamp.
required: false
type: str
pn_mgmt_netmask_ip6:
description:
- IPv6 netmask.
required: false
type: str
pn_enable_host_ports:
description:
- Enable host ports by default.
required: false
type: bool
pn_mgmt_ip6:
description:
- IPv6 address.
required: false
type: str
pn_analytics_store:
description:
- type of disk storage for analytics.
required: false
type: str
choices: ['default', 'optimized']
pn_gateway_ip:
description:
- gateway IPv4 address.
required: false
type: str
'''
EXAMPLES = """
- name: Modify switch
pn_switch_setup:
pn_cliswitch: "sw01"
state: "update"
pn_timezone: "America/New_York"
pn_in_band_ip: "20.20.1.1"
pn_in_band_netmask: "24"
- name: Modify switch
pn_switch_setup:
pn_cliswitch: "sw01"
state: "update"
pn_in_band_ip6: "2001:0db8:85a3::8a2e:0370:7334"
pn_in_band_netmask_ip6: "127"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the switch-setup command.
returned: always
type: list
stderr:
description: set of error responses from the switch-setup 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, booleanArgs, run_cli
def main():
""" This section is for arguments parsing """
state_map = dict(
update='switch-setup-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=['update']),
pn_force=dict(required=False, type='bool'),
pn_dns_ip=dict(required=False, type='str'),
pn_mgmt_netmask=dict(required=False, type='str'),
pn_gateway_ip6=dict(required=False, type='str'),
pn_in_band_ip6_assign=dict(required=False, type='str',
choices=['none', 'autoconf']),
pn_domain_name=dict(required=False, type='str'),
pn_timezone=dict(required=False, type='str'),
pn_in_band_netmask=dict(required=False, type='str'),
pn_in_band_ip6=dict(required=False, type='str'),
pn_in_band_netmask_ip6=dict(required=False, type='str'),
pn_motd=dict(required=False, type='str'),
pn_loopback_ip6=dict(required=False, type='str'),
pn_mgmt_ip6_assignment=dict(required=False, type='str',
choices=['none', 'autoconf']),
pn_ntp_secondary_server=dict(required=False, type='str'),
pn_in_band_ip=dict(required=False, type='str'),
pn_eula_accepted=dict(required=False, type='str',
choices=['true', 'false']),
pn_mgmt_ip=dict(required=False, type='str'),
pn_ntp_server=dict(required=False, type='str'),
pn_mgmt_ip_assignment=dict(required=False, type='str',
choices=['none', 'dhcp']),
pn_date=dict(required=False, type='str'),
pn_password=dict(required=False, type='str', no_log=True),
pn_banner=dict(required=False, type='str'),
pn_loopback_ip=dict(required=False, type='str'),
pn_dns_secondary_ip=dict(required=False, type='str'),
pn_switch_name=dict(required=False, type='str'),
pn_eula_timestamp=dict(required=False, type='str'),
pn_mgmt_netmask_ip6=dict(required=False, type='str'),
pn_enable_host_ports=dict(required=False, type='bool'),
pn_mgmt_ip6=dict(required=False, type='str'),
pn_analytics_store=dict(required=False, type='str',
choices=['default', 'optimized']),
pn_gateway_ip=dict(required=False, type='str'),
),
required_one_of=[['pn_force', 'pn_dns_ip', 'pn_mgmt_netmask',
'pn_gateway_ip6', 'pn_in_band_ip6_assign',
'pn_domain_name', 'pn_timezone',
'pn_in_band_netmask', 'pn_in_band_ip6',
'pn_in_band_netmask_ip6', 'pn_motd',
'pn_loopback_ip6', 'pn_mgmt_ip6_assignment',
'pn_ntp_secondary_server', 'pn_in_band_ip',
'pn_eula_accepted', 'pn_mgmt_ip',
'pn_ntp_server', 'pn_mgmt_ip_assignment',
'pn_date', 'pn_password',
'pn_banner', 'pn_loopback_ip',
'pn_dns_secondary_ip', 'pn_switch_name',
'pn_eula_timestamp', 'pn_mgmt_netmask_ip6',
'pn_enable_host_ports', 'pn_mgmt_ip6',
'pn_analytics_store', 'pn_gateway_ip']],
required_together=[['pn_in_band_ip6', 'pn_in_band_netmask_ip6'],
['pn_in_band_ip', 'pn_in_band_netmask'],
['pn_mgmt_ip', 'pn_mgmt_netmask'],
['pn_mgmt_ip6', 'pn_mgmt_netmask_ip6']],
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
force = module.params['pn_force']
dns_ip = module.params['pn_dns_ip']
mgmt_netmask = module.params['pn_mgmt_netmask']
gateway_ip6 = module.params['pn_gateway_ip6']
in_band_ip6_assign = module.params['pn_in_band_ip6_assign']
domain_name = module.params['pn_domain_name']
timezone = module.params['pn_timezone']
in_band_netmask = module.params['pn_in_band_netmask']
in_band_ip6 = module.params['pn_in_band_ip6']
in_band_netmask_ip6 = module.params['pn_in_band_netmask_ip6']
motd = module.params['pn_motd']
loopback_ip6 = module.params['pn_loopback_ip6']
mgmt_ip6_assignment = module.params['pn_mgmt_ip6_assignment']
ntp_secondary_server = module.params['pn_ntp_secondary_server']
in_band_ip = module.params['pn_in_band_ip']
eula_accepted = module.params['pn_eula_accepted']
mgmt_ip = module.params['pn_mgmt_ip']
ntp_server = module.params['pn_ntp_server']
mgmt_ip_assignment = module.params['pn_mgmt_ip_assignment']
date = module.params['pn_date']
password = module.params['pn_password']
banner = module.params['pn_banner']
loopback_ip = module.params['pn_loopback_ip']
dns_secondary_ip = module.params['pn_dns_secondary_ip']
switch_name = module.params['pn_switch_name']
eula_timestamp = module.params['pn_eula_timestamp']
mgmt_netmask_ip6 = module.params['pn_mgmt_netmask_ip6']
enable_host_ports = module.params['pn_enable_host_ports']
mgmt_ip6 = module.params['pn_mgmt_ip6']
analytics_store = module.params['pn_analytics_store']
gateway_ip = module.params['pn_gateway_ip']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
if command == 'switch-setup-modify':
cli += ' %s ' % command
if dns_ip:
cli += ' dns-ip ' + dns_ip
if mgmt_netmask:
cli += ' mgmt-netmask ' + mgmt_netmask
if gateway_ip6:
cli += ' gateway-ip6 ' + gateway_ip6
if in_band_ip6_assign:
cli += ' in-band-ip6-assign ' + in_band_ip6_assign
if domain_name:
cli += ' domain-name ' + domain_name
if timezone:
cli += ' timezone ' + timezone
if in_band_netmask:
cli += ' in-band-netmask ' + in_band_netmask
if in_band_ip6:
cli += ' in-band-ip6 ' + in_band_ip6
if in_band_netmask_ip6:
cli += ' in-band-netmask-ip6 ' + in_band_netmask_ip6
if motd:
cli += ' motd ' + motd
if loopback_ip6:
cli += ' loopback-ip6 ' + loopback_ip6
if mgmt_ip6_assignment:
cli += ' mgmt-ip6-assignment ' + mgmt_ip6_assignment
if ntp_secondary_server:
cli += ' ntp-secondary-server ' + ntp_secondary_server
if in_band_ip:
cli += ' in-band-ip ' + in_band_ip
if eula_accepted:
cli += ' eula-accepted ' + eula_accepted
if mgmt_ip:
cli += ' mgmt-ip ' + mgmt_ip
if ntp_server:
cli += ' ntp-server ' + ntp_server
if mgmt_ip_assignment:
cli += ' mgmt-ip-assignment ' + mgmt_ip_assignment
if date:
cli += ' date ' + date
if password:
cli += ' password ' + password
if banner:
cli += ' banner ' + banner
if loopback_ip:
cli += ' loopback-ip ' + loopback_ip
if dns_secondary_ip:
cli += ' dns-secondary-ip ' + dns_secondary_ip
if switch_name:
cli += ' switch-name ' + switch_name
if eula_timestamp:
cli += ' eula_timestamp ' + eula_timestamp
if mgmt_netmask_ip6:
cli += ' mgmt-netmask-ip6 ' + mgmt_netmask_ip6
if mgmt_ip6:
cli += ' mgmt-ip6 ' + mgmt_ip6
if analytics_store:
cli += ' analytics-store ' + analytics_store
if gateway_ip:
cli += ' gateway-ip ' + gateway_ip
cli += booleanArgs(force, 'force', 'no-force')
cli += booleanArgs(enable_host_ports, 'enable-host-ports', 'disable-host-ports')
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,464 @@
#!/usr/bin/python
""" PN CLI trunk-create/trunk-delete/trunk-modify """
#
# 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/>.
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['deprecated'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
module: pn_trunk
author: "Pluribus Networks (@amitsi)"
short_description: CLI command to create/delete/modify a trunk.
deprecated:
removed_in: '2.12'
why: Doesn't support latest Pluribus Networks netvisor
alternative: Latest modules will be pushed in Ansible future versions.
description:
- Execute trunk-create or trunk-delete command.
- Trunks can be used to aggregate network links at Layer 2 on the local
switch. Use this command to create a new trunk.
options:
pn_cliusername:
description:
- Provide login username if user is not root.
required: False
pn_clipassword:
description:
- Provide login password if user is not root.
required: False
pn_cliswitch:
description:
- Target switch(es) to run the cli on.
required: False
default: 'local'
state:
description:
- State the action to perform. Use 'present' to create trunk,
'absent' to delete trunk and 'update' to modify trunk.
required: True
choices: ['present', 'absent', 'update']
pn_name:
description:
- Specify the name for the trunk configuration.
required: true
pn_ports:
description:
- Specify the port number(s) for the link(s) to aggregate into the trunk.
- Required for trunk-create.
pn_speed:
description:
- Specify the port speed or disable the port.
choices: ['disable', '10m', '100m', '1g', '2.5g', '10g', '40g']
pn_egress_rate_limit:
description:
- Specify an egress port data rate limit for the configuration.
pn_jumbo:
description:
- Specify if the port can receive jumbo frames.
type: bool
pn_lacp_mode:
description:
- Specify the LACP mode for the configuration.
choices: ['off', 'passive', 'active']
pn_lacp_priority:
description:
- Specify the LACP priority. This is a number between 1 and 65535 with a
default value of 32768.
pn_lacp_timeout:
description:
- Specify the LACP time out as slow (30 seconds) or fast (4seconds).
The default value is slow.
choices: ['slow', 'fast']
pn_lacp_fallback:
description:
- Specify the LACP fallback mode as bundles or individual.
choices: ['bundle', 'individual']
pn_lacp_fallback_timeout:
description:
- Specify the LACP fallback timeout in seconds. The range is between 30
and 60 seconds with a default value of 50 seconds.
pn_edge_switch:
description:
- Specify if the switch is an edge switch.
type: bool
pn_pause:
description:
- Specify if pause frames are sent.
type: bool
pn_description:
description:
- Specify a description for the trunk configuration.
pn_loopback:
description:
- Specify loopback if you want to use loopback.
type: bool
pn_mirror_receive:
description:
- Specify if the configuration receives mirrored traffic.
type: bool
pn_unknown_ucast_level:
description:
- Specify an unknown unicast level in percent. The default value is 100%.
pn_unknown_mcast_level:
description:
- Specify an unknown multicast level in percent. The default value is 100%.
pn_broadcast_level:
description:
- Specify a broadcast level in percent. The default value is 100%.
pn_port_macaddr:
description:
- Specify the MAC address of the port.
pn_loopvlans:
description:
- Specify a list of looping vlans.
pn_routing:
description:
- Specify if the port participates in routing on the network.
type: bool
pn_host:
description:
- Host facing port control setting.
type: bool
'''
EXAMPLES = """
- name: create trunk
pn_trunk:
state: 'present'
pn_name: 'spine-to-leaf'
pn_ports: '11,12,13,14'
- name: delete trunk
pn_trunk:
state: 'absent'
pn_name: 'spine-to-leaf'
"""
RETURN = """
command:
description: The CLI command run on the target node(s).
returned: always
type: str
stdout:
description: The set of responses from the trunk command.
returned: always
type: list
stderr:
description: The set of error responses from the trunk command.
returned: on error
type: list
changed:
description: Indicates whether the CLI caused changes on the target.
returned: always
type: bool
"""
import shlex
# Ansible boiler-plate
from ansible.module_utils.basic import AnsibleModule
TRUNK_EXISTS = None
def pn_cli(module):
"""
This method is to generate the cli portion to launch the Netvisor cli.
It parses the username, password, switch parameters from module.
:param module: The Ansible module to fetch username, password and switch
:return: returns the cli string for further processing
"""
username = module.params['pn_cliusername']
password = module.params['pn_clipassword']
cliswitch = module.params['pn_cliswitch']
if username and password:
cli = '/usr/bin/cli --quiet --user %s:%s ' % (username, password)
else:
cli = '/usr/bin/cli --quiet '
if cliswitch == 'local':
cli += ' switch-local '
else:
cli += ' switch ' + cliswitch
return cli
def check_cli(module, cli):
"""
This method checks for idempotency using the trunk-show command.
If a trunk with given name exists, return TRUNK_EXISTS as True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
:return Global Booleans: TRUNK_EXISTS
"""
name = module.params['pn_name']
show = cli + ' trunk-show format switch,name no-show-headers'
show = shlex.split(show)
out = module.run_command(show)[1]
out = out.split()
# Global flags
global TRUNK_EXISTS
if name in out:
TRUNK_EXISTS = True
else:
TRUNK_EXISTS = False
def run_cli(module, cli):
"""
This method executes the cli command on the target node(s) and returns the
output. The module then exits based on the output.
:param cli: the complete cli string to be executed on the target node(s).
:param module: The Ansible module to fetch command
"""
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
command = get_command_from_state(state)
cmd = shlex.split(cli)
# 'out' contains the output
# 'err' contains the error messages
result, out, err = module.run_command(cmd)
print_cli = cli.split(cliswitch)[1]
# Response in JSON format
if result != 0:
module.exit_json(
command=print_cli,
stderr=err.strip(),
msg="%s operation failed" % command,
changed=False
)
if out:
module.exit_json(
command=print_cli,
stdout=out.strip(),
msg="%s operation completed" % command,
changed=True
)
else:
module.exit_json(
command=print_cli,
msg="%s operation completed" % command,
changed=True
)
def get_command_from_state(state):
"""
This method gets appropriate command name for the state specified. It
returns the command name for the specified state.
:param state: The state for which the respective command name is required.
"""
command = None
if state == 'present':
command = 'trunk-create'
if state == 'absent':
command = 'trunk-delete'
if state == 'update':
command = 'trunk-modify'
return command
def main():
""" This portion is for arguments parsing """
module = AnsibleModule(
argument_spec=dict(
pn_cliusername=dict(required=False, type='str'),
pn_clipassword=dict(required=False, type='str', no_log=True),
pn_cliswitch=dict(required=False, type='str', default='local'),
state=dict(required=True, type='str',
choices=['present', 'absent', 'update']),
pn_name=dict(required=True, type='str'),
pn_ports=dict(type='str'),
pn_speed=dict(type='str',
choices=['disable', '10m', '100m', '1g', '2.5g',
'10g', '40g']),
pn_egress_rate_limit=dict(type='str'),
pn_jumbo=dict(type='bool'),
pn_lacp_mode=dict(type='str', choices=[
'off', 'passive', 'active']),
pn_lacp_priority=dict(type='int'),
pn_lacp_timeout=dict(type='str', choices=['slow', 'fast']),
pn_lacp_fallback=dict(type='str', choices=[
'bundle', 'individual']),
pn_lacp_fallback_timeout=dict(type='str'),
pn_edge_switch=dict(type='bool'),
pn_pause=dict(type='bool'),
pn_description=dict(type='str'),
pn_loopback=dict(type='bool'),
pn_mirror_receive=dict(type='bool'),
pn_unknown_ucast_level=dict(type='str'),
pn_unknown_mcast_level=dict(type='str'),
pn_broadcast_level=dict(type='str'),
pn_port_macaddr=dict(type='str'),
pn_loopvlans=dict(type='str'),
pn_routing=dict(type='bool'),
pn_host=dict(type='bool')
),
required_if=(
["state", "present", ["pn_name", "pn_ports"]],
["state", "absent", ["pn_name"]],
["state", "update", ["pn_name"]]
)
)
# Accessing the arguments
state = module.params['state']
name = module.params['pn_name']
ports = module.params['pn_ports']
speed = module.params['pn_speed']
egress_rate_limit = module.params['pn_egress_rate_limit']
jumbo = module.params['pn_jumbo']
lacp_mode = module.params['pn_lacp_mode']
lacp_priority = module.params['pn_lacp_priority']
lacp_timeout = module.params['pn_lacp_timeout']
lacp_fallback = module.params['pn_lacp_fallback']
lacp_fallback_timeout = module.params['pn_lacp_fallback_timeout']
edge_switch = module.params['pn_edge_switch']
pause = module.params['pn_pause']
description = module.params['pn_description']
loopback = module.params['pn_loopback']
mirror_receive = module.params['pn_mirror_receive']
unknown_ucast_level = module.params['pn_unknown_ucast_level']
unknown_mcast_level = module.params['pn_unknown_mcast_level']
broadcast_level = module.params['pn_broadcast_level']
port_macaddr = module.params['pn_port_macaddr']
loopvlans = module.params['pn_loopvlans']
routing = module.params['pn_routing']
host = module.params['pn_host']
command = get_command_from_state(state)
# Building the CLI command string
cli = pn_cli(module)
if command == 'trunk-delete':
check_cli(module, cli)
if TRUNK_EXISTS is False:
module.exit_json(
skipped=True,
msg='Trunk with name %s does not exist' % name
)
cli += ' %s name %s ' % (command, name)
else:
if command == 'trunk-create':
check_cli(module, cli)
if TRUNK_EXISTS is True:
module.exit_json(
skipped=True,
msg='Trunk with name %s already exists' % name
)
cli += ' %s name %s ' % (command, name)
# Appending options
if ports:
cli += ' ports ' + ports
if speed:
cli += ' speed ' + speed
if egress_rate_limit:
cli += ' egress-rate-limit ' + egress_rate_limit
if jumbo is True:
cli += ' jumbo '
if jumbo is False:
cli += ' no-jumbo '
if lacp_mode:
cli += ' lacp-mode ' + lacp_mode
if lacp_priority:
cli += ' lacp-priority ' + lacp_priority
if lacp_timeout:
cli += ' lacp-timeout ' + lacp_timeout
if lacp_fallback:
cli += ' lacp-fallback ' + lacp_fallback
if lacp_fallback_timeout:
cli += ' lacp-fallback-timeout ' + lacp_fallback_timeout
if edge_switch is True:
cli += ' edge-switch '
if edge_switch is False:
cli += ' no-edge-switch '
if pause is True:
cli += ' pause '
if pause is False:
cli += ' no-pause '
if description:
cli += ' description ' + description
if loopback is True:
cli += ' loopback '
if loopback is False:
cli += ' no-loopback '
if mirror_receive is True:
cli += ' mirror-receive-only '
if mirror_receive is False:
cli += ' no-mirror-receive-only '
if unknown_ucast_level:
cli += ' unknown-ucast-level ' + unknown_ucast_level
if unknown_mcast_level:
cli += ' unknown-mcast-level ' + unknown_mcast_level
if broadcast_level:
cli += ' broadcast-level ' + broadcast_level
if port_macaddr:
cli += ' port-mac-address ' + port_macaddr
if loopvlans:
cli += ' loopvlans ' + loopvlans
if routing is True:
cli += ' routing '
if routing is False:
cli += ' no-routing '
if host is True:
cli += ' host-enable '
if host is False:
cli += ' host-disable '
run_cli(module, cli)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,200 @@
#!/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_user
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to create/modify/delete user
description:
- This module can be used to create a user and apply a role,
update a user and delete a user.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
type: str
required: false
state:
description:
- State the action to perform. Use C(present) to create user and
C(absent) to delete user C(update) to update user.
type: str
required: true
choices: ['present', 'absent', 'update']
pn_scope:
description:
- local or fabric.
type: str
choices: ['local', 'fabric']
pn_initial_role:
description:
- initial role for user.
type: str
pn_password:
description:
- plain text password.
type: str
pn_name:
description:
- username.
type: str
'''
EXAMPLES = """
- name: Create user
pn_user:
pn_cliswitch: "sw01"
state: "present"
pn_scope: "fabric"
pn_password: "foo123"
pn_name: "foo"
- name: Delete user
pn_user:
pn_cliswitch: "sw01"
state: "absent"
pn_name: "foo"
- name: Modify user
pn_user:
pn_cliswitch: "sw01"
state: "update"
pn_password: "test1234"
pn_name: "foo"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the user command.
returned: always
type: list
stderr:
description: set of error responses from the user 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the user-show command.
If a user already exists on the given switch, return True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
name = module.params['pn_name']
cli += ' user-show format name no-show-headers'
out = run_commands(module, cli)[1]
out = out.split()
return True if name in out else False
def main():
""" This section is for arguments parsing """
state_map = dict(
present='user-create',
absent='user-delete',
update='user-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_scope=dict(required=False, type='str',
choices=['local', 'fabric']),
pn_initial_role=dict(required=False, type='str'),
pn_password=dict(required=False, type='str', no_log=True),
pn_name=dict(required=False, type='str'),
),
required_if=(
["state", "present", ["pn_name", "pn_scope"]],
["state", "absent", ["pn_name"]],
["state", "update", ["pn_name", "pn_password"]]
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
scope = module.params['pn_scope']
initial_role = module.params['pn_initial_role']
password = module.params['pn_password']
name = module.params['pn_name']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
USER_EXISTS = check_cli(module, cli)
cli += ' %s name %s ' % (command, name)
if command == 'user-modify':
if USER_EXISTS is False:
module.fail_json(
failed=True,
msg='User with name %s does not exist' % name
)
if initial_role or scope:
module.fail_json(
failed=True,
msg='Only password can be modified'
)
if command == 'user-delete':
if USER_EXISTS is False:
module.exit_json(
skipped=True,
msg='user with name %s does not exist' % name
)
if command == 'user-create':
if USER_EXISTS is True:
module.exit_json(
skipped=True,
msg='User with name %s already exists' % name
)
if scope:
cli += ' scope ' + scope
if initial_role:
cli += ' initial-role ' + initial_role
if command != 'user-delete':
if password:
cli += ' password ' + password
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,142 @@
#!/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_vflow_table_profile
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify vflow-table-profile
description:
- This module can be used to modify a vFlow table profile.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: false
type: str
state:
description:
- State the action to perform. Use C(update) to modify
the vflow-table-profile.
required: true
type: str
choices: ['update']
pn_profile:
description:
- type of vFlow profile.
required: false
type: str
choices: ['application', 'ipv6', 'qos']
pn_hw_tbl:
description:
- hardware table used by vFlow.
required: false
type: str
choices: ['switch-main', 'switch-hash', 'npu-main', 'npu-hash']
pn_enable:
description:
- enable or disable vflow profile table.
required: false
type: bool
'''
EXAMPLES = """
- name: Modify vflow table profile
pn_vflow_table_profile:
pn_cliswitch: 'sw01'
state: 'update'
pn_profile: 'ipv6'
pn_hw_tbl: 'switch-main'
pn_enable: true
- name: Modify vflow table profile
pn_vflow_table_profile:
state: 'update'
pn_profile: 'qos'
pn_hw_tbl: 'switch-main'
pn_enable: false
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the vflow-table-profile command.
returned: always
type: list
stderr:
description: set of error responses from the vflow-table-profile 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli, booleanArgs
def main():
""" This section is for arguments parsing """
state_map = dict(
update='vflow-table-profile-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_profile=dict(required=False, type='str',
choices=['application', 'ipv6', 'qos']),
pn_hw_tbl=dict(required=False, type='str',
choices=['switch-main', 'switch-hash',
'npu-main', 'npu-hash']),
pn_enable=dict(required=False, type='bool'),
),
required_if=(
['state', 'update', ['pn_profile', 'pn_hw_tbl']],
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
profile = module.params['pn_profile']
hw_tbl = module.params['pn_hw_tbl']
enable = module.params['pn_enable']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
if command == 'vflow-table-profile-modify':
cli += ' %s ' % command
if profile:
cli += ' profile ' + profile
if hw_tbl:
cli += ' hw-tbl ' + hw_tbl
cli += booleanArgs(enable, 'enable', 'disable')
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,352 @@
#!/usr/bin/python
""" PN CLI vlag-create/vlag-delete/vlag-modify """
#
# 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/>.
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['deprecated'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
module: pn_vlag
author: "Pluribus Networks (@amitsi)"
short_description: CLI command to create/delete/modify vlag.
deprecated:
removed_in: '2.12'
why: Doesn't support latest Pluribus Networks netvisor
alternative: Latest modules will be pushed in Ansible future versions.
description:
- Execute vlag-create/vlag-delete/vlag-modify command.
- A virtual link aggregation group (VLAG) allows links that are physically
connected to two different Pluribus Networks devices to appear as a single
trunk to a third device. The third device can be a switch, server, or any
Ethernet device. A VLAG can provide Layer 2 multipathing, which allows you
to create redundancy by increasing bandwidth, enabling multiple parallel
paths between nodes and loadbalancing traffic where alternative paths exist.
options:
pn_cliusername:
description:
- Provide login username if user is not root.
required: False
pn_clipassword:
description:
- Provide login password if user is not root.
required: False
pn_cliswitch:
description:
- Target switch(es) to run this command on.
default: 'local'
state:
description:
- State the action to perform. Use 'present' to create vlag,
'absent' to delete vlag and 'update' to modify vlag.
required: True
choices: ['present', 'absent', 'update']
pn_name:
description:
- The C(pn_name) takes a valid name for vlag configuration.
required: true
pn_port:
description:
- Specify the local VLAG port.
- Required for vlag-create.
pn_peer_port:
description:
- Specify the peer VLAG port.
- Required for vlag-create.
pn_mode:
description:
- Specify the mode for the VLAG. Active-standby indicates one side is
active and the other side is in standby mode. Active-active indicates
that both sides of the vlag are up by default.
choices: ['active-active', 'active-standby']
pn_peer_switch:
description:
- Specify the fabric-name of the peer switch.
pn_failover_action:
description:
- Specify the failover action as move or ignore.
choices: ['move', 'ignore']
pn_lacp_mode:
description:
- Specify the LACP mode.
choices: ['off', 'passive', 'active']
pn_lacp_timeout:
description:
- Specify the LACP timeout as slow(30 seconds) or fast(4 seconds).
choices: ['slow', 'fast']
pn_lacp_fallback:
description:
- Specify the LACP fallback mode as bundles or individual.
choices: ['bundle', 'individual']
pn_lacp_fallback_timeout:
description:
- Specify the LACP fallback timeout in seconds. The range is between 30
and 60 seconds with a default value of 50 seconds.
'''
EXAMPLES = """
- name: create a VLAG
pn_vlag:
state: 'present'
pn_name: spine-to-leaf
pn_port: 'spine01-to-leaf'
pn_peer_port: 'spine02-to-leaf'
pn_peer_switch: spine02
pn_mode: 'active-active'
- name: delete VLAGs
pn_vlag:
state: 'absent'
pn_name: spine-to-leaf
"""
RETURN = """
command:
description: The CLI command run on the target node(s).
returned: always
type: str
stdout:
description: The set of responses from the vlag command.
returned: always
type: list
stderr:
description: The set of error responses from the vlag command.
returned: on error
type: list
changed:
description: Indicates whether the CLI caused changes on the target.
returned: always
type: bool
"""
import shlex
# AnsibleModule boilerplate
from ansible.module_utils.basic import AnsibleModule
VLAG_EXISTS = None
def pn_cli(module):
"""
This method is to generate the cli portion to launch the Netvisor cli.
It parses the username, password, switch parameters from module.
:param module: The Ansible module to fetch username, password and switch
:return: returns the cli string for further processing
"""
username = module.params['pn_cliusername']
password = module.params['pn_clipassword']
cliswitch = module.params['pn_cliswitch']
if username and password:
cli = '/usr/bin/cli --quiet --user %s:%s ' % (username, password)
else:
cli = '/usr/bin/cli --quiet '
if cliswitch == 'local':
cli += ' switch-local '
else:
cli += ' switch ' + cliswitch
return cli
def check_cli(module, cli):
"""
This method checks for idempotency using the vlag-show command.
If a vlag with given vlag exists, return VLAG_EXISTS as True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
:return Global Booleans: VLAG_EXISTS
"""
name = module.params['pn_name']
show = cli + ' vlag-show format name no-show-headers'
show = shlex.split(show)
out = module.run_command(show)[1]
out = out.split()
# Global flags
global VLAG_EXISTS
if name in out:
VLAG_EXISTS = True
else:
VLAG_EXISTS = False
def run_cli(module, cli):
"""
This method executes the cli command on the target node(s) and returns the
output. The module then exits based on the output.
:param cli: the complete cli string to be executed on the target node(s).
:param module: The Ansible module to fetch command
"""
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
command = get_command_from_state(state)
cmd = shlex.split(cli)
# 'out' contains the output
# 'err' contains the error messages
result, out, err = module.run_command(cmd)
print_cli = cli.split(cliswitch)[1]
# Response in JSON format
if result != 0:
module.exit_json(
command=print_cli,
stderr=err.strip(),
msg="%s operation failed" % command,
changed=False
)
if out:
module.exit_json(
command=print_cli,
stdout=out.strip(),
msg="%s operation completed" % command,
changed=True
)
else:
module.exit_json(
command=print_cli,
msg="%s operation completed" % command,
changed=True
)
def get_command_from_state(state):
"""
This method gets appropriate command name for the state specified. It
returns the command name for the specified state.
:param state: The state for which the respective command name is required.
"""
command = None
if state == 'present':
command = 'vlag-create'
if state == 'absent':
command = 'vlag-delete'
if state == 'update':
command = 'vlag-modify'
return command
def main():
""" This section is for argument parsing """
module = AnsibleModule(
argument_spec=dict(
pn_cliusername=dict(required=False, type='str'),
pn_clipassword=dict(required=False, type='str', no_log=True),
pn_cliswitch=dict(required=False, type='str', default='local'),
state=dict(required=True, type='str',
choices=['present', 'absent', 'update']),
pn_name=dict(required=True, type='str'),
pn_port=dict(type='str'),
pn_peer_port=dict(type='str'),
pn_mode=dict(type='str', choices=[
'active-standby', 'active-active']),
pn_peer_switch=dict(type='str'),
pn_failover_action=dict(type='str', choices=['move', 'ignore']),
pn_lacp_mode=dict(type='str', choices=[
'off', 'passive', 'active']),
pn_lacp_timeout=dict(type='str', choices=['slow', 'fast']),
pn_lacp_fallback=dict(type='str', choices=[
'bundle', 'individual']),
pn_lacp_fallback_timeout=dict(type='str')
),
required_if=(
["state", "present", ["pn_name", "pn_port", "pn_peer_port",
"pn_peer_switch"]],
["state", "absent", ["pn_name"]],
["state", "update", ["pn_name"]]
)
)
# Argument accessing
state = module.params['state']
name = module.params['pn_name']
port = module.params['pn_port']
peer_port = module.params['pn_peer_port']
mode = module.params['pn_mode']
peer_switch = module.params['pn_peer_switch']
failover_action = module.params['pn_failover_action']
lacp_mode = module.params['pn_lacp_mode']
lacp_timeout = module.params['pn_lacp_timeout']
lacp_fallback = module.params['pn_lacp_fallback']
lacp_fallback_timeout = module.params['pn_lacp_fallback_timeout']
command = get_command_from_state(state)
# Building the CLI command string
cli = pn_cli(module)
if command == 'vlag-delete':
check_cli(module, cli)
if VLAG_EXISTS is False:
module.exit_json(
skipped=True,
msg='VLAG with name %s does not exist' % name
)
cli += ' %s name %s ' % (command, name)
else:
if command == 'vlag-create':
check_cli(module, cli)
if VLAG_EXISTS is True:
module.exit_json(
skipped=True,
msg='VLAG with name %s already exists' % name
)
cli += ' %s name %s ' % (command, name)
if port:
cli += ' port %s peer-port %s ' % (port, peer_port)
if mode:
cli += ' mode ' + mode
if peer_switch:
cli += ' peer-switch ' + peer_switch
if failover_action:
cli += ' failover-' + failover_action + '-L2 '
if lacp_mode:
cli += ' lacp-mode ' + lacp_mode
if lacp_timeout:
cli += ' lacp-timeout ' + lacp_timeout
if lacp_fallback:
cli += ' lacp-fallback ' + lacp_fallback
if lacp_fallback_timeout:
cli += ' lacp-fallback-timeout ' + lacp_fallback_timeout
run_cli(module, cli)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,318 @@
#!/usr/bin/python
""" PN CLI vlan-create/vlan-delete """
#
# 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/>.
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['deprecated'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
module: pn_vlan
author: "Pluribus Networks (@amitsi)"
short_description: CLI command to create/delete a VLAN.
deprecated:
removed_in: '2.12'
why: Doesn't support latest Pluribus Networks netvisor
alternative: Latest modules will be pushed in Ansible future versions.
description:
- Execute vlan-create or vlan-delete command.
- VLANs are used to isolate network traffic at Layer 2.The VLAN identifiers
0 and 4095 are reserved and cannot be used per the IEEE 802.1Q standard.
The range of configurable VLAN identifiers is 2 through 4092.
options:
pn_cliusername:
description:
- Provide login username if user is not root.
required: False
pn_clipassword:
description:
- Provide login password if user is not root.
required: False
pn_cliswitch:
description:
- Target switch(es) to run the cli on.
required: False
default: 'local'
state:
description:
- State the action to perform. Use 'present' to create vlan and
'absent' to delete vlan.
required: True
choices: ['present', 'absent']
pn_vlanid:
description:
- Specify a VLAN identifier for the VLAN. This is a value between
2 and 4092.
required: True
pn_scope:
description:
- Specify a scope for the VLAN.
- Required for vlan-create.
choices: ['fabric', 'local']
pn_description:
description:
- Specify a description for the VLAN.
pn_stats:
description:
- Specify if you want to collect statistics for a VLAN. Statistic
collection is enabled by default.
type: bool
pn_ports:
description:
- Specifies the switch network data port number, list of ports, or range
of ports. Port numbers must ne in the range of 1 to 64.
pn_untagged_ports:
description:
- Specifies the ports that should have untagged packets mapped to the
VLAN. Untagged packets are packets that do not contain IEEE 802.1Q VLAN
tags.
'''
EXAMPLES = """
- name: create a VLAN
pn_vlan:
state: 'present'
pn_vlanid: 1854
pn_scope: fabric
- name: delete VLANs
pn_vlan:
state: 'absent'
pn_vlanid: 1854
"""
RETURN = """
command:
description: The CLI command run on the target node(s).
returned: always
type: str
stdout:
description: The set of responses from the vlan command.
returned: always
type: list
stderr:
description: The set of error responses from the vlan command.
returned: on error
type: list
changed:
description: Indicates whether the CLI caused changes on the target.
returned: always
type: bool
"""
import shlex
# AnsibleModule boilerplate
from ansible.module_utils.basic import AnsibleModule
VLAN_EXISTS = None
MAX_VLAN_ID = 4092
MIN_VLAN_ID = 2
def pn_cli(module):
"""
This method is to generate the cli portion to launch the Netvisor cli.
It parses the username, password, switch parameters from module.
:param module: The Ansible module to fetch username, password and switch
:return: returns the cli string for further processing
"""
username = module.params['pn_cliusername']
password = module.params['pn_clipassword']
cliswitch = module.params['pn_cliswitch']
if username and password:
cli = '/usr/bin/cli --quiet --user %s:%s ' % (username, password)
else:
cli = '/usr/bin/cli --quiet '
if cliswitch == 'local':
cli += ' switch-local '
else:
cli += ' switch ' + cliswitch
return cli
def check_cli(module, cli):
"""
This method checks for idempotency using the vlan-show command.
If a vlan with given vlan id exists, return VLAN_EXISTS as True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
:return Global Booleans: VLAN_EXISTS
"""
vlanid = module.params['pn_vlanid']
show = cli + \
' vlan-show id %s format id,scope no-show-headers' % str(vlanid)
show = shlex.split(show)
out = module.run_command(show)[1]
out = out.split()
# Global flags
global VLAN_EXISTS
if str(vlanid) in out:
VLAN_EXISTS = True
else:
VLAN_EXISTS = False
def run_cli(module, cli):
"""
This method executes the cli command on the target node(s) and returns the
output. The module then exits based on the output.
:param cli: the complete cli string to be executed on the target node(s).
:param module: The Ansible module to fetch command
"""
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
command = get_command_from_state(state)
cmd = shlex.split(cli)
# 'out' contains the output
# 'err' contains the error messages
result, out, err = module.run_command(cmd)
print_cli = cli.split(cliswitch)[1]
# Response in JSON format
if result != 0:
module.exit_json(
command=print_cli,
stderr=err.strip(),
msg="%s operation failed" % command,
changed=False
)
if out:
module.exit_json(
command=print_cli,
stdout=out.strip(),
msg="%s operation completed" % command,
changed=True
)
else:
module.exit_json(
command=print_cli,
msg="%s operation completed" % command,
changed=True
)
def get_command_from_state(state):
"""
This method gets appropriate command name for the state specified. It
returns the command name for the specified state.
:param state: The state for which the respective command name is required.
"""
command = None
if state == 'present':
command = 'vlan-create'
if state == 'absent':
command = 'vlan-delete'
return command
def main():
""" This section is for arguments parsing """
module = AnsibleModule(
argument_spec=dict(
pn_cliusername=dict(required=False, type='str'),
pn_clipassword=dict(required=False, type='str', no_log=True),
pn_cliswitch=dict(required=False, type='str', default='local'),
state=dict(required=True, type='str',
choices=['present', 'absent']),
pn_vlanid=dict(required=True, type='int'),
pn_scope=dict(type='str', choices=['fabric', 'local']),
pn_description=dict(type='str'),
pn_stats=dict(type='bool'),
pn_ports=dict(type='str'),
pn_untagged_ports=dict(type='str')
),
required_if=(
["state", "present", ["pn_vlanid", "pn_scope"]],
["state", "absent", ["pn_vlanid"]]
)
)
# Accessing the arguments
state = module.params['state']
vlanid = module.params['pn_vlanid']
scope = module.params['pn_scope']
description = module.params['pn_description']
stats = module.params['pn_stats']
ports = module.params['pn_ports']
untagged_ports = module.params['pn_untagged_ports']
command = get_command_from_state(state)
# Building the CLI command string
cli = pn_cli(module)
if not MIN_VLAN_ID <= vlanid <= MAX_VLAN_ID:
module.exit_json(
msg="VLAN id must be between 2 and 4092",
changed=False
)
if command == 'vlan-create':
check_cli(module, cli)
if VLAN_EXISTS is True:
module.exit_json(
skipped=True,
msg='VLAN with id %s already exists' % str(vlanid)
)
cli += ' %s id %s scope %s ' % (command, str(vlanid), scope)
if description:
cli += ' description ' + description
if stats is True:
cli += ' stats '
if stats is False:
cli += ' no-stats '
if ports:
cli += ' ports ' + ports
if untagged_ports:
cli += ' untagged-ports ' + untagged_ports
if command == 'vlan-delete':
check_cli(module, cli)
if VLAN_EXISTS is False:
module.exit_json(
skipped=True,
msg='VLAN with id %s does not exist' % str(vlanid)
)
cli += ' %s id %s ' % (command, str(vlanid))
run_cli(module, cli)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,425 @@
#!/usr/bin/python
""" PN CLI vrouter-create/vrouter-delete/vrouter-modify """
#
# 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/>.
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['deprecated'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
module: pn_vrouter
author: "Pluribus Networks (@amitsi)"
short_description: CLI command to create/delete/modify a vrouter.
deprecated:
removed_in: '2.12'
why: Doesn't support latest Pluribus Networks netvisor
alternative: Latest modules will be pushed in Ansible future versions.
description:
- Execute vrouter-create, vrouter-delete, vrouter-modify command.
- Each fabric, cluster, standalone switch, or virtual network (VNET) can
provide its tenants with a virtual router (vRouter) service that forwards
traffic between networks and implements Layer 3 protocols.
- C(vrouter-create) creates a new vRouter service.
- C(vrouter-delete) deletes a vRouter service.
- C(vrouter-modify) modifies a vRouter service.
options:
pn_cliusername:
description:
- Provide login username if user is not root.
required: False
pn_clipassword:
description:
- Provide login password if user is not root.
required: False
pn_cliswitch:
description:
- Target switch(es) to run the CLI on.
required: False
default: 'local'
state:
description:
- State the action to perform. Use 'present' to create vrouter,
'absent' to delete vrouter and 'update' to modify vrouter.
required: True
choices: ['present', 'absent', 'update']
pn_name:
description:
- Specify the name of the vRouter.
required: true
pn_vnet:
description:
- Specify the name of the VNET.
- Required for vrouter-create.
pn_service_type:
description:
- Specify if the vRouter is a dedicated or shared VNET service.
choices: ['dedicated', 'shared']
pn_service_state:
description:
- Specify to enable or disable vRouter service.
choices: ['enable', 'disable']
pn_router_type:
description:
- Specify if the vRouter uses software or hardware.
- Note that if you specify hardware as router type, you cannot assign IP
addresses using DHCP. You must specify a static IP address.
choices: ['hardware', 'software']
pn_hw_vrrp_id:
description:
- Specifies the VRRP ID for a hardware vrouter.
pn_router_id:
description:
- Specify the vRouter IP address.
pn_bgp_as:
description:
- Specify the Autonomous System Number(ASN) if the vRouter runs Border
Gateway Protocol(BGP).
pn_bgp_redistribute:
description:
- Specify how BGP routes are redistributed.
choices: ['static', 'connected', 'rip', 'ospf']
pn_bgp_max_paths:
description:
- Specify the maximum number of paths for BGP. This is a number between
1 and 255 or 0 to unset.
pn_bgp_options:
description:
- Specify other BGP options as a whitespaces separated string within
single quotes ''.
pn_rip_redistribute:
description:
- Specify how RIP routes are redistributed.
choices: ['static', 'connected', 'ospf', 'bgp']
pn_ospf_redistribute:
description:
- Specify how OSPF routes are redistributed.
choices: ['static', 'connected', 'bgp', 'rip']
pn_ospf_options:
description:
- Specify other OSPF options as a whitespaces separated string within
single quotes ''.
pn_vrrp_track_port:
description:
- Specify list of ports and port ranges.
'''
EXAMPLES = """
- name: create vrouter
pn_vrouter:
state: 'present'
pn_name: 'ansible-vrouter'
pn_vnet: 'ansible-fab-global'
pn_router_id: 208.74.182.1
- name: delete vrouter
pn_vrouter:
state: 'absent'
pn_name: 'ansible-vrouter'
"""
RETURN = """
command:
description: The CLI command run on the target node(s).
returned: always
type: str
stdout:
description: The set of responses from the vrouter command.
returned: always
type: list
stderr:
description: The set of error responses from the vrouter command.
returned: on error
type: list
changed:
description: Indicates whether the CLI caused changes on the target.
returned: always
type: bool
"""
import shlex
# AnsibleModule boilerplate
from ansible.module_utils.basic import AnsibleModule
VROUTER_EXISTS = None
VROUTER_NAME_EXISTS = None
def pn_cli(module):
"""
This method is to generate the cli portion to launch the Netvisor cli.
It parses the username, password, switch parameters from module.
:param module: The Ansible module to fetch username, password and switch
:return: returns the cli string for further processing
"""
username = module.params['pn_cliusername']
password = module.params['pn_clipassword']
cliswitch = module.params['pn_cliswitch']
if username and password:
cli = '/usr/bin/cli --quiet --user %s:%s ' % (username, password)
else:
cli = '/usr/bin/cli --quiet '
if cliswitch == 'local':
cli += ' switch-local '
else:
cli += ' switch ' + cliswitch
return cli
def check_cli(module, cli):
"""
This method checks for idempotency using the vlan-show command.
A switch can have only one vRouter configuration.
If a vRouter already exists on the given switch, return VROUTER_EXISTS as
True else False.
If a vRouter with the given name exists(on a different switch), return
VROUTER_NAME_EXISTS as True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
:return Global Booleans: VROUTER_EXISTS, VROUTER_NAME_EXISTS
"""
name = module.params['pn_name']
# Global flags
global VROUTER_EXISTS, VROUTER_NAME_EXISTS
# Get the name of the local switch
location = cli + ' switch-setup-show format switch-name'
location = shlex.split(location)
out = module.run_command(location)[1]
location = out.split()[1]
# Check for any vRouters on the switch
check_vrouter = cli + ' vrouter-show location %s ' % location
check_vrouter += 'format name no-show-headers'
check_vrouter = shlex.split(check_vrouter)
out = module.run_command(check_vrouter)[1]
if out:
VROUTER_EXISTS = True
else:
VROUTER_EXISTS = False
# Check for any vRouters with the given name
show = cli + ' vrouter-show format name no-show-headers '
show = shlex.split(show)
out = module.run_command(show)[1]
out = out.split()
if name in out:
VROUTER_NAME_EXISTS = True
else:
VROUTER_NAME_EXISTS = False
def run_cli(module, cli):
"""
This method executes the cli command on the target node(s) and returns the
output. The module then exits based on the output.
:param cli: the complete cli string to be executed on the target node(s).
:param module: The Ansible module to fetch command
"""
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
command = get_command_from_state(state)
cmd = shlex.split(cli)
# 'out' contains the output
# 'err' contains the error messages
result, out, err = module.run_command(cmd)
print_cli = cli.split(cliswitch)[1]
# Response in JSON format
if result != 0:
module.exit_json(
command=print_cli,
stderr=err.strip(),
msg="%s operation failed" % command,
changed=False
)
if out:
module.exit_json(
command=print_cli,
stdout=out.strip(),
msg="%s operation completed" % command,
changed=True
)
else:
module.exit_json(
command=print_cli,
msg="%s operation completed" % command,
changed=True
)
def get_command_from_state(state):
"""
This method gets appropriate command name for the state specified. It
returns the command name for the specified state.
:param state: The state for which the respective command name is required.
"""
command = None
if state == 'present':
command = 'vrouter-create'
if state == 'absent':
command = 'vrouter-delete'
if state == 'update':
command = 'vrouter-modify'
return command
def main():
""" This section is for arguments parsing """
module = AnsibleModule(
argument_spec=dict(
pn_cliusername=dict(required=False, type='str'),
pn_clipassword=dict(required=False, type='str', no_log=True),
pn_cliswitch=dict(required=False, type='str', default='local'),
state=dict(required=True, type='str',
choices=['present', 'absent', 'update']),
pn_name=dict(required=True, type='str'),
pn_vnet=dict(type='str'),
pn_service_type=dict(type='str', choices=['dedicated', 'shared']),
pn_service_state=dict(type='str', choices=['enable', 'disable']),
pn_router_type=dict(type='str', choices=['hardware', 'software']),
pn_hw_vrrp_id=dict(type='int'),
pn_router_id=dict(type='str'),
pn_bgp_as=dict(type='int'),
pn_bgp_redistribute=dict(type='str', choices=['static', 'connected',
'rip', 'ospf']),
pn_bgp_max_paths=dict(type='int'),
pn_bgp_options=dict(type='str'),
pn_rip_redistribute=dict(type='str', choices=['static', 'connected',
'bgp', 'ospf']),
pn_ospf_redistribute=dict(type='str', choices=['static', 'connected',
'bgp', 'rip']),
pn_ospf_options=dict(type='str'),
pn_vrrp_track_port=dict(type='str')
),
required_if=(
["state", "present", ["pn_name", "pn_vnet"]],
["state", "absent", ["pn_name"]],
["state", "update", ["pn_name"]]
)
)
# Accessing the arguments
state = module.params['state']
name = module.params['pn_name']
vnet = module.params['pn_vnet']
service_type = module.params['pn_service_type']
service_state = module.params['pn_service_state']
router_type = module.params['pn_router_type']
hw_vrrp_id = module.params['pn_hw_vrrp_id']
router_id = module.params['pn_router_id']
bgp_as = module.params['pn_bgp_as']
bgp_redistribute = module.params['pn_bgp_redistribute']
bgp_max_paths = module.params['pn_bgp_max_paths']
bgp_options = module.params['pn_bgp_options']
rip_redistribute = module.params['pn_rip_redistribute']
ospf_redistribute = module.params['pn_ospf_redistribute']
ospf_options = module.params['pn_ospf_options']
vrrp_track_port = module.params['pn_vrrp_track_port']
command = get_command_from_state(state)
# Building the CLI command string
cli = pn_cli(module)
if command == 'vrouter-delete':
check_cli(module, cli)
if VROUTER_NAME_EXISTS is False:
module.exit_json(
skipped=True,
msg='vRouter with name %s does not exist' % name
)
cli += ' %s name %s ' % (command, name)
else:
if command == 'vrouter-create':
check_cli(module, cli)
if VROUTER_EXISTS is True:
module.exit_json(
skipped=True,
msg='Maximum number of vRouters has been reached on this '
'switch'
)
if VROUTER_NAME_EXISTS is True:
module.exit_json(
skipped=True,
msg='vRouter with name %s already exists' % name
)
cli += ' %s name %s ' % (command, name)
if vnet:
cli += ' vnet ' + vnet
if service_type:
cli += ' %s-vnet-service ' % service_type
if service_state:
cli += ' ' + service_state
if router_type:
cli += ' router-type ' + router_type
if hw_vrrp_id:
cli += ' hw-vrrp-id ' + str(hw_vrrp_id)
if router_id:
cli += ' router-id ' + router_id
if bgp_as:
cli += ' bgp-as ' + str(bgp_as)
if bgp_redistribute:
cli += ' bgp-redistribute ' + bgp_redistribute
if bgp_max_paths:
cli += ' bgp-max-paths ' + str(bgp_max_paths)
if bgp_options:
cli += ' %s ' % bgp_options
if rip_redistribute:
cli += ' rip-redistribute ' + rip_redistribute
if ospf_redistribute:
cli += ' ospf-redistribute ' + ospf_redistribute
if ospf_options:
cli += ' %s ' % ospf_options
if vrrp_track_port:
cli += ' vrrp-track-port ' + vrrp_track_port
run_cli(module, cli)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,472 @@
#!/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_vrouter_bgp
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to add/modify/remove vrouter-bgp
description:
- This module can be used to add Border Gateway Protocol neighbor to a vRouter
modify Border Gateway Protocol neighbor to a vRouter and remove Border Gateway Protocol
neighbor from a vRouter.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: false
type: str
state:
description:
- vrouter-bgp configuration command.
required: false
type: str
choices: ['present', 'absent', 'update']
default: 'present'
pn_neighbor:
description:
- IP address for BGP neighbor.
required: true
type: str
pn_vrouter_name:
description:
- name of service config.
required: true
type: str
pn_send_community:
description:
- send any community attribute to neighbor.
required: false
type: bool
pn_weight:
description:
- default weight value between 0 and 65535 for the neighbor's routes.
required: false
pn_multi_protocol:
description:
- Multi-protocol features.
required: false
choices: ['ipv4-unicast', 'ipv6-unicast']
pn_prefix_list_in:
description:
- prefixes used for filtering.
required: false
type: str
pn_route_reflector_client:
description:
- set as route reflector client.
required: false
type: bool
pn_default_originate:
description:
- announce default routes to the neighbor or not.
required: false
type: bool
pn_neighbor_holdtime:
description:
- BGP Holdtime (seconds).
required: false
type: str
pn_connect_retry_interval:
description:
- BGP Connect retry interval (seconds).
required: false
type: str
pn_advertisement_interval:
description:
- Minimum interval between sending BGP routing updates.
required: false
type: str
pn_route_map_out:
description:
- route map out for nbr.
required: false
type: str
pn_update_source:
description:
- IP address of BGP packets required for peering over loopback interface.
required: false
type: str
pn_bfd:
description:
- BFD protocol support for fault detection.
required: false
type: bool
default: False
pn_next_hop_self:
description:
- BGP next hop is self or not.
required: false
type: bool
pn_allowas_in:
description:
- Allow/reject routes with local AS in AS_PATH.
required: false
type: bool
pn_neighbor_keepalive_interval:
description:
- BGP Keepalive interval (seconds).
required: false
type: str
pn_max_prefix:
description:
- maximum number of prefixes.
required: false
type: str
pn_bfd_multihop:
description:
- always use BFD multi-hop port for fault detection.
required: false
type: bool
pn_interface:
description:
- Interface to reach the neighbor.
required: false
type: str
pn_password:
description:
- password for MD5 BGP.
required: false
type: str
pn_route_map_in:
description:
- route map in for nbr.
required: false
type: str
pn_soft_reconfig_inbound:
description:
- soft reset to reconfigure inbound traffic.
required: false
type: bool
pn_override_capability:
description:
- override capability.
required: false
type: bool
pn_max_prefix_warn_only:
description:
- warn if the maximum number of prefixes is exceeded.
required: false
type: bool
pn_ebgp_multihop:
description:
- value for external BGP from 1 to 255.
required: false
type: str
pn_remote_as:
description:
- BGP remote AS from 1 to 4294967295.
required: false
type: str
pn_prefix_list_out:
description:
- prefixes used for filtering outgoing packets.
required: false
type: str
pn_no_route_map_out:
description:
- Remove egress route-map from BGP neighbor.
required: false
type: str
pn_no_route_map_in:
description:
- Remove ingress route-map from BGP neighbor.
required: false
type: str
'''
EXAMPLES = """
- name: "Add BGP to vRouter"
pn_vrouter_bgp:
state: 'present'
pn_vrouter_name: 'sw01-vrouter'
pn_neighbor: '105.104.104.1'
pn_remote_as: 65000
pn_bfd: true
- name: "Remove BGP to vRouter"
pn_vrouter_bgp:
state: 'absent'
pn_vrouter_name: 'sw01-vrouter'
pn_neighbor: '105.104.104.1'
- name: "Modify BGP to vRouter"
pn_vrouter_bgp:
state: 'update'
pn_vrouter_name: 'sw01-vrouter'
pn_neighbor: '105.104.104.1'
pn_remote_as: 65000
pn_bfd: false
pn_allowas_in: true
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the vrouter-bgp command.
returned: always
type: list
stderr:
description: set of error responses from the vrouter-bgp 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli, booleanArgs
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def is_valid(module, param_name, param_val, min_val, max_val):
if int(param_val) < min_val or int(param_val) > max_val:
module.fail_json(
failed=True,
msg='Valid %s range is %s to %s' % (param_name, min_val, max_val)
)
def check_cli(module, cli):
"""
This method checks if vRouter exists on the target node.
This method also checks for idempotency using the vrouter-bgp-show command.
If the given vRouter exists, return VROUTER_EXISTS as True else False.
If the given neighbor exists on the given vRouter, return NEIGHBOR_EXISTS as True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
:return Booleans: VROUTER_EXISTS, NEIGHBOR_EXISTS
"""
vrouter_name = module.params['pn_vrouter_name']
neighbor = module.params['pn_neighbor']
# Check for vRouter
check_vrouter = cli + ' vrouter-show format name no-show-headers'
out = run_commands(module, check_vrouter)[1]
if out:
out = out.split()
VROUTER_EXISTS = True if vrouter_name in out else False
if neighbor:
# Check for BGP neighbor
show = cli + ' vrouter-bgp-show vrouter-name %s ' % vrouter_name
show += 'format neighbor no-show-headers'
out = run_commands(module, show)[1]
if out and neighbor in out.split():
NEIGHBOR_EXISTS = True
else:
NEIGHBOR_EXISTS = False
return VROUTER_EXISTS, NEIGHBOR_EXISTS
def main():
""" This section is for arguments parsing """
state_map = dict(
present='vrouter-bgp-add',
absent='vrouter-bgp-remove',
update='vrouter-bgp-modify'
)
argument_spec = dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=False, type='str', choices=state_map.keys(), default='present'),
pn_neighbor=dict(required=True, type='str'),
pn_vrouter_name=dict(required=True, type='str'),
pn_send_community=dict(required=False, type='bool'),
pn_weight=dict(required=False, type='str'),
pn_multi_protocol=dict(required=False, type='str', choices=['ipv4-unicast', 'ipv6-unicast']),
pn_prefix_list_in=dict(required=False, type='str'),
pn_route_reflector_client=dict(required=False, type='bool'),
pn_default_originate=dict(required=False, type='bool'),
pn_neighbor_holdtime=dict(required=False, type='str'),
pn_connect_retry_interval=dict(required=False, type='str'),
pn_advertisement_interval=dict(required=False, type='str'),
pn_route_map_out=dict(required=False, type='str'),
pn_update_source=dict(required=False, type='str'),
pn_bfd=dict(required=False, type='bool', default=False),
pn_next_hop_self=dict(required=False, type='bool'),
pn_allowas_in=dict(required=False, type='bool'),
pn_neighbor_keepalive_interval=dict(required=False, type='str'),
pn_max_prefix=dict(required=False, type='str'),
pn_bfd_multihop=dict(required=False, type='bool'),
pn_interface=dict(required=False, type='str'),
pn_password=dict(required=False, type='str', no_log=True),
pn_route_map_in=dict(required=False, type='str'),
pn_soft_reconfig_inbound=dict(required=False, type='bool'),
pn_override_capability=dict(required=False, type='bool'),
pn_max_prefix_warn_only=dict(required=False, type='bool'),
pn_ebgp_multihop=dict(required=False, type='str'),
pn_remote_as=dict(required=False, type='str'),
pn_prefix_list_out=dict(required=False, type='str'),
pn_no_route_map_out=dict(required=False, type='str'),
pn_no_route_map_in=dict(required=False, type='str'),
)
module = AnsibleModule(
argument_spec=argument_spec,
required_if=(
["state", "present", ["pn_vrouter_name", "pn_neighbor", "pn_remote_as"]],
["state", "absent", ["pn_vrouter_name", "pn_neighbor"]],
["state", "update", ["pn_vrouter_name", "pn_neighbor"]]
),
required_one_of=[['pn_send_community', 'pn_weight', 'pn_multi_protocol',
'pn_prefix_list_in', 'pn_route_reflector_client', 'pn_default_originate',
'pn_neighbor_holdtime', 'pn_connect_retry_interval', 'pn_advertisement_interval',
'pn_route_map_out', 'pn_update_source', 'pn_bfd',
'pn_next_hop_self', 'pn_allowas_in', 'pn_neighbor_keepalive_interval',
'pn_max_prefix', 'pn_bfd_multihop', 'pn_interface',
'pn_password', 'pn_route_map_in', 'pn_soft_reconfig_inbound',
'pn_override_capability', 'pn_max_prefix_warn_only', 'pn_ebgp_multihop',
'pn_remote_as', 'pn_prefix_list_out', 'pn_no_route_map_out',
'pn_no_route_map_in']],
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
neighbor = module.params['pn_neighbor']
vrouter_name = module.params['pn_vrouter_name']
send_community = module.params['pn_send_community']
weight = module.params['pn_weight']
multi_protocol = module.params['pn_multi_protocol']
prefix_list_in = module.params['pn_prefix_list_in']
route_reflector_client = module.params['pn_route_reflector_client']
default_originate = module.params['pn_default_originate']
neighbor_holdtime = module.params['pn_neighbor_holdtime']
connect_retry_interval = module.params['pn_connect_retry_interval']
advertisement_interval = module.params['pn_advertisement_interval']
route_map_out = module.params['pn_route_map_out']
update_source = module.params['pn_update_source']
bfd = module.params['pn_bfd']
next_hop_self = module.params['pn_next_hop_self']
allowas_in = module.params['pn_allowas_in']
neighbor_keepalive_interval = module.params['pn_neighbor_keepalive_interval']
max_prefix = module.params['pn_max_prefix']
bfd_multihop = module.params['pn_bfd_multihop']
interface = module.params['pn_interface']
password = module.params['pn_password']
route_map_in = module.params['pn_route_map_in']
soft_reconfig_inbound = module.params['pn_soft_reconfig_inbound']
override_capability = module.params['pn_override_capability']
max_prefix_warn_only = module.params['pn_max_prefix_warn_only']
ebgp_multihop = module.params['pn_ebgp_multihop']
remote_as = module.params['pn_remote_as']
prefix_list_out = module.params['pn_prefix_list_out']
no_route_map_out = module.params['pn_no_route_map_out']
no_route_map_in = module.params['pn_no_route_map_in']
command = state_map[state]
if weight and weight != 'none':
if int(weight) < 1 or int(weight) > 65535:
module.fail_json(
failed=True,
msg='Valid weight range is 1 to 65535'
)
# Building the CLI command string
cli = pn_cli(module, cliswitch)
VROUTER_EXISTS, NEIGHBOR_EXISTS = check_cli(module, cli)
if state:
if VROUTER_EXISTS is False:
module.exit_json(
skipped=True,
msg='vRouter %s does not exist' % vrouter_name
)
if command == 'vrouter-bgp-remove' or command == 'vrouter-bgp-modify':
if NEIGHBOR_EXISTS is False:
module.exit_json(
skipped=True,
msg='BGP neighbor with IP %s does not exist on %s' % (neighbor, vrouter_name)
)
if command == 'vrouter-bgp-add':
if NEIGHBOR_EXISTS is True:
module.exit_json(
skipped=True,
msg='BGP neighbor with IP %s already exists on %s' % (neighbor, vrouter_name)
)
cli += ' %s vrouter-name %s neighbor %s ' % (command, vrouter_name, neighbor)
if command == 'vrouter-bgp-add' or command == 'vrouter-bgp-modify':
if weight:
cli += ' weight ' + weight
if multi_protocol:
cli += ' multi-protocol ' + multi_protocol
if prefix_list_in:
cli += ' prefix-list-in ' + prefix_list_in
if neighbor_holdtime:
is_valid(module, 'neighbor holdtime', neighbor_holdtime, '0', '65535')
cli += ' neighbor-holdtime ' + neighbor_holdtime
if connect_retry_interval:
is_valid(module, 'connect retry interval', connect_retry_interval, '0', '65535')
cli += ' connect-retry-interval ' + connect_retry_interval
if advertisement_interval:
is_valid(module, 'advertisement interval', advertisement_interval, '0', '65535')
cli += ' advertisement-interval ' + advertisement_interval
if route_map_out:
cli += ' route-map-out ' + route_map_out
if update_source:
cli += ' update-source ' + update_source
if neighbor_keepalive_interval:
is_valid(module, 'neighbor keepalive interval', neighbor_keepalive_interval, '0', '65535')
cli += ' neighbor-keepalive-interval ' + neighbor_keepalive_interval
if max_prefix:
cli += ' max-prefix ' + max_prefix
if interface:
cli += ' interface ' + interface
if password:
cli += ' password ' + password
if route_map_in:
cli += ' route-map-in ' + route_map_in
if ebgp_multihop:
is_valid(module, 'ebgp_multihop', ebgp_multihop, '1', '255')
cli += ' ebgp-multihop ' + ebgp_multihop
if remote_as:
cli += ' remote-as ' + remote_as
if prefix_list_out:
cli += ' prefix-list-out ' + prefix_list_out
cli += booleanArgs(send_community, 'send-community', 'no-send-community')
cli += booleanArgs(route_reflector_client, 'route-reflector-client', 'no-route-reflector-client')
cli += booleanArgs(default_originate, 'default-originate', 'no-default-originate')
cli += booleanArgs(bfd, 'bfd', 'no-bfd')
cli += booleanArgs(next_hop_self, 'next-hop-self', 'no-next-hop-self')
cli += booleanArgs(allowas_in, 'allowas-in', 'no-allowas-in')
cli += booleanArgs(bfd_multihop, 'bfd-multihop', 'no-bfd-multihop')
cli += booleanArgs(soft_reconfig_inbound, 'soft-reconfig-inbound', 'no-soft-reconfig-inbound')
cli += booleanArgs(override_capability, 'override-capability', 'no-override-capability')
cli += booleanArgs(max_prefix_warn_only, 'max-prefix-warn-only', 'no-max-prefix-warn-only')
if command == 'vrouter-bgp-modify':
if no_route_map_out:
cli += ' no-route-map-out ' + no_route_map_out
if no_route_map_in:
cli += ' no-route-map-in ' + no_route_map_in
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,186 @@
#!/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_vrouter_bgp_network
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to add/remove vrouter-bgp-network
description:
- This module can be used to add Border Gateway Protocol network to a vRouter
and remove Border Gateway Protocol network from a vRouter.
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 add bgp network and
C(absent) to remove bgp network.
required: true
type: str
choices: ['present', 'absent']
pn_netmask:
description:
- BGP network mask.
required: false
type: str
pn_network:
description:
- IP address for BGP network.
required: false
type: str
pn_vrouter_name:
description:
- name of service config.
required: false
type: str
'''
EXAMPLES = """
- name: Add network to bgp
pn_vrouter_bgp_network:
pn_cliswitch: "sw01"
state: "present"
pn_vrouter_name: "foo-vrouter"
pn_network: '10.10.10.10'
pn_netmask: '31'
- name: Remove network from bgp
pn_vrouter_bgp_network:
pn_cliswitch: "sw01"
state: "absent"
pn_vrouter_name: "foo-vrouter"
pn_network: '10.10.10.10'
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the vrouter-bgp-network command.
returned: always
type: list
stderr:
description: set of error responses from the vrouter-bgp-network 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for pim ssm config using the vrouter-show command.
If a user already exists on the given switch, return True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
name = module.params['pn_vrouter_name']
network = module.params['pn_network']
show = cli
cli += ' vrouter-show name %s format name no-show-headers' % name
rc, out, err = run_commands(module, cli)
VROUTER_EXISTS = '' if out else None
cli = show
cli += ' vrouter-bgp-network-show vrouter-name %s network %s format network no-show-headers' % (name, network)
out = run_commands(module, cli)[1]
out = out.split()
NETWORK_EXISTS = True if network in out[-1] else False
return NETWORK_EXISTS, VROUTER_EXISTS
def main():
""" This section is for arguments parsing """
state_map = dict(
present='vrouter-bgp-network-add',
absent='vrouter-bgp-network-remove'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_netmask=dict(required=False, type='str'),
pn_network=dict(required=False, type='str'),
pn_vrouter_name=dict(required=False, type='str'),
),
required_if=(
['state', 'present', ['pn_vrouter_name', 'pn_netmask', 'pn_network']],
['state', 'absent', ['pn_vrouter_name', 'pn_network']],
),
)
# Accessing the arguments
state = module.params['state']
cliswitch = module.params['pn_cliswitch']
netmask = module.params['pn_netmask']
network = module.params['pn_network']
vrouter_name = module.params['pn_vrouter_name']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
NETWORK_EXISTS, VROUTER_EXISTS = check_cli(module, cli)
if VROUTER_EXISTS is None:
module.fail_json(
failed=True,
msg='vRouter %s does not exists' % vrouter_name
)
if command == 'vrouter-bgp-network-add':
if NETWORK_EXISTS is True:
module.exit_json(
skipped=True,
msg='Network %s already added to bgp' % network
)
if command == 'vrouter-bgp-network-remove':
if NETWORK_EXISTS is False:
module.exit_json(
skipped=True,
msg='Network %s does not exists' % network
)
cli += ' %s vrouter-name %s ' % (command, vrouter_name)
if netmask:
cli += ' netmask ' + netmask
if network:
cli += ' network ' + network
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,252 @@
#!/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_vrouter_interface_ip
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to add/remove vrouter-interface-ip
description:
- This module can be used to add an IP address on interface from a vRouter
or remove an IP address on interface from a vRouter.
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 addvrouter-interface-ip
and C(absent) to remove vrouter-interface-ip.
required: true
type: str
choices: ['present', 'absent']
pn_bd:
description:
- interface Bridge Domain.
required: false
type: str
pn_netmask:
description:
- netmask.
required: false
type: str
pn_vnet:
description:
- interface VLAN VNET.
required: false
type: str
pn_ip:
description:
- IP address.
required: false
type: str
pn_nic:
description:
- virtual NIC assigned to interface.
required: false
type: str
pn_vrouter_name:
description:
- name of service config.
required: false
type: str
'''
EXAMPLES = """
- name: Add vrouter interface to nic
pn_vrouter_interface_ip:
state: "present"
pn_cliswitch: "sw01"
pn_vrouter_name: "foo-vrouter"
pn_ip: "2620:0:1651:1::30"
pn_netmask: "127"
pn_nic: "eth0.4092"
- name: Remove vrouter interface to nic
pn_vrouter_interface_ip:
state: "absent"
pn_cliswitch: "sw01"
pn_vrouter_name: "foo-vrouter"
pn_ip: "2620:0:1651:1::30"
pn_nic: "eth0.4092"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the vrouter-interface-ip command.
returned: always
type: list
stderr:
description: set of error responses from the vrouter-interface-ip 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks if vRouter exists on the target node.
This method also checks for idempotency using the vrouter-interface-show
command.
If the given vRouter exists, return VROUTER_EXISTS as True else False.
If an interface with the given ip exists on the given vRouter,
return INTERFACE_EXISTS as True else False. This is required for
vrouter-interface-add.
If nic_str exists on the given vRouter, return NIC_EXISTS as True else
False. This is required for vrouter-interface-remove.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
:return Booleans: VROUTER_EXISTS, INTERFACE_EXISTS, NIC_EXISTS
"""
vrouter_name = module.params['pn_vrouter_name']
interface_ip = module.params['pn_ip']
nic_str = module.params['pn_nic']
# Check for vRouter
check_vrouter = cli + ' vrouter-show format name no-show-headers'
out = run_commands(module, check_vrouter)[1]
if out:
out = out.split()
VROUTER_EXISTS = True if vrouter_name in out else False
if interface_ip:
# Check for interface and VRRP and fetch nic for VRRP
show = cli + ' vrouter-interface-show vrouter-name %s ' % vrouter_name
show += 'ip2 %s format ip2,nic no-show-headers' % interface_ip
out = run_commands(module, show)[1]
if out and interface_ip in out.split(' ')[-2]:
INTERFACE_EXISTS = True
else:
INTERFACE_EXISTS = False
if nic_str:
# Check for nic
show = cli + ' vrouter-interface-show vrouter-name %s ' % vrouter_name
show += 'format nic no-show-headers'
out = run_commands(module, show)[1]
if out:
out = out.split()
NIC_EXISTS = True if nic_str in out else False
return VROUTER_EXISTS, INTERFACE_EXISTS, NIC_EXISTS
def main():
""" This section is for arguments parsing """
state_map = dict(
present='vrouter-interface-ip-add',
absent='vrouter-interface-ip-remove'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_bd=dict(required=False, type='str'),
pn_netmask=dict(required=False, type='str'),
pn_vnet=dict(required=False, type='str'),
pn_ip=dict(required=False, type='str'),
pn_nic=dict(required=False, type='str'),
pn_vrouter_name=dict(required=False, type='str'),
),
required_if=(
["state", "present", ["pn_vrouter_name", "pn_nic", "pn_ip", "pn_netmask"]],
["state", "absent", ["pn_vrouter_name", "pn_nic", "pn_ip"]]
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
bd = module.params['pn_bd']
netmask = module.params['pn_netmask']
vnet = module.params['pn_vnet']
ip = module.params['pn_ip']
nic = module.params['pn_nic']
vrouter_name = module.params['pn_vrouter_name']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
VROUTER_EXISTS, INTERFACE_EXISTS, NIC_EXISTS = check_cli(module, cli)
if VROUTER_EXISTS is False:
module.fail_json(
failed=True,
msg='vRouter %s does not exist' % vrouter_name
)
if NIC_EXISTS is False:
module.fail_json(
failed=True,
msg='vRouter with nic %s does not exist' % nic
)
cli += ' %s vrouter-name %s ' % (command, vrouter_name)
if command == 'vrouter-interface-ip-add':
if INTERFACE_EXISTS is True:
module.exit_json(
skipped=True,
msg='vRouter with interface ip %s exist' % ip
)
cli += ' nic %s ip %s ' % (nic, ip)
if bd:
cli += ' bd ' + bd
if netmask:
cli += ' netmask ' + netmask
if vnet:
cli += ' vnet ' + vnet
if command == 'vrouter-interface-ip-remove':
if INTERFACE_EXISTS is False:
module.exit_json(
skipped=True,
msg='vRouter with interface ip %s does not exist' % ip
)
if nic:
cli += ' nic %s ' % nic
if ip:
cli += ' ip %s ' % ip.split('/')[0]
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,226 @@
#!/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_vrouter_loopback_interface
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to add/remove vrouter-loopback-interface
description:
- This module can be used to add loopback interface to a vRouter or
remove loopback interface from a vRouter.
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 add vrouter-loopback-interface
and C(absent) to remove vrouter-loopback-interface.
required: false
type: str
choices: ['present', 'absent']
default: 'present'
pn_ip:
description:
- loopback IP address.
required: true
type: str
pn_index:
description:
- loopback index from 1 to 255.
required: false
type: str
pn_vrouter_name:
description:
- name of service config.
required: true
type: str
'''
EXAMPLES = """
- name: Add vrouter loopback interface
pn_vrouter_loopback_interface:
state: "present"
pn_cliswitch: "sw01"
pn_vrouter_name: "sw01-vrouter"
pn_ip: "192.168.10.1"
- name: Remove vrouter loopback interface
pn_vrouter_loopback_interface:
state: "absent"
pn_cliswitch: "sw01"
pn_vrouter_name: "sw01-vrouter"
pn_ip: "192.168.10.1"
pn_index: "2"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the vrouter-loopback-interface command.
returned: always
type: list
stderr:
description: set of error response from the vrouter-loopback-interface
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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks if vRouter exists on the target node.
This method also checks for idempotency using the vrouter-interface-show
command.
If the given vRouter exists, return VROUTER_EXISTS as True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
:return Booleans: VROUTER_EXISTS, INTERFACE_EXISTS
"""
vrouter_name = module.params['pn_vrouter_name']
interface_ip = module.params['pn_ip']
# Check for vRouter
check_vrouter = 'vrouter-show format name no-show-headers'
out = run_commands(module, check_vrouter)[1]
if out:
out = out.split()
VROUTER_EXISTS = True if vrouter_name in out else False
if interface_ip:
# Check for interface and VRRP and fetch nic for VRRP
show = cli + ' vrouter-loopback-interface-show '
show += 'vrouter-name %s ' % vrouter_name
show += 'format ip no-show-headers'
out = run_commands(module, show)[1]
if out and interface_ip in out.split():
INTERFACE_EXISTS = True
else:
INTERFACE_EXISTS = False
return VROUTER_EXISTS, INTERFACE_EXISTS
def main():
""" This section is for arguments parsing """
state_map = dict(
present='vrouter-loopback-interface-add',
absent='vrouter-loopback-interface-remove'
)
argument_spec = dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=False, type='str',
choices=state_map.keys(), default='present'),
pn_ip=dict(required=True, type='str'),
pn_index=dict(required=False, type='str'),
pn_vrouter_name=dict(required=True, type='str'),
)
module = AnsibleModule(
argument_spec=argument_spec,
required_if=(
["state", "present", ["pn_vrouter_name", "pn_ip"]],
["state", "absent", ["pn_vrouter_name", "pn_ip", "pn_index"]]
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
ip = module.params['pn_ip']
index = module.params['pn_index']
vrouter_name = module.params['pn_vrouter_name']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
VROUTER_EXISTS, INTERFACE_EXISTS = check_cli(module, cli)
cli += ' %s vrouter-name %s ' % (command, vrouter_name)
if index and (int(index) < 1 or int(index) > 255):
module.fail_json(
failed=True,
msg='index should be in range 1 to 255'
)
if index and state == 'present':
show = 'vrouter-loopback-interface-show format index parsable-delim ,'
out = run_commands(module, show)[1]
if out:
out = out.split()
for res in out:
res = res.strip().split(',')
if index in res:
module.fail_json(
failed=True,
msg='index with value %s exist' % index
)
if command == 'vrouter-loopback-interface-add':
if VROUTER_EXISTS is False:
module.fail_json(
failed=True,
msg='vRouter %s does not exist' % vrouter_name
)
if INTERFACE_EXISTS is True:
module.exit_json(
skipped=True,
msg='vRouter with loopback ip %s exist' % ip
)
if ip:
cli += ' ip ' + ip
if index:
cli += ' index ' + index
if command == 'vrouter-loopback-interface-remove':
if VROUTER_EXISTS is False:
module.fail_json(
failed=True,
msg='vRouter %s does not exist' % vrouter_name
)
if INTERFACE_EXISTS is False:
module.exit_json(
skipped=True,
msg='vRouter with loopback ip %s doesnt exist' % ip
)
if index:
cli += ' index ' + index
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,201 @@
#!/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_vrouter_ospf
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to add/remove vrouter-ospf
description:
- This module can be used to add OSPF protocol to vRouter
and remove OSPF protocol from a vRouter
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: false
type: str
state:
description:
- vrouter-ospf configuration command.
required: false
type: str
choices: ['present', 'absent']
default: 'present'
pn_netmask:
description:
- OSPF network IP address netmask.
required: false
type: str
pn_ospf_area:
description:
- stub area number for the configuration.
required: false
type: str
pn_network:
description:
- OSPF network IP address.
required: true
type: str
pn_vrouter_name:
description:
- name of service config.
required: true
type: str
'''
EXAMPLES = """
- name: Add OSPF to vRouter
pn_vrouter_ospf:
state: 'present'
pn_vrouter_name: 'sw01-vrouter'
pn_network: '105.104.104.1'
pn_netmask: '24'
pn_ospf_area: '0'
- name: "Remove OSPF to vRouter"
pn_vrouter_ospf:
state: 'absent'
pn_vrouter_name: 'sw01-vrouter'
pn_network: '105.104.104.1'
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the vrouter-ospf command.
returned: always
type: list
stderr:
description: set of error responses from the vrouter-ospf 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks if vRouter exists on the target node.
This method also checks for idempotency using the show command.
If the given vRouter exists, return VROUTER_EXISTS as True else False.
If an OSPF network with the given ip exists on the given vRouter,
return NETWORK_EXISTS as True else False.
:param module: The Ansible module to fetch input parameters
:return Booleans: VROUTER_EXISTS, NETWORK_EXISTS
"""
vrouter_name = module.params['pn_vrouter_name']
network = module.params['pn_network']
show_cli = pn_cli(module)
# Check for vRouter
check_vrouter = cli + ' vrouter-show format name no-show-headers '
out = run_commands(module, check_vrouter)[1]
if out:
out = out.split()
VROUTER_EXISTS = True if vrouter_name in out else False
# Check for OSPF networks
check_network = cli + ' vrouter-ospf-show vrouter-name %s ' % vrouter_name
check_network += 'format network no-show-headers'
out = run_commands(module, check_network)[1]
if out and network in out:
NETWORK_EXISTS = True
else:
NETWORK_EXISTS = False
return VROUTER_EXISTS, NETWORK_EXISTS
def main():
""" This section is for arguments parsing """
state_map = dict(
present='vrouter-ospf-add',
absent='vrouter-ospf-remove'
)
argument_spec = dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=False, type='str', choices=state_map.keys(), default='present'),
pn_netmask=dict(required=False, type='str'),
pn_ospf_area=dict(required=False, type='str'),
pn_network=dict(required=True, type='str'),
pn_vrouter_name=dict(required=True, type='str'),
)
module = AnsibleModule(
argument_spec=argument_spec,
required_if=(
["state", "present", ['pn_vrouter_name', 'pn_network', 'pn_netmask', 'pn_ospf_area']],
["state", "absent", ['pn_vrouter_name', 'pn_network']],
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
netmask = module.params['pn_netmask']
ospf_area = module.params['pn_ospf_area']
network = module.params['pn_network']
vrouter_name = module.params['pn_vrouter_name']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
VROUTER_EXISTS, NETWORK_EXISTS = check_cli(module, cli)
if state:
if VROUTER_EXISTS is False:
module.exit_json(
skipped=True,
msg='vRouter %s does not exist' % vrouter_name
)
if command == 'vrouter-ospf-remove':
if NETWORK_EXISTS is False:
module.exit_json(
skipped=True,
msg='OSPF with network %s dose not exists' % network
)
cli += ' %s vrouter-name %s network %s' % (command, vrouter_name, network)
if command == 'vrouter-ospf-add':
if NETWORK_EXISTS is True:
module.exit_json(
skipped=True,
msg='OSPF with network %s already exists' % network
)
if netmask:
cli += ' netmask ' + netmask
if ospf_area:
cli += ' ospf-area ' + ospf_area
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,201 @@
#!/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_vrouter_ospf6
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to add/remove vrouter-ospf6
description:
- This module can be used to add interface ip to OSPF6 protocol
or remove interface ip from OSPF6 protocol on vRouter.
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 add vrouter-ospf6 and
C(absent) to remove interface from vrouter-ospf6.
required: true
type: str
choices: ['present', 'absent']
pn_ospf6_area:
description:
- area id for this interface in IPv4 address format.
required: false
type: str
pn_nic:
description:
- OSPF6 control for this interface.
required: false
type: str
pn_vrouter_name:
description:
- name of service config.
required: false
type: str
'''
EXAMPLES = """
- name: Add vrouter interface nic to ospf6
pn_vrouter_ospf6:
pn_cliswitch: "sw01"
state: "present"
pn_vrouter_name: "foo-vrouter"
pn_nic: "eth0.4092"
pn_ospf6_area: "0.0.0.0"
- name: Remove vrouter interface nic to ospf6
pn_vrouter_ospf6:
pn_cliswitch: "sw01"
state: "absent"
pn_vrouter_name: "foo-vrouter"
pn_nic: "eth0.4092"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the vrouter-ospf6 command.
returned: always
type: list
stderr:
description: set of error responses from the vrouter-ospf6 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks if vRouter exists on the target node.
This method also checks for idempotency using the vrouter-interface-show
command.
If the given vRouter exists, return VROUTER_EXISTS as True else False.
If nic_str exists on the given vRouter, return NIC_EXISTS as True else
False. This is required for vrouter-ospf6-remove.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
:return Booleans: VROUTER_EXISTS, NIC_EXISTS
"""
vrouter_name = module.params['pn_vrouter_name']
nic_str = module.params['pn_nic']
# Check for vRouter
check_vrouter = cli + ' vrouter-show format name no-show-headers '
out = run_commands(module, check_vrouter)[1]
if out:
out = out.split()
VROUTER_EXISTS = True if vrouter_name in out else False
if nic_str:
# Check for nic
show = cli + ' vrouter-ospf6-show vrouter-name %s format nic no-show-headers' % vrouter_name
out = run_commands(module, show)[1]
if out:
out.split()
NIC_EXISTS = True if nic_str in out else False
return VROUTER_EXISTS, NIC_EXISTS
def main():
""" This section is for arguments parsing """
state_map = dict(
present='vrouter-ospf6-add',
absent='vrouter-ospf6-remove'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_ospf6_area=dict(required=False, type='str'),
pn_nic=dict(required=False, type='str'),
pn_vrouter_name=dict(required=False, type='str'),
),
required_if=(
["state", "present", ["pn_vrouter_name", "pn_nic",
"pn_ospf6_area"]],
["state", "absent", ["pn_vrouter_name", "pn_nic"]]
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
ospf6_area = module.params['pn_ospf6_area']
nic = module.params['pn_nic']
vrouter_name = module.params['pn_vrouter_name']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
VROUTER_EXISTS, NIC_EXISTS = check_cli(module, cli)
if VROUTER_EXISTS is False:
module.fail_json(
failed=True,
msg='vRouter %s does not exist' % vrouter_name
)
cli += ' %s vrouter-name %s ' % (command, vrouter_name)
if command == 'vrouter-ospf6-add':
if NIC_EXISTS is True:
module.exit_json(
skipped=True,
msg='OSPF6 with nic %s already exist' % nic
)
if nic:
cli += ' nic %s' % nic
if ospf6_area:
cli += ' ospf6-area %s ' % ospf6_area
if command == 'vrouter-ospf6-remove':
if NIC_EXISTS is False:
module.exit_json(
skipped=True,
msg='OSPF6 with nic %s does not exist' % nic
)
if nic:
cli += ' nic %s' % nic
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,199 @@
#!/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_vrouter_packet_relay
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to add/remove vrouter-packet-relay
description:
- This module can be used to add packet relay configuration for DHCP on vrouter
and remove packet relay configuration for DHCP on vrouter.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: false
type: str
state:
description:
- vrouter-packet-relay configuration command.
required: false
choices: ['present', 'absent']
type: str
default: 'present'
pn_forward_ip:
description:
- forwarding IP address.
required: true
type: str
pn_nic:
description:
- NIC.
required: true
type: str
pn_forward_proto:
description:
- protocol type to forward packets.
required: false
type: str
choices: ['dhcp']
default: 'dhcp'
pn_vrouter_name:
description:
- name of service config.
required: true
type: str
'''
EXAMPLES = """
- name: vRouter packet relay add
pn_vrouter_packet_relay:
pn_cliswitch: "sw01"
pn_forward_ip: "192.168.10.1"
pn_nic: "eth0.4092"
pn_vrouter_name: "sw01-vrouter"
- name: vRouter packet relay remove
pn_vrouter_packet_relay:
pn_cliswitch: "sw01"
state: "absent"
pn_forward_ip: "192.168.10.1"
pn_nic: "eth0.4092"
pn_vrouter_name: "sw01-vrouter"
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the vrouter-packet-relay command.
returned: always
type: list
stderr:
description: set of error responses from the vrouter-packet-relay 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks if vRouter exists on the target node.
This method also checks for idempotency using the vrouter-interface-show
command.
If the given vRouter exists, return VROUTER_EXISTS as True else False.
If nic_str exists on the given vRouter, return NIC_EXISTS as True else
False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
:return Booleans: VROUTER_EXISTS, NIC_EXISTS
"""
vrouter_name = module.params['pn_vrouter_name']
nic_str = module.params['pn_nic']
# Check for vRouter
check_vrouter = 'vrouter-show format name no-show-headers'
out = run_commands(module, check_vrouter)[1]
if out:
out = out.split()
VROUTER_EXISTS = True if vrouter_name in out else False
if nic_str:
# Check for nic
show = 'vrouter-interface-show vrouter-name %s format nic no-show-headers' % vrouter_name
out = run_commands(module, show)[1]
if out:
out = out.split()
NIC_EXISTS = True if nic_str in out else False
return VROUTER_EXISTS, NIC_EXISTS
def main():
""" This section is for arguments parsing """
state_map = dict(
present='vrouter-packet-relay-add',
absent='vrouter-packet-relay-remove'
)
argument_spec = dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=False, type='str', choices=state_map.keys(), default='present'),
pn_forward_ip=dict(required=True, type='str'),
pn_nic=dict(required=True, type='str'),
pn_forward_proto=dict(required=False, type='str', choices=['dhcp'], default='dhcp'),
pn_vrouter_name=dict(required=True, type='str'),
)
module = AnsibleModule(
argument_spec=argument_spec,
required_if=(
["state", "present", ["pn_vrouter_name", "pn_forward_ip", "pn_nic", "pn_forward_proto"]],
["state", "absent", ["pn_vrouter_name", "pn_forward_ip", "pn_nic", "pn_forward_proto"]],
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
forward_ip = module.params['pn_forward_ip']
nic = module.params['pn_nic']
forward_proto = module.params['pn_forward_proto']
vrouter_name = module.params['pn_vrouter_name']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
VROUTER_EXISTS, NIC_EXISTS = check_cli(module, cli)
if VROUTER_EXISTS is False:
module.fail_json(
failed=True,
msg='vRouter %s does not exist' % vrouter_name
)
if NIC_EXISTS is False:
module.fail_json(
failed=True,
msg='vRouter with nic %s does not exist' % nic
)
if command == 'vrouter-packet-relay-add' or command == 'vrouter-packet-relay-remove':
cli += ' %s' % command
cli += ' vrouter-name %s nic %s' % (vrouter_name, nic)
cli += ' forward-proto %s forward-ip %s' % (forward_proto, forward_ip)
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,174 @@
#!/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_vrouter_pim_config
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to modify vrouter-pim-config
description:
- This module can be used to modify pim parameters.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: false
type: str
state:
description:
- State the action to perform. Use C(update) to modify the vrouter-pim-config.
required: true
type: str
choices: ['update']
pn_query_interval:
description:
- igmp query interval in seconds.
required: false
type: str
pn_querier_timeout:
description:
- igmp querier timeout in seconds.
required: false
type: str
pn_hello_interval:
description:
- hello interval in seconds.
required: false
type: str
pn_vrouter_name:
description:
- name of service config.
required: false
type: str
'''
EXAMPLES = """
- name: pim config modify
pn_vrouter_pim_config:
pn_cliswitch: '192.168.1.1'
pn_query_interval: '10'
pn_querier_timeout: '30'
state: 'update'
pn_vrouter_name: 'ansible-spine1-vrouter'
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the vrouter-pim-config command.
returned: always
type: list
stderr:
description: set of error responses from the vrouter-pim-config 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for pim ssm config using the vrouter-show command.
If a user already exists on the given switch, return True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
"""
name = module.params['pn_vrouter_name']
show = cli
cli += ' vrouter-show format name no-show-headers '
out = run_commands(module, cli)[1]
if out:
out = out.split()
if name in out:
pass
else:
return False
cli = show
cli += ' vrouter-show name %s format proto-multi no-show-headers' % name
out = run_commands(module, cli)[1]
if out:
out = out.split()
return True if 'none' not in out else False
def main():
""" This section is for arguments parsing """
state_map = dict(
update='vrouter-pim-config-modify'
)
module = AnsibleModule(
argument_spec=dict(
pn_cliswitch=dict(required=False, type='str'),
state=dict(required=True, type='str',
choices=state_map.keys()),
pn_query_interval=dict(required=False, type='str'),
pn_querier_timeout=dict(required=False, type='str'),
pn_hello_interval=dict(required=False, type='str'),
pn_vrouter_name=dict(required=True, type='str'),
),
required_if=(
['state', 'update', ['pn_vrouter_name']],
),
required_one_of=[['pn_query_interval',
'pn_querier_timeout',
'pn_hello_interval']]
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
query_interval = module.params['pn_query_interval']
querier_timeout = module.params['pn_querier_timeout']
hello_interval = module.params['pn_hello_interval']
vrouter_name = module.params['pn_vrouter_name']
command = state_map[state]
# Building the CLI command string
cli = pn_cli(module, cliswitch)
if command == 'vrouter-pim-config-modify':
PIM_SSM_CONFIG = check_cli(module, cli)
if PIM_SSM_CONFIG is False:
module.exit_json(
skipped=True,
msg='vrouter proto-multi is not configured/vrouter is not created'
)
cli += ' %s vrouter-name %s ' % (command, vrouter_name)
if querier_timeout:
cli += ' querier-timeout ' + querier_timeout
if hello_interval:
cli += ' hello-interval ' + hello_interval
if query_interval:
cli += ' query-interval ' + query_interval
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,487 @@
#!/usr/bin/python
""" PN-CLI vrouter-bgp-add/vrouter-bgp-remove/vrouter-bgp-modify """
#
# 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/>.
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['deprecated'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
module: pn_vrouterbgp
author: "Pluribus Networks (@amitsi)"
short_description: CLI command to add/remove/modify vrouter-bgp.
deprecated:
removed_in: '2.12'
why: Doesn't support latest Pluribus Networks netvisor
alternative: Latest modules will be pushed in Ansible future versions.
description:
- Execute vrouter-bgp-add, vrouter-bgp-remove, vrouter-bgp-modify command.
- Each fabric, cluster, standalone switch, or virtual network (VNET) can
provide its tenants with a vRouter service that forwards traffic between
networks and implements Layer 4 protocols.
options:
pn_cliusername:
description:
- Provide login username if user is not root.
required: False
pn_clipassword:
description:
- Provide login password if user is not root.
required: False
pn_cliswitch:
description:
- Target switch(es) to run the cli on.
required: False
default: 'local'
state:
description:
- State the action to perform. Use 'present' to add bgp,
'absent' to remove bgp and 'update' to modify bgp.
required: True
choices: ['present', 'absent', 'update']
pn_vrouter_name:
description:
- Specify a name for the vRouter service.
required: True
pn_neighbor:
description:
- Specify a neighbor IP address to use for BGP.
- Required for vrouter-bgp-add.
pn_remote_as:
description:
- Specify the remote Autonomous System(AS) number. This value is between
1 and 4294967295.
- Required for vrouter-bgp-add.
pn_next_hop_self:
description:
- Specify if the next-hop is the same router or not.
type: bool
pn_password:
description:
- Specify a password, if desired.
pn_ebgp:
description:
- Specify a value for external BGP to accept or attempt BGP connections
to external peers, not directly connected, on the network. This is a
value between 1 and 255.
pn_prefix_listin:
description:
- Specify the prefix list to filter traffic inbound.
pn_prefix_listout:
description:
- Specify the prefix list to filter traffic outbound.
pn_route_reflector:
description:
- Specify if a route reflector client is used.
type: bool
pn_override_capability:
description:
- Specify if you want to override capability.
type: bool
pn_soft_reconfig:
description:
- Specify if you want a soft reconfiguration of inbound traffic.
type: bool
pn_max_prefix:
description:
- Specify the maximum number of prefixes.
pn_max_prefix_warn:
description:
- Specify if you want a warning message when the maximum number of
prefixes is exceeded.
type: bool
pn_bfd:
description:
- Specify if you want BFD protocol support for fault detection.
type: bool
pn_multiprotocol:
description:
- Specify a multi-protocol for BGP.
choices: ['ipv4-unicast', 'ipv6-unicast']
pn_weight:
description:
- Specify a default weight value between 0 and 65535 for the neighbor
routes.
pn_default_originate:
description:
- Specify if you want announce default routes to the neighbor or not.
type: bool
pn_keepalive:
description:
- Specify BGP neighbor keepalive interval in seconds.
pn_holdtime:
description:
- Specify BGP neighbor holdtime in seconds.
pn_route_mapin:
description:
- Specify inbound route map for neighbor.
pn_route_mapout:
description:
- Specify outbound route map for neighbor.
'''
EXAMPLES = """
- name: add vrouter-bgp
pn_vrouterbgp:
state: 'present'
pn_vrouter_name: 'ansible-vrouter'
pn_neighbor: 104.104.104.1
pn_remote_as: 1800
- name: remove vrouter-bgp
pn_vrouterbgp:
state: 'absent'
pn_name: 'ansible-vrouter'
"""
RETURN = """
command:
description: The CLI command run on the target node(s).
returned: always
type: str
stdout:
description: The set of responses from the vrouterbpg command.
returned: always
type: list
stderr:
description: The set of error responses from the vrouterbgp command.
returned: on error
type: list
changed:
description: Indicates whether the CLI caused changes on the target.
returned: always
type: bool
"""
import shlex
# Ansible boiler-plate
from ansible.module_utils.basic import AnsibleModule
VROUTER_EXISTS = None
NEIGHBOR_EXISTS = None
def pn_cli(module):
"""
This method is to generate the cli portion to launch the Netvisor cli.
It parses the username, password, switch parameters from module.
:param module: The Ansible module to fetch username, password and switch
:return: returns the cli string for further processing
"""
username = module.params['pn_cliusername']
password = module.params['pn_clipassword']
cliswitch = module.params['pn_cliswitch']
if username and password:
cli = '/usr/bin/cli --quiet --user %s:%s ' % (username, password)
else:
cli = '/usr/bin/cli --quiet '
if cliswitch == 'local':
cli += ' switch-local '
else:
cli += ' switch ' + cliswitch
return cli
def check_cli(module, cli):
"""
This method checks if vRouter exists on the target node.
This method also checks for idempotency using the vrouter-bgp-show command.
If the given vRouter exists, return VROUTER_EXISTS as True else False.
If a BGP neighbor with the given ip exists on the given vRouter,
return NEIGHBOR_EXISTS as True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
:return Global Booleans: VROUTER_EXISTS, NEIGHBOR_EXISTS
"""
vrouter_name = module.params['pn_vrouter_name']
neighbor = module.params['pn_neighbor']
# Global flags
global VROUTER_EXISTS, NEIGHBOR_EXISTS
# Check for vRouter
check_vrouter = cli + ' vrouter-show format name no-show-headers '
check_vrouter = shlex.split(check_vrouter)
out = module.run_command(check_vrouter)[1]
out = out.split()
if vrouter_name in out:
VROUTER_EXISTS = True
else:
VROUTER_EXISTS = False
# Check for BGP neighbors
show = cli + ' vrouter-bgp-show vrouter-name %s ' % vrouter_name
show += 'format neighbor no-show-headers'
show = shlex.split(show)
out = module.run_command(show)[1]
out = out.split()
if neighbor in out:
NEIGHBOR_EXISTS = True
else:
NEIGHBOR_EXISTS = False
def run_cli(module, cli):
"""
This method executes the cli command on the target node(s) and returns the
output. The module then exits based on the output.
:param cli: the complete cli string to be executed on the target node(s).
:param module: The Ansible module to fetch command
"""
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
command = get_command_from_state(state)
cmd = shlex.split(cli)
# 'out' contains the output
# 'err' contains the error messages
result, out, err = module.run_command(cmd)
print_cli = cli.split(cliswitch)[1]
# Response in JSON format
if result != 0:
module.exit_json(
command=print_cli,
stderr=err.strip(),
msg="%s operation failed" % command,
changed=False
)
if out:
module.exit_json(
command=print_cli,
stdout=out.strip(),
msg="%s operation completed" % command,
changed=True
)
else:
module.exit_json(
command=print_cli,
msg="%s operation completed" % command,
changed=True
)
def get_command_from_state(state):
"""
This method gets appropriate command name for the state specified. It
returns the command name for the specified state.
:param state: The state for which the respective command name is required.
"""
command = None
if state == 'present':
command = 'vrouter-bgp-add'
if state == 'absent':
command = 'vrouter-bgp-remove'
if state == 'update':
command = 'vrouter-bgp-modify'
return command
def main():
""" This portion is for arguments parsing """
module = AnsibleModule(
argument_spec=dict(
pn_cliusername=dict(required=False, type='str'),
pn_clipassword=dict(required=False, type='str', no_log=True),
pn_cliswitch=dict(required=False, type='str', default='local'),
state=dict(required=True, type='str',
choices=['present', 'absent', 'update']),
pn_vrouter_name=dict(required=True, type='str'),
pn_neighbor=dict(type='str'),
pn_remote_as=dict(type='str'),
pn_next_hop_self=dict(type='bool'),
pn_password=dict(type='str', no_log=True),
pn_ebgp=dict(type='int'),
pn_prefix_listin=dict(type='str'),
pn_prefix_listout=dict(type='str'),
pn_route_reflector=dict(type='bool'),
pn_override_capability=dict(type='bool'),
pn_soft_reconfig=dict(type='bool'),
pn_max_prefix=dict(type='int'),
pn_max_prefix_warn=dict(type='bool'),
pn_bfd=dict(type='bool'),
pn_multiprotocol=dict(type='str',
choices=['ipv4-unicast', 'ipv6-unicast']),
pn_weight=dict(type='int'),
pn_default_originate=dict(type='bool'),
pn_keepalive=dict(type='str'),
pn_holdtime=dict(type='str'),
pn_route_mapin=dict(type='str'),
pn_route_mapout=dict(type='str')
),
required_if=(
["state", "present",
["pn_vrouter_name", "pn_neighbor", "pn_remote_as"]],
["state", "absent",
["pn_vrouter_name", "pn_neighbor"]],
["state", "update",
["pn_vrouter_name", "pn_neighbor"]]
)
)
# Accessing the arguments
state = module.params['state']
vrouter_name = module.params['pn_vrouter_name']
neighbor = module.params['pn_neighbor']
remote_as = module.params['pn_remote_as']
next_hop_self = module.params['pn_next_hop_self']
password = module.params['pn_password']
ebgp = module.params['pn_ebgp']
prefix_listin = module.params['pn_prefix_listin']
prefix_listout = module.params['pn_prefix_listout']
route_reflector = module.params['pn_route_reflector']
override_capability = module.params['pn_override_capability']
soft_reconfig = module.params['pn_soft_reconfig']
max_prefix = module.params['pn_max_prefix']
max_prefix_warn = module.params['pn_max_prefix_warn']
bfd = module.params['pn_bfd']
multiprotocol = module.params['pn_multiprotocol']
weight = module.params['pn_weight']
default_originate = module.params['pn_default_originate']
keepalive = module.params['pn_keepalive']
holdtime = module.params['pn_holdtime']
route_mapin = module.params['pn_route_mapin']
route_mapout = module.params['pn_route_mapout']
# Building the CLI command string
cli = pn_cli(module)
command = get_command_from_state(state)
if command == 'vrouter-bgp-remove':
check_cli(module, cli)
if VROUTER_EXISTS is False:
module.exit_json(
skipped=True,
msg='vRouter %s does not exist' % vrouter_name
)
if NEIGHBOR_EXISTS is False:
module.exit_json(
skipped=True,
msg=('BGP neighbor with IP %s does not exist on %s'
% (neighbor, vrouter_name))
)
cli += (' %s vrouter-name %s neighbor %s '
% (command, vrouter_name, neighbor))
else:
if command == 'vrouter-bgp-add':
check_cli(module, cli)
if VROUTER_EXISTS is False:
module.exit_json(
skipped=True,
msg='vRouter %s does not exist' % vrouter_name
)
if NEIGHBOR_EXISTS is True:
module.exit_json(
skipped=True,
msg=('BGP neighbor with IP %s already exists on %s'
% (neighbor, vrouter_name))
)
cli += (' %s vrouter-name %s neighbor %s '
% (command, vrouter_name, neighbor))
if remote_as:
cli += ' remote-as ' + str(remote_as)
if next_hop_self is True:
cli += ' next-hop-self '
if next_hop_self is False:
cli += ' no-next-hop-self '
if password:
cli += ' password ' + password
if ebgp:
cli += ' ebgp-multihop ' + str(ebgp)
if prefix_listin:
cli += ' prefix-list-in ' + prefix_listin
if prefix_listout:
cli += ' prefix-list-out ' + prefix_listout
if route_reflector is True:
cli += ' route-reflector-client '
if route_reflector is False:
cli += ' no-route-reflector-client '
if override_capability is True:
cli += ' override-capability '
if override_capability is False:
cli += ' no-override-capability '
if soft_reconfig is True:
cli += ' soft-reconfig-inbound '
if soft_reconfig is False:
cli += ' no-soft-reconfig-inbound '
if max_prefix:
cli += ' max-prefix ' + str(max_prefix)
if max_prefix_warn is True:
cli += ' max-prefix-warn-only '
if max_prefix_warn is False:
cli += ' no-max-prefix-warn-only '
if bfd is True:
cli += ' bfd '
if bfd is False:
cli += ' no-bfd '
if multiprotocol:
cli += ' multi-protocol ' + multiprotocol
if weight:
cli += ' weight ' + str(weight)
if default_originate is True:
cli += ' default-originate '
if default_originate is False:
cli += ' no-default-originate '
if keepalive:
cli += ' neighbor-keepalive-interval ' + keepalive
if holdtime:
cli += ' neighbor-holdtime ' + holdtime
if route_mapin:
cli += ' route-map-in ' + route_mapin
if route_mapout:
cli += ' route-map-out ' + route_mapout
run_cli(module, cli)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,492 @@
#!/usr/bin/python
""" PN-CLI vrouter-interface-add/remove/modify """
#
# 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/>.
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['deprecated'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
module: pn_vrouterif
author: "Pluribus Networks (@amitsi)"
short_description: CLI command to add/remove/modify vrouter-interface.
deprecated:
removed_in: '2.12'
why: Doesn't support latest Pluribus Networks netvisor
alternative: Latest modules will be pushed in Ansible future versions.
description:
- Execute vrouter-interface-add, vrouter-interface-remove,
vrouter-interface-modify command.
- You configure interfaces to vRouter services on a fabric, cluster,
standalone switch or virtual network(VNET).
options:
pn_cliusername:
description:
- Provide login username if user is not root.
required: False
pn_clipassword:
description:
- Provide login password if user is not root.
required: False
pn_cliswitch:
description:
- Target switch to run the cli on.
required: False
default: 'local'
state:
description:
- State the action to perform. Use 'present' to add vrouter interface,
'absent' to remove vrouter interface and 'update' to modify vrouter
interface.
required: True
choices: ['present', 'absent', 'update']
pn_vrouter_name:
description:
- Specify the name of the vRouter interface.
required: True
pn_vlan:
description:
- Specify the VLAN identifier. This is a value between 1 and 4092.
pn_interface_ip:
description:
- Specify the IP address of the interface in x.x.x.x/n format.
pn_assignment:
description:
- Specify the DHCP method for IP address assignment.
choices: ['none', 'dhcp', 'dhcpv6', 'autov6']
pn_vxlan:
description:
- Specify the VXLAN identifier. This is a value between 1 and 16777215.
pn_interface:
description:
- Specify if the interface is management, data or span interface.
choices: ['mgmt', 'data', 'span']
pn_alias:
description:
- Specify an alias for the interface.
pn_exclusive:
description:
- Specify if the interface is exclusive to the configuration. Exclusive
means that other configurations cannot use the interface. Exclusive is
specified when you configure the interface as span interface and allows
higher throughput through the interface.
type: bool
required: False
pn_nic_enable:
description:
- Specify if the NIC is enabled or not
type: bool
pn_vrrp_id:
description:
- Specify the ID for the VRRP interface. The IDs on both vRouters must be
the same IS number.
pn_vrrp_priority:
description:
- Specify the priority for the VRRP interface. This is a value between
1 (lowest) and 255 (highest).
pn_vrrp_adv_int:
description:
- Specify a VRRP advertisement interval in milliseconds. The range is
from 30 to 40950 with a default value of 1000.
pn_l3port:
description:
- Specify a Layer 3 port for the interface.
pn_secondary_macs:
description:
- Specify a secondary MAC address for the interface.
pn_nic_str:
description:
- Specify the type of NIC. Used for vrouter-interface remove/modify.
'''
EXAMPLES = """
- name: Add vrouter-interface
pn_vrouterif:
pn_cliusername: admin
pn_clipassword: admin
state: 'present'
pn_vrouter_name: 'ansible-vrouter'
pn_interface_ip: 101.101.101.2/24
pn_vlan: 101
- name: Add VRRP..
pn_vrouterif:
pn_cliusername: admin
pn_clipassword: admin
state: 'present'
pn_vrouter_name: 'ansible-vrouter'
pn_interface_ip: 101.101.101.2/24
pn_vrrp_ip: 101.101.101.1/24
pn_vrrp_priority: 100
pn_vlan: 101
- name: Remove vrouter-interface
pn_vrouterif:
pn_cliusername: admin
pn_clipassword: admin
state: 'absent'
pn_vrouter_name: 'ansible-vrouter'
pn_interface_ip: 101.101.101.2/24
"""
RETURN = """
command:
description: The CLI command run on the target node(s).
returned: always
type: str
stdout:
description: The set of responses from the vrouterif command.
returned: on success
type: list
stderr:
description: The set of error responses from the vrouterif command.
returned: on error
type: str
changed:
description: Indicates whether the CLI caused changes on the target.
returned: always
type: bool
"""
import shlex
# Ansible boiler-plate
from ansible.module_utils.basic import AnsibleModule
VROUTER_EXISTS = None
INTERFACE_EXISTS = None
NIC_EXISTS = None
VRRP_EXISTS = None
def pn_cli(module):
"""
This method is to generate the cli portion to launch the Netvisor cli.
It parses the username, password, switch parameters from module.
:param module: The Ansible module to fetch username, password and switch
:return: returns the cli string for further processing
"""
username = module.params['pn_cliusername']
password = module.params['pn_clipassword']
cliswitch = module.params['pn_cliswitch']
if username and password:
cli = '/usr/bin/cli --quiet --user %s:%s ' % (username, password)
else:
cli = '/usr/bin/cli --quiet '
if cliswitch == 'local':
cli += ' switch-local '
else:
cli += ' switch ' + cliswitch
return cli
def check_cli(module, cli):
"""
This method checks if vRouter exists on the target node.
This method also checks for idempotency using the vrouter-interface-show
command.
If the given vRouter exists, return VROUTER_EXISTS as True else False.
If an interface with the given ip exists on the given vRouter,
return INTERFACE_EXISTS as True else False. This is required for
vrouter-interface-add.
If nic_str exists on the given vRouter, return NIC_EXISTS as True else
False. This is required for vrouter-interface-remove.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
:return Global Booleans: VROUTER_EXISTS, INTERFACE_EXISTS, NIC_EXISTS
"""
vrouter_name = module.params['pn_vrouter_name']
interface_ip = module.params['pn_interface_ip']
nic_str = module.params['pn_nic_str']
# Global flags
global VROUTER_EXISTS, INTERFACE_EXISTS, NIC_EXISTS
# Check for vRouter
check_vrouter = cli + ' vrouter-show format name no-show-headers '
check_vrouter = shlex.split(check_vrouter)
out = module.run_command(check_vrouter)[1]
out = out.split()
if vrouter_name in out:
VROUTER_EXISTS = True
else:
VROUTER_EXISTS = False
if interface_ip:
# Check for interface and VRRP and fetch nic for VRRP
show = cli + ' vrouter-interface-show vrouter-name %s ' % vrouter_name
show += 'ip %s format ip,nic no-show-headers' % interface_ip
show = shlex.split(show)
out = module.run_command(show)[1]
if out:
INTERFACE_EXISTS = True
else:
INTERFACE_EXISTS = False
if nic_str:
# Check for nic
show = cli + ' vrouter-interface-show vrouter-name %s ' % vrouter_name
show += ' format nic no-show-headers'
show = shlex.split(show)
out = module.run_command(show)[1]
if nic_str in out:
NIC_EXISTS = True
else:
NIC_EXISTS = False
def get_nic(module, cli):
"""
This module checks if VRRP interface can be added. If No, return VRRP_EXISTS
as True.
If Yes, fetch the nic string from the primary interface and return nic and
VRRP_EXISTS as False.
:param module:
:param cli:
:return: nic, Global Boolean: VRRP_EXISTS
"""
vrouter_name = module.params['pn_vrouter_name']
interface_ip = module.params['pn_interface_ip']
global VRRP_EXISTS
# Check for interface and VRRP and fetch nic for VRRP
show = cli + ' vrouter-interface-show vrouter-name %s ' % vrouter_name
show += 'ip %s format ip,nic no-show-headers' % interface_ip
show = shlex.split(show)
out = module.run_command(show)[1]
out = out.split()
if len(out) > 3:
VRRP_EXISTS = True
return None
else:
nic = out[2]
VRRP_EXISTS = False
return nic
def run_cli(module, cli):
"""
This method executes the cli command on the target node(s) and returns the
output. The module then exits based on the output.
:param cli: the complete cli string to be executed on the target node(s).
:param module: The Ansible module to fetch command
"""
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
command = get_command_from_state(state)
cmd = shlex.split(cli)
# 'out' contains the output
# 'err' contains the error messages
result, out, err = module.run_command(cmd)
print_cli = cli.split(cliswitch)[1]
# Response in JSON format
if result != 0:
module.exit_json(
command=print_cli,
stderr=err.strip(),
msg="%s operation failed" % command,
changed=False
)
if out:
module.exit_json(
command=print_cli,
stdout=out.strip(),
msg="%s operation completed" % command,
changed=True
)
else:
module.exit_json(
command=print_cli,
msg="%s operation completed" % command,
changed=True
)
def get_command_from_state(state):
"""
This method gets appropriate command name for the state specified. It
returns the command name for the specified state.
:param state: The state for which the respective command name is required.
"""
command = None
if state == 'present':
command = 'vrouter-interface-add'
if state == 'absent':
command = 'vrouter-interface-remove'
if state == 'update':
command = 'vrouter-interface-modify'
return command
def main():
""" This portion is for arguments parsing """
module = AnsibleModule(
argument_spec=dict(
pn_cliusername=dict(required=False, type='str'),
pn_clipassword=dict(required=False, type='str', no_log=True),
pn_cliswitch=dict(required=False, type='str', default='local'),
state=dict(required=True, type='str',
choices=['present', 'absent', 'update']),
pn_vrouter_name=dict(required=True, type='str'),
pn_vlan=dict(type='int'),
pn_interface_ip=dict(required=True, type='str'),
pn_assignment=dict(type='str',
choices=['none', 'dhcp', 'dhcpv6', 'autov6']),
pn_vxlan=dict(type='int'),
pn_interface=dict(type='str', choices=['mgmt', 'data', 'span']),
pn_alias=dict(type='str'),
pn_exclusive=dict(type='bool'),
pn_nic_enable=dict(type='bool'),
pn_vrrp_id=dict(type='int'),
pn_vrrp_priority=dict(type='int'),
pn_vrrp_adv_int=dict(type='str'),
pn_l3port=dict(type='str'),
pn_secondary_macs=dict(type='str'),
pn_nic_str=dict(type='str')
),
required_if=(
["state", "present",
["pn_vrouter_name", "pn_interface_ip"]],
["state", "absent",
["pn_vrouter_name", "pn_nic_str"]]
),
)
# Accessing the arguments
state = module.params['state']
vrouter_name = module.params['pn_vrouter_name']
vlan = module.params['pn_vlan']
interface_ip = module.params['pn_interface_ip']
assignment = module.params['pn_assignment']
vxlan = module.params['pn_vxlan']
interface = module.params['pn_interface']
alias = module.params['pn_alias']
exclusive = module.params['pn_exclusive']
nic_enable = module.params['pn_nic_enable']
vrrp_id = module.params['pn_vrrp_id']
vrrp_priority = module.params['pn_vrrp_priority']
vrrp_adv_int = module.params['pn_vrrp_adv_int']
l3port = module.params['pn_l3port']
secondary_macs = module.params['pn_secondary_macs']
nic_str = module.params['pn_nic_str']
command = get_command_from_state(state)
# Building the CLI command string
cli = pn_cli(module)
check_cli(module, cli)
if command == 'vrouter-interface-add':
if VROUTER_EXISTS is False:
module.exit_json(
skipped=True,
msg='vRouter %s does not exist' % vrouter_name
)
if vrrp_id:
vrrp_primary = get_nic(module, cli)
if VRRP_EXISTS is True:
module.exit_json(
skipped=True,
msg=('VRRP interface on %s already exists. Check '
'the IP addresses' % vrouter_name)
)
cli += ' %s vrouter-name %s ' % (command, vrouter_name)
cli += (' ip %s vrrp-primary %s vrrp-id %s '
% (interface_ip, vrrp_primary, str(vrrp_id)))
if vrrp_priority:
cli += ' vrrp-priority %s ' % str(vrrp_priority)
if vrrp_adv_int:
cli += ' vrrp-adv-int %s ' % vrrp_adv_int
else:
if INTERFACE_EXISTS is True:
module.exit_json(
skipped=True,
msg=('vRouter interface on %s already exists. Check the '
'IP addresses' % vrouter_name)
)
cli += ' %s vrouter-name %s ' % (command, vrouter_name)
cli += ' ip %s ' % interface_ip
if vlan:
cli += ' vlan ' + str(vlan)
if l3port:
cli += ' l3-port ' + l3port
if assignment:
cli += ' assignment ' + assignment
if vxlan:
cli += ' vxlan ' + str(vxlan)
if interface:
cli += ' if ' + interface
if alias:
cli += ' alias-on ' + alias
if exclusive is True:
cli += ' exclusive '
if exclusive is False:
cli += ' no-exclusive '
if nic_enable is True:
cli += ' nic-enable '
if nic_enable is False:
cli += ' nic-disable '
if secondary_macs:
cli += ' secondary-macs ' + secondary_macs
if command == 'vrouter-interface-remove':
if VROUTER_EXISTS is False:
module.exit_json(
skipped=True,
msg='vRouter %s does not exist' % vrouter_name
)
if NIC_EXISTS is False:
module.exit_json(
skipped=True,
msg='vRouter interface with nic %s does not exist' % nic_str
)
cli += ' %s vrouter-name %s nic %s ' % (command, vrouter_name, nic_str)
run_cli(module, cli)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,333 @@
#!/usr/bin/python
""" PN CLI vrouter-loopback-interface-add/remove """
#
# 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/>.
#
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['deprecated'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
module: pn_vrouterlbif
author: "Pluribus Networks (@amitsi)"
short_description: CLI command to add/remove vrouter-loopback-interface.
deprecated:
removed_in: '2.12'
why: Doesn't support latest Pluribus Networks netvisor
alternative: Latest modules will be pushed in Ansible future versions.
description:
- Execute vrouter-loopback-interface-add, vrouter-loopback-interface-remove
commands.
- Each fabric, cluster, standalone switch, or virtual network (VNET) can
provide its tenants with a virtual router (vRouter) service that forwards
traffic between networks and implements Layer 3 protocols.
options:
pn_cliusername:
description:
- Provide login username if user is not root.
required: False
pn_clipassword:
description:
- Provide login password if user is not root.
required: False
pn_cliswitch:
description:
- Target switch(es) to run the cli on.
required: False
default: 'local'
state:
description:
- State the action to perform. Use 'present' to add vrouter loopback
interface and 'absent' to remove vrouter loopback interface.
required: True
choices: ['present', 'absent']
pn_vrouter_name:
description:
- Specify the name of the vRouter.
required: True
pn_index:
description:
- Specify the interface index from 1 to 255.
pn_interface_ip:
description:
- Specify the IP address.
required: True
'''
EXAMPLES = """
- name: add vrouter-loopback-interface
pn_vrouterlbif:
state: 'present'
pn_vrouter_name: 'ansible-vrouter'
pn_interface_ip: '104.104.104.1'
- name: remove vrouter-loopback-interface
pn_vrouterlbif:
state: 'absent'
pn_vrouter_name: 'ansible-vrouter'
pn_interface_ip: '104.104.104.1'
"""
RETURN = """
command:
description: The CLI command run on the target node(s).
returned: always
type: str
stdout:
description: The set of responses from the vrouterlb command.
returned: always
type: list
stderr:
description: The set of error responses from the vrouterlb command.
returned: on error
type: list
changed:
description: Indicates whether the CLI caused changes on the target.
returned: always
type: bool
"""
import shlex
# Ansible boiler-plate
from ansible.module_utils.basic import AnsibleModule
VROUTER_EXISTS = None
LB_INTERFACE_EXISTS = None
# Index range
MIN_INDEX = 1
MAX_INDEX = 255
def pn_cli(module):
"""
This method is to generate the cli portion to launch the Netvisor cli.
It parses the username, password, switch parameters from module.
:param module: The Ansible module to fetch username, password and switch
:return: returns the cli string for further processing
"""
username = module.params['pn_cliusername']
password = module.params['pn_clipassword']
cliswitch = module.params['pn_cliswitch']
if username and password:
cli = '/usr/bin/cli --quiet --user %s:%s ' % (username, password)
else:
cli = '/usr/bin/cli --quiet '
if cliswitch == 'local':
cli += ' switch-local '
else:
cli += ' switch ' + cliswitch
return cli
def check_cli(module, cli):
"""
This method checks if vRouter exists on the target node.
This method also checks for idempotency using the
vrouter-loopback-interface-show command.
If the given vRouter exists, return VROUTER_EXISTS as True else False.
If a loopback interface with the given ip exists on the given vRouter,
return LB_INTERFACE_EXISTS as True else False.
:param module: The Ansible module to fetch input parameters
:param cli: The CLI string
:return Global Booleans: VROUTER_EXISTS, LB_INTERFACE_EXISTS
"""
vrouter_name = module.params['pn_vrouter_name']
interface_ip = module.params['pn_interface_ip']
# Global flags
global VROUTER_EXISTS, LB_INTERFACE_EXISTS
# Check for vRouter
check_vrouter = cli + ' vrouter-show format name no-show-headers '
check_vrouter = shlex.split(check_vrouter)
out = module.run_command(check_vrouter)[1]
out = out.split()
if vrouter_name in out:
VROUTER_EXISTS = True
else:
VROUTER_EXISTS = False
# Check for loopback interface
show = (cli + ' vrouter-loopback-interface-show vrouter-name %s format ip '
'no-show-headers' % vrouter_name)
show = shlex.split(show)
out = module.run_command(show)[1]
out = out.split()
if interface_ip in out:
LB_INTERFACE_EXISTS = True
else:
LB_INTERFACE_EXISTS = False
def run_cli(module, cli):
"""
This method executes the cli command on the target node(s) and returns the
output. The module then exits based on the output.
:param cli: the complete cli string to be executed on the target node(s).
:param module: The Ansible module to fetch command
"""
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
command = get_command_from_state(state)
cmd = shlex.split(cli)
# 'out' contains the output
# 'err' contains the error messages
result, out, err = module.run_command(cmd)
print_cli = cli.split(cliswitch)[1]
# Response in JSON format
if result != 0:
module.exit_json(
command=print_cli,
stderr=err.strip(),
msg="%s operation failed" % command,
changed=False
)
if out:
module.exit_json(
command=print_cli,
stdout=out.strip(),
msg="%s operation completed" % command,
changed=True
)
else:
module.exit_json(
command=print_cli,
msg="%s operation completed" % command,
changed=True
)
def get_command_from_state(state):
"""
This method gets appropriate command name for the state specified. It
returns the command name for the specified state.
:param state: The state for which the respective command name is required.
"""
command = None
if state == 'present':
command = 'vrouter-loopback-interface-add'
if state == 'absent':
command = 'vrouter-loopback-interface-remove'
return command
def main():
""" This portion is for arguments parsing """
module = AnsibleModule(
argument_spec=dict(
pn_cliusername=dict(required=False, type='str'),
pn_clipassword=dict(required=False, type='str', no_log=True),
pn_cliswitch=dict(required=False, type='str', default='local'),
state=dict(required=True, type='str',
choices=['present', 'absent']),
pn_vrouter_name=dict(required=True, type='str'),
pn_interface_ip=dict(type='str'),
pn_index=dict(type='int')
),
required_if=(
["state", "present",
["pn_vrouter_name", "pn_interface_ip"]],
["state", "absent",
["pn_vrouter_name", "pn_interface_ip"]]
)
)
# Accessing the arguments
state = module.params['state']
vrouter_name = module.params['pn_vrouter_name']
interface_ip = module.params['pn_interface_ip']
index = module.params['pn_index']
command = get_command_from_state(state)
# Building the CLI command string
cli = pn_cli(module)
if index:
if not MIN_INDEX <= index <= MAX_INDEX:
module.exit_json(
msg="Index must be between 1 and 255",
changed=False
)
index = str(index)
if command == 'vrouter-loopback-interface-remove':
check_cli(module, cli)
if VROUTER_EXISTS is False:
module.exit_json(
skipped=True,
msg='vRouter %s does not exist' % vrouter_name
)
if LB_INTERFACE_EXISTS is False:
module.exit_json(
skipped=True,
msg=('Loopback interface with IP %s does not exist on %s'
% (interface_ip, vrouter_name))
)
if not index:
# To remove loopback interface, we need the index.
# If index is not specified, get the Loopback interface index
# using the given interface ip.
get_index = cli
get_index += (' vrouter-loopback-interface-show vrouter-name %s ip '
'%s ' % (vrouter_name, interface_ip))
get_index += 'format index no-show-headers'
get_index = shlex.split(get_index)
out = module.run_command(get_index)[1]
index = out.split()[1]
cli += ' %s vrouter-name %s index %s' % (command, vrouter_name, index)
if command == 'vrouter-loopback-interface-add':
check_cli(module, cli)
if VROUTER_EXISTS is False:
module.exit_json(
skipped=True,
msg=('vRouter %s does not exist' % vrouter_name)
)
if LB_INTERFACE_EXISTS is True:
module.exit_json(
skipped=True,
msg=('Loopback interface with IP %s already exists on %s'
% (interface_ip, vrouter_name))
)
cli += (' %s vrouter-name %s ip %s'
% (command, vrouter_name, interface_ip))
if index:
cli += ' index %s ' % index
run_cli(module, cli)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,203 @@
#!/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_vtep
author: "Pluribus Networks (@rajaspachipulusu17)"
short_description: CLI command to create/delete vtep
description:
- This module can be used to create a vtep and delete a vtep.
options:
pn_cliswitch:
description:
- Target switch to run the CLI on.
required: false
type: str
state:
description:
- vtep configuration command.
required: false
choices: ['present', 'absent']
type: str
default: 'present'
pn_name:
description:
- vtep name.
required: false
type: str
pn_ip:
description:
- Primary IP address.
required: false
type: str
pn_vrouter_name:
description:
- name of the vrouter service.
required: false
type: str
pn_virtual_ip:
description:
- Virtual/Secondary IP address.
required: false
type: str
pn_location:
description:
- switch name.
required: false
type: str
pn_switch_in_cluster:
description:
- Tells whether switch in cluster or not.
required: false
type: bool
default: True
'''
EXAMPLES = """
- name: create vtep
pn_vtep:
pn_cliswitch: 'sw01'
pn_name: 'foo'
pn_vrouter_name: 'foo-vrouter'
pn_ip: '22.22.22.2'
pn_location: 'sw01'
pn_virtual_ip: "22.22.22.1"
- name: delete vtep
pn_vtep:
pn_cliswitch: 'sw01'
state: 'absent'
pn_name: 'foo'
"""
RETURN = """
command:
description: the CLI command run on the target node.
returned: always
type: str
stdout:
description: set of responses from the vtep command.
returned: always
type: list
stderr:
description: set of error responses from the vtep 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_collections.community.general.plugins.module_utils.network.netvisor.pn_nvos import pn_cli, run_cli
from ansible_collections.community.general.plugins.module_utils.network.netvisor.netvisor import run_commands
def check_cli(module, cli):
"""
This method checks for idempotency using the vtep-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 += ' vtep-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='vtep-create',
absent='vtep-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=False, type='str'),
pn_ip=dict(required=False, type='str'),
pn_vrouter_name=dict(required=False, type='str'),
pn_virtual_ip=dict(required=False, type='str'),
pn_location=dict(required=False, type='str'),
pn_switch_in_cluster=dict(required=False, type='bool', default='True')
)
module = AnsibleModule(
argument_spec=argument_spec,
required_if=(
["state", "present", ["pn_name", "pn_ip", "pn_vrouter_name", "pn_location"]],
["state", "absent", ["pn_name"]],
),
)
# Accessing the arguments
cliswitch = module.params['pn_cliswitch']
state = module.params['state']
name = module.params['pn_name']
ip = module.params['pn_ip']
vrouter_name = module.params['pn_vrouter_name']
virtual_ip = module.params['pn_virtual_ip']
location = module.params['pn_location']
switch_in_cluster = module.params['pn_switch_in_cluster']
if switch_in_cluster and not virtual_ip and state == 'present':
module.exit_json(
failed=True,
msg='virtual ip is required when switch is in cluster'
)
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 == 'vtep-delete':
if NAME_EXISTS is False:
module.exit_json(
skipped=True,
msg='vtep with name %s does not exist' % name
)
if command == 'vtep-create':
if NAME_EXISTS is True:
module.exit_json(
skipped=True,
msg='vtpe with name %s already exists' % name
)
cli += 'vrouter-name %s ' % vrouter_name
cli += 'ip %s ' % ip
cli += 'location %s ' % location
if virtual_ip:
cli += 'virtual-ip %s ' % virtual_ip
run_cli(module, cli, state_map)
if __name__ == '__main__':
main()