diff --git a/products/compute/api.yaml b/products/compute/api.yaml index 1ed0fdff74d9..809c71fe0697 100644 --- a/products/compute/api.yaml +++ b/products/compute/api.yaml @@ -11198,6 +11198,10 @@ objects: path: 'error/errors' message: 'message' properties: + - !ruby/object:Api::Type::Integer + name: 'id' + description: 'The unique identifier for the resource.' + output: true - !ruby/object:Api::Type::Time name: 'creationTimestamp' description: 'Creation timestamp in RFC3339 text format.' @@ -11509,6 +11513,8 @@ objects: description: | UrlMaps are used to route requests to a backend service based on rules that you define for the host and path of an incoming URL. + references: !ruby/object:Api::Resource::ReferenceLinks + api: https://cloud.google.com/compute/docs/reference/rest/v1/urlMaps async: !ruby/object:Api::OpAsync operation: !ruby/object:Api::OpAsync::Operation kind: 'compute#operation' @@ -11536,83 +11542,185 @@ objects: name: 'defaultService' resource: 'BackendService' imports: 'selfLink' - description: - A reference to BackendService resource if none of the hostRules match. - required: true + description: | + The BackendService resource to which traffic is + directed if none of the hostRules match. If defaultRouteAction is additionally + specified, advanced routing actions like URL Rewrites, etc. take effect prior to + sending the request to the backend. However, if defaultService is specified, + defaultRouteAction cannot contain any weightedBackendServices. Conversely, if + routeAction specifies any weightedBackendServices, service must not be + specified. Only one of defaultService, defaultUrlRedirect or + defaultRouteAction.weightedBackendService must be set. - !ruby/object:Api::Type::String name: 'description' description: | - An optional description of this resource. Provide this property when - you create the resource. - # 'fingerprint' used internally for object consistency. + An optional description of this resource. Provide this property when you create + the resource. + - !ruby/object:Api::Type::Integer + name: 'id' + description: 'The unique identifier for the resource.' + output: true + - !ruby/object:Api::Type::Fingerprint + name: 'fingerprint' + description: | + Fingerprint of this resource. A hash of the contents stored in this object. This + field is used in optimistic locking. + - !ruby/object:Api::Type::NestedObject + name: 'headerAction' + description: | + Specifies changes to request and response headers that need to take effect for + the selected backendService. The headerAction specified here take effect after + headerAction specified under pathMatcher. + properties: + - !ruby/object:Api::Type::Array + name: 'requestHeadersToAdd' + at_least_one_of: + - header_action.0.request_headers_to_add + - header_action.0.request_headers_to_remove + - header_action.0.response_headers_to_add + - header_action.0.response_headers_to_remove + description: | + Headers to add to a matching request prior to forwarding the request to the + backendService. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::String + name: 'headerName' + required: true + description: | + The name of the header. + - !ruby/object:Api::Type::String + name: 'headerValue' + required: true + description: | + The value of the header to add. + - !ruby/object:Api::Type::Boolean + name: 'replace' + required: true + description: | + If false, headerValue is appended to any values that already exist for the + header. If true, headerValue is set for the header, discarding any values that + were set for that header. + - !ruby/object:Api::Type::Array + name: 'requestHeadersToRemove' + item_type: Api::Type::String + at_least_one_of: + - header_action.0.request_headers_to_add + - header_action.0.request_headers_to_remove + - header_action.0.response_headers_to_add + - header_action.0.response_headers_to_remove + description: | + A list of header names for headers that need to be removed from the request + prior to forwarding the request to the backendService. + - !ruby/object:Api::Type::Array + name: 'responseHeadersToAdd' + at_least_one_of: + - header_action.0.request_headers_to_add + - header_action.0.request_headers_to_remove + - header_action.0.response_headers_to_add + - header_action.0.response_headers_to_remove + description: | + Headers to add the response prior to sending the response back to the client. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::String + name: 'headerName' + required: true + description: | + The name of the header. + - !ruby/object:Api::Type::String + name: 'headerValue' + required: true + description: | + The value of the header to add. + - !ruby/object:Api::Type::Boolean + name: 'replace' + required: true + description: | + If false, headerValue is appended to any values that already exist for the + header. If true, headerValue is set for the header, discarding any values that + were set for that header. + - !ruby/object:Api::Type::Array + name: 'responseHeadersToRemove' + item_type: Api::Type::String + at_least_one_of: + - header_action.0.request_headers_to_add + - header_action.0.request_headers_to_remove + - header_action.0.response_headers_to_add + - header_action.0.response_headers_to_remove + description: | + A list of header names for headers that need to be removed from the response + prior to sending the response back to the client. - !ruby/object:Api::Type::Array name: 'hostRules' - description: 'The list of HostRules to use against the URL.' + description: | + The list of HostRules to use against the URL. item_type: !ruby/object:Api::Type::NestedObject properties: - !ruby/object:Api::Type::String name: 'description' description: | - An optional description of this HostRule. Provide this property - when you create the resource. + An optional description of this resource. Provide this property when you create + the resource. - !ruby/object:Api::Type::Array name: 'hosts' required: true item_type: Api::Type::String description: | - The list of host patterns to match. They must be valid - hostnames, except * will match any string of ([a-z0-9-.]*). In - that case, * must be the first character and must be followed in - the pattern by either - or .. + The list of host patterns to match. They must be valid hostnames, except * will + match any string of ([a-z0-9-.]*). In that case, * must be the first character + and must be followed in the pattern by either - or .. - !ruby/object:Api::Type::String name: 'pathMatcher' required: true description: | - The name of the PathMatcher to use to match the path portion of - the URL if the hostRule matches the URL's host portion. - - !ruby/object:Api::Type::Integer - name: 'id' - description: 'The unique identifier for the resource.' - output: true - - !ruby/object:Api::Type::Fingerprint - name: 'fingerprint' - description: | - Fingerprint of this resource. This field is used internally during - updates of this resource. + The name of the PathMatcher to use to match the path portion of the URL if the + hostRule matches the URL's host portion. - !ruby/object:Api::Type::String name: 'name' required: true input: true description: | - Name of the resource. Provided by the client when the resource is - created. The name must be 1-63 characters long, and comply with - RFC1035. Specifically, the name must be 1-63 characters long and match - the regular expression `[a-z]([-a-z0-9]*[a-z0-9])?` which means the - first character must be a lowercase letter, and all following - characters must be a dash, lowercase letter, or digit, except the last - character, which cannot be a dash. + Name of the resource. Provided by the client when the resource is created. The + name must be 1-63 characters long, and comply with RFC1035. Specifically, the + name must be 1-63 characters long and match the regular expression + `[a-z]([-a-z0-9]*[a-z0-9])?` which means the first character must be a lowercase + letter, and all following characters must be a dash, lowercase letter, or digit, + except the last character, which cannot be a dash. - !ruby/object:Api::Type::Array name: 'pathMatchers' - description: 'The list of named PathMatchers to use against the URL.' + description: | + The list of named PathMatchers to use against the URL. item_type: !ruby/object:Api::Type::NestedObject properties: - !ruby/object:Api::Type::ResourceRef name: 'defaultService' - required: true resource: 'BackendService' imports: 'selfLink' description: | - A reference to a BackendService resource. This will be used if - none of the pathRules defined by this PathMatcher is matched by - the URL's path portion. + The BackendService resource. This will be used if + none of the pathRules or routeRules defined by this PathMatcher are matched. For + example, the following are all valid URLs to a BackendService resource: + - https://www.googleapis.com/compute/v1/projects/project/global/backendServices/backen + dService + - compute/v1/projects/project/global/backendServices/backendService + - global/backendServices/backendService + If defaultRouteAction is additionally + specified, advanced routing actions like URL Rewrites, etc. take effect prior to + sending the request to the backend. However, if defaultService is specified, + defaultRouteAction cannot contain any weightedBackendServices. Conversely, if + defaultRouteAction specifies any weightedBackendServices, defaultService must + not be specified. Only one of defaultService, defaultUrlRedirect or + defaultRouteAction.weightedBackendService must be set. Authorization requires + one or more of the following Google IAM permissions on the specified resource + default_service: + - compute.backendBuckets.use + - compute.backendServices.use - !ruby/object:Api::Type::String name: 'description' - description: 'An optional description of this resource.' - - !ruby/object:Api::Type::String - name: 'name' - required: true description: | - The name to which this PathMatcher is referred by the HostRule. + An optional description of this resource. Provide this property when you create + the resource. - !ruby/object:Api::Type::Array name: 'pathRules' description: 'The list of path rules.' @@ -11636,32 +11744,776 @@ objects: description: | A reference to the BackendService resource if this rule is matched. + - !ruby/object:Api::Type::NestedObject + name: 'headerAction' + description: | + Specifies changes to request and response headers that need to take effect for + the selected backendService. HeaderAction specified here are applied after the + matching HttpRouteRule HeaderAction and before the HeaderAction in the UrlMap + properties: + - !ruby/object:Api::Type::Array + name: 'requestHeadersToAdd' + at_least_one_of: + - path_matcher.0.header_action.0.request_headers_to_add + - path_matcher.0.header_action.0.request_headers_to_remove + - path_matcher.0.header_action.0.response_headers_to_add + - path_matcher.0.header_action.0.response_headers_to_remove + description: | + Headers to add to a matching request prior to forwarding the request to the + backendService. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::String + name: 'headerName' + description: | + The name of the header. + - !ruby/object:Api::Type::String + name: 'headerValue' + description: | + The value of the header to add. + - !ruby/object:Api::Type::Boolean + name: 'replace' + default_value: false + description: | + If false, headerValue is appended to any values that already exist for the + header. If true, headerValue is set for the header, discarding any values that + were set for that header. Defaults to false. + - !ruby/object:Api::Type::Array + name: 'requestHeadersToRemove' + item_type: Api::Type::String + at_least_one_of: + - path_matcher.0.header_action.0.request_headers_to_add + - path_matcher.0.header_action.0.request_headers_to_remove + - path_matcher.0.header_action.0.response_headers_to_add + - path_matcher.0.header_action.0.response_headers_to_remove + description: | + A list of header names for headers that need to be removed from the request + prior to forwarding the request to the backendService. + - !ruby/object:Api::Type::Array + name: 'responseHeadersToAdd' + at_least_one_of: + - path_matcher.0.header_action.0.request_headers_to_add + - path_matcher.0.header_action.0.request_headers_to_remove + - path_matcher.0.header_action.0.response_headers_to_add + - path_matcher.0.header_action.0.response_headers_to_remove + description: | + Headers to add the response prior to sending the response back to the client. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::String + name: 'headerName' + description: | + The name of the header. + - !ruby/object:Api::Type::String + name: 'headerValue' + description: | + The value of the header to add. + - !ruby/object:Api::Type::Boolean + name: 'replace' + default_value: false + description: | + If false, headerValue is appended to any values that already exist for the + header. If true, headerValue is set for the header, discarding any values that + were set for that header. Defaults to false. + - !ruby/object:Api::Type::Array + name: 'responseHeadersToRemove' + item_type: Api::Type::String + at_least_one_of: + - path_matcher.0.header_action.0.request_headers_to_add + - path_matcher.0.header_action.0.request_headers_to_remove + - path_matcher.0.header_action.0.response_headers_to_add + - path_matcher.0.header_action.0.response_headers_to_remove + description: | + A list of header names for headers that need to be removed from the response + prior to sending the response back to the client. + - !ruby/object:Api::Type::String + name: 'name' + required: true + description: | + The name to which this PathMatcher is referred by the HostRule. + - !ruby/object:Api::Type::Array + name: 'routeRules' + description: | + The list of ordered HTTP route rules. Use this list instead of pathRules when + advanced route matching and routing actions are desired. The order of specifying + routeRules matters: the first rule that matches will cause its specified routing + action to take effect. Within a given pathMatcher, only one of pathRules or + routeRules must be set. routeRules are not supported in UrlMaps intended for + External load balancers. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::Integer + name: 'priority' + required: true + description: | + For routeRules within a given pathMatcher, priority determines the order + in which load balancer will interpret routeRules. RouteRules are evaluated + in order of priority, from the lowest to highest number. The priority of + a rule decreases as its number increases (1, 2, 3, N+1). The first rule + that matches the request is applied. + + You cannot configure two or more routeRules with the same priority. + Priority for each rule must be set to a number between 0 and + 2147483647 inclusive. + + Priority numbers can have gaps, which enable you to add or remove rules + in the future without affecting the rest of the rules. For example, + 1, 2, 3, 4, 5, 9, 12, 16 is a valid series of priority numbers to which + you could add rules numbered from 6 to 8, 10 to 11, and 13 to 15 in the + future without any impact on existing rules. + - !ruby/object:Api::Type::NestedObject + name: 'headerAction' + description: | + Specifies changes to request and response headers that need to take effect for + the selected backendService. The headerAction specified here are applied before + the matching pathMatchers[].headerAction and after pathMatchers[].routeRules[].r + outeAction.weightedBackendService.backendServiceWeightAction[].headerAction + properties: + - !ruby/object:Api::Type::Array + name: 'requestHeadersToAdd' + description: | + Headers to add to a matching request prior to forwarding the request to the + backendService. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::String + name: 'headerName' + description: | + The name of the header. + - !ruby/object:Api::Type::String + name: 'headerValue' + description: | + The value of the header to add. + - !ruby/object:Api::Type::Boolean + name: 'replace' + default_value: false + description: | + If false, headerValue is appended to any values that already exist for the + header. If true, headerValue is set for the header, discarding any values that + were set for that header. Defaults to false. + - !ruby/object:Api::Type::Array + name: 'requestHeadersToRemove' + item_type: Api::Type::String + description: | + A list of header names for headers that need to be removed from the request + prior to forwarding the request to the backendService. + - !ruby/object:Api::Type::Array + name: 'responseHeadersToAdd' + description: | + Headers to add the response prior to sending the response back to the client. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::String + name: 'headerName' + description: | + The name of the header. + - !ruby/object:Api::Type::String + name: 'headerValue' + description: | + The value of the header to add. + - !ruby/object:Api::Type::Boolean + name: 'replace' + default_value: false + description: | + If false, headerValue is appended to any values that already exist for the + header. If true, headerValue is set for the header, discarding any values that + were set for that header. Defaults to false. + - !ruby/object:Api::Type::Array + name: 'responseHeadersToRemove' + item_type: Api::Type::String + description: | + A list of header names for headers that need to be removed from the response + prior to sending the response back to the client. + - !ruby/object:Api::Type::Array + name: 'matchRules' + description: | + The rules for determining a match. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::String + name: 'fullPathMatch' + description: | + For satifying the matchRule condition, the path of the request must exactly + match the value specified in fullPathMatch after removing any query parameters + and anchor that may be part of the original URL. FullPathMatch must be between 1 + and 1024 characters. Only one of prefixMatch, fullPathMatch or regexMatch must + be specified. + - !ruby/object:Api::Type::Array + name: 'headerMatches' + description: | + Specifies a list of header match criteria, all of which must match corresponding + headers in the request. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::String + name: 'exactMatch' + description: | + The value should exactly match contents of exactMatch. Only one of exactMatch, + prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set. + - !ruby/object:Api::Type::String + name: 'headerName' + required: true + description: | + The name of the HTTP header to match. For matching against the HTTP request's + authority, use a headerMatch with the header name ":authority". For matching a + request's method, use the headerName ":method". + - !ruby/object:Api::Type::Boolean + name: 'invertMatch' + default_value: false + description: | + If set to false, the headerMatch is considered a match if the match criteria + above are met. If set to true, the headerMatch is considered a match if the + match criteria above are NOT met. Defaults to false. + - !ruby/object:Api::Type::String + name: 'prefixMatch' + description: | + The value of the header must start with the contents of prefixMatch. Only one of + exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch + must be set. + - !ruby/object:Api::Type::Boolean + name: 'presentMatch' + description: | + A header with the contents of headerName must exist. The match takes place + whether or not the request's header has a value or not. Only one of exactMatch, + prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch must be set. + - !ruby/object:Api::Type::NestedObject + name: 'rangeMatch' + description: | + The header value must be an integer and its value must be in the range specified + in rangeMatch. If the header does not contain an integer, number or is empty, + the match fails. For example for a range [-5, 0] - -3 will match. - 0 will + not match. - 0.25 will not match. - -3someString will not match. Only one of + exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch + must be set. + properties: + - !ruby/object:Api::Type::Integer + name: 'rangeEnd' + required: true + description: | + The end of the range (exclusive). + - !ruby/object:Api::Type::Integer + name: 'rangeStart' + required: true + description: | + The start of the range (inclusive). + - !ruby/object:Api::Type::String + name: 'regexMatch' + description: | + The value of the header must match the regualar expression specified in + regexMatch. For regular expression grammar, please see: + en.cppreference.com/w/cpp/regex/ecmascript For matching against a port + specified in the HTTP request, use a headerMatch with headerName set to PORT and + a regular expression that satisfies the RFC2616 Host header's port specifier. + Only one of exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or + rangeMatch must be set. + - !ruby/object:Api::Type::String + name: 'suffixMatch' + description: | + The value of the header must end with the contents of suffixMatch. Only one of + exactMatch, prefixMatch, suffixMatch, regexMatch, presentMatch or rangeMatch + must be set. + - !ruby/object:Api::Type::Boolean + name: 'ignoreCase' + default_value: false + description: | + Specifies that prefixMatch and fullPathMatch matches are case sensitive. + Defaults to false. + - !ruby/object:Api::Type::Array + name: 'metadataFilters' + description: | + Opaque filter criteria used by Loadbalancer to restrict routing configuration to + a limited set xDS compliant clients. In their xDS requests to Loadbalancer, xDS + clients present node metadata. If a match takes place, the relevant routing + configuration is made available to those proxies. For each metadataFilter in + this list, if its filterMatchCriteria is set to MATCH_ANY, at least one of the + filterLabels must match the corresponding label provided in the metadata. If its + filterMatchCriteria is set to MATCH_ALL, then all of its filterLabels must match + with corresponding labels in the provided metadata. metadataFilters specified + here can be overrides those specified in ForwardingRule that refers to this + UrlMap. metadataFilters only applies to Loadbalancers that have their + loadBalancingScheme set to INTERNAL_SELF_MANAGED. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::Array + name: 'filterLabels' + min_size: 1 + max_size: 64 + required: true + description: | + The list of label value pairs that must match labels in the provided metadata + based on filterMatchCriteria This list must not be empty and can have at the + most 64 entries. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::String + name: 'name' + required: true + description: | + Name of metadata label. The name can have a maximum length of 1024 characters + and must be at least 1 character long. + - !ruby/object:Api::Type::String + name: 'value' + required: true + description: | + The value of the label must match the specified value. value can have a maximum + length of 1024 characters. + - !ruby/object:Api::Type::Enum + name: 'filterMatchCriteria' + required: true + description: | + Specifies how individual filterLabel matches within the list of filterLabels + contribute towards the overall metadataFilter match. Supported values are: + - MATCH_ANY: At least one of the filterLabels must have a matching label in the + provided metadata. + - MATCH_ALL: All filterLabels must have matching labels in + the provided metadata. + values: + - :MATCH_ALL + - :MATCH_ANY + - !ruby/object:Api::Type::String + name: 'prefixMatch' + description: | + For satifying the matchRule condition, the request's path must begin with the + specified prefixMatch. prefixMatch must begin with a /. The value must be + between 1 and 1024 characters. Only one of prefixMatch, fullPathMatch or + regexMatch must be specified. + - !ruby/object:Api::Type::Array + name: 'queryParameterMatches' + description: | + Specifies a list of query parameter match criteria, all of which must match + corresponding query parameters in the request. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::String + name: 'exactMatch' + description: | + The queryParameterMatch matches if the value of the parameter exactly matches + the contents of exactMatch. Only one of presentMatch, exactMatch and regexMatch + must be set. + - !ruby/object:Api::Type::String + name: 'name' + required: true + description: | + The name of the query parameter to match. The query parameter must exist in the + request, in the absence of which the request match fails. + - !ruby/object:Api::Type::Boolean + name: 'presentMatch' + description: | + Specifies that the queryParameterMatch matches if the request contains the query + parameter, irrespective of whether the parameter has a value or not. Only one of + presentMatch, exactMatch and regexMatch must be set. + - !ruby/object:Api::Type::String + name: 'regexMatch' + description: | + The queryParameterMatch matches if the value of the parameter matches the + regular expression specified by regexMatch. For the regular expression grammar, + please see en.cppreference.com/w/cpp/regex/ecmascript Only one of presentMatch, + exactMatch and regexMatch must be set. + - !ruby/object:Api::Type::String + name: 'regexMatch' + description: | + For satifying the matchRule condition, the path of the request must satisfy the + regular expression specified in regexMatch after removing any query parameters + and anchor supplied with the original URL. For regular expression grammar please + see en.cppreference.com/w/cpp/regex/ecmascript Only one of prefixMatch, + fullPathMatch or regexMatch must be specified. + - !ruby/object:Api::Type::NestedObject + name: 'routeAction' + description: | + In response to a matching matchRule, the load balancer performs advanced routing + actions like URL rewrites, header transformations, etc. prior to forwarding the + request to the selected backend. If routeAction specifies any + weightedBackendServices, service must not be set. Conversely if service is set, + routeAction cannot contain any weightedBackendServices. Only one of routeAction + or urlRedirect must be set. + properties: + - !ruby/object:Api::Type::NestedObject + name: 'corsPolicy' + description: | + The specification for allowing client side cross-origin requests. Please see W3C + Recommendation for Cross Origin Resource Sharing + properties: + - !ruby/object:Api::Type::Boolean + name: 'allowCredentials' + default_value: false + description: | + In response to a preflight request, setting this to true indicates that the + actual request can include user credentials. This translates to the Access- + Control-Allow-Credentials header. Defaults to false. + - !ruby/object:Api::Type::Array + name: 'allowHeaders' + item_type: Api::Type::String + description: | + Specifies the content for the Access-Control-Allow-Headers header. + - !ruby/object:Api::Type::Array + name: 'allowMethods' + item_type: Api::Type::String + description: | + Specifies the content for the Access-Control-Allow-Methods header. + - !ruby/object:Api::Type::Array + name: 'allowOriginRegexes' + item_type: Api::Type::String + description: | + Specifies the regualar expression patterns that match allowed origins. For + regular expression grammar please see en.cppreference.com/w/cpp/regex/ecmascript + An origin is allowed if it matches either allow_origins or allow_origin_regex. + - !ruby/object:Api::Type::Array + name: 'allowOrigins' + item_type: Api::Type::String + description: | + Specifies the list of origins that will be allowed to do CORS requests. An + origin is allowed if it matches either allow_origins or allow_origin_regex. + - !ruby/object:Api::Type::Boolean + name: 'disabled' + default_value: false + description: | + If true, specifies the CORS policy is disabled. + which indicates that the CORS policy is in effect. Defaults to false. + - !ruby/object:Api::Type::Array + name: 'exposeHeaders' + item_type: Api::Type::String + description: | + Specifies the content for the Access-Control-Expose-Headers header. + - !ruby/object:Api::Type::Integer + name: 'maxAge' + description: | + Specifies how long the results of a preflight request can be cached. This + translates to the content for the Access-Control-Max-Age header. + - !ruby/object:Api::Type::NestedObject + name: 'faultInjectionPolicy' + description: | + The specification for fault injection introduced into traffic to test the + resiliency of clients to backend service failure. As part of fault injection, + when clients send requests to a backend service, delays can be introduced by + Loadbalancer on a percentage of requests before sending those request to the + backend service. Similarly requests from clients can be aborted by the + Loadbalancer for a percentage of requests. timeout and retry_policy will be + ignored by clients that are configured with a fault_injection_policy. + properties: + - !ruby/object:Api::Type::NestedObject + name: 'abort' + description: | + The specification for how client requests are aborted as part of fault + injection. + properties: + - !ruby/object:Api::Type::Integer + name: 'httpStatus' + description: | + The HTTP status code used to abort the request. The value must be between 200 + and 599 inclusive. + - !ruby/object:Api::Type::Double + name: 'percentage' + description: | + The percentage of traffic (connections/operations/requests) which will be + aborted as part of fault injection. The value must be between 0.0 and 100.0 + inclusive. + - !ruby/object:Api::Type::NestedObject + name: 'delay' + description: | + The specification for how client requests are delayed as part of fault + injection, before being sent to a backend service. + properties: + - !ruby/object:Api::Type::NestedObject + name: 'fixedDelay' + description: | + Specifies the value of the fixed delay interval. + properties: + - !ruby/object:Api::Type::Integer + name: 'nanos' + description: | + Span of time that's a fraction of a second at nanosecond resolution. Durations + less than one second are represented with a 0 `seconds` field and a positive + `nanos` field. Must be from 0 to 999,999,999 inclusive. + - !ruby/object:Api::Type::String + name: 'seconds' + required: true + description: | + Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 + inclusive. + - !ruby/object:Api::Type::Double + name: 'percentage' + description: | + The percentage of traffic (connections/operations/requests) on which delay will + be introduced as part of fault injection. The value must be between 0.0 and + 100.0 inclusive. + - !ruby/object:Api::Type::NestedObject + name: 'requestMirrorPolicy' + description: | + Specifies the policy on how requests intended for the route's backends are + shadowed to a separate mirrored backend service. Loadbalancer does not wait for + responses from the shadow service. Prior to sending traffic to the shadow + service, the host / authority header is suffixed with -shadow. + properties: + - !ruby/object:Api::Type::ResourceRef + name: 'backendService' + required: true + resource: 'BackendService' + imports: 'selfLink' + description: | + The BackendService resource being mirrored to. + - !ruby/object:Api::Type::NestedObject + name: 'retryPolicy' + description: | + Specifies the retry policy associated with this route. + properties: + - !ruby/object:Api::Type::Integer + name: 'numRetries' + required: true + description: | + Specifies the allowed number retries. This number must be > 0. + - !ruby/object:Api::Type::NestedObject + name: 'perTryTimeout' + description: | + Specifies a non-zero timeout per retry attempt. + If not specified, will use the timeout set in HttpRouteAction. If timeout in HttpRouteAction + is not set, will use the largest timeout among all backend services associated with the route. + properties: + - !ruby/object:Api::Type::Integer + name: 'nanos' + description: | + Span of time that's a fraction of a second at nanosecond resolution. Durations + less than one second are represented with a 0 `seconds` field and a positive + `nanos` field. Must be from 0 to 999,999,999 inclusive. + - !ruby/object:Api::Type::String + name: 'seconds' + required: true + description: | + Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 + inclusive. + - !ruby/object:Api::Type::Array + name: 'retryConditions' + item_type: Api::Type::String + description: | + Specfies one or more conditions when this retry rule applies. Valid values are: + - 5xx: Loadbalancer will attempt a retry if the backend service responds with + any 5xx response code, or if the backend service does not respond at all, + example: disconnects, reset, read timeout, connection failure, and refused + streams. - gateway-error: Similar to 5xx, but only applies to response codes + 502, 503 or 504. - - connect-failure: Loadbalancer will retry on failures + connecting to backend services, for example due to connection timeouts. - + retriable-4xx: Loadbalancer will retry for retriable 4xx response codes. + Currently the only retriable error supported is 409. - refused- + stream:Loadbalancer will retry if the backend service resets the stream with a + REFUSED_STREAM error code. This reset type indicates that it is safe to retry. + - cancelledLoadbalancer will retry if the gRPC status code in the response + header is set to cancelled - deadline-exceeded: Loadbalancer will retry if the + gRPC status code in the response header is set to deadline-exceeded - resource- + exhausted: Loadbalancer will retry if the gRPC status code in the response + header is set to resource-exhausted - unavailable: Loadbalancer will retry if + the gRPC status code in the response header is set to unavailable + - !ruby/object:Api::Type::NestedObject + name: 'timeout' + description: | + Specifies the timeout for the selected route. Timeout is computed from the time + the request is has been fully processed (i.e. end-of-stream) up until the + response has been completely processed. Timeout includes all retries. If not + specified, the default value is 15 seconds. + properties: + - !ruby/object:Api::Type::Integer + name: 'nanos' + description: | + Span of time that's a fraction of a second at nanosecond resolution. Durations + less than one second are represented with a 0 `seconds` field and a positive + `nanos` field. Must be from 0 to 999,999,999 inclusive. + - !ruby/object:Api::Type::String + name: 'seconds' + required: true + description: | + Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 + inclusive. + - !ruby/object:Api::Type::NestedObject + name: 'urlRewrite' + description: | + The spec to modify the URL of the request, prior to forwarding the request to + the matched service + properties: + - !ruby/object:Api::Type::String + name: 'hostRewrite' + description: | + Prior to forwarding the request to the selected service, the request's host + header is replaced with contents of hostRewrite. The value must be between 1 and + 255 characters. + - !ruby/object:Api::Type::String + name: 'pathPrefixRewrite' + description: | + Prior to forwarding the request to the selected backend service, the matching + portion of the request's path is replaced by pathPrefixRewrite. The value must + be between 1 and 1024 characters. + - !ruby/object:Api::Type::Array + name: 'weightedBackendServices' + description: | + A list of weighted backend services to send traffic to when a route match + occurs. The weights determine the fraction of traffic that flows to their + corresponding backend service. If all traffic needs to go to a single backend + service, there must be one weightedBackendService with weight set to a non 0 + number. Once a backendService is identified and before forwarding the request to + the backend service, advanced routing actions like Url rewrites and header + transformations are applied depending on additional settings specified in this + HttpRouteAction. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::ResourceRef + name: 'backendService' + required: true + resource: 'BackendService' + imports: 'selfLink' + description: | + The default BackendService resource. Before + forwarding the request to backendService, the loadbalancer applies any relevant + headerActions specified as part of this backendServiceWeight. + - !ruby/object:Api::Type::NestedObject + name: 'headerAction' + description: | + Specifies changes to request and response headers that need to take effect for + the selected backendService. headerAction specified here take effect before + headerAction in the enclosing HttpRouteRule, PathMatcher and UrlMap. + properties: + - !ruby/object:Api::Type::Array + name: 'requestHeadersToAdd' + description: | + Headers to add to a matching request prior to forwarding the request to the + backendService. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::String + name: 'headerName' + description: | + The name of the header. + - !ruby/object:Api::Type::String + name: 'headerValue' + description: | + The value of the header to add. + - !ruby/object:Api::Type::Boolean + name: 'replace' + default_value: false + description: | + If false, headerValue is appended to any values that already exist for the + header. If true, headerValue is set for the header, discarding any values that + were set for that header. Defaults to false. + - !ruby/object:Api::Type::Array + name: 'requestHeadersToRemove' + item_type: Api::Type::String + description: | + A list of header names for headers that need to be removed from the request + prior to forwarding the request to the backendService. + - !ruby/object:Api::Type::Array + name: 'responseHeadersToAdd' + description: | + Headers to add the response prior to sending the response back to the client. + item_type: !ruby/object:Api::Type::NestedObject + properties: + - !ruby/object:Api::Type::String + name: 'headerName' + description: | + The name of the header. + - !ruby/object:Api::Type::String + name: 'headerValue' + description: | + The value of the header to add. + - !ruby/object:Api::Type::Boolean + name: 'replace' + default_value: false + description: | + If false, headerValue is appended to any values that already exist for the + header. If true, headerValue is set for the header, discarding any values that + were set for that header. Defaults to false. + - !ruby/object:Api::Type::Array + name: 'responseHeadersToRemove' + item_type: Api::Type::String + description: | + A list of header names for headers that need to be removed from the response + prior to sending the response back to the client. + - !ruby/object:Api::Type::Integer + name: 'weight' + description: | + Specifies the fraction of traffic sent to backendService, computed as weight / + (sum of all weightedBackendService weights in routeAction) . The selection of a + backend service is determined only for new traffic. Once a user's request has + been directed to a backendService, subsequent requests will be sent to the same + backendService as determined by the BackendService's session affinity policy. + The value must be between 0 and 1000 + - !ruby/object:Api::Type::NestedObject + name: 'urlRedirect' + description: | + When this rule is matched, the request is redirected to a URL specified by + urlRedirect. If urlRedirect is specified, service or routeAction must not be + set. + properties: + - !ruby/object:Api::Type::String + name: 'hostRedirect' + description: | + The host that will be used in the redirect response instead of the one that was + supplied in the request. The value must be between 1 and 255 characters. + - !ruby/object:Api::Type::Boolean + name: 'httpsRedirect' + default_value: false + description: | + If set to true, the URL scheme in the redirected request is set to https. If set + to false, the URL scheme of the redirected request will remain the same as that + of the request. This must only be set for UrlMaps used in TargetHttpProxys. + Setting this true for TargetHttpsProxy is not permitted. Defaults to false. + - !ruby/object:Api::Type::String + name: 'pathRedirect' + description: | + The path that will be used in the redirect response instead of the one that was + supplied in the request. Only one of pathRedirect or prefixRedirect must be + specified. The value must be between 1 and 1024 characters. + - !ruby/object:Api::Type::String + name: 'prefixRedirect' + description: | + The prefix that replaces the prefixMatch specified in the HttpRouteRuleMatch, + retaining the remaining portion of the URL before redirecting the request. + - !ruby/object:Api::Type::Enum + name: 'redirectResponseCode' + description: | + The HTTP Status code to use for this RedirectAction. Supported values are: - + MOVED_PERMANENTLY_DEFAULT, which is the default value and corresponds to 301. - + FOUND, which corresponds to 302. - SEE_OTHER which corresponds to 303. - + TEMPORARY_REDIRECT, which corresponds to 307. In this case, the request method + will be retained. - PERMANENT_REDIRECT, which corresponds to 308. In this case, + the request method will be retained. + values: + - :FOUND + - :MOVED_PERMANENTLY_DEFAULT + - :PERMANENT_REDIRECT + - :SEE_OTHER + - :TEMPORARY_REDIRECT + - !ruby/object:Api::Type::Boolean + name: 'stripQuery' + default_value: false + description: | + If set to true, any accompanying query portion of the original URL is removed + prior to redirecting the request. If set to false, the query portion of the + original URL is retained. Defaults to false. - !ruby/object:Api::Type::Array name: 'tests' description: | - The list of expected URL mappings. Requests to update this UrlMap will - succeed only if all of the test cases pass. + The list of expected URL mapping tests. Request to update this UrlMap will + succeed only if all of the test cases pass. You can specify a maximum of 100 + tests per UrlMap. item_type: !ruby/object:Api::Type::NestedObject properties: - !ruby/object:Api::Type::String name: 'description' - description: 'Description of this test case.' + description: | + Description of this test case. - !ruby/object:Api::Type::String name: 'host' required: true - description: 'Host portion of the URL.' + description: | + Host portion of the URL. - !ruby/object:Api::Type::String name: 'path' required: true - description: 'Path portion of the URL.' + description: | + Path portion of the URL. - !ruby/object:Api::Type::ResourceRef name: 'service' - required: true resource: 'BackendService' imports: 'selfLink' - description: - A reference to expected BackendService resource the given URL - should be mapped to. + required: true + description: | + Expected BackendService resource the given URL should be mapped to. - !ruby/object:Api::Resource name: 'VpnTunnel' kind: 'compute#vpnTunnel' diff --git a/products/compute/terraform.yaml b/products/compute/terraform.yaml index fa2518986697..2775cb2c663e 100644 --- a/products/compute/terraform.yaml +++ b/products/compute/terraform.yaml @@ -1983,6 +1983,24 @@ overrides: !ruby/object:Overrides::ResourceOverrides http_health_check_name: "health-check" backend_bucket_name: "static-asset-backend-bucket" storage_bucket_name: "static-asset-bucket" + - !ruby/object:Provider::Terraform::Examples + name: "url_map_traffic_director_route" + primary_resource_id: "urlmap" + vars: + url_map_name: "urlmap" + home_backend_service_name: "home" + health_check_name: "health-check" + backend_bucket_name: "static-asset-backend-bucket" + storage_bucket_name: "static-asset-bucket" + - !ruby/object:Provider::Terraform::Examples + name: "url_map_traffic_director_route_partial" + primary_resource_id: "urlmap" + vars: + url_map_name: "urlmap" + home_backend_service_name: "home" + health_check_name: "health-check" + backend_bucket_name: "static-asset-backend-bucket" + storage_bucket_name: "static-asset-bucket" properties: id: !ruby/object:Overrides::Terraform::PropertyOverride name: "map_id" diff --git a/templates/terraform/examples/url_map_traffic_director_route.tf.erb b/templates/terraform/examples/url_map_traffic_director_route.tf.erb new file mode 100644 index 000000000000..f51b3f38f2ae --- /dev/null +++ b/templates/terraform/examples/url_map_traffic_director_route.tf.erb @@ -0,0 +1,82 @@ +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.self_link}" + + host_rule { + hosts = ["mysite.com"] + path_matcher = "allpaths" + } + + path_matcher { + name = "allpaths" + default_service = "${google_compute_backend_service.home.self_link}" + + route_rules { + priority = 1 + header_action { + request_headers_to_remove = ["RemoveMe2"] + request_headers_to_add { + header_name = "AddSomethingElse" + header_value = "MyOtherValue" + replace = true + } + response_headers_to_remove = ["RemoveMe3"] + response_headers_to_add { + header_name = "AddMe" + header_value = "MyValue" + } + } + match_rules { + full_path_match = "a full path" + header_matches { + header_name = "someheader" + exact_match = "match this exactly" + invert_match = true + } + ignore_case = true + metadata_filters { + filter_match_criteria = "MATCH_ANY" + filter_labels { + name = "PLANET" + value = "MARS" + } + } + query_parameter_matches { + name = "a query parameter" + present_match = true + } + } + url_redirect { + host_redirect = "A host" + https_redirect = false + path_redirect = "some/path" + redirect_response_code = "TEMPORARY_REDIRECT" + strip_query = true + } + } + } + + test { + service = "${google_compute_backend_service.home.self_link}" + host = "hi.com" + path = "/home" + } +} + +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_health_check.default.self_link}"] + load_balancing_scheme = "INTERNAL_SELF_MANAGED" +} + +resource "google_compute_health_check" "default" { + name = "<%= ctx[:vars]['health_check_name'] %>" + http_health_check { + port = 80 + } +} diff --git a/templates/terraform/examples/url_map_traffic_director_route_partial.tf.erb b/templates/terraform/examples/url_map_traffic_director_route_partial.tf.erb new file mode 100644 index 000000000000..9330dee80050 --- /dev/null +++ b/templates/terraform/examples/url_map_traffic_director_route_partial.tf.erb @@ -0,0 +1,54 @@ +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.self_link}" + + host_rule { + hosts = ["mysite.com"] + path_matcher = "allpaths" + } + + path_matcher { + name = "allpaths" + default_service = "${google_compute_backend_service.home.self_link}" + + route_rules { + priority = 1 + match_rules { + prefix_match = "/someprefix" + header_matches { + header_name = "someheader" + exact_match = "match this exactly" + invert_match = true + } + } + url_redirect { + path_redirect = "some/path" + redirect_response_code = "TEMPORARY_REDIRECT" + } + } + } + + test { + service = "${google_compute_backend_service.home.self_link}" + host = "hi.com" + path = "/home" + } +} + +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_health_check.default.self_link}"] + load_balancing_scheme = "INTERNAL_SELF_MANAGED" +} + +resource "google_compute_health_check" "default" { + name = "<%= ctx[:vars]['health_check_name'] %>" + http_health_check { + port = 80 + } +} diff --git a/third_party/terraform/tests/resource_compute_url_map_test.go b/third_party/terraform/tests/resource_compute_url_map_test.go.erb similarity index 61% rename from third_party/terraform/tests/resource_compute_url_map_test.go rename to third_party/terraform/tests/resource_compute_url_map_test.go.erb index 5b61c498d56e..25444bb71a0a 100644 --- a/third_party/terraform/tests/resource_compute_url_map_test.go +++ b/third_party/terraform/tests/resource_compute_url_map_test.go.erb @@ -1,3 +1,4 @@ +<% autogen_exception -%> package google import ( @@ -122,6 +123,41 @@ func testAccCheckComputeUrlMapExists(n string) resource.TestCheckFunc { } } +<% unless version == 'ga' -%> +func TestAccComputeUrlMap_trafficDirectorUpdate(t *testing.T) { + t.Parallel() + + randString := acctest.RandString(10) + + bsName := fmt.Sprintf("urlmap-test-%s", randString) + hcName := fmt.Sprintf("urlmap-test-%s", randString) + umName := fmt.Sprintf("urlmap-test-%s", randString) + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckComputeUrlMapDestroy, + Steps: []resource.TestStep{ + { + Config: testAccComputeUrlMap_trafficDirector(bsName, hcName, umName), + }, + { + ResourceName: "google_compute_url_map.foobar", + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccComputeUrlMap_trafficDirectorUpdate(bsName, hcName, umName), + }, + { + ResourceName: "google_compute_url_map.foobar", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} +<% end -%> + func testAccComputeUrlMap_basic1(bsName, hcName, umName string) string { return fmt.Sprintf(` resource "google_compute_backend_service" "foobar" { @@ -364,3 +400,196 @@ resource "google_compute_url_map" "foobar" { } `, bsName, hcName, umName) } + +<% unless version == 'ga' -%> +func testAccComputeUrlMap_trafficDirector(bsName, hcName, umName string) string { + return fmt.Sprintf(` +resource "google_compute_url_map" "foobar" { + name = "%s" + description = "a description" + default_service = "${google_compute_backend_service.home.self_link}" + + host_rule { + hosts = ["mysite.com"] + path_matcher = "allpaths" + } + + path_matcher { + name = "allpaths" + default_service = "${google_compute_backend_service.home.self_link}" + + route_rules { + priority = 1 + header_action { + request_headers_to_remove = ["RemoveMe2"] + request_headers_to_add { + header_name = "AddSomethingElse" + header_value = "MyOtherValue" + replace = true + } + response_headers_to_remove = ["RemoveMe3"] + response_headers_to_add { + header_name = "AddMe" + header_value = "MyValue" + } + } + match_rules { + full_path_match = "a full path" + header_matches { + header_name = "someheader" + exact_match = "match this exactly" + invert_match = true + } + ignore_case = true + metadata_filters { + filter_match_criteria = "MATCH_ANY" + filter_labels { + name = "PLANET" + value = "MARS" + } + } + query_parameter_matches { + name = "a query parameter" + present_match = true + } + } + url_redirect { + host_redirect = "A host" + https_redirect = false + path_redirect = "some/path" + redirect_response_code = "TEMPORARY_REDIRECT" + strip_query = true + } + } + } + + test { + service = "${google_compute_backend_service.home.self_link}" + host = "hi.com" + path = "/home" + } +} + +resource "google_compute_backend_service" "home" { + name = "%s" + port_name = "http" + protocol = "HTTP" + timeout_sec = 10 + + health_checks = ["${google_compute_health_check.default.self_link}"] + load_balancing_scheme = "INTERNAL_SELF_MANAGED" +} + +resource "google_compute_backend_service" "home2" { + name = "%s-2" + port_name = "http" + protocol = "HTTP" + timeout_sec = 10 + + health_checks = ["${google_compute_health_check.default.self_link}"] + load_balancing_scheme = "INTERNAL_SELF_MANAGED" +} + +resource "google_compute_health_check" "default" { + name = "%s" + http_health_check { + port = 80 + } +} + +`, umName, bsName, bsName, hcName) +} + +func testAccComputeUrlMap_trafficDirectorUpdate(bsName, hcName, umName string) string { + return fmt.Sprintf(` +resource "google_compute_url_map" "foobar" { + name = "%s" + description = "a description" + default_service = "${google_compute_backend_service.home2.self_link}" + + host_rule { + hosts = ["mysite.com"] + path_matcher = "allpaths2" + } + + path_matcher { + name = "allpaths2" + default_service = "${google_compute_backend_service.home2.self_link}" + + route_rules { + priority = 2 + header_action { + request_headers_to_remove = ["RemoveMe2", "AndMe"] + request_headers_to_add { + header_name = "AddSomethingElseUpdated" + header_value = "MyOtherValueUpdated" + replace = false + } + response_headers_to_remove = ["RemoveMe3", "AndMe4"] + response_headers_to_add { + header_name = "AddMeUpdated" + header_value = "MyValueUpdated" + } + } + match_rules { + full_path_match = "a full path to match" + header_matches { + header_name = "someheaderfoo" + exact_match = "match this exactly again" + invert_match = false + } + ignore_case = false + metadata_filters { + filter_match_criteria = "MATCH_ALL" + filter_labels { + name = "PLANET" + value = "EARTH" + } + } + } + url_redirect { + host_redirect = "A host again" + https_redirect = true + path_redirect = "some/path/twice" + redirect_response_code = "TEMPORARY_REDIRECT" + strip_query = false + } + } + } + + test { + service = "${google_compute_backend_service.home.self_link}" + host = "hi.com" + path = "/home" + } +} + +resource "google_compute_backend_service" "home" { + name = "%s" + port_name = "http" + protocol = "HTTP" + timeout_sec = 10 + + health_checks = ["${google_compute_health_check.default.self_link}"] + load_balancing_scheme = "INTERNAL_SELF_MANAGED" +} + +resource "google_compute_backend_service" "home2" { + name = "%s-2" + port_name = "http" + protocol = "HTTP" + timeout_sec = 10 + + health_checks = ["${google_compute_health_check.default.self_link}"] + load_balancing_scheme = "INTERNAL_SELF_MANAGED" +} + +resource "google_compute_health_check" "default" { + name = "%s" + http_health_check { + port = 80 + } +} +`, umName, bsName, bsName, hcName) +} +<% end -%>