Skip to content

Commit 211c2fc

Browse files
committed
feat(ppnlb): UI-40655 Add support for Reserved IP as member target of PPNLB
1 parent 99d1b6f commit 211c2fc

14 files changed

+11360
-10209
lines changed

common/github.com/IBM/vpc-go-sdk/vpcv1/vpc_v1.go

Lines changed: 11131 additions & 10209 deletions
Large diffs are not rendered by default.

ibm/service/vpc/data_source_ibm_is_lb.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ func DataSourceIBMISLB() *schema.Resource {
9595
Computed: true,
9696
Description: "Indicates whether this load balancer supports source IP session persistence.",
9797
},
98+
isLBReservedIPtargetSupported: {
99+
Type: schema.TypeBool,
100+
Computed: true,
101+
Description: "Indicates whether this load balancer supports members with reserved IP as target.",
102+
},
98103
isLBUdpSupported: {
99104
Type: schema.TypeBool,
100105
Computed: true,
@@ -420,6 +425,9 @@ func lbGetByName(d *schema.ResourceData, meta interface{}, name string) error {
420425
if lb.RouteMode != nil {
421426
d.Set(isLBRouteMode, *lb.RouteMode)
422427
}
428+
if lb.ReservedIPTargetSupported != nil {
429+
d.Set(isLBReservedIPtargetSupported, *lb.ReservedIPTargetSupported)
430+
}
423431
if lb.UDPSupported != nil {
424432
d.Set(isLBUdpSupported, *lb.UDPSupported)
425433
}

ibm/service/vpc/data_source_ibm_is_lb_profile.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@ func DataSourceIBMISLbProfile() *schema.Resource {
6161
Computed: true,
6262
Description: "The product family this load balancer profile belongs to",
6363
},
64+
"reserved_ip_target_supported": {
65+
Type: schema.TypeBool,
66+
Computed: true,
67+
Description: "The Reserved IP Target support for a load balancer with this profile",
68+
},
69+
"reserved_ip_type": {
70+
Type: schema.TypeString,
71+
Computed: true,
72+
Description: "The Reserved IP Target support for a load balancer profile, one of [fixed, dependent]",
73+
},
6474
"route_mode_supported": {
6575
Type: schema.TypeBool,
6676
Computed: true,
@@ -175,6 +185,34 @@ func dataSourceIBMISLbProfileRead(context context.Context, d *schema.ResourceDat
175185
}
176186
}
177187
}
188+
if lbProfile.ReservedIPTargetSupported != nil {
189+
reservedIPTargetSupported := lbProfile.ReservedIPTargetSupported
190+
switch reflect.TypeOf(reservedIPTargetSupported).String() {
191+
case "*vpcv1.LoadBalancerProfileReservedIPTargetSupportedFixed":
192+
{
193+
reservedIP := reservedIPTargetSupported.(*vpcv1.LoadBalancerProfileReservedIPTargetSupportedFixed)
194+
d.Set("reserved_ip_target_supported", reservedIP.Value)
195+
d.Set("reserved_ip_type", reservedIP.Type)
196+
}
197+
case "*vpcv1.LoadBalancerProfileReservedIPTargetSupportedDependent":
198+
{
199+
reservedIP := reservedIPTargetSupported.(*vpcv1.LoadBalancerProfileReservedIPTargetSupportedDependent)
200+
if reservedIP.Type != nil {
201+
d.Set("reserved_ip_type", *reservedIP.Type)
202+
}
203+
}
204+
case "*vpcv1.LoadBalancerProfileReservedIPTargetSupported":
205+
{
206+
reservedIP := reservedIPTargetSupported.(*vpcv1.LoadBalancerProfileReservedIPTargetSupported)
207+
if reservedIP.Type != nil {
208+
d.Set("reserved_ip_type", *reservedIP.Type)
209+
}
210+
if reservedIP.Value != nil {
211+
d.Set("reserved_ip_target_supported", *reservedIP.Value)
212+
}
213+
}
214+
}
215+
}
178216
d.SetId(*lbProfile.Name)
179217
return nil
180218
}

