Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ACI tenant action rule profile extended #495

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions plugins/module_utils/aci.py
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,22 @@ def integrate_url(httpapi_url, local_path):
return {"protocol": parse_url.scheme, "host": parse_url.netloc, "path": local_path}


def action_rule_set_comm_spec():
gmicol marked this conversation as resolved.
Show resolved Hide resolved
return dict(
community=dict(type="str"),
criteria=dict(type="str", choices=["append", "none", "replace"]),
)


def action_rule_set_dampening_spec():
return dict(
half_life=dict(type="int"),
max_suppress_time=dict(type="int"),
reuse=dict(type="int"),
suppress=dict(type="int"),
)


class ACIModule(object):
def __init__(self, module):
self.module = module
Expand Down
2 changes: 2 additions & 0 deletions plugins/module_utils/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,3 +166,5 @@
consumer="vzConsSubjLbl",
provider="vzProvSubjLbl",
)

MATCH_ACTION_RULE_SET_METRIC_TYPE_MAPPING = {"ospf_type_1": "ospf-type1", "ospf_type_2": "ospf-type2", "": ""}
304 changes: 304 additions & 0 deletions plugins/modules/aci_action_rule_additional_communities.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,304 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-

# Copyright: (c) 2023, Gaspard Micol (@gmicol) <[email protected]>
# 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_action_rule_additional_communities
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 ]
gmicol marked this conversation as resolved.
Show resolved Hide resolved
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 ]
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:SetAddComm).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Gaspard Micol (@gmicol)
"""

EXAMPLES = r"""
- name: Create an additional communities action rule
cisco.aci.aci_action_rule_additional_communities:
host: apic
username: admin
password: SomeSecretPassword
action_rule: my_action_rule
tenant: prod
community: no-advertise
criteria: replace
state: present
delegate_to: localhost

- name: Delete an additional communities action rule
cisco.aci.aci_action_rule_additional_communities:
host: apic
username: admin
password: SomeSecretPassword
action_rule: my_action_rule
tenant: prod
community: no-advertise
state: absent
delegate_to: localhost

- name: Query all additional communities action rules
cisco.aci.aci_action_rule_additional_communities:
host: apic
username: admin
password: SomeSecretPassword
state: query
delegate_to: localhost
register: query_result

- name: Query an additional communities action rule
cisco.aci.aci_action_rule_additional_communities:
host: apic
username: admin
password: SomeSecretPassword
action_rule: my_action_rule
tenant: prod
community: no-advertise
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: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
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"]), # Not required for querying all objects
community=dict(type="str"),
criteria=dict(type="str", choices=["append", "replace", "none"]),
description=dict(type="str", aliases=["descr"]),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
gmicol marked this conversation as resolved.
Show resolved Hide resolved
name_alias=dict(type="str"),
)

module = AnsibleModule(
argument_spec=argument_spec,
supports_check_mode=True,
required_if=[
["state", "absent", ["action_rule", "tenant", "community"]],
["state", "present", ["action_rule", "tenant", "community"]],
],
)

community = module.params.get("community")
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")

Check warning on line 256 in plugins/modules/aci_action_rule_additional_communities.py

View check run for this annotation

Codecov / codecov/patch

plugins/modules/aci_action_rule_additional_communities.py#L250-L256

Added lines #L250 - L256 were not covered by tests

aci = ACIModule(module)
aci.construct_url(

Check warning on line 259 in plugins/modules/aci_action_rule_additional_communities.py

View check run for this annotation

Codecov / codecov/patch

plugins/modules/aci_action_rule_additional_communities.py#L258-L259

Added lines #L258 - L259 were not covered by tests
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="rtctrlSetAddComm",
aci_rn="saddcomm-{0}".format(community),
module_object=community,
target_filter={"community": community},
),
)

aci.get_existing()

Check warning on line 280 in plugins/modules/aci_action_rule_additional_communities.py

View check run for this annotation

Codecov / codecov/patch

plugins/modules/aci_action_rule_additional_communities.py#L280

Added line #L280 was not covered by tests

if state == "present":
aci.payload(

Check warning on line 283 in plugins/modules/aci_action_rule_additional_communities.py

View check run for this annotation

Codecov / codecov/patch

plugins/modules/aci_action_rule_additional_communities.py#L283

Added line #L283 was not covered by tests
aci_class="rtctrlSetAddComm",
class_config=dict(
community=community,
setCriteria=criteria,
descr=description,
nameAlias=name_alias,
),
)

aci.get_diff(aci_class="rtctrlSetAddComm")

Check warning on line 293 in plugins/modules/aci_action_rule_additional_communities.py

View check run for this annotation

Codecov / codecov/patch

plugins/modules/aci_action_rule_additional_communities.py#L293

Added line #L293 was not covered by tests

aci.post_config()

Check warning on line 295 in plugins/modules/aci_action_rule_additional_communities.py

View check run for this annotation

Codecov / codecov/patch

plugins/modules/aci_action_rule_additional_communities.py#L295

Added line #L295 was not covered by tests

elif state == "absent":
aci.delete_config()

Check warning on line 298 in plugins/modules/aci_action_rule_additional_communities.py

View check run for this annotation

Codecov / codecov/patch

plugins/modules/aci_action_rule_additional_communities.py#L298

Added line #L298 was not covered by tests

aci.exit_json()

Check warning on line 300 in plugins/modules/aci_action_rule_additional_communities.py

View check run for this annotation

Codecov / codecov/patch

plugins/modules/aci_action_rule_additional_communities.py#L300

Added line #L300 was not covered by tests


if __name__ == "__main__":
main()
Loading
Loading