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/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/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/helpers_device.go b/equinix/helpers_device.go index 7e5fc1999..cd88131c9 100644 --- a/equinix/helpers_device.go +++ b/equinix/helpers_device.go @@ -188,6 +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) + device, _, err := client.Devices.Get(d.Id(), &packngo.GetOptions{Includes: []string{"project"}}) if err == nil { retAttrVal := device.State @@ -215,7 +217,9 @@ 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 + _, 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..df3b04ad7 100644 --- a/equinix/port_helpers.go +++ b/equinix/port_helpers.go @@ -18,6 +18,7 @@ type ClientPortResource struct { } func getClientPortResource(d *schema.ResourceData, meta interface{}) (*ClientPortResource, *packngo.Response, error) { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal port_id := d.Get("port_id").(string) diff --git a/equinix/provider.go b/equinix/provider.go index 32b239009..5502b2975 100644 --- a/equinix/provider.go +++ b/equinix/provider.go @@ -163,6 +163,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) { @@ -171,6 +177,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) @@ -186,7 +196,11 @@ 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.terraformVersion = p.TerraformVersion if config.terraformVersion == "" { // Terraform 0.12 introduced this field to the protocol 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_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_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 846cf48d0..122e8f9a8 100644 --- a/equinix/resource_metal_bgp_session.go +++ b/equinix/resource_metal_bgp_session.go @@ -49,7 +49,9 @@ func resourceMetalBGPSession() *schema.Resource { } func resourceMetalBGPSessionCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal + dID := d.Get("device_id").(string) addressFamily := d.Get("address_family").(string) defaultRoute := d.Get("default_route").(bool) @@ -68,7 +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 + bgpSession, _, err := client.BGPSessions.Get(d.Id(), &packngo.GetOptions{Includes: []string{"device"}}) if err != nil { @@ -96,6 +100,7 @@ func resourceMetalBGPSessionRead(d *schema.ResourceData, meta interface{}) error } func resourceMetalBGPSessionDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal 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..26fe481bf 100644 --- a/equinix/resource_metal_connection.go +++ b/equinix/resource_metal_connection.go @@ -186,6 +186,7 @@ func resourceMetalConnection() *schema.Resource { } func resourceMetalConnectionCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal facility, facOk := d.GetOk("facility") @@ -288,6 +289,7 @@ func resourceMetalConnectionCreate(d *schema.ResourceData, meta interface{}) err } func resourceMetalConnectionUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal if d.HasChange("locked") { @@ -342,9 +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 - connId := d.Id() + connId := d.Id() conn, _, err := client.Connections.Get( connId, &packngo.GetOptions{Includes: []string{"service_tokens", "organization", "facility", "metro", "project"}}) @@ -401,6 +404,7 @@ func resourceMetalConnectionRead(d *schema.ResourceData, meta interface{}) error } func resourceMetalConnectionDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal resp, err := client.Connections.Delete(d.Id(), true) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { diff --git a/equinix/resource_metal_device.go b/equinix/resource_metal_device.go index 0105e7c71..3656a7ed2 100644 --- a/equinix/resource_metal_device.go +++ b/equinix/resource_metal_device.go @@ -443,6 +443,7 @@ 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 var addressTypesSlice []packngo.IPAddressCreateRequest @@ -577,6 +578,7 @@ func resourceMetalDeviceCreate(d *schema.ResourceData, meta interface{}) error { } func resourceMetalDeviceRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal device, _, err := client.Devices.Get(d.Id(), deviceReadOptions) @@ -679,6 +681,7 @@ func resourceMetalDeviceRead(d *schema.ResourceData, meta interface{}) error { } func resourceMetalDeviceUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal if d.HasChange("locked") { @@ -781,6 +784,7 @@ func getReinstallOptions(d *schema.ResourceData) (packngo.DeviceReinstallFields, } func resourceMetalDeviceDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal fdvIf, fdvOk := d.GetOk("force_detach_volumes") 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_device_network_type.go b/equinix/resource_metal_device_network_type.go index 5afe07cdf..022252151 100644 --- a/equinix/resource_metal_device_network_type.go +++ b/equinix/resource_metal_device_network_type.go @@ -71,9 +71,10 @@ 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 - ntype := d.Get("type").(string) + ntype := d.Get("type").(string) err := getAndPossiblySetNetworkType(d, client, ntype) if err != nil { return err @@ -83,6 +84,7 @@ func resourceMetalDeviceNetworkTypeCreate(d *schema.ResourceData, meta interface } func resourceMetalDeviceNetworkTypeRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal _, devNType, err := getDevIDandNetworkType(d, client) @@ -111,7 +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 + ntype := d.Get("type").(string) if d.HasChange("type") { err := getAndPossiblySetNetworkType(d, client, ntype) @@ -119,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 ef9e52b85..3f2ccb349 100644 --- a/equinix/resource_metal_gateway.go +++ b/equinix/resource_metal_gateway.go @@ -93,6 +93,7 @@ func resourceMetalGateway() *schema.Resource { } func resourceMetalGatewayCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal _, hasIPReservation := d.GetOk("ip_reservation_id") @@ -119,11 +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 - mgId := d.Id() + 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 @@ -151,6 +152,7 @@ func resourceMetalGatewayRead(d *schema.ResourceData, meta interface{}) error { } func resourceMetalGatewayDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal resp, err := client.MetalGateways.Delete(d.Id()) if ignoreResponseErrors(httpForbidden, httpNotFound)(resp, err) != nil { diff --git a/equinix/resource_metal_ip_attachment.go b/equinix/resource_metal_ip_attachment.go index 09e92b4c0..0da861885 100644 --- a/equinix/resource_metal_ip_attachment.go +++ b/equinix/resource_metal_ip_attachment.go @@ -34,12 +34,12 @@ func resourceMetalIPAttachment() *schema.Resource { } func resourceMetalIPAttachmentCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal + 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) @@ -51,6 +51,7 @@ func resourceMetalIPAttachmentCreate(d *schema.ResourceData, meta interface{}) e } func resourceMetalIPAttachmentRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal assignment, _, err := client.DeviceIPs.Get(d.Id(), nil) if err != nil { @@ -86,6 +87,7 @@ func resourceMetalIPAttachmentRead(d *schema.ResourceData, meta interface{}) err } func resourceMetalIPAttachmentDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal resp, err := client.DeviceIPs.Unassign(d.Id()) diff --git a/equinix/resource_metal_organization.go b/equinix/resource_metal_organization.go index aa804953f..24030a89a 100644 --- a/equinix/resource_metal_organization.go +++ b/equinix/resource_metal_organization.go @@ -100,6 +100,7 @@ func createMetalOrganizationAddressResourceSchema() map[string]*schema.Schema { } func resourceMetalOrganizationCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal createRequest := &packngo.OrganizationCreateRequest{ @@ -134,6 +135,7 @@ func resourceMetalOrganizationCreate(d *schema.ResourceData, meta interface{}) e } func resourceMetalOrganizationRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal key, _, err := client.Organizations.Get(d.Id(), &packngo.GetOptions{Includes: []string{"address"}}) @@ -164,6 +166,7 @@ func resourceMetalOrganizationRead(d *schema.ResourceData, meta interface{}) err } func resourceMetalOrganizationUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal changes := getResourceDataChangedKeys([]string{"name", "description", "website", "twitter", "logo", "address"}, d) @@ -200,6 +203,7 @@ func resourceMetalOrganizationUpdate(d *schema.ResourceData, meta interface{}) e } func resourceMetalOrganizationDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal resp, err := client.Organizations.Delete(d.Id()) diff --git a/equinix/resource_metal_port.go b/equinix/resource_metal_port.go index 7158d8587..c0d5c9a7d 100644 --- a/equinix/resource_metal_port.go +++ b/equinix/resource_metal_port.go @@ -140,7 +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 + 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..d537c0d7e 100644 --- a/equinix/resource_metal_port_vlan_attachment.go +++ b/equinix/resource_metal_port_vlan_attachment.go @@ -65,6 +65,7 @@ func resourceMetalPortVlanAttachment() *schema.Resource { } func resourceMetalPortVlanAttachmentCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal deviceID := d.Get("device_id").(string) pName := d.Get("port_name").(string) @@ -157,6 +158,7 @@ func resourceMetalPortVlanAttachmentCreate(d *schema.ResourceData, meta interfac } func resourceMetalPortVlanAttachmentRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal deviceID := d.Get("device_id").(string) pName := d.Get("port_name").(string) @@ -210,6 +212,7 @@ func resourceMetalPortVlanAttachmentRead(d *schema.ResourceData, meta interface{ } func resourceMetalPortVlanAttachmentUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal if d.HasChange("native") { native := d.Get("native").(bool) @@ -232,6 +235,7 @@ func resourceMetalPortVlanAttachmentUpdate(d *schema.ResourceData, meta interfac } func resourceMetalPortVlanAttachmentDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal pID := d.Get("port_id").(string) vlanID := d.Get("vlan_id").(string) diff --git a/equinix/resource_metal_project.go b/equinix/resource_metal_project.go index e5a952846..c802174ae 100644 --- a/equinix/resource_metal_project.go +++ b/equinix/resource_metal_project.go @@ -128,6 +128,7 @@ func expandBGPConfig(d *schema.ResourceData) packngo.CreateBGPConfigRequest { } func resourceMetalProjectCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal createRequest := &packngo.ProjectCreateRequest{ @@ -163,6 +164,7 @@ func resourceMetalProjectCreate(d *schema.ResourceData, meta interface{}) error } func resourceMetalProjectRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal proj, _, err := client.Projects.Get(d.Id(), nil) @@ -235,6 +237,7 @@ func flattenBGPConfig(l *packngo.BGPConfig) []map[string]interface{} { } func resourceMetalProjectUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal updateRequest := &packngo.ProjectUpdateRequest{} if d.HasChange("name") { @@ -286,6 +289,7 @@ func resourceMetalProjectUpdate(d *schema.ResourceData, meta interface{}) error } func resourceMetalProjectDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal resp, err := client.Projects.Delete(d.Id()) diff --git a/equinix/resource_metal_project_api_key.go b/equinix/resource_metal_project_api_key.go index d073c1903..bedc97452 100644 --- a/equinix/resource_metal_project_api_key.go +++ b/equinix/resource_metal_project_api_key.go @@ -47,6 +47,7 @@ func resourceMetalProjectAPIKey() *schema.Resource { } func resourceMetalAPIKeyCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal projectId := "" @@ -81,6 +82,7 @@ func projectIdFromResourceData(d *schema.ResourceData) string { } func resourceMetalAPIKeyRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal projectId := projectIdFromResourceData(d) @@ -131,6 +133,7 @@ func resourceMetalAPIKeyRead(d *schema.ResourceData, meta interface{}) error { } func resourceMetalAPIKeyDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal resp, err := client.APIKeys.Delete(d.Id()) diff --git a/equinix/resource_metal_reserved_ip_block.go b/equinix/resource_metal_reserved_ip_block.go index 3bdf268e1..1587fda05 100644 --- a/equinix/resource_metal_reserved_ip_block.go +++ b/equinix/resource_metal_reserved_ip_block.go @@ -231,7 +231,9 @@ func resourceMetalReservedIPBlock() *schema.Resource { } func resourceMetalReservedIPBlockCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal + quantity := d.Get("quantity").(int) typ := d.Get("type").(string) @@ -311,6 +313,7 @@ func resourceMetalReservedIPBlockCreate(d *schema.ResourceData, meta interface{} } func resourceMetalReservedIPBlockUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal id := d.Id() req := &packngo.IPAddressUpdateRequest{} @@ -449,9 +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 - id := d.Id() + 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") @@ -479,6 +483,7 @@ func resourceMetalReservedIPBlockRead(d *schema.ResourceData, meta interface{}) } func resourceMetalReservedIPBlockDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal id := d.Id() diff --git a/equinix/resource_metal_spot_market_request.go b/equinix/resource_metal_spot_market_request.go index 6891a6e59..cb4be71a3 100644 --- a/equinix/resource_metal_spot_market_request.go +++ b/equinix/resource_metal_spot_market_request.go @@ -171,6 +171,7 @@ func resourceMetalSpotMarketRequest() *schema.Resource { } func resourceMetalSpotMarketRequestCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal var waitForDevices bool @@ -312,6 +313,7 @@ func resourceMetalSpotMarketRequestCreate(d *schema.ResourceData, meta interface } func resourceMetalSpotMarketRequestRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal smr, _, err := client.SpotMarketRequests.Get(d.Id(), &packngo.GetOptions{Includes: []string{"project", "devices", "facilities", "metro"}}) @@ -351,6 +353,7 @@ func resourceMetalSpotMarketRequestRead(d *schema.ResourceData, meta interface{} } func resourceMetalSpotMarketRequestDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal var waitForDevices bool @@ -417,6 +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) + 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..49000d967 100644 --- a/equinix/resource_metal_ssh_key.go +++ b/equinix/resource_metal_ssh_key.go @@ -63,6 +63,7 @@ func resourceMetalSSHKey() *schema.Resource { } func resourceMetalSSHKeyCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal createRequest := &packngo.SSHKeyCreateRequest{ @@ -86,6 +87,7 @@ func resourceMetalSSHKeyCreate(d *schema.ResourceData, meta interface{}) error { } func resourceMetalSSHKeyRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal key, _, err := client.SSHKeys.Get(d.Id(), nil) @@ -121,6 +123,7 @@ func resourceMetalSSHKeyRead(d *schema.ResourceData, meta interface{}) error { } func resourceMetalSSHKeyUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal updateRequest := &packngo.SSHKeyUpdateRequest{} @@ -144,6 +147,7 @@ func resourceMetalSSHKeyUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceMetalSSHKeyDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal resp, err := client.SSHKeys.Delete(d.Id()) diff --git a/equinix/resource_metal_virtual_circuit.go b/equinix/resource_metal_virtual_circuit.go index cdc7267d3..c374f5cc3 100644 --- a/equinix/resource_metal_virtual_circuit.go +++ b/equinix/resource_metal_virtual_circuit.go @@ -139,6 +139,7 @@ func resourceMetalVirtualCircuit() *schema.Resource { } func resourceMetalVirtualCircuitCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal vncr := packngo.VCCreateRequest{ VirtualNetworkID: d.Get("vlan_id").(string), @@ -198,6 +199,7 @@ func resourceMetalVirtualCircuitCreate(d *schema.ResourceData, meta interface{}) } func resourceMetalVirtualCircuitRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal vcId := d.Id() @@ -284,6 +286,7 @@ 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 ur := packngo.VCUpdateRequest{} @@ -331,6 +334,7 @@ func resourceMetalVirtualCircuitUpdate(d *schema.ResourceData, meta interface{}) } func resourceMetalVirtualCircuitDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal // we first disconnect VLAN from the VC empty := "" diff --git a/equinix/resource_metal_vlan.go b/equinix/resource_metal_vlan.go index aa10287d9..4128d123d 100644 --- a/equinix/resource_metal_vlan.go +++ b/equinix/resource_metal_vlan.go @@ -74,6 +74,7 @@ func resourceMetalVlan() *schema.Resource { } func resourceMetalVlanCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal facRaw, facOk := d.GetOk("facility") @@ -107,6 +108,7 @@ func resourceMetalVlanCreate(d *schema.ResourceData, meta interface{}) error { } func resourceMetalVlanRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal vlan, _, err := client.ProjectVirtualNetworks.Get(d.Id(), @@ -129,7 +131,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 + 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..66da6ebc9 100644 --- a/equinix/resource_metal_vrf.go +++ b/equinix/resource_metal_vrf.go @@ -62,6 +62,7 @@ func resourceMetalVRF() *schema.Resource { } func resourceMetalVRFCreate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal createRequest := &packngo.VRFCreateRequest{ @@ -84,6 +85,7 @@ func resourceMetalVRFCreate(d *schema.ResourceData, meta interface{}) error { } func resourceMetalVRFUpdate(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal sPtr := func(s string) *string { return &s } @@ -113,6 +115,7 @@ func resourceMetalVRFUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceMetalVRFRead(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal getOpts := &packngo.GetOptions{Includes: []string{"project", "metro"}} @@ -140,6 +143,7 @@ func resourceMetalVRFRead(d *schema.ResourceData, meta interface{}) error { } func resourceMetalVRFDelete(d *schema.ResourceData, meta interface{}) error { + meta.(*Config).addModuleToMetalUserAgent(d) client := meta.(*Config).metal resp, err := client.VRFs.Delete(d.Id()) 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..8bf775e42 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