diff --git a/main.go b/main.go index 1ccd8d62d..1e7fc9a52 100644 --- a/main.go +++ b/main.go @@ -1,11 +1,22 @@ package main import ( + "flag" + "github.com/hashicorp/terraform-plugin-sdk/v2/plugin" "github.com/terraform-provider-openstack/terraform-provider-openstack/openstack" ) +const providerAddr = "registry.terraform.io/terraform-provider-openstack/openstack" + func main() { + // added debugMode to enable debugging for provider per https://www.terraform.io/plugin/sdkv2/debugging + var debugMode bool + flag.BoolVar(&debugMode, "debug", false, "set to true to run the provider with support for debuggers like delve") + flag.Parse() + plugin.Serve(&plugin.ServeOpts{ + Debug: debugMode, + ProviderAddr: providerAddr, ProviderFunc: openstack.Provider}) } diff --git a/openstack/lb_v2_shared.go b/openstack/lb_v2_shared.go index 1c6a5619e..2578713c3 100644 --- a/openstack/lb_v2_shared.go +++ b/openstack/lb_v2_shared.go @@ -1090,14 +1090,16 @@ func flattenLBMembersV2(members []octaviapools.Member) []map[string]interface{} for i, member := range members { m[i] = map[string]interface{}{ - "name": member.Name, - "weight": member.Weight, - "admin_state_up": member.AdminStateUp, - "subnet_id": member.SubnetID, - "address": member.Address, - "protocol_port": member.ProtocolPort, - "id": member.ID, - "backup": member.Backup, + "name": member.Name, + "weight": member.Weight, + "admin_state_up": member.AdminStateUp, + "subnet_id": member.SubnetID, + "address": member.Address, + "protocol_port": member.ProtocolPort, + "monitor_port": member.MonitorPort, + "monitor_address": member.MonitorAddress, + "id": member.ID, + "backup": member.Backup, } } @@ -1130,6 +1132,21 @@ func expandLBMembersV2(members *schema.Set, lbClient *gophercloud.ServiceClient) member.Backup = &backup } + // Only set monitor_port and monitor_address when explicitly specified, as they are optional arguments + if val, ok := rawMap["monitor_port"]; ok { + monitorPort := val.(int) + if monitorPort > 0 { + member.MonitorPort = &monitorPort + } + } + + if val, ok := rawMap["monitor_address"]; ok { + monitorAddress := val.(string) + if monitorAddress != "" { + member.MonitorAddress = &monitorAddress + } + } + m = append(m, member) } } diff --git a/openstack/resource_openstack_lb_members_v2.go b/openstack/resource_openstack_lb_members_v2.go index 5fd6aa371..b92847eab 100644 --- a/openstack/resource_openstack_lb_members_v2.go +++ b/openstack/resource_openstack_lb_members_v2.go @@ -78,6 +78,17 @@ func resourceMembersV2() *schema.Resource { ValidateFunc: validation.IntBetween(0, 256), }, + "monitor_port": { + Type: schema.TypeInt, + Optional: true, + ValidateFunc: validation.IntBetween(1, 65535), + }, + + "monitor_address": { + Type: schema.TypeString, + Optional: true, + }, + "subnet_id": { Type: schema.TypeString, Optional: true, diff --git a/openstack/resource_openstack_lb_members_v2_test.go b/openstack/resource_openstack_lb_members_v2_test.go index c6393eda4..cfb3f3bdb 100644 --- a/openstack/resource_openstack_lb_members_v2_test.go +++ b/openstack/resource_openstack_lb_members_v2_test.go @@ -55,6 +55,10 @@ func TestAccLBV2Members_basic(t *testing.T) { resource.TestCheckResourceAttr("openstack_lb_members_v2.members_1", "member.1.weight", "1"), resource.TestCheckResourceAttr("openstack_lb_members_v2.members_1", "member.0.backup", "false"), resource.TestCheckResourceAttr("openstack_lb_members_v2.members_1", "member.1.backup", "true"), + resource.TestCheckResourceAttr("openstack_lb_members_v2.members_1", "member.0.monitor_address", "192.168.199.110"), + resource.TestCheckResourceAttr("openstack_lb_members_v2.members_1", "member.1.monitor_address", "192.168.199.111"), + resource.TestCheckResourceAttr("openstack_lb_members_v2.members_1", "member.0.monitor_port", "8088"), + resource.TestCheckResourceAttr("openstack_lb_members_v2.members_1", "member.1.monitor_port", "8088"), ), }, { @@ -68,6 +72,10 @@ func TestAccLBV2Members_basic(t *testing.T) { resource.TestCheckResourceAttr("openstack_lb_members_v2.members_1", "member.1.weight", "15"), resource.TestCheckResourceAttr("openstack_lb_members_v2.members_1", "member.0.backup", "true"), resource.TestCheckResourceAttr("openstack_lb_members_v2.members_1", "member.1.backup", "false"), + resource.TestCheckResourceAttr("openstack_lb_members_v2.members_1", "member.0.monitor_address", "192.168.199.10"), + resource.TestCheckResourceAttr("openstack_lb_members_v2.members_1", "member.1.monitor_address", "192.168.199.11"), + resource.TestCheckResourceAttr("openstack_lb_members_v2.members_1", "member.0.monitor_port", "8080"), + resource.TestCheckResourceAttr("openstack_lb_members_v2.members_1", "member.1.monitor_port", "8080"), ), }, { @@ -202,6 +210,8 @@ resource "openstack_lb_members_v2" "members_1" { member { address = "192.168.199.110" protocol_port = 8080 + monitor_address = "192.168.199.110" + monitor_port = 8088 subnet_id = "${openstack_networking_subnet_v2.subnet_1.id}" weight = 0 } @@ -209,8 +219,10 @@ resource "openstack_lb_members_v2" "members_1" { member { address = "192.168.199.111" protocol_port = 8080 - subnet_id = "${openstack_networking_subnet_v2.subnet_1.id}" - backup = true + monitor_address = "192.168.199.111" + monitor_port = 8088 + subnet_id = "${openstack_networking_subnet_v2.subnet_1.id}" + backup = true } timeouts { @@ -259,6 +271,8 @@ resource "openstack_lb_members_v2" "members_1" { member { address = "192.168.199.110" protocol_port = 8080 + monitor_address = "192.168.199.10" + monitor_port = 8080 weight = 10 admin_state_up = "true" subnet_id = "${openstack_networking_subnet_v2.subnet_1.id}" @@ -268,10 +282,12 @@ resource "openstack_lb_members_v2" "members_1" { member { address = "192.168.199.111" protocol_port = 8080 + monitor_address = "192.168.199.11" + monitor_port = 8080 weight = 15 admin_state_up = "true" - subnet_id = "${openstack_networking_subnet_v2.subnet_1.id}" - backup = false + subnet_id = "${openstack_networking_subnet_v2.subnet_1.id}" + backup = false } timeouts { diff --git a/website/docs/r/lb_members_v2.html.markdown b/website/docs/r/lb_members_v2.html.markdown index ebadde13b..56a1b178d 100644 --- a/website/docs/r/lb_members_v2.html.markdown +++ b/website/docs/r/lb_members_v2.html.markdown @@ -66,6 +66,12 @@ The `member` block supports: example, a member with a weight of 10 receives five times as much traffic as a member with a weight of 2. Defaults to 1. +* `monitor_port` - (Optional) An alternate protocol port used for health + monitoring a backend member. + +* `monitor_address` - (Optional) An alternate IP address used for health +monitoring a backend member. + * `admin_state_up` - (Optional) The administrative state of the member. A valid value is true (UP) or false (DOWN). Defaults to true.