Skip to content

Commit b7ce79c

Browse files
committed
Implement nsxt_manager_cluster_node data source
A data source which exposes manager cluster nodes Signed-off-by: Kobi Samoray <ksamoray@vmware.com>
1 parent 29d383f commit b7ce79c

File tree

4 files changed

+148
-0
lines changed

4 files changed

+148
-0
lines changed
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
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/services/nsxt-mp/nsx/cluster"
12+
"github.com/vmware/vsphere-automation-sdk-go/services/nsxt-mp/nsx/model"
13+
)
14+
15+
func dataSourceNsxtManagerClusterNode() *schema.Resource {
16+
return &schema.Resource{
17+
Read: dataSourceNsxtManagerClusterNodeRead,
18+
DeprecationMessage: mpObjectDataSourceDeprecationMessage,
19+
Schema: map[string]*schema.Schema{
20+
"id": {
21+
Type: schema.TypeString,
22+
Description: "Unique ID of this resource",
23+
Optional: true,
24+
Computed: true,
25+
},
26+
"display_name": {
27+
Type: schema.TypeString,
28+
Description: "The display name of this resource",
29+
Optional: true,
30+
Computed: true,
31+
},
32+
"description": {
33+
Type: schema.TypeString,
34+
Description: "Description of this resource",
35+
Optional: true,
36+
Computed: true,
37+
},
38+
"appliance_mgmt_listen_address": {
39+
Type: schema.TypeString,
40+
Optional: true,
41+
Computed: true,
42+
Description: "The IP and port for the appliance management API service on this node",
43+
},
44+
},
45+
}
46+
}
47+
48+
func dataSourceNsxtManagerClusterNodeRead(d *schema.ResourceData, m interface{}) error {
49+
connector := getPolicyConnector(m)
50+
client := cluster.NewNodesClient(connector)
51+
52+
objID := d.Get("id").(string)
53+
objName := d.Get("display_name").(string)
54+
var obj model.ClusterNodeConfig
55+
if objID != "" {
56+
// Get by id
57+
objGet, err := client.Get(objID)
58+
if err != nil {
59+
return handleDataSourceReadError(d, "ClusterNode", objID, err)
60+
}
61+
obj = objGet
62+
} else if objName == "" {
63+
return fmt.Errorf("error obtaining ClusterNode ID or name during read")
64+
} else {
65+
// Get by full name/prefix
66+
objList, err := client.List(nil, nil, nil, nil, nil)
67+
if err != nil {
68+
return handleListError("ClusterNode", err)
69+
}
70+
// go over the list to find the correct one (prefer a perfect match. If not - prefix match)
71+
var perfectMatch []model.ClusterNodeConfig
72+
var prefixMatch []model.ClusterNodeConfig
73+
for _, objInList := range objList.Results {
74+
if strings.HasPrefix(*objInList.DisplayName, objName) {
75+
prefixMatch = append(prefixMatch, objInList)
76+
}
77+
if *objInList.DisplayName == objName {
78+
perfectMatch = append(perfectMatch, objInList)
79+
}
80+
}
81+
if len(perfectMatch) > 0 {
82+
if len(perfectMatch) > 1 {
83+
return fmt.Errorf("found multiple ClusterNode with name '%s'", objName)
84+
}
85+
obj = perfectMatch[0]
86+
} else if len(prefixMatch) > 0 {
87+
if len(prefixMatch) > 1 {
88+
return fmt.Errorf("found multiple ClusterNodes with name starting with '%s'", objName)
89+
}
90+
obj = prefixMatch[0]
91+
} else {
92+
return fmt.Errorf("ClusterNode with name '%s' was not found", objName)
93+
}
94+
}
95+
96+
d.SetId(*obj.Id)
97+
d.Set("appliance_mgmt_listen_address", obj.ApplianceMgmtListenAddr)
98+
d.Set("display_name", obj.DisplayName)
99+
d.Set("description", obj.Description)
100+
101+
return nil
102+
}
Lines changed: 41 additions & 0 deletions
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 TestAccDataSourceNsxtManagerClusterNode_basic(t *testing.T) {
14+
testResourceName := "data.nsxt_manager_cluster_node.test"
15+
16+
resource.ParallelTest(t, resource.TestCase{
17+
PreCheck: func() {
18+
testAccOnlyLocalManager(t)
19+
testAccPreCheck(t)
20+
testAccNSXVersion(t, "4.1.0")
21+
testAccEnvDefined(t, "NSXT_TEST_MANAGER_CLUSTER_NODE")
22+
},
23+
Providers: testAccProviders,
24+
Steps: []resource.TestStep{
25+
{
26+
Config: testAccNsxtPolicyManagerClusterNodeReadTemplate(),
27+
Check: resource.ComposeTestCheckFunc(
28+
resource.TestCheckResourceAttrSet(testResourceName, "display_name"),
29+
resource.TestCheckResourceAttrSet(testResourceName, "appliance_mgmt_listen_address"),
30+
),
31+
},
32+
},
33+
})
34+
}
35+
36+
func testAccNsxtPolicyManagerClusterNodeReadTemplate() string {
37+
return fmt.Sprintf(`
38+
data "nsxt_manager_cluster_node" "test" {
39+
display_name = "%s"
40+
}`, getTestManagerClusterNode())
41+
}

nsxt/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ func Provider() *schema.Provider {
292292
"nsxt_compute_collection": dataSourceNsxtComputeCollection(),
293293
"nsxt_compute_manager_realization": dataSourceNsxtComputeManagerRealization(),
294294
"nsxt_policy_host_transport_node": dataSourceNsxtPolicyHostTransportNode(),
295+
"nsxt_manager_cluster_node": dataSourceNsxtManagerClusterNode(),
295296
},
296297

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

nsxt/utils_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,10 @@ func getTestLdapUser() string {
194194
return os.Getenv("NSXT_TEST_LDAP_USER")
195195
}
196196

197+
func getTestManagerClusterNode() string {
198+
return os.Getenv("NSXT_TEST_MANAGER_CLUSTER_NODE")
199+
}
200+
197201
func testAccEnvDefined(t *testing.T, envVar string) {
198202
if len(os.Getenv(envVar)) == 0 {
199203
t.Skipf("This test requires %s environment variable to be set", envVar)

0 commit comments

Comments
 (0)