Skip to content

Commit

Permalink
Merge pull request #29140 from Marcelotsvaz/f-allowed-instance-types
Browse files Browse the repository at this point in the history
Add support for `instance_requirements.allowed_instance_types`
  • Loading branch information
ewbankkit committed Feb 25, 2023
2 parents a210df6 + 3804dd5 commit 5acce42
Show file tree
Hide file tree
Showing 13 changed files with 763 additions and 8 deletions.
19 changes: 19 additions & 0 deletions .changelog/29140.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
```release-note:enhancement
resource/aws_launch_template: Add `instance_requirements.allowed_instance_types` and `instance_requirements.network_bandwidth_gbps` arguments
```

```release-note:enhancement
resource/aws_ec2_fleet: Add `launch_template_config.override.instance_requirements.allowed_instance_types` and `launch_template_config.override.instance_requirements.network_bandwidth_gbps` arguments
```

```release-note:enhancement
resource/aws_spot_fleet_request: Add `launch_template_config.overrides.instance_requirements.allowed_instance_types` and `launch_template_config.overrides.instance_requirements.network_bandwidth_gbps` arguments
```

```release-note:enhancement
resource/aws_autoscaling_group: Add `mixed_instances_policy.launch_template.override.instance_requirements.allowed_instance_types` and `mixed_instances_policy.launch_template.override.instance_requirements.network_bandwidth_gbps` arguments
```

```release-note:enhancement
data-source/aws_launch_template: Add `instance_requirements.allowed_instance_types` and `instance_requirements.network_bandwidth_gbps` attributes
```
79 changes: 79 additions & 0 deletions internal/service/autoscaling/group.go
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,12 @@ func ResourceGroup() *schema.Resource {
ValidateFunc: validation.StringInSlice(autoscaling.AcceleratorType_Values(), false),
},
},
"allowed_instance_types": {
Type: schema.TypeSet,
Optional: true,
MaxItems: 400,
Elem: &schema.Schema{Type: schema.TypeString},
},
"bare_metal": {
Type: schema.TypeString,
Optional: true,
Expand Down Expand Up @@ -535,6 +541,25 @@ func ResourceGroup() *schema.Resource {
},
},
},
"network_bandwidth_gbps": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"max": {
Type: schema.TypeFloat,
Optional: true,
ValidateFunc: verify.FloatGreaterThan(0.0),
},
"min": {
Type: schema.TypeFloat,
Optional: true,
ValidateFunc: verify.FloatGreaterThan(0.0),
},
},
},
},
"network_interface_count": {
Type: schema.TypeList,
Optional: true,
Expand Down Expand Up @@ -2642,6 +2667,10 @@ func expandInstanceRequirements(tfMap map[string]interface{}) *autoscaling.Insta
apiObject.AcceleratorTypes = flex.ExpandStringSet(v)
}

if v, ok := tfMap["allowed_instance_types"].(*schema.Set); ok && v.Len() > 0 {
apiObject.AllowedInstanceTypes = flex.ExpandStringSet(v)
}

if v, ok := tfMap["bare_metal"].(string); ok && v != "" {
apiObject.BareMetal = aws.String(v)
}
Expand Down Expand Up @@ -2682,6 +2711,10 @@ func expandInstanceRequirements(tfMap map[string]interface{}) *autoscaling.Insta
apiObject.MemoryMiB = expandMemoryMiBRequest(v[0].(map[string]interface{}))
}

if v, ok := tfMap["network_bandwidth_gbps"].([]interface{}); ok && len(v) > 0 {
apiObject.NetworkBandwidthGbps = expandNetworkBandwidthGbpsRequest(v[0].(map[string]interface{}))
}

if v, ok := tfMap["network_interface_count"].([]interface{}); ok && len(v) > 0 {
apiObject.NetworkInterfaceCount = expandNetworkInterfaceCountRequest(v[0].(map[string]interface{}))
}
Expand Down Expand Up @@ -2809,6 +2842,26 @@ func expandMemoryMiBRequest(tfMap map[string]interface{}) *autoscaling.MemoryMiB
return apiObject
}

