From 7eca29188e0d9e5d57c2004030a6b29b758ba6fc Mon Sep 17 00:00:00 2001 From: Marques Johansson Date: Mon, 26 Sep 2022 22:05:21 -0400 Subject: [PATCH 1/4] add module_name provider metadata Signed-off-by: Marques Johansson --- equinix/config.go | 11 ++++++----- equinix/data_source_metal_project_acc_test.go | 6 ++++++ equinix/provider.go | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/equinix/config.go b/equinix/config.go index 76c28c2d5..50b0c66ed 100644 --- a/equinix/config.go +++ b/equinix/config.go @@ -78,6 +78,7 @@ type Config struct { RequestTimeout time.Duration PageSize int Token string + UAPrefix string ecx ecx.Client ne ne.Client @@ -123,10 +124,10 @@ func (c *Config) Load(ctx context.Context) error { neClient.SetPageSize(c.PageSize) } ecxClient.SetHeaders(map[string]string{ - "User-agent": c.fullUserAgent("equinix/ecx-go"), + "User-agent": c.fullUserAgent(c.UAPrefix, "equinix/ecx-go"), }) neClient.SetHeaders(map[string]string{ - "User-agent": c.fullUserAgent("equinix/ne-go"), + "User-agent": c.fullUserAgent(c.UAPrefix, "equinix/ne-go"), }) c.ecx = ecxClient @@ -184,9 +185,9 @@ func terraformUserAgent(version string) string { return ua } -func (c *Config) fullUserAgent(suffix string) string { +func (c *Config) fullUserAgent(prefix, suffix string) string { tfUserAgent := terraformUserAgent(c.terraformVersion) - userAgent := fmt.Sprintf("%s terraform-provider-equinix/%s %s", tfUserAgent, version.ProviderVersion, suffix) + userAgent := fmt.Sprintf("%s %s terraform-provider-equinix/%s %s", prefix, tfUserAgent, version.ProviderVersion, suffix) return strings.TrimSpace(userAgent) } @@ -205,7 +206,7 @@ func (c *Config) NewMetalClient() *packngo.Client { baseURL, _ := url.Parse(c.BaseURL) baseURL.Path = path.Join(baseURL.Path, metalBasePath) + "/" client, _ := packngo.NewClientWithBaseURL(consumerToken, c.AuthToken, standardClient, baseURL.String()) - client.UserAgent = c.fullUserAgent(client.UserAgent) + client.UserAgent = c.fullUserAgent(c.UAPrefix, client.UserAgent) return client } diff --git a/equinix/data_source_metal_project_acc_test.go b/equinix/data_source_metal_project_acc_test.go index 9419860fe..47317b5b8 100644 --- a/equinix/data_source_metal_project_acc_test.go +++ b/equinix/data_source_metal_project_acc_test.go @@ -38,6 +38,12 @@ func TestAccDataSourceMetalProject_basic(t *testing.T) { func testAccDataSourceMetalProject_basic(r string) string { return fmt.Sprintf(` +terraform { + provider_meta "equinix" { + module_name = "test" + } +} + resource "equinix_metal_project" "foobar" { name = "tfacc-project-%s" bgp_config { diff --git a/equinix/provider.go b/equinix/provider.go index b9289a623..2dd52e0c4 100644 --- a/equinix/provider.go +++ b/equinix/provider.go @@ -162,6 +162,12 @@ func Provider() *schema.Provider { "equinix_metal_port_vlan_attachment": resourceMetalPortVlanAttachment(), "equinix_metal_gateway": resourceMetalGateway(), }, + ProviderMetaSchema: map[string]*schema.Schema{ + "module_name": { + Type: schema.TypeString, + Optional: true, + }, + }, } provider.ConfigureContextFunc = func(ctx context.Context, d *schema.ResourceData) (interface{}, diag.Diagnostics) { @@ -170,6 +176,10 @@ func Provider() *schema.Provider { return provider } +type providerMeta struct { + ModuleName string `cty:"module_name"` +} + func configureProvider(ctx context.Context, d *schema.ResourceData, p *schema.Provider) (interface{}, diag.Diagnostics) { mrws := d.Get("max_retry_wait_seconds").(int) rt := d.Get("request_timeout").(int) @@ -185,7 +195,12 @@ func configureProvider(ctx context.Context, d *schema.ResourceData, p *schema.Pr MaxRetries: d.Get("max_retries").(int), MaxRetryWait: time.Duration(mrws) * time.Second, } + meta := providerMeta{} + if err := d.GetProviderMeta(&meta); err != nil { + return nil, diag.FromErr(err) + } + config.UAPrefix = meta.ModuleName config.terraformVersion = p.TerraformVersion if config.terraformVersion == "" { // Terraform 0.12 introduced this field to the protocol From ff06f48a0f645db94da7ab385657f9adb584cb17 Mon Sep 17 00:00:00 2001 From: Oscar Cobles Date: Fri, 30 Sep 2022 01:17:42 +0200 Subject: [PATCH 2/4] added support module user agent for all metal resources --- equinix/config.go | 11 ++++---- equinix/helpers_device.go | 14 +++++++++- equinix/port_helpers.go | 6 +++++ equinix/provider.go | 16 +++++++++++- equinix/resource_metal_bgp_session.go | 19 ++++++++++++++ equinix/resource_metal_connection.go | 24 +++++++++++++++++ equinix/resource_metal_device.go | 24 +++++++++++++++++ equinix/resource_metal_device_network_type.go | 20 +++++++++++++- equinix/resource_metal_gateway.go | 18 +++++++++++++ equinix/resource_metal_ip_attachment.go | 18 +++++++++++++ equinix/resource_metal_organization.go | 26 ++++++++++++++++++- equinix/resource_metal_port.go | 6 +++++ .../resource_metal_port_vlan_attachment.go | 24 +++++++++++++++++ equinix/resource_metal_project.go | 24 +++++++++++++++++ equinix/resource_metal_project_api_key.go | 19 +++++++++++++- equinix/resource_metal_reserved_ip_block.go | 24 +++++++++++++++++ equinix/resource_metal_spot_market_request.go | 24 +++++++++++++++++ equinix/resource_metal_ssh_key.go | 26 ++++++++++++++++++- equinix/resource_metal_virtual_circuit.go | 26 ++++++++++++++++++- equinix/resource_metal_vlan.go | 18 +++++++++++++ equinix/resource_metal_vrf.go | 26 ++++++++++++++++++- 21 files changed, 399 insertions(+), 14 deletions(-) diff --git a/equinix/config.go b/equinix/config.go index 50b0c66ed..76c28c2d5 100644 --- a/equinix/config.go +++ b/equinix/config.go @@ -78,7 +78,6 @@ type Config struct { RequestTimeout time.Duration PageSize int Token string - UAPrefix string ecx ecx.Client ne ne.Client @@ -124,10 +123,10 @@ func (c *Config) Load(ctx context.Context) error { neClient.SetPageSize(c.PageSize) } ecxClient.SetHeaders(map[string]string{ - "User-agent": c.fullUserAgent(c.UAPrefix, "equinix/ecx-go"), + "User-agent": c.fullUserAgent("equinix/ecx-go"), }) neClient.SetHeaders(map[string]string{ - "User-agent": c.fullUserAgent(c.UAPrefix, "equinix/ne-go"), + "User-agent": c.fullUserAgent("equinix/ne-go"), }) c.ecx = ecxClient @@ -185,9 +184,9 @@ func terraformUserAgent(version string) string { return ua } -func (c *Config) fullUserAgent(prefix, suffix string) string { +func (c *Config) fullUserAgent(suffix string) string { tfUserAgent := terraformUserAgent(c.terraformVersion) - userAgent := fmt.Sprintf("%s %s terraform-provider-equinix/%s %s", prefix, tfUserAgent, version.ProviderVersion, suffix) + userAgent := fmt.Sprintf("%s terraform-provider-equinix/%s %s", tfUserAgent, version.ProviderVersion, suffix) return strings.TrimSpace(userAgent) } @@ -206,7 +205,7 @@ func (c *Config) NewMetalClient() *packngo.Client { baseURL, _ := url.Parse(c.BaseURL) baseURL.Path = path.Join(baseURL.Path, metalBasePath) + "/" client, _ := packngo.NewClientWithBaseURL(consumerToken, c.AuthToken, standardClient, baseURL.String()) - client.UserAgent = c.fullUserAgent(c.UAPrefix, client.UserAgent) + client.UserAgent = c.fullUserAgent(client.UserAgent) return client } diff --git a/equinix/helpers_device.go b/equinix/helpers_device.go index 7e5fc1999..0b3042d70 100644 --- a/equinix/helpers_device.go +++ b/equinix/helpers_device.go @@ -188,6 +188,12 @@ func waitForDeviceAttribute(d *schema.ResourceData, targets []string, pending [] Target: targets, Refresh: func() (interface{}, string, error) { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return "error", "error", err + } + client.UserAgent = userAgent device, _, err := client.Devices.Get(d.Id(), &packngo.GetOptions{Includes: []string{"project"}}) if err == nil { retAttrVal := device.State @@ -216,7 +222,13 @@ func waitForDeviceAttribute(d *schema.ResourceData, targets []string, pending [] // powerOnAndWait Powers on the device and waits for it to be active. func powerOnAndWait(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal - _, err := client.Devices.PowerOn(d.Id()) + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + _, err = client.Devices.PowerOn(d.Id()) if err != nil { return friendlyError(err) } diff --git a/equinix/port_helpers.go b/equinix/port_helpers.go index 159ab80d8..ae2e3f6c1 100644 --- a/equinix/port_helpers.go +++ b/equinix/port_helpers.go @@ -20,6 +20,12 @@ type ClientPortResource struct { func getClientPortResource(d *schema.ResourceData, meta interface{}) (*ClientPortResource, *packngo.Response, error) { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return nil, nil, err + } + client.UserAgent = userAgent + port_id := d.Get("port_id").(string) getOpts := &packngo.GetOptions{Includes: []string{ diff --git a/equinix/provider.go b/equinix/provider.go index 2dd52e0c4..de7d22d3d 100644 --- a/equinix/provider.go +++ b/equinix/provider.go @@ -200,7 +200,6 @@ func configureProvider(ctx context.Context, d *schema.ResourceData, p *schema.Pr if err := d.GetProviderMeta(&meta); err != nil { return nil, diag.FromErr(err) } - config.UAPrefix = meta.ModuleName config.terraformVersion = p.TerraformVersion if config.terraformVersion == "" { // Terraform 0.12 introduced this field to the protocol @@ -418,3 +417,18 @@ func schemaSetToMap(set *schema.Set) map[int]interface{} { } return transformed } + +func generateUserAgentString(d *schema.ResourceData, currentUserAgent string) (string, error) { + var m providerMeta + + err := d.GetProviderMeta(&m) + if err != nil { + return currentUserAgent, err + } + + if m.ModuleName != "" { + return strings.Join([]string{m.ModuleName, currentUserAgent}, " "), nil + } + + return currentUserAgent, nil +} \ No newline at end of file diff --git a/equinix/resource_metal_bgp_session.go b/equinix/resource_metal_bgp_session.go index 846cf48d0..2d7b7aa9d 100644 --- a/equinix/resource_metal_bgp_session.go +++ b/equinix/resource_metal_bgp_session.go @@ -50,6 +50,13 @@ func resourceMetalBGPSession() *schema.Resource { func resourceMetalBGPSessionCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + dID := d.Get("device_id").(string) addressFamily := d.Get("address_family").(string) defaultRoute := d.Get("default_route").(bool) @@ -69,6 +76,12 @@ func resourceMetalBGPSessionCreate(d *schema.ResourceData, meta interface{}) err func resourceMetalBGPSessionRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent bgpSession, _, err := client.BGPSessions.Get(d.Id(), &packngo.GetOptions{Includes: []string{"device"}}) if err != nil { @@ -97,6 +110,12 @@ func resourceMetalBGPSessionRead(d *schema.ResourceData, meta interface{}) error func resourceMetalBGPSessionDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent resp, err := client.BGPSessions.Delete(d.Id()) return ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) } diff --git a/equinix/resource_metal_connection.go b/equinix/resource_metal_connection.go index 7b0857256..a761e155a 100644 --- a/equinix/resource_metal_connection.go +++ b/equinix/resource_metal_connection.go @@ -188,6 +188,12 @@ func resourceMetalConnection() *schema.Resource { func resourceMetalConnectionCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + facility, facOk := d.GetOk("facility") metro, metOk := d.GetOk("metro") @@ -290,6 +296,12 @@ func resourceMetalConnectionCreate(d *schema.ResourceData, meta interface{}) err func resourceMetalConnectionUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + if d.HasChange("locked") { var action func(string) (*packngo.Response, error) if d.Get("locked").(bool) { @@ -343,6 +355,12 @@ func resourceMetalConnectionUpdate(d *schema.ResourceData, meta interface{}) err func resourceMetalConnectionRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent connId := d.Id() conn, _, err := client.Connections.Get( @@ -402,6 +420,12 @@ func resourceMetalConnectionRead(d *schema.ResourceData, meta interface{}) error func resourceMetalConnectionDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent resp, err := client.Connections.Delete(d.Id(), true) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { return friendlyError(err) diff --git a/equinix/resource_metal_device.go b/equinix/resource_metal_device.go index 0105e7c71..5e50bb60b 100644 --- a/equinix/resource_metal_device.go +++ b/equinix/resource_metal_device.go @@ -445,6 +445,12 @@ func shouldReinstall(_ context.Context, d *schema.ResourceDiff, meta interface{} func resourceMetalDeviceCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + var addressTypesSlice []packngo.IPAddressCreateRequest _, ok := d.GetOk("ip_address") if ok { @@ -579,6 +585,12 @@ func resourceMetalDeviceCreate(d *schema.ResourceData, meta interface{}) error { func resourceMetalDeviceRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + device, _, err := client.Devices.Get(d.Id(), deviceReadOptions) if err != nil { err = friendlyError(err) @@ -681,6 +693,12 @@ func resourceMetalDeviceRead(d *schema.ResourceData, meta interface{}) error { func resourceMetalDeviceUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + if d.HasChange("locked") { var action func(string) (*packngo.Response, error) if d.Get("locked").(bool) { @@ -783,6 +801,12 @@ func getReinstallOptions(d *schema.ResourceData) (packngo.DeviceReinstallFields, func resourceMetalDeviceDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + fdvIf, fdvOk := d.GetOk("force_detach_volumes") fdv := false if fdvOk && fdvIf.(bool) { diff --git a/equinix/resource_metal_device_network_type.go b/equinix/resource_metal_device_network_type.go index 5afe07cdf..d8a79609d 100644 --- a/equinix/resource_metal_device_network_type.go +++ b/equinix/resource_metal_device_network_type.go @@ -72,9 +72,15 @@ func getAndPossiblySetNetworkType(d *schema.ResourceData, c *packngo.Client, tar func resourceMetalDeviceNetworkTypeCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent ntype := d.Get("type").(string) - err := getAndPossiblySetNetworkType(d, client, ntype) + err = getAndPossiblySetNetworkType(d, client, ntype) if err != nil { return err } @@ -85,6 +91,12 @@ func resourceMetalDeviceNetworkTypeCreate(d *schema.ResourceData, meta interface func resourceMetalDeviceNetworkTypeRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + _, devNType, err := getDevIDandNetworkType(d, client) if err != nil { err = friendlyError(err) @@ -112,6 +124,12 @@ func resourceMetalDeviceNetworkTypeRead(d *schema.ResourceData, meta interface{} func resourceMetalDeviceNetworkTypeUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent ntype := d.Get("type").(string) if d.HasChange("type") { err := getAndPossiblySetNetworkType(d, client, ntype) diff --git a/equinix/resource_metal_gateway.go b/equinix/resource_metal_gateway.go index ef9e52b85..423256826 100644 --- a/equinix/resource_metal_gateway.go +++ b/equinix/resource_metal_gateway.go @@ -95,6 +95,12 @@ func resourceMetalGateway() *schema.Resource { func resourceMetalGatewayCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + _, hasIPReservation := d.GetOk("ip_reservation_id") _, hasSubnetSize := d.GetOk("private_ipv4_subnet_size") if !(hasIPReservation || hasSubnetSize) { @@ -120,6 +126,12 @@ func resourceMetalGatewayCreate(d *schema.ResourceData, meta interface{}) error func resourceMetalGatewayRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent mgId := d.Id() includes := &packngo.GetOptions{Includes: []string{"project", "ip_reservation", "virtual_network", "vrf"}} @@ -152,6 +164,12 @@ func resourceMetalGatewayRead(d *schema.ResourceData, meta interface{}) error { func resourceMetalGatewayDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent resp, err := client.MetalGateways.Delete(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { return friendlyError(err) diff --git a/equinix/resource_metal_ip_attachment.go b/equinix/resource_metal_ip_attachment.go index 09e92b4c0..21013199b 100644 --- a/equinix/resource_metal_ip_attachment.go +++ b/equinix/resource_metal_ip_attachment.go @@ -35,6 +35,12 @@ func resourceMetalIPAttachment() *schema.Resource { func resourceMetalIPAttachmentCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent deviceID := d.Get("device_id").(string) ipa := d.Get("cidr_notation").(string) @@ -52,6 +58,12 @@ func resourceMetalIPAttachmentCreate(d *schema.ResourceData, meta interface{}) e func resourceMetalIPAttachmentRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent assignment, _, err := client.DeviceIPs.Get(d.Id(), nil) if err != nil { err = friendlyError(err) @@ -88,6 +100,12 @@ func resourceMetalIPAttachmentRead(d *schema.ResourceData, meta interface{}) err func resourceMetalIPAttachmentDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + resp, err := client.DeviceIPs.Unassign(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { return friendlyError(err) diff --git a/equinix/resource_metal_organization.go b/equinix/resource_metal_organization.go index aa804953f..bdb3617e4 100644 --- a/equinix/resource_metal_organization.go +++ b/equinix/resource_metal_organization.go @@ -102,6 +102,12 @@ func createMetalOrganizationAddressResourceSchema() map[string]*schema.Schema { func resourceMetalOrganizationCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + createRequest := &packngo.OrganizationCreateRequest{ Name: d.Get("name").(string), Address: expandMetalOrganizationAddress(d.Get("address").([]interface{})), @@ -136,6 +142,12 @@ func resourceMetalOrganizationCreate(d *schema.ResourceData, meta interface{}) e func resourceMetalOrganizationRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + key, _, err := client.Organizations.Get(d.Id(), &packngo.GetOptions{Includes: []string{"address"}}) if err != nil { err = friendlyError(err) @@ -166,6 +178,12 @@ func resourceMetalOrganizationRead(d *schema.ResourceData, meta interface{}) err func resourceMetalOrganizationUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + changes := getResourceDataChangedKeys([]string{"name", "description", "website", "twitter", "logo", "address"}, d) updateRequest := &packngo.OrganizationUpdateRequest{} for change, changeValue := range changes { @@ -191,7 +209,7 @@ func resourceMetalOrganizationUpdate(d *schema.ResourceData, meta interface{}) e } } - _, _, err := client.Organizations.Update(d.Id(), updateRequest) + _, _, err = client.Organizations.Update(d.Id(), updateRequest) if err != nil { return friendlyError(err) } @@ -202,6 +220,12 @@ func resourceMetalOrganizationUpdate(d *schema.ResourceData, meta interface{}) e func resourceMetalOrganizationDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + resp, err := client.Organizations.Delete(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { return friendlyError(err) diff --git a/equinix/resource_metal_port.go b/equinix/resource_metal_port.go index 7158d8587..f9fa90756 100644 --- a/equinix/resource_metal_port.go +++ b/equinix/resource_metal_port.go @@ -141,6 +141,12 @@ func resourceMetalPortUpdate(d *schema.ResourceData, meta interface{}) error { func resourceMetalPortRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent port, err := getPortByResourceData(d, client) if err != nil { if isNotFound(err) || isForbidden(err) { diff --git a/equinix/resource_metal_port_vlan_attachment.go b/equinix/resource_metal_port_vlan_attachment.go index db5cfdab6..603d56546 100644 --- a/equinix/resource_metal_port_vlan_attachment.go +++ b/equinix/resource_metal_port_vlan_attachment.go @@ -66,6 +66,12 @@ func resourceMetalPortVlanAttachment() *schema.Resource { func resourceMetalPortVlanAttachmentCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent deviceID := d.Get("device_id").(string) pName := d.Get("port_name").(string) vlanVNID := d.Get("vlan_vnid").(int) @@ -158,6 +164,12 @@ func resourceMetalPortVlanAttachmentCreate(d *schema.ResourceData, meta interfac func resourceMetalPortVlanAttachmentRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent deviceID := d.Get("device_id").(string) pName := d.Get("port_name").(string) vlanVNID := d.Get("vlan_vnid").(int) @@ -211,6 +223,12 @@ func resourceMetalPortVlanAttachmentRead(d *schema.ResourceData, meta interface{ func resourceMetalPortVlanAttachmentUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent if d.HasChange("native") { native := d.Get("native").(bool) portID := d.Get("port_id").(string) @@ -233,6 +251,12 @@ func resourceMetalPortVlanAttachmentUpdate(d *schema.ResourceData, meta interfac func resourceMetalPortVlanAttachmentDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent pID := d.Get("port_id").(string) vlanID := d.Get("vlan_id").(string) native := d.Get("native").(bool) diff --git a/equinix/resource_metal_project.go b/equinix/resource_metal_project.go index e5a952846..f546e2c49 100644 --- a/equinix/resource_metal_project.go +++ b/equinix/resource_metal_project.go @@ -130,6 +130,12 @@ func expandBGPConfig(d *schema.ResourceData) packngo.CreateBGPConfigRequest { func resourceMetalProjectCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + createRequest := &packngo.ProjectCreateRequest{ Name: d.Get("name").(string), OrganizationID: d.Get("organization_id").(string), @@ -165,6 +171,12 @@ func resourceMetalProjectCreate(d *schema.ResourceData, meta interface{}) error func resourceMetalProjectRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + proj, _, err := client.Projects.Get(d.Id(), nil) if err != nil { err = friendlyError(err) @@ -236,6 +248,12 @@ func flattenBGPConfig(l *packngo.BGPConfig) []map[string]interface{} { func resourceMetalProjectUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent updateRequest := &packngo.ProjectUpdateRequest{} if d.HasChange("name") { pName := d.Get("name").(string) @@ -288,6 +306,12 @@ func resourceMetalProjectUpdate(d *schema.ResourceData, meta interface{}) error func resourceMetalProjectDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + resp, err := client.Projects.Delete(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { return friendlyError(err) diff --git a/equinix/resource_metal_project_api_key.go b/equinix/resource_metal_project_api_key.go index d073c1903..29b50f04e 100644 --- a/equinix/resource_metal_project_api_key.go +++ b/equinix/resource_metal_project_api_key.go @@ -49,6 +49,12 @@ func resourceMetalProjectAPIKey() *schema.Resource { func resourceMetalAPIKeyCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + projectId := "" projectIdRaw, projectIdOk := d.GetOk("project_id") @@ -83,10 +89,15 @@ func projectIdFromResourceData(d *schema.ResourceData) string { func resourceMetalAPIKeyRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + projectId := projectIdFromResourceData(d) var apiKey *packngo.APIKey - var err error // if project has been set in the resource, look up project API key // (this is the reason project API key can't be imported) @@ -133,6 +144,12 @@ func resourceMetalAPIKeyRead(d *schema.ResourceData, meta interface{}) error { func resourceMetalAPIKeyDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + resp, err := client.APIKeys.Delete(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { return friendlyError(err) diff --git a/equinix/resource_metal_reserved_ip_block.go b/equinix/resource_metal_reserved_ip_block.go index 3bdf268e1..9d5f9ab2a 100644 --- a/equinix/resource_metal_reserved_ip_block.go +++ b/equinix/resource_metal_reserved_ip_block.go @@ -232,6 +232,12 @@ func resourceMetalReservedIPBlock() *schema.Resource { func resourceMetalReservedIPBlockCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent quantity := d.Get("quantity").(int) typ := d.Get("type").(string) @@ -312,6 +318,12 @@ func resourceMetalReservedIPBlockCreate(d *schema.ResourceData, meta interface{} func resourceMetalReservedIPBlockUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent id := d.Id() req := &packngo.IPAddressUpdateRequest{} if d.HasChange("tags") { @@ -450,6 +462,12 @@ func loadBlock(d *schema.ResourceData, reservedBlock *packngo.IPAddressReservati func resourceMetalReservedIPBlockRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent id := d.Id() getOpts := &packngo.GetOptions{Includes: []string{"facility", "metro", "project", "vrf"}} @@ -481,6 +499,12 @@ func resourceMetalReservedIPBlockRead(d *schema.ResourceData, meta interface{}) func resourceMetalReservedIPBlockDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + id := d.Id() resp, err := client.ProjectIPs.Remove(id) diff --git a/equinix/resource_metal_spot_market_request.go b/equinix/resource_metal_spot_market_request.go index 6891a6e59..3e27b8d42 100644 --- a/equinix/resource_metal_spot_market_request.go +++ b/equinix/resource_metal_spot_market_request.go @@ -172,6 +172,12 @@ func resourceMetalSpotMarketRequest() *schema.Resource { func resourceMetalSpotMarketRequestCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent var waitForDevices bool metro := d.Get("metro").(string) @@ -314,6 +320,12 @@ func resourceMetalSpotMarketRequestCreate(d *schema.ResourceData, meta interface func resourceMetalSpotMarketRequestRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + smr, _, err := client.SpotMarketRequests.Get(d.Id(), &packngo.GetOptions{Includes: []string{"project", "devices", "facilities", "metro"}}) if err != nil { err = friendlyError(err) @@ -352,6 +364,12 @@ func resourceMetalSpotMarketRequestRead(d *schema.ResourceData, meta interface{} func resourceMetalSpotMarketRequestDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent var waitForDevices bool if val, ok := d.GetOk("wait_for_devices"); ok { @@ -417,6 +435,12 @@ func getInstanceParams(params *packngo.SpotMarketRequestInstanceParameters) Inst func resourceStateRefreshFunc(d *schema.ResourceData, meta interface{}) resource.StateRefreshFunc { return func() (interface{}, string, error) { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return nil, "", err + } + client.UserAgent = userAgent smr, _, err := client.SpotMarketRequests.Get(d.Id(), &packngo.GetOptions{Includes: []string{"project", "devices", "facilities", "metro"}}) if err != nil { return nil, "", fmt.Errorf("Failed to fetch Spot market request with following error: %s", err.Error()) diff --git a/equinix/resource_metal_ssh_key.go b/equinix/resource_metal_ssh_key.go index 083873072..d01ffb763 100644 --- a/equinix/resource_metal_ssh_key.go +++ b/equinix/resource_metal_ssh_key.go @@ -65,6 +65,12 @@ func resourceMetalSSHKey() *schema.Resource { func resourceMetalSSHKeyCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + createRequest := &packngo.SSHKeyCreateRequest{ Label: d.Get("name").(string), Key: d.Get("public_key").(string), @@ -88,6 +94,12 @@ func resourceMetalSSHKeyCreate(d *schema.ResourceData, meta interface{}) error { func resourceMetalSSHKeyRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + key, _, err := client.SSHKeys.Get(d.Id(), nil) if err != nil { err = friendlyError(err) @@ -123,6 +135,12 @@ func resourceMetalSSHKeyRead(d *schema.ResourceData, meta interface{}) error { func resourceMetalSSHKeyUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + updateRequest := &packngo.SSHKeyUpdateRequest{} if d.HasChange("name") { @@ -135,7 +153,7 @@ func resourceMetalSSHKeyUpdate(d *schema.ResourceData, meta interface{}) error { updateRequest.Key = &kKey } - _, _, err := client.SSHKeys.Update(d.Id(), updateRequest) + _, _, err = client.SSHKeys.Update(d.Id(), updateRequest) if err != nil { return friendlyError(err) } @@ -146,6 +164,12 @@ func resourceMetalSSHKeyUpdate(d *schema.ResourceData, meta interface{}) error { func resourceMetalSSHKeyDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + resp, err := client.SSHKeys.Delete(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { return friendlyError(err) diff --git a/equinix/resource_metal_virtual_circuit.go b/equinix/resource_metal_virtual_circuit.go index cdc7267d3..042910dcb 100644 --- a/equinix/resource_metal_virtual_circuit.go +++ b/equinix/resource_metal_virtual_circuit.go @@ -140,6 +140,12 @@ func resourceMetalVirtualCircuit() *schema.Resource { func resourceMetalVirtualCircuitCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent vncr := packngo.VCCreateRequest{ VirtualNetworkID: d.Get("vlan_id").(string), Name: d.Get("name").(string), @@ -199,6 +205,12 @@ func resourceMetalVirtualCircuitCreate(d *schema.ResourceData, meta interface{}) func resourceMetalVirtualCircuitRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent vcId := d.Id() vc, _, err := client.VirtualCircuits.Get( @@ -286,6 +298,12 @@ func getVCStateWaiter(client *packngo.Client, id string, timeout time.Duration, func resourceMetalVirtualCircuitUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + ur := packngo.VCUpdateRequest{} if d.HasChange("vnid") { vnid := d.Get("vnid").(string) @@ -332,9 +350,15 @@ func resourceMetalVirtualCircuitUpdate(d *schema.ResourceData, meta interface{}) func resourceMetalVirtualCircuitDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent // we first disconnect VLAN from the VC empty := "" - _, _, err := client.VirtualCircuits.Update( + _, _, err = client.VirtualCircuits.Update( d.Id(), &packngo.VCUpdateRequest{VirtualNetworkID: &empty}, nil, diff --git a/equinix/resource_metal_vlan.go b/equinix/resource_metal_vlan.go index aa10287d9..8c77e935e 100644 --- a/equinix/resource_metal_vlan.go +++ b/equinix/resource_metal_vlan.go @@ -76,6 +76,12 @@ func resourceMetalVlan() *schema.Resource { func resourceMetalVlanCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + facRaw, facOk := d.GetOk("facility") metroRaw, metroOk := d.GetOk("metro") vxlanRaw, vxlanOk := d.GetOk("vxlan") @@ -109,6 +115,12 @@ func resourceMetalVlanCreate(d *schema.ResourceData, meta interface{}) error { func resourceMetalVlanRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + vlan, _, err := client.ProjectVirtualNetworks.Get(d.Id(), &packngo.GetOptions{Includes: []string{"assigned_to"}}) if err != nil { @@ -130,6 +142,12 @@ func resourceMetalVlanRead(d *schema.ResourceData, meta interface{}) error { func resourceMetalVlanDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent id := d.Id() vlan, resp, err := client.ProjectVirtualNetworks.Get(id, &packngo.GetOptions{Includes: []string{"instances", "instances.network_ports.virtual_networks", "internet_gateway"}}) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { diff --git a/equinix/resource_metal_vrf.go b/equinix/resource_metal_vrf.go index 2d77f8b5c..8803c1d29 100644 --- a/equinix/resource_metal_vrf.go +++ b/equinix/resource_metal_vrf.go @@ -64,6 +64,12 @@ func resourceMetalVRF() *schema.Resource { func resourceMetalVRFCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + createRequest := &packngo.VRFCreateRequest{ Name: d.Get("name").(string), Description: d.Get("description").(string), @@ -86,6 +92,12 @@ func resourceMetalVRFCreate(d *schema.ResourceData, meta interface{}) error { func resourceMetalVRFUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + sPtr := func(s string) *string { return &s } iPtr := func(i int) *int { return &i } @@ -104,7 +116,7 @@ func resourceMetalVRFUpdate(d *schema.ResourceData, meta interface{}) error { updateRequest.IPRanges = &ipRanges } - _, _, err := client.VRFs.Update(d.Id(), updateRequest) + _, _, err = client.VRFs.Update(d.Id(), updateRequest) if err != nil { return friendlyError(err) } @@ -115,6 +127,12 @@ func resourceMetalVRFUpdate(d *schema.ResourceData, meta interface{}) error { func resourceMetalVRFRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + getOpts := &packngo.GetOptions{Includes: []string{"project", "metro"}} vrf, _, err := client.VRFs.Get(d.Id(), getOpts) @@ -142,6 +160,12 @@ func resourceMetalVRFRead(d *schema.ResourceData, meta interface{}) error { func resourceMetalVRFDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*Config).metal + userAgent, err := generateUserAgentString(d, client.UserAgent) + if err != nil { + return err + } + client.UserAgent = userAgent + resp, err := client.VRFs.Delete(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) == nil { d.SetId("") From 1ce10d71f0d494535ece12694a325a50e61d3e11 Mon Sep 17 00:00:00 2001 From: Oscar Cobles Date: Tue, 15 Nov 2022 23:11:15 +0100 Subject: [PATCH 3/4] fix duplicated module name in metal ua and added ecx and ne ua --- equinix/config.go | 96 +++++++++++++------ equinix/helpers_device.go | 14 +-- equinix/port_helpers.go | 7 +- equinix/provider.go | 15 --- equinix/resource_ecx_l2_connection.go | 60 ++++++------ equinix/resource_ecx_l2_serviceprofile.go | 20 ++-- equinix/resource_metal_bgp_session.go | 20 +--- equinix/resource_metal_connection.go | 28 +----- equinix/resource_metal_device.go | 28 +----- equinix/resource_metal_device_network_type.go | 23 +---- equinix/resource_metal_gateway.go | 22 +---- equinix/resource_metal_ip_attachment.go | 22 +---- equinix/resource_metal_organization.go | 30 +----- equinix/resource_metal_port.go | 6 +- .../resource_metal_port_vlan_attachment.go | 28 +----- equinix/resource_metal_project.go | 28 +----- equinix/resource_metal_project_api_key.go | 22 +---- equinix/resource_metal_reserved_ip_block.go | 27 +----- equinix/resource_metal_spot_market_request.go | 27 +----- equinix/resource_metal_ssh_key.go | 30 +----- equinix/resource_metal_virtual_circuit.go | 30 +----- equinix/resource_metal_vlan.go | 21 +--- equinix/resource_metal_vrf.go | 30 +----- equinix/resource_network_acl_template.go | 22 +++-- equinix/resource_network_bgp.go | 21 ++-- equinix/resource_network_device.go | 50 +++++----- equinix/resource_network_device_link.go | 28 +++--- equinix/resource_network_ssh_key.go | 15 +-- equinix/resource_network_ssh_user.go | 23 +++-- 29 files changed, 275 insertions(+), 518 deletions(-) diff --git a/equinix/config.go b/equinix/config.go index 76c28c2d5..9623f30ad 100644 --- a/equinix/config.go +++ b/equinix/config.go @@ -20,6 +20,7 @@ import ( "github.com/equinix/terraform-provider-equinix/version" "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" @@ -62,8 +63,9 @@ Original Error:` ) var ( - DefaultBaseURL = "https://api.equinix.com" - DefaultTimeout = 30 + DefaultBaseURL = "https://api.equinix.com" + DefaultTimeout = 30 + redirectsErrorRe = regexp.MustCompile(`stopped after \d+ redirects\z`) ) // Config is the configuration structure used to instantiate the Equinix @@ -83,6 +85,10 @@ type Config struct { ne ne.Client metal *packngo.Client + ecxUserAgent string + neUserAgent string + metalUserAgent string + terraformVersion string } @@ -122,11 +128,13 @@ func (c *Config) Load(ctx context.Context) error { ecxClient.SetPageSize(c.PageSize) neClient.SetPageSize(c.PageSize) } + c.ecxUserAgent = c.fullUserAgent("equinix/ecx-go") ecxClient.SetHeaders(map[string]string{ - "User-agent": c.fullUserAgent("equinix/ecx-go"), + "User-agent": c.ecxUserAgent, }) + c.neUserAgent = c.fullUserAgent("equinix/ecx-go") neClient.SetHeaders(map[string]string{ - "User-agent": c.fullUserAgent("equinix/ne-go"), + "User-agent": c.neUserAgent, }) c.ecx = ecxClient @@ -136,6 +144,26 @@ func (c *Config) Load(ctx context.Context) error { return nil } +// NewMetalClient returns a new client for accessing Equinix Metal's API. +func (c *Config) NewMetalClient() *packngo.Client { + transport := http.DefaultTransport + // transport = &DumpTransport{http.DefaultTransport} // Debug only + transport = logging.NewTransport("Equinix Metal", transport) + retryClient := retryablehttp.NewClient() + retryClient.HTTPClient.Transport = transport + retryClient.RetryMax = c.MaxRetries + retryClient.RetryWaitMin = time.Second + retryClient.RetryWaitMax = c.MaxRetryWait + retryClient.CheckRetry = MetalRetryPolicy + standardClient := retryClient.StandardClient() + baseURL, _ := url.Parse(c.BaseURL) + baseURL.Path = path.Join(baseURL.Path, metalBasePath) + "/" + client, _ := packngo.NewClientWithBaseURL(consumerToken, c.AuthToken, standardClient, baseURL.String()) + client.UserAgent = c.fullUserAgent(client.UserAgent) + c.metalUserAgent = client.UserAgent + return client +} + func (c *Config) requestTimeout() time.Duration { if c.RequestTimeout == 0 { return 5 * time.Second @@ -143,8 +171,6 @@ func (c *Config) requestTimeout() time.Duration { return c.RequestTimeout } -var redirectsErrorRe = regexp.MustCompile(`stopped after \d+ redirects\z`) - func MetalRetryPolicy(ctx context.Context, resp *http.Response, err error) (bool, error) { if ctx.Err() != nil { return false, ctx.Err() @@ -162,7 +188,6 @@ func MetalRetryPolicy(ctx context.Context, resp *http.Response, err error) (bool return false, nil } } - // The error is likely recoverable so retry. return true, nil } @@ -184,28 +209,45 @@ func terraformUserAgent(version string) string { return ua } +func (c *Config) addModuleToECXUserAgent(client *ecx.Client, d *schema.ResourceData) { + cli := *client + rc := cli.(*ecx.RestClient) + rc.SetHeader("User-agent", generateModuleUserAgentString(d, c.ecxUserAgent)) + *client = rc +} + +func (c *Config) addModuleToNEUserAgent(client *ne.Client, d *schema.ResourceData) { + cli := *client + rc := cli.(*ne.RestClient) + rc.SetHeader("User-agent", generateModuleUserAgentString(d, c.neUserAgent)) + *client = rc +} + +// TODO (ocobleseqx) - known issue, Metal services are initialized using the metal client pointer +// if two or more modules in same project interact with metal resources they will override +// the UserAgent resulting in swapped UserAgent. +// This can be fixed by letting the headers be overwritten on the initialized Packngo ServiceOp +// clients on a query-by-query basis. +func (c *Config) addModuleToMetalUserAgent(d *schema.ResourceData) { + c.metal.UserAgent = generateModuleUserAgentString(d, c.metalUserAgent) +} + +func generateModuleUserAgentString(d *schema.ResourceData, baseUserAgent string) string { + var m providerMeta + err := d.GetProviderMeta(&m) + if err != nil { + log.Printf("[WARN] error retrieving provider_meta") + return baseUserAgent + } + + if m.ModuleName != "" { + return strings.Join([]string{m.ModuleName, baseUserAgent}, " ") + } + return baseUserAgent +} + func (c *Config) fullUserAgent(suffix string) string { tfUserAgent := terraformUserAgent(c.terraformVersion) userAgent := fmt.Sprintf("%s terraform-provider-equinix/%s %s", tfUserAgent, version.ProviderVersion, suffix) return strings.TrimSpace(userAgent) } - -// NewMetalClient returns a new client for accessing Equinix Metal's API. -func (c *Config) NewMetalClient() *packngo.Client { - transport := http.DefaultTransport - // transport = &DumpTransport{http.DefaultTransport} // Debug only - transport = logging.NewTransport("Equinix Metal", transport) - retryClient := retryablehttp.NewClient() - retryClient.HTTPClient.Transport = transport - retryClient.RetryMax = c.MaxRetries - retryClient.RetryWaitMin = time.Second - retryClient.RetryWaitMax = c.MaxRetryWait - retryClient.CheckRetry = MetalRetryPolicy - standardClient := retryClient.StandardClient() - baseURL, _ := url.Parse(c.BaseURL) - baseURL.Path = path.Join(baseURL.Path, metalBasePath) + "/" - client, _ := packngo.NewClientWithBaseURL(consumerToken, c.AuthToken, standardClient, baseURL.String()) - client.UserAgent = c.fullUserAgent(client.UserAgent) - - return client -} diff --git a/equinix/helpers_device.go b/equinix/helpers_device.go index 0b3042d70..cd88131c9 100644 --- a/equinix/helpers_device.go +++ b/equinix/helpers_device.go @@ -188,12 +188,8 @@ func waitForDeviceAttribute(d *schema.ResourceData, targets []string, pending [] Target: targets, Refresh: func() (interface{}, string, error) { client := meta.(*Config).metal + client.UserAgent = generateModuleUserAgentString(d, client.UserAgent) - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return "error", "error", err - } - client.UserAgent = userAgent device, _, err := client.Devices.Get(d.Id(), &packngo.GetOptions{Includes: []string{"project"}}) if err == nil { retAttrVal := device.State @@ -221,14 +217,10 @@ func waitForDeviceAttribute(d *schema.ResourceData, targets []string, pending [] // powerOnAndWait Powers on the device and waits for it to be active. func powerOnAndWait(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - _, err = client.Devices.PowerOn(d.Id()) + _, err := client.Devices.PowerOn(d.Id()) if err != nil { return friendlyError(err) } diff --git a/equinix/port_helpers.go b/equinix/port_helpers.go index ae2e3f6c1..df3b04ad7 100644 --- a/equinix/port_helpers.go +++ b/equinix/port_helpers.go @@ -18,14 +18,9 @@ type ClientPortResource struct { } func getClientPortResource(d *schema.ResourceData, meta interface{}) (*ClientPortResource, *packngo.Response, error) { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return nil, nil, err - } - client.UserAgent = userAgent - port_id := d.Get("port_id").(string) getOpts := &packngo.GetOptions{Includes: []string{ diff --git a/equinix/provider.go b/equinix/provider.go index de7d22d3d..ada8d2dd2 100644 --- a/equinix/provider.go +++ b/equinix/provider.go @@ -417,18 +417,3 @@ func schemaSetToMap(set *schema.Set) map[int]interface{} { } return transformed } - -func generateUserAgentString(d *schema.ResourceData, currentUserAgent string) (string, error) { - var m providerMeta - - err := d.GetProviderMeta(&m) - if err != nil { - return currentUserAgent, err - } - - if m.ModuleName != "" { - return strings.Join([]string{m.ModuleName, currentUserAgent}, " "), nil - } - - return currentUserAgent, nil -} \ No newline at end of file diff --git a/equinix/resource_ecx_l2_connection.go b/equinix/resource_ecx_l2_connection.go index 23dba1dae..0f6c6f3af 100644 --- a/equinix/resource_ecx_l2_connection.go +++ b/equinix/resource_ecx_l2_connection.go @@ -166,10 +166,10 @@ func createECXL2ConnectionResourceSchema() map[string]*schema.Schema { Description: ecxL2ConnectionDescriptions["Name"], }, ecxL2ConnectionSchemaNames["ProfileUUID"]: { - Type: schema.TypeString, - Optional: true, - Computed: true, - ForceNew: true, + Type: schema.TypeString, + Optional: true, + Computed: true, + ForceNew: true, AtLeastOneOf: []string{ ecxL2ConnectionSchemaNames["ProfileUUID"], ecxL2ConnectionSchemaNames["ZSidePortUUID"], @@ -374,10 +374,10 @@ func createECXL2ConnectionResourceSchema() map[string]*schema.Schema { Description: ecxL2ConnectionDescriptions["ServiceToken"], }, ecxL2ConnectionSchemaNames["ZSideServiceToken"]: { - Type: schema.TypeString, - Optional: true, - ForceNew: true, - ValidateFunc: validation.StringIsNotEmpty, + Type: schema.TypeString, + Optional: true, + ForceNew: true, + ValidateFunc: validation.StringIsNotEmpty, ConflictsWith: []string{ ecxL2ConnectionSchemaNames["ServiceToken"], ecxL2ConnectionSchemaNames["ProfileUUID"], @@ -385,7 +385,7 @@ func createECXL2ConnectionResourceSchema() map[string]*schema.Schema { ecxL2ConnectionSchemaNames["AuthorizationKey"], ecxL2ConnectionSchemaNames["SecondaryConnection"], }, - Description: ecxL2ConnectionDescriptions["ZSideServiceToken"], + Description: ecxL2ConnectionDescriptions["ZSideServiceToken"], }, ecxL2ConnectionSchemaNames["VendorToken"]: { Type: schema.TypeString, @@ -658,27 +658,29 @@ func createECXL2ConnectionActionsRequiredDataSchema() map[string]*schema.Schema } func resourceECXL2ConnectionCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ecx + m.(*Config).addModuleToECXUserAgent(&client, d) + var diags diag.Diagnostics primary, secondary := createECXL2Connections(d) var primaryID, secondaryID *string var err error if secondary != nil { - primaryID, secondaryID, err = conf.ecx.CreateL2RedundantConnection(*primary, *secondary) + primaryID, secondaryID, err = client.CreateL2RedundantConnection(*primary, *secondary) } else { - primaryID, err = conf.ecx.CreateL2Connection(*primary) + primaryID, err = client.CreateL2Connection(*primary) } if err != nil { return diag.FromErr(err) } d.SetId(ecx.StringValue(primaryID)) waitConfigs := []*resource.StateChangeConf{ - createConnectionStatusProvisioningWaitConfiguration(conf.ecx.GetL2Connection, d.Id(), 5*time.Second, d.Timeout(schema.TimeoutCreate)), + createConnectionStatusProvisioningWaitConfiguration(client.GetL2Connection, d.Id(), 5*time.Second, d.Timeout(schema.TimeoutCreate)), } if ecx.StringValue(secondaryID) != "" { d.Set(ecxL2ConnectionSchemaNames["RedundantUUID"], secondaryID) waitConfigs = append(waitConfigs, - createConnectionStatusProvisioningWaitConfiguration(conf.ecx.GetL2Connection, ecx.StringValue(secondaryID), 2*time.Second, d.Timeout(schema.TimeoutCreate)), + createConnectionStatusProvisioningWaitConfiguration(client.GetL2Connection, ecx.StringValue(secondaryID), 2*time.Second, d.Timeout(schema.TimeoutCreate)), ) } for _, config := range waitConfigs { @@ -694,13 +696,14 @@ func resourceECXL2ConnectionCreate(ctx context.Context, d *schema.ResourceData, } func resourceECXL2ConnectionRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ecx + m.(*Config).addModuleToECXUserAgent(&client, d) var diags diag.Diagnostics var err error var primary *ecx.L2Connection var secondary *ecx.L2Connection - primary, err = conf.ecx.GetL2Connection(d.Id()) + primary, err = client.GetL2Connection(d.Id()) if err != nil { return diag.Errorf("cannot fetch primary connection due to %v", err) } @@ -718,7 +721,7 @@ func resourceECXL2ConnectionRead(ctx context.Context, d *schema.ResourceData, m // Implementing a l2_connection datasource will require search for secondary connection before using // resourceECXL2ConnectionRead or explicitly request the names or identifiers of each connection if redID, ok := d.GetOk(ecxL2ConnectionSchemaNames["RedundantUUID"]); ok { - secondary, err = conf.ecx.GetL2Connection(redID.(string)) + secondary, err = client.GetL2Connection(redID.(string)) if err != nil { return diag.Errorf("cannot fetch secondary connection due to %v", err) } @@ -738,7 +741,8 @@ func resourceECXL2ConnectionRead(ctx context.Context, d *schema.ResourceData, m } func resourceECXL2ConnectionUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ecx + m.(*Config).addModuleToECXUserAgent(&client, d) var diags diag.Diagnostics supportedChanges := []string{ ecxL2ConnectionSchemaNames["Name"], @@ -746,13 +750,13 @@ func resourceECXL2ConnectionUpdate(ctx context.Context, d *schema.ResourceData, ecxL2ConnectionSchemaNames["SpeedUnit"], } primaryChanges := getResourceDataChangedKeys(supportedChanges, d) - primaryUpdateReq := conf.ecx.NewL2ConnectionUpdateRequest(d.Id()) + primaryUpdateReq := client.NewL2ConnectionUpdateRequest(d.Id()) if err := fillFabricL2ConnectionUpdateRequest(primaryUpdateReq, primaryChanges).Execute(); err != nil { return diag.FromErr(err) } if redID, ok := d.GetOk(ecxL2ConnectionSchemaNames["RedundantUUID"]); ok { secondaryChanges := getResourceDataListElementChanges(supportedChanges, ecxL2ConnectionSchemaNames["SecondaryConnection"], 0, d) - secondaryUpdateReq := conf.ecx.NewL2ConnectionUpdateRequest(redID.(string)) + secondaryUpdateReq := client.NewL2ConnectionUpdateRequest(redID.(string)) if err := fillFabricL2ConnectionUpdateRequest(secondaryUpdateReq, secondaryChanges).Execute(); err != nil { return diag.FromErr(err) } @@ -762,9 +766,11 @@ func resourceECXL2ConnectionUpdate(ctx context.Context, d *schema.ResourceData, } func resourceECXL2ConnectionDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ecx + m.(*Config).addModuleToECXUserAgent(&client, d) + var diags diag.Diagnostics - if err := conf.ecx.DeleteL2Connection(d.Id()); err != nil { + if err := client.DeleteL2Connection(d.Id()); err != nil { restErr, ok := err.(rest.Error) if ok { // IC-LAYER2-4021 = Connection already deleted @@ -775,10 +781,10 @@ func resourceECXL2ConnectionDelete(ctx context.Context, d *schema.ResourceData, return diag.FromErr(err) } waitConfigs := []*resource.StateChangeConf{ - createConnectionStatusDeleteWaitConfiguration(conf.ecx.GetL2Connection, d.Id(), 5*time.Second, d.Timeout(schema.TimeoutDelete)), + createConnectionStatusDeleteWaitConfiguration(client.GetL2Connection, d.Id(), 5*time.Second, d.Timeout(schema.TimeoutDelete)), } if redID, ok := d.GetOk(ecxL2ConnectionSchemaNames["RedundantUUID"]); ok { - if err := conf.ecx.DeleteL2Connection(redID.(string)); err != nil { + if err := client.DeleteL2Connection(redID.(string)); err != nil { restErr, ok := err.(rest.Error) if ok { // IC-LAYER2-4021 = Connection already deleted @@ -789,7 +795,7 @@ func resourceECXL2ConnectionDelete(ctx context.Context, d *schema.ResourceData, return diag.FromErr(err) } waitConfigs = append(waitConfigs, - createConnectionStatusDeleteWaitConfiguration(conf.ecx.GetL2Connection, redID.(string), 2*time.Second, d.Timeout(schema.TimeoutDelete)), + createConnectionStatusDeleteWaitConfiguration(client.GetL2Connection, redID.(string), 2*time.Second, d.Timeout(schema.TimeoutDelete)), ) } for _, config := range waitConfigs { @@ -946,14 +952,14 @@ func updateECXL2ConnectionResource(primary *ecx.L2Connection, secondary *ecx.L2C return fmt.Errorf("error reading VendorToken: %s", err) } if v, ok := d.GetOk(ecxL2ConnectionSchemaNames["ServiceToken"]); ok { - if ecx.StringValue(primary.VendorToken) != v.(string){ + if ecx.StringValue(primary.VendorToken) != v.(string) { if err := d.Set(ecxL2ConnectionSchemaNames["ServiceToken"], primary.VendorToken); err != nil { return fmt.Errorf("error reading ServiceToken: %s", err) } } } if v, ok := d.GetOk(ecxL2ConnectionSchemaNames["ZSideServiceToken"]); ok { - if ecx.StringValue(primary.VendorToken) != v.(string){ + if ecx.StringValue(primary.VendorToken) != v.(string) { if err := d.Set(ecxL2ConnectionSchemaNames["ZSideServiceToken"], primary.VendorToken); err != nil { return fmt.Errorf("error reading ZSideServiceToken: %s", err) } diff --git a/equinix/resource_ecx_l2_serviceprofile.go b/equinix/resource_ecx_l2_serviceprofile.go index 8da982ea0..ae8465b26 100644 --- a/equinix/resource_ecx_l2_serviceprofile.go +++ b/equinix/resource_ecx_l2_serviceprofile.go @@ -341,10 +341,11 @@ func createECXL2ServiceProfileResourceSchema() map[string]*schema.Schema { } func resourceECXL2ServiceProfileCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ecx + m.(*Config).addModuleToECXUserAgent(&client, d) var diags diag.Diagnostics profile := createECXL2ServiceProfile(d) - uuid, err := conf.ecx.CreateL2ServiceProfile(*profile) + uuid, err := client.CreateL2ServiceProfile(*profile) if err != nil { return diag.FromErr(err) } @@ -354,9 +355,10 @@ func resourceECXL2ServiceProfileCreate(ctx context.Context, d *schema.ResourceDa } func resourceECXL2ServiceProfileRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ecx + m.(*Config).addModuleToECXUserAgent(&client, d) var diags diag.Diagnostics - profile, err := conf.ecx.GetL2ServiceProfile(d.Id()) + profile, err := client.GetL2ServiceProfile(d.Id()) if err != nil { return diag.FromErr(err) } @@ -367,10 +369,11 @@ func resourceECXL2ServiceProfileRead(ctx context.Context, d *schema.ResourceData } func resourceECXL2ServiceProfileUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ecx + m.(*Config).addModuleToECXUserAgent(&client, d) var diags diag.Diagnostics profile := createECXL2ServiceProfile(d) - if err := conf.ecx.UpdateL2ServiceProfile(*profile); err != nil { + if err := client.UpdateL2ServiceProfile(*profile); err != nil { return diag.FromErr(err) } diags = append(diags, resourceECXL2ServiceProfileRead(ctx, d, m)...) @@ -378,9 +381,10 @@ func resourceECXL2ServiceProfileUpdate(ctx context.Context, d *schema.ResourceDa } func resourceECXL2ServiceProfileDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ecx + m.(*Config).addModuleToECXUserAgent(&client, d) var diags diag.Diagnostics - if err := conf.ecx.DeleteL2ServiceProfile(d.Id()); err != nil { + if err := client.DeleteL2ServiceProfile(d.Id()); err != nil { restErr, ok := err.(rest.Error) if ok { // IC-PROFILE-004 = profile does not exist diff --git a/equinix/resource_metal_bgp_session.go b/equinix/resource_metal_bgp_session.go index 2d7b7aa9d..122e8f9a8 100644 --- a/equinix/resource_metal_bgp_session.go +++ b/equinix/resource_metal_bgp_session.go @@ -49,14 +49,9 @@ func resourceMetalBGPSession() *schema.Resource { } func resourceMetalBGPSessionCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - dID := d.Get("device_id").(string) addressFamily := d.Get("address_family").(string) defaultRoute := d.Get("default_route").(bool) @@ -75,13 +70,9 @@ func resourceMetalBGPSessionCreate(d *schema.ResourceData, meta interface{}) err } func resourceMetalBGPSessionRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent bgpSession, _, err := client.BGPSessions.Get(d.Id(), &packngo.GetOptions{Includes: []string{"device"}}) if err != nil { @@ -109,13 +100,8 @@ func resourceMetalBGPSessionRead(d *schema.ResourceData, meta interface{}) error } func resourceMetalBGPSessionDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent resp, err := client.BGPSessions.Delete(d.Id()) return ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) } diff --git a/equinix/resource_metal_connection.go b/equinix/resource_metal_connection.go index a761e155a..26fe481bf 100644 --- a/equinix/resource_metal_connection.go +++ b/equinix/resource_metal_connection.go @@ -186,14 +186,9 @@ func resourceMetalConnection() *schema.Resource { } func resourceMetalConnectionCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - facility, facOk := d.GetOk("facility") metro, metOk := d.GetOk("metro") @@ -294,14 +289,9 @@ func resourceMetalConnectionCreate(d *schema.ResourceData, meta interface{}) err } func resourceMetalConnectionUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - if d.HasChange("locked") { var action func(string) (*packngo.Response, error) if d.Get("locked").(bool) { @@ -354,15 +344,10 @@ func resourceMetalConnectionUpdate(d *schema.ResourceData, meta interface{}) err } func resourceMetalConnectionRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent connId := d.Id() - conn, _, err := client.Connections.Get( connId, &packngo.GetOptions{Includes: []string{"service_tokens", "organization", "facility", "metro", "project"}}) @@ -419,13 +404,8 @@ func resourceMetalConnectionRead(d *schema.ResourceData, meta interface{}) error } func resourceMetalConnectionDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent resp, err := client.Connections.Delete(d.Id(), true) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { return friendlyError(err) diff --git a/equinix/resource_metal_device.go b/equinix/resource_metal_device.go index 5e50bb60b..3656a7ed2 100644 --- a/equinix/resource_metal_device.go +++ b/equinix/resource_metal_device.go @@ -443,14 +443,9 @@ func shouldReinstall(_ context.Context, d *schema.ResourceDiff, meta interface{} } func resourceMetalDeviceCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - var addressTypesSlice []packngo.IPAddressCreateRequest _, ok := d.GetOk("ip_address") if ok { @@ -583,14 +578,9 @@ func resourceMetalDeviceCreate(d *schema.ResourceData, meta interface{}) error { } func resourceMetalDeviceRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - device, _, err := client.Devices.Get(d.Id(), deviceReadOptions) if err != nil { err = friendlyError(err) @@ -691,14 +681,9 @@ func resourceMetalDeviceRead(d *schema.ResourceData, meta interface{}) error { } func resourceMetalDeviceUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - if d.HasChange("locked") { var action func(string) (*packngo.Response, error) if d.Get("locked").(bool) { @@ -799,14 +784,9 @@ func getReinstallOptions(d *schema.ResourceData) (packngo.DeviceReinstallFields, } func resourceMetalDeviceDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - fdvIf, fdvOk := d.GetOk("force_detach_volumes") fdv := false if fdvOk && fdvIf.(bool) { diff --git a/equinix/resource_metal_device_network_type.go b/equinix/resource_metal_device_network_type.go index d8a79609d..022252151 100644 --- a/equinix/resource_metal_device_network_type.go +++ b/equinix/resource_metal_device_network_type.go @@ -71,16 +71,11 @@ func getAndPossiblySetNetworkType(d *schema.ResourceData, c *packngo.Client, tar } func resourceMetalDeviceNetworkTypeCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent ntype := d.Get("type").(string) - - err = getAndPossiblySetNetworkType(d, client, ntype) + err := getAndPossiblySetNetworkType(d, client, ntype) if err != nil { return err } @@ -89,14 +84,9 @@ func resourceMetalDeviceNetworkTypeCreate(d *schema.ResourceData, meta interface } func resourceMetalDeviceNetworkTypeRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - _, devNType, err := getDevIDandNetworkType(d, client) if err != nil { err = friendlyError(err) @@ -123,13 +113,9 @@ func resourceMetalDeviceNetworkTypeRead(d *schema.ResourceData, meta interface{} } func resourceMetalDeviceNetworkTypeUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent ntype := d.Get("type").(string) if d.HasChange("type") { err := getAndPossiblySetNetworkType(d, client, ntype) @@ -137,7 +123,6 @@ func resourceMetalDeviceNetworkTypeUpdate(d *schema.ResourceData, meta interface return err } } - return resourceMetalDeviceNetworkTypeRead(d, meta) } diff --git a/equinix/resource_metal_gateway.go b/equinix/resource_metal_gateway.go index 423256826..3f2ccb349 100644 --- a/equinix/resource_metal_gateway.go +++ b/equinix/resource_metal_gateway.go @@ -93,14 +93,9 @@ func resourceMetalGateway() *schema.Resource { } func resourceMetalGatewayCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - _, hasIPReservation := d.GetOk("ip_reservation_id") _, hasSubnetSize := d.GetOk("private_ipv4_subnet_size") if !(hasIPReservation || hasSubnetSize) { @@ -125,17 +120,11 @@ func resourceMetalGatewayCreate(d *schema.ResourceData, meta interface{}) error } func resourceMetalGatewayRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent mgId := d.Id() - includes := &packngo.GetOptions{Includes: []string{"project", "ip_reservation", "virtual_network", "vrf"}} - mg, _, err := client.MetalGateways.Get(mgId, includes) if err != nil { return err @@ -163,13 +152,8 @@ func resourceMetalGatewayRead(d *schema.ResourceData, meta interface{}) error { } func resourceMetalGatewayDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent resp, err := client.MetalGateways.Delete(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { return friendlyError(err) diff --git a/equinix/resource_metal_ip_attachment.go b/equinix/resource_metal_ip_attachment.go index 21013199b..0da861885 100644 --- a/equinix/resource_metal_ip_attachment.go +++ b/equinix/resource_metal_ip_attachment.go @@ -34,18 +34,12 @@ func resourceMetalIPAttachment() *schema.Resource { } func resourceMetalIPAttachmentCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent deviceID := d.Get("device_id").(string) ipa := d.Get("cidr_notation").(string) - req := packngo.AddressStruct{Address: ipa} - assignment, _, err := client.DeviceIPs.Assign(deviceID, &req) if err != nil { return fmt.Errorf("error assigning address %s to device %s: %s", ipa, deviceID, err) @@ -57,13 +51,8 @@ func resourceMetalIPAttachmentCreate(d *schema.ResourceData, meta interface{}) e } func resourceMetalIPAttachmentRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent assignment, _, err := client.DeviceIPs.Get(d.Id(), nil) if err != nil { err = friendlyError(err) @@ -98,14 +87,9 @@ func resourceMetalIPAttachmentRead(d *schema.ResourceData, meta interface{}) err } func resourceMetalIPAttachmentDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - resp, err := client.DeviceIPs.Unassign(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { return friendlyError(err) diff --git a/equinix/resource_metal_organization.go b/equinix/resource_metal_organization.go index bdb3617e4..24030a89a 100644 --- a/equinix/resource_metal_organization.go +++ b/equinix/resource_metal_organization.go @@ -100,14 +100,9 @@ func createMetalOrganizationAddressResourceSchema() map[string]*schema.Schema { } func resourceMetalOrganizationCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - createRequest := &packngo.OrganizationCreateRequest{ Name: d.Get("name").(string), Address: expandMetalOrganizationAddress(d.Get("address").([]interface{})), @@ -140,14 +135,9 @@ func resourceMetalOrganizationCreate(d *schema.ResourceData, meta interface{}) e } func resourceMetalOrganizationRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - key, _, err := client.Organizations.Get(d.Id(), &packngo.GetOptions{Includes: []string{"address"}}) if err != nil { err = friendlyError(err) @@ -176,14 +166,9 @@ func resourceMetalOrganizationRead(d *schema.ResourceData, meta interface{}) err } func resourceMetalOrganizationUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - changes := getResourceDataChangedKeys([]string{"name", "description", "website", "twitter", "logo", "address"}, d) updateRequest := &packngo.OrganizationUpdateRequest{} for change, changeValue := range changes { @@ -209,7 +194,7 @@ func resourceMetalOrganizationUpdate(d *schema.ResourceData, meta interface{}) e } } - _, _, err = client.Organizations.Update(d.Id(), updateRequest) + _, _, err := client.Organizations.Update(d.Id(), updateRequest) if err != nil { return friendlyError(err) } @@ -218,14 +203,9 @@ func resourceMetalOrganizationUpdate(d *schema.ResourceData, meta interface{}) e } func resourceMetalOrganizationDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - resp, err := client.Organizations.Delete(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { return friendlyError(err) diff --git a/equinix/resource_metal_port.go b/equinix/resource_metal_port.go index f9fa90756..c0d5c9a7d 100644 --- a/equinix/resource_metal_port.go +++ b/equinix/resource_metal_port.go @@ -140,13 +140,9 @@ func resourceMetalPortUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceMetalPortRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent port, err := getPortByResourceData(d, client) if err != nil { if isNotFound(err) || isForbidden(err) { diff --git a/equinix/resource_metal_port_vlan_attachment.go b/equinix/resource_metal_port_vlan_attachment.go index 603d56546..d537c0d7e 100644 --- a/equinix/resource_metal_port_vlan_attachment.go +++ b/equinix/resource_metal_port_vlan_attachment.go @@ -65,13 +65,8 @@ func resourceMetalPortVlanAttachment() *schema.Resource { } func resourceMetalPortVlanAttachmentCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent deviceID := d.Get("device_id").(string) pName := d.Get("port_name").(string) vlanVNID := d.Get("vlan_vnid").(int) @@ -163,13 +158,8 @@ func resourceMetalPortVlanAttachmentCreate(d *schema.ResourceData, meta interfac } func resourceMetalPortVlanAttachmentRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent deviceID := d.Get("device_id").(string) pName := d.Get("port_name").(string) vlanVNID := d.Get("vlan_vnid").(int) @@ -222,13 +212,8 @@ func resourceMetalPortVlanAttachmentRead(d *schema.ResourceData, meta interface{ } func resourceMetalPortVlanAttachmentUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent if d.HasChange("native") { native := d.Get("native").(bool) portID := d.Get("port_id").(string) @@ -250,13 +235,8 @@ func resourceMetalPortVlanAttachmentUpdate(d *schema.ResourceData, meta interfac } func resourceMetalPortVlanAttachmentDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent pID := d.Get("port_id").(string) vlanID := d.Get("vlan_id").(string) native := d.Get("native").(bool) diff --git a/equinix/resource_metal_project.go b/equinix/resource_metal_project.go index f546e2c49..c802174ae 100644 --- a/equinix/resource_metal_project.go +++ b/equinix/resource_metal_project.go @@ -128,14 +128,9 @@ func expandBGPConfig(d *schema.ResourceData) packngo.CreateBGPConfigRequest { } func resourceMetalProjectCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - createRequest := &packngo.ProjectCreateRequest{ Name: d.Get("name").(string), OrganizationID: d.Get("organization_id").(string), @@ -169,14 +164,9 @@ func resourceMetalProjectCreate(d *schema.ResourceData, meta interface{}) error } func resourceMetalProjectRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - proj, _, err := client.Projects.Get(d.Id(), nil) if err != nil { err = friendlyError(err) @@ -247,13 +237,8 @@ func flattenBGPConfig(l *packngo.BGPConfig) []map[string]interface{} { } func resourceMetalProjectUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent updateRequest := &packngo.ProjectUpdateRequest{} if d.HasChange("name") { pName := d.Get("name").(string) @@ -304,14 +289,9 @@ func resourceMetalProjectUpdate(d *schema.ResourceData, meta interface{}) error } func resourceMetalProjectDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - resp, err := client.Projects.Delete(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { return friendlyError(err) diff --git a/equinix/resource_metal_project_api_key.go b/equinix/resource_metal_project_api_key.go index 29b50f04e..bedc97452 100644 --- a/equinix/resource_metal_project_api_key.go +++ b/equinix/resource_metal_project_api_key.go @@ -47,14 +47,9 @@ func resourceMetalProjectAPIKey() *schema.Resource { } func resourceMetalAPIKeyCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - projectId := "" projectIdRaw, projectIdOk := d.GetOk("project_id") @@ -87,17 +82,13 @@ func projectIdFromResourceData(d *schema.ResourceData) string { } func resourceMetalAPIKeyRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - projectId := projectIdFromResourceData(d) var apiKey *packngo.APIKey + var err error // if project has been set in the resource, look up project API key // (this is the reason project API key can't be imported) @@ -142,14 +133,9 @@ func resourceMetalAPIKeyRead(d *schema.ResourceData, meta interface{}) error { } func resourceMetalAPIKeyDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - resp, err := client.APIKeys.Delete(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { return friendlyError(err) diff --git a/equinix/resource_metal_reserved_ip_block.go b/equinix/resource_metal_reserved_ip_block.go index 9d5f9ab2a..1587fda05 100644 --- a/equinix/resource_metal_reserved_ip_block.go +++ b/equinix/resource_metal_reserved_ip_block.go @@ -231,13 +231,9 @@ func resourceMetalReservedIPBlock() *schema.Resource { } func resourceMetalReservedIPBlockCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent quantity := d.Get("quantity").(int) typ := d.Get("type").(string) @@ -317,13 +313,8 @@ func resourceMetalReservedIPBlockCreate(d *schema.ResourceData, meta interface{} } func resourceMetalReservedIPBlockUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent id := d.Id() req := &packngo.IPAddressUpdateRequest{} if d.HasChange("tags") { @@ -461,15 +452,10 @@ func loadBlock(d *schema.ResourceData, reservedBlock *packngo.IPAddressReservati } func resourceMetalReservedIPBlockRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent id := d.Id() - getOpts := &packngo.GetOptions{Includes: []string{"facility", "metro", "project", "vrf"}} getOpts = getOpts.Filter("types", "public_ipv4,global_ipv4,private_ipv4,public_ipv6,vrf") @@ -497,14 +483,9 @@ func resourceMetalReservedIPBlockRead(d *schema.ResourceData, meta interface{}) } func resourceMetalReservedIPBlockDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - id := d.Id() resp, err := client.ProjectIPs.Remove(id) diff --git a/equinix/resource_metal_spot_market_request.go b/equinix/resource_metal_spot_market_request.go index 3e27b8d42..cb4be71a3 100644 --- a/equinix/resource_metal_spot_market_request.go +++ b/equinix/resource_metal_spot_market_request.go @@ -171,13 +171,8 @@ func resourceMetalSpotMarketRequest() *schema.Resource { } func resourceMetalSpotMarketRequestCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent var waitForDevices bool metro := d.Get("metro").(string) @@ -318,14 +313,9 @@ func resourceMetalSpotMarketRequestCreate(d *schema.ResourceData, meta interface } func resourceMetalSpotMarketRequestRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - smr, _, err := client.SpotMarketRequests.Get(d.Id(), &packngo.GetOptions{Includes: []string{"project", "devices", "facilities", "metro"}}) if err != nil { err = friendlyError(err) @@ -363,13 +353,8 @@ func resourceMetalSpotMarketRequestRead(d *schema.ResourceData, meta interface{} } func resourceMetalSpotMarketRequestDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent var waitForDevices bool if val, ok := d.GetOk("wait_for_devices"); ok { @@ -435,12 +420,8 @@ func getInstanceParams(params *packngo.SpotMarketRequestInstanceParameters) Inst func resourceStateRefreshFunc(d *schema.ResourceData, meta interface{}) resource.StateRefreshFunc { return func() (interface{}, string, error) { client := meta.(*Config).metal + client.UserAgent = generateModuleUserAgentString(d, client.UserAgent) - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return nil, "", err - } - client.UserAgent = userAgent smr, _, err := client.SpotMarketRequests.Get(d.Id(), &packngo.GetOptions{Includes: []string{"project", "devices", "facilities", "metro"}}) if err != nil { return nil, "", fmt.Errorf("Failed to fetch Spot market request with following error: %s", err.Error()) diff --git a/equinix/resource_metal_ssh_key.go b/equinix/resource_metal_ssh_key.go index d01ffb763..49000d967 100644 --- a/equinix/resource_metal_ssh_key.go +++ b/equinix/resource_metal_ssh_key.go @@ -63,14 +63,9 @@ func resourceMetalSSHKey() *schema.Resource { } func resourceMetalSSHKeyCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - createRequest := &packngo.SSHKeyCreateRequest{ Label: d.Get("name").(string), Key: d.Get("public_key").(string), @@ -92,14 +87,9 @@ func resourceMetalSSHKeyCreate(d *schema.ResourceData, meta interface{}) error { } func resourceMetalSSHKeyRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - key, _, err := client.SSHKeys.Get(d.Id(), nil) if err != nil { err = friendlyError(err) @@ -133,14 +123,9 @@ func resourceMetalSSHKeyRead(d *schema.ResourceData, meta interface{}) error { } func resourceMetalSSHKeyUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - updateRequest := &packngo.SSHKeyUpdateRequest{} if d.HasChange("name") { @@ -153,7 +138,7 @@ func resourceMetalSSHKeyUpdate(d *schema.ResourceData, meta interface{}) error { updateRequest.Key = &kKey } - _, _, err = client.SSHKeys.Update(d.Id(), updateRequest) + _, _, err := client.SSHKeys.Update(d.Id(), updateRequest) if err != nil { return friendlyError(err) } @@ -162,14 +147,9 @@ func resourceMetalSSHKeyUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceMetalSSHKeyDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - resp, err := client.SSHKeys.Delete(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { return friendlyError(err) diff --git a/equinix/resource_metal_virtual_circuit.go b/equinix/resource_metal_virtual_circuit.go index 042910dcb..c374f5cc3 100644 --- a/equinix/resource_metal_virtual_circuit.go +++ b/equinix/resource_metal_virtual_circuit.go @@ -139,13 +139,8 @@ func resourceMetalVirtualCircuit() *schema.Resource { } func resourceMetalVirtualCircuitCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent vncr := packngo.VCCreateRequest{ VirtualNetworkID: d.Get("vlan_id").(string), Name: d.Get("name").(string), @@ -204,13 +199,8 @@ func resourceMetalVirtualCircuitCreate(d *schema.ResourceData, meta interface{}) } func resourceMetalVirtualCircuitRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent vcId := d.Id() vc, _, err := client.VirtualCircuits.Get( @@ -296,14 +286,9 @@ func getVCStateWaiter(client *packngo.Client, id string, timeout time.Duration, } func resourceMetalVirtualCircuitUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - ur := packngo.VCUpdateRequest{} if d.HasChange("vnid") { vnid := d.Get("vnid").(string) @@ -349,16 +334,11 @@ func resourceMetalVirtualCircuitUpdate(d *schema.ResourceData, meta interface{}) } func resourceMetalVirtualCircuitDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent // we first disconnect VLAN from the VC empty := "" - _, _, err = client.VirtualCircuits.Update( + _, _, err := client.VirtualCircuits.Update( d.Id(), &packngo.VCUpdateRequest{VirtualNetworkID: &empty}, nil, diff --git a/equinix/resource_metal_vlan.go b/equinix/resource_metal_vlan.go index 8c77e935e..9bd0c7b1d 100644 --- a/equinix/resource_metal_vlan.go +++ b/equinix/resource_metal_vlan.go @@ -2,6 +2,7 @@ package equinix import ( "errors" + "fmt" "path" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -74,14 +75,9 @@ func resourceMetalVlan() *schema.Resource { } func resourceMetalVlanCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - facRaw, facOk := d.GetOk("facility") metroRaw, metroOk := d.GetOk("metro") vxlanRaw, vxlanOk := d.GetOk("vxlan") @@ -113,14 +109,9 @@ func resourceMetalVlanCreate(d *schema.ResourceData, meta interface{}) error { } func resourceMetalVlanRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - vlan, _, err := client.ProjectVirtualNetworks.Get(d.Id(), &packngo.GetOptions{Includes: []string{"assigned_to"}}) if err != nil { @@ -141,13 +132,9 @@ func resourceMetalVlanRead(d *schema.ResourceData, meta interface{}) error { } func resourceMetalVlanDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent id := d.Id() vlan, resp, err := client.ProjectVirtualNetworks.Get(id, &packngo.GetOptions{Includes: []string{"instances", "instances.network_ports.virtual_networks", "internet_gateway"}}) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { diff --git a/equinix/resource_metal_vrf.go b/equinix/resource_metal_vrf.go index 8803c1d29..66da6ebc9 100644 --- a/equinix/resource_metal_vrf.go +++ b/equinix/resource_metal_vrf.go @@ -62,14 +62,9 @@ func resourceMetalVRF() *schema.Resource { } func resourceMetalVRFCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - createRequest := &packngo.VRFCreateRequest{ Name: d.Get("name").(string), Description: d.Get("description").(string), @@ -90,14 +85,9 @@ func resourceMetalVRFCreate(d *schema.ResourceData, meta interface{}) error { } func resourceMetalVRFUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - sPtr := func(s string) *string { return &s } iPtr := func(i int) *int { return &i } @@ -116,7 +106,7 @@ func resourceMetalVRFUpdate(d *schema.ResourceData, meta interface{}) error { updateRequest.IPRanges = &ipRanges } - _, _, err = client.VRFs.Update(d.Id(), updateRequest) + _, _, err := client.VRFs.Update(d.Id(), updateRequest) if err != nil { return friendlyError(err) } @@ -125,14 +115,9 @@ func resourceMetalVRFUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceMetalVRFRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - getOpts := &packngo.GetOptions{Includes: []string{"project", "metro"}} vrf, _, err := client.VRFs.Get(d.Id(), getOpts) @@ -158,14 +143,9 @@ func resourceMetalVRFRead(d *schema.ResourceData, meta interface{}) error { } func resourceMetalVRFDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal - userAgent, err := generateUserAgentString(d, client.UserAgent) - if err != nil { - return err - } - client.UserAgent = userAgent - resp, err := client.VRFs.Delete(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) == nil { d.SetId("") diff --git a/equinix/resource_network_acl_template.go b/equinix/resource_network_acl_template.go index e5d0d2f94..2e5888729 100644 --- a/equinix/resource_network_acl_template.go +++ b/equinix/resource_network_acl_template.go @@ -224,10 +224,11 @@ func networkACLTemplateDeviceDetailsSchema() map[string]*schema.Schema { } func resourceNetworkACLTemplateCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics template := createACLTemplate(d) - uuid, err := conf.ne.CreateACLTemplate(template) + uuid, err := client.CreateACLTemplate(template) if err != nil { return diag.FromErr(err) } @@ -237,9 +238,10 @@ func resourceNetworkACLTemplateCreate(ctx context.Context, d *schema.ResourceDat } func resourceNetworkACLTemplateRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics - template, err := conf.ne.GetACLTemplate(d.Id()) + template, err := client.GetACLTemplate(d.Id()) if err != nil { if restErr, ok := err.(rest.Error); ok { if restErr.HTTPCode == http.StatusNotFound { @@ -256,10 +258,11 @@ func resourceNetworkACLTemplateRead(ctx context.Context, d *schema.ResourceData, } func resourceNetworkACLTemplateUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics template := createACLTemplate(d) - if err := conf.ne.ReplaceACLTemplate(d.Id(), template); err != nil { + if err := client.ReplaceACLTemplate(d.Id(), template); err != nil { return diag.FromErr(err) } diags = append(diags, resourceNetworkACLTemplateRead(ctx, d, m)...) @@ -267,14 +270,15 @@ func resourceNetworkACLTemplateUpdate(ctx context.Context, d *schema.ResourceDat } func resourceNetworkACLTemplateDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics if devID, ok := d.GetOk(networkACLTemplateSchemaNames["DeviceUUID"]); ok { - if err := conf.ne.NewDeviceUpdateRequest(devID.(string)).WithACLTemplate("").Execute(); err != nil { + if err := client.NewDeviceUpdateRequest(devID.(string)).WithACLTemplate("").Execute(); err != nil { log.Printf("[WARN] could not unassign ACL template %q from device %q: %s", d.Id(), devID, err) } } - if err := conf.ne.DeleteACLTemplate(d.Id()); err != nil { + if err := client.DeleteACLTemplate(d.Id()); err != nil { return diag.FromErr(err) } return diags diff --git a/equinix/resource_network_bgp.go b/equinix/resource_network_bgp.go index 12956bdab..8d3b888bb 100644 --- a/equinix/resource_network_bgp.go +++ b/equinix/resource_network_bgp.go @@ -121,13 +121,14 @@ func createNetworkBGPResourceSchema() map[string]*schema.Schema { } func resourceNetworkBGPCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics bgp := createNetworkBGPConfiguration(d) - existingBGP, err := conf.ne.GetBGPConfigurationForConnection(ne.StringValue(bgp.ConnectionUUID)) + existingBGP, err := client.GetBGPConfigurationForConnection(ne.StringValue(bgp.ConnectionUUID)) if err == nil { bgp.UUID = existingBGP.UUID - if updateErr := createNetworkBGPUpdateRequest(conf.ne.NewBGPConfigurationUpdateRequest, &bgp); updateErr != nil { + if updateErr := createNetworkBGPUpdateRequest(client.NewBGPConfigurationUpdateRequest, &bgp); updateErr != nil { return diag.Errorf("failed to update BGP configuration '%s': %s", ne.StringValue(existingBGP.UUID), updateErr) } d.SetId(ne.StringValue(bgp.UUID)) @@ -136,13 +137,13 @@ func resourceNetworkBGPCreate(ctx context.Context, d *schema.ResourceData, m int if !ok || restErr.HTTPCode != http.StatusNotFound { return diag.Errorf("failed to fetch BGP configuration for connection '%s': %s", ne.StringValue(bgp.ConnectionUUID), err) } - uuid, err := conf.ne.CreateBGPConfiguration(bgp) + uuid, err := client.CreateBGPConfiguration(bgp) if err != nil { return diag.FromErr(err) } d.SetId(ne.StringValue(uuid)) } - if _, err := createBGPConfigStatusProvisioningWaitConfiguration(conf.ne.GetBGPConfiguration, d.Id(), 2*time.Second, d.Timeout(schema.TimeoutCreate)).WaitForStateContext(ctx); err != nil { + if _, err := createBGPConfigStatusProvisioningWaitConfiguration(client.GetBGPConfiguration, d.Id(), 2*time.Second, d.Timeout(schema.TimeoutCreate)).WaitForStateContext(ctx); err != nil { return diag.Errorf("error waiting for BGP configuration (%s) to be created: %s", d.Id(), err) } diags = append(diags, resourceNetworkBGPRead(ctx, d, m)...) @@ -150,9 +151,10 @@ func resourceNetworkBGPCreate(ctx context.Context, d *schema.ResourceData, m int } func resourceNetworkBGPRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics - bgp, err := conf.ne.GetBGPConfiguration(d.Id()) + bgp, err := client.GetBGPConfiguration(d.Id()) if err != nil { return diag.FromErr(err) } @@ -163,10 +165,11 @@ func resourceNetworkBGPRead(ctx context.Context, d *schema.ResourceData, m inter } func resourceNetworkBGPUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics bgpConfig := createNetworkBGPConfiguration(d) - if err := createNetworkBGPUpdateRequest(conf.ne.NewBGPConfigurationUpdateRequest, &bgpConfig).Execute(); err != nil { + if err := createNetworkBGPUpdateRequest(client.NewBGPConfigurationUpdateRequest, &bgpConfig).Execute(); err != nil { return diag.FromErr(err) } diags = append(diags, resourceNetworkBGPRead(ctx, d, m)...) diff --git a/equinix/resource_network_device.go b/equinix/resource_network_device.go index bb385bd71..9dba9907e 100644 --- a/equinix/resource_network_device.go +++ b/equinix/resource_network_device.go @@ -841,42 +841,43 @@ func createVendorConfigurationSchema() map[string]*schema.Schema { } func resourceNetworkDeviceCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics primary, secondary := createNetworkDevices(d) var err error - if err := uploadDeviceLicenseFile(os.Open, conf.ne.UploadLicenseFile, ne.StringValue(primary.TypeCode), primary); err != nil { + if err := uploadDeviceLicenseFile(os.Open, client.UploadLicenseFile, ne.StringValue(primary.TypeCode), primary); err != nil { return diag.Errorf("could not upload primary device license file due to %s", err) } - if err := uploadDeviceLicenseFile(os.Open, conf.ne.UploadLicenseFile, ne.StringValue(primary.TypeCode), secondary); err != nil { + if err := uploadDeviceLicenseFile(os.Open, client.UploadLicenseFile, ne.StringValue(primary.TypeCode), secondary); err != nil { return diag.Errorf("could not upload secondary device license file due to %s", err) } if secondary != nil { - primary.UUID, secondary.UUID, err = conf.ne.CreateRedundantDevice(*primary, *secondary) + primary.UUID, secondary.UUID, err = client.CreateRedundantDevice(*primary, *secondary) } else { - primary.UUID, err = conf.ne.CreateDevice(*primary) + primary.UUID, err = client.CreateDevice(*primary) } if err != nil { return diag.FromErr(err) } d.SetId(ne.StringValue(primary.UUID)) waitConfigs := []*resource.StateChangeConf{ - createNetworkDeviceStatusProvisioningWaitConfiguration(conf.ne.GetDevice, ne.StringValue(primary.UUID), 5*time.Second, d.Timeout(schema.TimeoutCreate)), - createNetworkDeviceLicenseStatusWaitConfiguration(conf.ne.GetDevice, ne.StringValue(primary.UUID), 5*time.Second, d.Timeout(schema.TimeoutCreate)), + createNetworkDeviceStatusProvisioningWaitConfiguration(client.GetDevice, ne.StringValue(primary.UUID), 5*time.Second, d.Timeout(schema.TimeoutCreate)), + createNetworkDeviceLicenseStatusWaitConfiguration(client.GetDevice, ne.StringValue(primary.UUID), 5*time.Second, d.Timeout(schema.TimeoutCreate)), } if ne.StringValue(primary.ACLTemplateUUID) != "" || ne.StringValue(primary.MgmtAclTemplateUuid) != "" { waitConfigs = append(waitConfigs, - createNetworkDeviceACLStatusWaitConfiguration(conf.ne.GetDeviceACLDetails, ne.StringValue(primary.UUID), 1*time.Second, d.Timeout(schema.TimeoutUpdate)), + createNetworkDeviceACLStatusWaitConfiguration(client.GetDeviceACLDetails, ne.StringValue(primary.UUID), 1*time.Second, d.Timeout(schema.TimeoutUpdate)), ) } if secondary != nil { waitConfigs = append(waitConfigs, - createNetworkDeviceStatusProvisioningWaitConfiguration(conf.ne.GetDevice, ne.StringValue(secondary.UUID), 5*time.Second, d.Timeout(schema.TimeoutCreate)), - createNetworkDeviceLicenseStatusWaitConfiguration(conf.ne.GetDevice, ne.StringValue(secondary.UUID), 5*time.Second, d.Timeout(schema.TimeoutCreate)), + createNetworkDeviceStatusProvisioningWaitConfiguration(client.GetDevice, ne.StringValue(secondary.UUID), 5*time.Second, d.Timeout(schema.TimeoutCreate)), + createNetworkDeviceLicenseStatusWaitConfiguration(client.GetDevice, ne.StringValue(secondary.UUID), 5*time.Second, d.Timeout(schema.TimeoutCreate)), ) if ne.StringValue(secondary.ACLTemplateUUID) != "" || ne.StringValue(secondary.MgmtAclTemplateUuid) != "" { waitConfigs = append(waitConfigs, - createNetworkDeviceACLStatusWaitConfiguration(conf.ne.GetDeviceACLDetails, ne.StringValue(secondary.UUID), 1*time.Second, d.Timeout(schema.TimeoutUpdate)), + createNetworkDeviceACLStatusWaitConfiguration(client.GetDeviceACLDetails, ne.StringValue(secondary.UUID), 1*time.Second, d.Timeout(schema.TimeoutUpdate)), ) } } @@ -893,11 +894,12 @@ func resourceNetworkDeviceCreate(ctx context.Context, d *schema.ResourceData, m } func resourceNetworkDeviceRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics var err error var primary, secondary *ne.Device - primary, err = conf.ne.GetDevice(d.Id()) + primary, err = client.GetDevice(d.Id()) if err != nil { return diag.Errorf("cannot fetch primary network device due to %v", err) } @@ -906,7 +908,7 @@ func resourceNetworkDeviceRead(ctx context.Context, d *schema.ResourceData, m in return diags } if ne.StringValue(primary.RedundantUUID) != "" { - secondary, err = conf.ne.GetDevice(ne.StringValue(primary.RedundantUUID)) + secondary, err = client.GetDevice(ne.StringValue(primary.RedundantUUID)) if err != nil { return diag.Errorf("cannot fetch secondary network device due to %v", err) } @@ -918,14 +920,15 @@ func resourceNetworkDeviceRead(ctx context.Context, d *schema.ResourceData, m in } func resourceNetworkDeviceUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics supportedChanges := []string{ neDeviceSchemaNames["Name"], neDeviceSchemaNames["TermLength"], neDeviceSchemaNames["Notifications"], neDeviceSchemaNames["AdditionalBandwidth"], neDeviceSchemaNames["ACLTemplateUUID"], neDeviceSchemaNames["MgmtAclTemplateUuid"], } - updateReq := conf.ne.NewDeviceUpdateRequest(d.Id()) + updateReq := client.NewDeviceUpdateRequest(d.Id()) primaryChanges := getResourceDataChangedKeys(supportedChanges, d) if err := fillNetworkDeviceUpdateRequest(updateReq, primaryChanges).Execute(); err != nil { return diag.FromErr(err) @@ -933,17 +936,17 @@ func resourceNetworkDeviceUpdate(ctx context.Context, d *schema.ResourceData, m var secondaryChanges map[string]interface{} if v, ok := d.GetOk(neDeviceSchemaNames["RedundantUUID"]); ok { secondaryChanges = getResourceDataListElementChanges(supportedChanges, neDeviceSchemaNames["Secondary"], 0, d) - secondaryUpdateReq := conf.ne.NewDeviceUpdateRequest(v.(string)) + secondaryUpdateReq := client.NewDeviceUpdateRequest(v.(string)) if err := fillNetworkDeviceUpdateRequest(secondaryUpdateReq, secondaryChanges).Execute(); err != nil { return diag.FromErr(err) } } - for _, stateChangeConf := range getNetworkDeviceStateChangeConfigs(conf.ne, d.Id(), d.Timeout(schema.TimeoutUpdate), primaryChanges) { + for _, stateChangeConf := range getNetworkDeviceStateChangeConfigs(client, d.Id(), d.Timeout(schema.TimeoutUpdate), primaryChanges) { if _, err := stateChangeConf.WaitForStateContext(ctx); err != nil { return diag.Errorf("error waiting for network device %q to be updated: %s", d.Id(), err) } } - for _, stateChangeConf := range getNetworkDeviceStateChangeConfigs(conf.ne, d.Get(neDeviceSchemaNames["RedundantUUID"]).(string), d.Timeout(schema.TimeoutUpdate), secondaryChanges) { + for _, stateChangeConf := range getNetworkDeviceStateChangeConfigs(client, d.Get(neDeviceSchemaNames["RedundantUUID"]).(string), d.Timeout(schema.TimeoutUpdate), secondaryChanges) { if _, err := stateChangeConf.WaitForStateContext(ctx); err != nil { return diag.Errorf("error waiting for network device %q to be updated: %s", d.Get(neDeviceSchemaNames["RedundantUUID"]), err) } @@ -953,19 +956,20 @@ func resourceNetworkDeviceUpdate(ctx context.Context, d *schema.ResourceData, m } func resourceNetworkDeviceDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics waitConfigs := []*resource.StateChangeConf{ - createNetworkDeviceStatusDeleteWaitConfiguration(conf.ne.GetDevice, d.Id(), 5*time.Second, d.Timeout(schema.TimeoutDelete)), + createNetworkDeviceStatusDeleteWaitConfiguration(client.GetDevice, d.Id(), 5*time.Second, d.Timeout(schema.TimeoutDelete)), } if v, ok := d.GetOk(neDeviceSchemaNames["Secondary"]); ok { if secondary := expandNetworkDeviceSecondary(v.([]interface{})); secondary != nil { waitConfigs = append(waitConfigs, - createNetworkDeviceStatusDeleteWaitConfiguration(conf.ne.GetDevice, ne.StringValue(secondary.UUID), 5*time.Second, d.Timeout(schema.TimeoutDelete)), + createNetworkDeviceStatusDeleteWaitConfiguration(client.GetDevice, ne.StringValue(secondary.UUID), 5*time.Second, d.Timeout(schema.TimeoutDelete)), ) } } - if err := conf.ne.DeleteDevice(d.Id()); err != nil { + if err := client.DeleteDevice(d.Id()); err != nil { if restErr, ok := err.(rest.Error); ok { for _, detailedErr := range restErr.ApplicationErrors { if detailedErr.Code == ne.ErrorCodeDeviceRemoved { diff --git a/equinix/resource_network_device_link.go b/equinix/resource_network_device_link.go index eb39ef657..55c169552 100644 --- a/equinix/resource_network_device_link.go +++ b/equinix/resource_network_device_link.go @@ -220,15 +220,16 @@ func createNetworkDeviceLinkConnectionResourceSchema() map[string]*schema.Schema } func resourceNetworkDeviceLinkCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics link := createNetworkDeviceLink(d) - uuid, err := conf.ne.CreateDeviceLinkGroup(link) + uuid, err := client.CreateDeviceLinkGroup(link) if err != nil { return diag.FromErr(err) } d.SetId(ne.StringValue(uuid)) - if _, err := createDeviceLinkStatusProvisioningWaitConfiguration(conf.ne.GetDeviceLinkGroup, d.Id(), 2*time.Second, d.Timeout(schema.TimeoutCreate)).WaitForStateContext(ctx); err != nil { + if _, err := createDeviceLinkStatusProvisioningWaitConfiguration(client.GetDeviceLinkGroup, d.Id(), 2*time.Second, d.Timeout(schema.TimeoutCreate)).WaitForStateContext(ctx); err != nil { diags = append(diags, diag.Diagnostic{ Severity: diag.Error, Summary: "Failed to wait for device link to become provisioned", @@ -241,9 +242,10 @@ func resourceNetworkDeviceLinkCreate(ctx context.Context, d *schema.ResourceData } func resourceNetworkDeviceLinkRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics - link, err := conf.ne.GetDeviceLinkGroup(d.Id()) + link, err := client.GetDeviceLinkGroup(d.Id()) if err != nil { if isRestNotFoundError(err) { d.SetId("") @@ -251,7 +253,7 @@ func resourceNetworkDeviceLinkRead(ctx context.Context, d *schema.ResourceData, } } for i, linkDevice := range link.Devices { - device, err := conf.ne.GetDevice(ne.StringValue(linkDevice.DeviceID)) + device, err := client.GetDevice(ne.StringValue(linkDevice.DeviceID)) if err != nil { return diag.FromErr(err) } @@ -264,13 +266,14 @@ func resourceNetworkDeviceLinkRead(ctx context.Context, d *schema.ResourceData, } func resourceNetworkDeviceLinkUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics changes := getResourceDataChangedKeys([]string{ networkDeviceLinkSchemaNames["Name"], networkDeviceLinkSchemaNames["Subnet"], networkDeviceLinkSchemaNames["Devices"], networkDeviceLinkSchemaNames["Links"], }, d) - updateReq := conf.ne.NewDeviceLinkGroupUpdateRequest(d.Id()) + updateReq := client.NewDeviceLinkGroupUpdateRequest(d.Id()) for change, changeValue := range changes { switch change { case networkDeviceLinkSchemaNames["Name"]: @@ -288,7 +291,7 @@ func resourceNetworkDeviceLinkUpdate(ctx context.Context, d *schema.ResourceData if err := updateReq.Execute(); err != nil { return diag.FromErr(err) } - if _, err := createDeviceLinkStatusProvisioningWaitConfiguration(conf.ne.GetDeviceLinkGroup, d.Id(), 2*time.Second, d.Timeout(schema.TimeoutCreate)).WaitForStateContext(ctx); err != nil { + if _, err := createDeviceLinkStatusProvisioningWaitConfiguration(client.GetDeviceLinkGroup, d.Id(), 2*time.Second, d.Timeout(schema.TimeoutCreate)).WaitForStateContext(ctx); err != nil { diags = append(diags, diag.Diagnostic{ Severity: diag.Error, Summary: "Failed to wait for device link to become provisioned", @@ -301,15 +304,16 @@ func resourceNetworkDeviceLinkUpdate(ctx context.Context, d *schema.ResourceData } func resourceNetworkDeviceLinkDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics - if err := conf.ne.DeleteDeviceLinkGroup(d.Id()); err != nil { + if err := client.DeleteDeviceLinkGroup(d.Id()); err != nil { if isRestNotFoundError(err) { return nil } return diag.FromErr(err) } - if _, err := createDeviceLinkStatusDeleteWaitConfiguration(conf.ne.GetDeviceLinkGroup, d.Id(), 2*time.Second, d.Timeout(schema.TimeoutDelete)).WaitForStateContext(ctx); err != nil { + if _, err := createDeviceLinkStatusDeleteWaitConfiguration(client.GetDeviceLinkGroup, d.Id(), 2*time.Second, d.Timeout(schema.TimeoutDelete)).WaitForStateContext(ctx); err != nil { diags = append(diags, diag.Diagnostic{ Severity: diag.Error, Summary: "Failed to wait for device link to become deprovisioned", diff --git a/equinix/resource_network_ssh_key.go b/equinix/resource_network_ssh_key.go index e5d53a3eb..7de016d18 100644 --- a/equinix/resource_network_ssh_key.go +++ b/equinix/resource_network_ssh_key.go @@ -66,10 +66,11 @@ func createNetworkSSHKeyResourceSchema() map[string]*schema.Schema { } func resourceNetworkSSHKeyCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics key := createNetworkSSHKey(d) - uuid, err := conf.ne.CreateSSHPublicKey(key) + uuid, err := client.CreateSSHPublicKey(key) if err != nil { return diag.FromErr(err) } @@ -79,9 +80,10 @@ func resourceNetworkSSHKeyCreate(ctx context.Context, d *schema.ResourceData, m } func resourceNetworkSSHKeyRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics - key, err := conf.ne.GetSSHPublicKey(d.Id()) + key, err := client.GetSSHPublicKey(d.Id()) if err != nil { if restErr, ok := err.(rest.Error); ok { if restErr.HTTPCode == http.StatusNotFound { @@ -98,9 +100,10 @@ func resourceNetworkSSHKeyRead(ctx context.Context, d *schema.ResourceData, m in } func resourceNetworkSSHKeyDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics - if err := conf.ne.DeleteSSHPublicKey(d.Id()); err != nil { + if err := client.DeleteSSHPublicKey(d.Id()); err != nil { if restErr, ok := err.(rest.Error); ok { for _, detailedErr := range restErr.ApplicationErrors { if detailedErr.Code == ne.ErrorCodeSSHPublicKeyInvalid { diff --git a/equinix/resource_network_ssh_user.go b/equinix/resource_network_ssh_user.go index ce5862bd3..95ecc7638 100644 --- a/equinix/resource_network_ssh_user.go +++ b/equinix/resource_network_ssh_user.go @@ -74,18 +74,20 @@ func createNetworkSSHUserResourceSchema() map[string]*schema.Schema { } func resourceNetworkSSHUserCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) + var diags diag.Diagnostics user := createNetworkSSHUser(d) if len(user.DeviceUUIDs) < 0 { return diag.Errorf("create ssh-user failed: user needs to have at least one device defined") } - uuid, err := conf.ne.CreateSSHUser(ne.StringValue(user.Username), ne.StringValue(user.Password), user.DeviceUUIDs[0]) + uuid, err := client.CreateSSHUser(ne.StringValue(user.Username), ne.StringValue(user.Password), user.DeviceUUIDs[0]) if err != nil { return diag.FromErr(err) } d.SetId(ne.StringValue(uuid)) - userUpdateReq := conf.ne.NewSSHUserUpdateRequest(ne.StringValue(uuid)) + userUpdateReq := client.NewSSHUserUpdateRequest(ne.StringValue(uuid)) userUpdateReq.WithDeviceChange([]string{}, user.DeviceUUIDs[1:len(user.DeviceUUIDs)]) if err := userUpdateReq.Execute(); err != nil { diags = append(diags, diag.Diagnostic{ @@ -100,9 +102,10 @@ func resourceNetworkSSHUserCreate(ctx context.Context, d *schema.ResourceData, m } func resourceNetworkSSHUserRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics - user, err := conf.ne.GetSSHUser(d.Id()) + user, err := client.GetSSHUser(d.Id()) if err != nil { return diag.FromErr(err) } @@ -113,9 +116,10 @@ func resourceNetworkSSHUserRead(ctx context.Context, d *schema.ResourceData, m i } func resourceNetworkSSHUserUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics - updateReq := conf.ne.NewSSHUserUpdateRequest(d.Id()) + updateReq := client.NewSSHUserUpdateRequest(d.Id()) if v, ok := d.GetOk(networkSSHUserSchemaNames["Password"]); ok && d.HasChange(networkSSHUserSchemaNames["Password"]) { updateReq.WithNewPassword(v.(string)) } @@ -133,9 +137,10 @@ func resourceNetworkSSHUserUpdate(ctx context.Context, d *schema.ResourceData, m } func resourceNetworkSSHUserDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - conf := m.(*Config) + client := m.(*Config).ne + m.(*Config).addModuleToNEUserAgent(&client, d) var diags diag.Diagnostics - if err := conf.ne.DeleteSSHUser(d.Id()); err != nil { + if err := client.DeleteSSHUser(d.Id()); err != nil { return diag.FromErr(err) } return diags From 443e76183f7163eb3a0c20c078ad3533c2654d2c Mon Sep 17 00:00:00 2001 From: Oscar Cobles Date: Tue, 15 Nov 2022 23:22:44 +0100 Subject: [PATCH 4/4] fix remove unused fmt and gofumpt --- equinix/data_source_ecx_l2_sellerprofile.go | 2 +- .../resource_ecx_l2_connection_acc_test.go | 138 +++++++++--------- equinix/resource_metal_device_acc_test.go | 35 +++-- equinix/resource_metal_vlan.go | 1 - equinix/resource_network_ssh_user.go | 2 +- 5 files changed, 90 insertions(+), 88 deletions(-) diff --git a/equinix/data_source_ecx_l2_sellerprofile.go b/equinix/data_source_ecx_l2_sellerprofile.go index 8eb859e9a..2e4fa75a8 100644 --- a/equinix/data_source_ecx_l2_sellerprofile.go +++ b/equinix/data_source_ecx_l2_sellerprofile.go @@ -77,7 +77,7 @@ func dataSourceECXL2SellerProfile() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceECXL2SellerProfileRead, Description: "Use this data source to get details of Equinix Fabric layer 2 seller profile with a given name and / or organization", - Schema: createECXL2SellerProfileSchema(), + Schema: createECXL2SellerProfileSchema(), } } diff --git a/equinix/resource_ecx_l2_connection_acc_test.go b/equinix/resource_ecx_l2_connection_acc_test.go index acbfe8ee5..8fe2cbbe2 100644 --- a/equinix/resource_ecx_l2_connection_acc_test.go +++ b/equinix/resource_ecx_l2_connection_acc_test.go @@ -411,8 +411,8 @@ func TestAccFabricL2Connection_ServiceToken_HA_SP(t *testing.T) { } return fmt.Sprintf("%s:%s", rs.Primary.ID, secondaryID), nil }, - ImportState: true, - ImportStateVerify: true, + ImportState: true, + ImportStateVerify: true, ImportStateVerifyIgnore: []string{"service_token", "secondary_connection.0.service_token"}, }, }, @@ -470,17 +470,17 @@ func TestAccFabricL2Connection_ZSideServiceToken_Single(t *testing.T) { GetL2ConnectionFn: func(uuid string) (*ecx.L2Connection, error) { status := ecx.ConnectionStatusProvisioned connection := ecx.L2Connection{ - Speed: &speed, - SpeedUnit: &speedUnit, - Notifications: notifications, - Status: &status, - SellerMetroCode: &sellerMetro, - RedundancyGroup: &redundancyGroupUUID, - RedundancyType: &redundancyType, - UUID: &priConnID, - Name: &priConnName, - PortUUID: &priPortUUID, - VendorToken: &priZSideServiceToken, + Speed: &speed, + SpeedUnit: &speedUnit, + Notifications: notifications, + Status: &status, + SellerMetroCode: &sellerMetro, + RedundancyGroup: &redundancyGroupUUID, + RedundancyType: &redundancyType, + UUID: &priConnID, + Name: &priConnName, + PortUUID: &priPortUUID, + VendorToken: &priZSideServiceToken, } return &connection, nil }, @@ -525,9 +525,9 @@ func TestAccFabricL2Connection_ZSideServiceToken_Single(t *testing.T) { ), }, { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, ImportStateVerifyIgnore: []string{"zside_service_token"}, }, }, @@ -728,7 +728,7 @@ resource "equinix_ecx_l2_connection" "%{connection-resourceName}" { if _, ok := ctx["connection-authorization_key"]; ok { config += nprintf(` authorization_key = "%{connection-authorization_key}"`, ctx) - } + } if _, ok := ctx["zside-service_token"]; !ok { if _, ok := ctx["connection-profile_uuid"]; ok { config += nprintf(` @@ -741,108 +741,108 @@ resource "equinix_ecx_l2_connection" "%{connection-resourceName}" { if _, ok := ctx["service_token"]; ok { config += nprintf(` service_token = "%{service_token}"`, ctx) - } + } if _, ok := ctx["zside-service_token"]; ok { config += nprintf(` zside_service_token = "%{zside-service_token}"`, ctx) - } + } if _, ok := ctx["zside-port_uuid"]; ok { config += nprintf(` zside_port_uuid = "%{zside-port_uuid}"`, ctx) - } + } if _, ok := ctx["connection-purchase_order_number"]; ok { config += nprintf(` purchase_order_number = "%{connection-purchase_order_number}"`, ctx) - } + } if _, ok := ctx["connection-seller_region"]; ok { config += nprintf(` seller_region = "%{connection-seller_region}"`, ctx) - } + } if _, ok := ctx["port-uuid"]; ok { config += nprintf(` port_uuid = "%{port-uuid}"`, ctx) - } else if _, ok := ctx["port-resourceName"]; ok { + } else if _, ok := ctx["port-resourceName"]; ok { config += nprintf(` port_uuid = data.equinix_ecx_port.%{port-resourceName}.id`, ctx) - } + } if _, ok := ctx["device-resourceName"]; ok { config += nprintf(` device_uuid = equinix_network_device.%{device-resourceName}.id`, ctx) - } + } if _, ok := ctx["connection-vlan_stag"]; ok { config += nprintf(` vlan_stag = %{connection-vlan_stag}`, ctx) - } + } if _, ok := ctx["connection-vlan_ctag"]; ok { config += nprintf(` vlan_ctag = %{connection-vlan_ctag}`, ctx) - } + } if _, ok := ctx["connection-named_tag"]; ok { config += nprintf(` named_tag = "%{connection-named_tag}"`, ctx) - } + } if _, ok := ctx["connection-device_interface_id"]; ok { config += nprintf(` device_interface_id = %{connection-device_interface_id}`, ctx) - } + } if _, ok := ctx["connection-secondary_name"]; ok { config += nprintf(` secondary_connection { name = "%{connection-secondary_name}"`, ctx) - if _, ok := ctx["connection-secondary_profile_name"]; ok { - config += nprintf(` + if _, ok := ctx["connection-secondary_profile_name"]; ok { + config += nprintf(` profile_uuid = data.equinix_ecx_l2_sellerprofile.sec.id`, ctx) - } - if _, ok := ctx["secondary-port_uuid"]; ok { - config += nprintf(` + } + if _, ok := ctx["secondary-port_uuid"]; ok { + config += nprintf(` port_uuid = "%{secondary-port_uuid}"`, ctx) - } else if _, ok := ctx["port-secondary_resourceName"]; ok { - config += nprintf(` + } else if _, ok := ctx["port-secondary_resourceName"]; ok { + config += nprintf(` port_uuid = data.equinix_ecx_port.%{port-secondary_resourceName}.id`, ctx) - } - if _, ok := ctx["device-secondary_name"]; ok { - config += nprintf(` + } + if _, ok := ctx["device-secondary_name"]; ok { + config += nprintf(` device_uuid = equinix_network_device.%{device-resourceName}.redundant_id`, ctx) - } - if _, ok := ctx["connection-secondary_vlan_stag"]; ok { - config += nprintf(` + } + if _, ok := ctx["connection-secondary_vlan_stag"]; ok { + config += nprintf(` vlan_stag = %{connection-secondary_vlan_stag}`, ctx) - } - if _, ok := ctx["connection-secondary_vlan_ctag"]; ok { - config += nprintf(` + } + if _, ok := ctx["connection-secondary_vlan_ctag"]; ok { + config += nprintf(` vlan_ctag = %{connection-secondary_vlan_ctag}`, ctx) - } - if _, ok := ctx["connection-secondary_device_interface_id"]; ok { - config += nprintf(` + } + if _, ok := ctx["connection-secondary_device_interface_id"]; ok { + config += nprintf(` device_interface_id = %{connection-secondary_device_interface_id}`, ctx) - } - if _, ok := ctx["connection-secondary_speed"]; ok { - config += nprintf(` + } + if _, ok := ctx["connection-secondary_speed"]; ok { + config += nprintf(` speed = %{connection-secondary_speed}`, ctx) - } - if _, ok := ctx["connection-secondary_speed_unit"]; ok { - config += nprintf(` + } + if _, ok := ctx["connection-secondary_speed_unit"]; ok { + config += nprintf(` speed_unit = "%{connection-secondary_speed_unit}"`, ctx) - } - if _, ok := ctx["connection-secondary_seller_metro_code"]; ok { - config += nprintf(` + } + if _, ok := ctx["connection-secondary_seller_metro_code"]; ok { + config += nprintf(` seller_metro_code = "%{connection-secondary_seller_metro_code}"`, ctx) - } - if _, ok := ctx["connection-secondary_seller_region"]; ok { - config += nprintf(` + } + if _, ok := ctx["connection-secondary_seller_region"]; ok { + config += nprintf(` seller_region = "%{connection-secondary_seller_region}"`, ctx) - } - if _, ok := ctx["connection-secondary_authorization_key"]; ok { - config += nprintf(` + } + if _, ok := ctx["connection-secondary_authorization_key"]; ok { + config += nprintf(` authorization_key = "%{connection-secondary_authorization_key}"`, ctx) - } - if _, ok := ctx["secondary-service_token"]; ok { - config += nprintf(` + } + if _, ok := ctx["secondary-service_token"]; ok { + config += nprintf(` service_token = "%{secondary-service_token}"`, ctx) - } - config += ` + } + config += ` }` - } + } config += ` }` return config diff --git a/equinix/resource_metal_device_acc_test.go b/equinix/resource_metal_device_acc_test.go index dd7502007..91857ea30 100644 --- a/equinix/resource_metal_device_acc_test.go +++ b/equinix/resource_metal_device_acc_test.go @@ -73,24 +73,27 @@ func testSweepDevices(region string) error { } // Regexp vars for use with resource.ExpectError -var matchErrMustBeProvided = regexp.MustCompile(".* must be provided when .*") -var matchErrShouldNotBeAnIPXE = regexp.MustCompile(`.*"user_data" should not be an iPXE.*`) +var ( + matchErrMustBeProvided = regexp.MustCompile(".* must be provided when .*") + matchErrShouldNotBeAnIPXE = regexp.MustCompile(`.*"user_data" should not be an iPXE.*`) +) // This function should be used to find available plans in all test where a metal_device resource is needed. // To prevent unexpected plan/facilities changes (i.e. run out of a plan in a metro after first apply) // during tests that have several config updates, resource metal_device should include a lifecycle // like the one defined below. // -// lifecycle { -// ignore_changes = [ -// plan, -// facilities, -// ] -// } +// lifecycle { +// ignore_changes = [ +// plan, +// facilities, +// ] +// } // // TODO consider adding a datasource for equinix_metal_operating_system and making the local.os conditional -// https://github.com/equinix/terraform-provider-equinix/pull/220#discussion_r915418418equinix_metal_operating_system -// https://github.com/equinix/terraform-provider-equinix/discussions/221 +// +// https://github.com/equinix/terraform-provider-equinix/pull/220#discussion_r915418418equinix_metal_operating_system +// https://github.com/equinix/terraform-provider-equinix/discussions/221 func confAccMetalDevice_base(plans, metros, os []string) string { return fmt.Sprintf(` data "equinix_metal_plans" "test" { @@ -913,7 +916,7 @@ func (m *mockDeviceService) Get(deviceID string, opts *packngo.GetOptions) (*pac return m.GetFn(deviceID, opts) } -func (m *mockDeviceService) Create(device *packngo.DeviceCreateRequest) (*packngo.Device, *packngo.Response, error){ +func (m *mockDeviceService) Create(device *packngo.DeviceCreateRequest) (*packngo.Device, *packngo.Response, error) { return nil, nil, mockFuncNotImplemented("Create") } @@ -1012,9 +1015,9 @@ func TestAccMetalDevice_readErrorHandling(t *testing.T) { Devices: &mockDeviceService{ GetFn: func(deviceID string, opts *packngo.GetOptions) (*packngo.Device, *packngo.Response, error) { httpResp := &http.Response{ - Status: "404 NotFound", + Status: "404 NotFound", StatusCode: 404, - Header: http.Header{"Content-Type": []string{"application/json"}, "X-Request-Id": []string{"12345"}}, + Header: http.Header{"Content-Type": []string{"application/json"}, "X-Request-Id": []string{"12345"}}, } return nil, &packngo.Response{Response: httpResp}, &packngo.ErrorResponse{Response: httpResp} }, @@ -1027,7 +1030,7 @@ func TestAccMetalDevice_readErrorHandling(t *testing.T) { { name: "forbiddenWaitForActiveDeviceProvision", args: args{ - newResource: true, + newResource: true, meta: &Config{ metal: &packngo.Client{ Devices: &mockDeviceService{ @@ -1044,7 +1047,7 @@ func TestAccMetalDevice_readErrorHandling(t *testing.T) { { name: "notFoundProvision", args: args{ - newResource: true, + newResource: true, meta: &Config{ metal: &packngo.Client{ Devices: &mockDeviceService{ @@ -1061,7 +1064,7 @@ func TestAccMetalDevice_readErrorHandling(t *testing.T) { { name: "errorProvision", args: args{ - newResource: true, + newResource: true, meta: &Config{ metal: &packngo.Client{ Devices: &mockDeviceService{ diff --git a/equinix/resource_metal_vlan.go b/equinix/resource_metal_vlan.go index 9bd0c7b1d..4128d123d 100644 --- a/equinix/resource_metal_vlan.go +++ b/equinix/resource_metal_vlan.go @@ -2,7 +2,6 @@ package equinix import ( "errors" - "fmt" "path" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" diff --git a/equinix/resource_network_ssh_user.go b/equinix/resource_network_ssh_user.go index 95ecc7638..8bf775e42 100644 --- a/equinix/resource_network_ssh_user.go +++ b/equinix/resource_network_ssh_user.go @@ -76,7 +76,7 @@ func createNetworkSSHUserResourceSchema() map[string]*schema.Schema { func resourceNetworkSSHUserCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { client := m.(*Config).ne m.(*Config).addModuleToNEUserAgent(&client, d) - + var diags diag.Diagnostics user := createNetworkSSHUser(d) if len(user.DeviceUUIDs) < 0 {