Skip to content

Commit 9fdfd71

Browse files
annakhmwsquan171
authored andcommitted
PoC using reflect for resource implementation
Signed-off-by: Anna Khmelnitsky <[email protected]>
1 parent 7989347 commit 9fdfd71

2 files changed

+188
-94
lines changed

nsxt/resource_nsxt_policy_mac_discovery_profile.go

+124-25
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package nsxt
66
import (
77
"fmt"
88
"log"
9+
"reflect"
910

1011
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1112
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
@@ -21,6 +22,64 @@ var macDiscoveryProfileMacLimitPolicyValues = []string{
2122
model.MacDiscoveryProfile_MAC_LIMIT_POLICY_DROP,
2223
}
2324

25+
type testdata struct {
26+
createValue interface{}
27+
updateValue interface{}
28+
}
29+
30+
type metadata struct {
31+
readOnly bool
32+
sdkFieldName string
33+
introducedInVersion string
34+
testData testdata
35+
}
36+
37+
var macDiscoveryProfileMetadata = map[string]*metadata{
38+
"mac_change_enabled": {
39+
sdkFieldName: "MacChangeEnabled",
40+
testData: testdata{
41+
createValue: "true",
42+
updateValue: "false",
43+
},
44+
},
45+
"mac_learning_enabled": {
46+
sdkFieldName: "MacLearningEnabled",
47+
testData: testdata{
48+
createValue: "true",
49+
updateValue: "false",
50+
},
51+
},
52+
"mac_limit": {
53+
sdkFieldName: "MacLimit",
54+
testData: testdata{
55+
createValue: "20",
56+
updateValue: "50",
57+
},
58+
},
59+
"mac_limit_policy": {
60+
sdkFieldName: "MacLimitPolicy",
61+
testData: testdata{
62+
createValue: "ALLOW",
63+
updateValue: "DROP",
64+
},
65+
},
66+
"remote_overlay_mac_limit": {
67+
sdkFieldName: "RemoteOverlayMacLimit",
68+
testData: testdata{
69+
createValue: "2048",
70+
updateValue: "4096",
71+
},
72+
},
73+
"unknown_unicast_flooding_enabled": {
74+
sdkFieldName: "UnknownUnicastFloodingEnabled",
75+
introducedInVersion: "4.0.0",
76+
testData: testdata{
77+
createValue: "true",
78+
updateValue: "false",
79+
},
80+
},
81+
}
82+
2483
func resourceNsxtPolicyMacDiscoveryProfile() *schema.Resource {
2584
return &schema.Resource{
2685
Create: resourceNsxtPolicyMacDiscoveryProfileCreate,
@@ -98,26 +157,57 @@ func resourceNsxtPolicyMacDiscoveryProfileCreate(d *schema.ResourceData, m inter
98157
return err
99158
}
100159

160+
tags := getPolicyTagsFromSchema(d)
101161
displayName := d.Get("display_name").(string)
102162
description := d.Get("description").(string)
103-
tags := getPolicyTagsFromSchema(d)
104-
macChangeEnabled := d.Get("mac_change_enabled").(bool)
105-
macLearningEnabled := d.Get("mac_learning_enabled").(bool)
106-
macLimit := int64(d.Get("mac_limit").(int))
107-
macLimitPolicy := d.Get("mac_limit_policy").(string)
108-
remoteOverlayMacLimit := int64(d.Get("remote_overlay_mac_limit").(int))
109-
unknownUnicastFloodingEnabled := d.Get("unknown_unicast_flooding_enabled").(bool)
163+
/*
164+
macChangeEnabled := d.Get("mac_change_enabled").(bool)
165+
macLearningEnabled := d.Get("mac_learning_enabled").(bool)
166+
macLimit := int64(d.Get("mac_limit").(int))
167+
macLimitPolicy := d.Get("mac_limit_policy").(string)
168+
remoteOverlayMacLimit := int64(d.Get("remote_overlay_mac_limit").(int))
169+
unknownUnicastFloodingEnabled := d.Get("unknown_unicast_flooding_enabled").(bool)
170+
*/
110171

111172
obj := model.MacDiscoveryProfile{
112-
DisplayName: &displayName,
113-
Description: &description,
114-
Tags: tags,
115-
MacChangeEnabled: &macChangeEnabled,
116-
MacLearningEnabled: &macLearningEnabled,
117-
MacLimit: &macLimit,
118-
MacLimitPolicy: &macLimitPolicy,
119-
RemoteOverlayMacLimit: &remoteOverlayMacLimit,
120-
UnknownUnicastFloodingEnabled: &unknownUnicastFloodingEnabled,
173+
Tags: tags,
174+
DisplayName: &displayName,
175+
Description: &description,
176+
/*
177+
MacChangeEnabled: &macChangeEnabled,
178+
MacLearningEnabled: &macLearningEnabled,
179+
MacLimit: &macLimit,
180+
MacLimitPolicy: &macLimitPolicy,
181+
RemoteOverlayMacLimit: &remoteOverlayMacLimit,
182+
UnknownUnicastFloodingEnabled: &unknownUnicastFloodingEnabled,
183+
*/
184+
}
185+
186+
schemaDef := resourceNsxtPolicyMacDiscoveryProfile().Schema
187+
elem := reflect.ValueOf(&obj).Elem()
188+
for key, item := range macDiscoveryProfileMetadata {
189+
if item.readOnly {
190+
continue
191+
}
192+
if item.introducedInVersion != "" && nsxVersionLower(item.introducedInVersion) {
193+
continue
194+
}
195+
itemType := schemaDef[key].Type
196+
if itemType == schema.TypeString {
197+
value := d.Get(key).(string)
198+
log.Printf("[INFO] assigning string %v to %s", value, key)
199+
elem.FieldByName(item.sdkFieldName).Set(reflect.ValueOf(&value))
200+
}
201+
if itemType == schema.TypeBool {
202+
value := d.Get(key).(bool)
203+
log.Printf("[INFO] assigning bool %v to %s", value, key)
204+
elem.FieldByName(item.sdkFieldName).Set(reflect.ValueOf(&value))
205+
}
206+
if itemType == schema.TypeInt {
207+
value := int64(d.Get(key).(int))
208+
log.Printf("[INFO] assigning int %v to %s", value, key)
209+
elem.FieldByName(item.sdkFieldName).Set(reflect.ValueOf(&value))
210+
}
121211
}
122212

123213
// Create the resource using PATCH
@@ -149,19 +239,28 @@ func resourceNsxtPolicyMacDiscoveryProfileRead(d *schema.ResourceData, m interfa
149239
return handleReadError(d, "MacDiscoveryProfile", id, err)
150240
}
151241

152-
d.Set("display_name", obj.DisplayName)
153-
d.Set("description", obj.Description)
154242
setPolicyTagsInSchema(d, obj.Tags)
155243
d.Set("nsx_id", id)
156-
d.Set("path", obj.Path)
244+
d.Set("display_name", obj.DisplayName)
245+
d.Set("description", obj.Description)
157246
d.Set("revision", obj.Revision)
247+
d.Set("path", obj.Path)
158248

159-
d.Set("mac_change_enabled", obj.MacChangeEnabled)
160-
d.Set("mac_learning_enabled", obj.MacLearningEnabled)
161-
d.Set("mac_limit", obj.MacLimit)
162-
d.Set("mac_limit_policy", obj.MacLimitPolicy)
163-
d.Set("remote_overlay_mac_limit", obj.RemoteOverlayMacLimit)
164-
d.Set("unknown_unicast_flooding_enabled", obj.UnknownUnicastFloodingEnabled)
249+
elem := reflect.ValueOf(&obj).Elem()
250+
for key, item := range macDiscoveryProfileMetadata {
251+
d.Set(key, elem.FieldByName(item.sdkFieldName).Interface())
252+
}
253+
/*
254+
d.Set("display_name", obj.DisplayName)
255+
d.Set("description", obj.Description)
256+
257+
d.Set("mac_change_enabled", obj.MacChangeEnabled)
258+
d.Set("mac_learning_enabled", obj.MacLearningEnabled)
259+
d.Set("mac_limit", obj.MacLimit)
260+
d.Set("mac_limit_policy", obj.MacLimitPolicy)
261+
d.Set("remote_overlay_mac_limit", obj.RemoteOverlayMacLimit)
262+
d.Set("unknown_unicast_flooding_enabled", obj.UnknownUnicastFloodingEnabled)
263+
*/
165264

166265
return nil
167266
}

nsxt/resource_nsxt_policy_mac_discovery_profile_test.go

+64-69
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,18 @@ import (
88
"testing"
99

1010
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1112
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
1213
)
1314

14-
var accTestPolicyMacDiscoveryProfileCreateAttributes = map[string]string{
15-
"display_name": getAccTestResourceName(),
16-
"description": "terraform created",
17-
"mac_change_enabled": "true",
18-
"mac_learning_enabled": "true",
19-
"mac_limit": "2",
20-
"mac_limit_policy": "ALLOW",
21-
"remote_overlay_mac_limit": "2048",
22-
"unknown_unicast_flooding_enabled": "true",
23-
}
24-
25-
var accTestPolicyMacDiscoveryProfileUpdateAttributes = map[string]string{
26-
"display_name": getAccTestResourceName(),
27-
"description": "terraform updated",
28-
"mac_change_enabled": "false",
29-
"mac_learning_enabled": "false",
30-
"mac_limit": "5",
31-
"mac_limit_policy": "DROP",
32-
"remote_overlay_mac_limit": "4096",
33-
"unknown_unicast_flooding_enabled": "false",
34-
}
15+
// TODO - include display name in metadata
16+
var createDisplayName = getAccTestResourceName()
17+
var updateDisplayName = getAccTestResourceName()
3518

3619
func TestAccResourceNsxtPolicyMacDiscoveryProfile_basic(t *testing.T) {
3720
testAccResourceNsxtPolicyMacDiscoveryProfileBasic(t, false, func() {
3821
testAccPreCheck(t)
22+
testAccNSXVersion(t, "3.0.0")
3923
})
4024
}
4125

@@ -46,58 +30,77 @@ func TestAccResourceNsxtPolicyMacDiscoveryProfile_multitenancy(t *testing.T) {
4630
})
4731
}
4832

