Skip to content

Commit

Permalink
Add upgradeGroup data source
Browse files Browse the repository at this point in the history
Signed-off-by: graysonwu <[email protected]>
  • Loading branch information
GraysonWu committed Jan 24, 2024
1 parent f1e5494 commit 791be57
Show file tree
Hide file tree
Showing 5 changed files with 226 additions and 0 deletions.
142 changes: 142 additions & 0 deletions nsxt/data_source_nsxt_edge_upgrade_group.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
/* Copyright © 2024 VMware, Inc. All Rights Reserved.
SPDX-License-Identifier: MPL-2.0 */

package nsxt

import (
"fmt"
"strings"
"time"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/vmware/vsphere-automation-sdk-go/services/nsxt-mp/nsx/model"
"github.com/vmware/vsphere-automation-sdk-go/services/nsxt-mp/nsx/upgrade"
)

var (
edgeUpgradeGroup = "EDGE"
hostUpgradeGroup = "HOST"

timeoutUUGCreat = 5 * time.Minute
intervalUUGCreat = 5 * time.Second
)

func dataSourceNsxtEdgeUpgradeGroup() *schema.Resource {
return &schema.Resource{
Read: dataSourceNsxtEdgeUpgradeGroupRead,

Schema: map[string]*schema.Schema{
"id": getDataSourceIDSchema(),
"display_name": getDataSourceDisplayNameSchema(),
"description": getDataSourceDescriptionSchema(),
},
}
}

func dataSourceNsxtEdgeUpgradeGroupRead(d *schema.ResourceData, m interface{}) error {
return upgradeGroupRead(d, m, edgeUpgradeGroup)
}

func upgradeGroupRead(d *schema.ResourceData, m interface{}, groupType string) error {
connector := getPolicyConnector(m)
client := upgrade.NewUpgradeUnitGroupsClient(connector)

err := waitUpgradeGroupCreate(client, groupType)
if err != nil {
return fmt.Errorf("unable to fetch UpgradeUnitGroup: %v", err)
}

objID := d.Get("id").(string)
objName := d.Get("display_name").(string)

var obj model.UpgradeUnitGroup
if objID != "" {
// Get by id
objGet, err := client.Get(objID, nil)
if isNotFoundError(err) {
return fmt.Errorf("%s UpgradeUnitGroup with ID %s was not found", groupType, objID)
}

if err != nil {
return fmt.Errorf("error while reading %s UpgradeUnitGroup %s: %v", groupType, objID, err)
}

if *objGet.Type_ != groupType {
return fmt.Errorf("%s UpgradeUnitGroup with ID %s was not found", groupType, objID)
}
obj = objGet

} else if objName == "" {
return fmt.Errorf("error obtaining %s UpgradeUnitGroup ID or name during read", groupType)
} else {
// Get by full name/prefix
objList, err := client.List(&groupType, nil, nil, nil, nil, nil, nil, nil)
if err != nil {
return fmt.Errorf("error while reading %s UpgradeUnitGroup: %v", groupType, err)
}
// go over the list to find the correct one (prefer a perfect match. If not - prefix match)
var perfectMatch []model.UpgradeUnitGroup
var prefixMatch []model.UpgradeUnitGroup
for _, objInList := range objList.Results {
if strings.HasPrefix(*objInList.DisplayName, objName) {
prefixMatch = append(prefixMatch, objInList)
}
if *objInList.DisplayName == objName {
perfectMatch = append(perfectMatch, objInList)
}
}
if len(perfectMatch) > 0 {
if len(perfectMatch) > 1 {
return fmt.Errorf("found multiple %s UpgradeUnitGroup with name '%s'", groupType, objName)
}
obj = perfectMatch[0]
} else if len(prefixMatch) > 0 {
if len(prefixMatch) > 1 {
return fmt.Errorf("found multiple %s UpgradeUnitGroup with name starting with '%s'", groupType, objName)
}
obj = prefixMatch[0]
} else {
return fmt.Errorf("%s UpgradeUnitGroup with name '%s' was not found", groupType, objName)
}
}

d.SetId(*obj.Id)
d.Set("display_name", obj.DisplayName)
d.Set("description", obj.Description)

return nil
}

