@@ -244,8 +244,10 @@ func resourceInstance() *schema.Resource {
244
244
Optional : true ,
245
245
},
246
246
"metadata" : & schema.Schema {
247
- Type : schema .TypeList ,
248
- Optional : true ,
247
+ Type : schema .TypeList ,
248
+ Optional : true ,
249
+ Deprecated : "Use metadata_map instead" ,
250
+ ConflictsWith : []string {"metadata_map" },
249
251
Elem : & schema.Resource {
250
252
Schema : map [string ]* schema.Schema {
251
253
"key" : {
@@ -259,6 +261,14 @@ func resourceInstance() *schema.Resource {
259
261
},
260
262
},
261
263
},
264
+ "metadata_map" : & schema.Schema {
265
+ Type : schema .TypeMap ,
266
+ Optional : true ,
267
+ ConflictsWith : []string {"metadata" },
268
+ Elem : & schema.Schema {
269
+ Type : schema .TypeString ,
270
+ },
271
+ },
262
272
"configuration" : & schema.Schema {
263
273
Type : schema .TypeList ,
264
274
Optional : true ,
@@ -405,9 +415,16 @@ func resourceInstanceCreate(ctx context.Context, d *schema.ResourceData, m inter
405
415
createOpts .SecurityGroups = groups
406
416
}
407
417
408
- metadata := d .Get ("metadata" )
409
- if len (metadata .([]interface {})) > 0 {
410
- md , err := extractMetadataMap (metadata .([]interface {}))
418
+ if metadata , ok := d .GetOk ("metadata" ); ok {
419
+ if len (metadata .([]interface {})) > 0 {
420
+ md , err := extractKeyValue (metadata .([]interface {}))
421
+ if err != nil {
422
+ return diag .FromErr (err )
423
+ }
424
+ createOpts .Metadata = & md
425
+ }
426
+ } else if metadataRaw , ok := d .GetOk ("metadata_map" ); ok {
427
+ md , err := extractMetadataMap (metadataRaw .(map [string ]interface {}))
411
428
if err != nil {
412
429
return diag .FromErr (err )
413
430
}
@@ -416,7 +433,7 @@ func resourceInstanceCreate(ctx context.Context, d *schema.ResourceData, m inter
416
433
417
434
configuration := d .Get ("configuration" )
418
435
if len (configuration .([]interface {})) > 0 {
419
- conf , err := extractMetadataMap (configuration .([]interface {}))
436
+ conf , err := extractKeyValue (configuration .([]interface {}))
420
437
if err != nil {
421
438
return diag .FromErr (err )
422
439
}
@@ -566,20 +583,35 @@ func resourceInstanceRead(ctx context.Context, d *schema.ResourceData, m interfa
566
583
return diag .FromErr (err )
567
584
}
568
585
569
- metadata := d .Get ("metadata" ).([]interface {})
570
- sliced := make ([]map [string ]string , len (metadata ))
571
- for i , data := range metadata {
572
- d := data .(map [string ]interface {})
573
- mdata := make (map [string ]string , 2 )
574
- md , err := instances .MetadataGet (client , instanceID , d ["key" ].(string )).Extract ()
575
- if err != nil {
576
- return diag .Errorf ("cannot get metadata with key: %s. Error: %s" , instanceID , err )
586
+ if metadataRaw , ok := d .GetOk ("metadata" ); ok {
587
+ metadata := metadataRaw .([]interface {})
588
+ sliced := make ([]map [string ]string , len (metadata ))
589
+ for i , data := range metadata {
590
+ d := data .(map [string ]interface {})
591
+ mdata := make (map [string ]string , 2 )
592
+ md , err := instances .MetadataGet (client , instanceID , d ["key" ].(string )).Extract ()
593
+ if err != nil {
594
+ return diag .Errorf ("cannot get metadata with key: %s. Error: %s" , instanceID , err )
595
+ }
596
+ mdata ["key" ] = md .Key
597
+ mdata ["value" ] = md .Value
598
+ sliced [i ] = mdata
599
+ }
600
+ d .Set ("metadata" , sliced )
601
+ } else {
602
+ metadata := d .Get ("metadata_map" ).(map [string ]interface {})
603
+ newMetadata := make (map [string ]interface {}, len (metadata ))
604
+ for k , _ := range metadata {
605
+ md , err := instances .MetadataGet (client , instanceID , k ).Extract ()
606
+ if err != nil {
607
+ return diag .Errorf ("cannot get metadata with key: %s. Error: %s" , instanceID , err )
608
+ }
609
+ newMetadata [k ] = md .Value
610
+ }
611
+ if err := d .Set ("metadata_map" , newMetadata ); err != nil {
612
+ return diag .FromErr (err )
577
613
}
578
- mdata ["key" ] = md .Key
579
- mdata ["value" ] = md .Value
580
- sliced [i ] = mdata
581
614
}
582
- d .Set ("metadata" , sliced )
583
615
584
616
addresses := []map [string ][]map [string ]string {}
585
617
for _ , data := range instance .Addresses {
@@ -633,33 +665,64 @@ func resourceInstanceUpdate(ctx context.Context, d *schema.ResourceData, m inter
633
665
}
634
666
}
635
667
636
- if d .HasChange ("metadata" ) {
637
- omd , nmd := d .GetChange ("metadata" )
638
- if len (omd .([]interface {})) > 0 {
639
- for _ , data := range omd .([]interface {}) {
640
- d := data .(map [string ]interface {})
641
- k := d ["key" ].(string )
642
- err := instances .MetadataDelete (client , instanceID , k ).Err
668
+ if _ , ok := d .GetOk ("metadata" ); ok {
669
+ if d .HasChange ("metadata" ) {
670
+ omd , nmd := d .GetChange ("metadata" )
671
+ if len (omd .([]interface {})) > 0 {
672
+ for _ , data := range omd .([]interface {}) {
673
+ d := data .(map [string ]interface {})
674
+ k := d ["key" ].(string )
675
+ err := instances .MetadataDelete (client , instanceID , k ).Err
676
+ if err != nil {
677
+ return diag .Errorf ("cannot delete metadata key: %s. Error: %s" , k , err )
678
+ }
679
+ }
680
+ }
681
+ if len (nmd .([]interface {})) > 0 {
682
+ var MetaData []instances.MetadataOpts
683
+ for _ , data := range nmd .([]interface {}) {
684
+ d := data .(map [string ]interface {})
685
+ var md instances.MetadataOpts
686
+ md .Key = d ["key" ].(string )
687
+ md .Value = d ["value" ].(string )
688
+ MetaData = append (MetaData , md )
689
+ }
690
+ createOpts := instances.MetadataSetOpts {
691
+ Metadata : MetaData ,
692
+ }
693
+ err := instances .MetadataCreate (client , instanceID , createOpts ).Err
643
694
if err != nil {
644
- return diag .Errorf ("cannot delete metadata key: %s . Error: %s" , k , err )
695
+ return diag .Errorf ("cannot create metadata. Error: %s" , err )
645
696
}
646
697
}
647
698
}
648
- if len (nmd .([]interface {})) > 0 {
649
- var MetaData []instances.MetadataOpts
650
- for _ , data := range nmd .([]interface {}) {
651
- d := data .(map [string ]interface {})
652
- var md instances.MetadataOpts
653
- md .Key = d ["key" ].(string )
654
- md .Value = d ["value" ].(string )
655
- MetaData = append (MetaData , md )
656
- }
657
- createOpts := instances.MetadataSetOpts {
658
- Metadata : MetaData ,
699
+ } else if _ , ok := d .GetOk ("metadata_map" ); ok {
700
+ if d .HasChange ("metadata_map" ) {
701
+ omd , nmd := d .GetChange ("metadata_map" )
702
+ if len (omd .(map [string ]interface {})) > 0 {
703
+ for k , _ := range omd .(map [string ]interface {}) {
704
+ err := instances .MetadataDelete (client , instanceID , k ).Err
705
+ if err != nil {
706
+ return diag .Errorf ("cannot delete metadata key: %s. Error: %s" , k , err )
707
+ }
708
+ }
659
709
}
660
- err := instances .MetadataCreate (client , instanceID , createOpts ).Err
661
- if err != nil {
662
- return diag .Errorf ("cannot create metadata. Error: %s" , err )
710
+ if len (nmd .(map [string ]interface {})) > 0 {
711
+ var MetaData []instances.MetadataOpts
712
+ for k , v := range nmd .(map [string ]interface {}) {
713
+ md := instances.MetadataOpts {
714
+ Key : k ,
715
+ Value : v .(string ),
716
+ }
717
+ MetaData = append (MetaData , md )
718
+ }
719
+ createOpts := instances.MetadataSetOpts {
720
+ Metadata : MetaData ,
721
+ }
722
+ err := instances .MetadataCreate (client , instanceID , createOpts ).Err
723
+ if err != nil {
724
+ return diag .Errorf ("cannot create metadata. Error: %s" , err )
725
+ }
663
726
}
664
727
}
665
728
}
0 commit comments