Skip to content

Commit

Permalink
Feature: lb cookie session persistence
Browse files Browse the repository at this point in the history
  • Loading branch information
deepaksibm authored and hkantare committed Aug 4, 2021
1 parent c5bd8f1 commit 66aad14
Show file tree
Hide file tree
Showing 5 changed files with 413 additions and 32 deletions.
40 changes: 40 additions & 0 deletions examples/ibm-is-ng/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,46 @@ resource "ibm_is_lb_listener_policy_rule" "lb_listener_policy_rule" {
value = "UpdateVal"
}

resource "ibm_is_lb_pool" "testacc_pool" {
name = "test_pool"
lb = ibm_is_lb.lb2.id
algorithm = "round_robin"
protocol = "https"
health_delay = 60
health_retries = 5
health_timeout = 30
health_type = "https"
proxy_protocol = "v1"
session_persistence_type = "app_cookie"
session_persistence_app_cookie_name = "cookie1"
}

resource "ibm_is_lb_pool" "testacc_pool" {
name = "test_pool"
lb = ibm_is_lb.lb2.id
algorithm = "round_robin"
protocol = "https"
health_delay = 60
health_retries = 5
health_timeout = 30
health_type = "https"
proxy_protocol = "v1"
session_persistence_type = "http_cookie"
}

resource "ibm_is_lb_pool" "testacc_pool" {
name = "test_pool"
lb = ibm_is_lb.lb2.id
algorithm = "round_robin"
protocol = "https"
health_delay = 60
health_retries = 5
health_timeout = 30
health_type = "https"
proxy_protocol = "v1"
session_persistence_type = "source_ip"
}

