@@ -2,7 +2,6 @@ package appstream
2
2
3
3
import (
4
4
"context"
5
- "fmt"
6
5
"log"
7
6
"time"
8
7
@@ -15,6 +14,7 @@ import (
15
14
"github.com/hashicorp/terraform-provider-aws/internal/conns"
16
15
"github.com/hashicorp/terraform-provider-aws/internal/flex"
17
16
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
17
+ "github.com/hashicorp/terraform-provider-aws/internal/tfresource"
18
18
"github.com/hashicorp/terraform-provider-aws/internal/verify"
19
19
)
20
20
@@ -24,9 +24,11 @@ func ResourceImageBuilder() *schema.Resource {
24
24
ReadWithoutTimeout : resourceImageBuilderRead ,
25
25
UpdateWithoutTimeout : resourceImageBuilderUpdate ,
26
26
DeleteWithoutTimeout : resourceImageBuilderDelete ,
27
+
27
28
Importer : & schema.ResourceImporter {
28
29
StateContext : schema .ImportStatePassthroughContext ,
29
30
},
31
+
30
32
Schema : map [string ]* schema.Schema {
31
33
"access_endpoint" : {
32
34
Type : schema .TypeSet ,
@@ -139,6 +141,8 @@ func ResourceImageBuilder() *schema.Resource {
139
141
Type : schema .TypeString ,
140
142
Computed : true ,
141
143
},
144
+ "tags" : tftags .TagsSchema (),
145
+ "tags_all" : tftags .TagsSchemaComputed (),
142
146
"vpc_config" : {
143
147
Type : schema .TypeList ,
144
148
MaxItems : 1 ,
@@ -162,9 +166,8 @@ func ResourceImageBuilder() *schema.Resource {
162
166
},
163
167
},
164
168
},
165
- "tags" : tftags .TagsSchema (),
166
- "tags_all" : tftags .TagsSchemaComputed (),
167
169
},
170
+
168
171
CustomizeDiff : verify .SetTagsDiff ,
169
172
}
170
173
}
@@ -175,24 +178,23 @@ func resourceImageBuilderCreate(ctx context.Context, d *schema.ResourceData, met
175
178
tags := defaultTagsConfig .MergeTags (tftags .New (d .Get ("tags" ).(map [string ]interface {})))
176
179
177
180
name := d .Get ("name" ).(string )
178
-
179
181
input := & appstream.CreateImageBuilderInput {
180
- Name : aws .String (name ),
181
182
InstanceType : aws .String (d .Get ("instance_type" ).(string )),
183
+ Name : aws .String (name ),
182
184
}
183
185
184
186
if v , ok := d .GetOk ("access_endpoint" ); ok && v .(* schema.Set ).Len () > 0 {
185
187
input .AccessEndpoints = expandAccessEndpoints (v .(* schema.Set ).List ())
186
188
}
187
189
188
- if v , ok := d .GetOk ("description" ); ok {
189
- input .Description = aws .String (v .(string ))
190
- }
191
-
192
190
if v , ok := d .GetOk ("appstream_agent_version" ); ok {
193
191
input .AppstreamAgentVersion = aws .String (v .(string ))
194
192
}
195
193
194
+ if v , ok := d .GetOk ("description" ); ok {
195
+ input .Description = aws .String (v .(string ))
196
+ }
197
+
196
198
if v , ok := d .GetOk ("display_name" ); ok {
197
199
input .DisplayName = aws .String (v .(string ))
198
200
}
@@ -205,6 +207,10 @@ func resourceImageBuilderCreate(ctx context.Context, d *schema.ResourceData, met
205
207
input .EnableDefaultInternetAccess = aws .Bool (v .(bool ))
206
208
}
207
209
210
+ if v , ok := d .GetOk ("iam_role_arn" ); ok {
211
+ input .IamRoleArn = aws .String (v .(string ))
212
+ }
213
+
208
214
if v , ok := d .GetOk ("image_arn" ); ok {
209
215
input .ImageArn = aws .String (v .(string ))
210
216
}
@@ -213,10 +219,6 @@ func resourceImageBuilderCreate(ctx context.Context, d *schema.ResourceData, met
213
219
input .ImageName = aws .String (v .(string ))
214
220
}
215
221
216
- if v , ok := d .GetOk ("iam_role_arn" ); ok {
217
- input .IamRoleArn = aws .String (v .(string ))
218
- }
219
-
220
222
if v , ok := d .GetOk ("vpc_config" ); ok && len (v .([]interface {})) > 0 && v .([]interface {})[0 ] != nil {
221
223
input .VpcConfig = expandImageBuilderVPCConfig (v .([]interface {}))
222
224
}
@@ -225,96 +227,98 @@ func resourceImageBuilderCreate(ctx context.Context, d *schema.ResourceData, met
225
227
input .Tags = Tags (tags .IgnoreAWS ())
226
228
}
227
229
228
- output , err := conn .CreateImageBuilderWithContext (ctx , input )
230
+ outputRaw , err := tfresource .RetryWhenAWSErrMessageContainsContext (ctx , iamPropagationTimeout , func () (interface {}, error ) {
231
+ return conn .CreateImageBuilderWithContext (ctx , input )
232
+ }, appstream .ErrCodeInvalidRoleException , "encountered an error because your IAM role" )
229
233
230
234
if err != nil {
231
- return diag .FromErr ( fmt . Errorf ("error creating Appstream ImageBuilder (%s): %w " , name , err ) )
235
+ return diag .Errorf ("creating AppStream ImageBuilder (%s): %s " , name , err )
232
236
}
233
237
234
- d .SetId (aws .StringValue (output .ImageBuilder .Name ))
238
+ d .SetId (aws .StringValue (outputRaw .( * appstream. CreateImageBuilderOutput ) .ImageBuilder .Name ))
235
239
236
240
if _ , err = waitImageBuilderStateRunning (ctx , conn , d .Id ()); err != nil {
237
- return diag .FromErr ( fmt . Errorf ("error waiting for Appstream ImageBuilder (%s) to be running : %w " , d .Id (), err ) )
241
+ return diag .Errorf ("waiting for AppStream ImageBuilder (%s) create : %s " , d .Id (), err )
238
242
}
239
243
240
244
return resourceImageBuilderRead (ctx , d , meta )
241
245
}
242
246
243
247
func resourceImageBuilderRead (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
244
248
conn := meta .(* conns.AWSClient ).AppStreamConn ()
245
-
246
249
defaultTagsConfig := meta .(* conns.AWSClient ).DefaultTagsConfig
247
250
ignoreTagsConfig := meta .(* conns.AWSClient ).IgnoreTagsConfig
248
251
249
252
imageBuilder , err := FindImageBuilderByName (ctx , conn , d .Id ())
250
253
251
- if ! d .IsNewResource () && tfawserr . ErrCodeEquals (err , appstream . ErrCodeResourceNotFoundException ) {
252
- log .Printf ("[WARN] Appstream ImageBuilder (%s) not found, removing from state" , d .Id ())
254
+ if ! d .IsNewResource () && tfresource . NotFound (err ) {
255
+ log .Printf ("[WARN] AppStream ImageBuilder (%s) not found, removing from state" , d .Id ())
253
256
d .SetId ("" )
254
257
return nil
255
258
}
256
259
257
260
if err != nil {
258
- return diag .FromErr ( fmt . Errorf ("error reading Appstream ImageBuilder (%s): %w " , d .Id (), err ) )
261
+ return diag .Errorf ("reading AppStream ImageBuilder (%s): %s " , d .Id (), err )
259
262
}
260
263
261
- if imageBuilder = = nil {
262
- return diag .FromErr ( fmt . Errorf ("error reading Appstream ImageBuilder (%s): not found after creation " , d . Id ()) )
264
+ if err = d . Set ( "access_endpoint" , flattenAccessEndpoints ( imageBuilder . AccessEndpoints )); err ! = nil {
265
+ return diag .Errorf ("setting access_endpoint: %s " , err )
263
266
}
264
-
265
- arn := aws .StringValue (imageBuilder .Arn )
266
-
267
267
d .Set ("appstream_agent_version" , imageBuilder .AppstreamAgentVersion )
268
+ arn := aws .StringValue (imageBuilder .Arn )
268
269
d .Set ("arn" , arn )
269
270
d .Set ("created_time" , aws .TimeValue (imageBuilder .CreatedTime ).Format (time .RFC3339 ))
270
271
d .Set ("description" , imageBuilder .Description )
271
272
d .Set ("display_name" , imageBuilder .DisplayName )
273
+ if imageBuilder .DomainJoinInfo != nil {
274
+ if err = d .Set ("domain_join_info" , []interface {}{flattenDomainInfo (imageBuilder .DomainJoinInfo )}); err != nil {
275
+ return diag .Errorf ("setting domain_join_info: %s" , err )
276
+ }
277
+ } else {
278
+ d .Set ("domain_join_info" , nil )
279
+ }
272
280
d .Set ("enable_default_internet_access" , imageBuilder .EnableDefaultInternetAccess )
273
- d .Set ("image_arn" , imageBuilder .ImageArn )
274
281
d .Set ("iam_role_arn" , imageBuilder .IamRoleArn )
282
+ d .Set ("image_arn" , imageBuilder .ImageArn )
275
283
d .Set ("instance_type" , imageBuilder .InstanceType )
276
-
277
- if err = d .Set ("access_endpoint" , flattenAccessEndpoints (imageBuilder .AccessEndpoints )); err != nil {
278
- return diag .FromErr (fmt .Errorf ("error setting `%s` for AppStream ImageBuilder (%s): %w" , "access_endpoints" , d .Id (), err ))
279
- }
280
- if err = d .Set ("domain_join_info" , flattenDomainInfo (imageBuilder .DomainJoinInfo )); err != nil {
281
- return diag .FromErr (fmt .Errorf ("error setting `%s` for AppStream ImageBuilder (%s): %w" , "domain_join_info" , d .Id (), err ))
282
- }
283
-
284
- if err = d .Set ("vpc_config" , flattenVPCConfig (imageBuilder .VpcConfig )); err != nil {
285
- return diag .FromErr (fmt .Errorf ("error setting `%s` for AppStream ImageBuilder (%s): %w" , "vpc_config" , d .Id (), err ))
286
- }
287
-
288
284
d .Set ("name" , imageBuilder .Name )
289
285
d .Set ("state" , imageBuilder .State )
286
+ if imageBuilder .VpcConfig != nil {
287
+ if err = d .Set ("vpc_config" , []interface {}{flattenVPCConfig (imageBuilder .VpcConfig )}); err != nil {
288
+ return diag .Errorf ("setting vpc_config: %s" , err )
289
+ }
290
+ } else {
291
+ d .Set ("vpc_config" , nil )
292
+ }
293
+
294
+ tags , err := ListTagsWithContext (ctx , conn , arn )
290
295
291
- tags , err := ListTags (conn , arn )
292
296
if err != nil {
293
- return diag .FromErr ( fmt . Errorf ("error listing tags for AppStream ImageBuilder (%s): %w " , arn , err ) )
297
+ return diag .Errorf ("listing tags for AppStream ImageBuilder (%s): %s " , arn , err )
294
298
}
295
299
296
300
tags = tags .IgnoreAWS ().IgnoreConfig (ignoreTagsConfig )
297
301
298
302
//lintignore:AWSR002
299
303
if err := d .Set ("tags" , tags .RemoveDefaultConfig (defaultTagsConfig ).Map ()); err != nil {
300
- return diag .FromErr ( fmt . Errorf ("error setting tags: %w " , err ) )
304
+ return diag .Errorf ("setting tags: %s " , err )
301
305
}
302
306
303
307
if err := d .Set ("tags_all" , tags .Map ()); err != nil {
304
- return diag .FromErr ( fmt . Errorf ("error setting tags_all: %w " , err ) )
308
+ return diag .Errorf ("setting tags_all: %s " , err )
305
309
}
306
310
307
311
return nil
308
312
}
309
313
310
314
func resourceImageBuilderUpdate (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
311
- if d .HasChange ("tags_all" ) {
312
- conn := meta .(* conns.AWSClient ).AppStreamConn ()
315
+ conn := meta .(* conns.AWSClient ).AppStreamConn ()
313
316
317
+ if d .HasChange ("tags_all" ) {
314
318
o , n := d .GetChange ("tags_all" )
315
319
316
- if err := UpdateTags ( conn , d .Get ("arn" ).(string ), o , n ); err != nil {
317
- return diag .FromErr ( fmt . Errorf ("error updating tags for AppStream ImageBuilder (%s): %w " , d .Id (), err ) )
320
+ if err := UpdateTagsWithContext ( ctx , conn , d .Get ("arn" ).(string ), o , n ); err != nil {
321
+ return diag .Errorf ("updating tags for AppStream ImageBuilder (%s): %s " , d .Id (), err )
318
322
}
319
323
}
320
324
@@ -324,7 +328,7 @@ func resourceImageBuilderUpdate(ctx context.Context, d *schema.ResourceData, met
324
328
func resourceImageBuilderDelete (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
325
329
conn := meta .(* conns.AWSClient ).AppStreamConn ()
326
330
327
- log .Printf ("[DEBUG] Deleting AppStream Image Builder: (%s) " , d .Id ())
331
+ log .Printf ("[DEBUG] Deleting AppStream ImageBuilder: %s " , d .Id ())
328
332
_ , err := conn .DeleteImageBuilderWithContext (ctx , & appstream.DeleteImageBuilderInput {
329
333
Name : aws .String (d .Id ()),
330
334
})
@@ -334,14 +338,11 @@ func resourceImageBuilderDelete(ctx context.Context, d *schema.ResourceData, met
334
338
}
335
339
336
340
if err != nil {
337
- return diag .FromErr ( fmt . Errorf ("error deleting Appstream ImageBuilder (%s): %w " , d .Id (), err ) )
341
+ return diag .Errorf ("deleting AppStream ImageBuilder (%s): %s " , d .Id (), err )
338
342
}
339
343
340
344
if _ , err = waitImageBuilderStateDeleted (ctx , conn , d .Id ()); err != nil {
341
- if tfawserr .ErrCodeEquals (err , appstream .ErrCodeResourceNotFoundException ) {
342
- return nil
343
- }
344
- return diag .FromErr (fmt .Errorf ("error waiting for Appstream ImageBuilder (%s) to be deleted: %w" , d .Id (), err ))
345
+ return diag .Errorf ("waiting for AppStream ImageBuilder (%s) delete: %s" , d .Id (), err )
345
346
}
346
347
347
348
return nil
0 commit comments