Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

azurerm_automation_schedule - split create/update functions #23494

Merged
merged 3 commits into from
Oct 12, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 97 additions & 13 deletions internal/services/automation/automation_schedule_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ import (

func resourceAutomationSchedule() *pluginsdk.Resource {
return &pluginsdk.Resource{
Create: resourceAutomationScheduleCreateUpdate,
Create: resourceAutomationScheduleCreate,
Read: resourceAutomationScheduleRead,
Update: resourceAutomationScheduleCreateUpdate,
Update: resourceAutomationScheduleUpdate,
Delete: resourceAutomationScheduleDelete,

Importer: pluginsdk.ImporterValidatingResourceId(func(id string) error {
Expand Down Expand Up @@ -211,7 +211,7 @@ func resourceAutomationSchedule() *pluginsdk.Resource {
}
}

func resourceAutomationScheduleCreateUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
func resourceAutomationScheduleCreate(d *pluginsdk.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).Automation.Schedule
subscriptionId := meta.(*clients.Client).Account.SubscriptionId
ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d)
Expand All @@ -221,19 +221,17 @@ func resourceAutomationScheduleCreateUpdate(d *pluginsdk.ResourceData, meta inte

id := schedule.NewScheduleID(subscriptionId, d.Get("resource_group_name").(string), d.Get("automation_account_name").(string), d.Get("name").(string))

if d.IsNewResource() {
existing, err := client.Get(ctx, id)
if err != nil {
if !response.WasNotFound(existing.HttpResponse) {
return fmt.Errorf("checking for presence of existing %s: %s", id, err)
}
}

existing, err := client.Get(ctx, id)
if err != nil {
if !response.WasNotFound(existing.HttpResponse) {
return tf.ImportAsExistsError("azurerm_automation_schedule", id.ID())
return fmt.Errorf("checking for presence of existing %s: %v", id, err)
}
}

if !response.WasNotFound(existing.HttpResponse) {
return tf.ImportAsExistsError("azurerm_automation_schedule", id.ID())
}

frequency := d.Get("frequency").(string)
timeZone := d.Get("timezone").(string)
description := d.Get("description").(string)
Expand Down Expand Up @@ -285,14 +283,100 @@ func resourceAutomationScheduleCreateUpdate(d *pluginsdk.ResourceData, meta inte
}

if _, err := client.CreateOrUpdate(ctx, id, parameters); err != nil {
return err
return fmt.Errorf("creating %s: %+v", id, err)
}

d.SetId(id.ID())

return resourceAutomationScheduleRead(d, meta)
}

func resourceAutomationScheduleUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).Automation.Schedule
subscriptionId := meta.(*clients.Client).Account.SubscriptionId
ctx, cancel := timeouts.ForUpdate(meta.(*clients.Client).StopContext, d)
defer cancel()

log.Printf("[INFO] preparing arguments for AzureRM Automation Schedule update.")

id := schedule.NewScheduleID(subscriptionId, d.Get("resource_group_name").(string), d.Get("automation_account_name").(string), d.Get("name").(string))

existing, err := client.Get(ctx, id)
if err != nil {
return fmt.Errorf("checking for presence of existing %s: %v", id, err)

}

if existing.Model == nil || existing.Model.Properties == nil {
return fmt.Errorf("reading existing properties of %s", id)
}

parameters := schedule.ScheduleCreateOrUpdateParameters{
Name: id.ScheduleName,
Properties: schedule.ScheduleCreateOrUpdateProperties{
Frequency: pointer.From(existing.Model.Properties.Frequency),
Description: existing.Model.Properties.Description,
TimeZone: existing.Model.Properties.TimeZone,
},
}
if d.HasChange("frequency") {
parameters.Properties.Frequency = schedule.ScheduleFrequency(d.Get("frequency").(string))
}

if d.HasChange("timezone") {
parameters.Properties.TimeZone = pointer.To(d.Get("timezone").(string))
}

if d.HasChange("description") {
parameters.Properties.Description = pointer.To(d.Get("description").(string))
}

parameters.Properties.StartTime = pointer.From(existing.Model.Properties.StartTime)
if d.HasChange("start_time") {
// start time can default to now + 7 (5 could be invalid by the time the API is called)
loc, err := time.LoadLocation(pointer.From(parameters.Properties.TimeZone))
if err != nil {
return err
}
if v, ok := d.GetOk("start_time"); ok {
t, _ := time.Parse(time.RFC3339, v.(string)) // should be validated by the schema
duration := time.Duration(5) * time.Minute
if time.Until(t) < duration {
return fmt.Errorf("`start_time` is %q and should be at least %q in the future", t, duration)
}

parameters.Properties.SetStartTimeAsTime(t.In(loc))
} else {
parameters.Properties.SetStartTimeAsTime(time.Now().In(loc).Add(time.Duration(7) * time.Minute))
}
}

parameters.Properties.ExpiryTime = existing.Model.Properties.ExpiryTime
if d.HasChange("expiry_time") {
parameters.Properties.ExpiryTime = pointer.To(d.Get("expiry_time").(string))
}

// only pay attention to interval if frequency is not OneTime, and default it to 1 if not set
if parameters.Properties.Frequency != schedule.ScheduleFrequencyOneTime {
parameters.Properties.Interval = existing.Model.Properties.Interval
if d.HasChange("interval") {
parameters.Properties.Interval = pointer.To(d.Get("interval"))
}
}

if d.HasChange("week_days") || d.HasChange("month_days") || d.HasChange("monthly_occurrence") {
// only pay attention to the advanced schedule fields if frequency is either Week or Month
if parameters.Properties.Frequency == schedule.ScheduleFrequencyWeek || parameters.Properties.Frequency == schedule.ScheduleFrequencyMonth {
parameters.Properties.AdvancedSchedule = expandArmAutomationScheduleAdvanced(d, d.Id() != "")
}
}

if _, err := client.CreateOrUpdate(ctx, id, parameters); err != nil {
return fmt.Errorf("updating %s: %+v", id, err)
}
return resourceAutomationScheduleRead(d, meta)
}

func resourceAutomationScheduleRead(d *pluginsdk.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).Automation.Schedule
ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d)
Expand Down
Loading