Skip to content

Commit 48d7ab3

Browse files
authored
Merge pull request #1030 from ksamoray/ds-transport-node
Implement nsxt_edge_transport_node data source
2 parents 7941132 + 5023870 commit 48d7ab3

5 files changed

+172
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/* Copyright © 2023 VMware, Inc. All Rights Reserved.
2+
SPDX-License-Identifier: MPL-2.0 */
3+
4+
package nsxt
5+
6+
import (
7+
"fmt"
8+
"strings"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
11+
"github.com/vmware/vsphere-automation-sdk-go/runtime/bindings"
12+
"github.com/vmware/vsphere-automation-sdk-go/services/nsxt-mp/nsx"
13+
"github.com/vmware/vsphere-automation-sdk-go/services/nsxt-mp/nsx/model"
14+
)
15+
16+
func dataSourceNsxtEdgeTransportNode() *schema.Resource {
17+
return &schema.Resource{
18+
Read: dataSourceNsxtEdgeTransportNodeRead,
19+
20+
Schema: map[string]*schema.Schema{
21+
"id": getDataSourceIDSchema(),
22+
"display_name": getDataSourceExtendedDisplayNameSchema(),
23+
"description": getDescriptionSchema(),
24+
},
25+
}
26+
}
27+
28+
func dataSourceNsxtEdgeTransportNodeRead(d *schema.ResourceData, m interface{}) error {
29+
connector := getPolicyConnector(m)
30+
client := nsx.NewTransportNodesClient(connector)
31+
32+
objID := d.Get("id").(string)
33+
objName := d.Get("display_name").(string)
34+
35+
var obj model.TransportNode
36+
37+
if objID != "" {
38+
// Get by id
39+
objGet, err := client.Get(objID)
40+
if err != nil {
41+
return fmt.Errorf("failed to read TransportNode %s: %v", objID, err)
42+
}
43+
44+
// Make sure that found obj is an EdgeNode
45+
converter := bindings.NewTypeConverter()
46+
base, errs := converter.ConvertToGolang(obj.NodeDeploymentInfo, model.NodeBindingType())
47+
if errs != nil {
48+
return fmt.Errorf("failed to convert NodeDeploymentInfo for node %s %v", objID, errs[0])
49+
}
50+
node := base.(model.Node)
51+
if node.ResourceType != model.EdgeNode__TYPE_IDENTIFIER {
52+
return fmt.Errorf("no Transport Node matches the criteria")
53+
}
54+
obj = objGet
55+
} else {
56+
// Get by full name/prefix - filter out anything except EdgeNodes
57+
objType := model.EdgeNode__TYPE_IDENTIFIER
58+
objList, err := client.List(nil, nil, nil, nil, nil, &objType, nil, nil, nil, nil)
59+
if err != nil {
60+
return fmt.Errorf("failed to read Transport Nodes: %v", err)
61+
}
62+
// go over the list to find the correct one (prefer a perfect match. If not - prefix match)
63+
var perfectMatch []model.TransportNode
64+
var prefixMatch []model.TransportNode
65+
for _, objInList := range objList.Results {
66+
if len(objName) == 0 {
67+
// We want to grab single Transport Node
68+
perfectMatch = append(perfectMatch, objInList)
69+
continue
70+
}
71+
if strings.HasPrefix(*objInList.DisplayName, objName) {
72+
prefixMatch = append(prefixMatch, objInList)
73+
}
74+
if *objInList.DisplayName == objName {
75+
perfectMatch = append(perfectMatch, objInList)
76+
}
77+
}
78+
if len(perfectMatch) > 0 {
79+
if len(perfectMatch) > 1 {
80+
return fmt.Errorf("found multiple Transport Nodes matching the criteria")
81+
}
82+
obj = perfectMatch[0]
83+
} else if len(prefixMatch) > 0 {
84+
if len(prefixMatch) > 1 {
85+
return fmt.Errorf("found multiple Transport Nodes matching the criteria")
86+
}
87+
obj = prefixMatch[0]
88+
} else {
89+
return fmt.Errorf("no Transport Node matches the criteria")
90+
}
91+
}
92+
d.SetId(*obj.Id)
93+
d.Set("display_name", obj.DisplayName)
94+
d.Set("description", obj.Description)
95+
96+
return nil
97+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/* Copyright © 2023 VMware, Inc. All Rights Reserved.
2+
SPDX-License-Identifier: MPL-2.0 */
3+
4+
package nsxt
5+
6+
import (
7+
"fmt"
8+
"testing"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
)
12+
13+
func TestAccDataSourceNsxtEdgeTransportNode_basic(t *testing.T) {
14+
htnName := getEdgeTransportNodeName()
15+
testResourceName := "data.nsxt_edge_transport_node.test"
16+
17+
resource.ParallelTest(t, resource.TestCase{
18+
PreCheck: func() {
19+
testAccOnlyLocalManager(t)
20+
testAccPreCheck(t)
21+
testAccEnvDefined(t, "NSXT_TEST_EDGE_TRANSPORT_NODE")
22+
},
23+
Providers: testAccProviders,
24+
Steps: []resource.TestStep{
25+
{
26+
Config: testAccNSXEdgeTransportNodeReadTemplate(htnName),
27+
Check: resource.ComposeTestCheckFunc(
28+
resource.TestCheckResourceAttr(testResourceName, "display_name", htnName),
29+
resource.TestCheckResourceAttrSet(testResourceName, "id"),
30+
),
31+
},
32+
},
33+
})
34+
}
35+
36+
func testAccNSXEdgeTransportNodeReadTemplate(name string) string {
37+
return fmt.Sprintf(`
38+
data "nsxt_edge_transport_node" "test" {
39+
display_name = "%s"
40+
}`, name)
41+
}

nsxt/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ func Provider() *schema.Provider {
294294
"nsxt_policy_host_transport_node": dataSourceNsxtPolicyHostTransportNode(),
295295
"nsxt_manager_cluster_node": dataSourceNsxtManagerClusterNode(),
296296
"nsxt_policy_host_transport_node_profile": dataSourceNsxtPolicyHostTransportNodeProfile(),
297+
"nsxt_transport_node": dataSourceNsxtEdgeTransportNode(),
297298
},
298299

299300
ResourcesMap: map[string]*schema.Resource{

nsxt/utils_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@ func getHostTransportNodeProfileName() string {
143143
return os.Getenv("NSXT_TEST_HOST_TRANSPORT_NODE_PROFILE")
144144
}
145145

146+
func getEdgeTransportNodeName() string {
147+
return os.Getenv("NSXT_TEST_EDGE_TRANSPORT_NODE")
148+
}
149+
146150
func getVlanTransportZoneName() string {
147151
name := os.Getenv("NSXT_TEST_VLAN_TRANSPORT_ZONE")
148152
if name == "" {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
subcategory: "Beta"
3+
layout: "nsxt"
4+
page_title: "NSXT: edge_transport_node"
5+
description: An Edge Transport Node data source.
6+
---
7+
8+
# nsxt_edge_transport_node
9+
10+
This data source provides information about an Edge Transport Node configured on NSX.
11+
12+
## Example Usage
13+
14+
```hcl
15+
data "nsxt_edge_transport_node" "test_node" {
16+
display_name = "edgenode1"
17+
}
18+
```
19+
20+
## Argument Reference
21+
22+
* `id` - (Optional) The ID of Edge Transport Node to retrieve
23+
* `display_name` - (Optional) The Display Name of the Edge Transport Node to retrieve.
24+
25+
## Attributes Reference
26+
27+
In addition to arguments listed above, the following attributes are exported:
28+
29+
* `description` - The description of the resource.

0 commit comments

Comments
 (0)