From b68b8b065746f97acfa60c24289ff5eaaa91486f Mon Sep 17 00:00:00 2001 From: Gaspard Micol Date: Wed, 1 Nov 2023 13:55:36 -0400 Subject: [PATCH] [minor_change] Add aci_bgp_peer_prefix_policy, aci_bgp_route_summarization_policy and aci_bgp_address_family_context_policy as new modules. --- .../aci_bgp_address_family_context_policy.py | 305 +++++++++++++++++ plugins/modules/aci_bgp_best_path_policy.py | 6 +- plugins/modules/aci_bgp_peer_prefix_policy.py | 319 ++++++++++++++++++ .../aci_bgp_route_summarization_policy.py | 303 +++++++++++++++++ plugins/modules/aci_bgp_timers_policy.py | 6 +- 5 files changed, 933 insertions(+), 6 deletions(-) create mode 100644 plugins/modules/aci_bgp_address_family_context_policy.py create mode 100644 plugins/modules/aci_bgp_peer_prefix_policy.py create mode 100644 plugins/modules/aci_bgp_route_summarization_policy.py diff --git a/plugins/modules/aci_bgp_address_family_context_policy.py b/plugins/modules/aci_bgp_address_family_context_policy.py new file mode 100644 index 000000000..4bdb752a9 --- /dev/null +++ b/plugins/modules/aci_bgp_address_family_context_policy.py @@ -0,0 +1,305 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Copyright: (c) 2023, Gaspard Micol (@gmicol) +# GNU General Public License v3.0+ (see LICENSE 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": "certified"} + +DOCUMENTATION = r""" +--- +module: aci_bgp_address_family_context_policy +short_description: Manage BGP address family context policy (bgp:CtxAfPol) +description: +- Manage BGP address family context policies for Tenants on Cisco ACI fabrics. +options: + tenant: + description: + - The name of an existing tenant. + type: str + aliases: [ tenant_name ] + bgp_address_family_context_policy: + description: + - The name of the bgp address family context policy. + type: str + aliases: [ bgp_address_family_context_name, name ] + description: + description: + - Description for the bgp protocol profile. + type: str + aliases: [ descr ] + state: + description: + - Use C(present) or C(absent) for adding or removing. + - Use C(query) for listing an object or multiple objects. + type: str + choices: [ absent, present, query ] + default: present + name_alias: + description: + - The alias for the current object. This relates to the nameAlias field in ACI. + type: str +extends_documentation_fragment: +- cisco.aci.aci +- cisco.aci.annotation +- cisco.aci.owner + +notes: +- The C(tenant) used must exist before using this module in your playbook. + The M(cisco.aci.aci_tenant) module can be used for this. +seealso: +- module: cisco.aci.aci_tenant +- name: APIC Management Information Model reference + description: More information about the internal APIC class B(bgp:CtxAfPol). + link: https://developer.cisco.com/docs/apic-mim-ref/ +author: +- Gaspard Micol (@gmicol) +""" + +EXAMPLES = r""" +- name: Create a BGP address family context policy + cisco.aci.aci_bgp_address_family_context_policy: + host: apic + username: admin + password: SomeSecretPassword + bgp_address_family_context_policy: my_bgp_address_family_context_policy + tenant: production + state: present + delegate_to: localhost + +- name: Delete a BGP address family context policy + cisco.aci.aci_bgp_address_family_context_policy: + host: apic + username: admin + password: SomeSecretPassword + bgp_address_family_context_policy: my_bgp_address_family_context_policy + tenant: production + state: absent + delegate_to: localhost + +- name: Query all BGP address family context policies + cisco.aci.aci_bgp_address_family_context_policy: + host: apic + username: admin + password: SomeSecretPassword + state: query + delegate_to: localhost + register: query_result + +- name: Query a specific BGP address family context policy + cisco.aci.aci_bgp_address_family_context_policy: + host: apic + username: admin + password: SomeSecretPassword + bgp_address_family_context_policy: my_bgp_address_family_context_policy + tenant: production + state: query + delegate_to: localhost + register: query_result +""" + +RETURN = r""" +current: + description: The existing configuration from the APIC after the module has finished + returned: success + type: list + sample: + [ + { + "fvTenant": { + "attributes": { + "descr": "Production environment", + "dn": "uni/tn-production", + "name": "production", + "nameAlias": "", + "ownerKey": "", + "ownerTag": "" + } + } + } + ] +error: + description: The error information as returned from the APIC + returned: failure + type: dict + sample: + { + "code": "122", + "text": "unknown managed object class foo" + } +raw: + description: The raw output returned by the APIC REST API (xml or json) + returned: parse error + type: str + sample: '' +sent: + description: The actual/minimal configuration pushed to the APIC + returned: info + type: list + sample: + { + "fvTenant": { + "attributes": { + "descr": "Production environment" + } + } + } +previous: + description: The original configuration from the APIC before the module has started + returned: info + type: list + sample: + [ + { + "fvTenant": { + "attributes": { + "descr": "Production", + "dn": "uni/tn-production", + "name": "production", + "nameAlias": "", + "ownerKey": "", + "ownerTag": "" + } + } + } + ] +proposed: + description: The assembled configuration from the user-provided parameters + returned: info + type: dict + sample: + { + "fvTenant": { + "attributes": { + "descr": "Production environment", + "name": "production" + } + } + } +filter_string: + description: The filter string used for the request + returned: failure or debug + type: str + sample: ?rsp-prop-include=config-only +method: + description: The HTTP method used for the request to the APIC + returned: failure or debug + type: str + sample: POST +response: + description: The HTTP response from the APIC + returned: failure or debug + type: str + sample: OK (30 bytes) +status: + description: The HTTP status from the APIC + returned: failure or debug + type: int + sample: 200 +url: + description: The HTTP url used for the request to the APIC + returned: failure or debug + type: str + sample: https://10.11.12.13/api/mo/uni/tn-production.json +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec +from ansible_collections.cisco.aci.plugins.module_utils.constants import MATCH_GRACEFUL_RESTART_CONTROLS_MAPPING + + +def main(): + argument_spec = aci_argument_spec() + argument_spec.update(aci_annotation_spec()) + argument_spec.update(aci_owner_spec()) + argument_spec.update( + tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects + bgp_address_family_context_policy=dict(type="str", aliases=["bgp_address_family_context_name", "name"]), # Not required for querying all objects + host_route_leak=dict(type="bool"), + ebgp_distance=dict(type="int"), + ibgp_distance=dict(type="int"), + local_distance=dict(type="int"), + ebgp_max_ecmp=dict(type="int"), + ibgp_max_ecmp=dict(type="int"), + local_max_ecmp=dict(type="int"), + bgp_add_path_capability=dict(type="bool"), + description=dict(type="str", aliases=["descr"]), + state=dict(type="str", default="present", choices=["absent", "present", "query"]), + name_alias=dict(type="str"), + ) + + module = AnsibleModule( + argument_spec=argument_spec, + supports_check_mode=True, + required_if=[ + ["state", "absent", ["bgp_address_family_context_policy", "tenant"]], + ["state", "present", ["bgp_address_family_context_policy", "tenant"]], + ], + ) + + bgp_address_family_context_policy = module.params.get("bgp_address_family_context_policy") + host_route_leak=module.params.get("host_route_leak") + ebgp_distance=module.params.get("ebgp_distance") + ibgp_distance=module.params.get("ibgp_distance") + local_distance=module.params.get("local_distance") + ebgp_max_ecmp=module.params.get("ebgp_max_ecmp") + ibgp_max_ecmp=module.params.get("ibgp_max_ecmp") + local_max_ecmp=module.params.get("local_max_ecmp") + bgp_add_path_capability=module.params.get("bgp_add_path_capability") + description = module.params.get("description") + state = module.params.get("state") + tenant = module.params.get("tenant") + name_alias = module.params.get("name_alias") + + aci = ACIModule(module) + + aci.construct_url( + root_class=dict( + aci_class="fvTenant", + aci_rn="tn-{0}".format(tenant), + module_object=tenant, + target_filter={"name": tenant}, + ), + subclass_1=dict( + aci_class="bgpCtxAfPol", + aci_rn="bgpCtxAfP-{0}".format(bgp_address_family_context_policy), + module_object=bgp_address_family_context_policy, + target_filter={"name": bgp_address_family_context_policy}, + ), + ) + + aci.get_existing() + + if state == "present": + aci.payload( + aci_class="bgpCtxAfPol", + class_config=dict( + name=bgp_address_family_context_policy, + ctrl=host_route_leak, + eDist=ebgp_distance, + iDist=ibgp_distance, + localDist=local_distance, + maxEcmp=ebgp_max_ecmp, + maxEcmpIbgp=ibgp_max_ecmp, + maxLocalEcmp=local_max_ecmp, + descr=description, + nameAlias=name_alias, + ), + ) + + aci.get_diff(aci_class="bgpCtxAfPol") + + aci.post_config() + + elif state == "absent": + aci.delete_config() + + aci.exit_json() + + +if __name__ == "__main__": + main() diff --git a/plugins/modules/aci_bgp_best_path_policy.py b/plugins/modules/aci_bgp_best_path_policy.py index a8b5c0a6a..a2bfcf5c0 100644 --- a/plugins/modules/aci_bgp_best_path_policy.py +++ b/plugins/modules/aci_bgp_best_path_policy.py @@ -74,7 +74,7 @@ host: apic username: admin password: SomeSecretPassword - bgp_protocol_profile: my_bgp_best_path_policy + bgp_best_path_policy: my_bgp_best_path_policy best_path_control: enable tenant: production state: present @@ -85,7 +85,7 @@ host: apic username: admin password: SomeSecretPassword - bgp_protocol_profile: my_bgp_best_path_policy + bgp_best_path_policy: my_bgp_best_path_policy tenant: production state: absent delegate_to: localhost @@ -104,7 +104,7 @@ host: apic username: admin password: SomeSecretPassword - bgp_protocol_profile: my_bgp_best_path_policy + bgp_best_path_policy: my_bgp_best_path_policy tenant: production state: query delegate_to: localhost diff --git a/plugins/modules/aci_bgp_peer_prefix_policy.py b/plugins/modules/aci_bgp_peer_prefix_policy.py new file mode 100644 index 000000000..76f3c1c2c --- /dev/null +++ b/plugins/modules/aci_bgp_peer_prefix_policy.py @@ -0,0 +1,319 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Copyright: (c) 2023, Gaspard Micol (@gmicol) +# GNU General Public License v3.0+ (see LICENSE 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": "certified"} + +DOCUMENTATION = r""" +--- +module: aci_bgp_peer_prefix_policy +short_description: Manage BGP peer prefix policy (bgp:PeerPfxPol) +description: +- Manage BGP peer prefix policies for Tenants on Cisco ACI fabrics. +options: + tenant: + description: + - The name of an existing tenant. + type: str + aliases: [ tenant_name ] + bgp_peer_prefix_policy: + description: + - The name of the bgp peer prefix policy. + type: str + aliases: [ bgp_peer_prefix_policy_name, name ] + action: + description: + - The action to be performed when the maximum prefix limit is reached. + - The APIC defaults to C(reject) when unset during creation. + type: str + choices: [ log, reject, restart, shut ] + maximum_number_prefix: + description: + - The maximum number of prefixes allowed from the peer. + --The APIC defaults to C(20000) when unset during creation. + type: int + aliases: [ max_prefix, max_num_prefix ] + restart_time: + description: + - The period of time in minutes before restarting the peer when the prefix limit is reached. + - Used only if C(action) is set to C(restart). + - The APIC defaults to C(infinite) when unset during creation. + type: str + threshold: + description: + - The threshold percentage of the maximum number of prefixes before a warning is issued. + - For example, if the maximum number of prefixes is 10 and the threshold is 70%, a warning is issued when the number of prefixes exceeds 7 (70%). + - The APIC defaults to C(75) when unset during creation. + type: int + aliases: [ thresh ] + description: + description: + - Description for the bgp protocol profile. + type: str + aliases: [ descr ] + state: + description: + - Use C(present) or C(absent) for adding or removing. + - Use C(query) for listing an object or multiple objects. + type: str + choices: [ absent, present, query ] + default: present + name_alias: + description: + - The alias for the current object. This relates to the nameAlias field in ACI. + type: str +extends_documentation_fragment: +- cisco.aci.aci +- cisco.aci.annotation +- cisco.aci.owner + +notes: +- The C(tenant) used must exist before using this module in your playbook. + The M(cisco.aci.aci_tenant) module can be used for this. +seealso: +- module: cisco.aci.aci_tenant +- name: APIC Management Information Model reference + description: More information about the internal APIC class B(bgp:PeerPfxPol). + link: https://developer.cisco.com/docs/apic-mim-ref/ +author: +- Gaspard Micol (@gmicol) +""" + +EXAMPLES = r""" +- name: Create a BGP peer prefix policy + cisco.aci.aci_bgp_peer_prefix_policy: + host: apic + username: admin + password: SomeSecretPassword + bgp_peer_prefix_policy: my_bgp_peer_prefix_policy + tenant: production + state: present + delegate_to: localhost + +- name: Delete a BGP peer prefix policy + cisco.aci.aci_bgp_peer_prefix_policy: + host: apic + username: admin + password: SomeSecretPassword + bgp_peer_prefix_policy: my_bgp_peer_prefix_policy + tenant: production + state: absent + delegate_to: localhost + +- name: Query all BGP peer prefix policies + cisco.aci.aci_bgp_peer_prefix_policy: + host: apic + username: admin + password: SomeSecretPassword + state: query + delegate_to: localhost + register: query_result + +- name: Query a specific BGP peer prefix policy + cisco.aci.aci_bgp_peer_prefix_policy: + host: apic + username: admin + password: SomeSecretPassword + bgp_peer_prefix_policy: my_bgp_peer_prefix_policy + tenant: production + state: query + delegate_to: localhost + register: query_result +""" + +RETURN = r""" +current: + description: The existing configuration from the APIC after the module has finished + returned: success + type: list + sample: + [ + { + "fvTenant": { + "attributes": { + "descr": "Production environment", + "dn": "uni/tn-production", + "name": "production", + "nameAlias": "", + "ownerKey": "", + "ownerTag": "" + } + } + } + ] +error: + description: The error information as returned from the APIC + returned: failure + type: dict + sample: + { + "code": "122", + "text": "unknown managed object class foo" + } +raw: + description: The raw output returned by the APIC REST API (xml or json) + returned: parse error + type: str + sample: '' +sent: + description: The actual/minimal configuration pushed to the APIC + returned: info + type: list + sample: + { + "fvTenant": { + "attributes": { + "descr": "Production environment" + } + } + } +previous: + description: The original configuration from the APIC before the module has started + returned: info + type: list + sample: + [ + { + "fvTenant": { + "attributes": { + "descr": "Production", + "dn": "uni/tn-production", + "name": "production", + "nameAlias": "", + "ownerKey": "", + "ownerTag": "" + } + } + } + ] +proposed: + description: The assembled configuration from the user-provided parameters + returned: info + type: dict + sample: + { + "fvTenant": { + "attributes": { + "descr": "Production environment", + "name": "production" + } + } + } +filter_string: + description: The filter string used for the request + returned: failure or debug + type: str + sample: ?rsp-prop-include=config-only +method: + description: The HTTP method used for the request to the APIC + returned: failure or debug + type: str + sample: POST +response: + description: The HTTP response from the APIC + returned: failure or debug + type: str + sample: OK (30 bytes) +status: + description: The HTTP status from the APIC + returned: failure or debug + type: int + sample: 200 +url: + description: The HTTP url used for the request to the APIC + returned: failure or debug + type: str + sample: https://10.11.12.13/api/mo/uni/tn-production.json +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec +from ansible_collections.cisco.aci.plugins.module_utils.constants import MATCH_GRACEFUL_RESTART_CONTROLS_MAPPING + + +def main(): + argument_spec = aci_argument_spec() + argument_spec.update(aci_annotation_spec()) + argument_spec.update(aci_owner_spec()) + argument_spec.update( + tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects + bgp_peer_prefix_policy=dict(type="str", aliases=["bgp_peer_prefix_policy_name", "name"]), # Not required for querying all objects + action=dict(type="str", choices=["log", "reject", "restart", "shut"]), + maximum_number_prefix=dict(type="int", aliases=["max_prefix", "max_num_prefix"]), + restart_time=dict(type="str"), + threshold=dict(type="int", alaises=["thresh"]), + description=dict(type="str", aliases=["descr"]), + state=dict(type="str", default="present", choices=["absent", "present", "query"]), + name_alias=dict(type="str"), + ) + + module = AnsibleModule( + argument_spec=argument_spec, + supports_check_mode=True, + required_if=[ + ["state", "absent", ["bgp_peer_prefix_policy", "tenant"]], + ["state", "present", ["bgp_peer_prefix_policy", "tenant"]], + ], + ) + + bgp_peer_prefix_policy = module.params.get("bgp_peer_prefix_policy") + action = module.params.get("action") + maximum_number_prefix = module.params.get("maximum_number_prefix") + restart_time = module.params.get("restart_time") + threshold = module.params.get("threshold") + description = module.params.get("description") + state = module.params.get("state") + tenant = module.params.get("tenant") + name_alias = module.params.get("name_alias") + + aci = ACIModule(module) + + aci.construct_url( + root_class=dict( + aci_class="fvTenant", + aci_rn="tn-{0}".format(tenant), + module_object=tenant, + target_filter={"name": tenant}, + ), + subclass_1=dict( + aci_class="bgpPeerPfxPol", + aci_rn="bgpPfxP-{0}".format(bgp_peer_prefix_policy), + module_object=bgp_peer_prefix_policy, + target_filter={"name": bgp_peer_prefix_policy}, + ), + ) + + aci.get_existing() + + if state == "present": + aci.payload( + aci_class="bgpPeerPfxPol", + class_config=dict( + name=bgp_peer_prefix_policy, + action=action, + maxPfx=maximum_number_prefix, + restartTime=restart_time, + thresh=threshold, + descr=description, + nameAlias=name_alias, + ), + ) + + aci.get_diff(aci_class="bgpPeerPfxPol") + + aci.post_config() + + elif state == "absent": + aci.delete_config() + + aci.exit_json() + + +if __name__ == "__main__": + main() diff --git a/plugins/modules/aci_bgp_route_summarization_policy.py b/plugins/modules/aci_bgp_route_summarization_policy.py new file mode 100644 index 000000000..78957cc47 --- /dev/null +++ b/plugins/modules/aci_bgp_route_summarization_policy.py @@ -0,0 +1,303 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Copyright: (c) 2023, Gaspard Micol (@gmicol) +# GNU General Public License v3.0+ (see LICENSE 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": "certified"} + +DOCUMENTATION = r""" +--- +module: aci_route_summarization_policy +short_description: Manage BGP route summarization policy (bgp:RtSummPol) +description: +- Manage BGP route summarization policies for Tenants on Cisco ACI fabrics. +options: + tenant: + description: + - The name of an existing tenant. + type: str + aliases: [ tenant_name ] + route_summarization_policy: + description: + - The name of the bgp route summarization policy. + type: str + aliases: [ route_summarization_policy_name, name ] + address_type_af_control: + description: + - The Ucast/Mcast address type AF control. + - The APIC defaults to C(af-ucast) when unset during creation. + type: list + elements: str + choices: [ af-label-ucast, af-ucast, af-mcast ] + aliases: [ address_type_control ] + address_type_af_control: + description: + - The summary control. + type: list + elements: str + choices: [ as-set, summary-only ] + aliases: [ summary_control, control ] + description: + description: + - Description for the bgp protocol profile. + type: str + aliases: [ descr ] + state: + description: + - Use C(present) or C(absent) for adding or removing. + - Use C(query) for listing an object or multiple objects. + type: str + choices: [ absent, present, query ] + default: present + name_alias: + description: + - The alias for the current object. This relates to the nameAlias field in ACI. + type: str +extends_documentation_fragment: +- cisco.aci.aci +- cisco.aci.annotation +- cisco.aci.owner + +notes: +- The C(tenant) used must exist before using this module in your playbook. + The M(cisco.aci.aci_tenant) module can be used for this. +seealso: +- module: cisco.aci.aci_tenant +- name: APIC Management Information Model reference + description: More information about the internal APIC class B(bgp:RtSummPol). + link: https://developer.cisco.com/docs/apic-mim-ref/ +author: +- Gaspard Micol (@gmicol) +""" + +EXAMPLES = r""" +- name: Create a BGP route summarization policy + cisco.aci.aci_route_summarization_policy: + host: apic + username: admin + password: SomeSecretPassword + route_summarization_policy: my_route_summarization_policy + tenant: production + state: present + delegate_to: localhost + +- name: Delete a BGP route summarization policy + cisco.aci.aci_route_summarization_policy: + host: apic + username: admin + password: SomeSecretPassword + route_summarization_policy: my_route_summarization_policy + tenant: production + state: absent + delegate_to: localhost + +- name: Query all BGP route summarization policies + cisco.aci.aci_route_summarization_policy: + host: apic + username: admin + password: SomeSecretPassword + state: query + delegate_to: localhost + register: query_result + +- name: Query a specific BGP route summarization policy + cisco.aci.aci_route_summarization_policy: + host: apic + username: admin + password: SomeSecretPassword + route_summarization_policy: my_route_summarization_policy + tenant: production + state: query + delegate_to: localhost + register: query_result +""" + +RETURN = r""" +current: + description: The existing configuration from the APIC after the module has finished + returned: success + type: list + sample: + [ + { + "fvTenant": { + "attributes": { + "descr": "Production environment", + "dn": "uni/tn-production", + "name": "production", + "nameAlias": "", + "ownerKey": "", + "ownerTag": "" + } + } + } + ] +error: + description: The error information as returned from the APIC + returned: failure + type: dict + sample: + { + "code": "122", + "text": "unknown managed object class foo" + } +raw: + description: The raw output returned by the APIC REST API (xml or json) + returned: parse error + type: str + sample: '' +sent: + description: The actual/minimal configuration pushed to the APIC + returned: info + type: list + sample: + { + "fvTenant": { + "attributes": { + "descr": "Production environment" + } + } + } +previous: + description: The original configuration from the APIC before the module has started + returned: info + type: list + sample: + [ + { + "fvTenant": { + "attributes": { + "descr": "Production", + "dn": "uni/tn-production", + "name": "production", + "nameAlias": "", + "ownerKey": "", + "ownerTag": "" + } + } + } + ] +proposed: + description: The assembled configuration from the user-provided parameters + returned: info + type: dict + sample: + { + "fvTenant": { + "attributes": { + "descr": "Production environment", + "name": "production" + } + } + } +filter_string: + description: The filter string used for the request + returned: failure or debug + type: str + sample: ?rsp-prop-include=config-only +method: + description: The HTTP method used for the request to the APIC + returned: failure or debug + type: str + sample: POST +response: + description: The HTTP response from the APIC + returned: failure or debug + type: str + sample: OK (30 bytes) +status: + description: The HTTP status from the APIC + returned: failure or debug + type: int + sample: 200 +url: + description: The HTTP url used for the request to the APIC + returned: failure or debug + type: str + sample: https://10.11.12.13/api/mo/uni/tn-production.json +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec +from ansible_collections.cisco.aci.plugins.module_utils.constants import MATCH_GRACEFUL_RESTART_CONTROLS_MAPPING + + +def main(): + argument_spec = aci_argument_spec() + argument_spec.update(aci_annotation_spec()) + argument_spec.update(aci_owner_spec()) + argument_spec.update( + tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects + route_summarization_policy=dict(type="str", aliases=["route_summarization_policy_name", "name"]), # Not required for querying all objects + address_type_af_control=dict(type="list", elements="str", choices=["af-label-ucast", "af-ucast", "af-mcast"], aliases=["address_type_control"]), + control_state=dict(type="list", elements="str", choices=["as-set", "summary-only"], aliases=["summary_control", "control"]), + description=dict(type="str", aliases=["descr"]), + state=dict(type="str", default="present", choices=["absent", "present", "query"]), + name_alias=dict(type="str"), + ) + + module = AnsibleModule( + argument_spec=argument_spec, + supports_check_mode=True, + required_if=[ + ["state", "absent", ["route_summarization_policy", "tenant"]], + ["state", "present", ["route_summarization_policy", "tenant"]], + ], + ) + + route_summarization_policy = module.params.get("route_summarization_policy") + address_type_af_control = ",".join(module.params.get("address_type_af_control")) if module.params.get("address_type_af_control") else None + control_state = ",".join(module.params.get("control_state")) if module.params.get("control_state") else None + description = module.params.get("description") + state = module.params.get("state") + tenant = module.params.get("tenant") + name_alias = module.params.get("name_alias") + + aci = ACIModule(module) + + aci.construct_url( + root_class=dict( + aci_class="fvTenant", + aci_rn="tn-{0}".format(tenant), + module_object=tenant, + target_filter={"name": tenant}, + ), + subclass_1=dict( + aci_class="bgpRtSummPol", + aci_rn="bgprtsum-{0}".format(route_summarization_policy), + module_object=route_summarization_policy, + target_filter={"name": route_summarization_policy}, + ), + ) + + aci.get_existing() + + if state == "present": + aci.payload( + aci_class="bgpRtSummPol", + class_config=dict( + name=route_summarization_policy, + addrTCtrl=address_type_af_control, + ctrl=control_state, + descr=description, + nameAlias=name_alias, + ), + ) + + aci.get_diff(aci_class="bgpRtSummPol") + + aci.post_config() + + elif state == "absent": + aci.delete_config() + + aci.exit_json() + + +if __name__ == "__main__": + main() diff --git a/plugins/modules/aci_bgp_timers_policy.py b/plugins/modules/aci_bgp_timers_policy.py index c8d6c54b0..ff4ad8c6f 100644 --- a/plugins/modules/aci_bgp_timers_policy.py +++ b/plugins/modules/aci_bgp_timers_policy.py @@ -94,7 +94,7 @@ host: apic username: admin password: SomeSecretPassword - bgp_protocol_profile: my_bgp_timers_policy + bgp_timers_policy: my_bgp_timers_policy graceful_restart_controls: complete hold_interval: 360 keepalive_interval: 120 @@ -109,7 +109,7 @@ host: apic username: admin password: SomeSecretPassword - bgp_protocol_profile: my_bgp_timers_policy + bgp_timers_policy: my_bgp_timers_policy tenant: production state: absent delegate_to: localhost @@ -128,7 +128,7 @@ host: apic username: admin password: SomeSecretPassword - bgp_protocol_profile: my_bgp_timers_policy + bgp_timers_policy: my_bgp_timers_policy tenant: production state: query delegate_to: localhost