33+
func getMacDiscoveryProfileTestCheckFunc(testResourceName string, create bool) []resource.TestCheckFunc {
34+
displayName := createDisplayName
35+
if !create {
36+
displayName = updateDisplayName
37+
}
38+
result := []resource.TestCheckFunc{testAccNsxtPolicyMacDiscoveryProfileExists(displayName, testResourceName),
39+
resource.TestCheckResourceAttrSet(testResourceName, "nsx_id"),
40+
resource.TestCheckResourceAttrSet(testResourceName, "path"),
41+
resource.TestCheckResourceAttrSet(testResourceName, "revision"),
42+
resource.TestCheckResourceAttr(testResourceName, "tag.#", "1"),
43+
}
44+
for key, item := range macDiscoveryProfileMetadata {
45+
if item.introducedInVersion != "" && nsxVersionLower(item.introducedInVersion) {
46+
continue
47+
}
48+
49+
value := item.testData.createValue
50+
if !create {
51+
value = item.testData.updateValue
52+
}
53+
result = append(result, resource.TestCheckResourceAttr(testResourceName, key, value.(string)))
54+
}
55+
56+
return result
57+
}
58+
59+
func getMacDiscoveryProfileTestConfigAttributes(create bool) string {
60+
result := ""
61+
schemaDef := resourceNsxtPolicyMacDiscoveryProfile().Schema
62+
for key, item := range macDiscoveryProfileMetadata {
63+
if item.introducedInVersion != "" && nsxVersionLower(item.introducedInVersion) {
64+
continue
65+
}
66+
67+
value := item.testData.createValue
68+
if !create {
69+
value = item.testData.updateValue
70+
}
71+
72+
if schemaDef[key].Type == schema.TypeString {
73+
result += fmt.Sprintf("\n %s = \"%s\"", key, value.(string))
74+
} else {
75+
result += fmt.Sprintf("\n %s = %s", key, value.(string))
76+
}
77+
}
78+
79+
return result
80+
}
81+
4982
func testAccResourceNsxtPolicyMacDiscoveryProfileBasic(t *testing.T, withContext bool, preCheck func()) {
5083
testResourceName := "nsxt_policy_mac_discovery_profile.test"
5184

5285
resource.ParallelTest(t, resource.TestCase{
5386
PreCheck: preCheck,
5487
Providers: testAccProviders,
5588
CheckDestroy: func(state *terraform.State) error {
56-
return testAccNsxtPolicyMacDiscoveryProfileCheckDestroy(state, accTestPolicyMacDiscoveryProfileUpdateAttributes["display_name"])
89+
return testAccNsxtPolicyMacDiscoveryProfileCheckDestroy(state, updateDisplayName)
5790
},
5891
Steps: []resource.TestStep{
5992
{
6093
Config: testAccNsxtPolicyMacDiscoveryProfileTemplate(true, withContext),
61-
Check: resource.ComposeTestCheckFunc(
62-
testAccNsxtPolicyMacDiscoveryProfileExists(accTestPolicyMacDiscoveryProfileCreateAttributes["display_name"], testResourceName),
63-
resource.TestCheckResourceAttr(testResourceName, "display_name", accTestPolicyMacDiscoveryProfileCreateAttributes["display_name"]),
64-
resource.TestCheckResourceAttr(testResourceName, "description", accTestPolicyMacDiscoveryProfileCreateAttributes["description"]),
65-
resource.TestCheckResourceAttr(testResourceName, "mac_change_enabled", accTestPolicyMacDiscoveryProfileCreateAttributes["mac_change_enabled"]),
66-
resource.TestCheckResourceAttr(testResourceName, "mac_learning_enabled", accTestPolicyMacDiscoveryProfileCreateAttributes["mac_learning_enabled"]),
67-
resource.TestCheckResourceAttr(testResourceName, "mac_limit", accTestPolicyMacDiscoveryProfileCreateAttributes["mac_limit"]),
68-
resource.TestCheckResourceAttr(testResourceName, "mac_limit_policy", accTestPolicyMacDiscoveryProfileCreateAttributes["mac_limit_policy"]),
69-
resource.TestCheckResourceAttr(testResourceName, "remote_overlay_mac_limit", accTestPolicyMacDiscoveryProfileCreateAttributes["remote_overlay_mac_limit"]),
70-
resource.TestCheckResourceAttr(testResourceName, "unknown_unicast_flooding_enabled", accTestPolicyMacDiscoveryProfileCreateAttributes["unknown_unicast_flooding_enabled"]),
71-
72-
resource.TestCheckResourceAttrSet(testResourceName, "nsx_id"),
73-
resource.TestCheckResourceAttrSet(testResourceName, "path"),
74-
resource.TestCheckResourceAttrSet(testResourceName, "revision"),
75-
resource.TestCheckResourceAttr(testResourceName, "tag.#", "1"),
76-
),
94+
Check: resource.ComposeTestCheckFunc(getMacDiscoveryProfileTestCheckFunc(testResourceName, true)...),
7795
},
7896
{
7997
Config: testAccNsxtPolicyMacDiscoveryProfileTemplate(false, withContext),
80-
Check: resource.ComposeTestCheckFunc(
81-
testAccNsxtPolicyMacDiscoveryProfileExists(accTestPolicyMacDiscoveryProfileUpdateAttributes["display_name"], testResourceName),
82-
resource.TestCheckResourceAttr(testResourceName, "display_name", accTestPolicyMacDiscoveryProfileUpdateAttributes["display_name"]),
83-
resource.TestCheckResourceAttr(testResourceName, "description", accTestPolicyMacDiscoveryProfileUpdateAttributes["description"]),
84-
resource.TestCheckResourceAttr(testResourceName, "mac_change_enabled", accTestPolicyMacDiscoveryProfileUpdateAttributes["mac_change_enabled"]),
85-
resource.TestCheckResourceAttr(testResourceName, "mac_learning_enabled", accTestPolicyMacDiscoveryProfileUpdateAttributes["mac_learning_enabled"]),
86-
resource.TestCheckResourceAttr(testResourceName, "mac_limit", accTestPolicyMacDiscoveryProfileUpdateAttributes["mac_limit"]),
87-
resource.TestCheckResourceAttr(testResourceName, "mac_limit_policy", accTestPolicyMacDiscoveryProfileUpdateAttributes["mac_limit_policy"]),
88-
resource.TestCheckResourceAttr(testResourceName, "remote_overlay_mac_limit", accTestPolicyMacDiscoveryProfileUpdateAttributes["remote_overlay_mac_limit"]),
89-
resource.TestCheckResourceAttr(testResourceName, "unknown_unicast_flooding_enabled", accTestPolicyMacDiscoveryProfileUpdateAttributes["unknown_unicast_flooding_enabled"]),
90-
91-
resource.TestCheckResourceAttrSet(testResourceName, "nsx_id"),
92-
resource.TestCheckResourceAttrSet(testResourceName, "path"),
93-
resource.TestCheckResourceAttrSet(testResourceName, "revision"),
94-
resource.TestCheckResourceAttr(testResourceName, "tag.#", "1"),
95-
),
98+
Check: resource.ComposeTestCheckFunc(getMacDiscoveryProfileTestCheckFunc(testResourceName, false)...),
9699
},
97100
{
98101
Config: testAccNsxtPolicyMacDiscoveryProfileMinimalistic(withContext),
99102
Check: resource.ComposeTestCheckFunc(
100-
testAccNsxtPolicyMacDiscoveryProfileExists(accTestPolicyMacDiscoveryProfileCreateAttributes["display_name"], testResourceName),
103+
testAccNsxtPolicyMacDiscoveryProfileExists(createDisplayName, testResourceName),
101104
resource.TestCheckResourceAttr(testResourceName, "description", ""),
102105
resource.TestCheckResourceAttrSet(testResourceName, "nsx_id"),
103106
resource.TestCheckResourceAttrSet(testResourceName, "path"),
@@ -205,11 +208,9 @@ func testAccNsxtPolicyMacDiscoveryProfileCheckDestroy(state *terraform.State, di
205208
}
206209

207210
func testAccNsxtPolicyMacDiscoveryProfileTemplate(createFlow, withContext bool) string {
208-
var attrMap map[string]string
209-
if createFlow {
210-
attrMap = accTestPolicyMacDiscoveryProfileCreateAttributes
211-
} else {
212-
attrMap = accTestPolicyMacDiscoveryProfileUpdateAttributes
211+
displayName := createDisplayName
212+
if !createFlow {
213+
displayName = updateDisplayName
213214
}
214215
context := ""
215216
if withContext {
@@ -219,18 +220,12 @@ func testAccNsxtPolicyMacDiscoveryProfileTemplate(createFlow, withContext bool)
219220
resource "nsxt_policy_mac_discovery_profile" "test" {
220221
%s
221222
display_name = "%s"
222-
description = "%s"
223-
mac_change_enabled = %s
224-
mac_learning_enabled = %s
225-
mac_limit = %s
226-
mac_limit_policy = "%s"
227-
remote_overlay_mac_limit = %s
228-
unknown_unicast_flooding_enabled = %s
223+
%s
229224
tag {
230225
scope = "scope1"
231226
tag = "tag1"
232227
}
233-
}`, context, attrMap["display_name"], attrMap["description"], attrMap["mac_change_enabled"], attrMap["mac_learning_enabled"], attrMap["mac_limit"], attrMap["mac_limit_policy"], attrMap["remote_overlay_mac_limit"], attrMap["unknown_unicast_flooding_enabled"])
228+
}`, context, displayName, getMacDiscoveryProfileTestConfigAttributes(createFlow))
234229
}
235230

236231
func testAccNsxtPolicyMacDiscoveryProfileMinimalistic(withContext bool) string {
@@ -242,5 +237,5 @@ func testAccNsxtPolicyMacDiscoveryProfileMinimalistic(withContext bool) string {
242237
resource "nsxt_policy_mac_discovery_profile" "test" {
243238
%s
244239
display_name = "%s"
245-
}`, context, accTestPolicyMacDiscoveryProfileUpdateAttributes["display_name"])
240+
}`, context, updateDisplayName)
246241
}

0 commit comments

Comments
 (0)