diff --git a/aci_tenants.tf b/aci_tenants.tf index e70f0f45..13d434e0 100644 --- a/aci_tenants.tf +++ b/aci_tenants.tf @@ -425,6 +425,13 @@ locals { vlan = try(se.vlan, null) additional_ips = try(se.additional_ips, []) }] + static_aaeps = [for sa in try(epg.static_aaeps, []) : { + aaep = try(sa.aaep, null) + encap = try(sa.encap, null) + primary_encap = try(sa.primary_encap, null) + mode = try(sa.mode, local.defaults.apic.tenants.application_profiles.endpoint_groups.static_aaeps.mode) + deployment_immediacy = try(sa.deployment_immediacy, local.defaults.apic.tenants.application_profiles.endpoint_groups.static_aaeps.deployment_immediacy) + }] l4l7_virtual_ips = [for vip in try(epg.l4l7_virtual_ips, []) : { ip = vip.ip description = try(vip.description, "") @@ -510,6 +517,13 @@ module "aci_endpoint_group" { vlan = se.vlan additional_ips = se.additional_ips }] + static_aaeps = [for sa in try(each.value.static_aaeps, []) : { + aaep = sa.aaep + encap = sa.encap + primary_encap = sa.primary_encap + mode = sa.mode + deployment_immediacy = sa.deployment_immediacy + }] l4l7_virtual_ips = each.value.l4l7_virtual_ips l4l7_address_pools = each.value.l4l7_address_pools diff --git a/defaults/defaults.yaml b/defaults/defaults.yaml index eaa3a9c5..91dbbadd 100644 --- a/defaults/defaults.yaml +++ b/defaults/defaults.yaml @@ -1098,6 +1098,9 @@ defaults: name_suffix: "" ip: "0.0.0.0" module: 1 + static_aaeps: + deployment_immediacy: lazy + mode: regular subnets: primary_ip: false public: false diff --git a/modules/terraform-aci-endpoint-group/README.md b/modules/terraform-aci-endpoint-group/README.md index 5bc86e92..c82c9be4 100644 --- a/modules/terraform-aci-endpoint-group/README.md +++ b/modules/terraform-aci-endpoint-group/README.md @@ -149,6 +149,7 @@ module "aci_endpoint_group" { | [static\_leafs](#input\_static\_leafs) | List of static leaf switches. Allowed values `pod_id`: `1` - `255`. Default value `pod_id`: `1`. Allowed values `node_id`: `1` - `4000`. Allowed values `vlan`: `1` - `4096`. Choices `mode`: `regular`, `native`, `untagged`. Default value `mode`: `regular`. Choices `deployment_immediacy`: `immediate`, `lazy`. Default value `deployment_immediacy`: `immediate` |
list(object({| `[]` | no | | [static\_ports](#input\_static\_ports) | List of static ports. Allowed values `node_id`, `node2_id`: `1` - `4000`. Allowed values `fex_id`, `fex2_id`: `101` - `199`. Allowed values `vlan`: `1` - `4096`. Allowed values `pod_id`: `1` - `255`. Default value `pod_id`: `1`. Allowed values `port`: `1` - `127`. Allowed values `sub_port`: `1` - `16`. Allowed values `module`: `1` - `9`. Default value `module`: `1`. Choices `deployment_immediacy`: `immediate`, `lazy`. Default value `deployment_immediacy`: `lazy`. Choices `mode`: `regular`, `native`, `untagged`. Default value `mode`: `regular`. |
pod_id = optional(number, 1)
node_id = number
vlan = number
mode = optional(string, "regular")
deployment_immediacy = optional(string, "immediate")
}))
list(object({| `[]` | no | | [static\_endpoints](#input\_static\_endpoints) | List of static endpoints. Format `mac`: `12:34:56:78:9A:BC`. Choices `type`: `silent-host`, `tep`, `vep`. Allowed values `node_id`, `node2_id`: `1` - `4000`. Allowed values `vlan`: `1` - `4096`. Allowed values `pod_id`: `1` - `255`. Default value `pod_id`: `1`. Allowed values `port`: `1` - `127`. Allowed values `module`: `1` - `9`. Default value `module`: `1`. |
description = optional(string, "")
node_id = number
node2_id = optional(number)
fex_id = optional(number)
fex2_id = optional(number)
vlan = number
primary_vlan = optional(number)
pod_id = optional(number, 1)
port = optional(number)
sub_port = optional(number)
module = optional(number, 1)
channel = optional(string)
deployment_immediacy = optional(string, "lazy")
mode = optional(string, "regular")
ptp_source_ip = optional(string, "0.0.0.0")
ptp_mode = optional(string, "multicast")
ptp_profile = optional(string)
}))
list(object({| `[]` | no | +| [static\_aaeps](#input\_static\_aaeps) | List of static aaeps. Allowed values `encap`: `1` - `4096`. Allowed values `primary_encap`: `1` - `4096`. Choices `deployment_immediacy`: `immediate`, `lazy`. Default value `deployment_immediacy`: `lazy`. Choices `mode`: `regular`, `native`, `untagged`. Default value `mode`: `regular` |
name = optional(string, "")
alias = optional(string, "")
mac = string
ip = optional(string, "0.0.0.0")
type = string
node_id = optional(number)
node2_id = optional(number)
vlan = optional(number)
pod_id = optional(number, 1)
port = optional(number)
module = optional(number, 1)
channel = optional(string)
additional_ips = optional(list(string), [])
}))
list(object({| `[]` | no | | [l4l7\_virtual\_ips](#input\_l4l7\_virtual\_ips) | List of EPG L4/L7 Virtual IPs. |
aaep = string
encap = number
primary_encap = optional(number)
deployment_immediacy = optional(string, "lazy")
mode = optional(string, "regular")
}))
list(object({| `[]` | no | | [l4l7\_address\_pools](#input\_l4l7\_address\_pools) | List of EPG L4/L7 Address Pools. |
ip = string
description = optional(string, "")
}))
list(object({| `[]` | no | | [bulk\_static\_ports](#input\_bulk\_static\_ports) | Use bulk resource to configure static ports. | `bool` | `false` | no | @@ -170,6 +171,7 @@ module "aci_endpoint_group" { | [aci_rest_managed.fvEpAnycast](https://registry.terraform.io/providers/CiscoDevNet/aci/latest/docs/resources/rest_managed) | resource | | [aci_rest_managed.fvEpNlb](https://registry.terraform.io/providers/CiscoDevNet/aci/latest/docs/resources/rest_managed) | resource | | [aci_rest_managed.fvEpReachability](https://registry.terraform.io/providers/CiscoDevNet/aci/latest/docs/resources/rest_managed) | resource | +| [aci_rest_managed.fvRsAepAtt](https://registry.terraform.io/providers/CiscoDevNet/aci/latest/docs/resources/rest_managed) | resource | | [aci_rest_managed.fvRsBd](https://registry.terraform.io/providers/CiscoDevNet/aci/latest/docs/resources/rest_managed) | resource | | [aci_rest_managed.fvRsCons](https://registry.terraform.io/providers/CiscoDevNet/aci/latest/docs/resources/rest_managed) | resource | | [aci_rest_managed.fvRsConsIf](https://registry.terraform.io/providers/CiscoDevNet/aci/latest/docs/resources/rest_managed) | resource | diff --git a/modules/terraform-aci-endpoint-group/main.tf b/modules/terraform-aci-endpoint-group/main.tf index e377b792..57d89be6 100644 --- a/modules/terraform-aci-endpoint-group/main.tf +++ b/modules/terraform-aci-endpoint-group/main.tf @@ -522,6 +522,22 @@ resource "aci_rest_managed" "fvRsDomAtt_vmm" { } } +resource "aci_rest_managed" "fvRsAepAtt" { + for_each = { for sa in var.static_aaeps : sa.aaep => sa } + dn = "${aci_rest_managed.fvAEPg.dn}/rsaepAtt-${each.value.aaep}" + class_name = "fvRsAepAtt" + content = { + tnInfraAttEntityPName = each.value.aaep + encap = "vlan-${each.value.encap}" + primaryEncap = each.value.primary_encap != null ? "vlan-${each.value.primary_encap}" : "unknown" + mode = each.value.mode + instrImedcy = each.value.deployment_immediacy + } + lifecycle { + ignore_changes = [ annotation ] + } +} + resource "aci_rest_managed" "fvUplinkOrderCont" { for_each = { for vmm_vwm in var.vmware_vmm_domains : vmm_vwm.name => vmm_vwm if vmm_vwm.active_uplinks_order != "" || vmm_vwm.standby_uplinks != "" } dn = "${aci_rest_managed.fvRsDomAtt_vmm[each.key].dn}/uplinkorder" @@ -588,4 +604,3 @@ resource "aci_rest_managed" "fvnsUcastAddrBlk" { to = each.value.to } } - diff --git a/modules/terraform-aci-endpoint-group/variables.tf b/modules/terraform-aci-endpoint-group/variables.tf index d3a5861a..f055e8d7 100644 --- a/modules/terraform-aci-endpoint-group/variables.tf +++ b/modules/terraform-aci-endpoint-group/variables.tf @@ -641,6 +641,53 @@ variable "static_endpoints" { } } +variable "static_aaeps" { + description = "List of static aaeps. Allowed values `encap`: `1` - `4096`. Allowed values `primary_encap`: `1` - `4096`. Choices `deployment_immediacy`: `immediate`, `lazy`. Default value `deployment_immediacy`: `lazy`. Choices `mode`: `regular`, `native`, `untagged`. Default value `mode`: `regular`" + type = list(object({ + aaep = string + encap = number + primary_encap = optional(number) + deployment_immediacy = optional(string, "lazy") + mode = optional(string, "regular") + })) + default = [] + + validation { + condition = alltrue([ + for sa in var.static_aaeps : can(regex("^[a-zA-Z0-9_.:-]{0,64}$", sa.aaep)) + ]) + error_message = "Allowed characters: `a`-`z`, `A`-`Z`, `0`-`9`, `_`, `.`, `:`, `-`. Maximum characters: 64." + } + + validation { + condition = alltrue([ + for sa in var.static_aaeps : (sa.encap >= 1 && sa.encap <= 4096) + ]) + error_message = "`vlan`: Minimum value: `1`. Maximum value: `4096`." + } + + validation { + condition = alltrue([ + for sa in var.static_aaeps : sa.primary_encap == null || try(sa.primary_encap >= 1 && sa.primary_encap <= 4096, false) + ]) + error_message = "`primary_encap`: Minimum value: `1`. Maximum value: `4096`." + } + + validation { + condition = alltrue([ + for sa in var.static_aaeps : sa.deployment_immediacy == null || try(contains(["immediate", "lazy"], sa.deployment_immediacy), false) + ]) + error_message = "`deployment_immediacy`: Allowed values are `immediate` or `lazy`." + } + + validation { + condition = alltrue([ + for sa in var.static_aaeps : sa.mode == null || try(contains(["regular", "native", "untagged"], sa.mode), false) + ]) + error_message = "`mode`: Allowed values are `regular`, `native` or `untagged`." + } +} + variable "l4l7_virtual_ips" { description = "List of EPG L4/L7 Virtual IPs." type = list(object({
name = string
gateway_address = string
from = optional(string, "")
to = optional(string, "")
}))