diff --git a/go.work.sum b/go.work.sum index 769d199a7..33bac7a71 100644 --- a/go.work.sum +++ b/go.work.sum @@ -402,6 +402,8 @@ github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 h1:dWB6v3RcOy0 github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f h1:7T++XKzy4xg7PKy+bM+Sa9/oe1OC88yz2hXQUISoXfA= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= +github.com/equinix-labs/metal-go v0.25.1 h1:uL83lRKyAcOfab+9r2xujAuLD8lTsqv89+SPvVFkcBM= +github.com/equinix-labs/metal-go v0.25.1/go.mod h1:SmxCklxW+KjmBLVMdEXgtFO5gD5/b4N0VxcNgUYbOH4= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch/v5 v5.5.0 h1:bAmFiUJ+o0o2B4OiTFeE3MqCOtyo+jjPP9iZ0VRxYUc= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= diff --git a/patches/0001-ignore-empty-order-block-and-set-max-1-for-project-b.patch b/patches/0001-ignore-empty-order-block-and-set-max-1-for-project-b.patch new file mode 100644 index 000000000..8d1c06ab8 --- /dev/null +++ b/patches/0001-ignore-empty-order-block-and-set-max-1-for-project-b.patch @@ -0,0 +1,52 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: ocobleseqx +Date: Thu, 26 Oct 2023 13:47:05 +0200 +Subject: [PATCH 1/7] ignore empty order block and set max 1 for project block + +Signed-off-by: ocobleseqx + +diff --git a/equinix/fabric_cloud_router_schema.go b/equinix/fabric_cloud_router_schema.go +index 0bc416e..402c4c3 100755 +--- a/equinix/fabric_cloud_router_schema.go ++++ b/equinix/fabric_cloud_router_schema.go +@@ -118,6 +118,7 @@ func createCloudRouterResourceSchema() map[string]*schema.Schema { + Type: schema.TypeSet, + Optional: true, + Description: "Fabric Cloud Router project", ++ MaxItems: 1, + Elem: &schema.Resource{ + Schema: createCloudRouterProjectSch(), + }, +diff --git a/equinix/resource_fabric_cloud_router.go b/equinix/resource_fabric_cloud_router.go +index 1f72db4..ed67ab8 100755 +--- a/equinix/resource_fabric_cloud_router.go ++++ b/equinix/resource_fabric_cloud_router.go +@@ -39,8 +39,6 @@ func resourceCloudRouterCreate(ctx context.Context, d *schema.ResourceData, meta + ctx = context.WithValue(ctx, v4.ContextAccessToken, meta.(*Config).FabricAuthToken) + schemaNotifications := d.Get("notifications").([]interface{}) + notifications := notificationToFabric(schemaNotifications) +- schemaOrder := d.Get("order").(*schema.Set).List() +- order := orderToFabric(schemaOrder) + schemaAccount := d.Get("account").(*schema.Set).List() + account := accountToCloudRouter(schemaAccount) + schemaLocation := d.Get("location").(*schema.Set).List() +@@ -56,7 +54,6 @@ func resourceCloudRouterCreate(ctx context.Context, d *schema.ResourceData, meta + createRequest := v4.CloudRouterPostRequest{ + Name: d.Get("name").(string), + Type_: d.Get("type").(string), +- Order: &order, + Location: &location, + Notifications: notifications, + Package_: &packages, +@@ -64,6 +61,11 @@ func resourceCloudRouterCreate(ctx context.Context, d *schema.ResourceData, meta + Project: &project, + } + ++ if v, ok := d.GetOk("order"); ok { ++ order := orderToFabric(v.(*schema.Set).List()) ++ createRequest.Order = &order ++ } ++ + fcr, _, err := client.CloudRoutersApi.CreateCloudRouter(ctx, createRequest) + if err != nil { + return diag.FromErr(err) diff --git a/patches/0001-user-agent.patch b/patches/0001-user-agent.patch deleted file mode 100644 index d3d131f9b..000000000 --- a/patches/0001-user-agent.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 66f7739b91be84f7034d8232078d8313ec9be094 Mon Sep 17 00:00:00 2001 -From: ocobleseqx -Date: Tue, 31 Oct 2023 17:13:45 +0100 -Subject: [PATCH] user agent - -Signed-off-by: ocobleseqx ---- - equinix/config.go | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/equinix/config.go b/equinix/config.go -index 085100e..ebe0192 100644 ---- a/equinix/config.go -+++ b/equinix/config.go -@@ -23,7 +23,6 @@ import ( - "github.com/hashicorp/go-retryablehttp" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/logging" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" -- "github.com/hashicorp/terraform-plugin-sdk/v2/meta" - "github.com/packethost/packngo" - xoauth2 "golang.org/x/oauth2" - ) -@@ -266,9 +265,8 @@ func MetalRetryPolicy(ctx context.Context, resp *http.Response, err error) (bool - return false, nil - } - --func terraformUserAgent(version string) string { -- ua := fmt.Sprintf("HashiCorp Terraform/%s (+https://www.terraform.io) Terraform Plugin SDK/%s", -- version, meta.SDKVersionString()) -+func pulumiUserAgent(version string) string { -+ ua := fmt.Sprintf("Pulumi/%s (+https://www.pulumi.com)", version) - - if add := os.Getenv(uaEnvVar); add != "" { - add = strings.TrimSpace(add) -@@ -323,7 +321,9 @@ func generateModuleUserAgentString(d *schema.ResourceData, baseUserAgent string) - } - - func (c *Config) fullUserAgent(suffix string) string { -- tfUserAgent := terraformUserAgent(c.terraformVersion) -- userAgent := fmt.Sprintf("%s terraform-provider-equinix/%s %s", tfUserAgent, version.ProviderVersion, suffix) -+ // FORK: this gives us the ability to add a Pulumi Specific user agent -+ // TODO (ocobles) override pulumi sdk version with ldflags -+ pulumiUserAgent := pulumiUserAgent("3.0") -+ userAgent := fmt.Sprintf("%s pulumi-equinix/%s %s", pulumiUserAgent, version.ProviderVersion, suffix) - return strings.TrimSpace(userAgent) - } --- -2.39.1 - diff --git a/patches/0002-chore-upgrade-metal-go-to-v0.25.1-431.patch b/patches/0002-chore-upgrade-metal-go-to-v0.25.1-431.patch new file mode 100644 index 000000000..8fec283fc --- /dev/null +++ b/patches/0002-chore-upgrade-metal-go-to-v0.25.1-431.patch @@ -0,0 +1,34 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Charles Treatman +Date: Fri, 27 Oct 2023 15:08:02 -0500 +Subject: [PATCH 2/7] chore: upgrade metal-go to v0.25.1 (#431) + + +diff --git a/go.mod b/go.mod +index 568022f..468d567 100644 +--- a/go.mod ++++ b/go.mod +@@ -5,7 +5,7 @@ go 1.20 + require ( + github.com/antihax/optional v1.0.0 + github.com/equinix-labs/fabric-go v0.7.0 +- github.com/equinix-labs/metal-go v0.16.0 ++ github.com/equinix-labs/metal-go v0.25.1 + github.com/equinix/ecx-go/v2 v2.3.1 + github.com/equinix/ne-go v1.11.0 + github.com/equinix/oauth2-go v1.0.0 +diff --git a/go.sum b/go.sum +index f12dd80..01dba66 100644 +--- a/go.sum ++++ b/go.sum +@@ -260,8 +260,8 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go. + github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= + github.com/equinix-labs/fabric-go v0.7.0 h1:AiiVPD4aE/aeiuCK7Fhsq4bvjmJ5RzmZ3boKnp0dl4g= + github.com/equinix-labs/fabric-go v0.7.0/go.mod h1:oqgGS3GOI8hHGPJKsAwDOEX0qRHl52sJGvwA/zMSd90= +-github.com/equinix-labs/metal-go v0.16.0 h1:4YmGx9SRFkDtHiEqRsSjlgJDztV6NHqH1eeaOZcK7d4= +-github.com/equinix-labs/metal-go v0.16.0/go.mod h1:SmxCklxW+KjmBLVMdEXgtFO5gD5/b4N0VxcNgUYbOH4= ++github.com/equinix-labs/metal-go v0.25.1 h1:uL83lRKyAcOfab+9r2xujAuLD8lTsqv89+SPvVFkcBM= ++github.com/equinix-labs/metal-go v0.25.1/go.mod h1:SmxCklxW+KjmBLVMdEXgtFO5gD5/b4N0VxcNgUYbOH4= + github.com/equinix/ecx-go/v2 v2.3.1 h1:gFcAIeyaEUw7S8ebqApmT7E/S7pC7Ac3wgScp89fkPU= + github.com/equinix/ecx-go/v2 v2.3.1/go.mod h1:FvCdZ3jXU8Z4CPKig2DT+4J2HdwgRK17pIcznM7RXyk= + github.com/equinix/ne-go v1.11.0 h1:ja6G2fmcGrLsOeV25Mq6pDfH+/cUlvxJbnE8uRXTGGk= diff --git a/patches/0003-fix-read-metal-go-client-s-auth-token-from-config-no.patch b/patches/0003-fix-read-metal-go-client-s-auth-token-from-config-no.patch new file mode 100644 index 000000000..d20939858 --- /dev/null +++ b/patches/0003-fix-read-metal-go-client-s-auth-token-from-config-no.patch @@ -0,0 +1,28 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Charles Treatman +Date: Tue, 31 Oct 2023 09:43:08 -0500 +Subject: [PATCH 3/7] fix: read metal-go client's auth token from config, not + env + +When the metal-go client was introduced to enable packngo deprecation, +it was wired up directly to the `METAL_AUTH_TOKEN` environment variable +for auth. This breaks auth when a customer is using the `auth_token` +provider configuration. + +This updates the metal-go client initialization so that the client will +work with both the `auth_token` setting and the `METAL_AUTH_TOKEN` env +var. + +diff --git a/equinix/config.go b/equinix/config.go +index ebe0192..d59a4b9 100644 +--- a/equinix/config.go ++++ b/equinix/config.go +@@ -228,7 +228,7 @@ func (c *Config) NewMetalGoClient() *metalv1.APIClient { + }, + } + configuration.HTTPClient = standardClient +- configuration.AddDefaultHeader("X-Auth-Token", os.Getenv("METAL_AUTH_TOKEN")) ++ configuration.AddDefaultHeader("X-Auth-Token", c.AuthToken) + configuration.UserAgent = c.fullUserAgent(configuration.UserAgent) + client := metalv1.NewAPIClient(configuration) + c.metalGoUserAgent = client.GetConfig().UserAgent diff --git a/patches/0004-feat-Adding-Port2IBM2.0-example-and-test-scripts.patch b/patches/0004-feat-Adding-Port2IBM2.0-example-and-test-scripts.patch new file mode 100644 index 000000000..477ad0b3e --- /dev/null +++ b/patches/0004-feat-Adding-Port2IBM2.0-example-and-test-scripts.patch @@ -0,0 +1,317 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: srushti-patl +Date: Wed, 25 Oct 2023 12:33:14 -0700 +Subject: [PATCH 4/7] feat: Adding Port2IBM2.0 example and test scripts + + +diff --git a/equinix/fabric_mapping_helper.go b/equinix/fabric_mapping_helper.go +index 8f40dbc..0ea1551 100644 +--- a/equinix/fabric_mapping_helper.go ++++ b/equinix/fabric_mapping_helper.go +@@ -24,12 +24,12 @@ func serviceTokenToFabric(serviceTokenRequest []interface{}) v4.ServiceToken { + + func additionalInfoToFabric(additionalInfoRequest []interface{}) []v4.ConnectionSideAdditionalInfo { + var mappedaiArray []v4.ConnectionSideAdditionalInfo +- for i, ai := range additionalInfoRequest { ++ for _, ai := range additionalInfoRequest { + aiMap := ai.(map[string]interface{}) + key := aiMap["key"].(string) + value := aiMap["value"].(string) + mappedai := v4.ConnectionSideAdditionalInfo{Key: key, Value: value} +- mappedaiArray[i] = mappedai ++ mappedaiArray = append(mappedaiArray, mappedai) + } + return mappedaiArray + } +diff --git a/equinix/resource_fabric_connection.go b/equinix/resource_fabric_connection.go +index 6583d27..2764fe9 100755 +--- a/equinix/resource_fabric_connection.go ++++ b/equinix/resource_fabric_connection.go +@@ -48,6 +48,7 @@ func resourceFabricConnectionCreate(ctx context.Context, d *schema.ResourceData, + projectReq := d.Get("project").(*schema.Set).List() + project := projectToFabric(projectReq) + additionalInfo := d.Get("additional_info").([]interface{}) ++ additionalinfo := additionalInfoToFabric(additionalInfo) + connectionASide := v4.ConnectionSide{} + for _, as := range aside { + asideMap := as.(map[string]interface{}) +@@ -91,15 +92,16 @@ func resourceFabricConnectionCreate(ctx context.Context, d *schema.ResourceData, + } + + createRequest := v4.ConnectionPostRequest{ +- Name: d.Get("name").(string), +- Type_: &conType, +- Order: &order, +- Notifications: notifications, +- Bandwidth: int32(d.Get("bandwidth").(int)), +- Redundancy: &red, +- ASide: &connectionASide, +- ZSide: &connectionZSide, +- Project: &project, ++ Name: d.Get("name").(string), ++ Type_: &conType, ++ Order: &order, ++ Notifications: notifications, ++ Bandwidth: int32(d.Get("bandwidth").(int)), ++ AdditionalInfo: additionalinfo, ++ Redundancy: &red, ++ ASide: &connectionASide, ++ ZSide: &connectionZSide, ++ Project: &project, + } + + conn, _, err := client.ConnectionsApi.CreateConnection(ctx, createRequest) +@@ -231,13 +233,15 @@ func resourceFabricConnectionUpdate(ctx context.Context, d *schema.ResourceData, + waitFunction = waitForConnectionProviderStatusChange + } + +- updatedConn, err = waitFunction(d.Id(), meta, ctx) ++ conn, err := waitFunction(d.Id(), meta, ctx) + + if err != nil { + if !strings.Contains(err.Error(), "500") { + d.SetId("") + } + diags = append(diags, diag.Diagnostic{Severity: 2, Summary: fmt.Sprintf("connection property update completion timeout error: %v [update payload: %v] (other updates will be successful if the payload is not shown)", err, update)}) ++ } else { ++ updatedConn = conn + } + } + +diff --git a/examples/fabric/v4/portConnectivity/ibm/ibm2.0/README.md b/examples/fabric/v4/portConnectivity/ibm/ibm2.0/README.md +new file mode 100644 +index 0000000..d5cf131 +--- /dev/null ++++ b/examples/fabric/v4/portConnectivity/ibm/ibm2.0/README.md +@@ -0,0 +1,52 @@ ++# ECX Fabric Layer2 Redundant Connection to IBM 2.0 ++ ++This example shows how to create Layer 2 Connection between ECX Fabric ports and IBM 2.0 Cloud. ++ ++## Adjust variables ++ ++At minimum, you must set below variables in `terraform.tfvars` file: ++ ++* `equinix_client_id` - Equinix client ID (consumer key), obtained after ++ registering app in the developer platform ++* `equinix_client_secret` - Equinix client secret ID (consumer secret), ++ obtained same way as above ++ ++`connection_name` - The name of the connection ++`connection_type` - Connection type, please refer to OAS schema for enum values. ++`notifications_type` - Notification type ++`notifications_emails` - List of emails ++`bandwidth` - Bandwidth in MBs ++`redundancy` - Port redundancy ++`purchase_order_number` - Purchase order number applied to billing invoices for this connection. ++`aside_ap_type` - Access point type ++`aside_link_protocol_type` - Link protocol type ++`aside_pri_link_protocol_tag` - Tag number ++`zside_ap_type` - Z side access point type ++`zside_ap_authentication_key` - IBM authorization key (Account Id), like 6if92b31d921499f903592cd816f6aw1 ++`zside_ap_profile_type` - Service profile type ++`zside_location` - Equinix Metro Code for the Z side access point ++`fabric_sp_name` - Service profile name like i.e. AZURE ++`equinix_port_name` - Name of ECX Fabric Port ++`seller_asn` - Seller ASN Number ++`seller_region` - Seller Region ++ ++## IBM login ++ ++Log in to IBM portal with an account that has permission to create necessary resources. ++ ++## Initialize ++- First step is to initialize the terraform directory/resource we are going to work on. ++ In the given example, the folder to perform CRUD operations for port2ibm2.0 redundant connections can be found at examples/fabric/v4/portConnectivity/ibm/ibm2.0. ++ ++- Change directory into - `CD examples/fabric/v4/portConnectivity/ibm/ibm2.0` ++- Initialize Terraform plugins - `terraform init` ++ ++## Port to IBM 2.0 connection : Create, Read, Update and Delete(CRUD) operations ++Note: `–auto-approve` command does not prompt the user for validating the applying config. Remove it to get a prompt to confirm the operation. ++ ++| Operation | Command | Description | ++|:----------|:---------------------------------:|---------------------------------------------------------------------------:| ++| CREATE | `terraform apply –auto-approve` | Creates a port2ibm2.0 connection resources | ++| READ | `terraform show` | Reads/Shows the current state of the port2ibm2.0 connection resources | ++| UPDATE | `terraform apply -refresh` | Updates the connections with values provided in the terraform.tfvars file | ++| DELETE | `terraform destroy –auto-approve` | Deletes the created port2ibm2.0 connection resources | +diff --git a/examples/fabric/v4/portConnectivity/ibm/ibm2.0/main.tf b/examples/fabric/v4/portConnectivity/ibm/ibm2.0/main.tf +new file mode 100644 +index 0000000..f55849e +--- /dev/null ++++ b/examples/fabric/v4/portConnectivity/ibm/ibm2.0/main.tf +@@ -0,0 +1,67 @@ ++provider "equinix" { ++ client_id = var.equinix_client_id ++ client_secret = var.equinix_client_secret ++} ++ ++data "equinix_fabric_service_profiles" "ibm" { ++ filter { ++ property = "/name" ++ operator = "=" ++ values = [var.fabric_sp_name] ++ } ++} ++ ++data "equinix_fabric_ports" "port" { ++ filters { ++ name = var.equinix_port_name ++ } ++} ++ ++resource "equinix_fabric_connection" "ibm2" { ++ name = var.connection_name ++ type = var.connection_type ++ ++ notifications { ++ type = var.notifications_type ++ emails = var.notifications_emails ++ } ++ ++ bandwidth = var.bandwidth ++ ++ additional_info = [{key = "ASN", value = var.seller_asn }, {"key"= "Global","value" = "false"}, {"key" = "BGP_IBM_CIDR","value" = "172.16.0.18/30"},{"key" = "BGP_CER_CIDR","value" = "172.16.0.19/30"} ] ++ ++ redundancy { priority = var.redundancy } ++ order { ++ purchase_order_number = var.purchase_order_number ++ } ++ a_side { ++ access_point { ++ type = var.aside_ap_type ++ port { ++ uuid = data.equinix_fabric_ports.port.id ++ } ++ link_protocol { ++ type = var.aside_link_protocol_type ++ vlan_tag = var.aside_link_protocol_tag ++ } ++ } ++ } ++ z_side { ++ access_point { ++ type = var.zside_ap_type ++ authentication_key = var.zside_ap_authentication_key ++ seller_region = var.seller_region ++ profile { ++ type = var.zside_ap_profile_type ++ uuid = data.equinix_fabric_service_profiles.ibm.id ++ } ++ location { ++ metro_code = var.zside_location ++ } ++ } ++ } ++} ++ ++output "connection_result" { ++ value = equinix_fabric_connection.ibm2.id ++} +diff --git a/examples/fabric/v4/portConnectivity/ibm/ibm2.0/terraform.tf b/examples/fabric/v4/portConnectivity/ibm/ibm2.0/terraform.tf +new file mode 100644 +index 0000000..b5f55a7 +--- /dev/null ++++ b/examples/fabric/v4/portConnectivity/ibm/ibm2.0/terraform.tf +@@ -0,0 +1,7 @@ ++terraform { ++ required_providers { ++ equinix = { ++ source="equinix/equinix" ++ } ++ } ++} +diff --git a/examples/fabric/v4/portConnectivity/ibm/ibm2.0/terraform.tfvars.example b/examples/fabric/v4/portConnectivity/ibm/ibm2.0/terraform.tfvars.example +new file mode 100644 +index 0000000..6b73a2f +--- /dev/null ++++ b/examples/fabric/v4/portConnectivity/ibm/ibm2.0/terraform.tfvars.example +@@ -0,0 +1,21 @@ ++equinix_client_id = "MyEquinixClientId" ++equinix_client_secret = "MyEquinixClientSecret" ++ ++connection_name = "Terra_Port2IBM2.0" ++connection_type = "EVPL_VC" ++notifications_type = "ALL" ++notifications_emails = ["example@equinix.com"] ++bandwidth = 50 ++redundancy = "PRIMARY" ++purchase_order_number = "1-323292" ++aside_ap_type = "COLO" ++aside_link_protocol_type = "DOT1Q" ++aside_link_protocol_tag = "1302" ++zside_ap_type = "SP" ++zside_ap_authentication_key = "IBM Authentication Key" ++zside_ap_profile_type = "L2_PROFILE" ++zside_location = "SV" ++fabric_sp_name = "IBM Cloud Direct Link 2" ++equinix_port_name = "Equinix Port Name" ++seller_asn = "2400" ++seller_region = "San Jose 2" +diff --git a/examples/fabric/v4/portConnectivity/ibm/ibm2.0/variables.tf b/examples/fabric/v4/portConnectivity/ibm/ibm2.0/variables.tf +new file mode 100644 +index 0000000..b8ddcb5 +--- /dev/null ++++ b/examples/fabric/v4/portConnectivity/ibm/ibm2.0/variables.tf +@@ -0,0 +1,20 @@ ++variable "equinix_client_id" {} ++variable "equinix_client_secret" {} ++variable "connection_name" {} ++variable "connection_type" {} ++variable "notifications_type" {} ++variable "notifications_emails" {} ++variable "bandwidth" {} ++variable "redundancy" {} ++variable "purchase_order_number" {} ++variable "aside_ap_type" {} ++variable "aside_link_protocol_type" {} ++variable "aside_link_protocol_tag" {} ++variable "zside_ap_type" {} ++variable "zside_ap_authentication_key" {} ++variable "zside_ap_profile_type" {} ++variable "zside_location" {} ++variable "fabric_sp_name" {} ++variable "equinix_port_name" {} ++variable "seller_asn" {} ++variable "seller_region" {} +diff --git a/tests/connection_e2e_fcr_multicloud_connection_test.go b/tests/connection_e2e_fcr_multicloud_connection_test.go +new file mode 100644 +index 0000000..1159300 +--- /dev/null ++++ b/tests/connection_e2e_fcr_multicloud_connection_test.go +@@ -0,0 +1,21 @@ ++package tests ++ ++import ( ++ "testing" ++ ++ "github.com/gruntwork-io/terratest/modules/terraform" ++ "github.com/stretchr/testify/assert" ++) ++ ++func TestFCRMultiCloudCreateConnection(t *testing.T) { ++ // retryable errors in terraform testing. ++ terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{ ++ TerraformDir: "../examples/fabric/v4/cloudRouterConnectivity/multiCloudConnection", ++ }) ++ ++ defer terraform.Destroy(t, terraformOptions) ++ ++ terraform.InitAndApply(t, terraformOptions) ++ output := terraform.Output(t, terraformOptions, "connection_result") ++ assert.NotNil(t, output) ++} +diff --git a/tests/connection_e2e_ibm_test.go b/tests/connection_e2e_ibm_test.go +index 9b83329..027722e 100644 +--- a/tests/connection_e2e_ibm_test.go ++++ b/tests/connection_e2e_ibm_test.go +@@ -10,7 +10,7 @@ import ( + func TestIBMCreateConnection(t *testing.T) { + // retryable errors in terraform testing. + terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{ +- TerraformDir: "../examples/fabric/v4/portConnectivity/ibm", ++ TerraformDir: "../examples/fabric/v4/portConnectivity/ibm/ibm2.0", + }) + + defer terraform.Destroy(t, terraformOptions) diff --git a/patches/0005-style-Changing-ibm-example-folder-name.patch b/patches/0005-style-Changing-ibm-example-folder-name.patch new file mode 100644 index 000000000..4f52be6e7 --- /dev/null +++ b/patches/0005-style-Changing-ibm-example-folder-name.patch @@ -0,0 +1,87 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: srushti-patl +Date: Mon, 30 Oct 2023 09:53:39 -0700 +Subject: [PATCH 5/7] style: Changing ibm example folder name + + +diff --git a/examples/fabric/v4/portConnectivity/ibm/ibm2.0/README.md b/examples/fabric/v4/portConnectivity/ibm/ibm2/README.md +similarity index 81% +rename from examples/fabric/v4/portConnectivity/ibm/ibm2.0/README.md +rename to examples/fabric/v4/portConnectivity/ibm/ibm2/README.md +index d5cf131..70e2069 100644 +--- a/examples/fabric/v4/portConnectivity/ibm/ibm2.0/README.md ++++ b/examples/fabric/v4/portConnectivity/ibm/ibm2/README.md +@@ -1,6 +1,6 @@ +-# ECX Fabric Layer2 Redundant Connection to IBM 2.0 ++# ECX Fabric Layer2 Redundant Connection to IBM 2 + +-This example shows how to create Layer 2 Connection between ECX Fabric ports and IBM 2.0 Cloud. ++This example shows how to create Layer 2 Connection between ECX Fabric ports and IBM2 Cloud. + + ## Adjust variables + +@@ -36,17 +36,17 @@ Log in to IBM portal with an account that has permission to create necessary res + + ## Initialize + - First step is to initialize the terraform directory/resource we are going to work on. +- In the given example, the folder to perform CRUD operations for port2ibm2.0 redundant connections can be found at examples/fabric/v4/portConnectivity/ibm/ibm2.0. ++ In the given example, the folder to perform CRUD operations for port2ibm2 redundant connections can be found at examples/fabric/v4/portConnectivity/ibm/ibm2. + +-- Change directory into - `CD examples/fabric/v4/portConnectivity/ibm/ibm2.0` ++- Change directory into - `CD examples/fabric/v4/portConnectivity/ibm/ibm2` + - Initialize Terraform plugins - `terraform init` + +-## Port to IBM 2.0 connection : Create, Read, Update and Delete(CRUD) operations ++## Port to IBM2 connection : Create, Read, Update and Delete(CRUD) operations + Note: `–auto-approve` command does not prompt the user for validating the applying config. Remove it to get a prompt to confirm the operation. + + | Operation | Command | Description | + |:----------|:---------------------------------:|---------------------------------------------------------------------------:| +-| CREATE | `terraform apply –auto-approve` | Creates a port2ibm2.0 connection resources | +-| READ | `terraform show` | Reads/Shows the current state of the port2ibm2.0 connection resources | ++| CREATE | `terraform apply –auto-approve` | Creates a port2ibm2 connection resources | ++| READ | `terraform show` | Reads/Shows the current state of the port2ibm2 connection resources | + | UPDATE | `terraform apply -refresh` | Updates the connections with values provided in the terraform.tfvars file | +-| DELETE | `terraform destroy –auto-approve` | Deletes the created port2ibm2.0 connection resources | ++| DELETE | `terraform destroy –auto-approve` | Deletes the created port2ibm2 connection resources | +diff --git a/examples/fabric/v4/portConnectivity/ibm/ibm2.0/main.tf b/examples/fabric/v4/portConnectivity/ibm/ibm2/main.tf +similarity index 100% +rename from examples/fabric/v4/portConnectivity/ibm/ibm2.0/main.tf +rename to examples/fabric/v4/portConnectivity/ibm/ibm2/main.tf +diff --git a/examples/fabric/v4/portConnectivity/ibm/ibm2.0/terraform.tf b/examples/fabric/v4/portConnectivity/ibm/ibm2/terraform.tf +similarity index 100% +rename from examples/fabric/v4/portConnectivity/ibm/ibm2.0/terraform.tf +rename to examples/fabric/v4/portConnectivity/ibm/ibm2/terraform.tf +diff --git a/examples/fabric/v4/portConnectivity/ibm/ibm2.0/terraform.tfvars.example b/examples/fabric/v4/portConnectivity/ibm/ibm2/terraform.tfvars.example +similarity index 94% +rename from examples/fabric/v4/portConnectivity/ibm/ibm2.0/terraform.tfvars.example +rename to examples/fabric/v4/portConnectivity/ibm/ibm2/terraform.tfvars.example +index 6b73a2f..5c5816f 100644 +--- a/examples/fabric/v4/portConnectivity/ibm/ibm2.0/terraform.tfvars.example ++++ b/examples/fabric/v4/portConnectivity/ibm/ibm2/terraform.tfvars.example +@@ -1,7 +1,7 @@ + equinix_client_id = "MyEquinixClientId" + equinix_client_secret = "MyEquinixClientSecret" + +-connection_name = "Terra_Port2IBM2.0" ++connection_name = "Terra_Port2IBM2" + connection_type = "EVPL_VC" + notifications_type = "ALL" + notifications_emails = ["example@equinix.com"] +diff --git a/examples/fabric/v4/portConnectivity/ibm/ibm2.0/variables.tf b/examples/fabric/v4/portConnectivity/ibm/ibm2/variables.tf +similarity index 100% +rename from examples/fabric/v4/portConnectivity/ibm/ibm2.0/variables.tf +rename to examples/fabric/v4/portConnectivity/ibm/ibm2/variables.tf +diff --git a/tests/connection_e2e_ibm_test.go b/tests/connection_e2e_ibm_test.go +index 027722e..7cf580c 100644 +--- a/tests/connection_e2e_ibm_test.go ++++ b/tests/connection_e2e_ibm_test.go +@@ -10,7 +10,7 @@ import ( + func TestIBMCreateConnection(t *testing.T) { + // retryable errors in terraform testing. + terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{ +- TerraformDir: "../examples/fabric/v4/portConnectivity/ibm/ibm2.0", ++ TerraformDir: "../examples/fabric/v4/portConnectivity/ibm/ibm2", + }) + + defer terraform.Destroy(t, terraformOptions) diff --git a/patches/0006-style-Changing-ibm-test-example-folder-name.patch b/patches/0006-style-Changing-ibm-test-example-folder-name.patch new file mode 100644 index 000000000..0c19c29a3 --- /dev/null +++ b/patches/0006-style-Changing-ibm-test-example-folder-name.patch @@ -0,0 +1,10 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: srushti-patl +Date: Mon, 30 Oct 2023 11:23:14 -0700 +Subject: [PATCH 6/7] style: Changing ibm test example folder name + + +diff --git a/tests/connection_e2e_ibm_test.go b/tests/connection_e2e_ibm2_test.go +similarity index 100% +rename from tests/connection_e2e_ibm_test.go +rename to tests/connection_e2e_ibm2_test.go diff --git a/patches/0007-fix-use-the-correct-base-User-Agent-for-metal-go-req.patch b/patches/0007-fix-use-the-correct-base-User-Agent-for-metal-go-req.patch new file mode 100644 index 000000000..62d302f5f --- /dev/null +++ b/patches/0007-fix-use-the-correct-base-User-Agent-for-metal-go-req.patch @@ -0,0 +1,25 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Charles Treatman +Date: Thu, 2 Nov 2023 10:40:01 -0500 +Subject: [PATCH 7/7] fix: use the correct base User-Agent for metal-go + requests + +The code that injects terraform module information into the User-Agent +string for the metal-go client was mis-wired; it was using the packngo +User-Agent as a base instead of the metal-go User-Agent. This change +will correct the User-Agent so that requests made with metal-go will +not appear to come from packngo. + +diff --git a/equinix/config.go b/equinix/config.go +index d59a4b9..55de571 100644 +--- a/equinix/config.go ++++ b/equinix/config.go +@@ -303,7 +303,7 @@ func (c *Config) addModuleToMetalUserAgent(d *schema.ResourceData) { + } + + func (c *Config) addModuleToMetalGoUserAgent(d *schema.ResourceData) { +- c.metalgo.GetConfig().UserAgent = generateModuleUserAgentString(d, c.metalUserAgent) ++ c.metalgo.GetConfig().UserAgent = generateModuleUserAgentString(d, c.metalGoUserAgent) + } + + func generateModuleUserAgentString(d *schema.ResourceData, baseUserAgent string) string { diff --git a/provider/cmd/pulumi-resource-equinix/schema.json b/provider/cmd/pulumi-resource-equinix/schema.json index fd9e33a97..431810a77 100644 --- a/provider/cmd/pulumi-resource-equinix/schema.json +++ b/provider/cmd/pulumi-resource-equinix/schema.json @@ -9706,11 +9706,8 @@ "$ref": "#/types/equinix:fabric/CloudRouterPackage:CloudRouterPackage", "description": "Fabric Cloud Router package\n" }, - "projects": { - "type": "array", - "items": { - "$ref": "#/types/equinix:fabric/CloudRouterProject:CloudRouterProject" - }, + "project": { + "$ref": "#/types/equinix:fabric/CloudRouterProject:CloudRouterProject", "description": "Fabric Cloud Router project\n" }, "state": { @@ -9765,11 +9762,8 @@ "$ref": "#/types/equinix:fabric/CloudRouterPackage:CloudRouterPackage", "description": "Fabric Cloud Router package\n" }, - "projects": { - "type": "array", - "items": { - "$ref": "#/types/equinix:fabric/CloudRouterProject:CloudRouterProject" - }, + "project": { + "$ref": "#/types/equinix:fabric/CloudRouterProject:CloudRouterProject", "description": "Fabric Cloud Router project\n" }, "type": { @@ -9832,11 +9826,8 @@ "$ref": "#/types/equinix:fabric/CloudRouterPackage:CloudRouterPackage", "description": "Fabric Cloud Router package\n" }, - "projects": { - "type": "array", - "items": { - "$ref": "#/types/equinix:fabric/CloudRouterProject:CloudRouterProject" - }, + "project": { + "$ref": "#/types/equinix:fabric/CloudRouterProject:CloudRouterProject", "description": "Fabric Cloud Router project\n" }, "state": { diff --git a/provider/go.mod b/provider/go.mod index 734df9eb9..1c853b4bb 100644 --- a/provider/go.mod +++ b/provider/go.mod @@ -9,7 +9,7 @@ replace ( ) require ( - github.com/equinix/terraform-provider-equinix v1.18.2 + github.com/equinix/terraform-provider-equinix v1.19.0 github.com/pulumi/pulumi-terraform-bridge/v3 v3.63.2 github.com/pulumi/pulumi/pkg/v3 v3.91.1 github.com/pulumi/pulumi/sdk/v3 v3.91.1 @@ -82,7 +82,7 @@ require ( github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/equinix-labs/fabric-go v0.7.0 // indirect - github.com/equinix-labs/metal-go v0.16.0 // indirect + github.com/equinix-labs/metal-go v0.25.1 // indirect github.com/equinix/ecx-go/v2 v2.3.1 // indirect github.com/equinix/ne-go v1.11.0 // indirect github.com/equinix/oauth2-go v1.0.0 // indirect diff --git a/provider/go.sum b/provider/go.sum index 2c2870595..75786077c 100644 --- a/provider/go.sum +++ b/provider/go.sum @@ -1166,8 +1166,8 @@ github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0+ github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/equinix-labs/fabric-go v0.7.0 h1:AiiVPD4aE/aeiuCK7Fhsq4bvjmJ5RzmZ3boKnp0dl4g= github.com/equinix-labs/fabric-go v0.7.0/go.mod h1:oqgGS3GOI8hHGPJKsAwDOEX0qRHl52sJGvwA/zMSd90= -github.com/equinix-labs/metal-go v0.16.0 h1:4YmGx9SRFkDtHiEqRsSjlgJDztV6NHqH1eeaOZcK7d4= -github.com/equinix-labs/metal-go v0.16.0/go.mod h1:SmxCklxW+KjmBLVMdEXgtFO5gD5/b4N0VxcNgUYbOH4= +github.com/equinix-labs/metal-go v0.25.1 h1:uL83lRKyAcOfab+9r2xujAuLD8lTsqv89+SPvVFkcBM= +github.com/equinix-labs/metal-go v0.25.1/go.mod h1:SmxCklxW+KjmBLVMdEXgtFO5gD5/b4N0VxcNgUYbOH4= github.com/equinix/ecx-go/v2 v2.3.1 h1:gFcAIeyaEUw7S8ebqApmT7E/S7pC7Ac3wgScp89fkPU= github.com/equinix/ecx-go/v2 v2.3.1/go.mod h1:FvCdZ3jXU8Z4CPKig2DT+4J2HdwgRK17pIcznM7RXyk= github.com/equinix/ne-go v1.11.0 h1:ja6G2fmcGrLsOeV25Mq6pDfH+/cUlvxJbnE8uRXTGGk= diff --git a/sdk/dotnet/Fabric/CloudRouter.cs b/sdk/dotnet/Fabric/CloudRouter.cs index 381530ea6..93af7cab3 100644 --- a/sdk/dotnet/Fabric/CloudRouter.cs +++ b/sdk/dotnet/Fabric/CloudRouter.cs @@ -124,8 +124,8 @@ public partial class CloudRouter : global::Pulumi.CustomResource /// /// Fabric Cloud Router project /// - [Output("projects")] - public Output> Projects { get; private set; } = null!; + [Output("project")] + public Output Project { get; private set; } = null!; /// /// Fabric Cloud Router overall state @@ -234,17 +234,11 @@ public InputList Notifications [Input("package", required: true)] public Input Package { get; set; } = null!; - [Input("projects")] - private InputList? _projects; - /// /// Fabric Cloud Router project /// - public InputList Projects - { - get => _projects ?? (_projects = new InputList()); - set => _projects = value; - } + [Input("project")] + public Input? Project { get; set; } /// /// Notification Type - ALL,CONNECTION*APPROVAL,SALES*REP_NOTIFICATIONS, NOTIFICATIONS @@ -332,17 +326,11 @@ public InputList Notifications [Input("package")] public Input? Package { get; set; } - [Input("projects")] - private InputList? _projects; - /// /// Fabric Cloud Router project /// - public InputList Projects - { - get => _projects ?? (_projects = new InputList()); - set => _projects = value; - } + [Input("project")] + public Input? Project { get; set; } /// /// Fabric Cloud Router overall state diff --git a/sdk/go/equinix/fabric/cloudRouter.go b/sdk/go/equinix/fabric/cloudRouter.go index 6224dd38c..260766d93 100644 --- a/sdk/go/equinix/fabric/cloudRouter.go +++ b/sdk/go/equinix/fabric/cloudRouter.go @@ -87,7 +87,7 @@ type CloudRouter struct { // Fabric Cloud Router package Package CloudRouterPackageOutput `pulumi:"package"` // Fabric Cloud Router project - Projects CloudRouterProjectArrayOutput `pulumi:"projects"` + Project CloudRouterProjectPtrOutput `pulumi:"project"` // Fabric Cloud Router overall state State pulumi.StringOutput `pulumi:"state"` // Notification Type - ALL,CONNECTION*APPROVAL,SALES*REP_NOTIFICATIONS, NOTIFICATIONS @@ -157,7 +157,7 @@ type cloudRouterState struct { // Fabric Cloud Router package Package *CloudRouterPackage `pulumi:"package"` // Fabric Cloud Router project - Projects []CloudRouterProject `pulumi:"projects"` + Project *CloudRouterProject `pulumi:"project"` // Fabric Cloud Router overall state State *string `pulumi:"state"` // Notification Type - ALL,CONNECTION*APPROVAL,SALES*REP_NOTIFICATIONS, NOTIFICATIONS @@ -186,7 +186,7 @@ type CloudRouterState struct { // Fabric Cloud Router package Package CloudRouterPackagePtrInput // Fabric Cloud Router project - Projects CloudRouterProjectArrayInput + Project CloudRouterProjectPtrInput // Fabric Cloud Router overall state State pulumi.StringPtrInput // Notification Type - ALL,CONNECTION*APPROVAL,SALES*REP_NOTIFICATIONS, NOTIFICATIONS @@ -213,7 +213,7 @@ type cloudRouterArgs struct { // Fabric Cloud Router package Package CloudRouterPackage `pulumi:"package"` // Fabric Cloud Router project - Projects []CloudRouterProject `pulumi:"projects"` + Project *CloudRouterProject `pulumi:"project"` // Notification Type - ALL,CONNECTION*APPROVAL,SALES*REP_NOTIFICATIONS, NOTIFICATIONS Type string `pulumi:"type"` } @@ -235,7 +235,7 @@ type CloudRouterArgs struct { // Fabric Cloud Router package Package CloudRouterPackageInput // Fabric Cloud Router project - Projects CloudRouterProjectArrayInput + Project CloudRouterProjectPtrInput // Notification Type - ALL,CONNECTION*APPROVAL,SALES*REP_NOTIFICATIONS, NOTIFICATIONS Type pulumi.StringInput } @@ -402,8 +402,8 @@ func (o CloudRouterOutput) Package() CloudRouterPackageOutput { } // Fabric Cloud Router project -func (o CloudRouterOutput) Projects() CloudRouterProjectArrayOutput { - return o.ApplyT(func(v *CloudRouter) CloudRouterProjectArrayOutput { return v.Projects }).(CloudRouterProjectArrayOutput) +func (o CloudRouterOutput) Project() CloudRouterProjectPtrOutput { + return o.ApplyT(func(v *CloudRouter) CloudRouterProjectPtrOutput { return v.Project }).(CloudRouterProjectPtrOutput) } // Fabric Cloud Router overall state diff --git a/sdk/go/equinix/fabric/pulumiTypes.go b/sdk/go/equinix/fabric/pulumiTypes.go index bbccd7238..4ded6fa53 100644 --- a/sdk/go/equinix/fabric/pulumiTypes.go +++ b/sdk/go/equinix/fabric/pulumiTypes.go @@ -1139,34 +1139,50 @@ func (i CloudRouterProjectArgs) ToOutput(ctx context.Context) pulumix.Output[Clo } } -// CloudRouterProjectArrayInput is an input type that accepts CloudRouterProjectArray and CloudRouterProjectArrayOutput values. -// You can construct a concrete instance of `CloudRouterProjectArrayInput` via: +func (i CloudRouterProjectArgs) ToCloudRouterProjectPtrOutput() CloudRouterProjectPtrOutput { + return i.ToCloudRouterProjectPtrOutputWithContext(context.Background()) +} + +func (i CloudRouterProjectArgs) ToCloudRouterProjectPtrOutputWithContext(ctx context.Context) CloudRouterProjectPtrOutput { + return pulumi.ToOutputWithContext(ctx, i).(CloudRouterProjectOutput).ToCloudRouterProjectPtrOutputWithContext(ctx) +} + +// CloudRouterProjectPtrInput is an input type that accepts CloudRouterProjectArgs, CloudRouterProjectPtr and CloudRouterProjectPtrOutput values. +// You can construct a concrete instance of `CloudRouterProjectPtrInput` via: +// +// CloudRouterProjectArgs{...} // -// CloudRouterProjectArray{ CloudRouterProjectArgs{...} } -type CloudRouterProjectArrayInput interface { +// or: +// +// nil +type CloudRouterProjectPtrInput interface { pulumi.Input - ToCloudRouterProjectArrayOutput() CloudRouterProjectArrayOutput - ToCloudRouterProjectArrayOutputWithContext(context.Context) CloudRouterProjectArrayOutput + ToCloudRouterProjectPtrOutput() CloudRouterProjectPtrOutput + ToCloudRouterProjectPtrOutputWithContext(context.Context) CloudRouterProjectPtrOutput } -type CloudRouterProjectArray []CloudRouterProjectInput +type cloudRouterProjectPtrType CloudRouterProjectArgs + +func CloudRouterProjectPtr(v *CloudRouterProjectArgs) CloudRouterProjectPtrInput { + return (*cloudRouterProjectPtrType)(v) +} -func (CloudRouterProjectArray) ElementType() reflect.Type { - return reflect.TypeOf((*[]CloudRouterProject)(nil)).Elem() +func (*cloudRouterProjectPtrType) ElementType() reflect.Type { + return reflect.TypeOf((**CloudRouterProject)(nil)).Elem() } -func (i CloudRouterProjectArray) ToCloudRouterProjectArrayOutput() CloudRouterProjectArrayOutput { - return i.ToCloudRouterProjectArrayOutputWithContext(context.Background()) +func (i *cloudRouterProjectPtrType) ToCloudRouterProjectPtrOutput() CloudRouterProjectPtrOutput { + return i.ToCloudRouterProjectPtrOutputWithContext(context.Background()) } -func (i CloudRouterProjectArray) ToCloudRouterProjectArrayOutputWithContext(ctx context.Context) CloudRouterProjectArrayOutput { - return pulumi.ToOutputWithContext(ctx, i).(CloudRouterProjectArrayOutput) +func (i *cloudRouterProjectPtrType) ToCloudRouterProjectPtrOutputWithContext(ctx context.Context) CloudRouterProjectPtrOutput { + return pulumi.ToOutputWithContext(ctx, i).(CloudRouterProjectPtrOutput) } -func (i CloudRouterProjectArray) ToOutput(ctx context.Context) pulumix.Output[[]CloudRouterProject] { - return pulumix.Output[[]CloudRouterProject]{ - OutputState: i.ToCloudRouterProjectArrayOutputWithContext(ctx).OutputState, +func (i *cloudRouterProjectPtrType) ToOutput(ctx context.Context) pulumix.Output[*CloudRouterProject] { + return pulumix.Output[*CloudRouterProject]{ + OutputState: i.ToCloudRouterProjectPtrOutputWithContext(ctx).OutputState, } } @@ -1184,6 +1200,16 @@ func (o CloudRouterProjectOutput) ToCloudRouterProjectOutputWithContext(ctx cont return o } +func (o CloudRouterProjectOutput) ToCloudRouterProjectPtrOutput() CloudRouterProjectPtrOutput { + return o.ToCloudRouterProjectPtrOutputWithContext(context.Background()) +} + +func (o CloudRouterProjectOutput) ToCloudRouterProjectPtrOutputWithContext(ctx context.Context) CloudRouterProjectPtrOutput { + return o.ApplyTWithContext(ctx, func(_ context.Context, v CloudRouterProject) *CloudRouterProject { + return &v + }).(CloudRouterProjectPtrOutput) +} + func (o CloudRouterProjectOutput) ToOutput(ctx context.Context) pulumix.Output[CloudRouterProject] { return pulumix.Output[CloudRouterProject]{ OutputState: o.OutputState, @@ -1200,32 +1226,56 @@ func (o CloudRouterProjectOutput) ProjectId() pulumi.StringPtrOutput { return o.ApplyT(func(v CloudRouterProject) *string { return v.ProjectId }).(pulumi.StringPtrOutput) } -type CloudRouterProjectArrayOutput struct{ *pulumi.OutputState } +type CloudRouterProjectPtrOutput struct{ *pulumi.OutputState } -func (CloudRouterProjectArrayOutput) ElementType() reflect.Type { - return reflect.TypeOf((*[]CloudRouterProject)(nil)).Elem() +func (CloudRouterProjectPtrOutput) ElementType() reflect.Type { + return reflect.TypeOf((**CloudRouterProject)(nil)).Elem() } -func (o CloudRouterProjectArrayOutput) ToCloudRouterProjectArrayOutput() CloudRouterProjectArrayOutput { +func (o CloudRouterProjectPtrOutput) ToCloudRouterProjectPtrOutput() CloudRouterProjectPtrOutput { return o } -func (o CloudRouterProjectArrayOutput) ToCloudRouterProjectArrayOutputWithContext(ctx context.Context) CloudRouterProjectArrayOutput { +func (o CloudRouterProjectPtrOutput) ToCloudRouterProjectPtrOutputWithContext(ctx context.Context) CloudRouterProjectPtrOutput { return o } -func (o CloudRouterProjectArrayOutput) ToOutput(ctx context.Context) pulumix.Output[[]CloudRouterProject] { - return pulumix.Output[[]CloudRouterProject]{ +func (o CloudRouterProjectPtrOutput) ToOutput(ctx context.Context) pulumix.Output[*CloudRouterProject] { + return pulumix.Output[*CloudRouterProject]{ OutputState: o.OutputState, } } -func (o CloudRouterProjectArrayOutput) Index(i pulumi.IntInput) CloudRouterProjectOutput { - return pulumi.All(o, i).ApplyT(func(vs []interface{}) CloudRouterProject { - return vs[0].([]CloudRouterProject)[vs[1].(int)] +func (o CloudRouterProjectPtrOutput) Elem() CloudRouterProjectOutput { + return o.ApplyT(func(v *CloudRouterProject) CloudRouterProject { + if v != nil { + return *v + } + var ret CloudRouterProject + return ret }).(CloudRouterProjectOutput) } +// Unique Resource URL +func (o CloudRouterProjectPtrOutput) Href() pulumi.StringPtrOutput { + return o.ApplyT(func(v *CloudRouterProject) *string { + if v == nil { + return nil + } + return v.Href + }).(pulumi.StringPtrOutput) +} + +// Project Id +func (o CloudRouterProjectPtrOutput) ProjectId() pulumi.StringPtrOutput { + return o.ApplyT(func(v *CloudRouterProject) *string { + if v == nil { + return nil + } + return v.ProjectId + }).(pulumi.StringPtrOutput) +} + type ConnectionASide struct { // Point of access details AccessPoint *ConnectionASideAccessPoint `pulumi:"accessPoint"` @@ -29834,7 +29884,7 @@ func init() { pulumi.RegisterInputType(reflect.TypeOf((*CloudRouterPackageInput)(nil)).Elem(), CloudRouterPackageArgs{}) pulumi.RegisterInputType(reflect.TypeOf((*CloudRouterPackagePtrInput)(nil)).Elem(), CloudRouterPackageArgs{}) pulumi.RegisterInputType(reflect.TypeOf((*CloudRouterProjectInput)(nil)).Elem(), CloudRouterProjectArgs{}) - pulumi.RegisterInputType(reflect.TypeOf((*CloudRouterProjectArrayInput)(nil)).Elem(), CloudRouterProjectArray{}) + pulumi.RegisterInputType(reflect.TypeOf((*CloudRouterProjectPtrInput)(nil)).Elem(), CloudRouterProjectArgs{}) pulumi.RegisterInputType(reflect.TypeOf((*ConnectionASideInput)(nil)).Elem(), ConnectionASideArgs{}) pulumi.RegisterInputType(reflect.TypeOf((*ConnectionASidePtrInput)(nil)).Elem(), ConnectionASideArgs{}) pulumi.RegisterInputType(reflect.TypeOf((*ConnectionASideAccessPointInput)(nil)).Elem(), ConnectionASideAccessPointArgs{}) @@ -30184,7 +30234,7 @@ func init() { pulumi.RegisterOutputType(CloudRouterPackageOutput{}) pulumi.RegisterOutputType(CloudRouterPackagePtrOutput{}) pulumi.RegisterOutputType(CloudRouterProjectOutput{}) - pulumi.RegisterOutputType(CloudRouterProjectArrayOutput{}) + pulumi.RegisterOutputType(CloudRouterProjectPtrOutput{}) pulumi.RegisterOutputType(ConnectionASideOutput{}) pulumi.RegisterOutputType(ConnectionASidePtrOutput{}) pulumi.RegisterOutputType(ConnectionASideAccessPointOutput{}) diff --git a/sdk/java/src/main/java/com/equinix/pulumi/fabric/CloudRouter.java b/sdk/java/src/main/java/com/equinix/pulumi/fabric/CloudRouter.java index 4eed1aa5b..fceb323ec 100644 --- a/sdk/java/src/main/java/com/equinix/pulumi/fabric/CloudRouter.java +++ b/sdk/java/src/main/java/com/equinix/pulumi/fabric/CloudRouter.java @@ -223,15 +223,15 @@ public Output package_() { * Fabric Cloud Router project * */ - @Export(name="projects", refs={List.class,CloudRouterProject.class}, tree="[0,1]") - private Output> projects; + @Export(name="project", refs={CloudRouterProject.class}, tree="[0]") + private Output project; /** * @return Fabric Cloud Router project * */ - public Output>> projects() { - return Codegen.optional(this.projects); + public Output> project() { + return Codegen.optional(this.project); } /** * Fabric Cloud Router overall state diff --git a/sdk/java/src/main/java/com/equinix/pulumi/fabric/CloudRouterArgs.java b/sdk/java/src/main/java/com/equinix/pulumi/fabric/CloudRouterArgs.java index 8f5c4687b..7829eacee 100644 --- a/sdk/java/src/main/java/com/equinix/pulumi/fabric/CloudRouterArgs.java +++ b/sdk/java/src/main/java/com/equinix/pulumi/fabric/CloudRouterArgs.java @@ -131,15 +131,15 @@ public Output package_() { * Fabric Cloud Router project * */ - @Import(name="projects") - private @Nullable Output> projects; + @Import(name="project") + private @Nullable Output project; /** * @return Fabric Cloud Router project * */ - public Optional>> projects() { - return Optional.ofNullable(this.projects); + public Optional> project() { + return Optional.ofNullable(this.project); } /** @@ -167,7 +167,7 @@ private CloudRouterArgs(CloudRouterArgs $) { this.notifications = $.notifications; this.order = $.order; this.package_ = $.package_; - this.projects = $.projects; + this.project = $.project; this.type = $.type; } @@ -347,34 +347,24 @@ public Builder package_(CloudRouterPackageArgs package_) { } /** - * @param projects Fabric Cloud Router project + * @param project Fabric Cloud Router project * * @return builder * */ - public Builder projects(@Nullable Output> projects) { - $.projects = projects; + public Builder project(@Nullable Output project) { + $.project = project; return this; } /** - * @param projects Fabric Cloud Router project + * @param project Fabric Cloud Router project * * @return builder * */ - public Builder projects(List projects) { - return projects(Output.of(projects)); - } - - /** - * @param projects Fabric Cloud Router project - * - * @return builder - * - */ - public Builder projects(CloudRouterProjectArgs... projects) { - return projects(List.of(projects)); + public Builder project(CloudRouterProjectArgs project) { + return project(Output.of(project)); } /** diff --git a/sdk/java/src/main/java/com/equinix/pulumi/fabric/inputs/CloudRouterState.java b/sdk/java/src/main/java/com/equinix/pulumi/fabric/inputs/CloudRouterState.java index 949d710b8..7fa6a93a8 100644 --- a/sdk/java/src/main/java/com/equinix/pulumi/fabric/inputs/CloudRouterState.java +++ b/sdk/java/src/main/java/com/equinix/pulumi/fabric/inputs/CloudRouterState.java @@ -178,15 +178,15 @@ public Optional> package_() { * Fabric Cloud Router project * */ - @Import(name="projects") - private @Nullable Output> projects; + @Import(name="project") + private @Nullable Output project; /** * @return Fabric Cloud Router project * */ - public Optional>> projects() { - return Optional.ofNullable(this.projects); + public Optional> project() { + return Optional.ofNullable(this.project); } /** @@ -232,7 +232,7 @@ private CloudRouterState(CloudRouterState $) { this.notifications = $.notifications; this.order = $.order; this.package_ = $.package_; - this.projects = $.projects; + this.project = $.project; this.state = $.state; this.type = $.type; } @@ -486,34 +486,24 @@ public Builder package_(CloudRouterPackageArgs package_) { } /** - * @param projects Fabric Cloud Router project + * @param project Fabric Cloud Router project * * @return builder * */ - public Builder projects(@Nullable Output> projects) { - $.projects = projects; + public Builder project(@Nullable Output project) { + $.project = project; return this; } /** - * @param projects Fabric Cloud Router project + * @param project Fabric Cloud Router project * * @return builder * */ - public Builder projects(List projects) { - return projects(Output.of(projects)); - } - - /** - * @param projects Fabric Cloud Router project - * - * @return builder - * - */ - public Builder projects(CloudRouterProjectArgs... projects) { - return projects(List.of(projects)); + public Builder project(CloudRouterProjectArgs project) { + return project(Output.of(project)); } /** diff --git a/sdk/nodejs/fabric/cloudRouter.ts b/sdk/nodejs/fabric/cloudRouter.ts index 3f2e647b2..a35fb8b4a 100644 --- a/sdk/nodejs/fabric/cloudRouter.ts +++ b/sdk/nodejs/fabric/cloudRouter.ts @@ -108,7 +108,7 @@ export class CloudRouter extends pulumi.CustomResource { /** * Fabric Cloud Router project */ - public readonly projects!: pulumi.Output; + public readonly project!: pulumi.Output; /** * Fabric Cloud Router overall state */ @@ -141,7 +141,7 @@ export class CloudRouter extends pulumi.CustomResource { resourceInputs["notifications"] = state ? state.notifications : undefined; resourceInputs["order"] = state ? state.order : undefined; resourceInputs["package"] = state ? state.package : undefined; - resourceInputs["projects"] = state ? state.projects : undefined; + resourceInputs["project"] = state ? state.project : undefined; resourceInputs["state"] = state ? state.state : undefined; resourceInputs["type"] = state ? state.type : undefined; } else { @@ -165,7 +165,7 @@ export class CloudRouter extends pulumi.CustomResource { resourceInputs["notifications"] = args ? args.notifications : undefined; resourceInputs["order"] = args ? args.order : undefined; resourceInputs["package"] = args ? args.package : undefined; - resourceInputs["projects"] = args ? args.projects : undefined; + resourceInputs["project"] = args ? args.project : undefined; resourceInputs["type"] = args ? args.type : undefined; resourceInputs["changeLogs"] = undefined /*out*/; resourceInputs["equinixAsn"] = undefined /*out*/; @@ -224,7 +224,7 @@ export interface CloudRouterState { /** * Fabric Cloud Router project */ - projects?: pulumi.Input[]>; + project?: pulumi.Input; /** * Fabric Cloud Router overall state */ @@ -270,7 +270,7 @@ export interface CloudRouterArgs { /** * Fabric Cloud Router project */ - projects?: pulumi.Input[]>; + project?: pulumi.Input; /** * Notification Type - ALL,CONNECTION*APPROVAL,SALES*REP_NOTIFICATIONS, NOTIFICATIONS */ diff --git a/sdk/python/pulumi_equinix/fabric/cloud_router.py b/sdk/python/pulumi_equinix/fabric/cloud_router.py index 096d7f830..b83793de8 100644 --- a/sdk/python/pulumi_equinix/fabric/cloud_router.py +++ b/sdk/python/pulumi_equinix/fabric/cloud_router.py @@ -24,7 +24,7 @@ def __init__(__self__, *, description: Optional[pulumi.Input[str]] = None, name: Optional[pulumi.Input[str]] = None, order: Optional[pulumi.Input['CloudRouterOrderArgs']] = None, - projects: Optional[pulumi.Input[Sequence[pulumi.Input['CloudRouterProjectArgs']]]] = None): + project: Optional[pulumi.Input['CloudRouterProjectArgs']] = None): """ The set of arguments for constructing a CloudRouter resource. :param pulumi.Input['CloudRouterLocationArgs'] location: Fabric Cloud Router location @@ -35,7 +35,7 @@ def __init__(__self__, *, :param pulumi.Input[str] description: Customer-provided Fabric Cloud Router description :param pulumi.Input[str] name: Fabric Cloud Router name. An alpha-numeric 24 characters string which can include only hyphens and underscores :param pulumi.Input['CloudRouterOrderArgs'] order: Order information related to this Fabric Cloud Router - :param pulumi.Input[Sequence[pulumi.Input['CloudRouterProjectArgs']]] projects: Fabric Cloud Router project + :param pulumi.Input['CloudRouterProjectArgs'] project: Fabric Cloud Router project """ pulumi.set(__self__, "location", location) pulumi.set(__self__, "notifications", notifications) @@ -49,8 +49,8 @@ def __init__(__self__, *, pulumi.set(__self__, "name", name) if order is not None: pulumi.set(__self__, "order", order) - if projects is not None: - pulumi.set(__self__, "projects", projects) + if project is not None: + pulumi.set(__self__, "project", project) @property @pulumi.getter @@ -150,15 +150,15 @@ def order(self, value: Optional[pulumi.Input['CloudRouterOrderArgs']]): @property @pulumi.getter - def projects(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['CloudRouterProjectArgs']]]]: + def project(self) -> Optional[pulumi.Input['CloudRouterProjectArgs']]: """ Fabric Cloud Router project """ - return pulumi.get(self, "projects") + return pulumi.get(self, "project") - @projects.setter - def projects(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['CloudRouterProjectArgs']]]]): - pulumi.set(self, "projects", value) + @project.setter + def project(self, value: Optional[pulumi.Input['CloudRouterProjectArgs']]): + pulumi.set(self, "project", value) @pulumi.input_type @@ -174,7 +174,7 @@ def __init__(__self__, *, notifications: Optional[pulumi.Input[Sequence[pulumi.Input['CloudRouterNotificationArgs']]]] = None, order: Optional[pulumi.Input['CloudRouterOrderArgs']] = None, package: Optional[pulumi.Input['CloudRouterPackageArgs']] = None, - projects: Optional[pulumi.Input[Sequence[pulumi.Input['CloudRouterProjectArgs']]]] = None, + project: Optional[pulumi.Input['CloudRouterProjectArgs']] = None, state: Optional[pulumi.Input[str]] = None, type: Optional[pulumi.Input[str]] = None): """ @@ -189,7 +189,7 @@ def __init__(__self__, *, :param pulumi.Input[Sequence[pulumi.Input['CloudRouterNotificationArgs']]] notifications: Preferences for notifications on Fabric Cloud Router configuration or status changes :param pulumi.Input['CloudRouterOrderArgs'] order: Order information related to this Fabric Cloud Router :param pulumi.Input['CloudRouterPackageArgs'] package: Fabric Cloud Router package - :param pulumi.Input[Sequence[pulumi.Input['CloudRouterProjectArgs']]] projects: Fabric Cloud Router project + :param pulumi.Input['CloudRouterProjectArgs'] project: Fabric Cloud Router project :param pulumi.Input[str] state: Fabric Cloud Router overall state :param pulumi.Input[str] type: Notification Type - ALL,CONNECTION*APPROVAL,SALES*REP_NOTIFICATIONS, NOTIFICATIONS """ @@ -213,8 +213,8 @@ def __init__(__self__, *, pulumi.set(__self__, "order", order) if package is not None: pulumi.set(__self__, "package", package) - if projects is not None: - pulumi.set(__self__, "projects", projects) + if project is not None: + pulumi.set(__self__, "project", project) if state is not None: pulumi.set(__self__, "state", state) if type is not None: @@ -342,15 +342,15 @@ def package(self, value: Optional[pulumi.Input['CloudRouterPackageArgs']]): @property @pulumi.getter - def projects(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['CloudRouterProjectArgs']]]]: + def project(self) -> Optional[pulumi.Input['CloudRouterProjectArgs']]: """ Fabric Cloud Router project """ - return pulumi.get(self, "projects") + return pulumi.get(self, "project") - @projects.setter - def projects(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['CloudRouterProjectArgs']]]]): - pulumi.set(self, "projects", value) + @project.setter + def project(self, value: Optional[pulumi.Input['CloudRouterProjectArgs']]): + pulumi.set(self, "project", value) @property @pulumi.getter @@ -389,7 +389,7 @@ def __init__(__self__, notifications: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['CloudRouterNotificationArgs']]]]] = None, order: Optional[pulumi.Input[pulumi.InputType['CloudRouterOrderArgs']]] = None, package: Optional[pulumi.Input[pulumi.InputType['CloudRouterPackageArgs']]] = None, - projects: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['CloudRouterProjectArgs']]]]] = None, + project: Optional[pulumi.Input[pulumi.InputType['CloudRouterProjectArgs']]] = None, type: Optional[pulumi.Input[str]] = None, __props__=None): """ @@ -431,7 +431,7 @@ def __init__(__self__, :param pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['CloudRouterNotificationArgs']]]] notifications: Preferences for notifications on Fabric Cloud Router configuration or status changes :param pulumi.Input[pulumi.InputType['CloudRouterOrderArgs']] order: Order information related to this Fabric Cloud Router :param pulumi.Input[pulumi.InputType['CloudRouterPackageArgs']] package: Fabric Cloud Router package - :param pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['CloudRouterProjectArgs']]]] projects: Fabric Cloud Router project + :param pulumi.Input[pulumi.InputType['CloudRouterProjectArgs']] project: Fabric Cloud Router project :param pulumi.Input[str] type: Notification Type - ALL,CONNECTION*APPROVAL,SALES*REP_NOTIFICATIONS, NOTIFICATIONS """ ... @@ -492,7 +492,7 @@ def _internal_init(__self__, notifications: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['CloudRouterNotificationArgs']]]]] = None, order: Optional[pulumi.Input[pulumi.InputType['CloudRouterOrderArgs']]] = None, package: Optional[pulumi.Input[pulumi.InputType['CloudRouterPackageArgs']]] = None, - projects: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['CloudRouterProjectArgs']]]]] = None, + project: Optional[pulumi.Input[pulumi.InputType['CloudRouterProjectArgs']]] = None, type: Optional[pulumi.Input[str]] = None, __props__=None): opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts) @@ -516,7 +516,7 @@ def _internal_init(__self__, if package is None and not opts.urn: raise TypeError("Missing required property 'package'") __props__.__dict__["package"] = package - __props__.__dict__["projects"] = projects + __props__.__dict__["project"] = project if type is None and not opts.urn: raise TypeError("Missing required property 'type'") __props__.__dict__["type"] = type @@ -544,7 +544,7 @@ def get(resource_name: str, notifications: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['CloudRouterNotificationArgs']]]]] = None, order: Optional[pulumi.Input[pulumi.InputType['CloudRouterOrderArgs']]] = None, package: Optional[pulumi.Input[pulumi.InputType['CloudRouterPackageArgs']]] = None, - projects: Optional[pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['CloudRouterProjectArgs']]]]] = None, + project: Optional[pulumi.Input[pulumi.InputType['CloudRouterProjectArgs']]] = None, state: Optional[pulumi.Input[str]] = None, type: Optional[pulumi.Input[str]] = None) -> 'CloudRouter': """ @@ -564,7 +564,7 @@ def get(resource_name: str, :param pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['CloudRouterNotificationArgs']]]] notifications: Preferences for notifications on Fabric Cloud Router configuration or status changes :param pulumi.Input[pulumi.InputType['CloudRouterOrderArgs']] order: Order information related to this Fabric Cloud Router :param pulumi.Input[pulumi.InputType['CloudRouterPackageArgs']] package: Fabric Cloud Router package - :param pulumi.Input[Sequence[pulumi.Input[pulumi.InputType['CloudRouterProjectArgs']]]] projects: Fabric Cloud Router project + :param pulumi.Input[pulumi.InputType['CloudRouterProjectArgs']] project: Fabric Cloud Router project :param pulumi.Input[str] state: Fabric Cloud Router overall state :param pulumi.Input[str] type: Notification Type - ALL,CONNECTION*APPROVAL,SALES*REP_NOTIFICATIONS, NOTIFICATIONS """ @@ -582,7 +582,7 @@ def get(resource_name: str, __props__.__dict__["notifications"] = notifications __props__.__dict__["order"] = order __props__.__dict__["package"] = package - __props__.__dict__["projects"] = projects + __props__.__dict__["project"] = project __props__.__dict__["state"] = state __props__.__dict__["type"] = type return CloudRouter(resource_name, opts=opts, __props__=__props__) @@ -669,11 +669,11 @@ def package(self) -> pulumi.Output['outputs.CloudRouterPackage']: @property @pulumi.getter - def projects(self) -> pulumi.Output[Optional[Sequence['outputs.CloudRouterProject']]]: + def project(self) -> pulumi.Output[Optional['outputs.CloudRouterProject']]: """ Fabric Cloud Router project """ - return pulumi.get(self, "projects") + return pulumi.get(self, "project") @property @pulumi.getter diff --git a/upstream b/upstream index 727f14ace..39c721cb7 160000 --- a/upstream +++ b/upstream @@ -1 +1 @@ -Subproject commit 727f14acefcb1abc5feff5a20558788564729ee0 +Subproject commit 39c721cb7e2f1293f5559c30b185e0a6906f4eca