diff --git a/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/README.md b/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/README.md new file mode 100644 index 0000000..3248491 --- /dev/null +++ b/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/README.md @@ -0,0 +1,52 @@ +# Fabric Port to Fabric Alibaba Profile Connection + +This example shows how to leverage the [Fabric Port Connection Module](https://registry.terraform.io/modules/equinix/fabric/equinix/latest/submodules/port-connection) +to create a Fabric Connection from a Fabric Port to Fabric Alibaba Service Profile. + +It leverages the Equinix Terraform Provider, the Alibaba Terraform Provider, and the Fabric Port Connection +Module to setup the connection based on the parameters you have provided to this example; or based on the pattern +you see used in this example it will allow you to create a more specific use case for your own needs. + +See example usage below for details on how to use this example. +### Step by Step Instructions for Fabric Port to Fabric Alibaba Profile Connection + +#### 1. Create Connection from Equinix Terraform Provider + +**Note:** The `connection_name` must follow either one of these patterns: + +* A unique `connection_name` with atmost 24 characters +`connection_name = var.connection_name` +* A `connection_name` with atmost 12 characters combined with a random string of 12 characters: + `connection_name = "${var.connection_name}${random_string.random.result}"` + Use the `random_string` resource to perform this operation: + ```hcl + resource "random_string" "random" { + length = 12 + special = false + } + ``` + * A unique `connection_name` is generated by appending a 12-character random string to the variable name given by the user + * A Fabric Port to Alibaba Profile Connection is successfully created and displayed in the Fabric Portal + * An Express Connect Physical Connection resource is created and becomes visible in the Alibaba Portal + +#### 2. Formulate main.tf and output.tf Files +* When you run the initial `terraform apply`, the resources and data sources (from the example) are in comments +* The comments can be removed after you accept the connection with the Alibaba portal + +#### 3. Accept the Connection Request +* Manually accept the connection request in the Alibaba Portal for the created physical connection + +#### 4. Create the Virtual Border Router (VBR) Resource +* Remove the commented code to create the VBR resource +* Run `terraform init` to initialize and `terraform apply` to deploy the configuration +* The VBR resource is created successfully and linked to the physical connection + +#### 5. Delete Resources +* Run `terraform destroy` to delete the Alibaba VBR +* Directly deleting the Equinix Fabric connection, will result in the following error: `ERR-UAA-003-00: Deletion for a provisioned connection needs to be initiated from Alibaba Portal` +* Go to the Alibaba Portal to manually **terminate** and then **delete** the physical connection +* This action will automatically delete the connection on the Equinix side, updating its status to Deprovisioned on both Equinix and Provider side + + + + diff --git a/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/main.tf b/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/main.tf new file mode 100644 index 0000000..1d50c29 --- /dev/null +++ b/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/main.tf @@ -0,0 +1,60 @@ +provider "equinix" { + client_id = var.equinix_client_id + client_secret = var.equinix_client_secret +} + +module "create_port_2_alibaba_connection" { + source = "../../modules/port-connection" + + connection_name = var.connection_name + connection_type = var.connection_type + notifications_type = var.notifications_type + notifications_emails = var.notifications_emails + bandwidth = var.bandwidth + purchase_order_number = var.purchase_order_number + project_id = var.project_id + + # A-side + aside_port_name = var.aside_port_name + aside_vlan_tag = var.aside_vlan_tag + + # Z-side + zside_ap_type = var.zside_ap_type + zside_ap_authentication_key = var.zside_ap_authentication_key + zside_ap_profile_type = var.zside_ap_profile_type + zside_location = var.zside_location + zside_seller_region = var.zside_seller_region + zside_sp_name = var.zside_sp_name +} + +# provider "alicloud" { +# access_key = var.access_key +# secret_key = var.secret_key +# region = var.region +# } +# +# data "alicloud_express_connect_physical_connections" "nameRegex" { +# name_regex = "^${module.create_port_2_alibaba_connection.primary_connection.name}" +# } +# +# resource "alicloud_express_connect_virtual_border_router" "vbr" { +# local_gateway_ip = var.local_gateway_ip +# peer_gateway_ip = var.peer_gateway_ip +# peering_subnet_mask = var.peering_subnet_mask +# physical_connection_id = data.alicloud_express_connect_physical_connections.nameRegex.connections[0].id +# virtual_border_router_name = var.virtual_border_router_name +# vlan_id = one(one(one(module.create_port_2_alibaba_connection.primary_connection.z_side).access_point).link_protocol).vlan_tag +# min_rx_interval = var.min_rx_interval +# min_tx_interval = var.min_tx_interval +# detect_multiplier = var.detect_multiplier +# } +# +# resource "null_resource" "destroy_warning" { +# triggers = { +# warning = "WARNING: Destroy process is not complete yet. You need to delete the resource from Alibaba Portal!" +# } +# } +# +# data "alicloud_express_connect_virtual_border_routers" "nameRegexVbr" { +# name_regex = "^${alicloud_express_connect_virtual_border_router.vbr.virtual_border_router_name}" +# } diff --git a/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/outputs.tf b/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/outputs.tf new file mode 100644 index 0000000..acd1cf2 --- /dev/null +++ b/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/outputs.tf @@ -0,0 +1,21 @@ +output "alibaba_connection" { + value = module.create_port_2_alibaba_connection.primary_connection + sensitive = true +} + +output "alibaba_connection_id" { + value = module.create_port_2_alibaba_connection.primary_connection_id +} + +# output "alicloud_express_connect_virtual_border_router" { +# value = alicloud_express_connect_virtual_border_router.vbr +# sensitive = true +# } +# +# output "alicloud_express_connect_virtual_border_router_id" { +# value = alicloud_express_connect_virtual_border_router.vbr.id +# } +# +# output "express_connect_virtual_border_router_id" { +# value = data.alicloud_express_connect_virtual_border_routers.nameRegexVbr.routers.0.id +# } diff --git a/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/terraform.tfvars.example b/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/terraform.tfvars.example new file mode 100644 index 0000000..6debf8b --- /dev/null +++ b/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/terraform.tfvars.example @@ -0,0 +1,33 @@ +equinix_client_id = "MyEquinixClientId" +equinix_client_secret = "MyEquinixSecret" + +connection_name = "Port_2_alibaba" +connection_type = "EVPL_VC" +notifications_type = "ALL" +notifications_emails = ["example@equinix.com"] +bandwidth = 50 +purchase_order_number = "1-323292" +aside_port_name = "sit-tb1-dc-e5.tlab,10GSMF,A,001,201257, 21951980" +aside_vlan_tag = 2019 +zside_ap_type = "SP" +zside_ap_authentication_key = "" +zside_ap_profile_type = "L2_PROFILE" +zside_location = "SY" +zside_sp_name = "Alibaba Cloud Express Connect" +zside_seller_region = "ap-southeast-2" +zside_ap_profile_type = "L2_PROFILE" +zside_ap_type = "SP" +zside_location = "SV" +zside_seller_region = "us-west-1" +zside_sp_name = "Alibaba Cloud Express Connect" +region = "us-west-1" +local_gateway_ip = "10.0.0.1" +peer_gateway_ip = "10.0.0.2" +peering_subnet_mask = "255.255.255.252" +virtual_border_router_name = "Port_2_Alibaba_VBR" +min_rx_interval = 1000 +min_tx_interval = 1000 +detect_multiplier = 10 +access_key = "" +secret_key = "" +project_id = "" diff --git a/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/variables.tf b/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/variables.tf new file mode 100644 index 0000000..9113f8e --- /dev/null +++ b/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/variables.tf @@ -0,0 +1,133 @@ +variable "equinix_client_id" { + description = "Equinix client ID (consumer key), obtained after registering app in the developer platform" + type = string + sensitive = true +} +variable "equinix_client_secret" { + description = "Equinix client secret ID (consumer secret), obtained after registering app in the developer platform" + type = string + sensitive = true +} +variable "connection_name" { + description = "Connection name. An alpha-numeric 24 characters string which can include only hyphens and underscores" + type = string +} +variable "project_id" { + description = "Subscriber-assigned project ID" + type = string + default = "" +} +variable "connection_type" { + description = "Defines the connection type like VG_VC, EVPL_VC, EPL_VC, EC_VC, IP_VC, ACCESS_EPL_VC" + type = string +} +variable "notifications_type" { + description = "Notification Type - ALL is the only type currently supported" + type = string + default = "ALL" +} +variable "notifications_emails" { + description = "Array of contact emails" + type = list(string) +} +variable "bandwidth" { + description = "Connection bandwidth in Mbps" + type = number +} +variable "purchase_order_number" { + description = "Purchase order number" + type = string + default = "" +} +variable "aside_port_name" { + description = "Equinix A-Side Port Name" + type = string +} +variable "aside_vlan_tag" { + description = "Vlan Tag information, outer vlanSTag for QINQ connections" + type = string +} +variable "aside_vlan_inner_tag" { + description = "Vlan Inner Tag information, inner vlanCTag for QINQ connections" + type = string + default = "" +} +variable "zside_ap_type" { + description = "Access point type - COLO, VD, VG, SP, IGW, SUBNET, GW" + type = string +} +variable "zside_ap_authentication_key" { + description = "Authentication key for provider based connections" + type = string + sensitive = true +} +variable "zside_ap_profile_type" { + description = "Service profile type - L2_PROFILE, L3_PROFILE, ECIA_PROFILE, ECMC_PROFILE" + type = string +} +variable "zside_location" { + description = "Access point metro code" + type = string +} +variable "zside_sp_name" { + description = "Equinix Service Profile Name" + type = string +} +variable "zside_seller_region" { + description = "Access point seller region" + type = string +} +variable "region" { + description = "Region" + type = string +} +variable "access_point_id" { + description = "Access Point ID" + type = string + default = "" +} +variable "local_gateway_ip" { + description = "Local Gateway IP" + type = string + default = "" +} +variable "peer_gateway_ip" { + description = "Peer Gateway IP" + type = string + default = "" +} +variable "peering_subnet_mask" { + description = "Peering Subnet Mask" + type = string + default = "" +} +variable "min_rx_interval" { + description = "Minimum RX Interval" + type = string + default = "" +} +variable "min_tx_interval" { + description = "Minimum TX Interval" + type = string + default = "" +} +variable "detect_multiplier" { + description = "Detect Multiplier" + type = string + default = "" +} +variable "virtual_border_router_name" { + description = "Virtual Border Router Name" + type = string + default = "" +} +variable "access_key" { + description = "Access Key" + type = string + sensitive = true +} +variable "secret_key" { + description = "Secret Key" + type = string + sensitive = true +} diff --git a/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/versions.tf b/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/versions.tf new file mode 100644 index 0000000..327dda0 --- /dev/null +++ b/examples/port-2-alibaba-connection-with-alicloud-terraform-integration/versions.tf @@ -0,0 +1,9 @@ +terraform { + required_version = ">= 1.5.4" + required_providers { + equinix = { + source = "equinix/equinix" + version = ">= 2.9.0" + } + } +}