diff --git a/products/compute/terraform.yaml b/products/compute/terraform.yaml index 894c37c2cc0d..2c3712181a0b 100644 --- a/products/compute/terraform.yaml +++ b/products/compute/terraform.yaml @@ -2672,7 +2672,6 @@ overrides: !ruby/object:Overrides::ResourceOverrides vars: url_map_name: "urlmap" login_backend_service_name: "login" - home_backend_service_name: "home" http_health_check_name: "health-check" backend_bucket_name: "static-asset-backend-bucket" storage_bucket_name: "static-asset-bucket" @@ -2728,7 +2727,7 @@ overrides: !ruby/object:Overrides::ResourceOverrides defaultService: !ruby/object:Overrides::Terraform::PropertyOverride # ResourceRef only supports 1 type and UrlMap has references to a BackendBucket or BackendService. # Just read the self_link string instead of extracting the name and making a self_link out of it. - custom_expand: 'templates/terraform/custom_expand/resourceref_as_string.go.erb' + custom_expand: 'templates/terraform/custom_expand/reference_to_backend.erb' description: The backend service or backend bucket to use when none of the given rules match. hostRules: !ruby/object:Overrides::Terraform::PropertyOverride name: "host_rule" @@ -2740,21 +2739,37 @@ overrides: !ruby/object:Overrides::ResourceOverrides pathMatchers.defaultService: !ruby/object:Overrides::Terraform::PropertyOverride # ResourceRef only supports 1 type and UrlMap has references to a BackendBucket or BackendService. # Just read the self_link string instead of extracting the name and making a self_link out of it. - custom_expand: 'templates/terraform/custom_expand/resourceref_as_string.go.erb' + custom_expand: 'templates/terraform/custom_expand/reference_to_backend.erb' description: The backend service or backend bucket to use when none of the given paths match. pathMatchers.pathRules: !ruby/object:Overrides::Terraform::PropertyOverride name: "path_rule" pathMatchers.pathRules.paths: !ruby/object:Overrides::Terraform::PropertyOverride is_set: true - pathMatchers.pathRules.service: !ruby/object:Overrides::Terraform::PropertyOverride + pathMatchers.defaultRouteAction.weightedBackendServices.backendService: !ruby/object:Overrides::Terraform::PropertyOverride # ResourceRef only supports 1 type and UrlMap has references to a BackendBucket or BackendService. # Just read the self_link string instead of extracting the name and making a self_link out of it. - custom_expand: 'templates/terraform/custom_expand/resourceref_as_string.go.erb' + custom_expand: 'templates/terraform/custom_expand/reference_to_backend.erb' + pathMatchers.defaultRouteAction.requestMirrorPolicy.backendService: !ruby/object:Overrides::Terraform::PropertyOverride + custom_expand: 'templates/terraform/custom_expand/reference_to_backend.erb' + defaultRouteAction.weightedBackendServices.backendService: !ruby/object:Overrides::Terraform::PropertyOverride + custom_expand: 'templates/terraform/custom_expand/reference_to_backend.erb' + defaultRouteAction.requestMirrorPolicy.backendService: !ruby/object:Overrides::Terraform::PropertyOverride + custom_expand: 'templates/terraform/custom_expand/reference_to_backend.erb' + pathMatchers.routeRules.service: !ruby/object:Overrides::Terraform::PropertyOverride + custom_expand: 'templates/terraform/custom_expand/reference_to_backend.erb' + pathMatchers.pathRules.service: !ruby/object:Overrides::Terraform::PropertyOverride + custom_expand: 'templates/terraform/custom_expand/reference_to_backend.erb' description: The backend service or backend bucket to use if any of the given paths match. + pathMatchers.routeRules.routeAction.weightedBackendServices.backendService: !ruby/object:Overrides::Terraform::PropertyOverride + custom_expand: 'templates/terraform/custom_expand/reference_to_backend.erb' + pathMatchers.pathRules.routeAction.weightedBackendServices.backendService: !ruby/object:Overrides::Terraform::PropertyOverride + custom_expand: 'templates/terraform/custom_expand/reference_to_backend.erb' + pathMatchers.routeRules.routeAction.requestMirrorPolicy.backendService: !ruby/object:Overrides::Terraform::PropertyOverride + custom_expand: 'templates/terraform/custom_expand/reference_to_backend.erb' + pathMatchers.pathRules.routeAction.requestMirrorPolicy.backendService: !ruby/object:Overrides::Terraform::PropertyOverride + custom_expand: 'templates/terraform/custom_expand/reference_to_backend.erb' tests.service: !ruby/object:Overrides::Terraform::PropertyOverride - # ResourceRef only supports 1 type and UrlMap has references to a BackendBucket or BackendService. - # Just read the self_link string instead of extracting the name and making a self_link out of it. - custom_expand: 'templates/terraform/custom_expand/resourceref_as_string.go.erb' + custom_expand: 'templates/terraform/custom_expand/reference_to_backend.erb' description: The backend service or backend bucket link that should be matched by this test. tests: !ruby/object:Overrides::Terraform::PropertyOverride name: "test" diff --git a/templates/terraform/custom_expand/reference_to_backend.erb b/templates/terraform/custom_expand/reference_to_backend.erb new file mode 100644 index 000000000000..f3b4878cd3bb --- /dev/null +++ b/templates/terraform/custom_expand/reference_to_backend.erb @@ -0,0 +1,58 @@ +<%# The license inside this block applies to this file. + # Copyright 2017 Google Inc. + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. +-%> +<%# This provides the best long-form self link possible given the input. + # If the input is a full URL including scheme, we return it unmodified + # https://compute.googleapis.com/v1/projects/foo/regions/bar/backendBuckets/baz -> (the same) + # If the input is a partial self-link, we return it with the compute base path in front. + # projects/foo/regions/bar/backendServices/baz -> https://compute.googleapis.com/v1/projects/foo/regions/bar/backendServices/baz + # If the input is an even-more-partial link (not including projects), we return it with the compute base path + # and the specified project in front + # regions/bar/backendServices/baz -> https://compute.googleapis.com/v1/projects/provider-project/regions/bar/backendServices/baz + # If the input is just project/region/name, region/name, or just name, we treat it like a backendService. + # baz -> https://compute.googleapis.com/v1/projects/provider-project/regions/provider-region/backendServices/baz + # bar/baz -> https://compute.googleapis.com/v1/projects/provider-project/regions/bar/backendServices/baz + # foo/bar/baz -> https://compute.googleapis.com/v1/projects/foo/regions/bar/backendServices/baz +-%> +func expand<%= prefix -%><%= titlelize_property(property) -%>(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + // This method returns a full self link from whatever the input is. + if v == nil || v.(string) == "" { + // It does not try to construct anything from empty. + return "", nil + } else if strings.HasPrefix(v.(string), "https://") { + // Anything that starts with a URL scheme is assumed to be a self link worth using. + return v, nil + } else if strings.HasPrefix(v.(string), "projects/") { + // If the self link references a project, we'll just stuck the compute prefix on it + url, err := replaceVars(d, config, "{{ComputeBasePath}}" + v.(string)) + if err != nil { + return "", err + } + return url, nil + } else if strings.HasPrefix(v.(string), "regions/") || strings.HasPrefix(v.(string), "zones/") { + // For regional or zonal resources which include their region or zone, just put the project in front. + url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/") + if err != nil { + return nil, err + } + return url + v.(string), nil + } + // Anything else is assumed to be a reference to a global backend service. + f, err := parseGlobalFieldValue("backendServices", v.(string), "project", d, config, true) + if err != nil { + return "", err + } + + return f.RelativeLink(), nil +} diff --git a/templates/terraform/examples/url_map_basic.tf.erb b/templates/terraform/examples/url_map_basic.tf.erb index 586ad7593ad2..a778b2c90348 100644 --- a/templates/terraform/examples/url_map_basic.tf.erb +++ b/templates/terraform/examples/url_map_basic.tf.erb @@ -2,7 +2,7 @@ resource "google_compute_url_map" "<%= ctx[:primary_resource_id] %>" { name = "<%= ctx[:vars]['url_map_name'] %>" description = "a description" - default_service = google_compute_backend_service.home.id + default_service = google_compute_backend_bucket.static.id host_rule { hosts = ["mysite.com"] @@ -16,11 +16,11 @@ resource "google_compute_url_map" "<%= ctx[:primary_resource_id] %>" { path_matcher { name = "mysite" - default_service = google_compute_backend_service.home.id + default_service = google_compute_backend_bucket.static.id path_rule { paths = ["/home"] - service = google_compute_backend_service.home.id + service = google_compute_backend_bucket.static.id } path_rule { @@ -36,11 +36,11 @@ resource "google_compute_url_map" "<%= ctx[:primary_resource_id] %>" { path_matcher { name = "otherpaths" - default_service = google_compute_backend_service.home.id + default_service = google_compute_backend_bucket.static.id } test { - service = google_compute_backend_service.home.id + service = google_compute_backend_bucket.static.id host = "hi.com" path = "/home" } @@ -55,15 +55,6 @@ resource "google_compute_backend_service" "login" { health_checks = [google_compute_http_health_check.default.id] } -resource "google_compute_backend_service" "home" { - name = "<%= ctx[:vars]['home_backend_service_name'] %>" - port_name = "http" - protocol = "HTTP" - timeout_sec = 10 - - health_checks = [google_compute_http_health_check.default.id] -} - resource "google_compute_http_health_check" "default" { name = "<%= ctx[:vars]['http_health_check_name'] %>" request_path = "/"