resource "ibm_is_vpn_gateway" "VPNGateway1" {
name = "vpn1"
subnet = ibm_is_subnet.subnet1.id
Expand Down
116 changes: 85 additions & 31 deletions ibm/resource_ibm_is_lb_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,38 +4,41 @@
package ibm

import (
"context"
"fmt"
"log"
"time"

"github.com/IBM/vpc-go-sdk/vpcv1"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

const (
isLBPoolName = "name"
isLBID = "lb"
isLBPoolAlgorithm = "algorithm"
isLBPoolProtocol = "protocol"
isLBPoolHealthDelay = "health_delay"
isLBPoolHealthRetries = "health_retries"
isLBPoolHealthTimeout = "health_timeout"
isLBPoolHealthType = "health_type"
isLBPoolHealthMonitorURL = "health_monitor_url"
isLBPoolHealthMonitorPort = "health_monitor_port"
isLBPoolSessPersistenceType = "session_persistence_type"
isLBPoolSessPersistenceCookieName = "session_persistence_cookie_name"
isLBPoolProvisioningStatus = "provisioning_status"
isLBPoolProxyProtocol = "proxy_protocol"
isLBPoolActive = "active"
isLBPoolCreatePending = "create_pending"
isLBPoolUpdatePending = "update_pending"
isLBPoolDeletePending = "delete_pending"
isLBPoolMaintainancePending = "maintenance_pending"
isLBPoolFailed = "failed"
isLBPoolDeleteDone = "deleted"
isLBPool = "pool_id"
isLBPoolName = "name"
isLBID = "lb"
isLBPoolAlgorithm = "algorithm"
isLBPoolProtocol = "protocol"
isLBPoolHealthDelay = "health_delay"
isLBPoolHealthRetries = "health_retries"
isLBPoolHealthTimeout = "health_timeout"
isLBPoolHealthType = "health_type"
isLBPoolHealthMonitorURL = "health_monitor_url"
isLBPoolHealthMonitorPort = "health_monitor_port"
isLBPoolSessPersistenceType = "session_persistence_type"
isLBPoolSessPersistenceAppCookieName = "session_persistence_app_cookie_name"
isLBPoolSessPersistenceHttpCookieName = "session_persistence_http_cookie_name"
isLBPoolProvisioningStatus = "provisioning_status"
isLBPoolProxyProtocol = "proxy_protocol"
isLBPoolActive = "active"
isLBPoolCreatePending = "create_pending"
isLBPoolUpdatePending = "update_pending"
isLBPoolDeletePending = "delete_pending"
isLBPoolMaintainancePending = "maintenance_pending"
isLBPoolFailed = "failed"
isLBPoolDeleteDone = "deleted"
isLBPool = "pool_id"
)

func resourceIBMISLBPool() *schema.Resource {
Expand All @@ -53,6 +56,12 @@ func resourceIBMISLBPool() *schema.Resource {
Delete: schema.DefaultTimeout(10 * time.Minute),
},

CustomizeDiff: customdiff.Sequence(
func(_ context.Context, diff *schema.ResourceDiff, v interface{}) error {
return resourceIBMISLBPoolCookieValidate(diff)
},
),

Schema: map[string]*schema.Schema{
isLBPoolName: {
Type: schema.TypeString,
Expand Down Expand Up @@ -128,10 +137,17 @@ func resourceIBMISLBPool() *schema.Resource {
Description: "Load Balancer Pool session persisence type.",
},

isLBPoolSessPersistenceCookieName: {
isLBPoolSessPersistenceAppCookieName: {
Type: schema.TypeString,
Optional: true,
ValidateFunc: InvokeValidator("ibm_is_lb_pool", isLBPoolSessPersistenceAppCookieName),
Description: "Load Balancer Pool session persisence app cookie name.",
},

isLBPoolSessPersistenceHttpCookieName: {
Type: schema.TypeString,
Optional: true,
Description: "Load Balancer Pool session persisence cookie name",
Computed: true,
Description: "Load Balancer Pool session persisence http cookie name.",
},

isLBPoolProvisioningStatus: {
Expand Down Expand Up @@ -168,7 +184,7 @@ func resourceIBMISLBPoolValidator() *ResourceValidator {
validateSchema := make([]ValidateSchema, 1)
algorithm := "round_robin, weighted_round_robin, least_connections"
protocol := "http, tcp, https"
persistanceType := "source_ip"
persistanceType := "source_ip, app_cookie, http_cookie"
proxyProtocol := "disabled, v1, v2"
validateSchema = append(validateSchema,
ValidateSchema{
Expand Down Expand Up @@ -207,6 +223,15 @@ func resourceIBMISLBPoolValidator() *ResourceValidator {
Type: TypeString,
Required: true,
AllowedValues: proxyProtocol})
validateSchema = append(validateSchema,
ValidateSchema{
Identifier: isLBPoolSessPersistenceAppCookieName,
ValidateFunctionIdentifier: ValidateRegexpLen,
Type: TypeString,
Optional: true,
Regexp: "^[-A-Za-z0-9!#$%&'*+.^_`~|]+$",
MinValueLength: 1,
MaxValueLength: 63})
validateSchema = append(validateSchema,
ValidateSchema{
Identifier: isLBPoolSessPersistenceType,
Expand Down Expand Up @@ -237,7 +262,7 @@ func resourceIBMISLBPoolCreate(d *schema.ResourceData, meta interface{}) error {
spType = pt.(string)
}

if cn, ok := d.GetOk(isLBPoolSessPersistenceCookieName); ok {
if cn, ok := d.GetOk(isLBPoolSessPersistenceAppCookieName); ok {
cName = cn.(string)
}
if pp, ok := d.GetOk(isLBPoolProxyProtocol); ok {
Expand Down Expand Up @@ -297,6 +322,9 @@ func lbPoolCreate(d *schema.ResourceData, meta interface{}, name, lbID, algorith
options.SessionPersistence = &vpcv1.LoadBalancerPoolSessionPersistencePrototype{
Type: &spType,
}
if cName != "" {
options.SessionPersistence.CookieName = &cName
}
}
if pProtocol != "" {
options.ProxyProtocol = &pProtocol
Expand Down Expand Up @@ -379,7 +407,20 @@ func lbPoolGet(d *schema.ResourceData, meta interface{}, lbID, lbPoolID string)
}
if lbPool.SessionPersistence != nil {
d.Set(isLBPoolSessPersistenceType, *lbPool.SessionPersistence.Type)
// d.Set(isLBPoolSessPersistenceCookieName, *lbPool.SessionPersistence.CookieName)
if lbPool.SessionPersistence.CookieName != nil {
if *lbPool.SessionPersistence.Type == "app_cookie" {
d.Set(isLBPoolSessPersistenceAppCookieName, *lbPool.SessionPersistence.CookieName)
d.Set(isLBPoolSessPersistenceHttpCookieName, "")
} else if *lbPool.SessionPersistence.Type == "http_cookie" {
d.Set(isLBPoolSessPersistenceHttpCookieName, *lbPool.SessionPersistence.CookieName)
d.Set(isLBPoolSessPersistenceAppCookieName, "")
}

}
} else {
d.Set(isLBPoolSessPersistenceType, "")
d.Set(isLBPoolSessPersistenceHttpCookieName, "")
d.Set(isLBPoolSessPersistenceAppCookieName, "")
}
d.Set(isLBPoolProvisioningStatus, *lbPool.ProvisioningStatus)
d.Set(isLBPoolProxyProtocol, *lbPool.ProxyProtocol)
Expand Down Expand Up @@ -450,12 +491,22 @@ func lbPoolUpdate(d *schema.ResourceData, meta interface{}, lbID, lbPoolID strin
hasChanged = true
}

if d.HasChange(isLBPoolSessPersistenceType) || d.HasChange(isLBPoolSessPersistenceCookieName) {
sessionPersistenceRemoved := false
if d.HasChange(isLBPoolSessPersistenceType) || d.HasChange(isLBPoolSessPersistenceAppCookieName) {
sesspersistancetype := d.Get(isLBPoolSessPersistenceType).(string)
sessionPersistence := &vpcv1.LoadBalancerPoolSessionPersistencePatch{
Type: &sesspersistancetype,
sessPersistanceCookieName := d.Get(isLBPoolSessPersistenceAppCookieName).(string)
sessionPersistence := &vpcv1.LoadBalancerPoolSessionPersistencePatch{}
if sesspersistancetype != "" {
sessionPersistence.Type = &sesspersistancetype
if sessPersistanceCookieName != "" {
sessionPersistence.CookieName = &sessPersistanceCookieName
}
} else {
sessionPersistenceRemoved = true
}

loadBalancerPoolPatchModel.SessionPersistence = sessionPersistence

hasChanged = true
}

Expand Down Expand Up @@ -493,6 +544,9 @@ func lbPoolUpdate(d *schema.ResourceData, meta interface{}, lbID, lbPoolID strin
if err != nil {
return fmt.Errorf("Error calling asPatch for LoadBalancerPoolPatch: %s", err)
}
if sessionPersistenceRemoved {
LoadBalancerPoolPatch["session_persistence"] = nil
}
updateLoadBalancerPoolOptions.LoadBalancerPoolPatch = LoadBalancerPoolPatch

_, response, err := sess.UpdateLoadBalancerPool(updateLoadBalancerPoolOptions)
Expand Down
Loading

0 comments on commit 66aad14

Please sign in to comment.