From 5644f4dfc30f82e59a6875ca79c44e8d77a0e140 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Wed, 19 Jan 2022 01:03:03 +0100 Subject: [PATCH] feat: add option to create a Remote Peering Connection (RPC) to the DRG module (#72) Signed-off-by: Andrea Marchesini --- .gitignore | 1 + CHANGELOG.adoc | 5 + README.adoc | 1 + README.md | 1 + docs/images/network_remote_peering_basic.png | Bin 0 -> 29775 bytes examples/drg/main.tf | 13 -- examples/rpc/rpc_from_drg_module/README.md | 79 ++++++++ examples/rpc/rpc_from_drg_module/main.tf | 175 ++++++++++++++++++ .../terraform.tfvars.example | 38 ++++ examples/rpc/rpc_from_drg_module/variables.tf | 83 +++++++++ examples/rpc/rpc_from_vcn_module/README.md | 80 ++++++++ examples/rpc/rpc_from_vcn_module/main.tf | 128 +++++++++++++ .../terraform.tfvars.example | 38 ++++ examples/rpc/rpc_from_vcn_module/variables.tf | 83 +++++++++ main.tf | 13 +- modules/drg/README.md | 7 + modules/drg/drg.tf | 18 ++ modules/drg/outputs.tf | 28 +++ modules/drg/variables.tf | 21 +++ outputs.tf | 10 + variables.tf | 20 ++ 21 files changed, 827 insertions(+), 15 deletions(-) create mode 100644 docs/images/network_remote_peering_basic.png create mode 100644 examples/rpc/rpc_from_drg_module/README.md create mode 100644 examples/rpc/rpc_from_drg_module/main.tf create mode 100644 examples/rpc/rpc_from_drg_module/terraform.tfvars.example create mode 100644 examples/rpc/rpc_from_drg_module/variables.tf create mode 100644 examples/rpc/rpc_from_vcn_module/README.md create mode 100644 examples/rpc/rpc_from_vcn_module/main.tf create mode 100644 examples/rpc/rpc_from_vcn_module/terraform.tfvars.example create mode 100644 examples/rpc/rpc_from_vcn_module/variables.tf diff --git a/.gitignore b/.gitignore index 44732c6..ee2aa19 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ provider.tf # macOS related files **/.DS_Store +.terraform.lock.hcl diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index ba2e66c..3c7fa1b 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -14,6 +14,11 @@ Given a version number MAJOR.MINOR.PATCH: - MINOR version when adding functionality in a backwards compatible manner, - PATCH version when making backwards compatible bug fixes. +== v3.2.0 (unreleased) + +=== New features +* Added Remote Peering Connection capability in DRG module (feat #71) + == v3.1.0 (October 06, 2021) === New features diff --git a/README.adoc b/README.adoc index 0ac66b1..60948dd 100644 --- a/README.adoc +++ b/README.adoc @@ -41,6 +41,7 @@ It creates the following resources: * An optional NAT gateway and a route table * An optional service gateway * An optional dynamic routing gateway +* An optional remote peering connection * One or more optional Local Peering Gateways in requestor or acceptor mode, and possibilities to associate a Route Table It also controls the Default Security List, with a *Lockdown mode* that can be enabled or disabled diff --git a/README.md b/README.md index 7752730..00513fa 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ It creates the following resources: * An optional NAT gateway * An optional service gateway * An optional dynamic routing gateway +* An optional remote peering connection * One or more optional Local Peering Gateways in requestor or acceptor mode, and possibilities to associate a Route Table It also controls the Default Security List, with a *Lockdown mode* that can be enabled or disabled. diff --git a/docs/images/network_remote_peering_basic.png b/docs/images/network_remote_peering_basic.png new file mode 100644 index 0000000000000000000000000000000000000000..642fbd25a304aac3685567fcc15f92b7823eb0d6 GIT binary patch literal 29775 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 terraform init +> terraform plan +> terraform apply +``` + +See [Provisioning Infrastructure with Terraform] for more details about Terraform CLI and the available subcommands. diff --git a/examples/rpc/rpc_from_drg_module/main.tf b/examples/rpc/rpc_from_drg_module/main.tf new file mode 100644 index 0000000..8727312 --- /dev/null +++ b/examples/rpc/rpc_from_drg_module/main.tf @@ -0,0 +1,175 @@ +# Copyright (c) 2019, 2021, Oracle Corporation and/or affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ + +# Version requirements + +terraform { + required_providers { + oci = { + source = "hashicorp/oci" + version = ">=4.41.0" + } + } + required_version = ">= 1.0.0" +} + +# Resources + +module "vcn_acceptor" { + # this module use the generic vcn module and configure it to act as vcn for RPC acceptor + source = "oracle-terraform-modules/vcn/oci" + version = "3.2.0" + + # general oci parameters + compartment_id = var.compartment_id + label_prefix = var.label_prefix + freeform_tags = var.freeform_tags + + # vcn parameters + create_drg = false #! deprecated inner drg, use drg-module instead + create_internet_gateway = false + lockdown_default_seclist = false + create_nat_gateway = true + create_service_gateway = false + vcn_cidrs = var.vcn_cidrs_acceptor + vcn_dns_label = "vcnacceptor" + vcn_name = "vcn-rpc-acceptor" + + nat_gateway_route_rules = [for cidr in var.vcn_cidrs_requestor : + { + destination = cidr # set requestor vcn cidr as destination cidr + destination_type = "CIDR_BLOCK" + network_entity_id = module.drg_acceptor.drg_id + description = "Terraformed - User added Routing Rule to requestor VCN through DRG" + } + ] + + providers = { + oci = oci.acceptor + } + +} + + +resource "oci_core_subnet" "subnet_acceptor" { + provider = oci.acceptor + count = length(var.vcn_cidrs_acceptor) + + #Required + compartment_id = var.compartment_id + vcn_id = module.vcn_acceptor.vcn_id + #in this example each subnet will use the entire vcn address space + cidr_block = var.vcn_cidrs_acceptor[count.index] + + #Optional + display_name = "sub-rpc-acceptor-${count.index}" + dns_label = "subacceptor${count.index}" + prohibit_public_ip_on_vnic = true + route_table_id = module.vcn_acceptor.nat_route_id + freeform_tags = var.freeform_tags +} + + +module "drg_acceptor" { + source = "oracle-terraform-modules/vcn/oci//modules/drg" + version = "3.2.0" + + compartment_id = var.compartment_id + label_prefix = var.label_prefix + + # drg parameters + drg_vcn_attachments = { + "vcn_acceptor" = { + vcn_id = module.vcn_acceptor.vcn_id + vcn_transit_routing_rt_id = null + drg_route_table_id = null + } + } + drg_display_name = "drg-rpc-acceptor" + + # rpc parameters + create_rpc = true + + providers = { + oci = oci.acceptor + } +} + + +module "vcn_requestor" { + # this module use the generic vcn module and configure it to act as rpc requestor vcn + source = "oracle-terraform-modules/vcn/oci" + version = "3.2.0" + + # general oci parameters + compartment_id = var.compartment_id + label_prefix = var.label_prefix + freeform_tags = var.freeform_tags + + # vcn parameters + create_drg = false #! deprecated inner drg, use drg-module instead + create_internet_gateway = true + lockdown_default_seclist = false + create_nat_gateway = false + create_service_gateway = false + vcn_cidrs = var.vcn_cidrs_requestor + vcn_dns_label = "vcnrequestor" + vcn_name = "vcn-rpc-requestor" + + internet_gateway_route_rules = [for cidr in var.vcn_cidrs_acceptor : + { + destination = cidr # set acceptor vcn cidr as destination cidr + destination_type = "CIDR_BLOCK" + network_entity_id = module.drg_requestor.drg_id + description = "Terraformed - User added Routing Rule to acceptor VCN through DRG" + } + ] + + providers = { + oci = oci.requestor + } + +} + +resource "oci_core_subnet" "subnet_requestor" { + provider = oci.requestor + count = length(var.vcn_cidrs_requestor) + + #Required + compartment_id = var.compartment_id + vcn_id = module.vcn_requestor.vcn_id + #in this example each subnet will use the entire vcn address space + cidr_block = var.vcn_cidrs_requestor[count.index] + + #Optional + display_name = "sub-rpc-requestor-${count.index}" + dns_label = "subrequestor${count.index}" + prohibit_public_ip_on_vnic = false + route_table_id = module.vcn_requestor.ig_route_id + freeform_tags = var.freeform_tags +} + +module "drg_requestor" { + source = "oracle-terraform-modules/vcn/oci//modules/drg" + version = "3.2.0" + + compartment_id = var.compartment_id + label_prefix = var.label_prefix + + # drg parameters + drg_vcn_attachments = { "vcn_requestor" = { + vcn_id = module.vcn_requestor.vcn_id + vcn_transit_routing_rt_id = null + drg_route_table_id = null + } } + drg_display_name = "drg-rpc-requestor" + + # rpc parameters + create_rpc = true + rpc_acceptor_id = module.drg_acceptor.rpc_id + rpc_acceptor_region = var.region_acceptor + + providers = { + oci = oci.requestor + } +} diff --git a/examples/rpc/rpc_from_drg_module/terraform.tfvars.example b/examples/rpc/rpc_from_drg_module/terraform.tfvars.example new file mode 100644 index 0000000..cb2a347 --- /dev/null +++ b/examples/rpc/rpc_from_drg_module/terraform.tfvars.example @@ -0,0 +1,38 @@ +# Copyright (c) 2019, 2021 Oracle Corporation and/or affiliates. All rights reserved. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl + +# provider identity parameters + +api_fingerprint = "" + +api_private_key_path = "" + + + +tenancy_id = "" + +user_id = "" + +# general oci parameters + +compartment_id = "" + +label_prefix = "tf-rpc" + +freeform_tags = { + environment = "dev" + lab = "rpc" +} + +# rpc acceptor parameters +region_acceptor = "us-phoenix-1" +vcn_cidrs_acceptor = ["10.0.0.0/24"] + +# rpc requestor parameters +region_requestor = "us-ashburn-1" +vcn_cidrs_requestor = ["192.168.0.0/24"] + + + + + diff --git a/examples/rpc/rpc_from_drg_module/variables.tf b/examples/rpc/rpc_from_drg_module/variables.tf new file mode 100644 index 0000000..af8199e --- /dev/null +++ b/examples/rpc/rpc_from_drg_module/variables.tf @@ -0,0 +1,83 @@ +# Copyright (c) 2019, 2021, Oracle Corporation and/or affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl + +# provider identity parameters +variable "api_fingerprint" { + description = "fingerprint of oci api private key" + type = string + # no default value, asking user to explicitly set this variable's value. see codingconventions.adoc +} + +variable "api_private_key_path" { + description = "path to oci api private key used" + type = string + # no default value, asking user to explicitly set this variable's value. see codingconventions.adoc +} + +variable "tenancy_id" { + description = "tenancy id where to create the sources" + type = string + # no default value, asking user to explicitly set this variable's value. see codingconventions.adoc +} + +variable "user_id" { + description = "id of user that terraform will use to create the resources" + type = string + # no default value, asking user to explicitly set this variable's value. see codingconventions.adoc +} + +# general oci parameters + +variable "compartment_id" { + description = "compartment id where to create all resources" + type = string + # no default value, asking user to explicitly set this variable's value. see codingconventions.adoc +} + +variable "label_prefix" { + description = "a string that will be prepended to all resources" + type = string + default = "terraform-oci" +} + +variable "freeform_tags" { + description = "simple key-value pairs to tag the created resources using freeform OCI Free-form tags." + type = map(any) + default = { + terraformed = "please do not edit manually" + module = "oracle-terraform-modules/vcn/oci" + } +} + + +# acceptor parameters + +variable "region_acceptor" { + description = "the oci region where RPC acceptor resources will be created" + type = string + # no default value, asking user to explicitly set this variable's value. see codingconventions.adoc + # List of regions: https://docs.cloud.oracle.com/iaas/Content/General/Concepts/regions.htm#ServiceAvailabilityAcrossRegions +} + +variable "vcn_cidrs_acceptor" { + description = "The updatable list of IPv4 CIDR blocks the RPC acceptor VCN will use." + type = list(string) + default = ["10.0.0.0/24"] +} + +# requestor parameter + +variable "region_requestor" { + description = "OCI region where RPC requstor resources will be created" + type = string + # no default value, asking user to explicitly set this variable's value. see codingconventions.adoc + # List of regions: https://docs.cloud.oracle.com/iaas/Content/General/Concepts/regions.htm#ServiceAvailabilityAcrossRegions +} + +variable "vcn_cidrs_requestor" { + description = "The updatable list of IPv4 CIDR blocks the RPC requestor VCN will use." + type = list(string) + default = ["192.168.0.0/24"] +} + + diff --git a/examples/rpc/rpc_from_vcn_module/README.md b/examples/rpc/rpc_from_vcn_module/README.md new file mode 100644 index 0000000..a0ec28c --- /dev/null +++ b/examples/rpc/rpc_from_vcn_module/README.md @@ -0,0 +1,80 @@ +# Creating a remote VCN peering using RPCs with terraform-oci-vcn + +[Terraform Variable Definition file]:https://www.terraform.io/docs/language/values/variables.html#variable-definitions-tfvars-files +[Input Variables]:https://www.terraform.io/docs/language/values/variables.html +[Local Values]:https://www.terraform.io/docs/language/values/locals.html +[Named Values]:https://www.terraform.io/docs/language/expressions/references.html +[docs/prerequisites]:https://github.com/oracle-terraform-modules/terraform-oci-vcn/blob/main/docs/prerequisites.adoc +[docs/terraformoptions]:https://github.com/oracle-terraform-modules/terraform-oci-vcn/blob/main/docs/terraformoptions.adoc +[docs/routing_rules]:https://github.com/oracle-terraform-modules/terraform-oci-vcn/blob/main/docs/routing_rules.adoc +[Provisioning Infrastructure with Terraform]:https://www.terraform.io/docs/cli/run/index.html + +This example illustrates how to use terraform-oci-vcn to create a remote VCN peering between VCNs created in different regions, using the Remote Peering Gateway. +> **Note:** This example is provide for backwards compatibility, using the vcn module to handle the DRG and RPC. For new projects you should use [this one](../rpc_from_drg_module/README.md) + +In the acceptor region will be created: +- a VCN, with a private subnet for each given CIDR block, and a NAT gateway +- a DRG attached to the VCN +- the route rules to allow traffic through the Peering + +In the requestor region will be created: +- a VCN with, a public subnet for each given CIDR block, and an Internet Gateway +- a DRG attached to the VCN +- the route rules to allow traffic through the Peering + +This diagram illustrates what will be created by this example. + +![diagram](../../..//docs/images/network_remote_peering_basic.png) + +## Prerequisites + +You will need to collect the following information before you start: + +1. your OCI provider authentication values +2. a compartment OCID in which the present configuration will be created + +For detailed instructions, see [docs/prerequisites] + +## Using this example with Terraform CLI + +### Creating Providers + +You need to create 2 providers: +* 1 provider for the local region where all the local resources will be created +* 1 provider for the remote region where all the remote resources will be created (alias: remote) + +``` +provider "oci" { + fingerprint = var.api_fingerprint + private_key_path = var.api_private_key_path + region = var.region_acceptor + tenancy_ocid = var.tenancy_id + user_ocid = var.user_id + alias = "acceptor" +} + +provider "oci" { + fingerprint = var.api_fingerprint + private_key_path = var.api_private_key_path + region = var.region_requestor + tenancy_ocid = var.tenancy_id + user_ocid = var.user_id + alias = "requestor" +} +``` + +### Creating Terraform variables definition file + +Prepare one [Terraform Variable Definition file] named terraform.tfvars with the required authentication information. + +*TIP: You can rename and configure [terraform.tfvars.example](terraform.tfvars.example) from this example's folder.* + +Then apply the example using the following commands: + +```shell +> terraform init +> terraform plan +> terraform apply +``` + +See [Provisioning Infrastructure with Terraform] for more details about Terraform CLI and the available subcommands. diff --git a/examples/rpc/rpc_from_vcn_module/main.tf b/examples/rpc/rpc_from_vcn_module/main.tf new file mode 100644 index 0000000..875941f --- /dev/null +++ b/examples/rpc/rpc_from_vcn_module/main.tf @@ -0,0 +1,128 @@ +# Copyright (c) 2019, 2021, Oracle Corporation and/or affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ + +# Version requirements + +terraform { + required_providers { + oci = { + source = "hashicorp/oci" + version = ">=4.41.0" + } + } + required_version = ">= 1.0.0" +} + +# Resources + +module "vcn_acceptor" { + # this module use the generic vcn module and configure it to act as rpc acceptor vcn + source = "oracle-terraform-modules/vcn/oci" + version = "3.2.0" + + # general oci parameters + compartment_id = var.compartment_id + label_prefix = var.label_prefix + freeform_tags = var.freeform_tags + + # vcn parameters + create_drg = true + create_rpc = true + create_internet_gateway = false + lockdown_default_seclist = false + create_nat_gateway = true + create_service_gateway = false + vcn_cidrs = var.vcn_cidrs_acceptor + vcn_dns_label = "vcnacceptor" + vcn_name = "vcn-rpc-acceptor" + + nat_gateway_route_rules = [for cidr in var.vcn_cidrs_requestor : + { + destination = cidr # set requestor vcn cidr as destination cidr + destination_type = "CIDR_BLOCK" + network_entity_id = "drg" + description = "Terraformed - User added Routing Rule to requestor VCN through DRG" + } + ] + + providers = { + oci = oci.acceptor + } + +} + +resource "oci_core_subnet" "subnet_acceptor" { + provider = oci.acceptor + count = length(var.vcn_cidrs_acceptor) + + #Required + compartment_id = var.compartment_id + vcn_id = module.vcn_acceptor.vcn_id + #in this example each subnet will use the entire vcn address space + cidr_block = var.vcn_cidrs_acceptor[count.index] + + #Optional + display_name = "sub-rpc-acceptor-${count.index}" + dns_label = "subacceptor${count.index}" + prohibit_public_ip_on_vnic = true + route_table_id = module.vcn_acceptor.nat_route_id + freeform_tags = var.freeform_tags +} + + +module "vcn_requestor" { + # this module use the generic vcn module and configure it to act as rpc requestor vcn + source = "oracle-terraform-modules/vcn/oci" + version = "3.2.0" + + # general oci parameters + compartment_id = var.compartment_id + label_prefix = var.label_prefix + freeform_tags = var.freeform_tags + + # vcn parameters + create_drg = true + create_rpc = true + create_internet_gateway = true + lockdown_default_seclist = false + create_nat_gateway = false + create_service_gateway = false + vcn_cidrs = var.vcn_cidrs_requestor + vcn_dns_label = "vcnrequestor" + vcn_name = "vcn-rpc-requestor" + + internet_gateway_route_rules = [for cidr in var.vcn_cidrs_acceptor : + { + destination = cidr # set acceptor vcn cidr as destination cidr + destination_type = "CIDR_BLOCK" + network_entity_id = "drg" + description = "Terraformed - User added Routing Rule to acceptor VCN through DRG" + } + ] + + drg_rpc_acceptor_id = module.vcn_acceptor.rpc_id + drg_rpc_acceptor_region = var.region_acceptor + + providers = { + oci = oci.requestor + } + +} + +resource "oci_core_subnet" "subnet_requestor" { + provider = oci.requestor + count = length(var.vcn_cidrs_requestor) + + #Required + compartment_id = var.compartment_id + vcn_id = module.vcn_requestor.vcn_id + #in this example each subnet will use the entire vcn address space + cidr_block = var.vcn_cidrs_requestor[count.index] + + #Optional + display_name = "sub-rpc-requestor-${count.index}" + dns_label = "subrequestor${count.index}" + prohibit_public_ip_on_vnic = false + route_table_id = module.vcn_requestor.ig_route_id + freeform_tags = var.freeform_tags +} diff --git a/examples/rpc/rpc_from_vcn_module/terraform.tfvars.example b/examples/rpc/rpc_from_vcn_module/terraform.tfvars.example new file mode 100644 index 0000000..cb2a347 --- /dev/null +++ b/examples/rpc/rpc_from_vcn_module/terraform.tfvars.example @@ -0,0 +1,38 @@ +# Copyright (c) 2019, 2021 Oracle Corporation and/or affiliates. All rights reserved. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl + +# provider identity parameters + +api_fingerprint = "" + +api_private_key_path = "" + + + +tenancy_id = "" + +user_id = "" + +# general oci parameters + +compartment_id = "" + +label_prefix = "tf-rpc" + +freeform_tags = { + environment = "dev" + lab = "rpc" +} + +# rpc acceptor parameters +region_acceptor = "us-phoenix-1" +vcn_cidrs_acceptor = ["10.0.0.0/24"] + +# rpc requestor parameters +region_requestor = "us-ashburn-1" +vcn_cidrs_requestor = ["192.168.0.0/24"] + + + + + diff --git a/examples/rpc/rpc_from_vcn_module/variables.tf b/examples/rpc/rpc_from_vcn_module/variables.tf new file mode 100644 index 0000000..2da9f11 --- /dev/null +++ b/examples/rpc/rpc_from_vcn_module/variables.tf @@ -0,0 +1,83 @@ +# Copyright (c) 2019, 2021, Oracle Corporation and/or affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl + +# provider identity parameters +variable "api_fingerprint" { + description = "fingerprint of oci api private key" + type = string + # no default value, asking user to explicitly set this variable's value. see codingconventions.adoc +} + +variable "api_private_key_path" { + description = "path to oci api private key used" + type = string + # no default value, asking user to explicitly set this variable's value. see codingconventions.adoc +} + + +variable "tenancy_id" { + description = "tenancy id where to create the sources" + type = string + # no default value, asking user to explicitly set this variable's value. see codingconventions.adoc +} + +variable "user_id" { + description = "id of user that terraform will use to create the resources" + type = string + # no default value, asking user to explicitly set this variable's value. see codingconventions.adoc +} + +# general oci parameters + +variable "compartment_id" { + description = "compartment id where to create all resources" + type = string + # no default value, asking user to explicitly set this variable's value. see codingconventions.adoc +} + +variable "label_prefix" { + description = "a string that will be prepended to all resources" + type = string + default = "terraform-oci" +} + +variable "freeform_tags" { + description = "simple key-value pairs to tag the created resources using freeform OCI Free-form tags." + type = map(any) + default = { + terraformed = "please do not edit manually" + module = "oracle-terraform-modules/vcn/oci" + } +} + +# acceptor parameters + +variable "region_acceptor" { + description = "the oci region where RPC acceptor resources will be created" + type = string + # no default value, asking user to explicitly set this variable's value. see codingconventions.adoc + # List of regions: https://docs.cloud.oracle.com/iaas/Content/General/Concepts/regions.htm#ServiceAvailabilityAcrossRegions +} + +variable "vcn_cidrs_acceptor" { + description = "The updatable list of IPv4 CIDR blocks the RPC acceptor VCN will use." + type = list(string) + default = ["10.0.0.0/24"] + +} + +# requestor parameter + +variable "region_requestor" { + description = "OCI region where RPC requstor resources will be created" + type = string + # no default value, asking user to explicitly set this variable's value. see codingconventions.adoc + # List of regions: https://docs.cloud.oracle.com/iaas/Content/General/Concepts/regions.htm#ServiceAvailabilityAcrossRegions +} + +variable "vcn_cidrs_requestor" { + description = "The updatable list of IPv4 CIDR blocks the RPC requestor VCN will use." + type = list(string) + default = ["192.168.0.0/24"] +} + diff --git a/main.tf b/main.tf index f20e94d..5e9673f 100644 --- a/main.tf +++ b/main.tf @@ -15,5 +15,14 @@ module "drg_from_vcn_module" { # drg parameters drg_display_name = var.label_prefix == "none" ? "${var.drg_display_name}_created_from_${var.vcn_name}" : "${var.drg_display_name}" - count = var.create_drg == true ? 1 : 0 -} \ No newline at end of file + #rpc parameters + create_rpc = var.create_rpc + rpc_acceptor_id = var.drg_rpc_acceptor_id + rpc_acceptor_region = var.drg_rpc_acceptor_region + + + count = var.create_drg == true || var.create_rpc == true ? 1 : 0 +} + + + diff --git a/modules/drg/README.md b/modules/drg/README.md index b378027..068e07c 100644 --- a/modules/drg/README.md +++ b/modules/drg/README.md @@ -20,6 +20,7 @@ No requirements. |------|------| | [oci_core_drg.drg](https://registry.terraform.io/providers/hashicorp/oci/latest/docs/resources/core_drg) | resource | | [oci_core_drg_attachment.vcns](https://registry.terraform.io/providers/hashicorp/oci/latest/docs/resources/core_drg_attachment) | resource | +| [oci_core_remote_peering_connection.rpc](https://registry.terraform.io/providers/hashicorp/oci/latest/docs/data-sources/core_remote_peering_connections) | resource | ## Inputs | Name | Description | Type | Default | Required | @@ -31,6 +32,9 @@ No requirements. | [freeform\_tags](#input\_freeform\_tags) | simple key-value pairs to tag the created resources using freeform OCI Free-form tags. | `map(any)` |

{
"module": "oracle-terraform-modules/vcn/oci//modules/drg",
"terraformed": "Please do not edit manually"
}
| no | | [label\_prefix](#input\_label\_prefix) | a string that will be prepended to all resources | `string` | `"none"` | no | | [region](#input\_region) | the OCI region where resources will be created | `string` | `null` | no | +| [create\_rpc](#input\_create\_rpc) | whether to create Remote Peering Connection. If set to true, creates an Remote Peerin Connection | `bool` | `false` | no | +| [remote\_rpc\_id](#input\_remote\_\rpc\_id) | the Remote Peering Connection ID to peer with, running in a remote OCI region. It is required in only one of the two RPCs to establish the peering | `string` | `null` | no | +| [remote\_rpc\_region](#input\_remote\_rpc\_region) | the remote OCI region to establish the peer with. List of regions can be found here: https://docs.cloud.oracle.com/iaas/Content/General/Concepts/regions.htm#ServiceAvailabilityAcrossRegions | `string` | `null` | no | ## Outputs | Name | Description | @@ -40,5 +44,8 @@ No requirements. | [drg\_display\_name](#output\_drg\_display\_name) | display name of drg if it is created | | [drg\_id](#output\_drg\_id) | id of drg if it is created | | [drg\_summary](#output\_drg\_summary) | drg information summary | +| [rpc\_id](#output\_rpc\_id) | id of rpc if it is created | +| [rpc\_display\_name](#output\_rpc\_display\_name) | display name of rpc if it is created | +| [rpc\_all\_attributes](#output\_rpc\_all\_attributes) | all attributes related to rpc | \ No newline at end of file diff --git a/modules/drg/drg.tf b/modules/drg/drg.tf index 4e02efe..b87af58 100644 --- a/modules/drg/drg.tf +++ b/modules/drg/drg.tf @@ -30,3 +30,21 @@ resource "oci_core_drg_attachment" "vcns" { export_drg_route_distribution_id = null # (Optional) (Updatable) string remove_export_drg_route_distribution_trigger = false # (Optional) (Updatable) boolean } + +resource "oci_core_remote_peering_connection" "rpc" { + + compartment_id = var.compartment_id + drg_id = oci_core_drg.drg.id + display_name = var.label_prefix == "none" ? "rpc_created_from_${var.drg_display_name}" : "${var.label_prefix}_rpc" + + freeform_tags = var.freeform_tags + defined_tags = var.defined_tags + + + peer_id = var.rpc_acceptor_id + peer_region_name = var.rpc_acceptor_region + + count = var.create_rpc == true ? 1 : 0 + +} + diff --git a/modules/drg/outputs.tf b/modules/drg/outputs.tf index c4798e9..75ed9bc 100644 --- a/modules/drg/outputs.tf +++ b/modules/drg/outputs.tf @@ -6,11 +6,14 @@ output "drg_id" { value = join(",", oci_core_drg.drg[*].id) } + + output "drg_display_name" { description = "display name of drg if it is created" value = join(",", oci_core_drg.drg[*].display_name) } + # Complete outputs for each resources with provider parity. Auto-updating. # Usefull for module composition. @@ -30,6 +33,31 @@ output "drg_summary" { (oci_core_drg.drg.display_name) = { drg_id = oci_core_drg.drg.id vcn_attachments = { for k, v in oci_core_drg_attachment.vcns : k => v.network_details[0].id } + + } + "rpc" = { + display_name = join(",", oci_core_remote_peering_connection.rpc[*].display_name) + rpc_id = join(",", oci_core_remote_peering_connection.rpc[*].id) } } } + + + +output "rpc_id" { + description = "id of RPC if it is created" + value = join(",", oci_core_remote_peering_connection.rpc[*].id) +} + +output "rpc_display_name" { + description = "display name of RPC if it is created" + value = join(",", oci_core_remote_peering_connection.rpc[*].display_name) +} + +output "rpc_all_attributes" { + description = "all attributes of created RPC" + value = { for k, v in oci_core_remote_peering_connection.rpc : k => v } +} + + + diff --git a/modules/drg/variables.tf b/modules/drg/variables.tf index 1e59426..4b4b68b 100644 --- a/modules/drg/variables.tf +++ b/modules/drg/variables.tf @@ -57,3 +57,24 @@ variable "drg_vcn_attachments" { type = map(any) default = null } + +variable "create_rpc" { + description = "Whether to create Remote Peering Connection. If set to true, creates an RPC" + type = bool + default = false +} + +variable "rpc_acceptor_id" { + description = "the ID of the remote RPC" + type = string + default = null +} +variable "rpc_acceptor_region" { + # List of regions: https://docs.cloud.oracle.com/iaas/Content/General/Concepts/regions.htm#ServiceAvailabilityAcrossRegions + description = "the OCI region where the Remote Peering Connection will be established with" + type = string + default = null +} + + + diff --git a/outputs.tf b/outputs.tf index b30d782..d8267b3 100644 --- a/outputs.tf +++ b/outputs.tf @@ -11,6 +11,12 @@ output "drg_id" { description = "Deprecated: Use drg sub-module instead. id of drg if it is created" value = join(",", module.drg_from_vcn_module[*].drg_id) } + +output "rpc_id" { + description = "id of rpc if it is created" + value = join(",", module.drg_from_vcn_module[*].rpc_id) +} + output "nat_gateway_id" { description = "id of nat gateway if it is created" value = join(",", oci_core_nat_gateway.nat_gateway[*].id) @@ -79,3 +85,7 @@ output "vcn_all_attributes" { description = "all attributes of created vcn" value = { for k, v in oci_core_vcn.vcn : k => v } } + +output "drg_summary" { + value = { for k, v in module.drg_from_vcn_module : k => v.drg_summary } +} diff --git a/variables.tf b/variables.tf index fa4f530..9dbc370 100644 --- a/variables.tf +++ b/variables.tf @@ -42,6 +42,12 @@ variable "create_drg" { default = false } +variable "create_rpc" { + description = "Whether to create Remote Peering Connection in the DRG module. It requires a DRG to be created" + type = bool + default = false +} + variable "create_internet_gateway" { description = "whether to create the internet gateway in the vcn. If set to true, creates an Internet Gateway." default = false @@ -119,6 +125,20 @@ variable "drg_display_name" { } } +variable "drg_rpc_acceptor_id" { + #! Added for compatibility with inner drg management. Please use drg sub-module instead + description = "the ID of the RPC acceptor" + type = string + default = null +} +variable "drg_rpc_acceptor_region" { + #! Added for compatibility with inner drg management. Please use drg sub-module instead + # List of regions: https://docs.cloud.oracle.com/iaas/Content/General/Concepts/regions.htm#ServiceAvailabilityAcrossRegions + description = "the OCI region where the Remote Peering Connection will be established with" + type = string + default = null +} + variable "internet_gateway_display_name" { description = "(Updatable) Name of Internet Gateway. Does not have to be unique." type = string