Merge pull request #19552 from olindata/bugfix/setting-sets-in-list
helper/schema: Fix setting a set in a list caused error
This commit is contained in:
commit
3d6ec09a83
|
@ -297,13 +297,14 @@ func (w *MapFieldWriter) setSet(
|
|||
// we get the proper order back based on the hash code.
|
||||
if v := reflect.ValueOf(value); v.Kind() == reflect.Slice {
|
||||
// Build a temp *ResourceData to use for the conversion
|
||||
tempAddr := addr[len(addr)-1:]
|
||||
tempSchema := *schema
|
||||
tempSchema.Type = TypeList
|
||||
tempSchemaMap := map[string]*Schema{addr[0]: &tempSchema}
|
||||
tempSchemaMap := map[string]*Schema{tempAddr[0]: &tempSchema}
|
||||
tempW := &MapFieldWriter{Schema: tempSchemaMap}
|
||||
|
||||
// Set the entire list, this lets us get sane values out of it
|
||||
if err := tempW.WriteField(addr, value); err != nil {
|
||||
if err := tempW.WriteField(tempAddr, value); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -319,7 +320,7 @@ func (w *MapFieldWriter) setSet(
|
|||
}
|
||||
for i := 0; i < v.Len(); i++ {
|
||||
is := strconv.FormatInt(int64(i), 10)
|
||||
result, err := tempR.ReadField(append(addrCopy, is))
|
||||
result, err := tempR.ReadField(append(tempAddr, is))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -2059,6 +2059,69 @@ func TestResourceDataSet(t *testing.T) {
|
|||
GetKey: "availability_zone",
|
||||
GetValue: "",
|
||||
},
|
||||
|
||||
// #16: Set in a list
|
||||
{
|
||||
Schema: map[string]*Schema{
|
||||
"ports": &Schema{
|
||||
Type: TypeList,
|
||||
Elem: &Resource{
|
||||
Schema: map[string]*Schema{
|
||||
"set": &Schema{
|
||||
Type: TypeSet,
|
||||
Elem: &Schema{Type: TypeInt},
|
||||
Set: func(a interface{}) int {
|
||||
return a.(int)
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
State: nil,
|
||||
|
||||
Key: "ports",
|
||||
Value: []interface{}{
|
||||
map[string]interface{}{
|
||||
"set": []interface{}{
|
||||
1,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
GetKey: "ports",
|
||||
GetValue: []interface{}{
|
||||
map[string]interface{}{
|
||||
"set": []interface{}{
|
||||
1,
|
||||
},
|
||||
},
|
||||
},
|
||||
GetPreProcess: func(v interface{}) interface{} {
|
||||
if v == nil {
|
||||
return v
|
||||
}
|
||||
s, ok := v.([]interface{})
|
||||
if !ok {
|
||||
return v
|
||||
}
|
||||
for _, v := range s {
|
||||
m, ok := v.(map[string]interface{})
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
if m["set"] == nil {
|
||||
continue
|
||||
}
|
||||
if s, ok := m["set"].(*Set); ok {
|
||||
m["set"] = s.List()
|
||||
}
|
||||
}
|
||||
|
||||
return v
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
oldEnv := os.Getenv(PanicOnErr)
|
||||
|
|
Loading…
Reference in New Issue