Skip to content

Commit 2e199c7

Browse files
Added support for tags in is_vpn_server resource (IBM-Cloud#6295)
Co-authored-by: SunithaGudisagar <[email protected]>
1 parent bfd0121 commit 2e199c7

File tree

3 files changed

+169
-1
lines changed

3 files changed

+169
-1
lines changed

ibm/service/vpc/resource_ibm_is_vpn_server.go

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"fmt"
99
"log"
10+
"os"
1011
"time"
1112

1213
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns"
@@ -373,6 +374,14 @@ func ResourceIBMIsVPNServer() *schema.Resource {
373374
Set: flex.ResourceIBMVPCHash,
374375
Description: "List of access management tags",
375376
},
377+
"tags": {
378+
Type: schema.TypeSet,
379+
Optional: true,
380+
Computed: true,
381+
Elem: &schema.Schema{Type: schema.TypeString, ValidateFunc: validate.InvokeValidator("ibm_is_vpn_server", "tags")},
382+
Set: flex.ResourceIBMVPCHash,
383+
Description: "VPN server user tags list",
384+
},
376385
},
377386
}
378387
}
@@ -426,6 +435,15 @@ func ResourceIBMIsVPNServerValidator() *validate.ResourceValidator {
426435
Required: true,
427436
AllowedValues: "certificate , username",
428437
},
438+
validate.ValidateSchema{
439+
Identifier: "tags",
440+
ValidateFunctionIdentifier: validate.ValidateRegexpLen,
441+
Type: validate.TypeString,
442+
Optional: true,
443+
Regexp: `^[A-Za-z0-9:_ .-]+$`,
444+
MinValueLength: 1,
445+
MaxValueLength: 128,
446+
},
429447
validate.ValidateSchema{
430448
Identifier: "accesstag",
431449
ValidateFunctionIdentifier: validate.ValidateRegexpLen,
@@ -568,12 +586,22 @@ func resourceIBMIsVPNServerCreate(context context.Context, d *schema.ResourceDat
568586
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "isWaitForVPNServerStable", "create", "wait-for-stable-vpnserver").GetDiag()
569587
}
570588

589+
v := os.Getenv("IC_ENV_TAGS")
590+
if _, ok := d.GetOk("tags"); ok || v != "" {
591+
oldList, newList := d.GetChange("tags")
592+
err = flex.UpdateGlobalTagsUsingCRN(oldList, newList, meta, *vpnServer.CRN, "", "user")
593+
if err != nil {
594+
log.Printf(
595+
"Error on create of resource vpc VPN server (%s) tags: %s", d.Id(), err)
596+
}
597+
}
598+
571599
if _, ok := d.GetOk(isVPNServerAccessTags); ok {
572600
oldList, newList := d.GetChange(isVPNServerAccessTags)
573601
err = flex.UpdateGlobalTagsUsingCRN(oldList, newList, meta, *vpnServer.CRN, "", isVPNServerAccessTagType)
574602
if err != nil {
575603
log.Printf(
576-
"Error on create of resource vpc (%s) access tags: %s", d.Id(), err)
604+
"Error on create of resource vpc VPN server (%s) access tags: %s", d.Id(), err)
577605
}
578606
}
579607

@@ -773,6 +801,16 @@ func resourceIBMIsVPNServerRead(context context.Context, d *schema.ResourceData,
773801
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_vpn_server", "read", "set-resource_type").GetDiag()
774802
}
775803

