Skip to content

Commit

Permalink
fix(cvm): Fix optional parameters never being omitted from requests
Browse files Browse the repository at this point in the history
Initially noticed this problem when I tried to create a launch template containing the following block:

```
internet_accessible {
  public_ip_assigned = true
  internet_max_bandwidth_out = 100
}
```

This resulted in an error during apply like this:

```
Code=InvalidParameterValue, Message=The value `` specified in the parameter `.InternetAccessible.InternetChargeType` is invalid.
```

I figured okay, I'll just add what should be the defaults and get on with it. But ultimately I got the same error from the `BandwidthPackageId` field. There is no good default value for it, so I was unable to make the launch template.

Turns out that throughout the SDK, all scalar fields are always included, at least wherever `InterfacesHeadMap` is used. The value of the individual fields is never checked, so every field ends up being sent, with the default value being not the default value defined in the schema, but the default value for the data type, which is definitely wrong. Since the default value for strings is an empty string, any field inside a block that takes an ID parameter of some kind will fail with an API validation error.

In this commit I've only fixed the `internet_accessible` block for launch templates, but ultimately all locations where `InterfacesHeadMap` (and possibly others, I haven't investigated that much) need to be updated.

FWIW, the AWS Terraform provider uses this very same way of dealing with this issue.
  • Loading branch information
Jalle19 committed Dec 2, 2024
1 parent 278c252 commit 642dec8
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions tencentcloud/services/cvm/resource_tc_cvm_launch_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -738,17 +738,17 @@ func resourceTencentCloudCvmLaunchTemplateCreate(d *schema.ResourceData, meta in

if dMap, ok := helper.InterfacesHeadMap(d, "internet_accessible"); ok {
internetAccessible := cvm.InternetAccessible{}
if v, ok := dMap["internet_charge_type"]; ok {
internetAccessible.InternetChargeType = helper.String(v.(string))
if v, ok := dMap["internet_charge_type"].(string); ok && v != "" {
internetAccessible.InternetChargeType = helper.String(v)
}
if v, ok := dMap["internet_max_bandwidth_out"]; ok {
internetAccessible.InternetMaxBandwidthOut = helper.IntInt64(v.(int))
if v, ok := dMap["internet_max_bandwidth_out"].(int); ok && v != 0 {
internetAccessible.InternetMaxBandwidthOut = helper.IntInt64(v)
}
if v, ok := dMap["public_ip_assigned"]; ok {
internetAccessible.PublicIpAssigned = helper.Bool(v.(bool))
if v, ok := dMap["public_ip_assigned"].(bool); ok && v {
internetAccessible.PublicIpAssigned = helper.Bool(v)
}
if v, ok := dMap["bandwidth_package_id"]; ok {
internetAccessible.BandwidthPackageId = helper.String(v.(string))
if v, ok := dMap["bandwidth_package_id"].(string); ok && v != "" {
internetAccessible.BandwidthPackageId = helper.String(v)
}
request.InternetAccessible = &internetAccessible
}
Expand Down

0 comments on commit 642dec8

Please sign in to comment.