diff --git a/plugins/modules/aci_action_rule_additional_communities.py b/plugins/modules/aci_action_rule_additional_communities.py index fe5156e29..3f105e2b4 100644 --- a/plugins/modules/aci_action_rule_additional_communities.py +++ b/plugins/modules/aci_action_rule_additional_communities.py @@ -1,6 +1,7 @@ #!/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 @@ -12,25 +13,35 @@ DOCUMENTATION = r""" --- module: aci_tenant_action_rule_profile -short_description: Manage Set Additional Communities (rtctrl:SetAddComm) +short_description: Manage Action Rules based on Additional Communities (rtctrl:SetAddComm) description: - Set additional communities for the action rule profiles on Cisco ACI fabrics. options: + tenant: + description: + - The name of the tenant. + type: str + aliases: [ tenant_name ] action_rule: description: - The name of the action rule profile. type: str - aliases: [ action_rule_name, name ] + aliases: [ action_rule_name ] + community: + description: + - The community value + type: str + set_criteria: + description: + - The community criteria. + - The option to append or replace the community value. + type: str + choices: [ append, replace, none ] description: description: - The description for the action rule profile. type: str aliases: [ descr ] - tenant: - description: - - The name of the tenant. - type: str - aliases: [ tenant_name ] state: description: - Use C(present) or C(absent) for adding or removing. @@ -47,10 +58,11 @@ - cisco.aci.annotation 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. +- The C(tenant) and the C(action_rule) used must exist before using this module in your playbook. + The M(cisco.aci.aci_tenant) and M(cisco.aci.aci_tenant_action_rule_profile) modules can be used for this. seealso: - module: cisco.aci.aci_tenant +- module: cisco.aci.aci_tenant_action_rule_profile - name: APIC Management Information Model reference description: More information about the internal APIC class B(rtctrl:SetAddComm). link: https://developer.cisco.com/docs/apic-mim-ref/ @@ -213,8 +225,10 @@ def main(): argument_spec = aci_argument_spec() argument_spec.update(aci_annotation_spec()) argument_spec.update( - action_rule=dict(type="str", aliases=["action_rule_name", "name"]), # Not required for querying all objects tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects + action_rule=dict(type="str", aliases=["action_rule_name", "name"]), # Not required for querying all objects + community=dict(type="str"), + set_criteria=dict(type="str", choices=["append", "replace", "none"]), description=dict(type="str", aliases=["descr"]), state=dict(type="str", default="present", choices=["absent", "present", "query"]), name_alias=dict(type="str"), @@ -224,15 +238,17 @@ def main(): argument_spec=argument_spec, supports_check_mode=True, required_if=[ - ["state", "absent", ["action_rule", "tenant"]], - ["state", "present", ["action_rule", "tenant"]], + ["state", "absent", ["action_rule", "tenant", "community"]], + ["state", "present", ["action_rule", "tenant", "community"]], ], ) - action_rule = module.params.get("action_rule") + community = module.params.get("community") + set_criteria = module.params.get("set_criteria") description = module.params.get("description") state = module.params.get("state") tenant = module.params.get("tenant") + action_rule = module.params.get("action_rule") name_alias = module.params.get("name_alias") aci = ACIModule(module) @@ -249,21 +265,28 @@ def main(): module_object=action_rule, target_filter={"name": action_rule}, ), + subclass_2=dict( + aci_class="rtctrlSetAddComm", + aci_rn="saddcomm-{0}".format(community), + module_object=community, + target_filter={"community": community}, + ), ) aci.get_existing() if state == "present": aci.payload( - aci_class="rtctrlAttrP", + aci_class="rtctrlSetAddComm", class_config=dict( - name=action_rule, + community=community, + setCriteria=set_criteria, descr=description, nameAlias=name_alias, ), ) - aci.get_diff(aci_class="rtctrlAttrP") + aci.get_diff(aci_class="rtctrlSetAddComm") aci.post_config() diff --git a/plugins/modules/aci_action_rule_set_as_path.py b/plugins/modules/aci_action_rule_set_as_path.py new file mode 100644 index 000000000..05f5339d7 --- /dev/null +++ b/plugins/modules/aci_action_rule_set_as_path.py @@ -0,0 +1,299 @@ +#!/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_tenant_action_rule_profile +short_description: Manage the AS Path action rules (rtctrl:SetASPath) +description: +- Set AS path action rule for the action rule profiles on Cisco ACI fabrics. +options: + tenant: + description: + - The name of the tenant. + type: str + aliases: [ tenant_name ] + action_rule: + description: + - The name of the action rule profile. + type: str + aliases: [ action_rule_name ] + last_as_number: + description: + - The last AS number value. + type: int + criteria: + description: + - The option to append the specified AS number or to prepend the last AS numbers to the AS Path. + type: str + choices: [ prepend, prepend-last-as ] + description: + description: + - The description for the action rule 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 + +notes: +- The C(tenant) and the C(action_rule) used must exist before using this module in your playbook. + The M(cisco.aci.aci_tenant) and M(cisco.aci.aci_tenant_action_rule_profile) modules can be used for this. +seealso: +- module: cisco.aci.aci_tenant +- module: cisco.aci.aci_tenant_action_rule_profile +- name: APIC Management Information Model reference + description: More information about the internal APIC class B(rtctrl:SetASPath). + link: https://developer.cisco.com/docs/apic-mim-ref/ +author: +- Dag Wieers (@dagwieers) +""" + +EXAMPLES = r""" +- name: Create a action rule profile + cisco.aci.aci_tenant_action_rule_profile: + host: apic + username: admin + password: SomeSecretPassword + action_rule: my_action_rule + tenant: prod + state: present + delegate_to: localhost + +- name: Delete a action rule profile + cisco.aci.aci_tenant_action_rule_profile: + host: apic + username: admin + password: SomeSecretPassword + action_rule: my_action_rule + tenant: prod + state: absent + delegate_to: localhost + +- name: Query all action rule profiles + cisco.aci.aci_tenant_action_rule_profile: + host: apic + username: admin + password: SomeSecretPassword + state: query + delegate_to: localhost + register: query_result + +- name: Query a specific action rule profile + cisco.aci.aci_tenant_action_rule_profile: + host: apic + username: admin + password: SomeSecretPassword + action_rule: my_action_rule + tenant: prod + 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 + + +def main(): + argument_spec = aci_argument_spec() + argument_spec.update(aci_annotation_spec()) + argument_spec.update( + tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects + action_rule=dict(type="str", aliases=["action_rule_name", "name"]), # Not required for querying all objects + last_as_number=dict(type="int"), + criteria=dict(type="str", choices=["prepend", "prepend-last-as"]), + 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", ["action_rule", "tenant", "criteria"]], + ["state", "present", ["action_rule", "tenant", "criteria"]], + ], + ) + + last_as_number = module.params.get("last_as_number") + criteria = module.params.get("criteria") + description = module.params.get("description") + state = module.params.get("state") + tenant = module.params.get("tenant") + action_rule = module.params.get("action_rule") + 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="rtctrlAttrP", + aci_rn="attr-{0}".format(action_rule), + module_object=action_rule, + target_filter={"name": action_rule}, + ), + subclass_2=dict( + aci_class="rtctrlSetASPath", + aci_rn="saspath-{0}".format(criteria), + module_object=criteria, + target_filter={"criteria": criteria}, + ), + ) + + aci.get_existing() + + if state == "present": + aci.payload( + aci_class="rtctrlSetASPath", + class_config=dict( + lastnum=last_as_number, + criteria=criteria, + descr=description, + nameAlias=name_alias, + ), + ) + + aci.get_diff(aci_class="rtctrlSetASPath") + + aci.post_config() + + elif state == "absent": + aci.delete_config() + + aci.exit_json() + + +if __name__ == "__main__": + main() diff --git a/plugins/modules/aci_action_rule_set_as_path_asn.py b/plugins/modules/aci_action_rule_set_as_path_asn.py new file mode 100644 index 000000000..1b43d1097 --- /dev/null +++ b/plugins/modules/aci_action_rule_set_as_path_asn.py @@ -0,0 +1,306 @@ +#!/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_tenant_action_rule_profile +short_description: Manage the AS Path ASN (rtctrl:SetASPathASN) +description: +- Set the ASN for the AS Path action rules on Cisco ACI fabrics. +- Only used if the AS Path action rule is set to C(prepend). +options: + tenant: + description: + - The name of the tenant. + type: str + aliases: [ tenant_name ] + action_rule: + description: + - The name of the action rule profile. + type: str + aliases: [ action_rule_name ] + asn: + description: + - The ASN number. + type: int + order: + description: + - The ASN order. + type: int + description: + description: + - The description for the action rule 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 + +notes: +- The C(tenant), the C(action_rule) and AS Path action rule used must exist before using this module in your playbook. + The M(cisco.aci.aci_tenant), M(cisco.aci.aci_tenant_action_rule_profile) and M(cisco.aci.aci_action_rule_set_as_path) modules can be used for this. +seealso: +- module: cisco.aci.aci_tenant +- module: cisco.aci.aci_tenant_action_rule_profile +- module: cisco.aci.aci_action_rule_set_as_path +- name: APIC Management Information Model reference + description: More information about the internal APIC class B(rtctrl:SetASPathASN). + link: https://developer.cisco.com/docs/apic-mim-ref/ +author: +- Dag Wieers (@dagwieers) +""" + +EXAMPLES = r""" +- name: Create a action rule profile + cisco.aci.aci_tenant_action_rule_profile: + host: apic + username: admin + password: SomeSecretPassword + action_rule: my_action_rule + tenant: prod + state: present + delegate_to: localhost + +- name: Delete a action rule profile + cisco.aci.aci_tenant_action_rule_profile: + host: apic + username: admin + password: SomeSecretPassword + action_rule: my_action_rule + tenant: prod + state: absent + delegate_to: localhost + +- name: Query all action rule profiles + cisco.aci.aci_tenant_action_rule_profile: + host: apic + username: admin + password: SomeSecretPassword + state: query + delegate_to: localhost + register: query_result + +- name: Query a specific action rule profile + cisco.aci.aci_tenant_action_rule_profile: + host: apic + username: admin + password: SomeSecretPassword + action_rule: my_action_rule + tenant: prod + 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 + + +def main(): + argument_spec = aci_argument_spec() + argument_spec.update(aci_annotation_spec()) + argument_spec.update( + tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects + action_rule=dict(type="str", aliases=["action_rule_name", "name"]), # Not required for querying all objects + asn=dict(type="int"), + order=dict(type="int"), + 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", ["action_rule", "tenant", "order"]], + ["state", "present", ["action_rule", "tenant", "order"]], + ], + ) + + asn = module.params.get("asn") + order = module.params.get("order") + description = module.params.get("description") + state = module.params.get("state") + tenant = module.params.get("tenant") + action_rule = module.params.get("action_rule") + 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="rtctrlAttrP", + aci_rn="attr-{0}".format(action_rule), + module_object=action_rule, + target_filter={"name": action_rule}, + ), + subclass_2=dict( + aci_class="rtctrlSetASPath", + aci_rn="saspath-prepend", + module_object="prepend", + target_filter={"criteria": "prepend"}, + ), + subclass_3=dict( + aci_class="rtctrlSetASPathASN", + aci_rn="asn-{0}".format(order), + module_object=order, + target_filter={"asn": order}, + ), + ) + + aci.get_existing() + + if state == "present": + aci.payload( + aci_class="rtctrlSetASPathASN", + class_config=dict( + asn=asn, + order=order, + descr=description, + nameAlias=name_alias, + ), + ) + + aci.get_diff(aci_class="rtctrlSetASPathASN") + + aci.post_config() + + elif state == "absent": + aci.delete_config() + + aci.exit_json() + + +if __name__ == "__main__": + main() diff --git a/plugins/modules/aci_tenant_action_rule_profile.py b/plugins/modules/aci_tenant_action_rule_profile.py index d044e5704..c7e0bade3 100644 --- a/plugins/modules/aci_tenant_action_rule_profile.py +++ b/plugins/modules/aci_tenant_action_rule_profile.py @@ -18,21 +18,57 @@ description: - Manage action rule profiles on Cisco ACI fabrics. options: + tenant: + description: + - The name of the tenant. + type: str + aliases: [ tenant_name ] action_rule: description: - The name of the action rule profile. type: str aliases: [ action_rule_name, name ] + set_community: + description: + - The set action rule based on communities. + type: dict + suboptions: + community: + description: + - The community value. + type: str + criteria: + description: + - The community criteria. + - The option to append or replace the community value. + type: str + choices: [ append, replace, none ] + set_dampening: + description: + -The set action rule based on dampening. + type: dict + suboptions: + half_life: + description: + - the half life value (minutes). + type: int + max_suppress_time: + description: + - the maximum suppress time value (minutes). + type: int + reuse: + description: + - the reuse limit value. + type: int + suppress: + description: + - the suppress limit value. + type: int description: description: - The description for the action rule profile. type: str aliases: [ descr ] - tenant: - description: - - The name of the tenant. - type: str - aliases: [ tenant_name ] state: description: - Use C(present) or C(absent) for adding or removing.