diff --git a/README.md b/README.md index dd30db6..fb25a00 100644 --- a/README.md +++ b/README.md @@ -40,12 +40,12 @@ The separation of code and configuration supports DevOps key concepts for operat This repository is part of a broader collection of repositories containing modules that help customers align their OCI implementations with the CIS OCI Foundations Benchmark recommendations:
-- [Identity & Access Management ](https://github.com/oracle-quickstart/terraform-oci-cis-landing-zone-iam) -- [Networking](https://github.com/oracle-quickstart/terraform-oci-cis-landing-zone-networking) - current repository -- [Governance](https://github.com/oracle-quickstart/terraform-oci-cis-landing-zone-governance) -- [Security](https://github.com/oracle-quickstart/terraform-oci-cis-landing-zone-security) -- [Observability & Monitoring](https://github.com/oracle-quickstart/terraform-oci-cis-landing-zone-observability) -- [Secure Workloads](https://github.com/oracle-quickstart/terraform-oci-secure-workloads) +- [Identity & Access Management ](https://github.com/oci-landing-zones/terraform-oci-modules-iam) +- [Networking](https://github.com/oci-landing-zones/terraform-oci-modules-networking) - current repository +- [Governance](https://github.com/oci-landing-zones/terraform-oci-modules-governance) +- [Security](https://github.com/github.com/oci-landing-zones/terraform-oci-modules-security) +- [Observability & Monitoring](https://github.com/oci-landing-zones/terraform-oci-modules-observability) +- [Secure Workloads](https://github.com/oci-landing-zones/terraform-oci-modules-workloads) The modules in this collection are designed for flexibility, are straightforward to use, and enforce CIS OCI Foundations Benchmark recommendations when possible.
@@ -83,32 +83,30 @@ module "terraform-oci-landing-zones-networking" { For invoking the module remotely, set the module *source* attribute to the networking module repository, as shown: ``` -module "terraform-oci-cis-landing-zone-networking" { - source = "github.com/oracle-quickstart/terraform-oci-cis-landing-zone-networking" +module "terraform-oci-landing-zone-networking" { + source = "github.com/oci-landing-zones/terraform-oci-modules-networking" network_configuration = var.network_configuration } ``` For referring to a specific module version, append *ref=\* to the *source* attribute value, as in: ``` - source = "github.com/oracle-quickstart/terraform-oci-cis-landing-zone-networking?ref=v0.1.0" + source = "github.com/oci-landing-zones/terraform-oci-modules-networking?ref=v0.1.0" ``` ### Using the Module with Resource Manager For an ad-hoc use where you can select your resources, follow these guidelines: -1. [![Deploy_To_OCI](images/DeployToOCI.svg)](https://cloud.oracle.com/resourcemanager/stacks/create?zipUrl=https://github.com/oracle-quickstart/terraform-oci-cis-landing-zone-networking/archive/refs/heads/main.zip) +1. [![Deploy_To_OCI](images/DeployToOCI.svg)](https://cloud.oracle.com/resourcemanager/stacks/create?zipUrl=https://github.com/oci-landing-zones/terraform-oci-modules-networking/archive/refs/heads/main.zip) 2. Accept terms, wait for the configuration to load. 3. Set the working directory to “orm-facade”. 4. Set the stack name you prefer. -5. Set the terraform version to 1.2.x. Click Next. -6. Add your json/yaml configuration files. Click Next. -8. Un-check run apply. Click Create. +5. Add your JSON/YAML configuration files. Click Next. +6. Un-check run apply. Click Create. ## Module Functioning The input parameters for the module can be divided into two categories, for which we recommend to create two different ```*.tfvars.*``` files: -The input parameters for the module can be divided into two categories, for which we recommend to create two different ```*.tfvars.*``` files: - 1. OCI REST API authentication information (secrets) - ```terraform.tfvars``` (HCL) or ```terraform.tfvars.json``` (JSON): +1. OCI REST API authentication information (secrets) - ```terraform.tfvars``` (HCL) or ```terraform.tfvars.json``` (JSON): - ```tenancy_ocid``` - ```user_ocid``` - ```fingerprint``` @@ -283,7 +281,7 @@ Attributes that support a compartment referring key: - *compartment_id* #### network_dependency (Optional) -A map of map of objects containing the externally managed network resources this module may depend on. This mechanism allows for the usage of referring keys (instead of OCIDs) in some attributes. The module replaces the keys by the OCIDs provided within *network_dependency* map. Contents of *network_dependency* is typically the output of a client of this module. Within *network_dependency*, VCNs must be indexed with the **vcns** key, DRGs indexed with the **dynamic_routing_gateways** key, DRG attachments indexed with **drg_attachments** key, Local Peering Gateways (LPG) indexed with **local_peering_gateways**, Remote Peering Connections (RPC) indexed with **remote_peering_connections** key. Each VCN, DRG, DRG attachment, LPG and RPC must contain the *id* attribute (to which the actual OCID is assigned). RPCs must also pass the peer region name in the *region_name* attribute. +A map of map of objects containing the externally managed network resources this module may depend on. This mechanism allows for the usage of referring keys (instead of OCIDs) in some attributes. The module replaces the keys by the OCIDs provided within *network_dependency* map. Contents of *network_dependency* is typically the output of a client of this module. Within *network_dependency*, VCNs must be indexed with the **vcns** key, DRGs indexed with the **dynamic_routing_gateways** key, DRG attachments indexed with **drg_attachments** key, Local Peering Gateways (LPG) indexed with **local_peering_gateways**, Remote Peering Connections (RPC) indexed with **remote_peering_connections** key, DNS Private Views indexed by **dns_private_views**. Each VCN, DRG, DRG attachment, LPG, RPC and DNS Private View must contain the *id* attribute (to which the actual OCID is assigned). RPCs must also pass the peer region name in the *region_name* attribute. *network_dependency* example: ``` @@ -314,9 +312,14 @@ A map of map of objects containing the externally managed network resources this "region_name" : "us-ashburn-1" } } + "dns_private_views" : { + "XYZ-DNS-VIEW" : { + "id" : "ocid1.dnsview.oc1.phx.aaaaaaaa...nhq", + } + } } ``` -**Note**: **vcns**, **dynamic_routing_gateways**, **drg_attachments**, **local_peering_gateways**, and **remote_peering_connections** attributes are all optional. They only become mandatory if the *network_configuration* refers to one of these resources through a referring key. Below are the attributes where a referring key is supported: +**Note**: **vcns**, **dynamic_routing_gateways**, **drg_attachments**, **local_peering_gateways**, **remote_peering_connections** and **dns_private_views** attributes are all optional. They only become mandatory if the *network_configuration* refers to one of these resources through a referring key. Below are the attributes where a referring key is supported: *network_dependency* attribute | Attribute names in *network_configuration* where the referring key can be utilized --------------|------------- @@ -325,6 +328,7 @@ A map of map of objects containing the externally managed network resources this **drg_attachments** | *drg_attachment_key* **local_peering_gateways** | *peer_key* in *local_peering_gateways* **remote_peering_connections** | *peer_key* in *remote_peering_connections* +**dns_private_views** | *existing_view_id* in *dns_resolver's* *attached_views*. #### private_ips_dependency (Optional) A map of map of objects containing the externally managed private IP resources this module may depend on. This mechanism allows for the usage of referring keys (instead of OCIDs) in some attributes. The module replaces the keys by the OCIDs provided within *private_ips_dependency* map. Each private IP must contain the **"id"** attribute (to which the actual OCID is assigned), as in the example below: @@ -379,9 +383,6 @@ See [external-dependency example](./examples/external-dependency/) for a functio - [IPSec VPN Examples](examples/edge-connectivity/ipsec-examples/) - [Generic OCI IPSec BGP VPN](examples/edge-connectivity/ipsec-examples/generic-OCI-ipsec-bgp-vpn/) - [Local Peering Gateways](examples/local-peering-gateways/) -- [Remote Peering Connections](examples/remote-peering-connections/) - - [Generic OCI IPSec BGP VPN](examples/edge-connectivity/ipsec-examples/generic-OCI-ipsec-bgp-vpn/) -- [Local Peering Gateways](examples/local-peering-gateways/) - [Remote Peering Connections](examples/remote-peering-connections/) ## Related Documentation diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 26a5a47..113020f 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,3 +1,9 @@ +# September 20, 2024 Release Notes - 0.7.0 + +## Updates +1. OCI Network Firewall refactored according to updates post Terraform OCI Provider 5.16.0 release. See [oci-network-firewall example](./examples/oci-network-firewall/). +2. Ability to inject externally managed existing private DNS views into managed DNS resolvers. See [dns-view-injection example](./examples/dns-view-injection/). + # August 28, 2024 Release Notes - 0.6.9 ## Updates diff --git a/SPEC.md b/SPEC.md index 5e785db..65bca2a 100644 --- a/SPEC.md +++ b/SPEC.md @@ -75,10 +75,13 @@ | [oci_network_firewall_network_firewall_policy.these](https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/network_firewall_network_firewall_policy) | resource | | [oci_network_firewall_network_firewall_policy_address_list.these](https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/network_firewall_network_firewall_policy_address_list) | resource | | [oci_network_firewall_network_firewall_policy_application.these](https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/network_firewall_network_firewall_policy_application) | resource | +| [oci_network_firewall_network_firewall_policy_application_group.these](https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/network_firewall_network_firewall_policy_application_group) | resource | | [oci_network_firewall_network_firewall_policy_decryption_profile.these](https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/network_firewall_network_firewall_policy_decryption_profile) | resource | | [oci_network_firewall_network_firewall_policy_decryption_rule.these](https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/network_firewall_network_firewall_policy_decryption_rule) | resource | | [oci_network_firewall_network_firewall_policy_mapped_secret.these](https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/network_firewall_network_firewall_policy_mapped_secret) | resource | | [oci_network_firewall_network_firewall_policy_security_rule.these](https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/network_firewall_network_firewall_policy_security_rule) | resource | +| [oci_network_firewall_network_firewall_policy_service.these](https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/network_firewall_network_firewall_policy_service) | resource | +| [oci_network_firewall_network_firewall_policy_service_list.these](https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/network_firewall_network_firewall_policy_service_list) | resource | | [oci_network_firewall_network_firewall_policy_url_list.these](https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/network_firewall_network_firewall_policy_url_list) | resource | | [time_sleep.wait_for_dns_resolver](https://registry.terraform.io/providers/hashicorp/time/latest/docs/resources/sleep) | resource | | [oci_core_cpe_device_shapes.cpe_device_shapes](https://registry.terraform.io/providers/oracle/oci/latest/docs/data-sources/core_cpe_device_shapes) | data source | @@ -99,8 +102,8 @@ |------|-------------|------|---------|:--------:| | [compartments\_dependency](#input\_compartments\_dependency) | A map of objects containing the externally managed compartments this module may depend on. All map objects must have the same type and must contain an 'id' attribute of string type set with the compartment OCID. See External Dependencies section in README.md (https://github.com/oracle-quickstart/terraform-oci-cis-landing-zone-networking#ext-dep) for details. |
map(object({
id = string
}))
| `null` | no | | [module\_name](#input\_module\_name) | The module name. | `string` | `"networking"` | no | -| [network\_configuration](#input\_network\_configuration) | n/a |
object({
default_compartment_id = optional(string),
default_defined_tags = optional(map(string)),
default_freeform_tags = optional(map(string)),
default_enable_cis_checks = optional(bool),
default_ssh_ports_to_check = optional(list(number)),

network_configuration_categories = optional(map(object({
category_compartment_id = optional(string),
category_defined_tags = optional(map(string)),
category_freeform_tags = optional(map(string)),
category_enable_cis_checks = optional(bool),
category_ssh_ports_to_check = optional(list(number)),

vcns = optional(map(object({
compartment_id = optional(string),
display_name = optional(string),
byoipv6cidr_details = optional(map(object({
byoipv6range_id = string
ipv6cidr_block = string
})))
ipv6private_cidr_blocks = optional(list(string)),
is_ipv6enabled = optional(bool),
is_oracle_gua_allocation_enabled = optional(bool),
cidr_blocks = optional(list(string)),
dns_label = optional(string),
block_nat_traffic = optional(bool),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),

default_security_list = optional(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
ingress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
src = string,
src_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
}))),
egress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
dst = string,
dst_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
})))
}))

security_lists = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
display_name = optional(string),
ingress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
src = string,
src_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
}))),
egress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
dst = string,
dst_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
})))
})))

default_route_table = optional(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
display_name = optional(string),
route_rules = optional(map(object({
network_entity_id = optional(string),
network_entity_key = optional(string),
description = optional(string),
// Supported values:
// - "a cidr block"
// - "objectstorage" or "all-services" - only for "SERVICE_CIDR_BLOCK"
destination = optional(string),
// Supported values:
// - "CIDR_BLOCK"
// - "SERVICE_CIDR_BLOCK" - only for SGW
destination_type = optional(string),
})))
}))

route_tables = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
display_name = optional(string),
route_rules = optional(map(object({
network_entity_id = optional(string),
network_entity_key = optional(string),
description = optional(string),
// Supported values:
// - "a cidr block"
// - "objectstorage" or "all-services" - only for "SERVICE_CIDR_BLOCK"
destination = optional(string),
// Supported values:
// - "CIDR_BLOCK"
// - "SERVICE_CIDR_BLOCK" - only for SGW
destination_type = optional(string),
})))
})))

default_dhcp_options = optional(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
domain_name_type = optional(string),
options = map(object({
type = string,
server_type = optional(string),
custom_dns_servers = optional(list(string))
search_domain_names = optional(list(string))
}))
}))

dhcp_options = optional(map(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
domain_name_type = optional(string),
options = map(object({
type = string,
server_type = optional(string),
custom_dns_servers = optional(list(string))
search_domain_names = optional(list(string))
}))
})))

subnets = optional(map(object({
cidr_block = string,
compartment_id = optional(string),
#Optional
availability_domain = optional(string),
defined_tags = optional(map(string)),
dhcp_options_key = optional(string),
display_name = optional(string),
dns_label = optional(string),
freeform_tags = optional(map(string)),
ipv6cidr_block = optional(string),
ipv6cidr_blocks = optional(list(string)),
prohibit_internet_ingress = optional(bool),
prohibit_public_ip_on_vnic = optional(bool),
route_table_key = optional(string),
security_list_keys = optional(list(string))
})))

network_security_groups = optional(map(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string))
freeform_tags = optional(map(string))
ingress_rules = optional(map(object({
description = optional(string),
protocol = string,
stateless = optional(bool),
src = optional(string),
src_type = optional(string),
dst_port_min = optional(number),
dst_port_max = optional(number),
src_port_min = optional(number),
src_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
}))),
egress_rules = optional(map(object({
description = optional(string),
protocol = string,
stateless = optional(bool),
dst = optional(string),
dst_type = optional(string),
dst_port_min = optional(number),
dst_port_max = optional(number),
src_port_min = optional(number),
src_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
})))
})))
dns_resolver = optional(object({
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
attached_views = optional(map(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
dns_zones = optional(map(object({
compartment_id = optional(string),
name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
scope = optional(string),
zone_type = optional(string),
external_downstreams = optional(list(object({
address = optional(string),
ports = optional(string),
tsig_key = optional(string),
}))),
external_masters = optional(list(object({
address = optional(string),
port = optional(string),
tsig_key = optional(string),
}))),
dns_records = optional(map(object({
domain = optional(string),
compartment_id = optional(string),
rtype = optional(string),
rdata = optional(string),
ttl = optional(number),
})))
dns_rrset = optional(map(object({
compartment_id = optional(string)
domain = optional(string),
rtype = optional(string),
scope = optional(string),
items = optional(list(object({
domain = optional(string),
rdata = optional(string),
rtype = optional(string),
ttl = optional(string),
})))
})))
dns_steering_policies = optional(map(object({
compartment_id = optional(string),
domain_name = optional(string),
display_name = optional(string),
template = optional(string),
answers = optional(list(object({
name = optional(string),
rdata = optional(string),
rtype = optional(string),
is_disabled = optional(bool),
pool = optional(string),
}))),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
health_check_monitor_id = optional(string)
rules = optional(list(object({
rule_type = optional(string)
cases = optional(list(object({
answer_data = optional(object({
answer_condition = optional(string)
should_keep = optional(string)
value = optional(string)
})),
case_condition = optional(string),
count = optional(number)
}))),
default_answer_data = optional(object({
answer_condition = optional(string),
should_keep = optional(bool),
value = optional(string),
})),
default_count = optional(number),
description = optional(string),
}))),
ttl = optional(string),
}))),
}))),
}))),
rules = optional(list(object({
action = optional(string),
destination_address = optional(list(string)),
source_endpoint_name = optional(string),
client_address_conditions = optional(list(string)),
qname_cover_conditions = optional(list(string)),
}))),
resolver_endpoints = optional(map(object({
name = optional(string),
is_forwarding = optional(string),
is_listening = optional(string),
subnet = optional(string),
endpoint_type = optional(string),
forwarding_address = optional(string),
listening_address = optional(string),
nsg = optional(list(string)),
}))),
tsig_keys = optional(map(object({
compartment_id = optional(string),
algorithm = optional(string),
name = optional(string),
secret = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
}))),
}))

