Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for configuring cluster virtual IP #938

Merged
merged 1 commit into from
Sep 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions nsxt/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,7 @@ func Provider() *schema.Provider {
"nsxt_uplink_host_switch_profile": resourceNsxtUplinkHostSwitchProfile(),
"nsxt_transport_node": resourceNsxtTransportNode(),
"nsxt_failure_domain": resourceNsxtFailureDomain(),
"nsxt_cluster_virtual_ip": resourceNsxtClusterVirualIP(),
},

ConfigureFunc: providerConfigure,
Expand Down
130 changes: 130 additions & 0 deletions nsxt/resource_nsxt_cluster_virtual_ip.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
/* Copyright © 2023 VMware, Inc. All Rights Reserved.
SPDX-License-Identifier: MPL-2.0 */

package nsxt

import (
"fmt"

"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/services/nsxt-mp/nsx/cluster"
nsxModel "github.com/vmware/vsphere-automation-sdk-go/services/nsxt-mp/nsx/model"
)

var ClusterVirtualIPForceType = []string{
nsxModel.ClusterVirtualIpProperties_FORCE_TRUE,
nsxModel.ClusterVirtualIpProperties_FORCE_FALSE,
}

var DefaultIPv4VirtualAddress = "0.0.0.0"

var DefaultIPv6VirtualAddress = "::"

func resourceNsxtClusterVirualIP() *schema.Resource {
return &schema.Resource{
Create: resourceNsxtClusterVirualIPCreate,
Read: resourceNsxtClusterVirualIPRead,
Update: resourceNsxtClusterVirualIPUpdate,
Delete: resourceNsxtClusterVirualIPDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Schema: map[string]*schema.Schema{
"force": {
Type: schema.TypeBool,
Description: "On enable it ignores duplicate address detection and DNS lookup validation check",
Optional: true,
Default: true,
},
"ip_address": {
Type: schema.TypeString,
Description: "Virtual IPv4 address",
Optional: true,
ValidateFunc: validation.IsIPv4Address,
Default: DefaultIPv4VirtualAddress,
annakhm marked this conversation as resolved.
Show resolved Hide resolved
},
"ipv6_address": {
Type: schema.TypeString,
Description: "Virtual IPv6 address",
Optional: true,
ValidateFunc: validation.IsIPv6Address,
Default: DefaultIPv6VirtualAddress,
},
},
}
}

func resourceNsxtClusterVirualIPCreate(d *schema.ResourceData, m interface{}) error {
// Create and update workflow are mostly the same for virtual IP resource
// except that create workflow sets the ID of this resource
id := d.Id()
if id == "" {
id = newUUID()
}
d.SetId(id)
err := setClusterVirtualIP(d, m)
if err != nil {
return err
}
return resourceNsxtClusterVirualIPRead(d, m)
}

func resourceNsxtClusterVirualIPRead(d *schema.ResourceData, m interface{}) error {
connector := getPolicyConnector(m)
client := cluster.NewApiVirtualIpClient(connector)

obj, err := client.Get()
if err != nil {
return err
}

// For some reason the Get() function of ApiVirtulIPClient will only return ip address information
// so skip setting force here
d.Set("ip_address", obj.IpAddress)
d.Set("ipv6_address", obj.Ip6Address)

return nil
}

func setClusterVirtualIP(d *schema.ResourceData, m interface{}) error {
connector := getPolicyConnector(m)
client := cluster.NewApiVirtualIpClient(connector)
force := d.Get("force").(bool)
ipAddress := d.Get("ip_address").(string)
ipv6Address := d.Get("ipv6_address").(string)
var forceStr string
if force {
forceStr = nsxModel.ClusterVirtualIpProperties_FORCE_TRUE
} else {
forceStr = nsxModel.ClusterVirtualIpProperties_FORCE_FALSE
}
_, err := client.Setvirtualip(&forceStr, &ipv6Address, &ipAddress)
if err != nil {
return fmt.Errorf("Failed to set cluster virtual ip: %s", err)
}
return nil
}

func resourceNsxtClusterVirualIPUpdate(d *schema.ResourceData, m interface{}) error {
err := setClusterVirtualIP(d, m)
if err != nil {
return err
}
return resourceNsxtClusterVirualIPRead(d, m)
}

func resourceNsxtClusterVirualIPDelete(d *schema.ResourceData, m interface{}) error {
connector := getPolicyConnector(m)
client := cluster.NewApiVirtualIpClient(connector)
_, err := client.Clearvirtualip()
if err != nil {
return fmt.Errorf("Failed to clear cluster virtual IPv4 address: %s", err)
}
_, err = client.Clearvirtualip6()
if err != nil {
return fmt.Errorf("Failed to clear cluster virtual IPv6 address: %s", err)
}
return nil
}
34 changes: 34 additions & 0 deletions website/docs/r/cluster_virtual_ip.html.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
subcategory: "Fabric"
layout: "nsxt"
page_title: "NSXT: nsxt_cluster_virtual_ip"
description: A resource to configure virtual IP of NSXT cluster.
---

# nsxt_cluster_virtual_ip

This resource provides a method for configuring the virtual IP of NSXT cluster.
This resource is supported with NSX 4.1.0 onwards.
2ez4szliu marked this conversation as resolved.
Show resolved Hide resolved
Only one instance of nsxt_cluster_virtual_ip resource is supported.

## Example Usage

```hcl
resource "nsxt_cluster_virtual_ip" "test" {
ip_address = "10.0.0.251"
ipv6_address = "fd01:1:2:2918:250:56ff:fe8b:7e4d"
force = "true"
}
```

## Argument Reference

The following arguments are supported:

* `force` - (Optional) A flag to determine if need to ignore duplicate address detection and DNS lookup validation check. Value can be `true` or `false`. Default value is `false`.
* `ip_address` - (Optional) Virtual IP Address of the cluster. Must be in the same subnet as the manager nodes. Default value is `0.0.0.0`.
* `ipv6_address` - (Optional) Virtual IPv6 Address of the cluster. To set ipv6 virtual IP address, IPv6 interface needs to be configured on manager nodes. Default value is `::`.

## Importing

Importing is not supported for this resource.
1 change: 1 addition & 0 deletions website/docs/r/manager_cluster.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ This resource provides a method for creating an NSXT cluster with several nodes
This resource is supported with NSX 4.1.0 onwards.
The main node for the cluster is the host in terraform nsxt provider config,
user will need to specify the nodes that will join the cluster in the resource config.
Only one instance of nsxt_manager_cluster resource is supported.

## Example Usage

Expand Down