Skip to content
This repository was archived by the owner on Mar 1, 2023. It is now read-only.

Commit 39f16e7

Browse files
committed
resource_gcore_instance.metadata_map added
resource_gcore_instance.metadata deprecated
1 parent a346ad7 commit 39f16e7

File tree

4 files changed

+132
-48
lines changed

4 files changed

+132
-48
lines changed

docs/resources/gcore_instance.md

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,14 @@ resource "gcore_instance" "instance" {
9393
name = "default"
9494
}
9595
96-
metadata {
97-
key = "some_key"
98-
value = "some_data"
96+
//deprecated, use metadata_map instead
97+
//metadata {
98+
// key = "some_key"
99+
// value = "some_data"
100+
//}
101+
metadata_map = {
102+
some_key = "some_value"
103+
stage = "dev"
99104
}
100105
101106
configuration {
@@ -180,7 +185,8 @@ resource "gcore_instance" "v" {
180185
- **id** (String) The ID of this resource.
181186
- **keypair_name** (String)
182187
- **last_updated** (String)
183-
- **metadata** (Block List) (see [below for nested schema](#nestedblock--metadata))
188+
- **metadata** (Block List, Deprecated) (see [below for nested schema](#nestedblock--metadata))
189+
- **metadata_map** (Map of String)
184190
- **name** (String)
185191
- **name_templates** (List of String)
186192
- **password** (String)

examples/resources/gcore_instance/resource.tf

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,14 @@ resource "gcore_instance" "instance" {
7878
name = "default"
7979
}
8080

81-
metadata {
82-
key = "some_key"
83-
value = "some_data"
81+
//deprecated, use metadata_map instead
82+
//metadata {
83+
// key = "some_key"
84+
// value = "some_data"
85+
//}
86+
metadata_map = {
87+
some_key = "some_value"
88+
stage = "dev"
8489
}
8590

8691
configuration {

gcore/resource_gcore_instance.go

Lines changed: 103 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -244,8 +244,10 @@ func resourceInstance() *schema.Resource {
244244
Optional: true,
245245
},
246246
"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"},
249251
Elem: &schema.Resource{
250252
Schema: map[string]*schema.Schema{
251253
"key": {
@@ -259,6 +261,14 @@ func resourceInstance() *schema.Resource {
259261
},
260262
},
261263
},
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+
},
262272
"configuration": &schema.Schema{
263273
Type: schema.TypeList,
264274
Optional: true,
@@ -405,9 +415,16 @@ func resourceInstanceCreate(ctx context.Context, d *schema.ResourceData, m inter
405415
createOpts.SecurityGroups = groups
406416
}
407417

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{}))
411428
if err != nil {
412429
return diag.FromErr(err)
413430
}
@@ -416,7 +433,7 @@ func resourceInstanceCreate(ctx context.Context, d *schema.ResourceData, m inter
416433

417434
configuration := d.Get("configuration")
418435
if len(configuration.([]interface{})) > 0 {
419-
conf, err := extractMetadataMap(configuration.([]interface{}))
436+
conf, err := extractKeyValue(configuration.([]interface{}))
420437
if err != nil {
421438
return diag.FromErr(err)
422439
}
@@ -566,20 +583,35 @@ func resourceInstanceRead(ctx context.Context, d *schema.ResourceData, m interfa
566583
return diag.FromErr(err)
567584
}
568585

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)
577613
}
578-
mdata["key"] = md.Key
579-
mdata["value"] = md.Value
580-
sliced[i] = mdata
581614
}
582-
d.Set("metadata", sliced)
583615

584616
addresses := []map[string][]map[string]string{}
585617
for _, data := range instance.Addresses {
@@ -633,33 +665,64 @@ func resourceInstanceUpdate(ctx context.Context, d *schema.ResourceData, m inter
633665
}
634666
}
635667

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
643694
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)
645696
}
646697
}
647698
}
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+
}
659709
}
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+
}
663726
}
664727
}
665728
}

gcore/utils.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ func extractSecurityGroupsMap(secgroups []interface{}) ([]gcorecloud.ItemID, err
283283
return SecGroups, nil
284284
}
285285

286-
func extractMetadataMap(metadata []interface{}) (instances.MetadataSetOpts, error) {
286+
func extractKeyValue(metadata []interface{}) (instances.MetadataSetOpts, error) {
287287
MetaData := make([]instances.MetadataOpts, len(metadata))
288288
var MetadataSetOpts instances.MetadataSetOpts
289289
for i, meta := range metadata {
@@ -299,6 +299,16 @@ func extractMetadataMap(metadata []interface{}) (instances.MetadataSetOpts, erro
299299
return MetadataSetOpts, nil
300300
}
301301

302+
func extractMetadataMap(metadata map[string]interface{}) (instances.MetadataSetOpts, error) {
303+
result := make([]instances.MetadataOpts, 0, len(metadata))
304+
var MetadataSetOpts instances.MetadataSetOpts
305+
for k, v := range metadata {
306+
result = append(result, instances.MetadataOpts{Key: k, Value: v.(string)})
307+
}
308+
MetadataSetOpts.Metadata = result
309+
return MetadataSetOpts, nil
310+
}
311+
302312
func findProjectByName(arr []projects.Project, name string) (int, error) {
303313
for _, el := range arr {
304314
if el.Name == name {

0 commit comments

Comments
 (0)