func expandNetworkBandwidthGbpsRequest(tfMap map[string]interface{}) *autoscaling.NetworkBandwidthGbpsRequest {
if tfMap == nil {
return nil
}

apiObject := &autoscaling.NetworkBandwidthGbpsRequest{}

var min float64
if v, ok := tfMap["min"].(float64); ok {
min = v
apiObject.Min = aws.Float64(v)
}

if v, ok := tfMap["max"].(float64); ok && v >= min {
apiObject.Max = aws.Float64(v)
}

return apiObject
}

func expandNetworkInterfaceCountRequest(tfMap map[string]interface{}) *autoscaling.NetworkInterfaceCountRequest {
if tfMap == nil {
return nil
Expand Down Expand Up @@ -3309,6 +3362,10 @@ func flattenInstanceRequirements(apiObject *autoscaling.InstanceRequirements) ma
tfMap["accelerator_types"] = aws.StringValueSlice(v)
}

if v := apiObject.AllowedInstanceTypes; v != nil {
tfMap["allowed_instance_types"] = aws.StringValueSlice(v)
}

if v := apiObject.BareMetal; v != nil {
tfMap["bare_metal"] = aws.StringValue(v)
}
Expand Down Expand Up @@ -3349,6 +3406,10 @@ func flattenInstanceRequirements(apiObject *autoscaling.InstanceRequirements) ma
tfMap["memory_mib"] = []interface{}{flattenMemoryMiB(v)}
}

if v := apiObject.NetworkBandwidthGbps; v != nil {
tfMap["network_bandwidth_gbps"] = []interface{}{flattenNetworkBandwidthGbps(v)}
}

if v := apiObject.NetworkInterfaceCount; v != nil {
tfMap["network_interface_count"] = []interface{}{flattenNetworkInterfaceCount(v)}
}
Expand Down Expand Up @@ -3466,6 +3527,24 @@ func flattenMemoryMiB(apiObject *autoscaling.MemoryMiBRequest) map[string]interf
return tfMap
}

func flattenNetworkBandwidthGbps(apiObject *autoscaling.NetworkBandwidthGbpsRequest) map[string]interface{} {
if apiObject == nil {
return nil
}

tfMap := map[string]interface{}{}

if v := apiObject.Max; v != nil {
tfMap["max"] = aws.Float64Value(v)
}

if v := apiObject.Min; v != nil {
tfMap["min"] = aws.Float64Value(v)
}

return tfMap
}

func flattenNetworkInterfaceCount(apiObject *autoscaling.NetworkInterfaceCountRequest) map[string]interface{} {
if apiObject == nil {
return nil
Expand Down
147 changes: 147 additions & 0 deletions internal/service/autoscaling/group_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2309,6 +2309,66 @@ func TestAccAutoScalingGroup_MixedInstancesPolicyLaunchTemplateOverride_instance
})
}

func TestAccAutoScalingGroup_MixedInstancesPolicyLaunchTemplateOverride_instanceRequirements_allowedInstanceTypes(t *testing.T) {
ctx := acctest.Context(t)
var group autoscaling.Group
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
resourceName := "aws_autoscaling_group.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t) },
ErrorCheck: acctest.ErrorCheck(t, autoscaling.EndpointsID),
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
CheckDestroy: testAccCheckGroupDestroy(ctx),
Steps: []resource.TestStep{
{
Config: testAccGroupConfig_mixedInstancesPolicyLaunchTemplateOverrideInstanceRequirements(rName,
`allowed_instance_types = ["m4.large"]
memory_mib {
min = 500
}
vcpu_count {
min = 1
}`),
Check: resource.ComposeTestCheckFunc(
testAccCheckGroupExists(ctx, resourceName, &group),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.#", "1"),

resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.0.allowed_instance_types.#", "1"),
resource.TestCheckTypeSetElemAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.0.allowed_instance_types.*", "m4.large"),
),
},
testAccGroupImportStep(resourceName),
{
Config: testAccGroupConfig_mixedInstancesPolicyLaunchTemplateOverrideInstanceRequirements(rName,
`allowed_instance_types = ["m4.large", "m5.*", "m6*"]
memory_mib {
min = 500
}
vcpu_count {
min = 1
}`),
Check: resource.ComposeTestCheckFunc(
testAccCheckGroupExists(ctx, resourceName, &group),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.#", "1"),

resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.0.allowed_instance_types.#", "3"),
resource.TestCheckTypeSetElemAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.0.allowed_instance_types.*", "m4.large"),
resource.TestCheckTypeSetElemAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.0.allowed_instance_types.*", "m5.*"),
resource.TestCheckTypeSetElemAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.0.allowed_instance_types.*", "m6*"),
),
},
testAccGroupImportStep(resourceName),
},
})
}

