221 lines
5.6 KiB
Go
221 lines
5.6 KiB
Go
package alicloud
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/denverdino/aliyungo/common"
|
|
"github.com/denverdino/aliyungo/ess"
|
|
"github.com/hashicorp/terraform/helper/resource"
|
|
"github.com/hashicorp/terraform/helper/schema"
|
|
"time"
|
|
)
|
|
|
|
func resourceAlicloudEssSchedule() *schema.Resource {
|
|
return &schema.Resource{
|
|
Create: resourceAliyunEssScheduleCreate,
|
|
Read: resourceAliyunEssScheduleRead,
|
|
Update: resourceAliyunEssScheduleUpdate,
|
|
Delete: resourceAliyunEssScheduleDelete,
|
|
|
|
Schema: map[string]*schema.Schema{
|
|
"scheduled_action": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
},
|
|
"launch_time": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
},
|
|
"scheduled_task_name": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Optional: true,
|
|
},
|
|
"description": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Computed: true,
|
|
Optional: true,
|
|
},
|
|
"launch_expiration_time": &schema.Schema{
|
|
Type: schema.TypeInt,
|
|
Default: 600,
|
|
Optional: true,
|
|
ValidateFunc: validateIntegerInRange(0, 21600),
|
|
},
|
|
"recurrence_type": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Computed: true,
|
|
Optional: true,
|
|
ValidateFunc: validateAllowedStringValue([]string{string(ess.Daily),
|
|
string(ess.Weekly), string(ess.Monthly)}),
|
|
},
|
|
"recurrence_value": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Computed: true,
|
|
Optional: true,
|
|
},
|
|
"recurrence_end_time": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Computed: true,
|
|
Optional: true,
|
|
},
|
|
"task_enabled": &schema.Schema{
|
|
Type: schema.TypeBool,
|
|
Default: true,
|
|
Optional: true,
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func resourceAliyunEssScheduleCreate(d *schema.ResourceData, meta interface{}) error {
|
|
|
|
args, err := buildAlicloudEssScheduleArgs(d, meta)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
essconn := meta.(*AliyunClient).essconn
|
|
|
|
rule, err := essconn.CreateScheduledTask(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
d.SetId(rule.ScheduledTaskId)
|
|
|
|
return resourceAliyunEssScheduleUpdate(d, meta)
|
|
}
|
|
|
|
func resourceAliyunEssScheduleRead(d *schema.ResourceData, meta interface{}) error {
|
|
|
|
client := meta.(*AliyunClient)
|
|
|
|
rule, err := client.DescribeScheduleById(d.Id())
|
|
if err != nil {
|
|
if e, ok := err.(*common.Error); ok && e.Code == InstanceNotfound {
|
|
d.SetId("")
|
|
return nil
|
|
}
|
|
return fmt.Errorf("Error Describe ESS schedule Attribute: %#v", err)
|
|
}
|
|
|
|
d.Set("scheduled_action", rule.ScheduledAction)
|
|
d.Set("launch_time", rule.LaunchTime)
|
|
d.Set("scheduled_task_name", rule.ScheduledTaskName)
|
|
d.Set("description", rule.Description)
|
|
d.Set("launch_expiration_time", rule.LaunchExpirationTime)
|
|
d.Set("recurrence_type", rule.RecurrenceType)
|
|
d.Set("recurrence_value", rule.RecurrenceValue)
|
|
d.Set("recurrence_end_time", rule.RecurrenceEndTime)
|
|
d.Set("task_enabled", rule.TaskEnabled)
|
|
|
|
return nil
|
|
}
|
|
|
|
func resourceAliyunEssScheduleUpdate(d *schema.ResourceData, meta interface{}) error {
|
|
|
|
conn := meta.(*AliyunClient).essconn
|
|
|
|
args := &ess.ModifyScheduledTaskArgs{
|
|
ScheduledTaskId: d.Id(),
|
|
}
|
|
|
|
if d.HasChange("scheduled_task_name") {
|
|
args.ScheduledTaskName = d.Get("scheduled_task_name").(string)
|
|
}
|
|
|
|
if d.HasChange("description") {
|
|
args.Description = d.Get("description").(string)
|
|
}
|
|
|
|
if d.HasChange("scheduled_action") {
|
|
args.ScheduledAction = d.Get("scheduled_action").(string)
|
|
}
|
|
|
|
if d.HasChange("launch_time") {
|
|
args.LaunchTime = d.Get("launch_time").(string)
|
|
}
|
|
|
|
if d.HasChange("launch_expiration_time") {
|
|
args.LaunchExpirationTime = d.Get("launch_expiration_time").(int)
|
|
}
|
|
|
|
if d.HasChange("recurrence_type") {
|
|
args.RecurrenceType = ess.RecurrenceType(d.Get("recurrence_type").(string))
|
|
}
|
|
|
|
if d.HasChange("recurrence_value") {
|
|
args.RecurrenceValue = d.Get("recurrence_value").(string)
|
|
}
|
|
|
|
if d.HasChange("recurrence_end_time") {
|
|
args.RecurrenceEndTime = d.Get("recurrence_end_time").(string)
|
|
}
|
|
|
|
if d.HasChange("task_enabled") {
|
|
args.TaskEnabled = d.Get("task_enabled").(bool)
|
|
}
|
|
|
|
if _, err := conn.ModifyScheduledTask(args); err != nil {
|
|
return err
|
|
}
|
|
|
|
return resourceAliyunEssScheduleRead(d, meta)
|
|
}
|
|
|
|
func resourceAliyunEssScheduleDelete(d *schema.ResourceData, meta interface{}) error {
|
|
client := meta.(*AliyunClient)
|
|
|
|
return resource.Retry(2*time.Minute, func() *resource.RetryError {
|
|
err := client.DeleteScheduleById(d.Id())
|
|
|
|
if err != nil {
|
|
return resource.RetryableError(fmt.Errorf("Scaling schedule in use - trying again while it is deleted."))
|
|
}
|
|
|
|
_, err = client.DescribeScheduleById(d.Id())
|
|
if err != nil {
|
|
if notFoundError(err) {
|
|
return nil
|
|
}
|
|
return resource.NonRetryableError(err)
|
|
}
|
|
|
|
return resource.RetryableError(fmt.Errorf("Scaling schedule in use - trying again while it is deleted."))
|
|
})
|
|
}
|
|
|
|
func buildAlicloudEssScheduleArgs(d *schema.ResourceData, meta interface{}) (*ess.CreateScheduledTaskArgs, error) {
|
|
args := &ess.CreateScheduledTaskArgs{
|
|
RegionId: getRegion(d, meta),
|
|
ScheduledAction: d.Get("scheduled_action").(string),
|
|
LaunchTime: d.Get("launch_time").(string),
|
|
TaskEnabled: d.Get("task_enabled").(bool),
|
|
}
|
|
|
|
if v := d.Get("scheduled_task_name").(string); v != "" {
|
|
args.ScheduledTaskName = v
|
|
}
|
|
|
|
if v := d.Get("description").(string); v != "" {
|
|
args.Description = v
|
|
}
|
|
|
|
if v := d.Get("recurrence_type").(string); v != "" {
|
|
args.RecurrenceType = ess.RecurrenceType(v)
|
|
}
|
|
|
|
if v := d.Get("recurrence_value").(string); v != "" {
|
|
args.RecurrenceValue = v
|
|
}
|
|
|
|
if v := d.Get("recurrence_end_time").(string); v != "" {
|
|
args.RecurrenceEndTime = v
|
|
}
|
|
|
|
if v := d.Get("launch_expiration_time").(int); v != 0 {
|
|
args.LaunchExpirationTime = v
|
|
}
|
|
|
|
return args, nil
|
|
}
|