804+
tags, err := flex.GetGlobalTagsUsingCRN(meta, *vpnServer.CRN, "", isUserTagType)
805+
if err != nil {
806+
log.Printf(
807+
"Error on get of resource vpc VPN server (%s) tags: %s", d.Id(), err)
808+
}
809+
if err = d.Set("tags", tags); err != nil {
810+
err = fmt.Errorf("Error setting tags: %s", err)
811+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_vpn_server", "read", "set-tags").GetDiag()
812+
}
813+
776814
accesstags, err := flex.GetGlobalTagsUsingCRN(meta, *vpnServer.CRN, "", isVPNServerAccessTagType)
777815
if err != nil {
778816
log.Printf(
@@ -947,6 +985,15 @@ func resourceIBMIsVPNServerUpdate(context context.Context, d *schema.ResourceDat
947985
}
948986
eTag := response.Headers.Get("ETag") // Getting Etag from the response headers.
949987

988+
if d.HasChange("tags") {
989+
oldList, newList := d.GetChange("tags")
990+
err = flex.UpdateGlobalTagsUsingCRN(oldList, newList, meta, *vpnServer.CRN, "", isUserTagType)
991+
if err != nil {
992+
log.Printf(
993+
"Error on update of resource vpc Vpn Server (%s) tags: %s", d.Id(), err)
994+
}
995+
}
996+
950997
if d.HasChange(isVPNServerAccessTags) {
951998
oldList, newList := d.GetChange(isVPNServerAccessTags)
952999
err = flex.UpdateGlobalTagsUsingCRN(oldList, newList, meta, *vpnServer.CRN, "", isVPNServerAccessTagType)

ibm/service/vpc/resource_ibm_is_vpn_server_test.go

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,95 @@ func TestAccIBMIsVPNServerBasic(t *testing.T) {
101101
},
102102
})
103103
}
104+
func TestAccIBMIsVPNServerBasicTags(t *testing.T) {
105+
var vpnserver string
106+
if acc.ISCertificateCrn == "" {
107+
fmt.Println("[ERROR] Set the environment variable IS_CERTIFICATE_CRN for testing ibm_is_vpn_server resource")
108+
}
109+
110+
if acc.ISClientCaCrn == "" {
111+
fmt.Println("[ERROR] Set the environment variable IS_CLIENT_CA_CRN for testing ibm_is_vpn_server resource")
112+
}
113+
isCertificateCrn := acc.ISCertificateCrn
114+
isClientCaCrn := acc.ISClientCaCrn
115+
clientIPPool := "10.5.0.0/21"
116+
clientIdleTimeout := fmt.Sprintf("%d", acctest.RandIntRange(0, 28800))
117+
enableSplitTunneling := "true"
118+
nameVpc := fmt.Sprintf("test-vpc-tf-%d", acctest.RandIntRange(10, 100))
119+
nameSubnet1 := fmt.Sprintf("test-subnet1-tf-%d", acctest.RandIntRange(10, 100))
120+
name := fmt.Sprintf("tf-name%d", acctest.RandIntRange(10, 100))
121+
port := fmt.Sprintf("%d", acctest.RandIntRange(1, 65535))
122+
protocol := "udp"
123+
124+
clientIPPoolUpdate := "10.6.0.0/21"
125+
clientIdleTimeoutUpdate := fmt.Sprintf("%d", acctest.RandIntRange(0, 28800))
126+
enableSplitTunnelingUpdate := "false"
127+
nameUpdate := fmt.Sprintf("tf-name%d", acctest.RandIntRange(10, 100))
128+
portUpdate := fmt.Sprintf("%d", acctest.RandIntRange(1, 65535))
129+
protocolUpdate := "tcp"
130+
131+
resource.Test(t, resource.TestCase{
132+
PreCheck: func() { acc.TestAccPreCheck(t) },
133+
Providers: acc.TestAccProviders,
134+
CheckDestroy: testAccCheckIBMIsVPNServerDestroy,
135+
Steps: []resource.TestStep{
136+
{
137+
Config: testAccCheckIBMIsVPNServerConfigBasicTags(nameVpc, nameSubnet1, clientIPPool, clientIdleTimeout, enableSplitTunneling, name, port, protocol, isCertificateCrn, isClientCaCrn),
138+
Check: resource.ComposeAggregateTestCheckFunc(
139+
testAccCheckIBMIsVPNServerExists("ibm_is_vpn_server.is_vpn_server", vpnserver),
140+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "certificate_crn"),
141+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "client_authentication.0.method"),
142+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "client_auto_delete"),
143+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "client_auto_delete_timeout"),
144+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "client_dns_server_ips.#"),
145+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "created_at"),
146+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "crn"),
147+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "hostname"),
148+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "href"),
149+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "health_state"),
150+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "vpn_server"),
151+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "lifecycle_state"),
152+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "private_ips.0.address"),
153+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "private_ips.0.href"),
154+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "private_ips.0.id"),
155+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "private_ips.0.name"),
156+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "private_ips.0.resource_type"),
157+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "resource_group"),
158+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "security_groups.#"),
159+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "resource_type"),
160+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "subnets.#"),
161+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "vpc.#"),
162+
resource.TestCheckResourceAttr("ibm_is_vpn_server.is_vpn_server", "client_ip_pool", clientIPPool),
163+
resource.TestCheckResourceAttr("ibm_is_vpn_server.is_vpn_server", "client_idle_timeout", clientIdleTimeout),
164+
resource.TestCheckResourceAttr("ibm_is_vpn_server.is_vpn_server", "enable_split_tunneling", enableSplitTunneling),
165+
resource.TestCheckResourceAttr("ibm_is_vpn_server.is_vpn_server", "name", name),
166+
resource.TestCheckResourceAttr("ibm_is_vpn_server.is_vpn_server", "port", port),
167+
resource.TestCheckResourceAttr("ibm_is_vpn_server.is_vpn_server", "protocol", protocol),
168+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "tags.#"),
169+
resource.TestCheckResourceAttr("ibm_is_vpn_server.is_vpn_server", "tags.#", "2"),
170+
),
171+
},
172+
{
173+
Config: testAccCheckIBMIsVPNServerConfigBasicTags(nameVpc, nameSubnet1, clientIPPoolUpdate, clientIdleTimeoutUpdate, enableSplitTunnelingUpdate, nameUpdate, portUpdate, protocolUpdate, isCertificateCrn, isClientCaCrn),
174+
Check: resource.ComposeAggregateTestCheckFunc(
175+
resource.TestCheckResourceAttr("ibm_is_vpn_server.is_vpn_server", "client_ip_pool", clientIPPoolUpdate),
176+
resource.TestCheckResourceAttr("ibm_is_vpn_server.is_vpn_server", "client_idle_timeout", clientIdleTimeoutUpdate),
177+
resource.TestCheckResourceAttr("ibm_is_vpn_server.is_vpn_server", "enable_split_tunneling", enableSplitTunnelingUpdate),
178+
resource.TestCheckResourceAttr("ibm_is_vpn_server.is_vpn_server", "name", nameUpdate),
179+
resource.TestCheckResourceAttr("ibm_is_vpn_server.is_vpn_server", "port", portUpdate),
180+
resource.TestCheckResourceAttr("ibm_is_vpn_server.is_vpn_server", "protocol", protocolUpdate),
181+
resource.TestCheckResourceAttrSet("ibm_is_vpn_server.is_vpn_server", "tags.#"),
182+
resource.TestCheckResourceAttr("ibm_is_vpn_server.is_vpn_server", "tags.#", "2"),
183+
),
184+
},
185+
{
186+
ResourceName: "ibm_is_vpn_server.is_vpn_server",
187+
ImportState: true,
188+
ImportStateVerify: true,
189+
},
190+
},
191+
})
192+
}
104193

