Skip to content

Commit fdc346a

Browse files
authored
added target reference, doc fix and tests for vni (#305)
* added target reference, doc fix and tests * removed default auto delete from instance network attachment * doc fix and changed list to set for ips * removed spaces and added tab
1 parent b452a55 commit fdc346a

11 files changed

+674
-91
lines changed
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
// Copyright IBM Corp. 2017, 2021 All Rights Reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package vpc_test
5+
6+
import (
7+
"fmt"
8+
"testing"
9+
10+
acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest"
11+
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns"
12+
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex"
13+
14+
"github.com/IBM/vpc-go-sdk/vpcv1"
15+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
16+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
17+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
18+
)
19+
20+
func TestAccIBMISSecurityGroupTargetDataSource_vni(t *testing.T) {
21+
var securityGroup string
22+
terraformTag := "data.ibm_is_security_group_target.testacc_security_group_target"
23+
vpcname := fmt.Sprintf("tfsg-vpc-%d", acctest.RandIntRange(10, 100))
24+
subnetname := fmt.Sprintf("tfsg-subnet-%d", acctest.RandIntRange(10, 100))
25+
lbname := fmt.Sprintf("tfsg-lb-%d", acctest.RandIntRange(10, 100))
26+
name := fmt.Sprintf("tfsg-one-%d", acctest.RandIntRange(10, 100))
27+
28+
resource.Test(t, resource.TestCase{
29+
PreCheck: func() { acc.TestAccPreCheck(t) },
30+
Providers: acc.TestAccProviders,
31+
CheckDestroy: testAccCheckIBMISSecurityGroupDataSourceTargetDestroy,
32+
Steps: []resource.TestStep{
33+
{
34+
Config: testAccCheckIBMISsecurityGroupTargetDataSourceVniConfig(vpcname, subnetname, acc.ISZoneName, acc.ISCIDR, lbname, name),
35+
Check: resource.ComposeTestCheckFunc(
36+
testAccCheckIBMISSecurityGroupDataSourceTargetExists("ibm_is_security_group_target.testacc_security_group_target", &securityGroup),
37+
resource.TestCheckResourceAttrSet(
38+
terraformTag, "crn"),
39+
resource.TestCheckResourceAttr(
40+
terraformTag, "resource_type", "virtual_network_interface"),
41+
resource.TestCheckResourceAttrSet(
42+
terraformTag, "target"),
43+
),
44+
},
45+
},
46+
})
47+
}
48+
49+
func testAccCheckIBMISSecurityGroupDataSourceTargetDestroy(s *terraform.State) error {
50+
51+
sess, err := acc.TestAccProvider.Meta().(conns.ClientSession).VpcV1API()
52+
if err != nil {
53+
return err
54+
}
55+
for _, rs := range s.RootModule().Resources {
56+
if rs.Type != "ibm_is_security_group_target" {
57+
continue
58+
}
59+
parts, err := flex.IdParts(rs.Primary.ID)
60+
if err != nil {
61+
return err
62+
}
63+
securityGroupID := parts[0]
64+
targetID := parts[1]
65+
66+
deleteSecurityGroupTargetBindingOptions := &vpcv1.DeleteSecurityGroupTargetBindingOptions{
67+
SecurityGroupID: &securityGroupID,
68+
ID: &targetID,
69+
}
70+
71+
response, err := sess.DeleteSecurityGroupTargetBinding(deleteSecurityGroupTargetBindingOptions)
72+
if err == nil {
73+
return fmt.Errorf("Security Group Targets still exists: %v", response)
74+
}
75+
}
76+
return nil
77+
}
78+
79+
func testAccCheckIBMISSecurityGroupDataSourceTargetExists(n string, securityGroupID *string) resource.TestCheckFunc {
80+
81+
return func(s *terraform.State) error {
82+
rs, ok := s.RootModule().Resources[n]
83+
if !ok {
84+
return fmt.Errorf("Not found: %s", n)
85+
}
86+
if rs.Primary.ID == "" {
87+
return fmt.Errorf("[ERROR] No Security Group Target ID is set")
88+
}
89+
90+
sess, err := acc.TestAccProvider.Meta().(conns.ClientSession).VpcV1API()
91+
if err != nil {
92+
return err
93+
}
94+
95+
parts, err := flex.IdParts(rs.Primary.ID)
96+
if err != nil {
97+
return err
98+
}
99+
securityGroupId := parts[0]
100+
targetID := parts[1]
101+
102+
getSecurityGroupTargetOptions := &vpcv1.GetSecurityGroupTargetOptions{
103+
SecurityGroupID: &securityGroupId,
104+
ID: &targetID,
105+
}
106+
107+
_, response, err := sess.GetSecurityGroupTarget(getSecurityGroupTargetOptions)
108+
if err != nil {
109+
if response != nil && response.StatusCode == 404 {
110+
*securityGroupID = ""
111+
return nil
112+
}
113+
return fmt.Errorf("[ERROR] Error getting Security Group Target : %s\n%s", err, response)
114+
}
115+
116+
*securityGroupID = fmt.Sprintf("%s/%s", securityGroupId, targetID)
117+
return nil
118+
}
119+
}
120+
func testAccCheckIBMISsecurityGroupTargetDataSourceVniConfig(vpcname, subnetname, zoneName, cidr, vniname, name string) string {
121+
return fmt.Sprintf(`
122+
resource "ibm_is_vpc" "testacc_vpc" {
123+
name = "%s"
124+
}
125+
126+
resource "ibm_is_subnet" "testacc_subnet" {
127+
name = "%s"
128+
vpc = ibm_is_vpc.testacc_vpc.id
129+
zone = "%s"
130+
ipv4_cidr_block = "%s"
131+
}
132+
133+
resource "ibm_is_security_group" "testacc_security_group_one" {
134+
name = "%s"
135+
vpc = "${ibm_is_vpc.testacc_vpc.id}"
136+
}
137+
138+
resource "ibm_is_virtual_network_interface" "testacc_vni"{
139+
name = "%s"
140+
allow_ip_spoofing = false
141+
enable_infrastructure_nat = true
142+
primary_ip {
143+
auto_delete = false
144+
address = cidrhost(cidrsubnet(ibm_is_subnet.testacc_subnet.ipv4_cidr_block, 4, 6), 0)
145+
}
146+
subnet = ibm_is_subnet.testacc_subnet.id
147+
}
148+
149+
resource "ibm_is_security_group_target" "testacc_security_group_target" {
150+
security_group = ibm_is_security_group.testacc_security_group_one.id
151+
target = ibm_is_virtual_network_interface.testacc_vni.id
152+
}
153+
154+
data "ibm_is_security_group_target" "testacc_security_group_target" {
155+
security_group = ibm_is_security_group_target.testacc_security_group_target.security_group
156+
name = ibm_is_security_group_target.testacc_security_group_target.name
157+
}
158+
159+
`, vpcname, subnetname, zoneName, cidr, name, vniname)
160+
}

ibm/service/vpc/data_source_ibm_is_security_group_targets_test.go

Lines changed: 72 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,35 @@ func TestAccIBMISSecurityGroupTargets_basic(t *testing.T) {
4343
},
4444
})
4545
}
46+
func TestAccIBMISSecurityGroupTargets_vni(t *testing.T) {
47+
var securityGroup string
48+
terraformTag := "data.ibm_is_security_group_targets.testacc_security_group_targets"
49+
50+
vpcname := fmt.Sprintf("tfsg-vpc-%d", acctest.RandIntRange(10, 100))
51+
subnetname := fmt.Sprintf("tfsg-subnet-%d", acctest.RandIntRange(10, 100))
52+
vniname := fmt.Sprintf("tfsg-vni-%d", acctest.RandIntRange(10, 100))
53+
name := fmt.Sprintf("tfsg-one-%d", acctest.RandIntRange(10, 100))
54+
55+
resource.Test(t, resource.TestCase{
56+
PreCheck: func() { acc.TestAccPreCheck(t) },
57+
Providers: acc.TestAccProviders,
58+
CheckDestroy: testAccCheckIBMISSecurityGroupTargetsDestroy,
59+
Steps: []resource.TestStep{
60+
{
61+
Config: testAccCheckIBMISsecurityGroupTargetsVniConfig(vpcname, subnetname, acc.ISZoneName, acc.ISCIDR, vniname, name),
62+
Check: resource.ComposeTestCheckFunc(
63+
testAccCheckIBMISSecurityGroupTargetsExists("ibm_is_security_group_target.testacc_security_group_target", &securityGroup),
64+
resource.TestCheckResourceAttrSet(
65+
terraformTag, "targets.0.crn"),
66+
resource.TestCheckResourceAttr(
67+
terraformTag, "targets.0.resource_type", "virtual_network_interface"),
68+
resource.TestCheckResourceAttrSet(
69+
terraformTag, "targets.0.target"),
70+
),
71+
},
72+
},
73+
})
74+
}
4675