vcn_specific_gateways = optional(object({
internet_gateways = optional(map(object({
compartment_id = optional(string),
enabled = optional(bool),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
route_table_key = optional(string)
})))

nat_gateways = optional(map(object({
compartment_id = optional(string),
block_traffic = optional(bool),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
public_ip_id = optional(string),
route_table_key = optional(string)
})))

service_gateways = optional(map(object({
compartment_id = optional(string),
// SGW services value:
// - objectstorage - for object storage access
// - all-services - for all OCI internal network services access
services = string,
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
route_table_key = optional(string)
})))

local_peering_gateways = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
peer_id = optional(string),
peer_key = optional(string),
route_table_key = optional(string)
})))
}))
})))

inject_into_existing_vcns = optional(map(object({

vcn_id = string,

default_security_list = optional(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
ingress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
src = string,
src_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
}))),
egress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
dst = string,
dst_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
})))
}))

security_lists = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
display_name = optional(string),
ingress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
src = string,
src_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
}))),
egress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
dst = string,
dst_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
})))
})))

default_route_table = optional(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
display_name = optional(string),
route_rules = optional(map(object({
network_entity_id = optional(string),
network_entity_key = optional(string),
description = optional(string),
// Supported values:
// - "a cidr block"
// - "objectstorage" or "all-services" - only for "SERVICE_CIDR_BLOCK"
destination = optional(string),
// Supported values:
// - "CIDR_BLOCK"
// - "SERVICE_CIDR_BLOCK" - only for SGW
destination_type = optional(string),
})))
}))

route_tables = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
display_name = optional(string),
route_rules = optional(map(object({
network_entity_id = optional(string),
network_entity_key = optional(string),
description = optional(string),
// Supported values:
// - "a cidr block"
// - "objectstorage" or "all-services" - only for "SERVICE_CIDR_BLOCK"
destination = optional(string),
// Supported values:
// - "CIDR_BLOCK"
// - "SERVICE_CIDR_BLOCK" - only for SGW
destination_type = optional(string)
})))
})))

default_dhcp_options = optional(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
domain_name_type = optional(string),
options = map(object({
type = string,
server_type = optional(string),
custom_dns_servers = optional(list(string))
search_domain_names = optional(list(string))
}))
}))

dhcp_options = optional(map(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
domain_name_type = optional(string),
options = map(object({
type = string,
server_type = optional(string),
custom_dns_servers = optional(list(string))
search_domain_names = optional(list(string))
}))
})))

subnets = optional(map(object({
cidr_block = string,
compartment_id = optional(string),
#Optional
availability_domain = optional(string),
defined_tags = optional(map(string)),
dhcp_options_id = optional(string),
dhcp_options_key = optional(string),
display_name = optional(string),
dns_label = optional(string),
freeform_tags = optional(map(string)),
ipv6cidr_block = optional(string),
ipv6cidr_blocks = optional(list(string)),
prohibit_internet_ingress = optional(bool),
prohibit_public_ip_on_vnic = optional(bool),
route_table_id = optional(string),
route_table_key = optional(string),
security_list_ids = optional(list(string)),
security_list_keys = optional(list(string))
})))

network_security_groups = optional(map(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string))
freeform_tags = optional(map(string))
ingress_rules = optional(map(object({
description = optional(string),
protocol = string,
stateless = optional(bool),
src = optional(string),
src_type = optional(string),
dst_port_min = number,
dst_port_max = number,
src_port_min = optional(number),
src_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
}))),
egress_rules = optional(map(object({
description = optional(string),
protocol = string,
stateless = optional(bool),
dst = optional(string),
dst_type = optional(string),
dst_port_min = optional(number),
dst_port_max = optional(number),
src_port_min = optional(number),
src_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
})))
})))

dns_resolver = optional(object({
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
attached_views = optional(map(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
dns_zones = optional(map(object({
compartment_id = optional(string),
name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
scope = optional(string),
zone_type = optional(string),
external_downstreams = optional(list(object({
address = optional(string),
ports = optional(string),
tsig_key = optional(string),
}))),
external_masters = optional(list(object({
address = optional(string),
port = optional(string),
tsig_key = optional(string),
}))),
dns_records = optional(map(object({
domain = optional(string),
compartment_id = optional(string),
rtype = optional(string),
rdata = optional(string),
ttl = optional(string),
})))
dns_rrset = optional(map(object({
domain = optional(string),
rtype = optional(string),
scope = optional(string),
items = optional(list(object({
domain = optional(string),
rdata = optional(string),
rtype = optional(string),
ttl = optional(string),
})))
})))
dns_steering_policies = optional(map(object({
compartment_id = optional(string),
domain_name = optional(string),
display_name = optional(string),
template = optional(string),
answers = optional(list(object({
name = optional(string),
rdata = optional(string),
rtype = optional(string),
is_disabled = optional(bool),
pool = optional(string),
}))),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
health_check_monitor_id = optional(string)
rules = optional(list(object({
rule_type = optional(string)
cases = optional(list(object({
answer_data = optional(object({
answer_condition = optional(string)
should_keep = optional(string)
value = optional(string)
})),
case_condition = optional(string),
count = optional(number)
}))),
default_answer_data = optional(object({
answer_condition = optional(string),
should_keep = optional(bool),
value = optional(string),
})),
default_count = optional(number),
description = optional(string),
}))),
ttl = optional(string),
}))),
}))),
}))),
rules = optional(list(object({
action = optional(string),
destination_address = optional(string),
source_endpoint_name = optional(string),
client_address_condition = optional(string),
qname_cover_condtions = optional(string),
}))),
resolver_endpoints = optional(map(object({
name = optional(string),
is_forwarding = optional(bool),
is_listening = optional(bool),
subnet = optional(string),
endpoint_type = optional(string),
forwarding_address = optional(string),
listening_address = optional(string),
nsg = optional(string),
}))),
tsig_keys = optional(map(object({
compartment_id = optional(string),
algorithm = optional(string),
name = optional(string),
secret = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
}))),
}))

vcn_specific_gateways = optional(object({
internet_gateways = optional(map(object({
compartment_id = optional(string),
enabled = optional(bool),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
route_table_id = optional(string),
route_table_key = optional(string)
})))

nat_gateways = optional(map(object({
compartment_id = optional(string),
block_traffic = optional(bool),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
public_ip_id = optional(string),
route_table_id = optional(string),
route_table_key = optional(string)
})))

service_gateways = optional(map(object({
compartment_id = optional(string),
// SGW services value:
// - objectstorage - for object storage access
// - all-services - for all OCI internal network services access
services = string,
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
route_table_id = optional(string),
route_table_key = optional(string)
})))

local_peering_gateways = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
peer_id = optional(string),
peer_key = optional(string),
route_table_id = optional(string),
route_table_key = optional(string)
})))
}))
})))

IPs = optional(object({

public_ips_pools = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
})))

public_ips = optional(map(object({
compartment_id = optional(string),
lifetime = string,
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
private_ip_id = optional(string),
public_ip_pool_id = optional(string),
public_ip_pool_key = optional(string)
})))
}))



non_vcn_specific_gateways = optional(object({

dynamic_routing_gateways = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),

remote_peering_connections = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
peer_id = optional(string),
peer_key = optional(string),
peer_region_name = optional(string)
})))

drg_attachments = optional(map(object({
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
drg_route_table_id = optional(string),
drg_route_table_key = optional(string),
network_details = optional(object({
attached_resource_id = optional(string),
attached_resource_key = optional(string),
type = string,
route_table_id = optional(string),
route_table_key = optional(string),
vcn_route_type = optional(string)
}))
})))

drg_route_tables = optional(map(object({
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
import_drg_route_distribution_id = optional(string),
import_drg_route_distribution_key = optional(string),
is_ecmp_enabled = optional(bool),
route_rules = optional(map(object({
destination = string,
destination_type = string,
next_hop_drg_attachment_id = optional(string),
next_hop_drg_attachment_key = optional(string),
})))
})))

drg_route_distributions = optional(map(object({
distribution_type = string,
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string))
statements = optional(map(object({
action = string,
match_criteria = optional(object({
match_type = string,
attachment_type = optional(string),
drg_attachment_id = optional(string),
drg_attachment_key = optional(string)
}))
priority = optional(number)
})))
})))
})))

customer_premises_equipments = optional(map(object({
compartment_id = optional(string),
ip_address = string,
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
cpe_device_shape_id = optional(string),
cpe_device_shape_vendor_name = optional(string)
})))

ipsecs = optional(map(object({
compartment_id = optional(string),
cpe_id = optional(string),
cpe_key = optional(string),
drg_id = optional(string),
drg_key = optional(string),
static_routes = list(string),
cpe_local_identifier = optional(string),
cpe_local_identifier_type = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
tunnels_management = optional(object({
tunnel_1 = optional(object({
routing = string,
bgp_session_info = optional(object({
customer_bgp_asn = optional(string),
customer_interface_ip = optional(string),
oracle_interface_ip = optional(string)
}))
encryption_domain_config = optional(object({
cpe_traffic_selector = optional(string),
oracle_traffic_selector = optional(string)
}))
shared_secret = optional(string),
ike_version = optional(string)
})),
tunnel_2 = optional(object({
routing = string,
bgp_session_info = optional(object({
customer_bgp_asn = optional(string),
customer_interface_ip = optional(string),
oracle_interface_ip = optional(string)
}))
encryption_domain_config = optional(object({
cpe_traffic_selector = optional(string),
oracle_traffic_selector = optional(string)
}))
shared_secret = optional(string),
ike_version = optional(string)
}))
}))
})))

fast_connect_virtual_circuits = optional(map(object({
#Required
compartment_id = optional(string),
provision_fc_virtual_circuit = bool,
show_available_fc_virtual_circuit_providers = bool,
type = string,
#Optional
bandwidth_shape_name = optional(string),
bgp_admin_state = optional(string),
cross_connect_mappings = optional(map(object({
#Optional
bgp_md5auth_key = optional(string)
cross_connect_or_cross_connect_group_id = optional(string)
cross_connect_or_cross_connect_group_key = optional(string)
customer_bgp_peering_ip = optional(string)
customer_bgp_peering_ipv6 = optional(string)
oracle_bgp_peering_ip = optional(string)
oracle_bgp_peering_ipv6 = optional(string)
vlan = optional(string)
})))
customer_asn = optional(string)
defined_tags = optional(map(string))
display_name = optional(string)
freeform_tags = optional(map(string))
ip_mtu = optional(number)
is_bfd_enabled = optional(bool)
gateway_id = optional(string)
gateway_key = optional(string)
provider_service_id = optional(string)
provider_service_key = optional(string)
provider_service_key_name = optional(string)
public_prefixes = optional(map(object({
#Required
cidr_block = string,
})))
region = optional(string)
routing_policy = optional(list(string))
})))

cross_connect_groups = optional(map(object({
compartment_id = optional(string),
customer_reference_name = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
cross_connects = optional(map(object({
compartment_id = optional(string),
location_name = string,
port_speed_shape_name = string,
customer_reference_name = optional(string),
defined_tags = optional(map(string))
display_name = optional(string),
far_cross_connect_or_cross_connect_group_id = optional(string),
far_cross_connect_or_cross_connect_group_key = optional(string),
freeform_tags = optional(map(string))
near_cross_connect_or_cross_connect_group_id = optional(string),
near_cross_connect_or_cross_connect_group_key = optional(string),
})))
})))

inject_into_existing_drgs = optional(map(object({
drg_id = string,

remote_peering_connections = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
peer_id = optional(string),
peer_key = optional(string),
peer_region_name = optional(string)
})))

drg_attachments = optional(map(object({
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
drg_route_table_id = optional(string),
drg_route_table_key = optional(string),
network_details = optional(object({
attached_resource_id = optional(string),
attached_resource_key = optional(string),
type = string,
route_table_id = optional(string),
route_table_key = optional(string),
vcn_route_type = optional(string)
}))
})))

drg_route_tables = optional(map(object({
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
import_drg_route_distribution_id = optional(string),
import_drg_route_distribution_key = optional(string),
is_ecmp_enabled = optional(bool),
route_rules = optional(map(object({
destination = string,
destination_type = string,
next_hop_drg_attachment_id = optional(string),
next_hop_drg_attachment_key = optional(string),
})))
})))

drg_route_distributions = optional(map(object({
distribution_type = string,
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string))
statements = optional(map(object({
action = string,
match_criteria = optional(object({
match_type = string,
attachment_type = optional(string),
drg_attachment_id = optional(string),
drg_attachment_key = optional(string)
}))
priority = number
})))
})))
})))

network_firewalls_configuration = optional(object({
network_firewalls = optional(map(object({
availability_domain = optional(number),
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
ipv4address = optional(string),
ipv6address = optional(string),
network_security_group_ids = optional(list(string)),
network_security_group_keys = optional(list(string)),
subnet_id = optional(string),
subnet_key = optional(string),
network_firewall_policy_id = optional(string),
network_firewall_policy_key = optional(string)
}))),

network_firewall_policies = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
# application_lists = optional(map(object({
# application_list_name = string,
# application_values = map(object({
# type = string,
# icmp_type = optional(string),
# icmp_code = optional(string),
# minimum_port = optional(number),
# maximum_port = optional(number)
# }))
# })))
applications = optional(map(object({
name = string,
type = string,
icmp_type = optional(string),
icmp_code = optional(string),
})))
decryption_profiles = optional(map(object({
type = string, # Valid values: "SSL_FORWARD_PROXY", "SSL_INBOUND_INSPECTION"
name = string,
is_out_of_capacity_blocked = optional(bool),
is_unsupported_cipher_blocked = optional(bool),
is_unsupported_version_blocked = optional(bool),
are_certificate_extensions_restricted = optional(bool), # Applicable only when type = "SSL_FORWARD_PROXY"
is_auto_include_alt_name = optional(bool), # Applicable only when type = "SSL_FORWARD_PROXY"
is_expired_certificate_blocked = optional(bool), # Applicable only when type = "SSL_FORWARD_PROXY"
is_revocation_status_timeout_blocked = optional(bool), # Applicable only when type = "SSL_FORWARD_PROXY"
is_unknown_revocation_status_blocked = optional(bool), # Applicable only when type = "SSL_FORWARD_PROXY"
is_untrusted_issuer_blocked = optional(bool) # Applicable only when type = "SSL_FORWARD_PROXY"
})))
ip_address_lists = optional(map(object({
name = string,
type = string, # Valid values: "FQND", "IP"
addresses = list(string)
})))
decryption_rules = optional(map(object({
name = string,
action = string,
decryption_profile_id = optional(string),
secret = optional(string),
destination_ip_address_list = optional(string),
source_ip_address_list = optional(string)
})))
mapped_secrets = optional(map(object({
name = string,
type = string, # Valid values: SSL_FORWARD_PROXY, SSL_INBOUND_INSPECTION
source = string, # Valid value: OCI_VAULT
vault_secret_id = string,
version_number = string,
})))
security_rules = optional(map(object({
action = string, # Valid values: ALLOW,DROP,REJECT,INSPECT
name = string,
application = optional(list(string)),
destination_address = optional(list(string)),
service = optional(list(string)),
source_address = optional(list(string)),
url = optional(list(string)),
inspection = optional(string), # This is only applicable if action is INSPECT
after_rule = optional(string),
before_rule = optional(string)
})))
url_lists = optional(map(object({
name = string,
pattern = string,
type = string # Valid value: SIMPLE
})))
})))
}))

