diff --git a/examples/accesslist.yaml b/examples/accesslist.yaml new file mode 100644 index 000000000..97de23996 --- /dev/null +++ b/examples/accesslist.yaml @@ -0,0 +1,14 @@ +--- +- name: Configure accessslist + hosts: localhost + tasks: + - name: Create accesslist + delegate_to: localhost + netscaler.adc.accesslist: + state: present + id: 1 + remark: "Allow all traffic" + rules: + - action: permit + address: 2.1.1.21 + wildcard: "0.0.0.255" diff --git a/examples/bfdinterface.yaml b/examples/bfdinterface.yaml new file mode 100644 index 000000000..f6577fbb3 --- /dev/null +++ b/examples/bfdinterface.yaml @@ -0,0 +1,13 @@ +--- +- name: Configure bfdinterface + hosts: localhost + tasks: + - name: Create bfdinterface + delegate_to: localhost + netscaler.adc.bfdinterface: + state: present + name: vlan0 + passive: true + interval: 752 + minrx: 501 + multiplier: 3 diff --git a/examples/iproute.yaml b/examples/iproute.yaml new file mode 100644 index 000000000..19a449778 --- /dev/null +++ b/examples/iproute.yaml @@ -0,0 +1,12 @@ +--- +- name: Configure bfdinterface + hosts: localhost + tasks: + - name: Create bfdinterface + delegate_to: localhost + netscaler.adc.iproute: + state: present + addressFamily: ipv4 + prefix: 33.1.1.0 + prefixLength: 24 + nextHop: 10.106.210.24 diff --git a/examples/location.yaml b/examples/location.yaml deleted file mode 100644 index 48ad13e86..000000000 --- a/examples/location.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -- name: Sample location playbook - hosts: demo_netscalers - gather_facts: false - tasks: - - name: Configure location - delegate_to: localhost - netscaler.adc.location: - state: present - ipfrom: 1.1.1.1 - ipto: 2.2.2.2 - preferredlocation: '*.US.*' diff --git a/examples/ospf6interface.yaml b/examples/ospf6interface.yaml new file mode 100644 index 000000000..db15c5c6b --- /dev/null +++ b/examples/ospf6interface.yaml @@ -0,0 +1,13 @@ +--- +- name: Configure ospf6interface + hosts: localhost + tasks: + - name: Create ospf6interface + delegate_to: localhost + netscaler.adc.ospf6interface: + state: present + + name: "vlan10" + areaId: 0 + tagId: "22" + instanceId: 0 diff --git a/examples/ospf6router.yaml b/examples/ospf6router.yaml new file mode 100644 index 000000000..ed106ed1d --- /dev/null +++ b/examples/ospf6router.yaml @@ -0,0 +1,15 @@ +--- +- name: Sample ospf6router playbook + hosts: localhost + gather_facts: false + tasks: + - name: Configure ospf6router + delegate_to: localhost + netscaler.adc.ospf6router: + state: unset + tagId: 11 + afParams: + - addressFamily: ipv6 + redistribute: + - protocol: static + metric: 111 diff --git a/examples/ospfinterface.yaml b/examples/ospfinterface.yaml new file mode 100644 index 000000000..150c939ed --- /dev/null +++ b/examples/ospfinterface.yaml @@ -0,0 +1,20 @@ +--- +- name: Sample ospfinterface playbook + hosts: localhost + gather_facts: false + tasks: + - name: Configure ospfinterface + delegate_to: localhost + netscaler.adc.ospfinterface: + state: present + name: vlan100 + helloInterval: 10 + deadInterval: 40 + cost: 10 + priority: 1 + mtu: 1500 + networkType: broadcast + authType: "null" + retransmitInterval: 5 + transmitDelay: 1 + bfd: false diff --git a/examples/ospfrouter.yaml b/examples/ospfrouter.yaml new file mode 100644 index 000000000..70813cca2 --- /dev/null +++ b/examples/ospfrouter.yaml @@ -0,0 +1,20 @@ +--- +- name: Sample ospfrouter playbook + hosts: localhost + gather_facts: false + tasks: + - name: Configure ospfrouter + delegate_to: localhost + netscaler.adc.ospfrouter: + state: present + + processId: 1 + routerId: "1.1.1.1" + passiveInterface: + - vlan22 + redistribute: + - protocol: connected + networks: + - ipaddress: "33.1.2.5" + netmask: 25 + area: 1 diff --git a/examples/routemap.yaml b/examples/routemap.yaml new file mode 100644 index 000000000..94020d305 --- /dev/null +++ b/examples/routemap.yaml @@ -0,0 +1,16 @@ +--- +- name: Sample routeMap playbook + hosts: localhost + gather_facts: false + tasks: + - name: Configure routeMap + delegate_to: localhost + netscaler.adc.routemap: + state: present + + name: test + rules: + - action: permit + sequence: 10 + setMetric: 105 + matchAsPath: "300" diff --git a/meta/runtime.yml b/meta/runtime.yml index d7400a068..5ad4bd7bb 100644 --- a/meta/runtime.yml +++ b/meta/runtime.yml @@ -999,3 +999,12 @@ action_groups: - vxlan_srcip_binding - vxlanvlanmap - vxlanvlanmap_vxlan_binding + - accesslist + - bfdinterface + - iproute + - routemap + - ospf6interface + - ospf6router + - ospfrouter + - ospfinterface + - bgprouter diff --git a/plugins/module_utils/nitro_resource_map.py b/plugins/module_utils/nitro_resource_map.py index 5a337c5bb..e837b2c47 100644 --- a/plugins/module_utils/nitro_resource_map.py +++ b/plugins/module_utils/nitro_resource_map.py @@ -2351,6 +2351,45 @@ "singleton": False, "update_payload_keys": [], }, + "accesslist": { + "_supported_operations": ["get", "unset", "update", "delete", "add"], + "action_payload_keys": { + "apply": [], + "create": [], + "force": [], + "import": [], + "link": [], + "switch": [], + "unlink": [], + "unset": [], + }, + "add_payload_keys": ["id", "remark", "rules"], + "bindings": [], + "bindprimary_key": "", + "delete_arg_keys": ["id"], + "disable_payload_keys": [], + "enable_payload_keys": [], + "get_arg_keys": ["id"], + "immutable_keys": [], + "password_keys": [], + "primary_key": "", + "primary_key_composite": [], + "readwrite_arguments": { + "id": {"no_log": False, "type": "str"}, + "remark": {"no_log": False, "type": "str"}, + "rules": { + "type": "list", + "elements": "dict", + "options": { + "action": {"no_log": False, "type": "str"}, + "address": {"no_log": False, "type": "str"}, + "wildcard": {"no_log": False, "type": "str"}, + }, + }, + }, + "singleton": True, + "update_payload_keys": ["rules"], + }, "admparameter": { "_supported_operations": ["get", "unset", "update"], "action_payload_keys": { @@ -16634,6 +16673,39 @@ }, "singleton": False, }, + "bfdinterface": { + "_supported_operations": ["get", "add", "unset"], + "action_payload_keys": { + "apply": [], + "create": [], + "force": [], + "import": [], + "link": [], + "switch": [], + "unlink": [], + "unset": ["name", "passive"], + }, + "add_payload_keys": ["interval", "minrx", "name", "multiplier", "passive"], + "bindings": [], + "bindprimary_key": "", + "delete_arg_keys": [], + "disable_payload_keys": [], + "enable_payload_keys": [], + "get_arg_keys": [], + "immutable_keys": [], + "password_keys": [], + "primary_key": "", + "primary_key_composite": [], + "update_payload_keys": ["name", "interval", "minrx", "multiplier", "passive"], + "readwrite_arguments": { + "interval": {"no_log": False, "type": "int"}, + "minrx": {"no_log": False, "type": "int"}, + "name": {"no_log": False, "type": "str"}, + "multiplier": {"no_log": False, "type": "int"}, + "passive": {"no_log": False, "type": "bool"}, + }, + "singleton": False, + }, "botglobal_botpolicy_binding": { "_supported_operations": ["add", "count", "delete", "get"], "action_payload_keys": { @@ -31259,6 +31331,89 @@ "useclientsourceipv6", ], }, + "iproute": { + "_supported_operations": [ + "add", + "delete", + "get", + ], + "action_payload_keys": { + "apply": [], + "create": [], + "force": [], + "import": [], + "link": [], + "switch": [], + "unlink": [], + "unset": [], + }, + "add_payload_keys": [ + "ipRoute", + "addressFamily", + "distance", + "interface", + "nextHop", + "prefix", + "prefixLength", + ], + "bindings": [], + "bindprimary_key": "", + "delete_arg_keys": [ + "prefix", + "addressFamily", + "nextHop", + "interface", + "prefixLength", + ], + "disable_payload_keys": [], + "enable_payload_keys": [], + "get_arg_keys": ["prefixLength", "prefix", "addressFamily"], + "immutable_keys": [], + "password_keys": [], + "primary_key": "", + "primary_key_composite": [], + "readwrite_arguments": { + "addressFamily": { + "no_log": False, + "type": "str", + "choices": ["ipv4", "ipv6"], + }, + "distance": { + "no_log": False, + "type": "int", + }, + "interface": { + "no_log": False, + "type": "str", + }, + "isBest": { + "no_log": False, + "type": "bool", + }, + "metric": { + "no_log": False, + "type": "str", + }, + "nextHop": { + "no_log": False, + "type": "str", + }, + "prefix": { + "no_log": False, + "type": "str", + }, + "prefixLength": { + "no_log": False, + "type": "int", + }, + "type": { + "no_log": False, + "type": "str", + }, + }, + "singleton": False, + "update_payload_keys": [], + }, "ipsecalgprofile": { "_supported_operations": [ "add", @@ -46687,6 +46842,344 @@ "singleton": True, "update_payload_keys": [], }, + "ospf6interface": { + "_supported_operations": [ + "add", + "get", + "unset", + "update", + ], + "action_payload_keys": { + "apply": [], + "create": [], + "force": [], + "import": [], + "link": [], + "switch": [], + "unlink": [], + "unset": [ + "areaId", + "cost", + "deadInterval", + "helloInterval", + "instanceId", + "name", + "networkType", + "priority", + "retransmitInterval", + "tagId", + "transmitDelay", + ], + }, + "add_payload_keys": [ + "areaId", + "cost", + "deadInterval", + "helloInterval", + "instanceId", + "name", + "networkType", + "priority", + "retransmitInterval", + "tagId", + "transmitDelay", + ], + "bindings": [], + "bindprimary_key": "", + "delete_arg_keys": [], + "disable_payload_keys": [], + "enable_payload_keys": [], + "get_arg_keys": ["name"], + "immutable_keys": [], + "password_keys": [], + "primary_key": "", + "primary_key_composite": [], + "readwrite_arguments": { + "areaId": { + "no_log": False, + "type": "int", + }, + "cost": { + "no_log": False, + "type": "int", + }, + "deadInterval": { + "no_log": False, + "type": "int", + }, + "helloInterval": { + "no_log": False, + "type": "int", + }, + "instanceId": { + "no_log": False, + "type": "int", + }, + "name": {"no_log": False, "type": "str"}, + "networkType": { + "no_log": False, + "type": "str", + "choices": [ + "broadcast", + "non-broadcast", + "point-to-multipoint", + "point-to-point", + ], + }, + "priority": { + "no_log": False, + "type": "int", + }, + "retransmitInterval": { + "no_log": False, + "type": "int", + }, + "tagId": {"no_log": False, "type": "str"}, + "transmitDelay": { + "no_log": False, + "type": "int", + }, + }, + "singleton": False, + "update_payload_keys": [ + "areaId", + "cost", + "deadInterval", + "helloInterval", + "instanceId", + "name", + "networkType", + "priority", + "retransmitInterval", + "tagId", + "transmitDelay", + ], + }, + "ospf6router": { + "_supported_operations": [ + "add", + "get", + "unset", + "update", + "delete", + ], + "action_payload_keys": { + "apply": [], + "create": [], + "force": [], + "import": [], + "link": [], + "switch": [], + "unlink": [], + "unset": ["afParams", "passiveInterface", "routerId", "tagId"], + }, + "add_payload_keys": ["afParams", "passiveInterface", "routerId", "tagId"], + "bindings": [], + "bindprimary_key": "", + "delete_arg_keys": ["tagId"], + "disable_payload_keys": [], + "enable_payload_keys": [], + "get_arg_keys": ["tagId"], + "immutable_keys": [], + "password_keys": [], + "primary_key": "", + "primary_key_composite": [], + "readwrite_arguments": { + "afParams": { + "type": "list", + "elements": "dict", + "options": { + "addressFamily": {"no_log": False, "type": "str"}, + "redistribute": { + "type": "list", + "elements": "dict", + "options": { + "metric": {"no_log": False, "type": "int"}, + "metricType": {"no_log": False, "type": "int"}, + "protocol": {"no_log": False, "type": "str"}, + "routeMap": {"no_log": False, "type": "str"}, + }, + }, + }, + }, + "passiveInterface": {"no_log": False, "type": "list", "elements": "str"}, + "routerId": {"no_log": False, "type": "str"}, + "tagId": {"no_log": False, "type": "str"}, + }, + "singleton": False, + "update_payload_keys": [ + "afParams", + "passiveInterface", + "tagId", + ], + }, + "ospfinterface": { + "_supported_operations": [ + "add", + "get", + "unset", + "update", + ], + "action_payload_keys": { + "apply": [], + "create": [], + "force": [], + "import": [], + "link": [], + "switch": [], + "unlink": [], + "unset": [ + "networks", + "passiveInterface", + "processId", + "redistribute", + "routerId", + ], + }, + "add_payload_keys": [ + "authKey", + "authType", + "bfd", + "cost", + "deadInterval", + "helloInterval", + "mtu", + "name", + "networkType", + "priority", + "retransmitInterval", + "transmitDelay" + ], + "bindings": [], + "bindprimary_key": "", + "delete_arg_keys": ["processId"], + "disable_payload_keys": [], + "enable_payload_keys": [], + "get_arg_keys": ["processId"], + "immutable_keys": [], + "password_keys": [], + "primary_key": "", + "primary_key_composite": [], + "readwrite_arguments": { + "authKey": {"no_log": False, "type": "str"}, + "authType": { + "no_log": False, + "type": "str", + "choices": ["null", "simple", "message-digest"], + }, + "bfd": {"no_log": False, "type": "bool"}, + "cost": {"no_log": False, "type": "int"}, + "deadInterval": {"no_log": False, "type": "int"}, + "helloInterval": {"no_log": False, "type": "int"}, + "mtu": {"no_log": False, "type": "int"}, + "name": {"no_log": False, "type": "str"}, + "networkType": { + "no_log": False, + "type": "str", + "choices": ["broadcast", "non-broadcast", "point-to-multipoint", "point-to-point"], + }, + "priority": {"no_log": False, "type": "int"}, + "retransmitInterval": {"no_log": False, "type": "int"}, + "transmitDelay": {"no_log": False, "type": "int"}, + }, + "singleton": False, + "update_payload_keys": [ + "networks", + "passiveInterface", + "processId", + "redistribute", + "routerId", + ], + }, + "ospfrouter": { + "_supported_operations": [ + "add", + "get", + "unset", + "update", + "delete", + ], + "action_payload_keys": { + "apply": [], + "create": [], + "force": [], + "import": [], + "link": [], + "switch": [], + "unlink": [], + "unset": [ + "networks", + "passiveInterface", + "processId", + "redistribute", + "routerId", + ], + }, + "add_payload_keys": [ + "networks", + "passiveInterface", + "processId", + "redistribute", + "routerId", + ], + "bindings": [], + "bindprimary_key": "", + "delete_arg_keys": ["processId"], + "disable_payload_keys": [], + "enable_payload_keys": [], + "get_arg_keys": ["processId"], + "immutable_keys": [], + "password_keys": [], + "primary_key": "", + "primary_key_composite": [], + "readwrite_arguments": { + "networks": { + "type": "list", + "elements": "dict", + "options": { + "area": {"no_log": False, "type": "int"}, + "ipaddress": {"no_log": False, "type": "str"}, + "netmask": {"no_log": False, "type": "int"}, + }, + }, + "passiveInterface": {"no_log": False, "type": "list", "elements": "str"}, + "processId": {"no_log": False, "type": "int"}, + "redistribute": { + "type": "list", + "elements": "dict", + "options": { + "metric": {"no_log": False, "type": "int"}, + "metricType": {"no_log": False, "type": "int"}, + "ospfProcessId": {"no_log": False, "type": "int"}, + "protocol": { + "no_log": False, + "type": "str", + "choices": [ + "bgp", + "connected", + "intranet", + "isis", + "kernel", + "ospf", + "rip", + "static", + ], + }, + "routeMap": {"no_log": False, "type": "str"}, + "tag": {"no_log": False, "type": "int"}, + }, + }, + "routerId": {"no_log": False, "type": "str"}, + }, + "singleton": True, + "update_payload_keys": [ + "networks", + "passiveInterface", + "processId", + "redistribute", + "routerId", + ], + }, "onlinkipv6prefix": { "_supported_operations": [ "add", @@ -49968,6 +50461,62 @@ "weight", ], }, + "routemap": { + "_supported_operations": [ + "add", + "delete", + "get", + "unset", + "update", + ], + "action_payload_keys": { + "apply": [], + "create": [], + "force": [], + "import": [], + "link": [], + "switch": [], + "unlink": [], + "unset": ["name", "rules"], + }, + "add_payload_keys": ["name", "rules"], + "bindings": [], + "bindprimary_key": "", + "delete_arg_keys": ["name"], + "disable_payload_keys": [], + "enable_payload_keys": [], + "get_arg_keys": ["name"], + "immutable_keys": [], + "password_keys": [], + "primary_key": "", + "primary_key_composite": [], + "readwrite_arguments": { + "name": {"no_log": False, "type": "str"}, + "rules": { + "type": "list", + "elements": "dict", + "options": { + "action": {"no_log": False, "type": "str"}, + "localPreference": {"no_log": False, "type": "int"}, + "matchAsPath": {"no_log": False, "type": "str"}, + "matchCommunity": {"no_log": False, "type": "str"}, + "matchIpAddress": {"no_log": False, "type": "str"}, + "matchIpNextHop": {"no_log": False, "type": "str"}, + "matchMetric": {"no_log": False, "type": "int"}, + "matchRouteType": {"no_log": False, "type": "str"}, + "sequence": {"no_log": False, "type": "int"}, + "setAsPath": {"no_log": False, "type": "str"}, + "setCommunity": {"no_log": False, "type": "str"}, + "setIpNextHop": {"no_log": False, "type": "str"}, + "setMetric": {"no_log": False, "type": "int"}, + "setMetricType": {"no_log": False, "type": "str"}, + "weight": {"no_log": False, "type": "int"}, + }, + }, + }, + "singleton": False, + "update_payload_keys": ["name", "rules"], + }, "routerdynamicrouting": { "_supported_operations": [ "add", diff --git a/plugins/modules/accesslist.py b/plugins/modules/accesslist.py new file mode 100644 index 000000000..badeceb23 --- /dev/null +++ b/plugins/modules/accesslist.py @@ -0,0 +1,136 @@ +#!/usr/bin/python + +# -*- coding: utf-8 -*- + +# Copyright (c) 2025 Cloud Software Group, Inc. +# MIT License (see LICENSE or https://opensource.org/licenses/MIT) + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +ANSIBLE_METADATA = { + "metadata_version": "1.1", + "status": ["preview"], + "supported_by": "community", +} +DOCUMENTATION = r""" +module: accesslist +short_description: Manage accesslist configuration on Citrix ADC (NetScaler) devices +description: + - Manage Accesslist configuration on Citrix ADC (NetScaler) devices. +version_added: 2.10.0 +author: + - Shiva Shankar Vaddepally (@shivashankar-vaddepally) +options: + state: + type: str + choices: ["absent", "present", "unset"] + default: present + description: + - The state of the resource on the NetScaler ADC node. + - When C(present), the resource will be added or updated. + - When C(absent), the resource will be deleted. + - When C(unset), the resource will be unset. + id: + type: str + description: + - Standard access list number in the range <0-99> or a ZebOS access-list name. + + remark: + type: str + description: + - Access list entry comment. + + rules: + type: list + elements: dict + description: + - List of rule parameters for the access list entry. + suboptions: + action: + type: str + description: + - Allow or deny if traffic matches the rule. + address: + type: str + description: + - Address to match. + wildcard: + type: str + description: + - Wildcard mask to apply to the address. + + remove_non_updatable_params: + type: str + choices: ["yes", "no"] + default: "no" + description: + - Remove non-updatable parameters from the configuration. + +extends_documentation_fragment: netscaler.adc.netscaler_adc +""" + +EXAMPLES = r""" +--- +- name: Configure accessslist + hosts: localhost + tasks: + - name: Create accesslist + delegate_to: localhost + netscaler.adc.accesslist: + state: present + id: 1 + remark: "Allow all traffic" + rules: + - action: permit + address: 2.1.1.21 + wildcard: "0.0.0.255" +""" +RETURN = r""" +--- +changed: + description: Indicates if any change is made by the module + returned: always + type: bool + sample: true +diff: + description: Dictionary of before and after changes + returned: always + type: dict + sample: {'before': {'key1': 'xyz'}, 'after': {'key2': 'pqr'}, 'prepared': 'changes + done'} +diff_list: + description: List of differences between the actual configured object and the configuration + specified in the module + returned: when changed + type: list + sample: ["Attribute `key1` differs. Desired: () XYZ. Existing: () PQR"] +failed: + description: Indicates if the module failed or not + returned: always + type: bool + sample: false +loglines: + description: list of logged messages by the module + returned: always + type: list + sample: ['message 1', 'message 2'] + +""" +import os + +from ..module_utils.module_executor import ModuleExecutor + +RESOURCE_NAME = os.path.basename(__file__).replace(".py", "") + + +def main(): + executor = ModuleExecutor(RESOURCE_NAME) + executor.main() + + +if __name__ == "__main__": + main() diff --git a/plugins/modules/bfdinterface.py b/plugins/modules/bfdinterface.py new file mode 100644 index 000000000..dedcf43d9 --- /dev/null +++ b/plugins/modules/bfdinterface.py @@ -0,0 +1,137 @@ +#!/usr/bin/python + +# -*- coding: utf-8 -*- + +# Copyright (c) 2025 Cloud Software Group, Inc. +# MIT License (see LICENSE or https://opensource.org/licenses/MIT) + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +ANSIBLE_METADATA = { + "metadata_version": "1.1", + "status": ["preview"], + "supported_by": "community", +} +DOCUMENTATION = r""" +module: bfdinterface +short_description: Manage bfdinterface configuration on Citrix ADC (NetScaler) devices +description: + - Manage bfdInterface configuration on Citrix ADC (NetScaler) devices. +version_added: 2.10.0 +author: + - Shiva Shankar Vaddepally (@shivashankar-vaddepally) +options: + state: + type: str + choices: ["present", "unset"] + default: present + description: + - The state of the resource on the NetScaler ADC node. + - When C(present), the resource will be added or updated. + - When C(unset), the resource will be unset. + interval: + type: int + description: + - Transmit interval for BFD packets. + - Minimum value is 100. + - Maximum value is 30000. + + minrx: + type: int + description: + - Minimum receive interval for BFD packets. + - Minimum value is 100. + - Maximum value is 30000. + + multiplier: + type: int + description: + - Multiplier for BFD packets. + - Minimum value is 1. + - Maximum value is 20. + + name: + type: str + description: + - Name of the interface. + + passive: + type: bool + description: + - Make BFD session passive. + - Read-write. + + remove_non_updatable_params: + type: str + choices: ["yes", "no"] + default: "no" + description: + - Remove non-updatable parameters from the configuration. + +extends_documentation_fragment: netscaler.adc.netscaler_adc +""" + +EXAMPLES = r""" +--- +- name: Configure bfdinterface + hosts: localhost + tasks: + - name: Create bfdinterface + delegate_to: localhost + netscaler.adc.bfdinterface: + state: present + name: vlan0 + passive: true + interval: 752 + minrx: 501 + multiplier: 3 +""" +RETURN = r""" +--- +changed: + description: Indicates if any change is made by the module + returned: always + type: bool + sample: true +diff: + description: Dictionary of before and after changes + returned: always + type: dict + sample: {'before': {'key1': 'xyz'}, 'after': {'key2': 'pqr'}, 'prepared': 'changes + done'} +diff_list: + description: List of differences between the actual configured object and the configuration + specified in the module + returned: when changed + type: list + sample: ["Attribute `key1` differs. Desired: () XYZ. Existing: () PQR"] +failed: + description: Indicates if the module failed or not + returned: always + type: bool + sample: false +loglines: + description: list of logged messages by the module + returned: always + type: list + sample: ['message 1', 'message 2'] + +""" +import os + +from ..module_utils.module_executor import ModuleExecutor + +RESOURCE_NAME = os.path.basename(__file__).replace(".py", "") + + +def main(): + executor = ModuleExecutor(RESOURCE_NAME) + executor.main() + + +if __name__ == "__main__": + main() diff --git a/plugins/modules/iproute.py b/plugins/modules/iproute.py new file mode 100644 index 000000000..ce438e6cf --- /dev/null +++ b/plugins/modules/iproute.py @@ -0,0 +1,157 @@ +#!/usr/bin/python + +# -*- coding: utf-8 -*- + +# Copyright (c) 2025 Cloud Software Group, Inc. +# MIT License (see LICENSE or https://opensource.org/licenses/MIT) + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +ANSIBLE_METADATA = { + "metadata_version": "1.1", + "status": ["preview"], + "supported_by": "community", +} +DOCUMENTATION = r""" +module: iproute +short_description: Manage iproute configuration on Citrix ADC (NetScaler) devices +description: + - Manage ipRoute configuration on Citrix ADC (NetScaler) devices. +version_added: 2.10.0 +author: + - Shiva Shankar Vaddepally (@shivashankar-vaddepally) +options: + state: + type: str + choices: ["present", "absent"] + default: present + description: + - The state of the resource on the NetScaler ADC node. + - When C(present), the resource will be added or updated. + - When C(absent), the resource will be deleted. + addressFamily: + type: str + choices: + - ipv4 + - ipv6 + description: + - The address family of the route. + - Possible values are ipv4 or ipv6. + + distance: + type: int + description: + - Distance value for this route. + - Minimum value is 1. + - Maximum value is 255. + + interface: + type: str + description: + - IP gateway interface name or pseudo interface Null. + + isBest: + type: bool + description: + - Indicates if this is the best route for the prefix. + + metric: + type: str + description: + - IP destination prefix. + + nextHop: + type: str + description: + - IP gateway address. + + prefix: + type: str + description: + - IP destination prefix. + + prefixLength: + type: int + description: + - IP destination prefix length. + - Minimum value is 0. + - Maximum value is 128. + + type: + type: str + description: + - IP route protocol type. + + remove_non_updatable_params: + type: str + choices: ["yes", "no"] + default: "no" + description: + - Remove non-updatable parameters from the configuration. + +extends_documentation_fragment: netscaler.adc.netscaler_adc +""" + +EXAMPLES = r""" +--- +- name: Configure bfdinterface + hosts: localhost + tasks: + - name: Create bfdinterface + delegate_to: localhost + netscaler.adc.iproute: + state: present + addressFamily: ipv4 + prefix: 33.1.1.0 + prefixLength: 24 + nextHop: 10.106.210.24 +""" +RETURN = r""" +--- +changed: + description: Indicates if any change is made by the module + returned: always + type: bool + sample: true +diff: + description: Dictionary of before and after changes + returned: always + type: dict + sample: {'before': {'key1': 'xyz'}, 'after': {'key2': 'pqr'}, 'prepared': 'changes + done'} +diff_list: + description: List of differences between the actual configured object and the configuration + specified in the module + returned: when changed + type: list + sample: ["Attribute `key1` differs. Desired: () XYZ. Existing: () PQR"] +failed: + description: Indicates if the module failed or not + returned: always + type: bool + sample: false +loglines: + description: list of logged messages by the module + returned: always + type: list + sample: ['message 1', 'message 2'] + +""" +import os + +from ..module_utils.module_executor import ModuleExecutor + +RESOURCE_NAME = os.path.basename(__file__).replace(".py", "") + + +def main(): + executor = ModuleExecutor(RESOURCE_NAME) + executor.main() + + +if __name__ == "__main__": + main() diff --git a/plugins/modules/ospf6interface.py b/plugins/modules/ospf6interface.py new file mode 100644 index 000000000..c9d5340ab --- /dev/null +++ b/plugins/modules/ospf6interface.py @@ -0,0 +1,165 @@ +#!/usr/bin/python + +# -*- coding: utf-8 -*- + +# Copyright (c) 2025 Cloud Software Group, Inc. +# MIT License (see LICENSE or https://opensource.org/licenses/MIT) + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +ANSIBLE_METADATA = { + "metadata_version": "1.1", + "status": ["preview"], + "supported_by": "community", +} +DOCUMENTATION = r""" +module: ospf6interface +short_description: Manage ospf6interface configuration on Citrix ADC (NetScaler) devices +description: + - Manage ospf6interface configuration on Citrix ADC (NetScaler) devices. +version_added: 2.10.0 +author: + - Shiva Shankar Vaddepally (@shivashankar-vaddepally) +options: + state: + type: str + choices: ["present", "unset"] + default: present + description: + - The state of the resource on the NetScaler ADC node. + - When C(present), the resource will be added or updated. + - When C(unset), the resource will be unset. + + areaId: + type: int + description: + - Area on which OSPFv3 is running. + + cost: + type: int + description: + - Interface cost. + + deadInterval: + type: int + description: + - Interval after which a neighbor is declared dead. + + helloInterval: + type: int + description: + - Time between HELLO packets. + + instanceId: + type: int + description: + - Interface Instance Id - <0-31> for v6, <64-95> for v4. + + name: + type: str + description: + - Name of the interface. + + networkType: + type: str + choices: + - broadcast + - non-broadcast + - point-to-multipoint + - point-to-point + description: + - Network type. + + priority: + type: int + description: + - Router priority. + + retransmitInterval: + type: int + description: + - Time between retransmitting lost link state advertisements. + + tagId: + type: str + description: + - Tag identifier. + + transmitDelay: + type: int + description: + - Link state transmit delay. + + remove_non_updatable_params: + type: str + choices: ["yes", "no"] + default: "no" + description: + - Remove non-updatable parameters from the configuration. + +extends_documentation_fragment: netscaler.adc.netscaler_adc +""" + +EXAMPLES = r""" +--- +- name: Configure ospf6interface + hosts: localhost + tasks: + - name: Create ospf6interface + delegate_to: localhost + netscaler.adc.ospf6interface: + state: present + name: "vlan10" + areaId: 0 + tagId: "22" + instanceId: 0 +""" +RETURN = r""" +--- +changed: + description: Indicates if any change is made by the module + returned: always + type: bool + sample: true +diff: + description: Dictionary of before and after changes + returned: always + type: dict + sample: {'before': {'key1': 'xyz'}, 'after': {'key2': 'pqr'}, 'prepared': 'changes + done'} +diff_list: + description: List of differences between the actual configured object and the configuration + specified in the module + returned: when changed + type: list + sample: ["Attribute `key1` differs. Desired: () XYZ. Existing: () PQR"] +failed: + description: Indicates if the module failed or not + returned: always + type: bool + sample: false +loglines: + description: list of logged messages by the module + returned: always + type: list + sample: ['message 1', 'message 2'] + +""" +import os + +from ..module_utils.module_executor import ModuleExecutor + +RESOURCE_NAME = os.path.basename(__file__).replace(".py", "") + + +def main(): + executor = ModuleExecutor(RESOURCE_NAME) + executor.main() + + +if __name__ == "__main__": + main() diff --git a/plugins/modules/ospf6router.py b/plugins/modules/ospf6router.py new file mode 100644 index 000000000..4cc099c3c --- /dev/null +++ b/plugins/modules/ospf6router.py @@ -0,0 +1,162 @@ +#!/usr/bin/python + +# -*- coding: utf-8 -*- + +# Copyright (c) 2025 Cloud Software Group, Inc. +# MIT License (see LICENSE or https://opensource.org/licenses/MIT) + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +ANSIBLE_METADATA = { + "metadata_version": "1.1", + "status": ["preview"], + "supported_by": "community", +} + +DOCUMENTATION = r""" +--- +module: ospf6router +short_description: Configuration for ospf6router resource. +description: Configuration for ospf6router resource. +version_added: 2.0.0 +author: + - Sumanth Lingappa (@sumanth-lingappa) + - Shiva Shankar Vaddepally (@shivashankar-vaddepally) +options: + state: + type: str + choices: + - present + - unset + - absent + default: present + description: + - The state of the resource being configured by the module on the NetScaler ADC node. + - When C(present), the resource will be added/updated configured according to the module's parameters. + - When C(unset), the resource will be unset on the NetScaler ADC node. + remove_non_updatable_params: + type: str + choices: + - 'yes' + - 'no' + default: 'no' + description: + - When given yes, the module will remove any parameters that are not updatable in the resource. + - If no, the module will return error if any non-updatable parameters are provided. + afParams: + type: list + elements: dict + description: + - Address family-specific parameters for OSPFv3. + suboptions: + addressFamily: + type: str + description: + - Address family for OSPFv3 + redistribute: + type: list + elements: dict + description: + - Redistribution settings for OSPFv3. + suboptions: + metric: + type: int + description: + - Metric value used for redistributed routes. + metricType: + type: int + description: + - Metric type used in redistribution. + protocol: + type: str + description: + - Protocol being redistributed (e.g., connected, static). + routeMap: + type: str + description: + - Route map applied to redistributed routes. + passiveInterface: + type: list + elements: str + description: + - List of interfaces that are passive (OSPF doesn't form adjacencies). + routerId: + type: str + description: + - Router ID for OSPFv3 instance. + tagId: + type: str + description: + - Optional route tag for redistributed routes. +extends_documentation_fragment: netscaler.adc.netscaler_adc +""" + +EXAMPLES = r""" +--- +- name: Sample ospf6router playbook + hosts: localhost + gather_facts: false + tasks: + - name: Configure ospf6router + delegate_to: localhost + netscaler.adc.ospf6router: + state: unset + tagId: 11 + afParams: + - addressFamily: ipv6 + redistribute: + - protocol: static + metric: 111 +""" + +RETURN = r""" +--- +changed: + description: Indicates if any change is made by the module + returned: always + type: bool + sample: true +diff: + description: Dictionary of before and after changes + returned: always + type: dict + sample: {'before': {'key1': 'xyz'}, 'after': {'key2': 'pqr'}, 'prepared': 'changes + done'} +diff_list: + description: List of differences between the actual configured object and the configuration + specified in the module + returned: when changed + type: list + sample: ["Attribute `key1` differs. Desired: () XYZ. Existing: () PQR"] +failed: + description: Indicates if the module failed or not + returned: always + type: bool + sample: false +loglines: + description: list of logged messages by the module + returned: always + type: list + sample: ['message 1', 'message 2'] + +""" + + +import os + +from ..module_utils.module_executor import ModuleExecutor + +RESOURCE_NAME = os.path.basename(__file__).replace(".py", "") + + +def main(): + executor = ModuleExecutor(RESOURCE_NAME) + executor.main() + + +if __name__ == "__main__": + main() diff --git a/plugins/modules/ospfinterface.py b/plugins/modules/ospfinterface.py new file mode 100644 index 000000000..49b6259e2 --- /dev/null +++ b/plugins/modules/ospfinterface.py @@ -0,0 +1,177 @@ +#!/usr/bin/python + +# -*- coding: utf-8 -*- + +# Copyright (c) 2025 Cloud Software Group, Inc. +# MIT License (see LICENSE or https://opensource.org/licenses/MIT) + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +ANSIBLE_METADATA = { + "metadata_version": "1.1", + "status": ["preview"], + "supported_by": "community", +} + +DOCUMENTATION = r""" +module: ospfinterface +short_description: Configuration for OSPF Interface resource. +description: Configuration for OSPF Interface resource. +version_added: 2.0.0 +author: + - Sumanth Lingappa (@sumanth-lingappa) + - Shiva Shankar Vaddepally (@shivashankar-vaddepally) +options: + state: + type: str + choices: + - present + - unset + default: present + description: + - The state of the resource being configured by the module on the NetScaler ADC node. + - When C(present), the resource will be added/updated configured according to the module's parameters. + - When C(unset), the resource will be unset on the NetScaler ADC node. + remove_non_updatable_params: + type: str + choices: + - 'yes' + - 'no' + default: 'no' + description: + - When given yes, the module will remove any parameters that are not updatable in the resource. + - If no, the module will return error if any non-updatable parameters are provided. + + authKey: + type: str + description: + - Authentication password (key) for the OSPF interface. + authType: + type: str + choices: + - "null" + - simple + - message-digest + description: + - Authentication type on the OSPF interface. + bfd: + type: bool + description: + - Enable or disable Bidirectional Forwarding Detection (BFD) on the interface. + cost: + type: int + description: + - Cost metric of the OSPF interface. + deadInterval: + type: int + description: + - Time interval (in seconds) after which a router is declared down if no Hello packets are received. + helloInterval: + type: int + description: + - Time interval (in seconds) between sending Hello packets on the interface. + mtu: + type: int + description: + - Maximum Transmission Unit size on the interface. + name: + type: str + description: + - Name of the OSPF interface. + networkType: + type: str + choices: ['broadcast', 'non-broadcast', 'point-to-multipoint', 'point-to-point'] + description: + - Type of the OSPF network. + priority: + type: int + description: + - Router priority used in the designated router election process. + retransmitInterval: + type: int + description: + - Time interval (in seconds) between retransmissions of Link State Advertisements (LSAs). + transmitDelay: + type: int + description: + - Delay in seconds on the interface before transmitting LSAs. + +extends_documentation_fragment: netscaler.adc.netscaler_adc + +""" + +EXAMPLES = r""" +--- +- name: Sample ospfinterface playbook + hosts: localhost + gather_facts: false + tasks: + - name: Configure ospfinterface + delegate_to: localhost + netscaler.adc.ospfinterface: + state: present + + name: vlan100 + helloInterval: 10 + deadInterval: 40 + cost: 10 + priority: 1 + mtu: 1500 + networkType: broadcast + authType: "null" + retransmitInterval: 5 + transmitDelay: 1 + bfd: false +""" + +RETURN = r""" +--- +changed: + description: Indicates if any change is made by the module + returned: always + type: bool + sample: true +diff: + description: Dictionary of before and after changes + returned: always + type: dict + sample: {'before': {'key1': 'xyz'}, 'after': {'key2': 'pqr'}, 'prepared': 'changes + done'} +diff_list: + description: List of differences between the actual configured object and the configuration + specified in the module + returned: when changed + type: list + sample: ["Attribute `key1` differs. Desired: () XYZ. Existing: () PQR"] +failed: + description: Indicates if the module failed or not + returned: always + type: bool + sample: false +loglines: + description: list of logged messages by the module + returned: always + type: list + sample: ['message 1', 'message 2'] + +""" + + +import os + +from ..module_utils.module_executor import ModuleExecutor + +RESOURCE_NAME = os.path.basename(__file__).replace(".py", "") + + +def main(): + executor = ModuleExecutor(RESOURCE_NAME) + executor.main() + + +if __name__ == "__main__": + main() diff --git a/plugins/modules/ospfrouter.py b/plugins/modules/ospfrouter.py new file mode 100644 index 000000000..be34631bf --- /dev/null +++ b/plugins/modules/ospfrouter.py @@ -0,0 +1,188 @@ +#!/usr/bin/python + +# -*- coding: utf-8 -*- + +# Copyright (c) 2025 Cloud Software Group, Inc. +# MIT License (see LICENSE or https://opensource.org/licenses/MIT) + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +ANSIBLE_METADATA = { + "metadata_version": "1.1", + "status": ["preview"], + "supported_by": "community", +} + +DOCUMENTATION = r""" +--- +module: ospfrouter +short_description: Configuration for OSPF Router resource. +description: Configuration for OSPF Router resource. +version_added: 2.0.0 +author: + - Sumanth Lingappa (@sumanth-lingappa) + - Shiva Shankar Vaddepally (@shivashankar-vaddepally) +options: + state: + choices: + - present + - absent + - unset + default: present + description: + - The state of the resource being configured by the module on the NetScaler + ADC node. + - When C(present), the resource will be added/updated configured according to + the module's parameters. + - When C(absent), the resource will be deleted from the NetScaler ADC node. + - When C(unset), the resource will be unset on the NetScaler ADC node. + type: str + remove_non_updatable_params: + choices: + - 'yes' + - 'no' + default: 'no' + description: + - When given yes, the module will remove any parameters that are not updatable + in the resource. + - If no, the module will return error if any non-updatable parameters are provided. + type: str + routerId: + description: + - Router ID for the OSPF process + type: str + processId: + description: + - OSPF process ID + type: int + networks: + description: + - Network configurations for OSPF + type: list + elements: dict + suboptions: + ipaddress: + description: + - IP address of the network + type: str + netmask: + description: + - Network mask + type: int + area: + description: + - OSPF area ID + type: int + passiveInterface: + description: + - List of passive interfaces + type: list + elements: str + redistribute: + description: + - Route redistribution configuration + type: list + elements: dict + suboptions: + protocol: + description: + - Protocol to redistribute + type: str + choices: ['bgp', 'connected', 'intranet', 'isis', 'kernel', 'ospf', 'rip', 'static'] + metric: + description: + - Metric for redistributed routes + type: int + metricType: + description: + - Metric type for redistributed routes + type: int + routeMap: + description: + - Route map for redistribution + type: str + tag: + description: + - Tag for redistributed routes + type: int + ospfProcessId: + description: + - OSPF process ID for redistribution + type: int +extends_documentation_fragment: netscaler.adc.netscaler_adc + +""" + +EXAMPLES = r""" +--- +- name: Sample ospfrouter playbook + hosts: localhost + gather_facts: false + tasks: + - name: Configure ospfrouter + delegate_to: localhost + netscaler.adc.ospfrouter: + state: present + processId: 1 + routerId: "1.1.1.1" + passiveInterface: + - vlan22 + redistribute: + - protocol: connected + networks: + - ipaddress: "33.1.2.5" + netmask: 25 + area: 1 +""" + +RETURN = r""" +--- +changed: + description: Indicates if any change is made by the module + returned: always + type: bool + sample: true +diff: + description: Dictionary of before and after changes + returned: always + type: dict + sample: {'before': {'key1': 'xyz'}, 'after': {'key2': 'pqr'}, 'prepared': 'changes + done'} +diff_list: + description: List of differences between the actual configured object and the configuration + specified in the module + returned: when changed + type: list + sample: ["Attribute `key1` differs. Desired: () XYZ. Existing: () PQR"] +failed: + description: Indicates if the module failed or not + returned: always + type: bool + sample: false +loglines: + description: list of logged messages by the module + returned: always + type: list + sample: ['message 1', 'message 2'] + +""" + + +import os + +from ..module_utils.module_executor import ModuleExecutor + +RESOURCE_NAME = os.path.basename(__file__).replace(".py", "") + + +def main(): + executor = ModuleExecutor(RESOURCE_NAME) + executor.main() + + +if __name__ == "__main__": + main() diff --git a/plugins/modules/routemap.py b/plugins/modules/routemap.py new file mode 100644 index 000000000..779653a49 --- /dev/null +++ b/plugins/modules/routemap.py @@ -0,0 +1,196 @@ +#!/usr/bin/python + +# -*- coding: utf-8 -*- + +# Copyright (c) 2025 Cloud Software Group, Inc. +# MIT License (see LICENSE or https://opensource.org/licenses/MIT) + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +ANSIBLE_METADATA = { + "metadata_version": "1.1", + "status": ["preview"], + "supported_by": "community", +} +DOCUMENTATION = r""" +module: routemap +short_description: Manage routemap configuration on Citrix ADC (NetScaler) devices +description: + - Manage routemap configuration on Citrix ADC (NetScaler) devices. +version_added: 2.10.0 +author: + - Shiva Shankar Vaddepally (@shivashankar-vaddepally) +options: + state: + type: str + choices: ["unset", "absent", "present"] + default: present + description: + - The state of the resource on the NetScaler ADC node. + - When C(present), the resource will be added or updated. + - When C(absent), the resource will be deleted. + - When C(unset), the resource will be unset. + + name: + type: str + description: + - Route map tag. + + rules: + type: list + elements: dict + description: + - List of rule parameters for the route map entry. + suboptions: + action: + type: str + description: + - Specifies if the route-map denies or permits the operations. + + localPreference: + type: int + description: + - Set the BGP local preference path attribute. + + matchAsPath: + type: str + description: + - Match the BGP AS-path list. + + matchCommunity: + type: str + description: + - Match BGP community list. + + matchIpAddress: + type: str + description: + - Match IP address of route. IP access-list number in the range <1-99> or access-list name. + + matchIpNextHop: + type: str + description: + - Match next-hop address of route. IP access-list number in the range <1-99> or access-list name. + + matchMetric: + type: int + description: + - Match values from routing table. Match metric of route. + + matchRouteType: + type: str + choices: [] + description: + - Match OSPF external routes of type 1 or type 2 metrics. + + sequence: + type: int + description: + - Sequence to insert to/delete from existing route-map entry. + + setAsPath: + type: str + description: + - Set the prepend string for a BGP AS-path attribute. + + setCommunity: + type: str + description: + - Set the BGP community attribute. + + setIpNextHop: + type: str + description: + - Set next hop address of a route. + + setMetric: + type: int + description: + - Set metric value for destination routing protocol. + + setMetricType: + type: str + choices: [] + description: + - Set type of metric for destination routing protocol. OSPF external type 1 metric or OSPF external type 2 metric. + + weight: + type: int + description: + - Set BGP weight for routing table. + + remove_non_updatable_params: + type: str + choices: ["yes", "no"] + default: "no" + description: + - Remove non-updatable parameters from the configuration. + +extends_documentation_fragment: netscaler.adc.netscaler_adc +""" +EXAMPLES = r""" +--- +- name: Sample routeMap playbook + hosts: localhost + gather_facts: false + tasks: + - name: Configure routeMap + delegate_to: localhost + netscaler.adc.routemap: + state: present + name: test + rules: + - action: permit + sequence: 10 + setMetric: 105 + matchAsPath: "300" +""" +RETURN = r""" +--- +changed: + description: Indicates if any change is made by the module + returned: always + type: bool + sample: true +diff: + description: Dictionary of before and after changes + returned: always + type: dict + sample: {'before': {'key1': 'xyz'}, 'after': {'key2': 'pqr'}, 'prepared': 'changes + done'} +diff_list: + description: List of differences between the actual configured object and the configuration + specified in the module + returned: when changed + type: list + sample: ["Attribute `key1` differs. Desired: () XYZ. Existing: () PQR"] +failed: + description: Indicates if the module failed or not + returned: always + type: bool + sample: false +loglines: + description: list of logged messages by the module + returned: always + type: list + sample: ['message 1', 'message 2'] + +""" +import os + +from ..module_utils.module_executor import ModuleExecutor + +RESOURCE_NAME = os.path.basename(__file__).replace(".py", "") + + +def main(): + executor = ModuleExecutor(RESOURCE_NAME) + executor.main() + + +if __name__ == "__main__": + main() diff --git a/tests/sanity/ignore-2.15.txt b/tests/sanity/ignore-2.15.txt index 4ebbf7698..9311ac21f 100644 --- a/tests/sanity/ignore-2.15.txt +++ b/tests/sanity/ignore-2.15.txt @@ -948,4 +948,12 @@ plugins/modules/sslechconfig.py validate-modules:missing-gplv3-license # We use plugins/modules/sslhpkekey.py validate-modules:missing-gplv3-license # We use MIT license plugins/modules/sslprofile_sslechconfig_binding.py validate-modules:missing-gplv3-license # We use MIT license plugins/modules/authenticationprotecteduseraction.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/accesslist.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/bfdinterface.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/iproute.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/routemap.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/ospf6interface.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/ospf6router.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/ospfrouter.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/ospfinterface.py validate-modules:missing-gplv3-license # We use MIT license plugins/modules/bgprouter.py validate-modules:missing-gplv3-license # We use MIT license \ No newline at end of file diff --git a/tests/sanity/ignore-2.16.txt b/tests/sanity/ignore-2.16.txt index 4ebbf7698..9311ac21f 100644 --- a/tests/sanity/ignore-2.16.txt +++ b/tests/sanity/ignore-2.16.txt @@ -948,4 +948,12 @@ plugins/modules/sslechconfig.py validate-modules:missing-gplv3-license # We use plugins/modules/sslhpkekey.py validate-modules:missing-gplv3-license # We use MIT license plugins/modules/sslprofile_sslechconfig_binding.py validate-modules:missing-gplv3-license # We use MIT license plugins/modules/authenticationprotecteduseraction.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/accesslist.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/bfdinterface.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/iproute.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/routemap.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/ospf6interface.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/ospf6router.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/ospfrouter.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/ospfinterface.py validate-modules:missing-gplv3-license # We use MIT license plugins/modules/bgprouter.py validate-modules:missing-gplv3-license # We use MIT license \ No newline at end of file diff --git a/tests/sanity/ignore-2.17.txt b/tests/sanity/ignore-2.17.txt index 4ebbf7698..9311ac21f 100644 --- a/tests/sanity/ignore-2.17.txt +++ b/tests/sanity/ignore-2.17.txt @@ -948,4 +948,12 @@ plugins/modules/sslechconfig.py validate-modules:missing-gplv3-license # We use plugins/modules/sslhpkekey.py validate-modules:missing-gplv3-license # We use MIT license plugins/modules/sslprofile_sslechconfig_binding.py validate-modules:missing-gplv3-license # We use MIT license plugins/modules/authenticationprotecteduseraction.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/accesslist.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/bfdinterface.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/iproute.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/routemap.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/ospf6interface.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/ospf6router.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/ospfrouter.py validate-modules:missing-gplv3-license # We use MIT license +plugins/modules/ospfinterface.py validate-modules:missing-gplv3-license # We use MIT license plugins/modules/bgprouter.py validate-modules:missing-gplv3-license # We use MIT license \ No newline at end of file