-
Notifications
You must be signed in to change notification settings - Fork 85
/
data_source_nsxt_policy_edge_node.go
132 lines (119 loc) · 4.41 KB
/
data_source_nsxt_policy_edge_node.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* Copyright © 2019 VMware, Inc. All Rights Reserved.
SPDX-License-Identifier: MPL-2.0 */
package nsxt
import (
"fmt"
"strconv"
"strings"
"github.com/vmware/terraform-provider-nsxt/nsxt/util"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
"github.com/vmware/vsphere-automation-sdk-go/runtime/bindings"
"github.com/vmware/vsphere-automation-sdk-go/services/nsxt/infra/sites/enforcement_points/edge_clusters"
"github.com/vmware/vsphere-automation-sdk-go/services/nsxt/model"
)
func dataSourceNsxtPolicyEdgeNode() *schema.Resource {
return &schema.Resource{
Read: dataSourceNsxtPolicyEdgeNodeRead,
Schema: map[string]*schema.Schema{
"edge_cluster_path": getPolicyPathSchema(true, false, "Edge cluster Path"),
"member_index": {
Type: schema.TypeInt,
Description: "Index of this node within edge cluster",
Optional: true,
ValidateFunc: validation.IntAtLeast(0),
},
"id": getDataSourceIDSchema(),
"display_name": getDataSourceDisplayNameSchema(),
"description": getDataSourceDescriptionSchema(),
"path": getPathSchema(),
},
}
}
func dataSourceNsxtPolicyEdgeNodeRead(d *schema.ResourceData, m interface{}) error {
// Read an edge node by name or id
edgeClusterPath := d.Get("edge_cluster_path").(string)
// Note - according to the documentation GetOkExists should be used
// for bool types, but in this case it works and GetOk doesn't
memberIndex, memberIndexSet := d.GetOkExists("member_index")
if isPolicyGlobalManager(m) || util.NsxVersionHigherOrEqual("3.2.0") {
query := make(map[string]string)
query["parent_path"] = edgeClusterPath
if memberIndexSet {
query["member_index"] = strconv.Itoa(memberIndex.(int))
}
obj, err := policyDataSourceResourceReadWithValidation(d, getPolicyConnector(m), getSessionContext(d, m), "PolicyEdgeNode", query, false)
if err != nil {
return err
}
converter := bindings.NewTypeConverter()
dataValue, errors := converter.ConvertToGolang(obj, model.PolicyEdgeNodeBindingType())
if len(errors) > 0 {
return errors[0]
}
policyEdgeNode := dataValue.(model.PolicyEdgeNode)
d.Set("member_index", policyEdgeNode.MemberIndex)
return nil
}
// Local manager
connector := getPolicyConnector(m)
client := edge_clusters.NewEdgeNodesClient(connector)
var obj model.PolicyEdgeNode
edgeClusterID := getPolicyIDFromPath(edgeClusterPath)
objID := d.Get("id").(string)
if objID != "" {
// Get by id
objGet, err := client.Get(defaultSite, getPolicyEnforcementPoint(m), edgeClusterID, objID)
if err != nil {
return handleDataSourceReadError(d, "Edge Node", objID, err)
}
obj = objGet
} else {
// Get by full name/prefix
name, nameSet := d.GetOk("display_name")
objName := name.(string)
objMemberIndex := int64(memberIndex.(int))
includeMarkForDeleteObjectsParam := false
objList, err := client.List(defaultSite, getPolicyEnforcementPoint(m), edgeClusterID, nil, &includeMarkForDeleteObjectsParam, nil, nil, nil, nil)
if err != nil {
return handleListError("Edge Node", err)
}
// go over the list to find the correct one (prefer a perfect match. If not - prefix match)
var perfectMatch []model.PolicyEdgeNode
var prefixMatch []model.PolicyEdgeNode
for _, objInList := range objList.Results {
indexMatch := true
if memberIndexSet && objMemberIndex != *objInList.MemberIndex {
indexMatch = false
}
if nameSet && strings.HasPrefix(*objInList.DisplayName, objName) && indexMatch {
prefixMatch = append(prefixMatch, objInList)
}
if nameSet && *objInList.DisplayName == objName && indexMatch {
perfectMatch = append(perfectMatch, objInList)
}
if !nameSet && indexMatch {
perfectMatch = append(perfectMatch, objInList)
}
}
if len(perfectMatch) > 0 {
if len(perfectMatch) > 1 {
return fmt.Errorf("Found multiple edge nodes with name '%s' and index %d", objName, memberIndex)
}
obj = perfectMatch[0]
} else if len(prefixMatch) > 0 {
if len(prefixMatch) > 1 {
return fmt.Errorf("Found multiple edge nodes with name starting with '%s' and index %d", objName, memberIndex)
}
obj = prefixMatch[0]
} else {
return fmt.Errorf("edge node '%s' was not found and %d", objName, memberIndex)
}
}
d.SetId(*obj.Id)
d.Set("member_index", obj.MemberIndex)
d.Set("display_name", obj.DisplayName)
d.Set("description", obj.Description)
d.Set("path", obj.Path)
return nil
}