ibm/service/vpc/data_source_ibm_is_lb_profile_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ func TestAccIBMISLBProfileDatasource_basic(t *testing.T) {
2525
resource.TestCheckResourceAttr("data.ibm_is_lb_profile.test_profile", "family", "network"),
2626
resource.TestCheckResourceAttr("data.ibm_is_lb_profile.test_profile", "route_mode_supported", "true"),
2727
resource.TestCheckResourceAttrSet("data.ibm_is_lb_profile.test_profile", "href"),
28+
resource.TestCheckResourceAttrSet("data.ibm_is_lb_profile.test_profile", "reserved_ip_target_supported"),
2829
resource.TestCheckResourceAttrSet("data.ibm_is_lb_profile.test_profile", "udp_supported"),
2930
resource.TestCheckResourceAttrSet("data.ibm_is_lb_profile.test_profile", "access_modes.0.values.#"),
3031
),

ibm/service/vpc/data_source_ibm_is_lb_profiles.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,16 @@ func DataSourceIBMISLbProfiles() *schema.Resource {
133133
},
134134
},
135135
},
136+
"reserved_ip_target_supported": {
137+
Type: schema.TypeBool,
138+
Computed: true,
139+
Description: "The Reserved IP Target support for a load balancer with this profile",
140+
},
141+
"reserved_ip_type": {
142+
Type: schema.TypeString,
143+
Computed: true,
144+
Description: "The Reserved IP Target support for a load balancer profile, one of [fixed, dependent]",
145+
},
136146
"route_mode_supported": {
137147
Type: schema.TypeBool,
138148
Computed: true,
@@ -231,6 +241,34 @@ func dataSourceIBMISLbProfilesRead(d *schema.ResourceData, meta interface{}) err
231241
}
232242
}
233243
}
244+
if profileCollector.ReservedIPTargetSupported != nil {
245+
reservedIPTargetSupported := profileCollector.ReservedIPTargetSupported
246+
switch reflect.TypeOf(reservedIPTargetSupported).String() {
247+
case "*vpcv1.LoadBalancerProfileReservedIPTargetSupportedFixed":
248+
{
249+
reservedIP := reservedIPTargetSupported.(*vpcv1.LoadBalancerProfileReservedIPTargetSupportedFixed)
250+
l["reserved_ip_target_supported"] = reservedIP.Value
251+
l["reserved_ip_type"] = reservedIP.Type
252+
}
253+
case "*vpcv1.LoadBalancerProfileReservedIPTargetSupportedDependent":
254+
{
255+
reservedIP := reservedIPTargetSupported.(*vpcv1.LoadBalancerProfileReservedIPTargetSupportedDependent)
256+
if reservedIP.Type != nil {
257+
l["reserved_ip_type"] = *reservedIP.Type
258+
}
259+
}
260+
case "*vpcv1.LoadBalancerProfileReservedIPTargetSupported":
261+
{
262+
reservedIP := reservedIPTargetSupported.(*vpcv1.LoadBalancerProfileReservedIPTargetSupported)
263+
if reservedIP.Type != nil {
264+
l["reserved_ip_type"] = *reservedIP.Type
265+
}
266+
if reservedIP.Value != nil {
267+
l["reserved_ip_target_supported"] = *reservedIP.Value
268+
}
269+
}
270+
}
271+
}
234272
if profileCollector.RouteModeSupported != nil {
235273
routeMode := profileCollector.RouteModeSupported
236274
switch reflect.TypeOf(routeMode).String() {

ibm/service/vpc/data_source_ibm_is_lb_profiles_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ func TestAccIBMISLBProfilesDatasource_basic(t *testing.T) {
2424
resource.TestCheckResourceAttrSet("data.ibm_is_lb_profiles.test_profiles", "lb_profiles.#"),
2525
resource.TestCheckResourceAttrSet("data.ibm_is_lb_profiles.test_profiles", "lb_profiles.0.access_modes.#"),
2626
resource.TestCheckResourceAttrSet("data.ibm_is_lb_profiles.test_profiles", "lb_profiles.0.access_modes.0.values.#"),
27+
resource.TestCheckResourceAttrSet("data.ibm_is_lb_profiles.test_profiles", "lb_profiles.0.reserved_ip_target_supported"),
2728
resource.TestCheckResourceAttrSet("data.ibm_is_lb_profiles.test_profiles", "lb_profiles.0.route_mode_supported"),
2829
resource.TestCheckResourceAttrSet("data.ibm_is_lb_profiles.test_profiles", "lb_profiles.0.href"),
2930
resource.TestCheckResourceAttrSet("data.ibm_is_lb_profiles.test_profiles", "lb_profiles.0.udp_supported"),
@@ -45,6 +46,7 @@ func TestAccIBMISLBProfilesDatasource_filter(t *testing.T) {
4546
resource.TestCheckResourceAttr("data.ibm_is_lb_profiles.test_profiles", "lb_profiles.0.family", "Network"),
4647
resource.TestCheckResourceAttr("data.ibm_is_lb_profiles.test_profiles", "lb_profiles.0.route_mode_supported", "true"),
4748
resource.TestCheckResourceAttrSet("data.ibm_is_lb_profiles.test_profiles", "lb_profiles.0.href"),
49+
resource.TestCheckResourceAttrSet("data.ibm_is_lb_profiles.test_profiles", "lb_profiles.0.reserved_ip_target_supported"),
4850
resource.TestCheckResourceAttrSet("data.ibm_is_lb_profiles.test_profiles", "lb_profiles.0.udp_supported"),
4951
),
5052
},

ibm/service/vpc/data_source_ibm_is_lbs.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ func DataSourceIBMISLBS() *schema.Resource {
9595
Computed: true,
9696
Description: "Indicates whether this load balancer supports source IP session persistence.",
9797
},
98+
isLBReservedIPtargetSupported: {
99+
Type: schema.TypeBool,
100+
Computed: true,
101+
Description: "Indicates whether this load balancer supports members with reserved IP as target.",
102+
},
98103
isLBUdpSupported: {
99104
Type: schema.TypeBool,
100105
Computed: true,
@@ -365,6 +370,9 @@ func getLbs(d *schema.ResourceData, meta interface{}) error {
365370
if lb.RouteMode != nil {
366371
lbInfo[isLBRouteMode] = *lb.RouteMode
367372
}
373+
if lb.ReservedIPTargetSupported != nil {
374+
lbInfo[isLBReservedIPtargetSupported] = *lb.ReservedIPTargetSupported
375+
}
368376
if lb.UDPSupported != nil {
369377
lbInfo[isLBUdpSupported] = *lb.UDPSupported
370378
}

ibm/service/vpc/resource_ibm_is_lb.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ const (
4040
isLBDeleted = "done"
4141
isLBProvisioning = "provisioning"
4242
isLBProvisioningDone = "done"
43+
isLBReservedIPtargetSupported = "reserved_ip_target_supported"
4344
isLBResourceGroup = "resource_group"
4445
isLBProfile = "profile"
4546
isLBRouteMode = "route_mode"
@@ -256,6 +257,12 @@ func ResourceIBMISLB() *schema.Resource {
256257
Description: "List of access management tags",
257258
},
258259

260+
isLBReservedIPtargetSupported: {
261+
Type: schema.TypeBool,
262+
Computed: true,
263+
Description: "Indicates whether this load balancer supports members with reserved IP as target.",
264+
},
265+
259266
isLBResourceGroup: {
260267
Type: schema.TypeString,
261268
ForceNew: true,
@@ -666,6 +673,9 @@ func lbGet(d *schema.ResourceData, meta interface{}, id string) error {
666673

667674
d.Set(isLBResourceGroup, *lb.ResourceGroup.ID)
668675
d.Set(isLBHostName, *lb.Hostname)
676+
if lb.ReservedIPTargetSupported != nil {
677+
d.Set(isLBReservedIPtargetSupported, *lb.ReservedIPTargetSupported)
678+
}
669679
if lb.UDPSupported != nil {
670680
d.Set(isLBUdpSupported, *lb.UDPSupported)
671681
}

ibm/service/vpc/resource_ibm_is_lb_pool_member_test.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,51 @@ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKVmnMOlHKcZK8tpt3MP1lqOLAcqcJzhsvJcjscgVE
191191
})
192192
}
193193

194+
func TestAccIBMISLBPoolMember_basic_network_target_reservedIP(t *testing.T) {
195+
var lb string
196+
197+
vpcname := fmt.Sprintf("tflbpm-vpc-%d", acctest.RandIntRange(10, 100))
198+
subnetname := fmt.Sprintf("tflbpmc-name-%d", acctest.RandIntRange(10, 100))
199+
resIpSubnetName := fmt.Sprintf("tflbpmc-name-%d", acctest.RandIntRange(10, 100))
200+
nlbPoolName := fmt.Sprintf("tfnlbpoolc%d", acctest.RandIntRange(10, 100))
201+
202+
nlbName := fmt.Sprintf("tfnlbcreate%d", acctest.RandIntRange(10, 100))
203+
nlbName1 := fmt.Sprintf("tfnlbupdate%d", acctest.RandIntRange(10, 100))
204+
205+
sshname := "terraform-test-ssh-key"
206+
vsiName := fmt.Sprintf("tf-instance-%d", acctest.RandIntRange(10, 100))
207+
publicKey := strings.TrimSpace(`
208+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKVmnMOlHKcZK8tpt3MP1lqOLAcqcJzhsvJcjscgVERRN7/9484SOBJ3HSKxxNG5JN8owAjy5f9yYwcUg+JaUVuytn5Pv3aeYROHGGg+5G346xaq3DAwX6Y5ykr2fvjObgncQBnuU5KHWCECO/4h8uWuwh/kfniXPVjFToc+gnkqA+3RKpAecZhFXwfalQ9mMuYGFxn+fwn8cYEApsJbsEmb0iJwPiZ5hjFC8wREuiTlhPHDgkBLOiycd20op2nXzDbHfCHInquEe/gYxEitALONxm0swBOwJZwlTDOB7C6y2dzlrtxr1L59m7pCkWI4EtTRLvleehBoj3u7jB4usR
209+
`)
210+
resource.Test(t, resource.TestCase{
211+
PreCheck: func() { acc.TestAccPreCheck(t) },
212+
Providers: acc.TestAccProviders,
213+
CheckDestroy: testAccCheckIBMISLBPoolMemberDestroy,
214+
Steps: []resource.TestStep{
215+
{
216+
Config: testAccCheckIBMISLBPoolMemberIDConfigWithReservedIPTarget(
217+
vpcname, subnetname, resIpSubnetName, acc.ISZoneName, acc.ISCIDR, sshname, publicKey, acc.IsImageName,
218+
vsiName, nlbName, nlbPoolName),
219+
Check: resource.ComposeTestCheckFunc(
220+
testAccCheckIBMISLBPoolMemberExists("ibm_is_lb_pool_member.testacc_nlb_mem", lb),
221+
resource.TestCheckResourceAttr(
222+
"ibm_is_lb_pool_member.testacc_nlb_mem", "weight", "20"),
223+
),
224+
},
225+
{
226+
Config: testAccCheckIBMISLBPoolMemberIDConfigWithReservedIPTarget(
227+
vpcname, subnetname, resIpSubnetName, acc.ISZoneName, acc.ISCIDR, sshname, publicKey, acc.IsImageName,
228+
vsiName, nlbName1, nlbPoolName),
229+
Check: resource.ComposeTestCheckFunc(
230+
testAccCheckIBMISLBPoolMemberExists("ibm_is_lb_pool_member.testacc_nlb_mem", lb),
231+
resource.TestCheckResourceAttr(
232+
"ibm_is_lb_pool_member.testacc_nlb_mem", "port", "8080"),
233+
),
234+
},
235+
},
236+
})
237+
}
238+
194239
// Weight set to zero from TF when it wasn't passed, must be kept blank so that backend could set it to default.
195240
// Function to validate if the weight is set to default as 50, when it is not provided in TF config.
196241
func TestAccIBMISLBPoolMember_basic_opt_weight_check(t *testing.T) {
@@ -463,3 +508,63 @@ func testAccCheckIBMISLBPoolMemberWeightConfig(vpcname, subnetname, zone, cidr,
463508
target_address = "%s"
464509
}`, vpcname, subnetname, zone, cidr, name, poolName, port, address)
465510
}
511+
512+
func testAccCheckIBMISLBPoolMemberIDConfigWithReservedIPTarget(vpcname, subnetname, resIpSubnetName, zone, cidr, sshname, publickey,
513+
isImageName, vsiName, nlbName, nlbPoolName string) string {
514+
return fmt.Sprintf(`
515+
resource "ibm_is_vpc" "testacc_vpc" {
516+
name = "%s"
517+
}
518+
resource "ibm_is_subnet" "testacc_subnet" {
519+
name = "%s"
520+
vpc = "${ibm_is_vpc.testacc_vpc.id}"
521+
zone = "%s"
522+
ipv4_cidr_block = "%s"
523+
}
524+
resource "ibm_is_subnet_reserved_ip" "testacc_rip" {
525+
subnet = ibm_is_subnet.testacc_subnet.id
526+
name = "%s"
527+
}
528+
resource "ibm_is_ssh_key" "testacc_sshkey" {
529+
name = "%s"
530+
public_key = "%s"
531+
}
532+
data "ibm_is_image" "ds_image" {
533+
name = "%s"
534+
}
535+
resource "ibm_is_instance" "testacc_instance" {
536+
name = "%s"
537+
image = data.ibm_is_image.ds_image.id
538+
profile = "%s"
539+
primary_network_interface {
540+
subnet = ibm_is_subnet.testacc_subnet.id
541+
}
542+
vpc = ibm_is_vpc.testacc_vpc.id
543+
zone = "%s"
544+
keys = [ibm_is_ssh_key.testacc_sshkey.id]
545+
}
546+
resource "ibm_is_lb" "testacc_NLB" {
547+
name = "%s"
548+
subnets = ["${ibm_is_subnet.testacc_subnet.id}"]
549+
profile = "network-fixed"
550+
}
551+
resource "ibm_is_lb_pool" "testacc_nlb_pool" {
552+
name = "%s"
553+
lb = "${ibm_is_lb.testacc_NLB.id}"
554+
algorithm = "weighted_round_robin"
555+
protocol = "tcp"
556+
health_delay = 60
557+
health_retries = 5
558+
health_timeout = 30
559+
health_type = "tcp"
560+
}
561+
resource "ibm_is_lb_pool_member" "testacc_nlb_mem" {
562+
lb = "${ibm_is_lb.testacc_NLB.id}"
563+
pool = "${element(split("/",ibm_is_lb_pool.testacc_nlb_pool.id),1)}"
564+
port = 8080
565+
weight = 20
566+
target_id = "${ibm_is_subnet_reserved_ip.testacc_subnet.id}"
567+
}
568+
`, vpcname, subnetname, resIpSubnetName, zone, cidr, sshname, publickey, isImageName, vsiName,
569+
acc.InstanceProfileName, zone, nlbName, nlbPoolName)
570+
}

website/docs/d/is_lb.html.markdown

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ In addition to all argument reference list, you can access the following attribu
112112
- `reserved_ip`- (String) The unique identifier for this reserved IP
113113
- `resource_type`- (String) The resource type.
114114
- `private_ips` - (List) The private IP addresses assigned to this load balancer. Same as `private_ip.[].address`
115+
- `reserved_ip_target_supported`- (Bool) Indicates whether this load balancer supports members with reserved IP as target.
115116
- `resource_group` - (String) The resource group id, where the load balancer is created.
116117
- `route_mode` - (Bool) Indicates whether route mode is enabled for this load balancer.
117118
- `security_groups`- (String) A list of security groups that are used with this load balancer. This option is supported only for application load balancers.

0 commit comments

Comments
 (0)