Skip to content

Commit

Permalink
Handle OmitIfEmpty for bool and int types
Browse files Browse the repository at this point in the history
Instead of passing a false/zero value

Signed-off-by: Kobi Samoray <[email protected]>
  • Loading branch information
ksamoray committed Jul 7, 2024
1 parent 9a7d2a9 commit 098786d
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 40 deletions.
40 changes: 33 additions & 7 deletions nsxt/metadata/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -303,12 +303,18 @@ func SchemaToStruct(elem reflect.Value, d *schema.ResourceData, metadata map[str
}
if item.Metadata.SchemaType == "string" {
var value string
if len(parent) > 0 {
exists := false
if len(parent) > 0 && parentMap[key] != nil {
value = parentMap[key].(string)
exists = true
} else {
value = d.Get(key).(string)
var v interface{}
v, exists = d.GetOk(key)
if exists {
value = v.(string)
}
}
if item.Metadata.OmitIfEmpty && value == "" {
if item.Metadata.OmitIfEmpty && !exists {
logger.Printf("[TRACE] %s skip key %s since its empty and OmitIfEmpty is true", ctx, key)
continue
}
Expand All @@ -317,20 +323,40 @@ func SchemaToStruct(elem reflect.Value, d *schema.ResourceData, metadata map[str
}
if item.Metadata.SchemaType == "bool" {
var value bool
if len(parent) > 0 {
exists := false
if len(parent) > 0 && parentMap[key] != nil {
value = parentMap[key].(bool)
exists = true
} else {
value = d.Get(key).(bool)
var v interface{}
v, exists = d.GetOk(key)
if exists {
value = v.(bool)
}
}
if item.Metadata.OmitIfEmpty && !exists {
logger.Printf("[TRACE] %s skip key %s since its empty and OmitIfEmpty is true", ctx, key)
continue
}
logger.Printf("[TRACE] %s assigning bool %v to %s", ctx, value, key)
elem.FieldByName(item.Metadata.SdkFieldName).Set(reflect.ValueOf(&value))
}
if item.Metadata.SchemaType == "int" {
var value int64
if len(parent) > 0 {
exists := false
if len(parent) > 0 && parentMap[key] != nil {
value = int64(parentMap[key].(int))
exists = true
} else {
value = int64(d.Get(key).(int))
var v interface{}
v, exists = d.GetOk(key)
if exists {
value = int64(v.(int))
}
}
if item.Metadata.OmitIfEmpty && value == 0 && !exists {
logger.Printf("[TRACE] %s skip key %s since its empty and OmitIfEmpty is true", ctx, key)
continue
}
logger.Printf("[TRACE] %s assigning int %v to %s", ctx, value, key)
elem.FieldByName(item.Metadata.SdkFieldName).Set(reflect.ValueOf(&value))
Expand Down
24 changes: 12 additions & 12 deletions nsxt/metadata/metadata_poly_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ func testPolyStructNestedSchema(t string) map[string]*schema.Schema {
}

func testPolyStructNestedExtSchema(t, sdkName string) map[string]*ExtendedSchema {
typeIdentier := TypeIdentifier{
typeIdentifier := TypeIdentifier{
SdkName: "Type",
APIFieldName: "type",
}
Expand All @@ -170,16 +170,16 @@ func testPolyStructNestedExtSchema(t, sdkName string) map[string]*ExtendedSchema
ConflictsWith: []string{"coffee"},
Elem: &ExtendedResource{
Schema: map[string]*ExtendedSchema{
"name": basicStringSchema("Name", false),
"age": basicIntSchema("Age", false),
"name": basicStringSchema("Name", false, false),
"age": basicIntSchema("Age", false, false),
},
},
},
Metadata: Metadata{
SchemaType: "struct",
ReflectType: reflect.TypeOf(testCatStruct{}),
BindingType: testCatStructBindingType(),
TypeIdentifier: typeIdentier,
TypeIdentifier: typeIdentifier,
},
},
"coffee": {
Expand All @@ -189,16 +189,16 @@ func testPolyStructNestedExtSchema(t, sdkName string) map[string]*ExtendedSchema
ConflictsWith: []string{"cat"},
Elem: &ExtendedResource{
Schema: map[string]*ExtendedSchema{
"name": basicStringSchema("Name", false),
"is_decaf": basicBoolSchema("IsDecaf", false),
"name": basicStringSchema("Name", false, false),
"is_decaf": basicBoolSchema("IsDecaf", false, false),
},
},
},
Metadata: Metadata{
SchemaType: "struct",
ReflectType: reflect.TypeOf(testCoffeeStruct{}),
BindingType: testCoffeeStructBindingType(),
TypeIdentifier: typeIdentier,
TypeIdentifier: typeIdentifier,
},
},
},
Expand All @@ -212,7 +212,7 @@ func testPolyStructNestedExtSchema(t, sdkName string) map[string]*ExtendedSchema
"cat": "FakeCat",
"coffee": "FakeCoffee",
},
TypeIdentifier: typeIdentier,
TypeIdentifier: typeIdentifier,
},
},
}
Expand Down Expand Up @@ -592,8 +592,8 @@ func testPolyStructFlattenExtSchema(t, sdkName string) map[string]*ExtendedSchem
MaxItems: maxItems,
Elem: &ExtendedResource{
Schema: map[string]*ExtendedSchema{
"name": basicStringSchema("Name", false),
"age": basicIntSchema("Age", false),
"name": basicStringSchema("Name", false, false),
"age": basicIntSchema("Age", false, false),
},
},
},
Expand All @@ -613,8 +613,8 @@ func testPolyStructFlattenExtSchema(t, sdkName string) map[string]*ExtendedSchem
MaxItems: maxItems,
Elem: &ExtendedResource{
Schema: map[string]*ExtendedSchema{
"name": basicStringSchema("Name", false),
"is_decaf": basicBoolSchema("IsDecaf", false),
"name": basicStringSchema("Name", false, false),
"is_decaf": basicBoolSchema("IsDecaf", false, false),
},
},
},
Expand Down
76 changes: 55 additions & 21 deletions nsxt/metadata/metadata_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ type testStruct struct {
StringFieldNil *string
BoolFieldNil *bool
IntFieldNil *int64
StringFieldOIE *string
BoolFieldOIE *bool
IntFieldOIE *int64
StructField *testNestedStruct
StringListField []string
BoolListField []bool
Expand Down Expand Up @@ -63,6 +66,18 @@ var testSchema = map[string]*schema.Schema{
Type: schema.TypeInt,
Optional: true,
},
"string_field_oie": {
Type: schema.TypeString,
Optional: true,
},
"bool_field_oie": {
Type: schema.TypeBool,
Optional: true,
},
"int_field_oie": {
Type: schema.TypeInt,
Optional: true,
},
"struct_field": {
Type: schema.TypeList,
MaxItems: 1,
Expand Down Expand Up @@ -189,7 +204,7 @@ var testSchema = map[string]*schema.Schema{
},
}

func basicStringSchema(sdkName string, optional bool) *ExtendedSchema {
func basicStringSchema(sdkName string, optional, omitIfEmpty bool) *ExtendedSchema {
return &ExtendedSchema{
Schema: schema.Schema{
Type: schema.TypeString,
Expand All @@ -198,11 +213,12 @@ func basicStringSchema(sdkName string, optional bool) *ExtendedSchema {
Metadata: Metadata{
SchemaType: "string",
SdkFieldName: sdkName,
OmitIfEmpty: omitIfEmpty,
},
}
}

func basicBoolSchema(sdkName string, optional bool) *ExtendedSchema {
func basicBoolSchema(sdkName string, optional, omitIfEmpty bool) *ExtendedSchema {
return &ExtendedSchema{
Schema: schema.Schema{
Type: schema.TypeBool,
Expand All @@ -215,7 +231,7 @@ func basicBoolSchema(sdkName string, optional bool) *ExtendedSchema {
}
}

func basicIntSchema(sdkName string, optional bool) *ExtendedSchema {
func basicIntSchema(sdkName string, optional, omitIfEmpty bool) *ExtendedSchema {
return &ExtendedSchema{
Schema: schema.Schema{
Type: schema.TypeInt,
Expand All @@ -241,9 +257,9 @@ func basicStructSchema(t string) schema.Schema {
MaxItems: maxItems,
Elem: &ExtendedResource{
Schema: map[string]*ExtendedSchema{
"string_field": basicStringSchema("StringField", false),
"bool_field": basicBoolSchema("BoolField", false),
"int_field": basicIntSchema("IntField", false),
"string_field": basicStringSchema("StringField", false, false),
"bool_field": basicBoolSchema("BoolField", false, false),
"int_field": basicIntSchema("IntField", false, false),
},
},
}
Expand All @@ -255,11 +271,11 @@ func mixedStructSchema() schema.Schema {
MaxItems: 1,
Elem: &ExtendedResource{
Schema: map[string]*ExtendedSchema{
"string_field": basicStringSchema("StringField", false),
"string_field": basicStringSchema("StringField", false, false),
"bool_list": {
Schema: schema.Schema{
Type: schema.TypeList,
Elem: basicBoolSchema("BoolList", false),
Elem: basicBoolSchema("BoolList", false, false),
},
Metadata: Metadata{
SchemaType: "list",
Expand All @@ -269,7 +285,7 @@ func mixedStructSchema() schema.Schema {
"int_set": {
Schema: schema.Schema{
Type: schema.TypeSet,
Elem: basicIntSchema("IntSet", false),
Elem: basicIntSchema("IntSet", false, false),
},
Metadata: Metadata{
SchemaType: "set",
Expand All @@ -290,12 +306,15 @@ func mixedStructSchema() schema.Schema {
}

var testExtendedSchema = map[string]*ExtendedSchema{
"string_field": basicStringSchema("StringField", false),
"bool_field": basicBoolSchema("BoolField", false),
"int_field": basicIntSchema("IntField", false),
"string_field_nil": basicStringSchema("StringFieldNil", true),
"bool_field_nil": basicBoolSchema("BoolFieldNil", true),
"int_field_nil": basicIntSchema("IntFieldNil", true),
"string_field": basicStringSchema("StringField", false, false),
"bool_field": basicBoolSchema("BoolField", false, false),
"int_field": basicIntSchema("IntField", false, false),
"string_field_nil": basicStringSchema("StringFieldNil", true, false),
"bool_field_nil": basicBoolSchema("BoolFieldNil", true, false),
"int_field_nil": basicIntSchema("IntFieldNil", true, false),
"string_field_oie": basicStringSchema("StringFieldNil", true, true),
"bool_field_oie": basicBoolSchema("BoolFieldNil", true, true),
"int_field_oie": basicIntSchema("IntFieldNil", true, true),
"struct_field": {
Schema: basicStructSchema("struct"),
Metadata: Metadata{
Expand All @@ -307,7 +326,7 @@ var testExtendedSchema = map[string]*ExtendedSchema{
"string_list": {
Schema: schema.Schema{
Type: schema.TypeList,
Elem: basicStringSchema("StringListField", false),
Elem: basicStringSchema("StringListField", false, false),
},
Metadata: Metadata{
SchemaType: "list",
Expand All @@ -317,7 +336,7 @@ var testExtendedSchema = map[string]*ExtendedSchema{
"bool_list": {
Schema: schema.Schema{
Type: schema.TypeList,
Elem: basicBoolSchema("BoolListField", false),
Elem: basicBoolSchema("BoolListField", false, false),
},
Metadata: Metadata{
SchemaType: "list",
Expand All @@ -327,7 +346,7 @@ var testExtendedSchema = map[string]*ExtendedSchema{
"int_list": {
Schema: schema.Schema{
Type: schema.TypeList,
Elem: basicIntSchema("IntListField", false),
Elem: basicIntSchema("IntListField", false, false),
},
Metadata: Metadata{
SchemaType: "list",
Expand All @@ -345,7 +364,7 @@ var testExtendedSchema = map[string]*ExtendedSchema{
"string_set": {
Schema: schema.Schema{
Type: schema.TypeSet,
Elem: basicStringSchema("StringSetField", false),
Elem: basicStringSchema("StringSetField", false, false),
},
Metadata: Metadata{
SchemaType: "set",
Expand All @@ -355,7 +374,7 @@ var testExtendedSchema = map[string]*ExtendedSchema{
"bool_set": {
Schema: schema.Schema{
Type: schema.TypeSet,
Elem: basicBoolSchema("BoolSetField", false),
Elem: basicBoolSchema("BoolSetField", false, false),
},
Metadata: Metadata{
SchemaType: "set",
Expand All @@ -365,7 +384,7 @@ var testExtendedSchema = map[string]*ExtendedSchema{
"int_set": {
Schema: schema.Schema{
Type: schema.TypeSet,
Elem: basicIntSchema("IntSetField", false),
Elem: basicIntSchema("IntSetField", false, false),
},
Metadata: Metadata{
SchemaType: "set",
Expand Down Expand Up @@ -493,6 +512,15 @@ func TestStructToSchema(t *testing.T) {
assert.False(t, ok)
})

t.Run("Zero values OIE", func(t *testing.T) {
_, ok := d.GetOk("string_field_oie")
assert.False(t, ok)
_, ok = d.GetOk("bool_field_oie")
assert.False(t, ok)
_, ok = d.GetOk("int_field_oie")
assert.False(t, ok)
})

t.Run("Nested struct", func(t *testing.T) {
nestedObj := d.Get("struct_field").([]interface{})[0].(map[string]interface{})
assert.Equal(t, "test_string", nestedObj["string_field"].(string))
Expand Down Expand Up @@ -633,6 +661,12 @@ func TestSchemaToStruct(t *testing.T) {
assert.Equal(t, int64(0), *obj.IntFieldNil)
})

t.Run("Zero values OIE", func(t *testing.T) {
assert.Equal(t, (*string)(nil), obj.StringFieldOIE)
assert.Equal(t, (*bool)(nil), obj.BoolFieldOIE)
assert.Equal(t, (*int64)(nil), obj.IntFieldOIE)
})

t.Run("Nested struct", func(t *testing.T) {
assert.Equal(t, "nested_string", *obj.StructField.StringField)
assert.Equal(t, true, *obj.StructField.BoolField)
Expand Down

0 comments on commit 098786d

Please sign in to comment.