diff --git a/alicloud/resource_alicloud_ess_scaling_group.go b/alicloud/resource_alicloud_ess_scaling_group.go index d3ba2f4a6b6e..dc4537683e37 100644 --- a/alicloud/resource_alicloud_ess_scaling_group.go +++ b/alicloud/resource_alicloud_ess_scaling_group.go @@ -186,6 +186,33 @@ func resourceAlicloudEssScalingGroup() *schema.Resource { Optional: true, Computed: true, }, + "compensate_with_on_demand": { + Type: schema.TypeBool, + Optional: true, + Computed: true, + }, + "capacity_options_on_demand_base_capacity": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + ValidateFunc: IntBetween(0, 1000), + }, + "capacity_options_on_demand_percentage_above_base_capacity": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + ValidateFunc: IntBetween(0, 100), + }, + "capacity_options_compensate_with_on_demand": { + Type: schema.TypeBool, + Optional: true, + Computed: true, + }, + "capacity_options_spot_auto_replace_on_demand": { + Type: schema.TypeBool, + Optional: true, + Computed: true, + }, "resource_group_id": { Type: schema.TypeString, Optional: true, @@ -331,7 +358,9 @@ func resourceAliyunEssScalingGroupRead(d *schema.ResourceData, meta interface{}) if object["SpotInstancePools"] != nil { d.Set("spot_instance_pools", object["SpotInstancePools"]) } + d.Set("spot_instance_remedy", object["SpotInstanceRemedy"]) + d.Set("compensate_with_on_demand", object["CompensateWithOnDemand"]) d.Set("group_deletion_protection", object["GroupDeletionProtection"]) var polices []string if len(object["RemovalPolicies"].(map[string]interface{})["RemovalPolicy"].([]interface{})) > 0 { @@ -393,6 +422,22 @@ func resourceAliyunEssScalingGroupRead(d *schema.ResourceData, meta interface{}) } } + if v := object["CapacityOptions"]; v != nil { + m := v.(map[string]interface{}) + if m["OnDemandBaseCapacity"] != nil { + d.Set("capacity_options_on_demand_base_capacity", m["OnDemandBaseCapacity"]) + } + if m["OnDemandPercentageAboveBaseCapacity"] != nil { + d.Set("capacity_options_on_demand_percentage_above_base_capacity", m["OnDemandPercentageAboveBaseCapacity"]) + } + if m["CompensateWithOnDemand"] != nil { + d.Set("capacity_options_compensate_with_on_demand", m["CompensateWithOnDemand"]) + } + if m["SpotAutoReplaceOnDemand"] != nil { + d.Set("capacity_options_spot_auto_replace_on_demand", m["SpotAutoReplaceOnDemand"]) + } + } + if v := object["AlbServerGroups"]; v != nil { result := make([]map[string]interface{}, 0) if w, ok := d.GetOk("alb_server_group"); ok { @@ -540,10 +585,40 @@ func resourceAliyunEssScalingGroupUpdate(d *schema.ResourceData, meta interface{ request["SpotInstancePools"] = requests.NewInteger(d.Get("spot_instance_pools").(int)) } + if d.HasChange("capacity_options_on_demand_base_capacity") { + if v, ok := d.GetOkExists("capacity_options_on_demand_base_capacity"); ok { + request["CapacityOptions.OnDemandBaseCapacity"] = requests.NewInteger(v.(int)) + } + } + + if d.HasChange("capacity_options_on_demand_percentage_above_base_capacity") { + if v, ok := d.GetOkExists("capacity_options_on_demand_percentage_above_base_capacity"); ok { + request["CapacityOptions.OnDemandPercentageAboveBaseCapacity"] = requests.NewInteger(v.(int)) + } + } + + if d.HasChange("capacity_options_compensate_with_on_demand") { + if v, ok := d.GetOkExists("capacity_options_compensate_with_on_demand"); ok { + request["CapacityOptions.CompensateWithOnDemand"] = requests.NewBoolean(v.(bool)) + } + } + + if d.HasChange("capacity_options_spot_auto_replace_on_demand") { + if v, ok := d.GetOkExists("capacity_options_spot_auto_replace_on_demand"); ok { + request["CapacityOptions.SpotAutoReplaceOnDemand"] = requests.NewBoolean(v.(bool)) + } + } + if d.HasChange("spot_instance_remedy") { request["SpotInstanceRemedy"] = requests.NewBoolean(d.Get("spot_instance_remedy").(bool)) } + if d.HasChange("compensate_with_on_demand") { + if v, ok := d.GetOkExists("compensate_with_on_demand"); ok { + request["CompensateWithOnDemand"] = requests.NewBoolean(v.(bool)) + } + } + if d.HasChange("az_balance") { request["AzBalance"] = requests.NewBoolean(d.Get("az_balance").(bool)) } @@ -765,10 +840,29 @@ func buildAlicloudEssScalingGroupArgs(d *schema.ResourceData, meta interface{}) request["SpotInstancePools"] = v } + if v, ok := d.GetOkExists("capacity_options_on_demand_base_capacity"); ok { + request["CapacityOptions.OnDemandBaseCapacity"] = v + } + if v, ok := d.GetOkExists("capacity_options_on_demand_percentage_above_base_capacity"); ok { + request["CapacityOptions.OnDemandPercentageAboveBaseCapacity"] = v + } + + if v, ok := d.GetOkExists("capacity_options_compensate_with_on_demand"); ok { + request["CapacityOptions.CompensateWithOnDemand"] = v + } + + if v, ok := d.GetOkExists("capacity_options_spot_auto_replace_on_demand"); ok { + request["CapacityOptions.SpotAutoReplaceOnDemand"] = v + } + if v, ok := d.GetOk("spot_instance_remedy"); ok { request["SpotInstanceRemedy"] = v } + if v, ok := d.GetOkExists("compensate_with_on_demand"); ok { + request["CompensateWithOnDemand"] = v + } + if v, ok := d.GetOk("health_check_type"); ok { request["HealthCheckType"] = v } diff --git a/alicloud/resource_alicloud_ess_scaling_group_test.go b/alicloud/resource_alicloud_ess_scaling_group_test.go index 225c991e1728..68f3ccdafe0e 100644 --- a/alicloud/resource_alicloud_ess_scaling_group_test.go +++ b/alicloud/resource_alicloud_ess_scaling_group_test.go @@ -904,12 +904,14 @@ func TestAccAliCloudEssScalingGroup_costoptimized(t *testing.T) { "on_demand_base_capacity": "10", "on_demand_percentage_above_base_capacity": "10", "spot_instance_pools": "10", + "compensate_with_on_demand": "false", "spot_instance_remedy": "true", "group_deletion_protection": "true", }), Check: resource.ComposeTestCheckFunc( testAccCheck(map[string]string{ "group_deletion_protection": "true", + "compensate_with_on_demand": "false", }), ), }, @@ -925,6 +927,7 @@ func TestAccAliCloudEssScalingGroup_costoptimized(t *testing.T) { "on_demand_base_capacity": "0", "on_demand_percentage_above_base_capacity": "0", "spot_instance_pools": "10", + "compensate_with_on_demand": "true", "spot_instance_remedy": "true", "group_deletion_protection": "true", }), @@ -932,6 +935,7 @@ func TestAccAliCloudEssScalingGroup_costoptimized(t *testing.T) { testAccCheck(map[string]string{ "on_demand_base_capacity": "0", "on_demand_percentage_above_base_capacity": "0", + "compensate_with_on_demand": "true", }), ), }, @@ -948,6 +952,7 @@ func TestAccAliCloudEssScalingGroup_costoptimized(t *testing.T) { "on_demand_percentage_above_base_capacity": "8", "spot_instance_pools": "10", "spot_instance_remedy": "true", + "compensate_with_on_demand": "true", "group_deletion_protection": "true", }), Check: resource.ComposeTestCheckFunc( @@ -969,12 +974,14 @@ func TestAccAliCloudEssScalingGroup_costoptimized(t *testing.T) { "on_demand_base_capacity": "8", "on_demand_percentage_above_base_capacity": "8", "spot_instance_pools": "8", + "compensate_with_on_demand": "false", "spot_instance_remedy": "true", "group_deletion_protection": "false", }), Check: resource.ComposeTestCheckFunc( testAccCheck(map[string]string{ "spot_instance_pools": "8", + "compensate_with_on_demand": "false", "group_deletion_protection": "false", }), ), @@ -984,6 +991,564 @@ func TestAccAliCloudEssScalingGroup_costoptimized(t *testing.T) { } +func TestAccAliCloudEssScalingGroup_costoptimizedSupply(t *testing.T) { + rand := acctest.RandIntRange(10000, 999999) + var v ess.ScalingGroup + resourceId := "alicloud_ess_scaling_group.default" + + basicMap := map[string]string{ + "min_size": "1", + "max_size": "1", + "default_cooldown": "20", + "scaling_group_name": fmt.Sprintf("tf-testAccEssScalingGroup-%d", rand), + "vswitch_ids.#": "2", + "removal_policies.#": "2", + "on_demand_base_capacity": "10", + "spot_instance_pools": "10", + "spot_instance_remedy": "false", + "group_deletion_protection": "false", + "on_demand_percentage_above_base_capacity": "10", + "compensate_with_on_demand": "false", + } + + ra := resourceAttrInit(resourceId, basicMap) + rc := resourceCheckInit(resourceId, &v, func() interface{} { + return &EssService{testAccProvider.Meta().(*connectivity.AliyunClient)} + }) + rac := resourceAttrCheckInit(rc, ra) + testAccCheck := rac.resourceAttrMapUpdateSet() + name := fmt.Sprintf("tf-testAccEssScalingGroup-%d", rand) + testAccConfig := resourceTestAccConfigFunc(resourceId, name, resourceEssScalingGroupDependence) + resource.Test(t, resource.TestCase{ + PreCheck: func() { + testAccPreCheck(t) + }, + + // module name + IDRefreshName: resourceId, + + Providers: testAccProviders, + CheckDestroy: testAccCheckEssScalingGroupDestroy, + Steps: []resource.TestStep{ + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "10", + "on_demand_percentage_above_base_capacity": "10", + "spot_instance_pools": "10", + "compensate_with_on_demand": "false", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(nil), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "10", + "on_demand_percentage_above_base_capacity": "10", + "spot_instance_pools": "10", + "spot_instance_remedy": "true", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "spot_instance_remedy": "true", + }), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "10", + "on_demand_percentage_above_base_capacity": "10", + "spot_instance_pools": "10", + "spot_instance_remedy": "true", + "group_deletion_protection": "true", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "group_deletion_protection": "true", + }), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "0", + "on_demand_percentage_above_base_capacity": "0", + "spot_instance_pools": "10", + "spot_instance_remedy": "true", + "group_deletion_protection": "true", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "on_demand_base_capacity": "0", + "on_demand_percentage_above_base_capacity": "0", + }), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "8", + "on_demand_percentage_above_base_capacity": "8", + "spot_instance_pools": "10", + "spot_instance_remedy": "true", + "group_deletion_protection": "true", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "on_demand_base_capacity": "8", + "on_demand_percentage_above_base_capacity": "8", + }), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "8", + "on_demand_percentage_above_base_capacity": "8", + "spot_instance_pools": "8", + "spot_instance_remedy": "true", + "group_deletion_protection": "false", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "spot_instance_pools": "8", + "group_deletion_protection": "false", + }), + ), + }, + }, + }) + +} + +func TestAccAliCloudEssScalingGroup_costoptimized_capacityOptions(t *testing.T) { + rand := acctest.RandIntRange(10000, 999999) + var v ess.ScalingGroup + resourceId := "alicloud_ess_scaling_group.default" + + basicMap := map[string]string{ + "min_size": "1", + "max_size": "1", + "default_cooldown": "20", + "scaling_group_name": fmt.Sprintf("tf-testAccEssScalingGroup-%d", rand), + "vswitch_ids.#": "2", + "removal_policies.#": "2", + "on_demand_base_capacity": "10", + "spot_instance_pools": "10", + "spot_instance_remedy": "false", + "group_deletion_protection": "false", + "on_demand_percentage_above_base_capacity": "10", + "capacity_options_on_demand_base_capacity": "10", + "capacity_options_on_demand_percentage_above_base_capacity": "10", + "capacity_options_compensate_with_on_demand": "true", + "capacity_options_spot_auto_replace_on_demand": "true", + } + + ra := resourceAttrInit(resourceId, basicMap) + rc := resourceCheckInit(resourceId, &v, func() interface{} { + return &EssService{testAccProvider.Meta().(*connectivity.AliyunClient)} + }) + rac := resourceAttrCheckInit(rc, ra) + testAccCheck := rac.resourceAttrMapUpdateSet() + name := fmt.Sprintf("tf-testAccEssScalingGroup-%d", rand) + testAccConfig := resourceTestAccConfigFunc(resourceId, name, resourceEssScalingGroupDependence) + resource.Test(t, resource.TestCase{ + PreCheck: func() { + testAccPreCheck(t) + }, + + // module name + IDRefreshName: resourceId, + + Providers: testAccProviders, + CheckDestroy: testAccCheckEssScalingGroupDestroy, + Steps: []resource.TestStep{ + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "10", + "on_demand_percentage_above_base_capacity": "10", + "spot_instance_pools": "10", + "capacity_options_on_demand_base_capacity": "10", + "capacity_options_on_demand_percentage_above_base_capacity": "10", + "capacity_options_compensate_with_on_demand": "true", + "capacity_options_spot_auto_replace_on_demand": "true", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(nil), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "1", + "on_demand_percentage_above_base_capacity": "1", + "spot_instance_pools": "10", + "spot_instance_remedy": "true", + "capacity_options_on_demand_base_capacity": "1", + "capacity_options_on_demand_percentage_above_base_capacity": "1", + "capacity_options_compensate_with_on_demand": "false", + "capacity_options_spot_auto_replace_on_demand": "false", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "spot_instance_remedy": "true", + "capacity_options_on_demand_base_capacity": "1", + "capacity_options_on_demand_percentage_above_base_capacity": "1", + "capacity_options_compensate_with_on_demand": "false", + "capacity_options_spot_auto_replace_on_demand": "false", + "on_demand_base_capacity": "1", + "on_demand_percentage_above_base_capacity": "1", + }), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "1", + "on_demand_percentage_above_base_capacity": "1", + "spot_instance_pools": "10", + "spot_instance_remedy": "true", + "group_deletion_protection": "true", + "capacity_options_on_demand_base_capacity": "1", + "capacity_options_on_demand_percentage_above_base_capacity": "1", + "capacity_options_compensate_with_on_demand": "false", + "capacity_options_spot_auto_replace_on_demand": "false", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "group_deletion_protection": "true", + }), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "0", + "on_demand_percentage_above_base_capacity": "0", + "spot_instance_pools": "10", + "spot_instance_remedy": "true", + "group_deletion_protection": "true", + "capacity_options_on_demand_base_capacity": "0", + "capacity_options_on_demand_percentage_above_base_capacity": "0", + "capacity_options_compensate_with_on_demand": "true", + "capacity_options_spot_auto_replace_on_demand": "false", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "on_demand_base_capacity": "0", + "on_demand_percentage_above_base_capacity": "0", + "capacity_options_compensate_with_on_demand": "true", + "capacity_options_on_demand_base_capacity": "0", + "capacity_options_on_demand_percentage_above_base_capacity": "0", + }), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "8", + "on_demand_percentage_above_base_capacity": "8", + "spot_instance_pools": "10", + "spot_instance_remedy": "true", + "group_deletion_protection": "true", + "capacity_options_on_demand_base_capacity": "8", + "capacity_options_on_demand_percentage_above_base_capacity": "8", + "capacity_options_compensate_with_on_demand": "true", + "capacity_options_spot_auto_replace_on_demand": "false", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "on_demand_base_capacity": "8", + "on_demand_percentage_above_base_capacity": "8", + "capacity_options_on_demand_base_capacity": "8", + "capacity_options_on_demand_percentage_above_base_capacity": "8", + "capacity_options_compensate_with_on_demand": "true", + }), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "8", + "on_demand_percentage_above_base_capacity": "8", + "spot_instance_pools": "8", + "spot_instance_remedy": "true", + "group_deletion_protection": "false", + "capacity_options_on_demand_base_capacity": "8", + "capacity_options_on_demand_percentage_above_base_capacity": "8", + "capacity_options_compensate_with_on_demand": "false", + "capacity_options_spot_auto_replace_on_demand": "false", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "spot_instance_pools": "8", + "group_deletion_protection": "false", + "capacity_options_compensate_with_on_demand": "false", + "capacity_options_on_demand_percentage_above_base_capacity": "8", + "on_demand_base_capacity": "8", + "capacity_options_on_demand_base_capacity": "8", + }), + ), + }, + }, + }) + +} + +func TestAccAliCloudEssScalingGroup_costoptimized_capacityOptionsSupply(t *testing.T) { + rand := acctest.RandIntRange(10000, 999999) + var v ess.ScalingGroup + resourceId := "alicloud_ess_scaling_group.default" + + basicMap := map[string]string{ + "min_size": "1", + "max_size": "1", + "default_cooldown": "20", + "scaling_group_name": fmt.Sprintf("tf-testAccEssScalingGroup-%d", rand), + "vswitch_ids.#": "2", + "removal_policies.#": "2", + "on_demand_base_capacity": "10", + "spot_instance_pools": "10", + "spot_instance_remedy": "false", + "group_deletion_protection": "false", + "on_demand_percentage_above_base_capacity": "10", + } + + ra := resourceAttrInit(resourceId, basicMap) + rc := resourceCheckInit(resourceId, &v, func() interface{} { + return &EssService{testAccProvider.Meta().(*connectivity.AliyunClient)} + }) + rac := resourceAttrCheckInit(rc, ra) + testAccCheck := rac.resourceAttrMapUpdateSet() + name := fmt.Sprintf("tf-testAccEssScalingGroup-%d", rand) + testAccConfig := resourceTestAccConfigFunc(resourceId, name, resourceEssScalingGroupDependence) + resource.Test(t, resource.TestCase{ + PreCheck: func() { + testAccPreCheck(t) + }, + + // module name + IDRefreshName: resourceId, + + Providers: testAccProviders, + CheckDestroy: testAccCheckEssScalingGroupDestroy, + Steps: []resource.TestStep{ + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "10", + "on_demand_percentage_above_base_capacity": "10", + "spot_instance_pools": "10", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(nil), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "1", + "on_demand_percentage_above_base_capacity": "1", + "spot_instance_pools": "10", + "spot_instance_remedy": "true", + "capacity_options_on_demand_base_capacity": "1", + "capacity_options_on_demand_percentage_above_base_capacity": "1", + "capacity_options_compensate_with_on_demand": "false", + "capacity_options_spot_auto_replace_on_demand": "false", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "spot_instance_remedy": "true", + "capacity_options_on_demand_base_capacity": "1", + "capacity_options_on_demand_percentage_above_base_capacity": "1", + "capacity_options_compensate_with_on_demand": "false", + "capacity_options_spot_auto_replace_on_demand": "false", + "on_demand_base_capacity": "1", + "on_demand_percentage_above_base_capacity": "1", + }), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "0", + "on_demand_percentage_above_base_capacity": "0", + "spot_instance_pools": "10", + "spot_instance_remedy": "true", + "capacity_options_on_demand_base_capacity": "0", + "capacity_options_on_demand_percentage_above_base_capacity": "0", + "capacity_options_compensate_with_on_demand": "true", + "capacity_options_spot_auto_replace_on_demand": "false", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "on_demand_base_capacity": "0", + "on_demand_percentage_above_base_capacity": "0", + "capacity_options_compensate_with_on_demand": "true", + "capacity_options_on_demand_base_capacity": "0", + "capacity_options_on_demand_percentage_above_base_capacity": "0", + }), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "8", + "on_demand_percentage_above_base_capacity": "8", + "spot_instance_pools": "10", + "spot_instance_remedy": "true", + "capacity_options_on_demand_base_capacity": "8", + "capacity_options_on_demand_percentage_above_base_capacity": "8", + "capacity_options_compensate_with_on_demand": "true", + "capacity_options_spot_auto_replace_on_demand": "false", + "group_deletion_protection": "true", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "on_demand_base_capacity": "8", + "on_demand_percentage_above_base_capacity": "8", + "capacity_options_on_demand_base_capacity": "8", + "capacity_options_on_demand_percentage_above_base_capacity": "8", + "capacity_options_compensate_with_on_demand": "true", + "group_deletion_protection": "true", + }), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "min_size": "1", + "max_size": "1", + "scaling_group_name": "${var.name}", + "default_cooldown": "20", + "vswitch_ids": []string{"${alicloud_vswitch.default.id}", "${alicloud_vswitch.default2.id}"}, + "removal_policies": []string{"OldestInstance", "NewestInstance"}, + "multi_az_policy": "COST_OPTIMIZED", + "on_demand_base_capacity": "8", + "on_demand_percentage_above_base_capacity": "8", + "spot_instance_pools": "8", + "spot_instance_remedy": "true", + "group_deletion_protection": "false", + "capacity_options_on_demand_base_capacity": "8", + "capacity_options_on_demand_percentage_above_base_capacity": "8", + "capacity_options_compensate_with_on_demand": "false", + "capacity_options_spot_auto_replace_on_demand": "false", + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "spot_instance_pools": "8", + "group_deletion_protection": "false", + "capacity_options_compensate_with_on_demand": "false", + "capacity_options_on_demand_percentage_above_base_capacity": "8", + "on_demand_base_capacity": "8", + "capacity_options_on_demand_base_capacity": "8", + }), + ), + }, + }, + }) + +} + func TestAccAliCloudEssScalingGroup_composable(t *testing.T) { rand := acctest.RandIntRange(10000, 999999) var v ess.ScalingGroup @@ -2896,6 +3461,14 @@ func resourceEssScalingGroupAlbServerGroup(name string) string { health_check_config { health_check_enabled = "false" } + slow_start_config { + slow_start_duration = 30 + slow_start_enabled = "true" + } + connection_drain_config { + connection_drain_enabled = "true" + connection_drain_timeout = 300 + } sticky_session_config { sticky_session_enabled = true cookie = "tf-testAcc" diff --git a/website/docs/r/ess_scaling_group.html.markdown b/website/docs/r/ess_scaling_group.html.markdown index 0579156fe15d..4bf7d6e4ec99 100644 --- a/website/docs/r/ess_scaling_group.html.markdown +++ b/website/docs/r/ess_scaling_group.html.markdown @@ -140,6 +140,11 @@ The following arguments are supported: * `spot_allocation_strategy` - (Optional, Available since v1.225.1) The allocation policy of preemptible instances. You can use this parameter to individually specify the allocation policy for preemptible instances. This parameter takes effect only if you set MultiAZPolicy to COMPOSABLE. * `allocation_strategy` - (Optional, Available since v1.225.1) The allocation policy of instances. Auto Scaling selects instance types based on the allocation policy to create instances. The policy can be applied to pay-as-you-go instances and preemptible instances. This parameter takes effect only if you set MultiAZPolicy to COMPOSABLE. * `on_demand_base_capacity` - (Optional, Available since v1.54.0) The minimum amount of the Auto Scaling group's capacity that must be fulfilled by On-Demand Instances. This base portion is provisioned first as your group scales. +* `compensate_with_on_demand` - (Optional, Available since v1.245.0) Specifies whether to automatically create pay-as-you-go instances to meet the requirement on the number of ECS instances when the expected capacity of preemptible instances cannot be provided due to reasons such as cost-related issues and insufficient resources. This parameter is supported only if you set 'multi_az_policy' to COST_OPTIMIZED. Valid values: true, false. +* `capacity_options_on_demand_base_capacity` - (Optional, Available since v1.245.0) The minimum number of pay-as-you-go instances that must be contained in the scaling group. When the actual number of pay-as-you-go instances in the scaling group drops below the value of this parameter, Auto Scaling preferentially creates pay-as-you-go instances. Valid values: 0 to 1000. If you set 'multi_az_policy' to COMPOSABLE, the default value of this parameter is 0. +* `capacity_options_on_demand_percentage_above_base_capacity` - (Optional, Available since v1.245.0) The percentage of pay-as-you-go instances in the excess instances when the minimum number of pay-as-you-go instances is reached. 'on_demand_base_capacity' specifies the minimum number of pay-as-you-go instances that must be contained in the scaling group. Valid values: 0 to 100. If you set 'multi_az_policy' to COMPOSABLE, the default value of this parameter is 100. +* `capacity_options_compensate_with_on_demand` - (Optional, Available since v1.245.0) Specifies whether to automatically create pay-as-you-go instances to meet the requirement on the number of ECS instances when the expected capacity of preemptible instances cannot be provided due to reasons such as cost-related issues and insufficient resources. This parameter is supported only if you set 'multi_az_policy' to COST_OPTIMIZED. Valid values: true, false. +* `capacity_options_spot_auto_replace_on_demand` - (Optional, Available since v1.245.0) Specifies whether to replace pay-as-you-go instances with preemptible instances. If you specify 'compensate_with_on_demand', it may result in a higher percentage of pay-as-you-go instances compared to the value of 'on_demand_percentage_above_base_capacity'. If you specify this parameter, Auto Scaling preferentially deploys preemptible instances to replace the surplus pay-as-you-go instances when preemptible instance types are available. If you specify 'compensate_with_on_demand', Auto Scaling creates pay-as-you-go instances when preemptible instance types are insufficient. To avoid retaining these pay-as-you-go instances for extended periods, Auto Scaling attempts to replace them with preemptible instances when sufficient preemptible instance types become available. Valid values: true, false. * `on_demand_percentage_above_base_capacity` - (Optional, Available since v1.54.0) Controls the percentages of On-Demand Instances and Spot Instances for your additional capacity beyond OnDemandBaseCapacity. * `spot_instance_pools` - (Optional, Available since v1.54.0) The number of Spot pools to use to allocate your Spot capacity. The Spot pools is composed of instance types of lowest price. * `spot_instance_remedy` - (Optional, Available since v1.54.0) Whether to replace spot instances with newly created spot/onDemand instance when receive a spot recycling message.