Skip to content

Commit c5beefc

Browse files
authored
automation_variable_[string|object|int|datetime|bool] - splite CreateUpdate into Create and Update (#31976)
1 parent 463093e commit c5beefc

6 files changed

Lines changed: 127 additions & 51 deletions

internal/services/automation/automation_variable.go

Lines changed: 93 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -131,60 +131,62 @@ func datasourceAutomationVariableCommonSchema(attType pluginsdk.ValueType) map[s
131131
}
132132
}
133133

134-
func resourceAutomationVariableCreateUpdate(d *pluginsdk.ResourceData, meta interface{}, varType string) error {
134+
func formatAutomationVariableValue(d *pluginsdk.ResourceData, varType string) (string, error) {
135+
switch strings.ToLower(varType) {
136+
case "datetime":
137+
vTime, err := time.Parse(time.RFC3339, d.Get("value").(string))
138+
if err != nil {
139+
return "", fmt.Errorf("invalid time format: %+v", err)
140+
}
141+
return fmt.Sprintf("\"\\/Date(%d)\\/\"", vTime.UnixNano()/1000000), nil
142+
case "bool":
143+
return strconv.FormatBool(d.Get("value").(bool)), nil
144+
case "int":
145+
return strconv.Itoa(d.Get("value").(int)), nil
146+
case "object":
147+
// We don't quote the object so it gets saved as a JSON object
148+
return d.Get("value").(string), nil
149+
case "string":
150+
return strconv.Quote(d.Get("value").(string)), nil
151+
default:
152+
return "", nil
153+
}
154+
}
155+
156+
func resourceAutomationVariableCreate(d *pluginsdk.ResourceData, meta interface{}, varType string) error {
135157
client := meta.(*clients.Client).Automation.Variable
136158
subscriptionId := meta.(*clients.Client).Account.SubscriptionId
137-
ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d)
159+
ctx, cancel := timeouts.ForCreate(meta.(*clients.Client).StopContext, d)
138160
defer cancel()
139161

140162
varTypeLower := strings.ToLower(varType)
141163

142164
id := variable.NewVariableID(subscriptionId, d.Get("resource_group_name").(string), d.Get("automation_account_name").(string), d.Get("name").(string))
143165

144-
if d.IsNewResource() {
145-
resp, err := client.Get(ctx, id)
146-
if err != nil {
147-
if !response.WasNotFound(resp.HttpResponse) {
148-
return fmt.Errorf("checking for presence of existing Automation %s Variable %s: %+v", varType, id, err)
149-
}
150-
}
151-
166+
resp, err := client.Get(ctx, id)
167+
if err != nil {
152168
if !response.WasNotFound(resp.HttpResponse) {
153-
return tf.ImportAsExistsError(fmt.Sprintf("azurerm_automation_variable_%s", varTypeLower), id.ID())
169+
return fmt.Errorf("checking for presence of existing Automation %s Variable %s: %+v", varType, id, err)
154170
}
155171
}
156172

157-
description := d.Get("description").(string)
158-
encrypted := d.Get("encrypted").(bool)
159-
value := ""
160-
161-
switch varTypeLower {
162-
case "datetime":
163-
vTime, parseErr := time.Parse(time.RFC3339, d.Get("value").(string))
164-
if parseErr != nil {
165-
return fmt.Errorf("invalid time format: %+v", parseErr)
166-
}
167-
value = fmt.Sprintf("\"\\/Date(%d)\\/\"", vTime.UnixNano()/1000000)
168-
case "bool":
169-
value = strconv.FormatBool(d.Get("value").(bool))
170-
case "int":
171-
value = strconv.Itoa(d.Get("value").(int))
172-
case "object":
173-
// We don't quote the object so it gets saved as a JSON object
174-
value = d.Get("value").(string)
175-
case "string":
176-
value = strconv.Quote(d.Get("value").(string))
173+
if !response.WasNotFound(resp.HttpResponse) {
174+
return tf.ImportAsExistsError(fmt.Sprintf("azurerm_automation_variable_%s", varTypeLower), id.ID())
177175
}
178176

179177
parameters := variable.VariableCreateOrUpdateParameters{
180178
Name: id.VariableName,
181179
Properties: variable.VariableCreateOrUpdateProperties{
182-
Description: pointer.To(description),
183-
IsEncrypted: pointer.To(encrypted),
180+
Description: pointer.To(d.Get("description").(string)),
181+
IsEncrypted: pointer.To(d.Get("encrypted").(bool)),
184182
},
185183
}
186184

187185
if varTypeLower != "null" {
186+
value, err := formatAutomationVariableValue(d, varType)
187+
if err != nil {
188+
return err
189+
}
188190
parameters.Properties.Value = pointer.To(value)
189191
}
190192

@@ -197,6 +199,64 @@ func resourceAutomationVariableCreateUpdate(d *pluginsdk.ResourceData, meta inte
197199
return resourceAutomationVariableRead(d, meta, varType)
198200
}
199201

202+
func resourceAutomationVariableUpdate(d *pluginsdk.ResourceData, meta interface{}, varType string) error {
203+
client := meta.(*clients.Client).Automation.Variable
204+
ctx, cancel := timeouts.ForUpdate(meta.(*clients.Client).StopContext, d)
205+
defer cancel()
206+
207+
id, err := variable.ParseVariableID(d.Id())
208+
if err != nil {
209+
return err
210+
}
211+
212+
// The PATCH endpoint (Update) does not support changing `encrypted`, so we use
213+
// the PUT endpoint (CreateOrUpdate) and overlay changed fields on the existing resource.
214+
existing, err := client.Get(ctx, *id)
215+
if err != nil {
216+
return fmt.Errorf("retrieving existing Automation %s Variable %s: %+v", varType, id, err)
217+
}
218+
219+
if existing.Model == nil || existing.Model.Properties == nil {
220+
return fmt.Errorf("retrieving existing Automation %s Variable %s: model or properties were nil", varType, id)
221+
}
222+
223+
existingProps := existing.Model.Properties
224+
225+
parameters := variable.VariableCreateOrUpdateParameters{
226+
Name: id.VariableName,
227+
Properties: variable.VariableCreateOrUpdateProperties{
228+
Description: existingProps.Description,
229+
IsEncrypted: existingProps.IsEncrypted,
230+
Value: existingProps.Value,
231+
},
232+
}
233+
234+
if d.HasChange("description") {
235+
parameters.Properties.Description = pointer.To(d.Get("description").(string))
236+
}
237+
238+
if d.HasChange("encrypted") {
239+
parameters.Properties.IsEncrypted = pointer.To(d.Get("encrypted").(bool))
240+
}
241+
242+
if d.HasChange("value") {
243+
varTypeLower := strings.ToLower(varType)
244+
if varTypeLower != "null" {
245+
value, err := formatAutomationVariableValue(d, varType)
246+
if err != nil {
247+
return err
248+
}
249+
parameters.Properties.Value = pointer.To(value)
250+
}
251+
}
252+
253+
if _, err := client.CreateOrUpdate(ctx, *id, parameters); err != nil {
254+
return fmt.Errorf("updating Automation %s Variable %s: %+v", varType, id, err)
255+
}
256+
257+
return resourceAutomationVariableRead(d, meta, varType)
258+
}
259+
200260
func resourceAutomationVariableRead(d *pluginsdk.ResourceData, meta interface{}, varType string) error {
201261
client := meta.(*clients.Client).Automation.Variable
202262
ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d)

internal/services/automation/automation_variable_bool_resource.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import (
1212

1313
func resourceAutomationVariableBool() *pluginsdk.Resource {
1414
return &pluginsdk.Resource{
15-
Create: resourceAutomationVariableBoolCreateUpdate,
15+
Create: resourceAutomationVariableBoolCreate,
1616
Read: resourceAutomationVariableBoolRead,
17-
Update: resourceAutomationVariableBoolCreateUpdate,
17+
Update: resourceAutomationVariableBoolUpdate,
1818
Delete: resourceAutomationVariableBoolDelete,
1919

2020
Importer: pluginsdk.ImporterValidatingResourceId(func(id string) error {
@@ -33,8 +33,12 @@ func resourceAutomationVariableBool() *pluginsdk.Resource {
3333
}
3434
}
3535

36-
func resourceAutomationVariableBoolCreateUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
37-
return resourceAutomationVariableCreateUpdate(d, meta, "Bool")
36+
func resourceAutomationVariableBoolCreate(d *pluginsdk.ResourceData, meta interface{}) error {
37+
return resourceAutomationVariableCreate(d, meta, "Bool")
38+
}
39+
40+
func resourceAutomationVariableBoolUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
41+
return resourceAutomationVariableUpdate(d, meta, "Bool")
3842
}
3943

4044
func resourceAutomationVariableBoolRead(d *pluginsdk.ResourceData, meta interface{}) error {

internal/services/automation/automation_variable_datetime_resource.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ import (
1313

1414
func resourceAutomationVariableDateTime() *pluginsdk.Resource {
1515
return &pluginsdk.Resource{
16-
Create: resourceAutomationVariableDateTimeCreateUpdate,
16+
Create: resourceAutomationVariableDateTimeCreate,
1717
Read: resourceAutomationVariableDateTimeRead,
18-
Update: resourceAutomationVariableDateTimeCreateUpdate,
18+
Update: resourceAutomationVariableDateTimeUpdate,
1919
Delete: resourceAutomationVariableDateTimeDelete,
2020

2121
Importer: pluginsdk.ImporterValidatingResourceId(func(id string) error {
@@ -34,8 +34,12 @@ func resourceAutomationVariableDateTime() *pluginsdk.Resource {
3434
}
3535
}
3636

37-
func resourceAutomationVariableDateTimeCreateUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
38-
return resourceAutomationVariableCreateUpdate(d, meta, "Datetime")
37+
func resourceAutomationVariableDateTimeCreate(d *pluginsdk.ResourceData, meta interface{}) error {
38+
return resourceAutomationVariableCreate(d, meta, "Datetime")
39+
}
40+
41+
func resourceAutomationVariableDateTimeUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
42+
return resourceAutomationVariableUpdate(d, meta, "Datetime")
3943
}
4044

4145
func resourceAutomationVariableDateTimeRead(d *pluginsdk.ResourceData, meta interface{}) error {

internal/services/automation/automation_variable_int_resource.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import (
1212

1313
func resourceAutomationVariableInt() *pluginsdk.Resource {
1414
return &pluginsdk.Resource{
15-
Create: resourceAutomationVariableIntCreateUpdate,
15+
Create: resourceAutomationVariableIntCreate,
1616
Read: resourceAutomationVariableIntRead,
17-
Update: resourceAutomationVariableIntCreateUpdate,
17+
Update: resourceAutomationVariableIntUpdate,
1818
Delete: resourceAutomationVariableIntDelete,
1919

2020
Importer: pluginsdk.ImporterValidatingResourceId(func(id string) error {
@@ -33,8 +33,12 @@ func resourceAutomationVariableInt() *pluginsdk.Resource {
3333
}
3434
}
3535

36-
func resourceAutomationVariableIntCreateUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
37-
return resourceAutomationVariableCreateUpdate(d, meta, "Int")
36+
func resourceAutomationVariableIntCreate(d *pluginsdk.ResourceData, meta interface{}) error {
37+
return resourceAutomationVariableCreate(d, meta, "Int")
38+
}
39+
40+
func resourceAutomationVariableIntUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
41+
return resourceAutomationVariableUpdate(d, meta, "Int")
3842
}
3943

4044
func resourceAutomationVariableIntRead(d *pluginsdk.ResourceData, meta interface{}) error {

internal/services/automation/automation_variable_object_resource.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ func resourceAutomationVariableObject() *pluginsdk.Resource {
3535
}
3636

3737
func resourceAutomationVariableObjectCreate(d *pluginsdk.ResourceData, meta interface{}) error {
38-
return resourceAutomationVariableCreateUpdate(d, meta, "Object")
38+
return resourceAutomationVariableCreate(d, meta, "Object")
3939
}
4040

4141
func resourceAutomationVariableObjectUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
42-
return resourceAutomationVariableCreateUpdate(d, meta, "Object")
42+
return resourceAutomationVariableUpdate(d, meta, "Object")
4343
}
4444

4545
func resourceAutomationVariableObjectRead(d *pluginsdk.ResourceData, meta interface{}) error {

internal/services/automation/automation_variable_string_resource.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ import (
1313

1414
func resourceAutomationVariableString() *pluginsdk.Resource {
1515
return &pluginsdk.Resource{
16-
Create: resourceAutomationVariableStringCreateUpdate,
16+
Create: resourceAutomationVariableStringCreate,
1717
Read: resourceAutomationVariableStringRead,
18-
Update: resourceAutomationVariableStringCreateUpdate,
18+
Update: resourceAutomationVariableStringUpdate,
1919
Delete: resourceAutomationVariableStringDelete,
2020

2121
Importer: pluginsdk.ImporterValidatingResourceId(func(id string) error {
@@ -34,8 +34,12 @@ func resourceAutomationVariableString() *pluginsdk.Resource {
3434
}
3535
}
3636

37-
func resourceAutomationVariableStringCreateUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
38-
return resourceAutomationVariableCreateUpdate(d, meta, "String")
37+
func resourceAutomationVariableStringCreate(d *pluginsdk.ResourceData, meta interface{}) error {
38+
return resourceAutomationVariableCreate(d, meta, "String")
39+
}
40+
41+
func resourceAutomationVariableStringUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
42+
return resourceAutomationVariableUpdate(d, meta, "String")
3943
}
4044

4145
func resourceAutomationVariableStringRead(d *pluginsdk.ResourceData, meta interface{}) error {

0 commit comments

Comments
 (0)