4776
func testAccCheckIBMISSecurityGroupTargetsDestroy(s *terraform.State) error {
4877

@@ -141,12 +170,53 @@ func testAccCheckIBMISsecurityGroupTargetsConfig(vpcname, subnetname, zoneName,
141170
142171
resource "ibm_is_security_group_target" "testacc_security_group_target" {
143172
security_group = ibm_is_security_group.testacc_security_group_one.id
144-
target = ibm_is_lb.testacc_LB.id
173+
target = ibm_is_lb.testacc_LB.id
145174
}
146175
147176
data "ibm_is_security_group_targets" "testacc_security_group_targets" {
148-
security_group = ibm_is_security_group.testacc_security_group_one.id
177+
security_group = ibm_is_security_group_target.testacc_security_group_target.security_group
149178
}
150179
151180
`, vpcname, subnetname, zoneName, cidr, name, lbname)
152181
}
182+
183+
func testAccCheckIBMISsecurityGroupTargetsVniConfig(vpcname, subnetname, zoneName, cidr, vniname, name string) string {
184+
return fmt.Sprintf(`
185+
resource "ibm_is_vpc" "testacc_vpc" {
186+
name = "%s"
187+
}
188+
189+
resource "ibm_is_subnet" "testacc_subnet" {
190+
name = "%s"
191+
vpc = ibm_is_vpc.testacc_vpc.id
192+
zone = "%s"
193+
ipv4_cidr_block = "%s"
194+
}
195+
196+
resource "ibm_is_security_group" "testacc_security_group_one" {
197+
name = "%s"
198+
vpc = "${ibm_is_vpc.testacc_vpc.id}"
199+
}
200+
201+
resource "ibm_is_virtual_network_interface" "testacc_vni"{
202+
name = "%s"
203+
allow_ip_spoofing = false
204+
enable_infrastructure_nat = true
205+
primary_ip {
206+
auto_delete = false
207+
address = cidrhost(cidrsubnet(ibm_is_subnet.testacc_subnet.ipv4_cidr_block, 4, 6), 0)
208+
}
209+
subnet = ibm_is_subnet.testacc_subnet.id
210+
}
211+
212+
resource "ibm_is_security_group_target" "testacc_security_group_target" {
213+
security_group = ibm_is_security_group.testacc_security_group_one.id
214+
target = ibm_is_virtual_network_interface.testacc_vni.id
215+
}
216+
217+
data "ibm_is_security_group_targets" "testacc_security_group_targets" {
218+
security_group = ibm_is_security_group_target.testacc_security_group_target.security_group
219+
}
220+
221+
`, vpcname, subnetname, zoneName, cidr, name, vniname)
222+
}

ibm/service/vpc/data_source_ibm_is_subnet_reserved_ip.go

Lines changed: 58 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ package vpc
55

66
import (
77
"fmt"
8-
"reflect"
98

10-
"github.com/IBM/vpc-go-sdk/vpcv1"
119
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1210
)
1311

@@ -104,6 +102,54 @@ func DataSourceIBMISReservedIP() *schema.Resource {
104102
Computed: true,
105103
Description: "The crn for target.",
106104
},
105+
"target_reference": &schema.Schema{
106+
Type: schema.TypeList,
107+
Computed: true,
108+
Description: "The target this reserved IP is bound to.If absent, this reserved IP is provider-owned or unbound.",
109+
Elem: &schema.Resource{
110+
Schema: map[string]*schema.Schema{
111+
"crn": &schema.Schema{
112+
Type: schema.TypeString,
113+
Computed: true,
114+
Description: "The CRN for this endpoint gateway.",
115+
},
116+
"deleted": &schema.Schema{
117+
Type: schema.TypeList,
118+
Computed: true,
119+
Description: "If present, this property indicates the referenced resource has been deleted, and providessome supplementary information.",
120+
Elem: &schema.Resource{
121+
Schema: map[string]*schema.Schema{
122+
"more_info": &schema.Schema{
123+
Type: schema.TypeString,
124+
Computed: true,
125+
Description: "Link to documentation about deleted resources.",
126+
},
127+
},
128+
},
129+
},
130+
"href": &schema.Schema{
131+
Type: schema.TypeString,
132+
Computed: true,
133+
Description: "The URL for this endpoint gateway.",
134+
},
135+
"id": &schema.Schema{
136+
Type: schema.TypeString,
137+
Computed: true,
138+
Description: "The unique identifier for this endpoint gateway.",
139+
},
140+
"name": &schema.Schema{
141+
Type: schema.TypeString,
142+
Computed: true,
143+
Description: "The name for this endpoint gateway. The name is unique across all endpoint gateways in the VPC.",
144+
},
145+
"resource_type": &schema.Schema{
146+
Type: schema.TypeString,
147+
Computed: true,
148+
Description: "The resource type.",
149+
},
150+
},
151+
},
152+
},
107153
},
108154
}
109155
}
@@ -137,44 +183,18 @@ func dataSdataSourceIBMISReservedIPRead(d *schema.ResourceData, meta interface{}
137183
d.Set(isReservedIPLifecycleState, *reserveIP.LifecycleState)
138184
}
139185
d.Set(isReservedIPType, *reserveIP.ResourceType)
186+
target := []map[string]interface{}{}
140187
if reserveIP.Target != nil {
141-
targetIntf := reserveIP.Target
142-
switch reflect.TypeOf(targetIntf).String() {
143-
case "*vpcv1.ReservedIPTargetEndpointGatewayReference":
144-
{
145-
target := targetIntf.(*vpcv1.ReservedIPTargetEndpointGatewayReference)
146-
d.Set(isReservedIPTargetCrn, target.CRN)
147-
d.Set(isReservedIPTarget, target.ID)
148-
}
149-
case "*vpcv1.ReservedIPTargetNetworkInterfaceReferenceTargetContext":
150-
{
151-
target := targetIntf.(*vpcv1.ReservedIPTargetNetworkInterfaceReferenceTargetContext)
152-
d.Set(isReservedIPTarget, target.ID)
153-
}
154-
case "*vpcv1.ReservedIPTargetLoadBalancerReference":
155-
{
156-
target := targetIntf.(*vpcv1.ReservedIPTargetLoadBalancerReference)
157-
d.Set(isReservedIPTargetCrn, target.CRN)
158-
d.Set(isReservedIPTarget, target.ID)
159-
}
160-
case "*vpcv1.ReservedIPTargetVPNGatewayReference":
161-
{
162-
target := targetIntf.(*vpcv1.ReservedIPTargetVPNGatewayReference)
163-
d.Set(isReservedIPTargetCrn, target.CRN)
164-
d.Set(isReservedIPTarget, target.ID)
165-
}
166-
case "*vpcv1.ReservedIPTarget":
167-
{
168-
target := targetIntf.(*vpcv1.ReservedIPTarget)
169-
d.Set(isReservedIPTargetCrn, target.CRN)
170-
d.Set(isReservedIPTarget, target.ID)
171-
}
172-
case "*vpcv1.ReservedIPTargetGenericResourceReference":
173-
{
174-
target := targetIntf.(*vpcv1.ReservedIPTargetGenericResourceReference)
175-
d.Set(isReservedIPTargetCrn, target.CRN)
176-
}
188+
modelMap, err := dataSourceIBMIsReservedIPReservedIPTargetToMap(reserveIP.Target)
189+
if err != nil {
190+
return err
177191
}
192+
target = append(target, modelMap)
193+
}
194+
d.Set("target_reference", target)
195+
if len(target) > 0 {
196+
d.Set(isReservedIPTarget, target[0]["id"])
197+
d.Set(isReservedIPTargetCrn, target[0]["crn"])
178198
}
179199
return nil // By default there should be no error
180200
}

0 commit comments

Comments
 (0)