l7_load_balancers = optional(map(object({
compartment_id = optional(string),
display_name = string,
shape = string,
subnet_ids = list(string),
subnet_keys = list(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
ip_mode = optional(string),
is_private = optional(bool),
network_security_group_ids = optional(list(string)),
network_security_group_keys = optional(list(string)),
reserved_ips_ids = optional(list(string)),
reserved_ips_keys = optional(list(string))
shape_details = optional(object({
maximum_bandwidth_in_mbps = number,
minimum_bandwidth_in_mbps = number
}))
backend_sets = optional(map(object({
health_checker = object({
protocol = string,
interval_ms = number,
is_force_plain_text = bool,
port = number,
response_body_regex = optional(string),
retries = number,
return_code = number,
timeout_in_millis = number,
url_path = optional(string)
})
name = string,
policy = string,
lb_cookie_session_persistence_configuration = optional(object({
cookie_name = optional(string),
disable_fallback = optional(bool),
domain = optional(string),
is_http_only = optional(bool),
is_secure = optional(bool),
max_age_in_seconds = optional(number),
path = optional(string),
}))
session_persistence_configuration = optional(object({
cookie_name = string,
disable_fallback = optional(bool)
}))
ssl_configuration = optional(object({
certificate_ids = optional(list(string)),
certificate_keys = optional(list(string)),
certificate_name = optional(string),
cipher_suite_name = optional(string),
protocols = optional(list(string)),
server_order_preference = optional(string),
trusted_certificate_authority_ids = optional(list(string)),
trusted_certificate_authority_keys = optional(list(string)),
verify_depth = optional(number),
verify_peer_certificate = optional(bool),
}))
backends = optional(map(object({
ip_address = string,
port = number,
backup = optional(bool),
drain = optional(bool),
offline = optional(bool),
weight = optional(number)
})))
})))
cipher_suites = optional(map(object({
ciphers = list(string),
name = string
})))
path_route_sets = optional(map(object({
name = string,
path_routes = map(object({
backend_set_key = string,
path = string,
path_match_type = object({
match_type = string
})
}))
})))
host_names = optional(map(object({
hostname = string,
name = string
})))
routing_policies = optional(map(object({
condition_language_version = string,
name = string,
rules = map(object({
actions = map(object({
backend_set_key = string,
name = string,
}))
condition = string,
name = string
}))
})))
rule_sets = optional(map(object({
name = string,
items = map(object({
action = string,
allowed_methods = optional(list(string)),
are_invalid_characters_allowed = optional(bool),
conditions = optional(map(object({
attribute_name = string,
attribute_value = string,
operator = optional(string)
})))
description = optional(string),
header = optional(string),
http_large_header_size_in_kb = optional(number),
prefix = optional(string),
redirect_uri = optional(object({
host = optional(string, )
path = optional(string),
port = optional(number),
protocol = optional(string),
query = optional(string)
}))
response_code = optional(number)
status_code = optional(number),
suffix = optional(string),
value = optional(string)
}))
})))
certificates = optional(map(object({
#Required
certificate_name = string,
#Optional
ca_certificate = optional(string),
passphrase = optional(string),
private_key = optional(string),
public_certificate = optional(string)
})))
listeners = optional(map(object({
default_backend_set_key = string,
name = string,
port = string,
protocol = string,
connection_configuration = optional(object({
idle_timeout_in_seconds = number,
backend_tcp_proxy_protocol_version = optional(string)
}))
hostname_keys = optional(list(string)),
path_route_set_key = optional(string),
routing_policy_key = optional(string),
rule_set_keys = optional(list(string)),
ssl_configuration = optional(object({
certificate_key = optional(string),
certificate_ids = optional(list(string)),
cipher_suite_key = optional(string),
protocols = optional(list(string)),
server_order_preference = optional(string),
trusted_certificate_authority_ids = optional(list(string)),
verify_depth = optional(number),
verify_peer_certificate = optional(bool)
}))
})))
})))
}))
}
)))
})
| n/a | yes | -| [network\_dependency](#input\_network\_dependency) | An object containing the externally managed network resources this module may depend on. Supported resources are 'vcns', 'dynamic\_routing\_gateways', 'drg\_attachments', 'local\_peering\_gateways', and 'remote\_peering\_connections', represented as map of objects. Each object, when defined, must have an 'id' attribute of string type set with the VCN, DRG OCID, DRG Attachment OCID, Local Peering Gateway OCID or Remote Peering Connection OCID. 'remote\_peering\_connections' must also pass the peer region name in the region\_name attribute. See External Dependencies section in README.md (https://github.com/oracle-quickstart/terraform-oci-cis-landing-zone-networking#ext-dep) for details. |
object({
vcns = optional(map(object({
id = string # the VCN OCID
})))
dynamic_routing_gateways = optional(map(object({
id = string # the DRG OCID
})))
drg_attachments = optional(map(object({
id = string # the DRG attachment OCID
})))
local_peering_gateways = optional(map(object({
id = string # the LPG OCID
})))
remote_peering_connections = optional(map(object({
id = string # the peer RPC OCID
region_name = string # the peer RPC region name
})))
})
| `null` | no | +| [network\_configuration](#input\_network\_configuration) | n/a |
object({
default_compartment_id = optional(string),
default_defined_tags = optional(map(string)),
default_freeform_tags = optional(map(string)),
default_enable_cis_checks = optional(bool),
default_ssh_ports_to_check = optional(list(number)),

network_configuration_categories = optional(map(object({
category_compartment_id = optional(string),
category_defined_tags = optional(map(string)),
category_freeform_tags = optional(map(string)),
category_enable_cis_checks = optional(bool),
category_ssh_ports_to_check = optional(list(number)),

vcns = optional(map(object({
compartment_id = optional(string),
display_name = optional(string),
byoipv6cidr_details = optional(map(object({
byoipv6range_id = string
ipv6cidr_block = string
})))
ipv6private_cidr_blocks = optional(list(string)),
is_ipv6enabled = optional(bool),
is_oracle_gua_allocation_enabled = optional(bool),
cidr_blocks = optional(list(string)),
dns_label = optional(string),
block_nat_traffic = optional(bool),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),

default_security_list = optional(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
ingress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
src = string,
src_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
}))),
egress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
dst = string,
dst_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
})))
}))

security_lists = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
display_name = optional(string),
ingress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
src = string,
src_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
}))),
egress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
dst = string,
dst_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
})))
})))

default_route_table = optional(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
display_name = optional(string),
route_rules = optional(map(object({
network_entity_id = optional(string),
network_entity_key = optional(string),
description = optional(string),
// Supported values:
// - "a cidr block"
// - "objectstorage" or "all-services" - only for "SERVICE_CIDR_BLOCK"
destination = optional(string),
// Supported values:
// - "CIDR_BLOCK"
// - "SERVICE_CIDR_BLOCK" - only for SGW
destination_type = optional(string),
})))
}))

route_tables = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
display_name = optional(string),
route_rules = optional(map(object({
network_entity_id = optional(string),
network_entity_key = optional(string),
description = optional(string),
// Supported values:
// - "a cidr block"
// - "objectstorage" or "all-services" - only for "SERVICE_CIDR_BLOCK"
destination = optional(string),
// Supported values:
// - "CIDR_BLOCK"
// - "SERVICE_CIDR_BLOCK" - only for SGW
destination_type = optional(string),
})))
})))

default_dhcp_options = optional(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
domain_name_type = optional(string),
options = map(object({
type = string,
server_type = optional(string),
custom_dns_servers = optional(list(string))
search_domain_names = optional(list(string))
}))
}))

dhcp_options = optional(map(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
domain_name_type = optional(string),
options = map(object({
type = string,
server_type = optional(string),
custom_dns_servers = optional(list(string))
search_domain_names = optional(list(string))
}))
})))

subnets = optional(map(object({
cidr_block = string,
compartment_id = optional(string),
#Optional
availability_domain = optional(string),
defined_tags = optional(map(string)),
dhcp_options_key = optional(string),
display_name = optional(string),
dns_label = optional(string),
freeform_tags = optional(map(string)),
ipv6cidr_block = optional(string),
ipv6cidr_blocks = optional(list(string)),
prohibit_internet_ingress = optional(bool),
prohibit_public_ip_on_vnic = optional(bool),
route_table_key = optional(string),
security_list_keys = optional(list(string))
})))

network_security_groups = optional(map(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string))
freeform_tags = optional(map(string))
ingress_rules = optional(map(object({
description = optional(string),
protocol = string,
stateless = optional(bool),
src = optional(string),
src_type = optional(string),
dst_port_min = optional(number),
dst_port_max = optional(number),
src_port_min = optional(number),
src_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
}))),
egress_rules = optional(map(object({
description = optional(string),
protocol = string,
stateless = optional(bool),
dst = optional(string),
dst_type = optional(string),
dst_port_min = optional(number),
dst_port_max = optional(number),
src_port_min = optional(number),
src_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
})))
})))
dns_resolver = optional(object({
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
attached_views = optional(map(object({
existing_view_id = optional(string) # an existing externally managed view. Assign either this attribute or the others for having this module managing the view.
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
dns_zones = optional(map(object({
compartment_id = optional(string),
name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
scope = optional(string),
zone_type = optional(string),
external_downstreams = optional(list(object({
address = optional(string),
ports = optional(string),
tsig_key = optional(string),
}))),
external_masters = optional(list(object({
address = optional(string),
port = optional(string),
tsig_key = optional(string),
}))),
dns_records = optional(map(object({
domain = optional(string),
compartment_id = optional(string),
rtype = optional(string),
rdata = optional(string),
ttl = optional(number),
})))
dns_rrset = optional(map(object({
compartment_id = optional(string)
domain = optional(string),
rtype = optional(string),
scope = optional(string),
items = optional(list(object({
domain = optional(string),
rdata = optional(string),
rtype = optional(string),
ttl = optional(string),
})))
})))
dns_steering_policies = optional(map(object({
compartment_id = optional(string),
domain_name = optional(string),
display_name = optional(string),
template = optional(string),
answers = optional(list(object({
name = optional(string),
rdata = optional(string),
rtype = optional(string),
is_disabled = optional(bool),
pool = optional(string),
}))),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
health_check_monitor_id = optional(string)
rules = optional(list(object({
rule_type = optional(string)
cases = optional(list(object({
answer_data = optional(object({
answer_condition = optional(string)
should_keep = optional(string)
value = optional(string)
})),
case_condition = optional(string),
count = optional(number)
}))),
default_answer_data = optional(object({
answer_condition = optional(string),
should_keep = optional(bool),
value = optional(string),
})),
default_count = optional(number),
description = optional(string),
}))),
ttl = optional(string),
}))),
}))),
}))),
rules = optional(list(object({
action = optional(string),
destination_address = optional(list(string)),
source_endpoint_name = optional(string),
client_address_conditions = optional(list(string)),
qname_cover_conditions = optional(list(string)),
}))),
resolver_endpoints = optional(map(object({
name = optional(string),
is_forwarding = optional(string),
is_listening = optional(string),
subnet = optional(string),
endpoint_type = optional(string),
forwarding_address = optional(string),
listening_address = optional(string),
nsg = optional(list(string)),
}))),
tsig_keys = optional(map(object({
compartment_id = optional(string),
algorithm = optional(string),
name = optional(string),
secret = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
}))),
}))

vcn_specific_gateways = optional(object({
internet_gateways = optional(map(object({
compartment_id = optional(string),
enabled = optional(bool),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
route_table_key = optional(string)
})))

nat_gateways = optional(map(object({
compartment_id = optional(string),
block_traffic = optional(bool),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
public_ip_id = optional(string),
route_table_key = optional(string)
})))

service_gateways = optional(map(object({
compartment_id = optional(string),
// SGW services value:
// - objectstorage - for object storage access
// - all-services - for all OCI internal network services access
services = string,
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
route_table_key = optional(string)
})))

local_peering_gateways = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
peer_id = optional(string),
peer_key = optional(string),
route_table_key = optional(string)
})))
}))
})))

inject_into_existing_vcns = optional(map(object({

vcn_id = string,

default_security_list = optional(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
ingress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
src = string,
src_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
}))),
egress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
dst = string,
dst_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
})))
}))

security_lists = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
display_name = optional(string),
ingress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
src = string,
src_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
}))),
egress_rules = optional(list(object({
stateless = optional(bool),
protocol = string,
description = optional(string),
dst = string,
dst_type = string,
src_port_min = optional(number),
src_port_max = optional(number),
dst_port_min = optional(number),
dst_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
})))
})))

default_route_table = optional(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
display_name = optional(string),
route_rules = optional(map(object({
network_entity_id = optional(string),
network_entity_key = optional(string),
description = optional(string),
// Supported values:
// - "a cidr block"
// - "objectstorage" or "all-services" - only for "SERVICE_CIDR_BLOCK"
destination = optional(string),
// Supported values:
// - "CIDR_BLOCK"
// - "SERVICE_CIDR_BLOCK" - only for SGW
destination_type = optional(string),
})))
}))

route_tables = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
display_name = optional(string),
route_rules = optional(map(object({
network_entity_id = optional(string),
network_entity_key = optional(string),
description = optional(string),
// Supported values:
// - "a cidr block"
// - "objectstorage" or "all-services" - only for "SERVICE_CIDR_BLOCK"
destination = optional(string),
// Supported values:
// - "CIDR_BLOCK"
// - "SERVICE_CIDR_BLOCK" - only for SGW
destination_type = optional(string)
})))
})))

default_dhcp_options = optional(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
domain_name_type = optional(string),
options = map(object({
type = string,
server_type = optional(string),
custom_dns_servers = optional(list(string))
search_domain_names = optional(list(string))
}))
}))

dhcp_options = optional(map(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
domain_name_type = optional(string),
options = map(object({
type = string,
server_type = optional(string),
custom_dns_servers = optional(list(string))
search_domain_names = optional(list(string))
}))
})))

subnets = optional(map(object({
cidr_block = string,
compartment_id = optional(string),
#Optional
availability_domain = optional(string),
defined_tags = optional(map(string)),
dhcp_options_id = optional(string),
dhcp_options_key = optional(string),
display_name = optional(string),
dns_label = optional(string),
freeform_tags = optional(map(string)),
ipv6cidr_block = optional(string),
ipv6cidr_blocks = optional(list(string)),
prohibit_internet_ingress = optional(bool),
prohibit_public_ip_on_vnic = optional(bool),
route_table_id = optional(string),
route_table_key = optional(string),
security_list_ids = optional(list(string)),
security_list_keys = optional(list(string))
})))

network_security_groups = optional(map(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string))
freeform_tags = optional(map(string))
ingress_rules = optional(map(object({
description = optional(string),
protocol = string,
stateless = optional(bool),
src = optional(string),
src_type = optional(string),
dst_port_min = number,
dst_port_max = number,
src_port_min = optional(number),
src_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
}))),
egress_rules = optional(map(object({
description = optional(string),
protocol = string,
stateless = optional(bool),
dst = optional(string),
dst_type = optional(string),
dst_port_min = optional(number),
dst_port_max = optional(number),
src_port_min = optional(number),
src_port_max = optional(number),
icmp_type = optional(number),
icmp_code = optional(number)
})))
})))

dns_resolver = optional(object({
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
attached_views = optional(map(object({
compartment_id = optional(string),
display_name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
dns_zones = optional(map(object({
compartment_id = optional(string),
name = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
scope = optional(string),
zone_type = optional(string),
external_downstreams = optional(list(object({
address = optional(string),
ports = optional(string),
tsig_key = optional(string),
}))),
external_masters = optional(list(object({
address = optional(string),
port = optional(string),
tsig_key = optional(string),
}))),
dns_records = optional(map(object({
domain = optional(string),
compartment_id = optional(string),
rtype = optional(string),
rdata = optional(string),
ttl = optional(string),
})))
dns_rrset = optional(map(object({
domain = optional(string),
rtype = optional(string),
scope = optional(string),
items = optional(list(object({
domain = optional(string),
rdata = optional(string),
rtype = optional(string),
ttl = optional(string),
})))
})))
dns_steering_policies = optional(map(object({
compartment_id = optional(string),
domain_name = optional(string),
display_name = optional(string),
template = optional(string),
answers = optional(list(object({
name = optional(string),
rdata = optional(string),
rtype = optional(string),
is_disabled = optional(bool),
pool = optional(string),
}))),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
health_check_monitor_id = optional(string)
rules = optional(list(object({
rule_type = optional(string)
cases = optional(list(object({
answer_data = optional(object({
answer_condition = optional(string)
should_keep = optional(string)
value = optional(string)
})),
case_condition = optional(string),
count = optional(number)
}))),
default_answer_data = optional(object({
answer_condition = optional(string),
should_keep = optional(bool),
value = optional(string),
})),
default_count = optional(number),
description = optional(string),
}))),
ttl = optional(string),
}))),
}))),
}))),
rules = optional(list(object({
action = optional(string),
destination_address = optional(string),
source_endpoint_name = optional(string),
client_address_condition = optional(string),
qname_cover_condtions = optional(string),
}))),
resolver_endpoints = optional(map(object({
name = optional(string),
is_forwarding = optional(bool),
is_listening = optional(bool),
subnet = optional(string),
endpoint_type = optional(string),
forwarding_address = optional(string),
listening_address = optional(string),
nsg = optional(string),
}))),
tsig_keys = optional(map(object({
compartment_id = optional(string),
algorithm = optional(string),
name = optional(string),
secret = optional(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
}))),
}))

vcn_specific_gateways = optional(object({
internet_gateways = optional(map(object({
compartment_id = optional(string),
enabled = optional(bool),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
route_table_id = optional(string),
route_table_key = optional(string)
})))

nat_gateways = optional(map(object({
compartment_id = optional(string),
block_traffic = optional(bool),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
public_ip_id = optional(string),
route_table_id = optional(string),
route_table_key = optional(string)
})))

service_gateways = optional(map(object({
compartment_id = optional(string),
// SGW services value:
// - objectstorage - for object storage access
// - all-services - for all OCI internal network services access
services = string,
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
route_table_id = optional(string),
route_table_key = optional(string)
})))

local_peering_gateways = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
peer_id = optional(string),
peer_key = optional(string),
route_table_id = optional(string),
route_table_key = optional(string)
})))
}))
})))

IPs = optional(object({

public_ips_pools = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
})))

public_ips = optional(map(object({
compartment_id = optional(string),
lifetime = string,
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
private_ip_id = optional(string),
public_ip_pool_id = optional(string),
public_ip_pool_key = optional(string)
})))
}))



non_vcn_specific_gateways = optional(object({

dynamic_routing_gateways = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),

remote_peering_connections = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
peer_id = optional(string),
peer_key = optional(string),
peer_region_name = optional(string)
})))