func TestAccAutoScalingGroup_MixedInstancesPolicyLaunchTemplateOverride_instanceRequirements_bareMetal(t *testing.T) {
ctx := acctest.Context(t)
var group autoscaling.Group
Expand Down Expand Up @@ -2949,6 +3009,93 @@ func TestAccAutoScalingGroup_MixedInstancesPolicyLaunchTemplateOverride_instance
})
}

func TestAccAutoScalingGroup_MixedInstancesPolicyLaunchTemplateOverride_instanceRequirements_networkBandwidthGbps(t *testing.T) {
ctx := acctest.Context(t)
var group autoscaling.Group
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
resourceName := "aws_autoscaling_group.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t) },
ErrorCheck: acctest.ErrorCheck(t, autoscaling.EndpointsID),
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
CheckDestroy: testAccCheckGroupDestroy(ctx),
Steps: []resource.TestStep{
{
Config: testAccGroupConfig_mixedInstancesPolicyLaunchTemplateOverrideInstanceRequirements(rName,
`network_bandwidth_gbps {
min = 1.5
}
memory_mib {
min = 500
}
vcpu_count {
min = 1
}`),
Check: resource.ComposeTestCheckFunc(
testAccCheckGroupExists(ctx, resourceName, &group),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.#", "1"),

resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.0.network_bandwidth_gbps.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.0.network_bandwidth_gbps.0.min", "1.5"),
),
},
testAccGroupImportStep(resourceName),
{
Config: testAccGroupConfig_mixedInstancesPolicyLaunchTemplateOverrideInstanceRequirements(rName,
`network_bandwidth_gbps {
max = 200
}
memory_mib {
min = 500
}
vcpu_count {
min = 1
}`),
Check: resource.ComposeTestCheckFunc(
testAccCheckGroupExists(ctx, resourceName, &group),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.#", "1"),

resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.0.network_bandwidth_gbps.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.0.network_bandwidth_gbps.0.max", "200"),
),
},
testAccGroupImportStep(resourceName),
{
Config: testAccGroupConfig_mixedInstancesPolicyLaunchTemplateOverrideInstanceRequirements(rName,
`network_bandwidth_gbps {
min = 2.5
max = 250
}
memory_mib {
min = 500
}
vcpu_count {
min = 1
}`),
Check: resource.ComposeTestCheckFunc(
testAccCheckGroupExists(ctx, resourceName, &group),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.#", "1"),

resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.0.network_bandwidth_gbps.#", "1"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.0.network_bandwidth_gbps.0.min", "2.5"),
resource.TestCheckResourceAttr(resourceName, "mixed_instances_policy.0.launch_template.0.override.0.instance_requirements.0.network_bandwidth_gbps.0.max", "250"),
),
},
testAccGroupImportStep(resourceName),
},
})
}

func TestAccAutoScalingGroup_MixedInstancesPolicyLaunchTemplateOverride_instanceRequirements_networkInterfaceCount(t *testing.T) {
ctx := acctest.Context(t)
var group autoscaling.Group
Expand Down
25 changes: 25 additions & 0 deletions internal/service/ec2/ec2_fleet.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,12 @@ func ResourceFleet() *schema.Resource {
ValidateFunc: validation.StringInSlice(ec2.AcceleratorType_Values(), false),
},
},
"allowed_instance_types": {
Type: schema.TypeSet,
Optional: true,
MaxItems: 400,
Elem: &schema.Schema{Type: schema.TypeString},
},
"bare_metal": {
Type: schema.TypeString,
Optional: true,
Expand Down Expand Up @@ -282,6 +288,25 @@ func ResourceFleet() *schema.Resource {
},
},
},
"network_bandwidth_gbps": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"max": {
Type: schema.TypeFloat,
Optional: true,
ValidateFunc: verify.FloatGreaterThan(0.0),
},
"min": {
Type: schema.TypeFloat,
Optional: true,
ValidateFunc: verify.FloatGreaterThan(0.0),
},
},
},
},
"network_interface_count": {
Type: schema.TypeList,
Optional: true,
Expand Down
Loading

0 comments on commit 5acce42

Please sign in to comment.