105194
func testAccCheckIBMIsVPNServerConfigBasic(nameVpc string, nameSubnet1 string, clientIPPool string, clientIdleTimeout string, enableSplitTunneling string, vpnServerName string, port string, protocol string, isCertificateCrn string, isClientCaCrn string) string {
106195
return fmt.Sprintf(`
@@ -132,6 +221,37 @@ func testAccCheckIBMIsVPNServerConfigBasic(nameVpc string, nameSubnet1 string, c
132221
}
133222
`, nameVpc, nameSubnet1, isCertificateCrn, isClientCaCrn, clientIPPool, clientIdleTimeout, enableSplitTunneling, vpnServerName, port, protocol)
134223
}
224+
func testAccCheckIBMIsVPNServerConfigBasicTags(nameVpc string, nameSubnet1 string, clientIPPool string, clientIdleTimeout string, enableSplitTunneling string, vpnServerName string, port string, protocol string, isCertificateCrn string, isClientCaCrn string) string {
225+
return fmt.Sprintf(`
226+
resource "ibm_is_vpc" "testacc_vpc" {
227+
name = "%s"
228+
}
229+
230+
resource "ibm_is_subnet" "testacc_subnet-1" {
231+
name = "%s"
232+
vpc = ibm_is_vpc.testacc_vpc.id
233+
zone = "us-south-1"
234+
ipv4_cidr_block = "10.240.0.0/24"
235+
}
236+
237+
resource "ibm_is_vpn_server" "is_vpn_server" {
238+
certificate_crn = "%s"
239+
client_authentication {
240+
method = "certificate"
241+
client_ca_crn = "%s"
242+
}
243+
client_ip_pool = "%s"
244+
subnets = [ibm_is_subnet.testacc_subnet-1.id]
245+
client_dns_server_ips = ["192.168.3.4"]
246+
client_idle_timeout = %s
247+
enable_split_tunneling = %s
248+
name = "%s"
249+
port = %s
250+
protocol = "%s"
251+
tags = [ "test:tags", "test:tags2" ]
252+
}
253+
`, nameVpc, nameSubnet1, isCertificateCrn, isClientCaCrn, clientIPPool, clientIdleTimeout, enableSplitTunneling, vpnServerName, port, protocol)
254+
}
135255

136256
func testAccCheckIBMIsVPNServerExists(n string, obj string) resource.TestCheckFunc {
137257

website/docs/r/is_vpn_server.html.markdown

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ Review the argument references that you can specify for your resource.
7878
- `resource_group` - (Optional, Forces new resource, String) The resource group (id), where the VPN gateway to be created.
7979
- `security_groups` - (Optional, List) The security groups `ID` to use for this VPN server. If unspecified, the VPC's default security group is used.
8080
- `subnets` - (Required, List) Comma-separated IDs of the subnets to provision this VPN server in. Use subnets in different zones for high availability. User can also upgrade or downgrade the VPN server to high availability or standalone by adding/remove the subnets.
81+
- `tags`- (Optional, Array of Strings) A list of user tags that you want to add to your VPN server. (https://cloud.ibm.com/apidocs/tagging#types-of-tags)
8182

8283
## Attribute Reference
8384

0 commit comments

Comments
 (0)