drg_attachments = optional(map(object({
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
drg_route_table_id = optional(string),
drg_route_table_key = optional(string),
network_details = optional(object({
attached_resource_id = optional(string),
attached_resource_key = optional(string),
type = string,
route_table_id = optional(string),
route_table_key = optional(string),
vcn_route_type = optional(string)
}))
})))

drg_route_tables = optional(map(object({
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
import_drg_route_distribution_id = optional(string),
import_drg_route_distribution_key = optional(string),
is_ecmp_enabled = optional(bool),
route_rules = optional(map(object({
destination = string,
destination_type = string,
next_hop_drg_attachment_id = optional(string),
next_hop_drg_attachment_key = optional(string),
})))
})))

drg_route_distributions = optional(map(object({
distribution_type = string,
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string))
statements = optional(map(object({
action = string,
match_criteria = optional(object({
match_type = string,
attachment_type = optional(string),
drg_attachment_id = optional(string),
drg_attachment_key = optional(string)
}))
priority = optional(number)
})))
})))
})))

customer_premises_equipments = optional(map(object({
compartment_id = optional(string),
ip_address = string,
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
cpe_device_shape_id = optional(string),
cpe_device_shape_vendor_name = optional(string)
})))

ipsecs = optional(map(object({
compartment_id = optional(string),
cpe_id = optional(string),
cpe_key = optional(string),
drg_id = optional(string),
drg_key = optional(string),
static_routes = list(string),
cpe_local_identifier = optional(string),
cpe_local_identifier_type = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
tunnels_management = optional(object({
tunnel_1 = optional(object({
routing = string,
bgp_session_info = optional(object({
customer_bgp_asn = optional(string),
customer_interface_ip = optional(string),
oracle_interface_ip = optional(string)
}))
encryption_domain_config = optional(object({
cpe_traffic_selector = optional(string),
oracle_traffic_selector = optional(string)
}))
shared_secret = optional(string),
ike_version = optional(string)
})),
tunnel_2 = optional(object({
routing = string,
bgp_session_info = optional(object({
customer_bgp_asn = optional(string),
customer_interface_ip = optional(string),
oracle_interface_ip = optional(string)
}))
encryption_domain_config = optional(object({
cpe_traffic_selector = optional(string),
oracle_traffic_selector = optional(string)
}))
shared_secret = optional(string),
ike_version = optional(string)
}))
}))
})))

fast_connect_virtual_circuits = optional(map(object({
#Required
compartment_id = optional(string),
provision_fc_virtual_circuit = bool,
show_available_fc_virtual_circuit_providers = bool,
type = string,
#Optional
bandwidth_shape_name = optional(string),
bgp_admin_state = optional(string),
cross_connect_mappings = optional(map(object({
#Optional
bgp_md5auth_key = optional(string)
cross_connect_or_cross_connect_group_id = optional(string)
cross_connect_or_cross_connect_group_key = optional(string)
customer_bgp_peering_ip = optional(string)
customer_bgp_peering_ipv6 = optional(string)
oracle_bgp_peering_ip = optional(string)
oracle_bgp_peering_ipv6 = optional(string)
vlan = optional(string)
})))
customer_asn = optional(string)
defined_tags = optional(map(string))
display_name = optional(string)
freeform_tags = optional(map(string))
ip_mtu = optional(number)
is_bfd_enabled = optional(bool)
gateway_id = optional(string)
gateway_key = optional(string)
provider_service_id = optional(string)
provider_service_key = optional(string)
provider_service_key_name = optional(string)
public_prefixes = optional(map(object({
#Required
cidr_block = string,
})))
region = optional(string)
routing_policy = optional(list(string))
})))

cross_connect_groups = optional(map(object({
compartment_id = optional(string),
customer_reference_name = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
cross_connects = optional(map(object({
compartment_id = optional(string),
location_name = string,
port_speed_shape_name = string,
customer_reference_name = optional(string),
defined_tags = optional(map(string))
display_name = optional(string),
far_cross_connect_or_cross_connect_group_id = optional(string),
far_cross_connect_or_cross_connect_group_key = optional(string),
freeform_tags = optional(map(string))
near_cross_connect_or_cross_connect_group_id = optional(string),
near_cross_connect_or_cross_connect_group_key = optional(string),
})))
})))

inject_into_existing_drgs = optional(map(object({
drg_id = string,

remote_peering_connections = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
peer_id = optional(string),
peer_key = optional(string),
peer_region_name = optional(string)
})))

drg_attachments = optional(map(object({
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
drg_route_table_id = optional(string),
drg_route_table_key = optional(string),
network_details = optional(object({
attached_resource_id = optional(string),
attached_resource_key = optional(string),
type = string,
route_table_id = optional(string),
route_table_key = optional(string),
vcn_route_type = optional(string)
}))
})))

drg_route_tables = optional(map(object({
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
import_drg_route_distribution_id = optional(string),
import_drg_route_distribution_key = optional(string),
is_ecmp_enabled = optional(bool),
route_rules = optional(map(object({
destination = string,
destination_type = string,
next_hop_drg_attachment_id = optional(string),
next_hop_drg_attachment_key = optional(string),
})))
})))

drg_route_distributions = optional(map(object({
distribution_type = string,
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string))
statements = optional(map(object({
action = string,
match_criteria = optional(object({
match_type = string,
attachment_type = optional(string),
drg_attachment_id = optional(string),
drg_attachment_key = optional(string)
}))
priority = number
})))
})))
})))

network_firewalls_configuration = optional(object({
network_firewalls = optional(map(object({
availability_domain = optional(number),
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
ipv4address = optional(string),
ipv6address = optional(string),
network_security_group_ids = optional(list(string)),
network_security_group_keys = optional(list(string)),
subnet_id = optional(string),
subnet_key = optional(string),
network_firewall_policy_id = optional(string),
network_firewall_policy_key = optional(string)
}))),

network_firewall_policies = optional(map(object({
compartment_id = optional(string),
defined_tags = optional(map(string)),
display_name = optional(string),
freeform_tags = optional(map(string)),
services = optional(map(object({
name = string
type = optional(string) # Valid values: "TCP_SERVICE" or "UDP_SERVICE"
minimum_port = number
maximum_port = optional(number)
})))
service_lists = optional(map(object({
name = string
services = list(string)
})))
applications = optional(map(object({
name = string,
type = string,
icmp_type = number,
icmp_code = optional(number),
})))
application_lists = optional(map(object({
name = string,
applications = list(string)
}))),
mapped_secrets = optional(map(object({
name = string,
type = string, # Valid values: SSL_FORWARD_PROXY, SSL_INBOUND_INSPECTION
source = string, # Valid value: OCI_VAULT
vault_secret_id = string,
version_number = string,
}))),
decryption_profiles = optional(map(object({
type = string, # Valid values: "SSL_FORWARD_PROXY", "SSL_INBOUND_INSPECTION"
name = string,
is_out_of_capacity_blocked = optional(bool),
is_unsupported_cipher_blocked = optional(bool),
is_unsupported_version_blocked = optional(bool),
are_certificate_extensions_restricted = optional(bool), # Applicable only when type = "SSL_FORWARD_PROXY"
is_auto_include_alt_name = optional(bool), # Applicable only when type = "SSL_FORWARD_PROXY"
is_expired_certificate_blocked = optional(bool), # Applicable only when type = "SSL_FORWARD_PROXY"
is_revocation_status_timeout_blocked = optional(bool), # Applicable only when type = "SSL_FORWARD_PROXY"
is_unknown_revocation_status_blocked = optional(bool), # Applicable only when type = "SSL_FORWARD_PROXY"
is_untrusted_issuer_blocked = optional(bool) # Applicable only when type = "SSL_FORWARD_PROXY"
}))),
decryption_rules = optional(map(object({
name = string,
action = string,
decryption_profile_id = optional(string),
secret = optional(string),
source_ip_address_list = optional(string),
destination_ip_address_list = optional(string)
}))),
address_lists = optional(map(object({
name = string,
type = string, # Valid values: "FQND", "IP"
addresses = list(string)
})))
url_lists = optional(map(object({
name = string,
pattern = string,
type = string # Valid value: SIMPLE
}))),
security_rules = optional(map(object({
action = string, # Valid values: ALLOW,DROP,REJECT,INSPECT
name = string,
application_lists = optional(list(string)),
destination_address_lists = optional(list(string)),
service_lists = optional(list(string)),
source_address_lists = optional(list(string)),
url_lists = optional(list(string)),
inspection = optional(string), # This is only applicable if action is INSPECT
after_rule = optional(string),
before_rule = optional(string)
})))
})))
}))

