@@ -23,6 +23,184 @@ import (
2323 "github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
2424)
2525
26+ func TestAccComputeGlobalForwardingRule_externalHttpLbMigBackendCustomHeaderExample (t * testing.T ) {
27+ t .Parallel ()
28+
29+ context := map [string ]interface {}{
30+ "random_suffix" : randString (t , 10 ),
31+ }
32+
33+ vcrTest (t , resource.TestCase {
34+ PreCheck : func () { testAccPreCheck (t ) },
35+ Providers : testAccProvidersOiCS ,
36+ CheckDestroy : testAccCheckComputeGlobalForwardingRuleDestroyProducer (t ),
37+ Steps : []resource.TestStep {
38+ {
39+ Config : testAccComputeGlobalForwardingRule_externalHttpLbMigBackendCustomHeaderExample (context ),
40+ },
41+ {
42+ ResourceName : "google_compute_global_forwarding_rule.google_compute_global_forwarding_rule" ,
43+ ImportState : true ,
44+ ImportStateVerify : true ,
45+ ImportStateVerifyIgnore : []string {"network" , "port_range" , "target" },
46+ },
47+ },
48+ })
49+ }
50+
51+ func testAccComputeGlobalForwardingRule_externalHttpLbMigBackendCustomHeaderExample (context map [string ]interface {}) string {
52+ return Nprintf (`
53+ # External HTTP load balancer with a CDN-enabled managed instance group backend
54+ # and custom request and response headers
55+
56+ # VPC
57+ resource "google_compute_network" "xlb_network" {
58+ name = "tf-test-l7-xlb-network%{random_suffix}"
59+ provider = google
60+ auto_create_subnetworks = false
61+ }
62+
63+ # backend subnet
64+ resource "google_compute_subnetwork" "xlb_subnet" {
65+ name = "tf-test-l7-xlb-subnet%{random_suffix}"
66+ provider = google
67+ ip_cidr_range = "10.0.1.0/24"
68+ region = "us-central1"
69+ network = google_compute_network.xlb_network.id
70+ }
71+
72+ # forwarding rule
73+ resource "google_compute_global_forwarding_rule" "google_compute_global_forwarding_rule" {
74+ name = "tf-test-l7-xlb-forwarding-rule%{random_suffix}"
75+ provider = google
76+ ip_protocol = "TCP"
77+ load_balancing_scheme = "EXTERNAL"
78+ port_range = "80"
79+ target = google_compute_target_http_proxy.default.id
80+ }
81+
82+ # http proxy
83+ resource "google_compute_target_http_proxy" "default" {
84+ name = "tf-test-l7-xlb-target-http-proxy%{random_suffix}"
85+ provider = google
86+ url_map = google_compute_url_map.default.id
87+ }
88+
89+ # url map
90+ resource "google_compute_url_map" "default" {
91+ name = "tf-test-l7-xlb-url-map%{random_suffix}"
92+ provider = google
93+ default_service = google_compute_backend_service.default.id
94+ }
95+
96+ # backend service with custom request and response headers
97+ resource "google_compute_backend_service" "default" {
98+ name = "tf-test-l7-xlb-backend-service%{random_suffix}"
99+ provider = google-beta
100+ protocol = "HTTP"
101+ port_name = "my-port"
102+ load_balancing_scheme = "EXTERNAL"
103+ timeout_sec = 10
104+ enable_cdn = true
105+ custom_request_headers = ["X-Client-Geo-Location: {client_region_subdivision}, {client_city}"]
106+ custom_response_headers = ["X-Cache-Hit: {cdn_cache_status}"]
107+ health_checks = [google_compute_health_check.default.id]
108+ backend {
109+ group = google_compute_instance_group_manager.mig.instance_group
110+ balancing_mode = "UTILIZATION"
111+ capacity_scaler = 1.0
112+ }
113+ }
114+
115+ # instance template
116+ resource "google_compute_instance_template" "instance_template" {
117+ name = "tf-test-l7-xlb-mig-template%{random_suffix}"
118+ provider = google
119+ machine_type = "e2-small"
120+ tags = ["allow-health-check"]
121+
122+ network_interface {
123+ network = google_compute_network.xlb_network.id
124+ subnetwork = google_compute_subnetwork.xlb_subnet.id
125+ access_config {
126+ # add external ip to fetch packages
127+ }
128+ }
129+ disk {
130+ source_image = "debian-cloud/debian-10"
131+ auto_delete = true
132+ boot = true
133+ }
134+
135+ # install nginx and serve a simple web page
136+ metadata = {
137+ startup-script = <<-EOF1
138+ #! /bin/bash
139+ set -euo pipefail
140+
141+ export DEBIAN_FRONTEND=noninteractive
142+ apt-get update
143+ apt-get install -y nginx-light jq
144+
145+ NAME=$(curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/hostname")
146+ IP=$(curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip")
147+ METADATA=$(curl -f -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=True" | jq 'del(.["startup-script"])')
148+
149+ cat <<EOF > /var/www/html/index.html
150+ <pre>
151+ Name: $NAME
152+ IP: $IP
153+ Metadata: $METADATA
154+ </pre>
155+ EOF
156+ EOF1
157+ }
158+ lifecycle {
159+ create_before_destroy = true
160+ }
161+ }
162+
163+ # health check
164+ resource "google_compute_health_check" "default" {
165+ name = "tf-test-l7-xlb-hc%{random_suffix}"
166+ provider = google
167+ http_health_check {
168+ port_specification = "USE_SERVING_PORT"
169+ }
170+ }
171+
172+ # MIG
173+ resource "google_compute_instance_group_manager" "mig" {
174+ name = "tf-test-l7-xlb-mig1%{random_suffix}"
175+ provider = google
176+ zone = "us-central1-c"
177+ named_port {
178+ name = "http"
179+ port = 8080
180+ }
181+ version {
182+ instance_template = google_compute_instance_template.instance_template.id
183+ name = "primary"
184+ }
185+ base_instance_name = "vm"
186+ target_size = 2
187+ }
188+
189+ # allow access from health check ranges
190+ resource "google_compute_firewall" "fw_health_check" {
191+ name = "tf-test-l7-xlb-fw-allow-hc%{random_suffix}"
192+ provider = google
193+ direction = "INGRESS"
194+ network = google_compute_network.xlb_network.id
195+ source_ranges = ["130.211.0.0/22", "35.191.0.0/16"]
196+ allow {
197+ protocol = "tcp"
198+ }
199+ target_tags = ["allow-health-check"]
200+ }
201+ ` , context )
202+ }
203+
26204func TestAccComputeGlobalForwardingRule_globalForwardingRuleHttpExample (t * testing.T ) {
27205 t .Parallel ()
28206
0 commit comments