From 366026e44237fcaa301b702248f57a5a2113ffb2 Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Wed, 1 Feb 2023 18:38:45 -0700 Subject: [PATCH 01/15] bump dependencies --- data_megaport/data_megaport_aws_connection.go | 2 +- data_megaport/data_megaport_azure_connection.go | 2 +- data_megaport/data_megaport_gcp_connection.go | 2 +- data_megaport/data_megaport_location.go | 2 +- data_megaport/data_megaport_mcr.go | 2 +- data_megaport/data_megaport_partner_port.go | 2 +- data_megaport/data_megaport_port.go | 2 +- data_megaport/data_megaport_vxc.go | 2 +- go.mod | 2 +- main.go | 9 +++++---- provider.go => provider/provider.go | 4 ++-- resource_megaport/resource_megaport_aws_connection.go | 2 +- resource_megaport/resource_megaport_azure_connection.go | 2 +- resource_megaport/resource_megaport_gcp_connection.go | 2 +- resource_megaport/resource_megaport_mcr.go | 2 +- resource_megaport/resource_megaport_port.go | 2 +- resource_megaport/resource_megaport_vxc.go | 2 +- schema_megaport/megaport_aws_connection.go | 2 +- schema_megaport/megaport_azure_connection.go | 2 +- schema_megaport/megaport_gcp_connection.go | 2 +- schema_megaport/megaport_location.go | 2 +- schema_megaport/megaport_mcr.go | 2 +- schema_megaport/megaport_partner_port.go | 2 +- schema_megaport/megaport_port.go | 2 +- schema_megaport/megaport_vxc.go | 2 +- 25 files changed, 30 insertions(+), 29 deletions(-) rename provider.go => provider/provider.go (98%) diff --git a/data_megaport/data_megaport_aws_connection.go b/data_megaport/data_megaport_aws_connection.go index 4d85f3f..52d815d 100644 --- a/data_megaport/data_megaport_aws_connection.go +++ b/data_megaport/data_megaport_aws_connection.go @@ -15,7 +15,7 @@ package data_megaport import ( - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/megaport/terraform-provider-megaport/schema_megaport" ) diff --git a/data_megaport/data_megaport_azure_connection.go b/data_megaport/data_megaport_azure_connection.go index afe9713..98e7876 100644 --- a/data_megaport/data_megaport_azure_connection.go +++ b/data_megaport/data_megaport_azure_connection.go @@ -15,7 +15,7 @@ package data_megaport import ( - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/megaport/terraform-provider-megaport/schema_megaport" ) diff --git a/data_megaport/data_megaport_gcp_connection.go b/data_megaport/data_megaport_gcp_connection.go index c5147f7..9e0d784 100644 --- a/data_megaport/data_megaport_gcp_connection.go +++ b/data_megaport/data_megaport_gcp_connection.go @@ -15,7 +15,7 @@ package data_megaport import ( - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/megaport/terraform-provider-megaport/schema_megaport" ) diff --git a/data_megaport/data_megaport_location.go b/data_megaport/data_megaport_location.go index eb3afa2..7e1ad43 100644 --- a/data_megaport/data_megaport_location.go +++ b/data_megaport/data_megaport_location.go @@ -18,7 +18,7 @@ import ( "errors" "strconv" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/megaport/megaportgo/types" "github.com/megaport/terraform-provider-megaport/schema_megaport" "github.com/megaport/terraform-provider-megaport/terraform_utility" diff --git a/data_megaport/data_megaport_mcr.go b/data_megaport/data_megaport_mcr.go index 792679c..8cbcb37 100644 --- a/data_megaport/data_megaport_mcr.go +++ b/data_megaport/data_megaport_mcr.go @@ -15,7 +15,7 @@ package data_megaport import ( - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/megaport/terraform-provider-megaport/schema_megaport" "github.com/megaport/terraform-provider-megaport/terraform_utility" ) diff --git a/data_megaport/data_megaport_partner_port.go b/data_megaport/data_megaport_partner_port.go index 38fdbb7..8107259 100644 --- a/data_megaport/data_megaport_partner_port.go +++ b/data_megaport/data_megaport_partner_port.go @@ -17,7 +17,7 @@ package data_megaport import ( "errors" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/megaport/terraform-provider-megaport/schema_megaport" "github.com/megaport/terraform-provider-megaport/terraform_utility" ) diff --git a/data_megaport/data_megaport_port.go b/data_megaport/data_megaport_port.go index bb337af..cfa42f4 100644 --- a/data_megaport/data_megaport_port.go +++ b/data_megaport/data_megaport_port.go @@ -15,7 +15,7 @@ package data_megaport import ( - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/megaport/terraform-provider-megaport/schema_megaport" "github.com/megaport/terraform-provider-megaport/terraform_utility" ) diff --git a/data_megaport/data_megaport_vxc.go b/data_megaport/data_megaport_vxc.go index 4374263..cb7ae59 100644 --- a/data_megaport/data_megaport_vxc.go +++ b/data_megaport/data_megaport_vxc.go @@ -15,7 +15,7 @@ package data_megaport import ( - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/megaport/terraform-provider-megaport/schema_megaport" "github.com/megaport/terraform-provider-megaport/terraform_utility" ) diff --git a/go.mod b/go.mod index 6561fa0..d8d3fb7 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,6 @@ go 1.13 require ( github.com/aws/aws-sdk-go v1.25.3 - github.com/hashicorp/terraform-plugin-sdk v1.9.1 + github.com/hashicorp/terraform-plugin-sdk/v2 v2.14.0 github.com/megaport/megaportgo v0.1.15-beta ) diff --git a/main.go b/main.go index 37602eb..0005df5 100644 --- a/main.go +++ b/main.go @@ -15,14 +15,15 @@ package main import ( - "github.com/hashicorp/terraform-plugin-sdk/plugin" - "github.com/hashicorp/terraform-plugin-sdk/terraform" + "github.com/hashicorp/terraform-plugin-sdk/v2/plugin" + "github.com/megaport/terraform-provider-megaport/provider" ) +import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" func main() { plugin.Serve(&plugin.ServeOpts{ - ProviderFunc: func() terraform.ResourceProvider { - return Provider() + ProviderFunc: func() *schema.Provider { + return provider.Provider() }, }) } diff --git a/provider.go b/provider/provider.go similarity index 98% rename from provider.go rename to provider/provider.go index 3d30c88..8cdbad6 100644 --- a/provider.go +++ b/provider/provider.go @@ -12,12 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -package main +package provider import ( "errors" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/megaport/terraform-provider-megaport/data_megaport" "github.com/megaport/terraform-provider-megaport/resource_megaport" "github.com/megaport/terraform-provider-megaport/terraform_utility" diff --git a/resource_megaport/resource_megaport_aws_connection.go b/resource_megaport/resource_megaport_aws_connection.go index 2f42b32..a9def79 100644 --- a/resource_megaport/resource_megaport_aws_connection.go +++ b/resource_megaport/resource_megaport_aws_connection.go @@ -21,7 +21,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/directconnect" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/megaport/megaportgo/types" "github.com/megaport/terraform-provider-megaport/schema_megaport" "github.com/megaport/terraform-provider-megaport/terraform_utility" diff --git a/resource_megaport/resource_megaport_azure_connection.go b/resource_megaport/resource_megaport_azure_connection.go index 7cdfaf5..d982dfb 100644 --- a/resource_megaport/resource_megaport_azure_connection.go +++ b/resource_megaport/resource_megaport_azure_connection.go @@ -17,7 +17,7 @@ package resource_megaport import ( "time" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" vxc_service "github.com/megaport/megaportgo/service/vxc" "github.com/megaport/megaportgo/types" "github.com/megaport/terraform-provider-megaport/schema_megaport" diff --git a/resource_megaport/resource_megaport_gcp_connection.go b/resource_megaport/resource_megaport_gcp_connection.go index c0d310e..4bd61ac 100644 --- a/resource_megaport/resource_megaport_gcp_connection.go +++ b/resource_megaport/resource_megaport_gcp_connection.go @@ -17,7 +17,7 @@ package resource_megaport import ( "time" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" vxc_service "github.com/megaport/megaportgo/service/vxc" "github.com/megaport/megaportgo/types" "github.com/megaport/terraform-provider-megaport/schema_megaport" diff --git a/resource_megaport/resource_megaport_mcr.go b/resource_megaport/resource_megaport_mcr.go index 97bc59b..63097b7 100644 --- a/resource_megaport/resource_megaport_mcr.go +++ b/resource_megaport/resource_megaport_mcr.go @@ -18,7 +18,7 @@ import ( "errors" "fmt" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/megaport/megaportgo/types" "github.com/megaport/terraform-provider-megaport/schema_megaport" "github.com/megaport/terraform-provider-megaport/terraform_utility" diff --git a/resource_megaport/resource_megaport_port.go b/resource_megaport/resource_megaport_port.go index 2d276b6..8e65f5b 100644 --- a/resource_megaport/resource_megaport_port.go +++ b/resource_megaport/resource_megaport_port.go @@ -18,7 +18,7 @@ import ( "errors" "fmt" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/megaport/terraform-provider-megaport/schema_megaport" "github.com/megaport/terraform-provider-megaport/terraform_utility" ) diff --git a/resource_megaport/resource_megaport_vxc.go b/resource_megaport/resource_megaport_vxc.go index f726d68..6ca3ffc 100644 --- a/resource_megaport/resource_megaport_vxc.go +++ b/resource_megaport/resource_megaport_vxc.go @@ -21,7 +21,7 @@ import ( "reflect" "time" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/megaport/megaportgo/types" "github.com/megaport/terraform-provider-megaport/schema_megaport" "github.com/megaport/terraform-provider-megaport/terraform_utility" diff --git a/schema_megaport/megaport_aws_connection.go b/schema_megaport/megaport_aws_connection.go index 534a164..91bb59b 100644 --- a/schema_megaport/megaport_aws_connection.go +++ b/schema_megaport/megaport_aws_connection.go @@ -15,7 +15,7 @@ package schema_megaport import ( - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func ResourceAWSConnectionVXCSchema() map[string]*schema.Schema { diff --git a/schema_megaport/megaport_azure_connection.go b/schema_megaport/megaport_azure_connection.go index 0137595..4d62779 100644 --- a/schema_megaport/megaport_azure_connection.go +++ b/schema_megaport/megaport_azure_connection.go @@ -15,7 +15,7 @@ package schema_megaport import ( - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func ResourceAzureConnectionVXCSchema() map[string]*schema.Schema { diff --git a/schema_megaport/megaport_gcp_connection.go b/schema_megaport/megaport_gcp_connection.go index 179ca3a..db191f5 100644 --- a/schema_megaport/megaport_gcp_connection.go +++ b/schema_megaport/megaport_gcp_connection.go @@ -15,7 +15,7 @@ package schema_megaport import ( - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func ResourceGcpConnectionVXCSchema() map[string]*schema.Schema { diff --git a/schema_megaport/megaport_location.go b/schema_megaport/megaport_location.go index f86c3a8..681cb65 100644 --- a/schema_megaport/megaport_location.go +++ b/schema_megaport/megaport_location.go @@ -14,7 +14,7 @@ package schema_megaport -import "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" // DataLocationSchema is the data schema of a Megaport Location func DataLocationSchema() map[string]*schema.Schema { diff --git a/schema_megaport/megaport_mcr.go b/schema_megaport/megaport_mcr.go index 3221d2a..7b44742 100644 --- a/schema_megaport/megaport_mcr.go +++ b/schema_megaport/megaport_mcr.go @@ -15,7 +15,7 @@ package schema_megaport import ( - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func ResourceMegaportMCRSchema() map[string]*schema.Schema { diff --git a/schema_megaport/megaport_partner_port.go b/schema_megaport/megaport_partner_port.go index 31f1fa8..6a330c7 100644 --- a/schema_megaport/megaport_partner_port.go +++ b/schema_megaport/megaport_partner_port.go @@ -15,7 +15,7 @@ package schema_megaport import ( - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func DataPartnerPortSchema() map[string]*schema.Schema { diff --git a/schema_megaport/megaport_port.go b/schema_megaport/megaport_port.go index fd4ed8c..9a28512 100644 --- a/schema_megaport/megaport_port.go +++ b/schema_megaport/megaport_port.go @@ -14,7 +14,7 @@ package schema_megaport -import "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" func ResourcePortSchema() map[string]*schema.Schema { return map[string]*schema.Schema{ diff --git a/schema_megaport/megaport_vxc.go b/schema_megaport/megaport_vxc.go index 6a46620..20ec601 100644 --- a/schema_megaport/megaport_vxc.go +++ b/schema_megaport/megaport_vxc.go @@ -15,7 +15,7 @@ package schema_megaport import ( - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func ResourceVXCSchema() map[string]*schema.Schema { From 8f20fc9c5ae237c783680142e23424da713a6a3c Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Mon, 2 May 2022 18:07:23 -0600 Subject: [PATCH 02/15] Mark password and otp_key as sensitive --- provider/provider.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/provider/provider.go b/provider/provider.go index 8cdbad6..b251ec4 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -47,11 +47,13 @@ func Provider() *schema.Provider { Type: schema.TypeString, Required: true, DefaultFunc: schema.EnvDefaultFunc("MEGAPORT_PASSWORD", nil), + Sensitive: true, }, "mfa_otp_key": { Type: schema.TypeString, Optional: true, DefaultFunc: schema.EnvDefaultFunc("MEGAPORT_MFA_OTP_KEY", nil), + Sensitive: true, }, "delete_ports": { Type: schema.TypeBool, From 56656801c740ea29da4b5cbaa9284c3e7e65f6e1 Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Mon, 2 May 2022 18:10:04 -0600 Subject: [PATCH 03/15] Add support for locations query --- data_megaport/data_megaport_locations.go | 47 ++++++++++++++++++++++++ provider/provider.go | 1 + schema_megaport/megaport_locations.go | 29 +++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 data_megaport/data_megaport_locations.go create mode 100644 schema_megaport/megaport_locations.go diff --git a/data_megaport/data_megaport_locations.go b/data_megaport/data_megaport_locations.go new file mode 100644 index 0000000..98dbe43 --- /dev/null +++ b/data_megaport/data_megaport_locations.go @@ -0,0 +1,47 @@ +// Copyright 2020 Megaport Pty Ltd +// +// Licensed under the Mozilla Public License, Version 2.0 (the +// "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package data_megaport + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/megaport/terraform-provider-megaport/schema_megaport" + "github.com/megaport/terraform-provider-megaport/terraform_utility" +) + +func MegaportLocations() *schema.Resource { + return &schema.Resource{ + Read: dataMegaportLocationsRead, + Schema: schema_megaport.DataLocationsSchema(), + } +} + +func dataMegaportLocationsRead(d *schema.ResourceData, m interface{}) error { + location := m.(*terraform_utility.MegaportClient).Location + locations, err := location.GetAllLocations() + if err != nil { + return err + } + var locationNames []string + + for _, loc := range locations { + locationNames = append(locationNames, loc.Name) + } + d.SetId("potato") + err = d.Set("location_names", locationNames) + if err != nil { + return err + } + return nil +} diff --git a/provider/provider.go b/provider/provider.go index b251ec4..2013741 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -73,6 +73,7 @@ func Provider() *schema.Provider { DataSourcesMap: map[string]*schema.Resource{ "megaport_port": data_megaport.MegaportPort(), "megaport_location": data_megaport.MegaportLocation(), + "megaport_locations": data_megaport.MegaportLocations(), "megaport_vxc": data_megaport.MegaportVXC(), "megaport_partner_port": data_megaport.MegaportPartnerPort(), "megaport_aws_connection": data_megaport.MegaportAWSConnection(), diff --git a/schema_megaport/megaport_locations.go b/schema_megaport/megaport_locations.go new file mode 100644 index 0000000..7a63da1 --- /dev/null +++ b/schema_megaport/megaport_locations.go @@ -0,0 +1,29 @@ +// Copyright 2020 Megaport Pty Ltd +// +// Licensed under the Mozilla Public License, Version 2.0 (the +// "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package schema_megaport + +import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + +// DataLocationsSchema is the data schema of a Megaport Locations query + +func DataLocationsSchema() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "location_names": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + } +} From 0fe6cfd90779bea1d80b872a94f7dc0fbd884323 Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Tue, 3 May 2022 09:14:49 -0600 Subject: [PATCH 04/15] First swing at adding port query --- data_megaport/data_megaport_locations.go | 58 +++++++++++---- data_megaport/data_megaport_port.go | 2 +- data_megaport/data_megaport_ports.go | 78 +++++++++++++++++++++ go.mod | 3 + provider/provider.go | 1 + schema_megaport/megaport_locations.go | 6 +- schema_megaport/megaport_port.go | 89 ++---------------------- schema_megaport/megaport_ports.go | 31 +++++++++ 8 files changed, 169 insertions(+), 99 deletions(-) create mode 100644 data_megaport/data_megaport_ports.go create mode 100644 schema_megaport/megaport_ports.go diff --git a/data_megaport/data_megaport_locations.go b/data_megaport/data_megaport_locations.go index 98dbe43..818a486 100644 --- a/data_megaport/data_megaport_locations.go +++ b/data_megaport/data_megaport_locations.go @@ -15,6 +15,10 @@ package data_megaport import ( + "context" + "github.com/hashicorp/go-cty/cty" + "github.com/hashicorp/go-uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/megaport/terraform-provider-megaport/schema_megaport" "github.com/megaport/terraform-provider-megaport/terraform_utility" @@ -22,26 +26,56 @@ import ( func MegaportLocations() *schema.Resource { return &schema.Resource{ - Read: dataMegaportLocationsRead, - Schema: schema_megaport.DataLocationsSchema(), + ReadContext: dataMegaportLocationsRead, + Schema: schema_megaport.DataLocationsSchema(), } } -func dataMegaportLocationsRead(d *schema.ResourceData, m interface{}) error { +func dataMegaportLocationsRead(c context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + errors := make([]diag.Diagnostic, 0) location := m.(*terraform_utility.MegaportClient).Location - locations, err := location.GetAllLocations() + locationsResponse, err := location.GetAllLocations() if err != nil { - return err + errors = append(errors, diag.Diagnostic{ + Severity: diag.Error, + Summary: "Failed to get megaport locations list", + Detail: err.Error(), + AttributePath: make([]cty.PathStep, 0), + }) + return errors } - var locationNames []string - for _, loc := range locations { - locationNames = append(locationNames, loc.Name) + locations := make([]map[string]interface{}, len(locationsResponse)) + + for i, loc := range locationsResponse { + location := make(map[string]interface{}) + location["address"] = loc.Address + location["country"] = loc.Country + location["has_mcr"] = loc.VRouterAvailable + location["id"] = loc.ID + location["latitude"] = loc.Latitude + location["live_date"] = loc.LiveDate + location["longitude"] = loc.Longitude + location["market"] = loc.Market + location["metro"] = loc.Metro + location["name"] = loc.Name + location["site_code"] = loc.SiteCode + location["status"] = loc.Status + locations[i] = location } - d.SetId("potato") - err = d.Set("location_names", locationNames) + + id, err := uuid.GenerateUUID() + if err != nil { - return err + errors = append(errors, diag.Diagnostic{ + Severity: diag.Error, + Summary: err.Error(), + Detail: "Failed to generate UUID as Id", + AttributePath: make([]cty.PathStep, 0), + }) + return errors } - return nil + d.Set("locations", &locations) + d.SetId(id) + return errors } diff --git a/data_megaport/data_megaport_port.go b/data_megaport/data_megaport_port.go index cfa42f4..416ced3 100644 --- a/data_megaport/data_megaport_port.go +++ b/data_megaport/data_megaport_port.go @@ -23,7 +23,7 @@ import ( func MegaportPort() *schema.Resource { return &schema.Resource{ Read: dataMegaportPortRead, - Schema: schema_megaport.DataPortSchema(), + Schema: schema_megaport.ResourcePortSchema(), } } diff --git a/data_megaport/data_megaport_ports.go b/data_megaport/data_megaport_ports.go new file mode 100644 index 0000000..3486a61 --- /dev/null +++ b/data_megaport/data_megaport_ports.go @@ -0,0 +1,78 @@ +// Copyright 2020 Megaport Pty Ltd +// +// Licensed under the Mozilla Public License, Version 2.0 (the +// "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package data_megaport + +import ( + "github.com/hashicorp/go-uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/megaport/megaportgo/types" + "github.com/megaport/terraform-provider-megaport/schema_megaport" + "github.com/megaport/terraform-provider-megaport/terraform_utility" +) + +func MegaportPorts() *schema.Resource { + return &schema.Resource{ + Read: dataMegaportPortsRead, + Schema: schema_megaport.DataPortsSchema(), + } +} + +func dataMegaportPortsRead(d *schema.ResourceData, m interface{}) error { + port := m.(*terraform_utility.MegaportClient).Port + + id, err := uuid.GenerateUUID() + + if err != nil { + return err + } + + ports, retrievalErr := port.GetPorts() + + if retrievalErr != nil { + return retrievalErr + } + + converted := make([]map[string]interface{}, len(ports)) + + for i, port := range ports { + converted[i] = tfizePort(port) + } + + d.SetId(id) + + return d.Set("ports", &converted) +} + +func tfizePort(port types.Port) map[string]interface{} { + tf := make(map[string]interface{}) + tf["admin_locked"] = port.AdminLocked + tf["company_name"] = port.CompanyName + tf["create_date"] = port.CreateDate + tf["created_by"] = port.CreatedBy + tf["lag_id"] = port.LAGID + tf["lag_primary"] = port.LAGPrimary + tf["live_date"] = port.LiveDate + tf["location_id"] = port.LocationID + tf["locked"] = port.Locked + tf["market_code"] = port.Market + tf["marketplace_visibility"] = port.MarketplaceVisibility + tf["port_name"] = port.Name + tf["port_speed"] = port.PortSpeed + tf["provisioning_status"] = port.ProvisioningStatus + tf["term"] = port.ContractTermMonths + tf["type"] = port.Type + tf["uid"] = port.UID + return tf +} diff --git a/go.mod b/go.mod index d8d3fb7..3f632a4 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,9 @@ go 1.13 require ( github.com/aws/aws-sdk-go v1.25.3 + github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320 + github.com/hashicorp/go-uuid v1.0.3 github.com/hashicorp/terraform-plugin-sdk/v2 v2.14.0 github.com/megaport/megaportgo v0.1.15-beta ) + diff --git a/provider/provider.go b/provider/provider.go index 2013741..d7e481e 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -72,6 +72,7 @@ func Provider() *schema.Provider { ConfigureFunc: providerConfigure, DataSourcesMap: map[string]*schema.Resource{ "megaport_port": data_megaport.MegaportPort(), + "megaport_ports": data_megaport.MegaportPorts(), "megaport_location": data_megaport.MegaportLocation(), "megaport_locations": data_megaport.MegaportLocations(), "megaport_vxc": data_megaport.MegaportVXC(), diff --git a/schema_megaport/megaport_locations.go b/schema_megaport/megaport_locations.go index 7a63da1..91fbd18 100644 --- a/schema_megaport/megaport_locations.go +++ b/schema_megaport/megaport_locations.go @@ -20,10 +20,12 @@ import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" func DataLocationsSchema() map[string]*schema.Schema { return map[string]*schema.Schema{ - "location_names": { + "locations": { Type: schema.TypeList, Computed: true, - Elem: &schema.Schema{Type: schema.TypeString}, + Elem: &schema.Resource{ + Schema: DataLocationSchema(), + }, }, } } diff --git a/schema_megaport/megaport_port.go b/schema_megaport/megaport_port.go index 9a28512..2c3eff0 100644 --- a/schema_megaport/megaport_port.go +++ b/schema_megaport/megaport_port.go @@ -18,6 +18,10 @@ import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" func ResourcePortSchema() map[string]*schema.Schema { return map[string]*schema.Schema{ + "uid": { + Type: schema.TypeString, + Computed: true, + }, "port_name": { Type: schema.TypeString, Required: true, @@ -100,92 +104,9 @@ func ResourcePortSchema() map[string]*schema.Schema { Default: 0, ForceNew: true, }, - } -} - -func DataPortSchema() map[string]*schema.Schema { - return map[string]*schema.Schema{ - "port_name": { - Type: schema.TypeString, - Computed: true, - }, - "type": { - Type: schema.TypeString, - Computed: true, - }, - "provisioning_status": { - Type: schema.TypeString, - Computed: true, - }, - "create_date": { + "product_id": { Type: schema.TypeInt, Computed: true, }, - "created_by": { - Type: schema.TypeString, - Computed: true, - }, - "port_speed": { - Type: schema.TypeInt, - Computed: true, - }, - "live_date": { - Type: schema.TypeInt, - Computed: true, - }, - "market_code": { - Type: schema.TypeString, - Computed: true, - }, - "location_id": { - Type: schema.TypeInt, - Computed: true, - }, - "marketplace_visibility": { - Type: schema.TypeBool, - Computed: true, - }, - "company_name": { - Type: schema.TypeString, - Computed: true, - }, - "term": { - Type: schema.TypeInt, - Computed: true, - }, - "port_id": { - Type: schema.TypeString, - Optional: true, - }, - "lag_primary": { - Type: schema.TypeBool, - Computed: true, - Optional: true, - }, - "lag_id": { - Type: schema.TypeInt, - Computed: true, - Optional: true, - }, - "locked": { - Type: schema.TypeBool, - Computed: true, - }, - "admin_locked": { - Type: schema.TypeBool, - Computed: true, - }, - "lag": { - Type: schema.TypeBool, - Optional: true, - Default: false, - ForceNew: true, - }, - "lag_port_count": { - Type: schema.TypeInt, - Optional: true, - Default: 0, - ForceNew: true, - }, } } diff --git a/schema_megaport/megaport_ports.go b/schema_megaport/megaport_ports.go new file mode 100644 index 0000000..a214e1c --- /dev/null +++ b/schema_megaport/megaport_ports.go @@ -0,0 +1,31 @@ +// Copyright 2020 Megaport Pty Ltd +// +// Licensed under the Mozilla Public License, Version 2.0 (the +// "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// https://mozilla.org/MPL/2.0/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package schema_megaport + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func DataPortsSchema() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "ports": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: ResourcePortSchema(), + }, + }, + } +} From 69dfd6f7a9a146b465e51bda44841bee4a227c33 Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Mon, 15 May 2023 13:18:00 -0600 Subject: [PATCH 05/15] bump dependencies --- go.mod | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3f632a4..68dddd6 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,9 @@ module github.com/megaport/terraform-provider-megaport go 1.13 require ( - github.com/aws/aws-sdk-go v1.25.3 + github.com/aws/aws-sdk-go v1.44.263 github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320 github.com/hashicorp/go-uuid v1.0.3 - github.com/hashicorp/terraform-plugin-sdk/v2 v2.14.0 + github.com/hashicorp/terraform-plugin-sdk/v2 v2.26.1 github.com/megaport/megaportgo v0.1.15-beta ) - From 3a1c4fd9b4e16840104ad8eae19ace0d5386158c Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Mon, 15 May 2023 15:40:50 -0600 Subject: [PATCH 06/15] test --- go.mod | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/go.mod b/go.mod index 68dddd6..db29edb 100644 --- a/go.mod +++ b/go.mod @@ -12,3 +12,45 @@ require ( github.com/hashicorp/terraform-plugin-sdk/v2 v2.26.1 github.com/megaport/megaportgo v0.1.15-beta ) + +require ( + github.com/agext/levenshtein v1.2.2 // indirect + github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect + github.com/fatih/color v1.13.0 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hashicorp/go-hclog v1.4.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-plugin v1.4.8 // indirect + github.com/hashicorp/go-version v1.6.0 // indirect + github.com/hashicorp/hcl/v2 v2.16.2 // indirect + github.com/hashicorp/logutils v1.0.0 // indirect + github.com/hashicorp/terraform-plugin-go v0.14.3 // indirect + github.com/hashicorp/terraform-plugin-log v0.8.0 // indirect + github.com/hashicorp/terraform-registry-address v0.1.0 // indirect + github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 // indirect + github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/lithammer/fuzzysearch v1.1.5 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/go-wordwrap v1.0.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/oklog/run v1.0.0 // indirect + github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect + github.com/vmihailenco/msgpack/v4 v4.3.12 // indirect + github.com/vmihailenco/tagparser v0.1.1 // indirect + github.com/xlzd/gotp v0.0.0-20220110052318-fab697c03c2c // indirect + github.com/zclconf/go-cty v1.13.1 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect + google.golang.org/appengine v1.6.6 // indirect + google.golang.org/genproto v0.0.0-20200711021454-869866162049 // indirect + google.golang.org/grpc v1.51.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect +) From 3f86bc6422ffb90ea700e083738fa77ea00b1244 Mon Sep 17 00:00:00 2001 From: Dave Setzke Date: Thu, 18 May 2023 18:21:46 -0600 Subject: [PATCH 07/15] WIP: Use updated megaportgo lib with configurable timeouts via context --- build.sh | 6 +- go.mod | 2 + .../resource_megaport_azure_connection.go | 82 +++++++++++++++++-- 3 files changed, 79 insertions(+), 11 deletions(-) diff --git a/build.sh b/build.sh index bfffc08..0430698 100755 --- a/build.sh +++ b/build.sh @@ -13,7 +13,7 @@ # limitations under the License. provider_directory="$(pwd)" -GO111MODULE=on GOSUMDB=off go get -d github.com/megaport/megaportgo +GOSUMDB=off go mod download rm -f bin/* version="$(git describe --tags)" provider_filename="$(pwd)/bin/terraform-provider-megaport_$version" @@ -26,10 +26,10 @@ cd ~ arch=$(go version | cut -d" " -f4 | sed 's/\//_/g') plugin_directory="$(pwd)/.terraform.d/plugins/${arch}/" mkdir -p $plugin_directory -ln -s $provider_filename_no_version $plugin_directory +ln -s --force $provider_filename_no_version $plugin_directory echo "Symbolic link created from build directory to terraform.d. < 0.13" plugin_directory="$(pwd)/.terraform.d/plugins/megaport.com/megaport/megaport/${version:1}/${arch}/" mkdir -p $plugin_directory -ln -s $provider_filename_no_version $plugin_directory +ln -s --force $provider_filename_no_version $plugin_directory echo "Symbolic link created from build directory to terraform.d. >= 0.13" cd $provider_directory diff --git a/go.mod b/go.mod index db29edb..bd6e023 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,8 @@ module github.com/megaport/terraform-provider-megaport // For local development //replace github.com/megaport/megaportgo => +// vxc-wait-retry-with-context +replace github.com/megaport/megaportgo => github.com/bestateless/megaportgo v0.1.11-stateless.0.20230518042555-33e752a3af41 go 1.13 diff --git a/resource_megaport/resource_megaport_azure_connection.go b/resource_megaport/resource_megaport_azure_connection.go index d982dfb..df9ef61 100644 --- a/resource_megaport/resource_megaport_azure_connection.go +++ b/resource_megaport/resource_megaport_azure_connection.go @@ -15,11 +15,16 @@ package resource_megaport import ( + "context" + "errors" "time" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + + "github.com/megaport/megaportgo/mega_err" vxc_service "github.com/megaport/megaportgo/service/vxc" "github.com/megaport/megaportgo/types" + "github.com/megaport/terraform-provider-megaport/schema_megaport" "github.com/megaport/terraform-provider-megaport/terraform_utility" ) @@ -114,11 +119,45 @@ func resourceMegaportAzureConnectionCreate(d *schema.ResourceData, m interface{} } d.SetId(vxcId) - vxc.WaitForVXCProvisioning(vxcId) - time.Sleep(60 * time.Second) // wait so that the vLANs will be available. + + // default waits up to 15 minutes for it to report that the VXC is LIVE, + // checking every 30 seconds and logging every 2 minutes 30 seconds. + // _, err := vxc.WaitForVXCProvisioning(vxcId) + // we are going to set an initial timeout of 15 minutes. If it expires, we'll + // subtract 5 minutes and try again for up to a total of 30 minutes. + timeout := 15 * time.Minute + pollFrequency := 30 * time.Second + for { + if timeout <= 0 { + return errors.New(mega_err.ERR_VXC_PROVISION_TIMEOUT_EXCEED) + } + + _, err := doWaitFor( + context.Background(), timeout, func(ctx context.Context) (bool, error) { + return vxc.WaitForVXCProvisioningCtx(ctx, pollFrequency, vxcId) + }, + ) + if err == nil { + break + } + + if err.Error() == mega_err.ERR_VXC_PROVISION_TIMEOUT_EXCEED || + err.Error() == mega_err.ERR_VXC_NOT_LIVE { + timeout = timeout - (5 * time.Minute) + } + } return resourceMegaportAzureConnectionRead(d, m) } +func doWaitFor(parentCtx context.Context, timeout time.Duration, f func(ctx context.Context) (bool, error)) ( + bool, + error, +) { + ctx, cancelFunc := context.WithTimeout(parentCtx, timeout) + defer cancelFunc() + return f(ctx) +} + func resourceMegaportAzureConnectionRead(d *schema.ResourceData, m interface{}) error { return ResourceMegaportVXCRead(d, m) } @@ -134,19 +173,46 @@ func resourceMegaportAzureConnectionUpdate(d *schema.ResourceData, m interface{} } if d.HasChange("vxc_name") || d.HasChange("rate_limit") || d.HasChange("a_end") { - _, updateErr := vxc.UpdateVXC(d.Id(), d.Get("vxc_name").(string), + _, updateErr := vxc.UpdateVXC( + d.Id(), d.Get("vxc_name").(string), d.Get("rate_limit").(int), aVlan, - 0) + 0, + ) if updateErr != nil { return updateErr } - vxc.WaitForVXCUpdated(d.Id(), d.Get("vxc_name").(string), - d.Get("rate_limit").(int), - aVlan, - 0) + timeout := 15 * time.Minute + pollFrequency := 30 * time.Second + for { + if timeout <= 0 { + return errors.New(mega_err.ERR_VXC_UPDATE_TIMEOUT_EXCEED) + } + + _, err := doWaitFor( + context.Background(), timeout, func(ctx context.Context) (bool, error) { + return vxc.WaitForVXCUpdatedCtx( + ctx, + pollFrequency, + d.Id(), + d.Get("vxc_name").(string), + d.Get("rate_limit").(int), + aVlan, + 0, + ) + }, + ) + if err == nil { + break + } + + if err.Error() == mega_err.ERR_VXC_UPDATE_TIMEOUT_EXCEED || + err.Error() == mega_err.ERR_VXC_NOT_LIVE { + timeout = timeout - (5 * time.Minute) + } + } } return resourceMegaportAzureConnectionRead(d, m) From e488b933f398bbfdd135e67886eba5e5f894a368 Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Mon, 22 May 2023 17:07:38 -0600 Subject: [PATCH 08/15] Fix for race condition in provisioning It seems that something in Azure is eventually consistent. Specifically, when we set up the express route circuit in azure and then (quickly) set up a VXC thereafter Azure seems to return an error saying that the service key (which it just gave us) is invalid. I think the error goes as described in this PlantUML ```puml @startuml participant executor participant azure participant megaport executor -> azure: create express route azure -> executor: ok, done. service key is $x executor -> megaport: provision express route with service key $x megaport -> azure : can you set up $x for me? azure -> megaport : I have never heard of $x megaport -> executor : $x is invalid service key @enduml ``` This patch ensures that the service key is valid by waiting up to 5 minutes for the service key to appear to megaport. --- go.mod | 48 ++++++++----------- .../resource_megaport_azure_connection.go | 22 +++++++++ 2 files changed, 42 insertions(+), 28 deletions(-) diff --git a/go.mod b/go.mod index bd6e023..477db10 100644 --- a/go.mod +++ b/go.mod @@ -2,13 +2,13 @@ module github.com/megaport/terraform-provider-megaport // For local development //replace github.com/megaport/megaportgo => -// vxc-wait-retry-with-context -replace github.com/megaport/megaportgo => github.com/bestateless/megaportgo v0.1.11-stateless.0.20230518042555-33e752a3af41 +// vxc-wait-retry-with-context-clean +replace github.com/megaport/megaportgo => github.com/bestateless/megaportgo v0.1.11-stateless.0.20230522224628-211fd5db81ec go 1.13 require ( - github.com/aws/aws-sdk-go v1.44.263 + github.com/aws/aws-sdk-go v1.44.267 github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320 github.com/hashicorp/go-uuid v1.0.3 github.com/hashicorp/terraform-plugin-sdk/v2 v2.26.1 @@ -16,43 +16,35 @@ require ( ) require ( - github.com/agext/levenshtein v1.2.2 // indirect + github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/fatih/color v1.15.0 // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect - github.com/hashicorp/go-hclog v1.4.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-plugin v1.4.8 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/hcl/v2 v2.16.2 // indirect github.com/hashicorp/logutils v1.0.0 // indirect - github.com/hashicorp/terraform-plugin-go v0.14.3 // indirect + github.com/hashicorp/terraform-plugin-go v0.15.0 // indirect github.com/hashicorp/terraform-plugin-log v0.8.0 // indirect - github.com/hashicorp/terraform-registry-address v0.1.0 // indirect - github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 // indirect - github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d // indirect + github.com/hashicorp/terraform-svchost v0.1.0 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/lithammer/fuzzysearch v1.1.5 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/lithammer/fuzzysearch v1.1.8 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect - github.com/mitchellh/go-wordwrap v1.0.0 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/oklog/run v1.0.0 // indirect + github.com/oklog/run v1.1.0 // indirect github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect github.com/vmihailenco/msgpack/v4 v4.3.12 // indirect - github.com/vmihailenco/tagparser v0.1.1 // indirect - github.com/xlzd/gotp v0.0.0-20220110052318-fab697c03c2c // indirect - github.com/zclconf/go-cty v1.13.1 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - google.golang.org/appengine v1.6.6 // indirect - google.golang.org/genproto v0.0.0-20200711021454-869866162049 // indirect - google.golang.org/grpc v1.51.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + github.com/vmihailenco/tagparser v0.1.2 // indirect + github.com/xlzd/gotp v0.1.0 // indirect + github.com/zclconf/go-cty v1.13.2 // indirect + golang.org/x/net v0.10.0 // indirect + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect + google.golang.org/grpc v1.55.0 // indirect ) diff --git a/resource_megaport/resource_megaport_azure_connection.go b/resource_megaport/resource_megaport_azure_connection.go index df9ef61..7245503 100644 --- a/resource_megaport/resource_megaport_azure_connection.go +++ b/resource_megaport/resource_megaport_azure_connection.go @@ -88,6 +88,28 @@ func resourceMegaportAzureConnectionCreate(d *schema.ResourceData, m interface{} peerings = append(peerings, new_microsoft_peering) } + // Azure seems to be eventually consistent. Thus we wait for megaport to see the service key before we move on + _, serviceKeyErr := doWaitFor(context.Background(), 5*time.Minute, func(ctx context.Context) (bool, error) { + ticker := time.NewTicker(30 * time.Second) + defer ticker.Stop() + for range ticker.C { + if _, serviceKeyLookupErr := vxc.LookupAzureServiceKey(serviceKey); serviceKeyLookupErr != nil { + select { + case <-ctx.Done(): + return false, ctx.Err() + default: + continue + } + } + break + } + return true, nil + }) + + if serviceKeyErr != nil { + return serviceKeyErr + } + // get partner port partnerPortId, partnerLookupErr := vxc.LookupPartnerPorts(serviceKey, rateLimit, vxc_service.PARTNER_AZURE, "") if partnerLookupErr != nil { From fe8967ee00be2749931dd3503c7038f2e19f7648 Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Sun, 21 May 2023 09:08:47 -0600 Subject: [PATCH 09/15] add tentative support for azure single peering vlan --- .../resource_megaport_azure_connection.go | 45 +++++++++++++++++-- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/resource_megaport/resource_megaport_azure_connection.go b/resource_megaport/resource_megaport_azure_connection.go index 7245503..518694fa 100644 --- a/resource_megaport/resource_megaport_azure_connection.go +++ b/resource_megaport/resource_megaport_azure_connection.go @@ -49,6 +49,7 @@ func resourceMegaportAzureConnectionCreate(d *schema.ResourceData, m interface{} cspSettings := d.Get("csp_settings").(*schema.Set).List()[0].(map[string]interface{}) rateLimit := d.Get("rate_limit").(int) serviceKey := cspSettings["service_key"].(string) + var innerVlan *int = nil // peerings var peerings []types.PartnerOrderAzurePeeringConfig @@ -62,6 +63,7 @@ func resourceMegaportAzureConnectionCreate(d *schema.ResourceData, m interface{} SharedKey: private_peering["shared_key"].(string), VLAN: private_peering["requested_vlan"].(int), } + innerVlan = &new_private_peering.VLAN peerings = append(peerings, new_private_peering) } else if cspSettings["auto_create_private_peering"].(bool) { new_private_peering := types.PartnerOrderAzurePeeringConfig{ @@ -126,6 +128,7 @@ func resourceMegaportAzureConnectionCreate(d *schema.ResourceData, m interface{} bEndConfiguration := types.PartnerOrderBEndConfiguration{ PartnerPortID: partnerPortId, PartnerConfig: partnerConfig, + InnerVLAN: innerVlan, } vxcId, buyErr := vxc.BuyPartnerVXC( @@ -184,6 +187,28 @@ func resourceMegaportAzureConnectionRead(d *schema.ResourceData, m interface{}) return ResourceMegaportVXCRead(d, m) } +func checkedCast[T interface{}](input *interface{}) *T { + if input == nil { + return nil + } + cast, check := (*input).(T) + if !check { + return nil + } + return &cast +} + +func digOutTfConfig[T interface{}](d *schema.ResourceData, key string) *T { + if d == nil { + return nil + } + keyLookup, found := (*d).GetOk(key) + if !found { + return nil + } + return checkedCast[T](&keyLookup) +} + func resourceMegaportAzureConnectionUpdate(d *schema.ResourceData, m interface{}) error { vxc := m.(*terraform_utility.MegaportClient).Vxc aVlan := 0 @@ -194,13 +219,25 @@ func resourceMegaportAzureConnectionUpdate(d *schema.ResourceData, m interface{} } } - if d.HasChange("vxc_name") || d.HasChange("rate_limit") || d.HasChange("a_end") { - _, updateErr := vxc.UpdateVXC( - d.Id(), d.Get("vxc_name").(string), + if d.HasChange("vxc_name") || d.HasChange("rate_limit") || d.HasChange("a_end") || d.HasChange("csp_settings") { + var requestedVlan *int = nil + cspSettings := digOutTfConfig[map[string]interface{}](d, "csp_settings") + if cspSettings != nil { + privatePeeringTf, privatePeeringFound := (*cspSettings)["private_peering"] + if privatePeeringFound { + privatePeering := checkedCast[map[string]interface{}](&privatePeeringTf) + if privatePeering != nil { + vlanLookup := (*privatePeering)["requested_vlan"] + requestedVlan = checkedCast[int](&vlanLookup) + } + } + } + + _, updateErr := vxc.UpdateVXCWithInnerVlan(d.Id(), d.Get("vxc_name").(string), d.Get("rate_limit").(int), aVlan, 0, - ) + requestedVlan) if updateErr != nil { return updateErr From de4f98ec94f6337785a60cd6f8e713443eb68db9 Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Mon, 15 May 2023 15:16:08 -0600 Subject: [PATCH 10/15] bump dependencies --- go.mod | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 477db10..2cb3692 100644 --- a/go.mod +++ b/go.mod @@ -2,10 +2,10 @@ module github.com/megaport/terraform-provider-megaport // For local development //replace github.com/megaport/megaportgo => -// vxc-wait-retry-with-context-clean -replace github.com/megaport/megaportgo => github.com/bestateless/megaportgo v0.1.11-stateless.0.20230522224628-211fd5db81ec +// azure-single-peering +replace github.com/megaport/megaportgo => github.com/bestateless/megaportgo v0.1.11-stateless.0.20230522231232-6a2eaee5047e -go 1.13 +go 1.20 require ( github.com/aws/aws-sdk-go v1.44.267 @@ -19,19 +19,23 @@ require ( github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect github.com/fatih/color v1.15.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-plugin v1.4.9 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/hcl/v2 v2.16.2 // indirect github.com/hashicorp/logutils v1.0.0 // indirect github.com/hashicorp/terraform-plugin-go v0.15.0 // indirect github.com/hashicorp/terraform-plugin-log v0.8.0 // indirect + github.com/hashicorp/terraform-registry-address v0.2.0 // indirect github.com/hashicorp/terraform-svchost v0.1.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/lithammer/fuzzysearch v1.1.8 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect @@ -40,11 +44,15 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/oklog/run v1.1.0 // indirect github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect - github.com/vmihailenco/msgpack/v4 v4.3.12 // indirect - github.com/vmihailenco/tagparser v0.1.2 // indirect + github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/xlzd/gotp v0.1.0 // indirect github.com/zclconf/go-cty v1.13.2 // indirect golang.org/x/net v0.10.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/text v0.9.0 // indirect + google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect google.golang.org/grpc v1.55.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect ) From 20ca5ab44b42cc71d367a9980f3cb6163422d4fb Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Tue, 23 May 2023 12:58:46 -0600 Subject: [PATCH 11/15] Arbitrary 0.2.10-stateless --- Makefile | 2 +- build.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 4e321a7..378cd7a 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ HOSTNAME=registry.terraform.io NAMESPACE=megaport NAME=megaport BINARY=terraform-provider-${NAME} -VERSION=0.2.9 +VERSION=0.2.10-stateless OS_ARCH=$$(go version | cut -d" " -f4 | sed 's/\//_/g') ZIP_FILE=terraform-provider-${NAME}_${VERSION}_${OS_ARCH}.zip diff --git a/build.sh b/build.sh index 0430698..3a25e2a 100755 --- a/build.sh +++ b/build.sh @@ -15,7 +15,7 @@ provider_directory="$(pwd)" GOSUMDB=off go mod download rm -f bin/* -version="$(git describe --tags)" +version="v0.2.10-stateless" provider_filename="$(pwd)/bin/terraform-provider-megaport_$version" provider_filename_no_version="$(pwd)/bin/terraform-provider-megaport" go build -o $provider_filename From e78601a322c937efd7681b562ca53009d51de4e3 Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Tue, 23 May 2023 18:33:03 -0600 Subject: [PATCH 12/15] Arbitrary 0.2.10-stateless-2 --- Makefile | 2 +- build.sh | 2 +- .../resource_megaport_aws_connection.go | 46 +++++++++++++++++-- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 378cd7a..efb0418 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ HOSTNAME=registry.terraform.io NAMESPACE=megaport NAME=megaport BINARY=terraform-provider-${NAME} -VERSION=0.2.10-stateless +VERSION=0.2.10-stateless-2 OS_ARCH=$$(go version | cut -d" " -f4 | sed 's/\//_/g') ZIP_FILE=terraform-provider-${NAME}_${VERSION}_${OS_ARCH}.zip diff --git a/build.sh b/build.sh index 3a25e2a..037305d 100755 --- a/build.sh +++ b/build.sh @@ -15,7 +15,7 @@ provider_directory="$(pwd)" GOSUMDB=off go mod download rm -f bin/* -version="v0.2.10-stateless" +version="v0.2.10-stateless-2" provider_filename="$(pwd)/bin/terraform-provider-megaport_$version" provider_filename_no_version="$(pwd)/bin/terraform-provider-megaport" go build -o $provider_filename diff --git a/resource_megaport/resource_megaport_aws_connection.go b/resource_megaport/resource_megaport_aws_connection.go index a9def79..cf3989e 100644 --- a/resource_megaport/resource_megaport_aws_connection.go +++ b/resource_megaport/resource_megaport_aws_connection.go @@ -15,8 +15,10 @@ package resource_megaport import ( + "context" "errors" "log" + "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" @@ -103,12 +105,48 @@ func resourceMegaportAWSConnectionRead(d *schema.ResourceData, m interface{}) er d.Set("vxc_internal_type", "aws") // Aws read - if vifId := vxc.ExtractAwsId(vxcDetails); vifId != "" { - d.Set("aws_id", vifId) + _, awsIdErr := doWaitFor(context.Background(), 5*time.Minute, func(ctx context.Context) (bool, error) { + ticker := time.NewTicker(30 * time.Second) + defer ticker.Stop() + for range ticker.C { + if vifId := vxc.ExtractAwsId(vxcDetails); vifId != "" { + d.Set("aws_id", vifId) + break + } + select { + case <-ctx.Done(): + return false, ctx.Err() + default: + continue + } + } + return true, nil + }) + + if awsIdErr != nil { + return awsIdErr } - if connectionId := vxc.ExtractConnectionId(vxcDetails); connectionId != "" { - d.Set("connection_id", connectionId) + _, connectionIderr := doWaitFor(context.Background(), 5*time.Minute, func(ctx context.Context) (bool, error) { + ticker := time.NewTicker(30 * time.Second) + defer ticker.Stop() + for range ticker.C { + if connectionId := vxc.ExtractConnectionId(vxcDetails); connectionId != "" { + d.Set("connection_id", connectionId) + break + } + select { + case <-ctx.Done(): + return false, ctx.Err() + default: + continue + } + } + return true, nil + }) + + if connectionIderr != nil { + return connectionIderr } // AWS CSP read From 638ee8a99285b3a0feeb7c577b03eed088b0e740 Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Wed, 24 May 2023 11:09:06 -0600 Subject: [PATCH 13/15] Arbitrary 0.2.10-stateless-3 --- .../resource_megaport_aws_connection.go | 101 +++++++++++------- 1 file changed, 62 insertions(+), 39 deletions(-) diff --git a/resource_megaport/resource_megaport_aws_connection.go b/resource_megaport/resource_megaport_aws_connection.go index cf3989e..fb2357b 100644 --- a/resource_megaport/resource_megaport_aws_connection.go +++ b/resource_megaport/resource_megaport_aws_connection.go @@ -102,51 +102,74 @@ func resourceMegaportAWSConnectionRead(d *schema.ResourceData, m interface{}) er return retrievalErr } - d.Set("vxc_internal_type", "aws") - - // Aws read - _, awsIdErr := doWaitFor(context.Background(), 5*time.Minute, func(ctx context.Context) (bool, error) { - ticker := time.NewTicker(30 * time.Second) - defer ticker.Stop() - for range ticker.C { - if vifId := vxc.ExtractAwsId(vxcDetails); vifId != "" { - d.Set("aws_id", vifId) - break - } - select { - case <-ctx.Done(): - return false, ctx.Err() - default: - continue - } - } - return true, nil - }) - - if awsIdErr != nil { - return awsIdErr + err := d.Set("vxc_internal_type", "aws") + if err != nil { + return err } - _, connectionIderr := doWaitFor(context.Background(), 5*time.Minute, func(ctx context.Context) (bool, error) { - ticker := time.NewTicker(30 * time.Second) - defer ticker.Stop() - for range ticker.C { - if connectionId := vxc.ExtractConnectionId(vxcDetails); connectionId != "" { - d.Set("connection_id", connectionId) - break + if d.Get("hosted_connection").(bool) { + + _, connectionIderr := doWaitFor(context.Background(), 5*time.Minute, func(ctx context.Context) (bool, error) { + ticker := time.NewTicker(30 * time.Second) + defer ticker.Stop() + for range ticker.C { + if connectionId := vxc.ExtractConnectionId(vxcDetails); connectionId != "" { + err := d.Set("connection_id", connectionId) + if err != nil { + return false, err + } + err = d.Set("aws_id", "") + if err != nil { + return false, err + } + break + } + select { + case <-ctx.Done(): + return false, ctx.Err() + default: + continue + } } - select { - case <-ctx.Done(): - return false, ctx.Err() - default: - continue + return true, nil + }) + + if connectionIderr != nil { + return connectionIderr + } + + } else { + + // Aws read + _, awsIdErr := doWaitFor(context.Background(), 5*time.Minute, func(ctx context.Context) (bool, error) { + ticker := time.NewTicker(30 * time.Second) + defer ticker.Stop() + for range ticker.C { + if vifId := vxc.ExtractAwsId(vxcDetails); vifId != "" { + err := d.Set("aws_id", vifId) + if err != nil { + return false, err + } + err = d.Set("connection_id", "") + if err != nil { + return false, err + } + break + } + select { + case <-ctx.Done(): + return false, ctx.Err() + default: + continue + } } + return true, nil + }) + + if awsIdErr != nil { + return awsIdErr } - return true, nil - }) - if connectionIderr != nil { - return connectionIderr } // AWS CSP read From 8db8b32e10e8d94e67ca9f0e2f4cfc29850ca9ce Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Wed, 24 May 2023 11:13:33 -0600 Subject: [PATCH 14/15] Arbitrary 0.2.10-stateless-3 --- Makefile | 2 +- build.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index efb0418..ac4bdd6 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ HOSTNAME=registry.terraform.io NAMESPACE=megaport NAME=megaport BINARY=terraform-provider-${NAME} -VERSION=0.2.10-stateless-2 +VERSION=0.2.10-stateless-3 OS_ARCH=$$(go version | cut -d" " -f4 | sed 's/\//_/g') ZIP_FILE=terraform-provider-${NAME}_${VERSION}_${OS_ARCH}.zip diff --git a/build.sh b/build.sh index 037305d..e8acb4c 100755 --- a/build.sh +++ b/build.sh @@ -15,7 +15,7 @@ provider_directory="$(pwd)" GOSUMDB=off go mod download rm -f bin/* -version="v0.2.10-stateless-2" +version="v0.2.10-stateless-3" provider_filename="$(pwd)/bin/terraform-provider-megaport_$version" provider_filename_no_version="$(pwd)/bin/terraform-provider-megaport" go build -o $provider_filename From 827ef940295b5ea2c4745e9e5a768c17960eca7d Mon Sep 17 00:00:00 2001 From: Daniel Noland Date: Wed, 24 May 2023 11:18:26 -0600 Subject: [PATCH 15/15] Arbitrary 0.2.10-stateless-4 --- Makefile | 2 +- build.sh | 2 +- .../resource_megaport_aws_connection.go | 114 ++++++++++-------- 3 files changed, 64 insertions(+), 54 deletions(-) diff --git a/Makefile b/Makefile index ac4bdd6..76eb80b 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ HOSTNAME=registry.terraform.io NAMESPACE=megaport NAME=megaport BINARY=terraform-provider-${NAME} -VERSION=0.2.10-stateless-3 +VERSION=0.2.10-stateless-4 OS_ARCH=$$(go version | cut -d" " -f4 | sed 's/\//_/g') ZIP_FILE=terraform-provider-${NAME}_${VERSION}_${OS_ARCH}.zip diff --git a/build.sh b/build.sh index e8acb4c..6dc0ddd 100755 --- a/build.sh +++ b/build.sh @@ -15,7 +15,7 @@ provider_directory="$(pwd)" GOSUMDB=off go mod download rm -f bin/* -version="v0.2.10-stateless-3" +version="v0.2.10-stateless-4" provider_filename="$(pwd)/bin/terraform-provider-megaport_$version" provider_filename_no_version="$(pwd)/bin/terraform-provider-megaport" go build -o $provider_filename diff --git a/resource_megaport/resource_megaport_aws_connection.go b/resource_megaport/resource_megaport_aws_connection.go index fb2357b..d6f11f9 100644 --- a/resource_megaport/resource_megaport_aws_connection.go +++ b/resource_megaport/resource_megaport_aws_connection.go @@ -17,6 +17,7 @@ package resource_megaport import ( "context" "errors" + "fmt" "log" "time" @@ -107,69 +108,78 @@ func resourceMegaportAWSConnectionRead(d *schema.ResourceData, m interface{}) er return err } - if d.Get("hosted_connection").(bool) { + cspSettings := d.Get("csp_settings").(*schema.Set).List()[0].(map[string]interface{}) + connectType := types.CONNECT_TYPE_AWS_VIF + hostedConnection := cspSettings["hosted_connection"].(bool) + if hostedConnection { + connectType = types.CONNECT_TYPE_AWS_HOSTED_CONNECTION + } - _, connectionIderr := doWaitFor(context.Background(), 5*time.Minute, func(ctx context.Context) (bool, error) { - ticker := time.NewTicker(30 * time.Second) - defer ticker.Stop() - for range ticker.C { - if connectionId := vxc.ExtractConnectionId(vxcDetails); connectionId != "" { - err := d.Set("connection_id", connectionId) - if err != nil { - return false, err + switch connectType { + case types.CONNECT_TYPE_AWS_VIF: + { + _, awsIdErr := doWaitFor(context.Background(), 5*time.Minute, func(ctx context.Context) (bool, error) { + ticker := time.NewTicker(30 * time.Second) + defer ticker.Stop() + for range ticker.C { + if vifId := vxc.ExtractAwsId(vxcDetails); vifId != "" { + err := d.Set("aws_id", vifId) + if err != nil { + return false, err + } + err = d.Set("connection_id", "") + if err != nil { + return false, err + } + break } - err = d.Set("aws_id", "") - if err != nil { - return false, err + select { + case <-ctx.Done(): + return false, ctx.Err() + default: + continue } - break } - select { - case <-ctx.Done(): - return false, ctx.Err() - default: - continue - } - } - return true, nil - }) + return true, nil + }) - if connectionIderr != nil { - return connectionIderr + if awsIdErr != nil { + return awsIdErr + } } - - } else { - - // Aws read - _, awsIdErr := doWaitFor(context.Background(), 5*time.Minute, func(ctx context.Context) (bool, error) { - ticker := time.NewTicker(30 * time.Second) - defer ticker.Stop() - for range ticker.C { - if vifId := vxc.ExtractAwsId(vxcDetails); vifId != "" { - err := d.Set("aws_id", vifId) - if err != nil { - return false, err + case types.CONNECT_TYPE_AWS_HOSTED_CONNECTION: + { + _, connectionIderr := doWaitFor(context.Background(), 5*time.Minute, func(ctx context.Context) (bool, error) { + ticker := time.NewTicker(30 * time.Second) + defer ticker.Stop() + for range ticker.C { + if connectionId := vxc.ExtractConnectionId(vxcDetails); connectionId != "" { + err := d.Set("connection_id", connectionId) + if err != nil { + return false, err + } + err = d.Set("aws_id", "") + if err != nil { + return false, err + } + break } - err = d.Set("connection_id", "") - if err != nil { - return false, err + select { + case <-ctx.Done(): + return false, ctx.Err() + default: + continue } - break - } - select { - case <-ctx.Done(): - return false, ctx.Err() - default: - continue } - } - return true, nil - }) + return true, nil + }) - if awsIdErr != nil { - return awsIdErr + if connectionIderr != nil { + return connectionIderr + } } - + default: + return fmt.Errorf("unknown connection type: %s", connectType) } // AWS CSP read