l7_load_balancers = optional(map(object({
compartment_id = optional(string),
display_name = string,
shape = string,
subnet_ids = list(string),
subnet_keys = list(string),
defined_tags = optional(map(string)),
freeform_tags = optional(map(string)),
ip_mode = optional(string),
is_private = optional(bool),
network_security_group_ids = optional(list(string)),
network_security_group_keys = optional(list(string)),
reserved_ips_ids = optional(list(string)),
reserved_ips_keys = optional(list(string))
shape_details = optional(object({
maximum_bandwidth_in_mbps = number,
minimum_bandwidth_in_mbps = number
}))
backend_sets = optional(map(object({
health_checker = object({
protocol = string,
interval_ms = number,
is_force_plain_text = bool,
port = number,
response_body_regex = optional(string),
retries = number,
return_code = number,
timeout_in_millis = number,
url_path = optional(string)
})
name = string,
policy = string,
lb_cookie_session_persistence_configuration = optional(object({
cookie_name = optional(string),
disable_fallback = optional(bool),
domain = optional(string),
is_http_only = optional(bool),
is_secure = optional(bool),
max_age_in_seconds = optional(number),
path = optional(string),
}))
session_persistence_configuration = optional(object({
cookie_name = string,
disable_fallback = optional(bool)
}))
ssl_configuration = optional(object({
certificate_ids = optional(list(string)),
certificate_keys = optional(list(string)),
certificate_name = optional(string),
cipher_suite_name = optional(string),
protocols = optional(list(string)),
server_order_preference = optional(string),
trusted_certificate_authority_ids = optional(list(string)),
trusted_certificate_authority_keys = optional(list(string)),
verify_depth = optional(number),
verify_peer_certificate = optional(bool),
}))
backends = optional(map(object({
ip_address = string,
port = number,
backup = optional(bool),
drain = optional(bool),
offline = optional(bool),
weight = optional(number)
})))
})))
cipher_suites = optional(map(object({
ciphers = list(string),
name = string
})))
path_route_sets = optional(map(object({
name = string,
path_routes = map(object({
backend_set_key = string,
path = string,
path_match_type = object({
match_type = string
})
}))
})))
host_names = optional(map(object({
hostname = string,
name = string
})))
routing_policies = optional(map(object({
condition_language_version = string,
name = string,
rules = map(object({
actions = map(object({
backend_set_key = string,
name = string,
}))
condition = string,
name = string
}))
})))
rule_sets = optional(map(object({
name = string,
items = map(object({
action = string,
allowed_methods = optional(list(string)),
are_invalid_characters_allowed = optional(bool),
conditions = optional(map(object({
attribute_name = string,
attribute_value = string,
operator = optional(string)
})))
description = optional(string),
header = optional(string),
http_large_header_size_in_kb = optional(number),
prefix = optional(string),
redirect_uri = optional(object({
host = optional(string, )
path = optional(string),
port = optional(number),
protocol = optional(string),
query = optional(string)
}))
response_code = optional(number)
status_code = optional(number),
suffix = optional(string),
value = optional(string)
}))
})))
certificates = optional(map(object({
#Required
certificate_name = string,
#Optional
ca_certificate = optional(string),
passphrase = optional(string),
private_key = optional(string),
public_certificate = optional(string)
})))
listeners = optional(map(object({
default_backend_set_key = string,
name = string,
port = string,
protocol = string,
connection_configuration = optional(object({
idle_timeout_in_seconds = number,
backend_tcp_proxy_protocol_version = optional(string)
}))
hostname_keys = optional(list(string)),
path_route_set_key = optional(string),
routing_policy_key = optional(string),
rule_set_keys = optional(list(string)),
ssl_configuration = optional(object({
certificate_key = optional(string),
certificate_ids = optional(list(string)),
cipher_suite_key = optional(string),
protocols = optional(list(string)),
server_order_preference = optional(string),
trusted_certificate_authority_ids = optional(list(string)),
verify_depth = optional(number),
verify_peer_certificate = optional(bool)
}))
})))
})))
}))
}
)))
})
| n/a | yes | +| [network\_dependency](#input\_network\_dependency) | An object containing the externally managed network resources this module may depend on. Supported resources are 'vcns', 'dynamic\_routing\_gateways', 'drg\_attachments', 'local\_peering\_gateways', 'remote\_peering\_connections', and 'dns\_private\_views', represented as map of objects. Each object, when defined, must have an 'id' attribute of string type set with the VCN, DRG OCID, DRG Attachment OCID, Local Peering Gateway OCID or Remote Peering Connection OCID. 'remote\_peering\_connections' must also pass the peer region name in the region\_name attribute. See External Dependencies section in README.md (https://github.com/oci-landing-zones/terraform-oci-modules-networking#ext-dep) for details. |
object({
vcns = optional(map(object({
id = string # the VCN OCID
})))
dynamic_routing_gateways = optional(map(object({
id = string # the DRG OCID
})))
drg_attachments = optional(map(object({
id = string # the DRG attachment OCID
})))
local_peering_gateways = optional(map(object({
id = string # the LPG OCID
})))
remote_peering_connections = optional(map(object({
id = string # the peer RPC OCID
region_name = string # the peer RPC region name
})))
dns_private_views = optional(map(object({
id = string # the DNS private view OCID
})))
})
| `null` | no | | [private\_ips\_dependency](#input\_private\_ips\_dependency) | An object containing the externally managed Private IP resources this module may depend on. All map objects must have the same type and must contain an 'id' attribute of string type set with the Private IP OCID. See External Dependencies section in README.md (https://github.com/oracle-quickstart/terraform-oci-cis-landing-zone-networking#ext-dep) for details. |
map(object({
id = string
}))
| `null` | no | ## Outputs diff --git a/dns.tf b/dns.tf index 4cd7741..13c85e1 100644 --- a/dns.tf +++ b/dns.tf @@ -77,8 +77,7 @@ locals { display_name = view_value.display_name defined_tags = view_value.defined_tags freeform_tags = view_value.freeform_tags - } - + } if view_value.existing_view_id == null ] : [] : [] ]) : flat_attached_views.view_key => flat_attached_views } : {} @@ -101,6 +100,7 @@ locals { external_downstreams = zone_value.external_downstreams != null ? zone_value.external_downstreams : [] external_masters = zone_value.external_masters != null ? zone_value.external_masters : [] zone_type = zone_value.zone_type + view_id = view_value.existing_view_id } ] : [] ] : [] : [] @@ -109,7 +109,7 @@ locals { one_dimension_dns_steering_policies = local.one_dimension_processed_vcns != null ? { for flat_dns_steering_policies in flatten([ - for vcn_key, vcn_value in local.one_dimension_processed_existing_vcns : + for vcn_key, vcn_value in local.one_dimension_processed_vcns : vcn_value.dns_resolver != null ? vcn_value.dns_resolver.attached_views != null ? [ for view_key, view_value in vcn_value.dns_resolver.attached_views : view_value.dns_zones != null ? [ @@ -169,13 +169,11 @@ data "oci_core_vcn_dns_resolver_association" "dns_resolvers" { resource "oci_dns_view" "these" { for_each = local.one_dimension_dns_views - - compartment_id = each.value.compartment_id - - display_name = each.value.display_name - scope = "PRIVATE" - defined_tags = each.value.defined_tags - freeform_tags = each.value.freeform_tags + compartment_id = each.value.compartment_id + display_name = each.value.display_name + scope = "PRIVATE" + defined_tags = each.value.defined_tags + freeform_tags = each.value.freeform_tags } @@ -186,7 +184,7 @@ resource "oci_dns_zone" "these" { scope = each.value.scope zone_type = each.value.zone_type - view_id = each.value.view_key != null ? oci_dns_view.these[each.value.view_key].id : null + view_id = each.value.view_key != null ? (contains(keys(oci_dns_view.these),each.value.view_key) ? oci_dns_view.these[each.value.view_key].id : (length(regexall("^ocid1.*$", each.value.view_id)) > 0 ? each.value.view_id : var.network_dependency["dns_private_views"][each.value.view_id].id)) : null dynamic "external_downstreams" { for_each = each.value.external_downstreams @@ -274,7 +272,7 @@ resource "oci_dns_resolver" "these" { for_each = each.value.attached_views iterator = views content { - view_id = oci_dns_view.these[views.key].id + view_id = views.key != null ? (contains(keys(oci_dns_view.these),views.key) ? oci_dns_view.these[views.key].id : (length(regexall("^ocid1.*$", views.value.existing_view_id)) > 0 ? views.value.existing_view_id : var.network_dependency["dns_private_views"][views.value.existing_view_id].id)) : null } } defined_tags = each.value.defined_tags diff --git a/examples/TransitRouting-DRGHub-NFW/main.tf b/examples/TransitRouting-DRGHub-NFW/main.tf index 8dbda6c..01a76a2 100644 --- a/examples/TransitRouting-DRGHub-NFW/main.tf +++ b/examples/TransitRouting-DRGHub-NFW/main.tf @@ -9,7 +9,6 @@ module "terraform_oci_networking" { source = "../../" - network_configuration = var.network_configuration } diff --git a/examples/TransitRouting-DRGHub-NFW/network_configuration.auto.tfvars b/examples/TransitRouting-DRGHub-NFW/network_configuration.auto.tfvars index 8f769c3..1643a31 100644 --- a/examples/TransitRouting-DRGHub-NFW/network_configuration.auto.tfvars +++ b/examples/TransitRouting-DRGHub-NFW/network_configuration.auto.tfvars @@ -8,7 +8,7 @@ # ####################################################################################################### # network_configuration = { - default_compartment_id = "ocid1.compartment.oc1....." + default_compartment_id = "ocid1.compartment.oc1....." default_freeform_tags = { "vision-environment" = "vision" } @@ -300,81 +300,61 @@ network_configuration = { display_name = "hub_nfw" subnet_key = "SUBNET-H-KEY" ipv4address = "10.0.0.10" - network_firewall_policy_key = "HUB-NFW-POLICY-KEY" + network_firewall_policy_key = "HUB-NFW-POLICY" } } network_firewall_policies = { - HUB-NFW-POLICY-KEY = { - display_name = "hub_nfw_policy" + HUB-NFW-POLICY = { + display_name = "hubnfw-policy" + applications = { + HUBNFW-APP-1 = { + name = "hubnfw-app-1" + type = "ICMP" + icmp_type = "128" + } + } application_lists = { - hubnfw_app_list_1 = { - application_list_name = "hubnfw_app_list_1" - application_values = { - hubnfw_app_list_1_1 = { - type = "TCP" - minimum_port = 80 - maximum_port = 8080 - } - } + HUBNFW-APP-LIST = { + name = "hubnfw-app-list" + applications = ["HUBNFW-APP-1"] } } - - ip_address_lists = { - hubnfw_ip_list = { - ip_address_list_name = "hubnfw_ip_list" - ip_address_list_value = ["10.0.0.1"] + address_lists = { + HUBNFW-IP-LIST = { + name = "hubnfw-ip-list" + addresses = ["10.0.0.1"] + type = "IP" } } - security_rules = { - SecurityRuleA = { - action = "ALLOW" - name = "SecurityRuleA" - conditions = { - prd_cond1_A = { - applications = [] - destinations = ["hubnfw_ip_list"] - sources = [] - urls = ["hubnfw_policy_url_1"] - } - } + url_lists = { + HUBNFW-URL-1 = { + name = "hubnfw-url-1", + type = "SIMPLE" + pattern = "www.oracle.com" } - - SecurityRuleB = { - action = "INSPECT" - inspection = "INTRUSION_DETECTION" - name = "SecurityRuleB" - conditions = { - prd_cond1_B = { - applications = ["hubnfw_app_list_1"] - destinations = [] - sources = ["hubnfw_ip_list"] - urls = ["hubnfw_policy_url_1"] - } - } + HUBNFW-URL-2 = { + name = "hubnfw-url-2", + type = "SIMPLE" + pattern = "www.google.com" } } - url_lists = { - hubnfw_policy_url_1 = { - url_list_name = "hubnfw_policy_url_1", - url_list_values = { - hubnfw_policy_url_1_1 = { - type = "SIMPLE" - pattern = "www.oracle.com" - } - hubnfw_policy_url_1_2 = { - type = "SIMPLE" - pattern = "www.google.com" - } - } + security_rules = { + SECURITY-RULE-A = { + action = "ALLOW" + name = "security-rule-a" + application_lists = [] + destination_address_lists = ["HUBNFW-IP-LIST"] + source_address_lists = [] + url_lists = ["HUBNFW-URL-1"] } - hubnfw_policy_url_2 = { - url_list_name = "hubnfw_policy_url_2", - url_list_values = { - hubnfw_policy_url_2_1 = { - type = "SIMPLE" - pattern = "www.facebook.com" - } - } + SECURITY-RULE-B = { + action = "INSPECT" + inspection = "INTRUSION_DETECTION" + name = "security-rule-b" + application = ["HUBNFW-APP-LIST"] + destination_address = [] + source_address = ["HUBNFW-IP-LIST"] + url_lists = ["HUBNFW-URL-2"] } } } diff --git a/examples/TransitRouting-DRGHub-NFW/provider.tf b/examples/TransitRouting-DRGHub-NFW/provider.tf index ed17fc6..564b449 100644 --- a/examples/TransitRouting-DRGHub-NFW/provider.tf +++ b/examples/TransitRouting-DRGHub-NFW/provider.tf @@ -21,9 +21,7 @@ terraform { required_providers { oci = { - source = "oracle/oci" - version = "<= 5.16.0" - configuration_aliases = [oci] + source = "oracle/oci" } } } \ No newline at end of file diff --git a/examples/TransitRouting-DRGHub-NFW/variables.tf b/examples/TransitRouting-DRGHub-NFW/variables.tf index 3f98647..4cbeae1 100644 --- a/examples/TransitRouting-DRGHub-NFW/variables.tf +++ b/examples/TransitRouting-DRGHub-NFW/variables.tf @@ -11,986 +11,6 @@ variable "private_key_password" {} variable "region" {} variable "network_configuration" { - type = object({ - default_compartment_id = optional(string), - default_defined_tags = optional(map(string)), - default_freeform_tags = optional(map(string)), - default_enable_cis_checks = optional(bool), - default_ssh_ports_to_check = optional(list(number)), - - network_configuration_categories = optional(map(object({ - category_compartment_id = optional(string), - category_defined_tags = optional(map(string)), - category_freeform_tags = optional(map(string)), - category_enable_cis_checks = optional(bool), - category_ssh_ports_to_check = optional(list(number)), - - vcns = optional(map(object({ - compartment_id = optional(string), - display_name = optional(string), - byoipv6cidr_details = optional(map(object({ - byoipv6range_id = string - ipv6cidr_block = string - }))) - ipv6private_cidr_blocks = optional(list(string)), - is_ipv6enabled = optional(bool), - is_oracle_gua_allocation_enabled = optional(bool), - cidr_blocks = optional(list(string)), - dns_label = optional(string), - block_nat_traffic = optional(bool), - defined_tags = optional(map(string)), - freeform_tags = optional(map(string)), - - default_security_list = optional(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - freeform_tags = optional(map(string)), - ingress_rules = optional(list(object({ - stateless = optional(bool), - protocol = string, - description = optional(string), - src = string, - src_type = string, - src_port_min = optional(number), - src_port_max = optional(number), - dst_port_min = optional(number), - dst_port_max = optional(number), - icmp_type = optional(number), - icmp_code = optional(number) - }))), - egress_rules = optional(list(object({ - stateless = optional(bool), - protocol = string, - description = optional(string), - dst = string, - dst_type = string, - src_port_min = optional(number), - src_port_max = optional(number), - dst_port_min = optional(number), - dst_port_max = optional(number), - icmp_type = optional(number), - icmp_code = optional(number) - }))) - })) - - security_lists = optional(map(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - freeform_tags = optional(map(string)), - display_name = optional(string), - ingress_rules = optional(list(object({ - stateless = optional(bool), - protocol = string, - description = optional(string), - src = string, - src_type = string, - src_port_min = optional(number), - src_port_max = optional(number), - dst_port_min = optional(number), - dst_port_max = optional(number), - icmp_type = optional(number), - icmp_code = optional(number) - }))), - egress_rules = optional(list(object({ - stateless = optional(bool), - protocol = string, - description = optional(string), - dst = string, - dst_type = string, - src_port_min = optional(number), - src_port_max = optional(number), - dst_port_min = optional(number), - dst_port_max = optional(number), - icmp_type = optional(number), - icmp_code = optional(number) - }))) - }))) - - default_route_table = optional(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - freeform_tags = optional(map(string)), - display_name = optional(string), - route_rules = optional(map(object({ - network_entity_id = optional(string), - network_entity_key = optional(string), - description = optional(string), - destination = optional(string), - destination_type = optional(string) - }))) - })) - - route_tables = optional(map(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - freeform_tags = optional(map(string)), - display_name = optional(string), - route_rules = optional(map(object({ - network_entity_id = optional(string), - network_entity_key = optional(string), - description = optional(string), - destination = optional(string), - destination_type = optional(string) - }))) - }))) - - default_dhcp_options = optional(object({ - compartment_id = optional(string), - display_name = optional(string), - defined_tags = optional(map(string)), - freeform_tags = optional(map(string)), - domain_name_type = optional(string), - options = map(object({ - type = string, - server_type = optional(string), - custom_dns_servers = optional(list(string)) - search_domain_names = optional(list(string)) - })) - })) - - dhcp_options = optional(map(object({ - compartment_id = optional(string), - display_name = optional(string), - defined_tags = optional(map(string)), - freeform_tags = optional(map(string)), - domain_name_type = optional(string), - options = map(object({ - type = string, - server_type = optional(string), - custom_dns_servers = optional(list(string)) - search_domain_names = optional(list(string)) - })) - }))) - - subnets = optional(map(object({ - cidr_block = string, - compartment_id = optional(string), - #Optional - availability_domain = optional(string), - defined_tags = optional(map(string)), - dhcp_options_key = optional(string), - display_name = optional(string), - dns_label = optional(string), - freeform_tags = optional(map(string)), - ipv6cidr_block = optional(string), - ipv6cidr_blocks = optional(list(string)), - prohibit_internet_ingress = optional(bool), - prohibit_public_ip_on_vnic = optional(bool), - route_table_key = optional(string), - security_list_keys = optional(list(string)) - }))) - - network_security_groups = optional(map(object({ - compartment_id = optional(string), - display_name = optional(string), - defined_tags = optional(map(string)) - freeform_tags = optional(map(string)) - ingress_rules = optional(map(object({ - description = optional(string), - protocol = string, - stateless = optional(bool), - src = optional(string), - src_type = optional(string), - dst_port_min = number, - dst_port_max = number, - src_port_min = optional(number), - src_port_max = optional(number), - icmp_type = optional(number), - icmp_code = optional(number) - }))), - egress_rules = optional(map(object({ - description = optional(string), - protocol = string, - stateless = optional(bool), - dst = optional(string), - dst_type = optional(string), - dst_port_min = optional(number), - dst_port_max = optional(number), - src_port_min = optional(number), - src_port_max = optional(number), - icmp_type = optional(number), - icmp_code = optional(number) - }))) - }))) - - vcn_specific_gateways = optional(object({ - internet_gateways = optional(map(object({ - compartment_id = optional(string), - enabled = optional(bool), - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - route_table_key = optional(string) - }))) - - nat_gateways = optional(map(object({ - compartment_id = optional(string), - block_traffic = optional(bool), - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - public_ip_id = optional(string), - route_table_key = optional(string) - }))) - - service_gateways = optional(map(object({ - compartment_id = optional(string), - services = string, - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - route_table_key = optional(string) - }))) - - local_peering_gateways = optional(map(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - peer_id = optional(string), - peer_key = optional(string), - route_table_key = optional(string) - }))) - })) - }))) - - inject_into_existing_vcns = optional(map(object({ - - vcn_id = string, - - default_security_list = optional(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - freeform_tags = optional(map(string)), - ingress_rules = optional(list(object({ - stateless = optional(bool), - protocol = string, - description = optional(string), - src = string, - src_type = string, - src_port_min = optional(number), - src_port_max = optional(number), - dst_port_min = optional(number), - dst_port_max = optional(number), - icmp_type = optional(number), - icmp_code = optional(number) - }))), - egress_rules = optional(list(object({ - stateless = optional(bool), - protocol = string, - description = optional(string), - dst = string, - dst_type = string, - src_port_min = optional(number), - src_port_max = optional(number), - dst_port_min = optional(number), - dst_port_max = optional(number), - icmp_type = optional(number), - icmp_code = optional(number) - }))) - })) - - security_lists = optional(map(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - freeform_tags = optional(map(string)), - display_name = optional(string), - ingress_rules = optional(list(object({ - stateless = optional(bool), - protocol = string, - description = optional(string), - src = string, - src_type = string, - src_port_min = optional(number), - src_port_max = optional(number), - dst_port_min = optional(number), - dst_port_max = optional(number), - icmp_type = optional(number), - icmp_code = optional(number) - }))), - egress_rules = optional(list(object({ - stateless = optional(bool), - protocol = string, - description = optional(string), - dst = string, - dst_type = string, - src_port_min = optional(number), - src_port_max = optional(number), - dst_port_min = optional(number), - dst_port_max = optional(number), - icmp_type = optional(number), - icmp_code = optional(number) - }))) - }))) - - default_route_table = optional(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - freeform_tags = optional(map(string)), - display_name = optional(string), - route_rules = optional(map(object({ - network_entity_id = optional(string), - network_entity_key = optional(string), - description = optional(string), - destination = optional(string), - destination_type = optional(string) - }))) - })) - - route_tables = optional(map(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - freeform_tags = optional(map(string)), - display_name = optional(string), - route_rules = optional(map(object({ - network_entity_id = optional(string), - network_entity_key = optional(string), - description = optional(string), - destination = optional(string), - destination_type = optional(string) - }))) - }))) - - default_dhcp_options = optional(object({ - compartment_id = optional(string), - display_name = optional(string), - defined_tags = optional(map(string)), - freeform_tags = optional(map(string)), - domain_name_type = optional(string), - options = map(object({ - type = string, - server_type = optional(string), - custom_dns_servers = optional(list(string)) - search_domain_names = optional(list(string)) - })) - })) - - dhcp_options = optional(map(object({ - compartment_id = optional(string), - display_name = optional(string), - defined_tags = optional(map(string)), - freeform_tags = optional(map(string)), - domain_name_type = optional(string), - options = map(object({ - type = string, - server_type = optional(string), - custom_dns_servers = optional(list(string)) - search_domain_names = optional(list(string)) - })) - }))) - - subnets = optional(map(object({ - cidr_block = string, - compartment_id = optional(string), - #Optional - availability_domain = optional(string), - defined_tags = optional(map(string)), - dhcp_options_id = optional(string), - dhcp_options_key = optional(string), - display_name = optional(string), - dns_label = optional(string), - freeform_tags = optional(map(string)), - ipv6cidr_block = optional(string), - ipv6cidr_blocks = optional(list(string)), - prohibit_internet_ingress = optional(bool), - prohibit_public_ip_on_vnic = optional(bool), - route_table_id = optional(string), - route_table_key = optional(string), - security_list_ids = optional(list(string)), - security_list_keys = optional(list(string)) - }))) - - network_security_groups = optional(map(object({ - compartment_id = optional(string), - display_name = optional(string), - defined_tags = optional(map(string)) - freeform_tags = optional(map(string)) - ingress_rules = optional(map(object({ - description = optional(string), - protocol = string, - stateless = optional(bool), - src = optional(string), - src_type = optional(string), - dst_port_min = number, - dst_port_max = number, - src_port_min = optional(number), - src_port_max = optional(number), - icmp_type = optional(number), - icmp_code = optional(number) - }))), - egress_rules = optional(map(object({ - description = optional(string), - protocol = string, - stateless = optional(bool), - dst = optional(string), - dst_type = optional(string), - dst_port_min = optional(number), - dst_port_max = optional(number), - src_port_min = optional(number), - src_port_max = optional(number), - icmp_type = optional(number), - icmp_code = optional(number) - }))) - }))) - - vcn_specific_gateways = optional(object({ - internet_gateways = optional(map(object({ - compartment_id = optional(string), - enabled = optional(bool), - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - route_table_id = optional(string), - route_table_key = optional(string) - }))) - - nat_gateways = optional(map(object({ - compartment_id = optional(string), - block_traffic = optional(bool), - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - public_ip_id = optional(string), - route_table_id = optional(string), - route_table_key = optional(string) - }))) - - service_gateways = optional(map(object({ - compartment_id = optional(string), - services = string, - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - route_table_id = optional(string), - route_table_key = optional(string) - }))) - - local_peering_gateways = optional(map(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - peer_id = optional(string), - peer_key = optional(string), - route_table_id = optional(string), - route_table_key = optional(string) - }))) - })) - }))) - - IPs = optional(object({ - - public_ips_pools = optional(map(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - }))) - - public_ips = optional(map(object({ - compartment_id = optional(string), - lifetime = string, - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - private_ip_id = optional(string), - public_ip_pool_id = optional(string), - public_ip_pool_key = optional(string) - }))) - })) - - - - non_vcn_specific_gateways = optional(object({ - - dynamic_routing_gateways = optional(map(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - - remote_peering_connections = optional(map(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - peer_id = optional(string), - peer_key = optional(string), - peer_region_name = optional(string) - }))) - - drg_attachments = optional(map(object({ - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - drg_route_table_id = optional(string), - drg_route_table_key = optional(string), - network_details = optional(object({ - attached_resource_id = optional(string), - attached_resource_key = optional(string), - type = string, - route_table_id = optional(string), - route_table_key = optional(string), - vcn_route_type = optional(string) - })) - }))) - - drg_route_tables = optional(map(object({ - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - import_drg_route_distribution_id = optional(string), - import_drg_route_distribution_key = optional(string), - is_ecmp_enabled = optional(bool), - route_rules = optional(map(object({ - destination = string, - destination_type = string, - next_hop_drg_attachment_id = optional(string), - next_hop_drg_attachment_key = optional(string), - }))) - }))) - - drg_route_distributions = optional(map(object({ - distribution_type = string, - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)) - statements = optional(map(object({ - action = string, - match_criteria = optional(object({ - match_type = string, - attachment_type = optional(string), - drg_attachment_id = optional(string), - drg_attachment_key = optional(string) - })) - priority = optional(number) - }))) - }))) - }))) - - customer_premises_equipments = optional(map(object({ - compartment_id = optional(string), - ip_address = string, - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - cpe_device_shape_id = optional(string), - cpe_device_shape_vendor_name = optional(string) - }))) - - ipsecs = optional(map(object({ - compartment_id = optional(string), - cpe_id = optional(string), - cpe_key = optional(string), - drg_id = optional(string), - drg_key = optional(string), - static_routes = list(string), - cpe_local_identifier = optional(string), - cpe_local_identifier_type = optional(string), - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - tunnels_management = optional(object({ - tunnel_1 = optional(object({ - routing = string, - bgp_session_info = optional(object({ - customer_bgp_asn = optional(string), - customer_interface_ip = optional(string), - oracle_interface_ip = optional(string) - })) - encryption_domain_config = optional(object({ - cpe_traffic_selector = optional(string), - oracle_traffic_selector = optional(string) - })) - shared_secret = optional(string), - ike_version = optional(string) - })), - tunnel_2 = optional(object({ - routing = string, - bgp_session_info = optional(object({ - customer_bgp_asn = optional(string), - customer_interface_ip = optional(string), - oracle_interface_ip = optional(string) - })) - encryption_domain_config = optional(object({ - cpe_traffic_selector = optional(string), - oracle_traffic_selector = optional(string) - })) - shared_secret = optional(string), - ike_version = optional(string) - })) - })) - }))) - - fast_connect_virtual_circuits = optional(map(object({ - #Required - compartment_id = optional(string), - provision_fc_virtual_circuit = bool, - show_available_fc_virtual_circuit_providers = bool, - type = string, - #Optional - bandwidth_shape_name = optional(string), - bgp_admin_state = optional(string), - cross_connect_mappings = optional(map(object({ - #Optional - bgp_md5auth_key = optional(string) - cross_connect_or_cross_connect_group_id = optional(string) - cross_connect_or_cross_connect_group_key = optional(string) - customer_bgp_peering_ip = optional(string) - customer_bgp_peering_ipv6 = optional(string) - oracle_bgp_peering_ip = optional(string) - oracle_bgp_peering_ipv6 = optional(string) - vlan = optional(string) - }))) - customer_asn = optional(string) - defined_tags = optional(map(string)) - display_name = optional(string) - freeform_tags = optional(map(string)) - ip_mtu = optional(number) - is_bfd_enabled = optional(bool) - gateway_id = optional(string) - gateway_key = optional(string) - provider_service_id = optional(string) - provider_service_key = optional(string) - provider_service_key_name = optional(string) - public_prefixes = optional(map(object({ - #Required - cidr_block = string, - }))) - region = optional(string) - routing_policy = optional(list(string)) - }))) - - cross_connect_groups = optional(map(object({ - compartment_id = optional(string), - customer_reference_name = optional(string), - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - cross_connects = optional(map(object({ - compartment_id = optional(string), - location_name = string, - port_speed_shape_name = string, - customer_reference_name = optional(string), - defined_tags = optional(map(string)) - display_name = optional(string), - far_cross_connect_or_cross_connect_group_id = optional(string), - far_cross_connect_or_cross_connect_group_key = optional(string), - freeform_tags = optional(map(string)) - near_cross_connect_or_cross_connect_group_id = optional(string), - near_cross_connect_or_cross_connect_group_key = optional(string), - }))) - }))) - - inject_into_existing_drgs = optional(map(object({ - drg_id = string, - - remote_peering_connections = optional(map(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - peer_id = optional(string), - peer_key = optional(string), - peer_region_name = optional(string) - }))) - - drg_attachments = optional(map(object({ - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - drg_route_table_id = optional(string), - drg_route_table_key = optional(string), - network_details = optional(object({ - attached_resource_id = optional(string), - attached_resource_key = optional(string), - type = string, - route_table_id = optional(string), - route_table_key = optional(string), - vcn_route_type = optional(string) - })) - }))) - - drg_route_tables = optional(map(object({ - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - import_drg_route_distribution_id = optional(string), - import_drg_route_distribution_key = optional(string), - is_ecmp_enabled = optional(bool), - route_rules = optional(map(object({ - destination = string, - destination_type = string, - next_hop_drg_attachment_id = optional(string), - next_hop_drg_attachment_key = optional(string), - }))) - }))) - - drg_route_distributions = optional(map(object({ - distribution_type = string, - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)) - statements = optional(map(object({ - action = string, - match_criteria = optional(object({ - match_type = string, - attachment_type = optional(string), - drg_attachment_id = optional(string), - drg_attachment_key = optional(string) - })) - priority = number - }))) - }))) - }))) - - network_firewalls_configuration = optional(object({ - network_firewalls = optional(map(object({ - availability_domain = optional(number), - compartment_id = optional(string), - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - ipv4address = optional(string), - ipv6address = optional(string), - network_security_group_ids = optional(list(string)), - network_security_group_keys = optional(list(string)), - subnet_id = optional(string), - subnet_key = optional(string), - network_firewall_policy_id = optional(string), - network_firewall_policy_key = optional(string) - }))), - - network_firewall_policies = optional(map(object({ - compartment_id = optional(string), - defined_tags = optional(map(string)), - display_name = optional(string), - freeform_tags = optional(map(string)), - application_lists = optional(map(object({ - application_list_name = string, - application_values = map(object({ - type = string, - icmp_type = optional(string), - icmp_code = optional(string), - minimum_port = optional(number), - maximum_port = optional(number) - })) - }))) - decryption_profiles = optional(map(object({ - is_out_of_capacity_blocked = bool, - is_unsupported_cipher_blocked = bool, - is_unsupported_version_blocked = bool, - type = string, - key = string, - are_certificate_extensions_restricted = optional(bool), - is_auto_include_alt_name = optional(bool), - is_expired_certificate_blocked = optional(bool), - is_revocation_status_timeout_blocked = optional(bool), - is_unknown_revocation_status_blocked = optional(bool), - is_untrusted_issuer_blocked = optional(bool) - }))) - decryption_rules = optional(map(object({ - action = string, - name = string, - decryption_profile = optional(string), - secret = optional(string), - conditions = map(object({ - destinations = optional(list(string)), - sources = optional(list(string)) - })) - }))) - ip_address_lists = optional(map(object({ - ip_address_list_name = string, - ip_address_list_value = list(string) - }))) - mapped_secrets = optional(map(object({ - key = optional(string), - type = string, - vault_secret_id = string, - version_number = string, - }))) - security_rules = optional(map(object({ - action = string, - inspection = optional(string), - name = string - conditions = map(object({ - applications = optional(list(string)), - destinations = optional(list(string)), - sources = optional(list(string)), - urls = optional(list(string)) - })) - }))) - url_lists = optional(map(object({ - url_list_name = string, - url_list_values = map(object({ - type = string, - pattern = string - })) - }))) - }))) - })) - - l7_load_balancers = optional(map(object({ - compartment_id = optional(string), - display_name = string, - shape = string, - subnet_ids = list(string), - subnet_keys = list(string), - defined_tags = optional(map(string)), - freeform_tags = optional(map(string)), - ip_mode = optional(string), - is_private = optional(bool), - network_security_group_ids = optional(list(string)), - network_security_group_keys = optional(list(string)), - reserved_ips_ids = optional(list(string)), - reserved_ips_keys = optional(list(string)) - shape_details = optional(object({ - maximum_bandwidth_in_mbps = number, - minimum_bandwidth_in_mbps = number - })) - backend_sets = optional(map(object({ - health_checker = object({ - protocol = string, - interval_ms = number, - is_force_plain_text = bool, - port = number, - response_body_regex = optional(string), - retries = number, - return_code = number, - timeout_in_millis = number, - url_path = optional(string) - }) - name = string, - policy = string, - lb_cookie_session_persistence_configuration = optional(object({ - cookie_name = optional(string), - disable_fallback = optional(bool), - domain = optional(string), - is_http_only = optional(bool), - is_secure = optional(bool), - max_age_in_seconds = optional(number), - path = optional(string), - })) - session_persistence_configuration = optional(object({ - cookie_name = string, - disable_fallback = optional(bool) - })) - ssl_configuration = optional(object({ - certificate_ids = optional(list(string)), - certificate_keys = optional(list(string)), - certificate_name = optional(string), - cipher_suite_name = optional(string), - protocols = optional(list(string)), - server_order_preference = optional(string), - trusted_certificate_authority_ids = optional(list(string)), - trusted_certificate_authority_keys = optional(list(string)), - verify_depth = optional(number), - verify_peer_certificate = optional(bool), - })) - backends = optional(map(object({ - ip_address = string, - port = number, - backup = optional(bool), - drain = optional(bool), - offline = optional(bool), - weight = optional(number) - }))) - }))) - cipher_suites = optional(map(object({ - ciphers = list(string), - name = string - }))) - path_route_sets = optional(map(object({ - name = string, - path_routes = map(object({ - backend_set_key = string, - path = string, - path_match_type = object({ - match_type = string - }) - })) - }))) - host_names = optional(map(object({ - hostname = string, - name = string - }))) - routing_policies = optional(map(object({ - condition_language_version = string, - name = string, - rules = map(object({ - actions = map(object({ - backend_set_key = string, - name = string, - })) - condition = string, - name = string - })) - }))) - rule_sets = optional(map(object({ - name = string, - items = map(object({ - action = string, - allowed_methods = optional(list(string)), - are_invalid_characters_allowed = optional(bool), - conditions = optional(map(object({ - attribute_name = string, - attribute_value = string, - operator = optional(string) - }))) - description = optional(string), - header = optional(string), - http_large_header_size_in_kb = optional(number), - prefix = optional(string), - redirect_uri = optional(object({ - host = optional(string, ) - path = optional(string), - port = optional(number), - protocol = optional(string), - query = optional(string) - })) - response_code = optional(number) - status_code = optional(number), - suffix = optional(string), - value = optional(string) - })) - }))) - certificates = optional(map(object({ - #Required - certificate_name = string, - #Optional - ca_certificate = optional(string), - passphrase = optional(string), - private_key = optional(string), - public_certificate = optional(string) - }))) - listeners = optional(map(object({ - default_backend_set_key = string, - name = string, - port = string, - protocol = string, - connection_configuration = optional(object({ - idle_timeout_in_seconds = number, - backend_tcp_proxy_protocol_version = optional(string) - })) - hostname_keys = optional(list(string)), - path_route_set_key = optional(string), - routing_policy_key = optional(string), - rule_set_keys = optional(list(string)), - ssl_configuration = optional(object({ - certificate_key = optional(string), - certificate_ids = optional(list(string)), - cipher_suite_key = optional(string), - protocols = optional(list(string)), - server_order_preference = optional(string), - trusted_certificate_authority_ids = optional(list(string)), - verify_depth = optional(number), - verify_peer_certificate = optional(bool) - })) - }))) - }))) - })) - } - ))) - }) + type = any } diff --git a/examples/dns-view-injection/README.md b/examples/dns-view-injection/README.md new file mode 100644 index 0000000..b4c0168 --- /dev/null +++ b/examples/dns-view-injection/README.md @@ -0,0 +1,24 @@ +# OCI Private DNS View Injection Example + +## Description + +This example shows how to inject na existing private DNS view to a DNS resolver managed by the [terraform-oci-landing-zones-networking](../..) module. + +It directly injects the existing private DNS view OCID into the *attached_view*'s *existing_view_id* attribute. + +Optionally, it could also inject a key within *dns_private_views* attribute of *network_dependency* variable. + +## Using this example +1. Rename *terraform.tfvars.template* to *terraform.tfvars*. + +2. Within *terraform.tfvars*, provide tenancy connectivity information and adjust the input variables, by making the appropriate substitutions: + - Replace \ placeholder with appropriate value. + +Refer to [Networking module README.md](../../README.md) for overall attributes usage. + +3. In this folder, run the typical Terraform workflow: +``` +terraform init +terraform plan -out plan.out +terraform apply plan.out +``` \ No newline at end of file diff --git a/examples/dns-view-injection/main.tf b/examples/dns-view-injection/main.tf new file mode 100644 index 0000000..11041d1 --- /dev/null +++ b/examples/dns-view-injection/main.tf @@ -0,0 +1,9 @@ +# Copyright (c) 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +module "dns_view_injection" { + source = "../../" + network_configuration = var.network_configuration + network_dependency = var.network_dependency +} + diff --git a/examples/dns-view-injection/provider.tf b/examples/dns-view-injection/provider.tf new file mode 100644 index 0000000..f11d1ce --- /dev/null +++ b/examples/dns-view-injection/provider.tf @@ -0,0 +1,21 @@ +# Copyright (c) 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +provider "oci" { + region = var.region + tenancy_ocid = var.tenancy_ocid + user_ocid = var.user_ocid + fingerprint = var.fingerprint + private_key_path = var.private_key_path + private_key_password = var.private_key_password +} + +terraform { + required_version = ">= 1.3.0" + + required_providers { + oci = { + source = "oracle/oci" + } + } +} \ No newline at end of file diff --git a/examples/dns-view-injection/terraform.tfvars.template b/examples/dns-view-injection/terraform.tfvars.template new file mode 100644 index 0000000..2755be7 --- /dev/null +++ b/examples/dns-view-injection/terraform.tfvars.template @@ -0,0 +1,92 @@ +# Copyright (c) 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +tenancy_ocid = "" +user_ocid = "" +fingerprint = "" +private_key_path = "" +private_key_password = "" +region = "" + + +network_configuration = { + default_compartment_id = "" + network_configuration_categories = { + DNS-VIEW-INJECTION = { + + vcns = { + MY-VCN = { + display_name = "dns-view-injection-vcn" + is_ipv6enabled = false + is_oracle_gua_allocation_enabled = false + cidr_blocks = ["10.0.0.0/24"], + dns_label = "dnsvcn" + is_create_igw = false + is_attach_drg = false + block_nat_traffic = false + + subnets = { + MY-SUBNET = { + cidr_block = "10.0.0.0/24" + display_name = "dns-view-injection-subnet" + dns_label = "dnssubnet" + prohibit_internet_ingress = true + } + } + + dns_resolver = { + display_name = "custom-dns-resolver" + attached_views = { + DNS-VIEW-1 = { + existing_view_id = "" # This is the injected DNS view. It can be either an OCID or a key within 'dns_private_views' attribute of 'network_dependency' variable (see commented out snippet down below). + } + } + rules = [ + { + action = "FORWARD" + destination_address = ["10.0.2.128"] + source_endpoint_name = "CUSTOM-RESOLVER-ENDPOINT" + qname_cover_conditions = ["internal.example.com"] + + }, + { + action = "FORWARD" + client_address_conditions = ["192.168.1.0/24"] + destination_address = ["10.0.2.128"] + source_endpoint_name = "CUSTOM-RESOLVER-ENDPOINT" + + } + ] + resolver_endpoints = { + CUSTOM-RESOLVER-ENDPOINT = { + enpoint_type = "VNIC" + is_forwarding = "true" + is_listening = "false" + forwarding_address = "10.0.0.32" + name = "custom_resolver_endpoint" + subnet = "MY-SUBNET" + } + } + tsig_keys = { + MY-TSIG = { + algorithm = "hmac-sha1" + name = "my-tsig" + secret = "welcome1" + } + } + } + } + } + } + } +} + +/* +network_dependency = { + dns_private_views = { + EXTERNALLY-MANAGED-VIEW = { + id = "ocid1.dnsview.oc1.....snhq" + } + } +} +*/ \ No newline at end of file diff --git a/examples/dns-view-injection/variables.tf b/examples/dns-view-injection/variables.tf new file mode 100644 index 0000000..15ff0d1 --- /dev/null +++ b/examples/dns-view-injection/variables.tf @@ -0,0 +1,22 @@ +# Copyright (c) 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# tenancy details +variable "tenancy_ocid" {} +variable "user_ocid" {} +variable "fingerprint" {} +variable "private_key_path" {} +variable "private_key_password" {} +variable "region" {} + +variable "network_configuration" { + type = any +} + +variable "network_dependency" { + description = "An object containing the externally managed network resources this module may depend on. Supported resources are 'vcns', 'dynamic_routing_gateways', 'drg_attachments', 'local_peering_gateways', 'remote_peering_connections', and 'dns_private_views', represented as map of objects. Each object, when defined, must have an 'id' attribute of string type set with the VCN, DRG OCID, DRG Attachment OCID, Local Peering Gateway OCID or Remote Peering Connection OCID. 'remote_peering_connections' must also pass the peer region name in the region_name attribute. See External Dependencies section in README.md (https://github.com/oci-landing-zones/terraform-oci-modules-networking#ext-dep) for details." + type = any + default = null +} + + diff --git a/examples/dns/provider.tf b/examples/dns/provider.tf index 46db25f..ab2f1ba 100644 --- a/examples/dns/provider.tf +++ b/examples/dns/provider.tf @@ -21,8 +21,7 @@ terraform { required_providers { oci = { - source = "oracle/oci" - configuration_aliases = [oci] + source = "oracle/oci" } } } \ No newline at end of file diff --git a/examples/local-peering-gateways/lpg-acceptor/provider.tf b/examples/local-peering-gateways/lpg-acceptor/provider.tf index d9084cb..47dc64c 100644 --- a/examples/local-peering-gateways/lpg-acceptor/provider.tf +++ b/examples/local-peering-gateways/lpg-acceptor/provider.tf @@ -15,8 +15,7 @@ terraform { required_providers { oci = { - source = "oracle/oci" - configuration_aliases = [oci] + source = "oracle/oci" } } } \ No newline at end of file diff --git a/examples/local-peering-gateways/lpg-requestor/provider.tf b/examples/local-peering-gateways/lpg-requestor/provider.tf index d9084cb..47dc64c 100644 --- a/examples/local-peering-gateways/lpg-requestor/provider.tf +++ b/examples/local-peering-gateways/lpg-requestor/provider.tf @@ -15,8 +15,7 @@ terraform { required_providers { oci = { - source = "oracle/oci" - configuration_aliases = [oci] + source = "oracle/oci" } } } \ No newline at end of file diff --git a/examples/oci-network-firewall/README.md b/examples/oci-network-firewall/README.md new file mode 100644 index 0000000..f5ec4fe --- /dev/null +++ b/examples/oci-network-firewall/README.md @@ -0,0 +1,24 @@ +# OCI Network Firewall Example + +## Description + +This example implements the network firewall policy in the use case described in https://www.ateam-oracle.com/post/oci-network-firewall---concepts-and-deployment. The complete routing scenario is not implemented. + +Note that the IP addresses for the Internet hosts are fictitious, so please update them appropriately. + +For detailed description of the ```terraform-oci-landing-zones-networking``` networking core module please refer to the core module specific [README.md](../../README.md) and [SPEC.md](../../SPEC.md). + +## Using this example +1. Rename *terraform.tfvars.template* to *terraform.tfvars*. + +2. Within *terraform.tfvars*, provide tenancy connectivity information and adjust the input variables, by making the appropriate substitutions: + - Replace \ placeholder with appropriate value. + +Refer to [Networking module README.md](https://github.com/oci-landing-zones/terraform-oci-modules-networking/blob/main/README.md) for overall attributes usage. + +3. In this folder, run the typical Terraform workflow: +``` +terraform init +terraform plan -out plan.out +terraform apply plan.out +``` diff --git a/examples/oci-network-firewall/main.tf b/examples/oci-network-firewall/main.tf new file mode 100644 index 0000000..b15104a --- /dev/null +++ b/examples/oci-network-firewall/main.tf @@ -0,0 +1,8 @@ +# Copyright (c) 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +module "terraform_oci_networking" { + source = "../../" + network_configuration = var.network_configuration +} + diff --git a/examples/oci-network-firewall/outputs.tf b/examples/oci-network-firewall/outputs.tf new file mode 100644 index 0000000..1a85f5c --- /dev/null +++ b/examples/oci-network-firewall/outputs.tf @@ -0,0 +1,7 @@ +# Copyright (c) 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +output "provisioned_networking_resources" { + description = "Provisioned networking resources" + value = module.terraform_oci_networking.provisioned_networking_resources +} \ No newline at end of file diff --git a/examples/oci-network-firewall/provider.tf b/examples/oci-network-firewall/provider.tf new file mode 100644 index 0000000..02fba69 --- /dev/null +++ b/examples/oci-network-firewall/provider.tf @@ -0,0 +1,21 @@ +# Copyright (c) 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +provider "oci" { + region = var.region + tenancy_ocid = var.tenancy_ocid + user_ocid = var.user_ocid + fingerprint = var.fingerprint + private_key_path = var.private_key_path + private_key_password = var.private_key_password +} + +terraform { + required_version = ">= 1.3.0" + + required_providers { + oci = { + source = "oracle/oci" + } + } +} \ No newline at end of file diff --git a/examples/oci-network-firewall/terraform.tfvars.template b/examples/oci-network-firewall/terraform.tfvars.template new file mode 100644 index 0000000..46fbdad --- /dev/null +++ b/examples/oci-network-firewall/terraform.tfvars.template @@ -0,0 +1,124 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +tenancy_ocid = "" +user_ocid = "" +fingerprint = "" +private_key_path = "" +private_key_password = "" +region = "" + +network_configuration = { + default_compartment_id = "" + network_configuration_categories = { + FIREWALL = { + vcns = { + FIREWALL-VCN = { + display_name = "firewall-vcn" + is_ipv6enabled = false + is_oracle_gua_allocation_enabled = false + cidr_blocks = ["192.168.0.0/24"], + dns_label = "firewallvcn" + is_create_igw = false + is_attach_drg = false + block_nat_traffic = false + + subnets = { + FIREWALL-SUBNET = { + cidr_block = "192.168.0.16/28" + display_name = "firewall-subnet" + dns_label = "firewallsubnet" + ipv6cidr_blocks = [] + prohibit_internet_ingress = true + } + } + } + } + non_vcn_specific_gateways = { + network_firewalls_configuration = { + network_firewalls = { + NFW = { + display_name = "nfw" + subnet_key = "FIREWALL-SUBNET" + ipv4address = "192.168.0.20" + network_firewall_policy_key = "NFW-POLICY" + } + } + network_firewall_policies = { + NFW-POLICY = { + display_name = "nfw-policy" + applications = { + ICMP = { + name = "ICMP" + type = "ICMP" + icmp_type = 8 + icmp_code = 0 + } + } + application_lists = { + ICMP-LIST = { + name = "ICMP-Application-List" + applications = ["ICMP"] + } + } + services = { + SSH = { + name = "SSH" + type = "TCP_SERVICE" + minimum_port = 22 + maximum_port = 22 + } + } + service_lists = { + SSH-LIST = { + name = "SSH-Service-List" + services = ["SSH"] + } + } + address_lists = { + ADDRESS-LIST-PERMIT = { + name = "IP-Address-List-Permit" + type = "IP" + addresses = ["150.136.212.20/32"] + }, + ADDRESS-LIST-DENY = { + name = "IP-Address-List-Deny" + type = "IP" + addresses = ["192.9.241.52/32"] + }, + ADDRESS-LIST-VCN-HOSTS = { + name = "IP-Address-List-VCN-Hosts" + type = "IP" + addresses = ["192.168.0.10/32"] + } + } + security_rules = { + ICMP-PERMIT-RULE = { + action = "ALLOW" + name = "ICMP-Permit" + application_lists = ["ICMP-LIST"] + source_address_lists = ["ADDRESS-LIST-PERMIT"] + destination_address_lists = ["ADDRESS-LIST-VCN-HOSTS"] + } + SSH-PERMIT-RULE = { + action = "ALLOW" + name = "SSH-Permit" + servicen_lists = ["SSH-LIST"] + source_address_lists = ["ADDRESS-LIST-PERMIT"] + destination_address_lists = ["ADDRESS-LIST-VCN-HOSTS"] + } + DENY-RULE = { + action = "DROP" + name = "Deny" + application_lists = [] + source_address_lists = ["ADDRESS-LIST-DENY"] + destination_address_lists = ["ADDRESS-LIST-VCN-HOSTS"] + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/examples/oci-network-firewall/variables.tf b/examples/oci-network-firewall/variables.tf new file mode 100644 index 0000000..e6c31d0 --- /dev/null +++ b/examples/oci-network-firewall/variables.tf @@ -0,0 +1,15 @@ +# Copyright (c) 2023, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# tenancy details +variable "tenancy_ocid" {} +variable "user_ocid" {} +variable "fingerprint" {} +variable "private_key_path" {} +variable "private_key_password" {} +variable "region" {} + +variable "network_configuration" { + type = any +} + diff --git a/examples/oke-examples/flannel/provider.tf b/examples/oke-examples/flannel/provider.tf index c94a697..f36f035 100644 --- a/examples/oke-examples/flannel/provider.tf +++ b/examples/oke-examples/flannel/provider.tf @@ -15,8 +15,7 @@ terraform { required_version = ">= 1.3.0" required_providers { oci = { - source = "oracle/oci" - configuration_aliases = [oci] + source = "oracle/oci" } } } diff --git a/examples/oke-examples/native/provider.tf b/examples/oke-examples/native/provider.tf index 11cb25c..8b3ce99 100644 --- a/examples/oke-examples/native/provider.tf +++ b/examples/oke-examples/native/provider.tf @@ -13,8 +13,7 @@ terraform { required_version = ">= 1.3.0" required_providers { oci = { - source = "oracle/oci" - configuration_aliases = [oci] + source = "oracle/oci" } } } diff --git a/examples/remote-peering-connections/rpc-acceptor/provider.tf b/examples/remote-peering-connections/rpc-acceptor/provider.tf index d9084cb..47dc64c 100644 --- a/examples/remote-peering-connections/rpc-acceptor/provider.tf +++ b/examples/remote-peering-connections/rpc-acceptor/provider.tf @@ -15,8 +15,7 @@ terraform { required_providers { oci = { - source = "oracle/oci" - configuration_aliases = [oci] + source = "oracle/oci" } } } \ No newline at end of file diff --git a/examples/remote-peering-connections/rpc-requestor/provider.tf b/examples/remote-peering-connections/rpc-requestor/provider.tf index d9084cb..47dc64c 100644 --- a/examples/remote-peering-connections/rpc-requestor/provider.tf +++ b/examples/remote-peering-connections/rpc-requestor/provider.tf @@ -15,8 +15,7 @@ terraform { required_providers { oci = { - source = "oracle/oci" - configuration_aliases = [oci] + source = "oracle/oci" } } } \ No newline at end of file diff --git a/modules/waf/variables.tf b/modules/waf/variables.tf index 4f82c6f..065e022 100644 --- a/modules/waf/variables.tf +++ b/modules/waf/variables.tf @@ -13,7 +13,6 @@ variable "waf_configuration" { waf = map(object({ display_name = optional(string) defined_tags = optional(map(string)) - defined_tags = optional(map(string)) freeform_tags = optional(map(string)) backend_type = string compartment_id = optional(string) diff --git a/network_firewall_policies.tf b/network_firewall_policies.tf index c12c2c4..e46041a 100644 --- a/network_firewall_policies.tf +++ b/network_firewall_policies.tf @@ -21,18 +21,45 @@ locals { display_name = nfwp_value.display_name freeform_tags = nfwp_value.freeform_tags applications = nfwp_value.applications + application_lists = nfwp_value.application_lists decryption_profiles = nfwp_value.decryption_profiles decryption_rules = nfwp_value.decryption_rules - ip_address_lists = nfwp_value.ip_address_lists + address_lists = nfwp_value.address_lists mapped_secrets = nfwp_value.mapped_secrets security_rules = nfwp_value.security_rules url_lists = nfwp_value.url_lists + services = nfwp_value.services + service_lists = nfwp_value.service_lists nfwp_key = nfwp_key } ] : [] : [] : [] ]) : flat_nfwp.nfwp_key => flat_nfwp } : null + nfw_policy_services = flatten([ + for policy_key, policy_value in coalesce(local.one_dimension_processed_nfw_policies,{}) : [ + for service_key, service_value in (coalesce(policy_value.services,{})) : { + key = "${policy_key}.${service_key}" + policy_key = policy_key + name = service_value.name + type = service_value.type + minimum_port = service_value.minimum_port + maximum_port = service_value.maximum_port + } + ] + ]) + + nfw_policy_service_lists = flatten([ + for policy_key, policy_value in coalesce(local.one_dimension_processed_nfw_policies,{}) : [ + for serv_key, serv_value in (coalesce(policy_value.service_lists,{})) : { + key = "${policy_key}.${serv_key}" + policy_key = policy_key + name = serv_value.name + services = serv_value.services + } + ] + ]) + nfw_policy_applications = flatten([ for policy_key, policy_value in coalesce(local.one_dimension_processed_nfw_policies,{}) : [ for app_key, app_value in (coalesce(policy_value.applications,{})) : { @@ -46,6 +73,17 @@ locals { ] ]) + nfw_policy_application_lists = flatten([ + for policy_key, policy_value in coalesce(local.one_dimension_processed_nfw_policies,{}) : [ + for applist_key, applist_value in (coalesce(policy_value.application_lists,{})) : { + key = "${policy_key}.${applist_key}" + policy_key = policy_key + name = applist_value.name + apps = applist_value.applications + } + ] + ]) + nfw_policy_decryption_profiles = flatten([ for policy_key, policy_value in coalesce(local.one_dimension_processed_nfw_policies,{}) : [ for prof_key, prof_value in (coalesce(policy_value.decryption_profiles,{})) : { @@ -68,7 +106,7 @@ locals { nfw_policy_address_lists = flatten([ for policy_key, policy_value in coalesce(local.one_dimension_processed_nfw_policies,{}) : [ - for add_key, add_value in (coalesce(policy_value.ip_address_lists,{})) : { + for add_key, add_value in (coalesce(policy_value.address_lists,{})) : { key = "${policy_key}.${add_key}" policy_key = policy_key name = add_value.name @@ -96,7 +134,7 @@ locals { nfw_policy_mapped_secrets = flatten([ for policy_key, policy_value in coalesce(local.one_dimension_processed_nfw_policies,{}) : [ for secret_key, secret_value in (coalesce(policy_value.mapped_secrets,{})) : { - key = "${policy_key}.${secret_value}" + key = "${policy_key}.${secret_key}" policy_key = policy_key name = secret_value.name source = secret_value.source @@ -110,7 +148,7 @@ locals { nfw_policy_url_lists = flatten([ for policy_key, policy_value in coalesce(local.one_dimension_processed_nfw_policies,{}) : [ for url_key, url_value in (coalesce(policy_value.url_lists,{})) : { - key = "${policy_key}.${url_value}" + key = "${policy_key}.${url_key}" policy_key = policy_key name = url_value.name pattern = url_value.pattern @@ -122,18 +160,18 @@ locals { nfw_policy_security_rules = flatten([ for policy_key, policy_value in coalesce(local.one_dimension_processed_nfw_policies,{}) : [ for security_key, security_value in (coalesce(policy_value.security_rules,{})) : { - key = "${policy_key}.${security_value}" - policy_key = policy_key - action = security_value.action - name = security_value.name - application = security_value.application - destination_address = security_value.destination_address - service = security_value.service - source_address = security_value.source_address - url = security_value.url - inspection = security_value.inspection - after_rule = security_value.after_rule - before_rule = security_value.before_rule + key = "${policy_key}.${security_key}" + policy_key = policy_key + action = security_value.action + name = security_value.name + application_lists = security_value.application_lists + destination_address_lists = security_value.destination_address_lists + service_lists = security_value.service_lists + source_address_lists = security_value.source_address_lists + url_lists = security_value.url_lists + inspection = security_value.inspection + after_rule = security_value.after_rule + before_rule = security_value.before_rule } ] ]) @@ -148,7 +186,7 @@ locals { display_name = nfw_pol_value.display_name freeform_tags = nfw_pol_value.freeform_tags id = nfw_pol_value.id - #ip_address_lists = nfw_pol_value.ip_address_lists + #address_lists = nfw_pol_value.address_lists #is_firewall_attached = nfw_pol_value.is_firewall_attached lifecycle_details = nfw_pol_value.lifecycle_details #mapped_secrets = nfw_pol_value.mapped_secrets @@ -174,6 +212,34 @@ resource "oci_network_firewall_network_firewall_policy" "these" { freeform_tags = merge(local.cislz_module_tag, each.value.freeform_tags) } +resource "oci_network_firewall_network_firewall_policy_service" "these" { + for_each = { for v in local.nfw_policy_services : v.key => { + policy_key = v.policy_key + name = v.name + type = v.type + minimum_port = v.minimum_port + maximum_port = v.maximum_port + } } + network_firewall_policy_id = oci_network_firewall_network_firewall_policy.these[each.value.policy_key].id + name = each.value.name + type = each.value.type + port_ranges { + minimum_port = each.value.minimum_port + maximum_port = each.value.maximum_port + } +} + +resource "oci_network_firewall_network_firewall_policy_service_list" "these" { + for_each = { for v in local.nfw_policy_service_lists : v.key => { + policy_key = v.policy_key + name = v.name + services = v.services + } } + network_firewall_policy_id = oci_network_firewall_network_firewall_policy.these[each.value.policy_key].id + name = each.value.name + services = [for service in each.value.services : oci_network_firewall_network_firewall_policy_service.these["${each.value.policy_key}.${service}"].name] +} + resource "oci_network_firewall_network_firewall_policy_application" "these" { for_each = { for v in local.nfw_policy_applications : v.key => { policy_key = v.policy_key @@ -189,6 +255,17 @@ resource "oci_network_firewall_network_firewall_policy_application" "these" { icmp_code = each.value.icmp_code } +resource "oci_network_firewall_network_firewall_policy_application_group" "these" { + for_each = { for v in local.nfw_policy_application_lists : v.key => { + policy_key = v.policy_key + name = v.name + apps = v.apps + } } + network_firewall_policy_id = oci_network_firewall_network_firewall_policy.these[each.value.policy_key].id + name = each.value.name + apps = [for app in each.value.apps : oci_network_firewall_network_firewall_policy_application.these["${each.value.policy_key}.${app}"].name] +} + resource "oci_network_firewall_network_firewall_policy_decryption_profile" "these" { for_each = { for v in local.nfw_policy_decryption_profiles : v.key => { policy_key = v.policy_key @@ -282,24 +359,24 @@ resource "oci_network_firewall_network_firewall_policy_url_list" "these" { network_firewall_policy_id = oci_network_firewall_network_firewall_policy.these[each.value.policy_key].id urls { pattern = each.value.pattern - type = each.value.tyep + type = each.value.type } } resource "oci_network_firewall_network_firewall_policy_security_rule" "these" { for_each = { for v in local.nfw_policy_security_rules : v.key => { - policy_key = v.policy_key - action = v.action - name = v.name - application = v.application - destination_address = v.destination_address - service = v.service - source_address = v.source_address - url = v.url - inspection = v.inspection - after_rule = v.after_rule - before_rule = v.before_rule + policy_key = v.policy_key + action = v.action + name = v.name + application_lists = v.application_lists + destination_address_lists = v.destination_address_lists + service_lists = v.service_lists + source_address_lists = v.source_address_lists + url_lists = v.url_lists + inspection = v.inspection + after_rule = v.after_rule + before_rule = v.before_rule }} lifecycle { ignore_changes = [position] @@ -308,12 +385,12 @@ resource "oci_network_firewall_network_firewall_policy_security_rule" "these" { action = each.value.action name = each.value.name condition { - application = each.value.application - destination_address = each.value.destination_address - service = each.value.service - source_address = each.value.source_address - url = each.value.url - } + application = each.value.application_lists != null ? [for app_list in each.value.application_lists: oci_network_firewall_network_firewall_policy_application_group.these["${each.value.policy_key}.${app_list}"].name ] : null + destination_address = each.value.destination_address_lists != null ? [for dest_list in each.value.destination_address_lists: oci_network_firewall_network_firewall_policy_address_list.these["${each.value.policy_key}.${dest_list}"].name ] : null + source_address = each.value.source_address_lists != null ? [for source_list in each.value.source_address_lists: oci_network_firewall_network_firewall_policy_address_list.these["${each.value.policy_key}.${source_list}"].name ] : null + url = each.value.url_lists != null ? [for url_list in each.value.url_lists: oci_network_firewall_network_firewall_policy_url_list.these["${each.value.policy_key}.${url_list}"].name ] : null + service = each.value.service_lists != null ? [for service_list in each.value.service_lists: oci_network_firewall_network_firewall_policy_service_list.these["${each.value.policy_key}.${service_list}"].name ] : null +} network_firewall_policy_id = oci_network_firewall_network_firewall_policy.these[each.value.policy_key].id #Optional @@ -325,207 +402,3 @@ resource "oci_network_firewall_network_firewall_policy_security_rule" "these" { before_rule = each.value.before_rule } } - -/* resource "oci_network_firewall_network_firewall_policy" "these" { - - for_each = local.one_dimension_processed_nfw_policies != null ? length(local.one_dimension_processed_nfw_policies) > 0 ? local.one_dimension_processed_nfw_policies : {} : {} - - compartment_id = each.value.compartment_id != null ? (length(regexall("^ocid1.*$", each.value.compartment_id)) > 0 ? each.value.compartment_id : var.compartments_dependency[each.value.compartment_id].id) : null - defined_tags = each.value.defined_tags - display_name = each.value.display_name - freeform_tags = merge(local.cislz_module_tag, each.value.freeform_tags) - - dynamic "application_lists" { - for_each = each.value.application_lists != null ? length(each.value.application_lists) > 0 ? [ - for app_list_key, app_list_value in each.value.application_lists : { - application_list_name = app_list_value.application_list_name - application_values = app_list_value.application_values - }] : [] : [] - iterator = application_list - - content { - application_list_name = application_list.value.application_list_name - - dynamic "application_values" { - for_each = application_list.value.application_values != null ? application_list.value.application_values != null ? [ - for app_value_key, app_value_value in application_list.value.application_values : { - type = app_value_value.type - icmp_type = app_value_value.icmp_type - icmp_code = app_value_value.icmp_code - minimum_port = app_value_value.minimum_port - maximum_port = app_value_value.maximum_port - }] : [] : [] - iterator = application_value - - content { - type = application_value.value.type - icmp_type = application_value.value.icmp_type - icmp_code = application_value.value.icmp_code - minimum_port = application_value.value.minimum_port - maximum_port = application_value.value.maximum_port - } - } - } - } - - dynamic "decryption_profiles" { - for_each = each.value.decryption_profiles != null ? length(each.value.decryption_profiles) > 0 ? [ - for d_profile_key, d_profile_value in each.value.decryption_profiles : { - is_out_of_capacity_blocked = d_profile_value.is_out_of_capacity_blocked - is_unsupported_cipher_blocked = d_profile_value.is_unsupported_cipher_blocked - is_unsupported_version_blocked = d_profile_value.is_unsupported_version_blocked - type = d_profile_value.type - key = d_profile_value.key - #Optional - are_certificate_extensions_restricted = d_profile_value.are_certificate_extensions_restricted - is_auto_include_alt_name = d_profile_value.is_auto_include_alt_name - is_expired_certificate_blocked = d_profile_value.is_expired_certificate_blocked - is_revocation_status_timeout_blocked = d_profile_value.is_revocation_status_timeout_blocked - is_unknown_revocation_status_blocked = d_profile_value.is_unknown_revocation_status_blocked - is_untrusted_issuer_blocked = d_profile_value.is_untrusted_issuer_blocked - }] : [] : [] - iterator = decryption_profile - - content { - is_out_of_capacity_blocked = decryption_profile.value.is_out_of_capacity_blocked - is_unsupported_cipher_blocked = decryption_profile.value.is_unsupported_cipher_blocked - is_unsupported_version_blocked = decryption_profile.value.is_unsupported_version_blocked - type = decryption_profile.value.type - key = decryption_profile.value.key - - #Optional - are_certificate_extensions_restricted = decryption_profile.value.are_certificate_extensions_restricted - is_auto_include_alt_name = decryption_profile.value.is_auto_include_alt_name - is_expired_certificate_blocked = decryption_profile.value.is_expired_certificate_blocked - is_revocation_status_timeout_blocked = decryption_profile.value.is_revocation_status_timeout_blocked - is_unknown_revocation_status_blocked = decryption_profile.value.is_unknown_revocation_status_blocked - is_untrusted_issuer_blocked = decryption_profile.value.is_untrusted_issuer_blocked - } - } - - - dynamic "decryption_rules" { - for_each = each.value.decryption_rules != null ? length(each.value.decryption_rules) > 0 ? [ - for d_rule_key, d_rule_value in each.value.decryption_rules : { - action = d_rule_value.action - name = d_rule_value.name - decryption_profile = d_rule_value.decryption_profile - secret = d_rule_value.secret - conditions = d_rule_value.conditions - }] : [] : [] - iterator = decryption_rule - - content { - action = decryption_rule.value.action - name = decryption_rule.value.name - decryption_profile = decryption_rule.value.decryption_profile - secret = decryption_rule.value.secret - dynamic "condition" { - for_each = decryption_rule.value != null ? length(decryption_rule.value) > 0 ? [ - for cond_key, cond_value in decryption_rule.value.conditions : { - destinations = cond_value.destinations - sources = cond_value.sources - }] : [] : [] - iterator = cond - content { - destinations = cond.value.destinations - sources = cond.value.sources - } - } - } - } - - dynamic "ip_address_lists" { - for_each = each.value.ip_address_lists != null ? length(each.value.ip_address_lists) > 0 ? [ - for ipa_list_key, ipa_list_value in each.value.ip_address_lists : { - ip_address_list_name = ipa_list_value.ip_address_list_name - ip_address_list_value = ipa_list_value.ip_address_list_value - }] : [] : [] - iterator = ip_address_list - - content { - ip_address_list_name = ip_address_list.value.ip_address_list_name - ip_address_list_value = ip_address_list.value.ip_address_list_value - } - } - - dynamic "mapped_secrets" { - for_each = each.value.mapped_secrets != null ? length(each.value.mapped_secrets) > 0 ? [ - for ms_key, ms_value in each.value.mapped_secrets : { - key = ms_value.key - type = ms_value.type - vault_secret_id = ms_value.vault_secret_id - version_number = ms_value.version_number - }] : [] : [] - iterator = mapped_secret - - content { - type = mapped_secret.value.type - key = mapped_secret.value.key - vault_secret_id = mapped_secret.value.vault_secret_id - version_number = mapped_secret.value.version_number - } - } - - dynamic "security_rules" { - for_each = each.value.security_rules != null ? length(each.value.security_rules) > 0 ? [ - for sr_key, sr_value in each.value.security_rules : { - action = sr_value.action - conditions = sr_value.conditions - name = sr_value.name - inspection = sr_value.inspection - }] : [] : [] - iterator = security_rule - - content { - action = security_rule.value.action - name = security_rule.value.name - inspection = security_rule.value.inspection - - dynamic "condition" { - for_each = security_rule.value.conditions != null ? security_rule.value.conditions != null ? [ - for cond_key, cond_value in security_rule.value.conditions : { - applications = cond_value.applications - destinations = cond_value.destinations - sources = cond_value.sources - urls = cond_value.urls - }] : [] : [] - iterator = condition - - content { - applications = condition.value.applications - destinations = condition.value.destinations - sources = condition.value.sources - urls = condition.value.urls - } - } - } - } - - dynamic "url_lists" { - for_each = each.value.url_lists != null ? length(each.value.url_lists) > 0 ? [ - for urll in each.value.url_lists : { - url_list_name = urll.url_list_name - url_list_values = urll.url_list_values - }] : [] : [] - iterator = url_list - - content { - url_list_name = url_list.value.url_list_name - - dynamic "url_list_values" { - for_each = url_list.value.url_list_values != null ? length(url_list.value.url_list_values) > 0 ? [ - for urllv in url_list.value.url_list_values : { - type = urllv.type - pattern = urllv.pattern - }] : [] : [] - iterator = url_list_value - - content { - type = url_list_value.value.type - pattern = url_list_value.value.pattern - } - } - } - } -} */ diff --git a/orm-facade/provider.tf b/orm-facade/provider.tf index ed17fc6..564b449 100644 --- a/orm-facade/provider.tf +++ b/orm-facade/provider.tf @@ -21,9 +21,7 @@ terraform { required_providers { oci = { - source = "oracle/oci" - version = "<= 5.16.0" - configuration_aliases = [oci] + source = "oracle/oci" } } } \ No newline at end of file diff --git a/release.txt b/release.txt index 1864002..bcaffe1 100644 --- a/release.txt +++ b/release.txt @@ -1 +1 @@ -0.6.9 \ No newline at end of file +0.7.0 \ No newline at end of file diff --git a/variables.tf b/variables.tf index 84452c4..0da2c12 100644 --- a/variables.tf +++ b/variables.tf @@ -227,6 +227,7 @@ variable "network_configuration" { defined_tags = optional(map(string)), freeform_tags = optional(map(string)), attached_views = optional(map(object({ + existing_view_id = optional(string) # an existing externally managed view. Assign either this attribute or the others for having this module managing the view. compartment_id = optional(string), display_name = optional(string), defined_tags = optional(map(string)), @@ -1012,22 +1013,33 @@ variable "network_configuration" { defined_tags = optional(map(string)), display_name = optional(string), freeform_tags = optional(map(string)), - # application_lists = optional(map(object({ - # application_list_name = string, - # application_values = map(object({ - # type = string, - # icmp_type = optional(string), - # icmp_code = optional(string), - # minimum_port = optional(number), - # maximum_port = optional(number) - # })) - # }))) + services = optional(map(object({ + name = string + type = optional(string) # Valid values: "TCP_SERVICE" or "UDP_SERVICE" + minimum_port = number + maximum_port = optional(number) + }))) + service_lists = optional(map(object({ + name = string + services = list(string) + }))) applications = optional(map(object({ name = string, type = string, - icmp_type = optional(string), - icmp_code = optional(string), + icmp_type = number, + icmp_code = optional(number), }))) + application_lists = optional(map(object({ + name = string, + applications = list(string) + }))), + mapped_secrets = optional(map(object({ + name = string, + type = string, # Valid values: SSL_FORWARD_PROXY, SSL_INBOUND_INSPECTION + source = string, # Valid value: OCI_VAULT + vault_secret_id = string, + version_number = string, + }))), decryption_profiles = optional(map(object({ type = string, # Valid values: "SSL_FORWARD_PROXY", "SSL_INBOUND_INSPECTION" name = string, @@ -1040,43 +1052,36 @@ variable "network_configuration" { is_revocation_status_timeout_blocked = optional(bool), # Applicable only when type = "SSL_FORWARD_PROXY" is_unknown_revocation_status_blocked = optional(bool), # Applicable only when type = "SSL_FORWARD_PROXY" is_untrusted_issuer_blocked = optional(bool) # Applicable only when type = "SSL_FORWARD_PROXY" - }))) - ip_address_lists = optional(map(object({ + }))), + decryption_rules = optional(map(object({ + name = string, + action = string, + decryption_profile_id = optional(string), + secret = optional(string), + source_ip_address_list = optional(string), + destination_ip_address_list = optional(string) + }))), + address_lists = optional(map(object({ name = string, type = string, # Valid values: "FQND", "IP" addresses = list(string) }))) - decryption_rules = optional(map(object({ - name = string, - action = string, - decryption_profile_id = optional(string), - secret = optional(string), - destination_ip_address_list = optional(string), - source_ip_address_list = optional(string) - }))) - mapped_secrets = optional(map(object({ - name = string, - type = string, # Valid values: SSL_FORWARD_PROXY, SSL_INBOUND_INSPECTION - source = string, # Valid value: OCI_VAULT - vault_secret_id = string, - version_number = string, - }))) - security_rules = optional(map(object({ - action = string, # Valid values: ALLOW,DROP,REJECT,INSPECT - name = string, - application = optional(list(string)), - destination_address = optional(list(string)), - service = optional(list(string)), - source_address = optional(list(string)), - url = optional(list(string)), - inspection = optional(string), # This is only applicable if action is INSPECT - after_rule = optional(string), - before_rule = optional(string) - }))) url_lists = optional(map(object({ name = string, pattern = string, type = string # Valid value: SIMPLE + }))), + security_rules = optional(map(object({ + action = string, # Valid values: ALLOW,DROP,REJECT,INSPECT + name = string, + application_lists = optional(list(string)), + destination_address_lists = optional(list(string)), + service_lists = optional(list(string)), + source_address_lists = optional(list(string)), + url_lists = optional(list(string)), + inspection = optional(string), # This is only applicable if action is INSPECT + after_rule = optional(string), + before_rule = optional(string) }))) }))) })) @@ -1260,7 +1265,7 @@ variable "compartments_dependency" { } variable "network_dependency" { - description = "An object containing the externally managed network resources this module may depend on. Supported resources are 'vcns', 'dynamic_routing_gateways', 'drg_attachments', 'local_peering_gateways', and 'remote_peering_connections', represented as map of objects. Each object, when defined, must have an 'id' attribute of string type set with the VCN, DRG OCID, DRG Attachment OCID, Local Peering Gateway OCID or Remote Peering Connection OCID. 'remote_peering_connections' must also pass the peer region name in the region_name attribute. See External Dependencies section in README.md (https://github.com/oracle-quickstart/terraform-oci-cis-landing-zone-networking#ext-dep) for details." + description = "An object containing the externally managed network resources this module may depend on. Supported resources are 'vcns', 'dynamic_routing_gateways', 'drg_attachments', 'local_peering_gateways', 'remote_peering_connections', and 'dns_private_views', represented as map of objects. Each object, when defined, must have an 'id' attribute of string type set with the VCN, DRG OCID, DRG Attachment OCID, Local Peering Gateway OCID or Remote Peering Connection OCID. 'remote_peering_connections' must also pass the peer region name in the region_name attribute. See External Dependencies section in README.md (https://github.com/oci-landing-zones/terraform-oci-modules-networking#ext-dep) for details." type = object({ vcns = optional(map(object({ id = string # the VCN OCID @@ -1278,6 +1283,9 @@ variable "network_dependency" { id = string # the peer RPC OCID region_name = string # the peer RPC region name }))) + dns_private_views = optional(map(object({ + id = string # the DNS private view OCID + }))) }) default = null }