func waitUpgradeGroupCreate(client upgrade.UpgradeUnitGroupsClient, groupType string) error {

resultChan := make(chan error, 1)

poll := func(resultChan chan error) {
preLen := 0
for {
objList, err := client.List(&groupType, nil, nil, nil, nil, nil, nil, nil)
if err != nil && !isNotFoundError(err) {
resultChan <- err
return
}
if err == nil && len(objList.Results) > 0 {
if preLen == 0 {
preLen = len(objList.Results)
} else if preLen == len(objList.Results) {
resultChan <- nil
return
}
}
time.Sleep(intervalUUGCreat)
}
}

go poll(resultChan)

select {
case res := <-resultChan:
return res
case <-time.After(timeoutUUGCreat):
return fmt.Errorf("timeout reached")
}
}
24 changes: 24 additions & 0 deletions nsxt/data_source_nsxt_host_upgrade_group.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/* Copyright © 2024 VMware, Inc. All Rights Reserved.
SPDX-License-Identifier: MPL-2.0 */

package nsxt

import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func dataSourceNsxtHostUpgradeGroup() *schema.Resource {
return &schema.Resource{
Read: dataSourceNsxtHostUpgradeGroupRead,

Schema: map[string]*schema.Schema{
"id": getDataSourceIDSchema(),
"display_name": getDataSourceDisplayNameSchema(),
"description": getDataSourceDescriptionSchema(),
},
}
}

func dataSourceNsxtHostUpgradeGroupRead(d *schema.ResourceData, m interface{}) error {
return upgradeGroupRead(d, m, hostUpgradeGroup)
}
2 changes: 2 additions & 0 deletions nsxt/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,8 @@ func Provider() *schema.Provider {
"nsxt_policy_host_transport_node_profile": dataSourceNsxtPolicyHostTransportNodeProfile(),
"nsxt_transport_node": dataSourceNsxtEdgeTransportNode(),
"nsxt_discover_node": dataSourceNsxtDiscoverNode(),
"nsxt_edge_upgrade_group": dataSourceNsxtEdgeUpgradeGroup(),
"nsxt_host_upgrade_group": dataSourceNsxtHostUpgradeGroup(),
},

ResourcesMap: map[string]*schema.Resource{
Expand Down
29 changes: 29 additions & 0 deletions website/docs/d/edge_upgrade_group.html.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
subcategory: "Beta"
layout: "nsxt"
page_title: "NSXT: edge_upgrade_group"
description: An Edge Upgrade Group data source.
---

# nsxt_edge_upgrade_group

This data source provides information about an Edge Upgrade Group configured on NSX.

## Example Usage

```hcl
data "nsxt_edge_upgrade_group" "test" {
display_name = "edgeupgradegroup1"
}
```

## Argument Reference

* `id` - (Optional) The ID of Edge Upgrade Group to retrieve
* `display_name` - (Optional) The Display Name of the Edge Upgrade Group to retrieve.

## Attributes Reference

In addition to arguments listed above, the following attributes are exported:

* `description` - The description of the resource.
29 changes: 29 additions & 0 deletions website/docs/d/host_upgrade_group.html.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
subcategory: "Beta"
layout: "nsxt"
page_title: "NSXT: host_upgrade_group"
description: A Host Upgrade Group data source.
---

# nsxt_host_upgrade_group

This data source provides information about a Host Upgrade Group configured on NSX.

## Example Usage

```hcl
data "nsxt_host_upgrade_group" "test" {
display_name = "hostupgradegroup1"
}
```

## Argument Reference

* `id` - (Optional) The ID of Host Upgrade Group to retrieve
* `display_name` - (Optional) The Display Name of the Host Upgrade Group to retrieve.

## Attributes Reference

In addition to arguments listed above, the following attributes are exported:

* `description` - The description of the resource.

0 comments on commit 791be57

Please sign in to comment.