Skip to content

Commit a9cabe8

Browse files
authored
google_app_engine_service_split_traffic resource (#2269)
* Appengine Service resource * Added custom_create in custom_code. * Added appengine service resource * Updates based on review * Updates based on review * update based on review * Updates * Update * Update * Updated the example * Updated the example and website link * Skip Delete on test and noop * Rebased and merged the appengine terraform.yaml * Updates * Fixes * updated the example and excluded split from reading * updated the example * Reverted custom_create related code * Reverted resource.erb * updates * removed the error check * Updates * Fixes * Fixed the import in test script * Updates as per review * chanded the operation to OpAsync * Updated the Objects from Async to OpAsync * Fixed the example primary resource name * Testing by removing id_format and import_format * reverted import and id format and also the example * Fixed the id_format * Updates based on review * Typo fix * Changed url_param_only to api_name * Updated the resource.erb from upstream/master
1 parent da6931d commit a9cabe8

File tree

8 files changed

+174
-1
lines changed

8 files changed

+174
-1
lines changed

products/appengine/ansible.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ overrides: !ruby/object:Overrides::ResourceOverrides
2929
- priority
3030
Service: !ruby/object:Overrides::Ansible::ResourceOverride
3131
exclude: true
32+
ServiceSplitTraffic: !ruby/object:Overrides::Ansible::ResourceOverride
33+
exclude: true
3234
StandardAppVersion: !ruby/object:Overrides::Ansible::ResourceOverride
3335
exclude: true
3436
DomainMapping: !ruby/object:Overrides::Ansible::ResourceOverride

products/appengine/api.yaml

+65
Original file line numberDiff line numberDiff line change
@@ -515,4 +515,69 @@ objects:
515515
Pathname within the host. Must start with a "/". A single "*" can be included at the end of the path.
516516
The sum of the lengths of the domain and path may not exceed 100 characters.
517517
required: true
518+
- !ruby/object:Api::Resource
519+
name: 'ServiceSplitTraffic'
520+
description: |
521+
Traffic routing configuration for versions within a single service. Traffic splits define how traffic directed to the service is assigned to versions.
522+
base_url: 'apps/{{project}}/services'
523+
self_link: 'apps/{{project}}/services/{{service}}'
524+
create_url: 'apps/{{project}}/services/{{service}}?migrateTraffic={{migrate_traffic}}&updateMask=split'
525+
create_verb: :PATCH
526+
update_url: 'apps/{{project}}/services/{{service}}?migrateTraffic={{migrate_traffic}}'
527+
update_verb: :PATCH
528+
update_mask: true
529+
references: !ruby/object:Api::Resource::ReferenceLinks
530+
api: 'https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services'
531+
async: !ruby/object:Api::OpAsync
532+
operation: !ruby/object:Api::OpAsync::Operation
533+
kind: 'appengine#operation'
534+
path: 'name'
535+
base_url: 'projects/{{project}}/global/operations/{{op_id}}'
536+
wait_ms: 1000
537+
result: !ruby/object:Api::OpAsync::Result
538+
path: 'targetLink'
539+
status: !ruby/object:Api::OpAsync::Status
540+
path: 'status'
541+
complete: 'DONE'
542+
allowed:
543+
- 'PENDING'
544+
- 'RUNNING'
545+
- 'DONE'
546+
error: !ruby/object:Api::OpAsync::Error
547+
path: 'error/errors'
548+
message: 'message'
549+
parameters:
550+
- !ruby/object:Api::Type::Boolean
551+
name: 'migrate_traffic'
552+
url_param_only: true
553+
description: |
554+
If set to true traffic will be migrated to this version.
555+
properties:
556+
- !ruby/object:Api::Type::String
557+
name: 'service'
558+
api_name: 'id'
559+
required: true
560+
description: |
561+
The name of the service these settings apply to.
562+
- !ruby/object:Api::Type::NestedObject
563+
name: 'split'
564+
description: |
565+
Mapping that defines fractional HTTP traffic diversion to different versions within the service.
566+
required: true
567+
properties:
568+
- !ruby/object:Api::Type::Enum
569+
name: 'shardBy'
570+
description: |
571+
Mechanism used to determine which version a request is sent to. The traffic selection algorithm will be stable for either type until allocations are changed.
572+
values:
573+
- :UNSPECIFIED
574+
- :COOKIE
575+
- :IP
576+
- :RANDOM
577+
- !ruby/object:Api::Type::KeyValuePairs
578+
name: 'allocations'
579+
required: true
580+
description: |
581+
Mapping from version IDs within the service to fractional (0.000, 1] allocations of traffic for that version. Each version can be specified only once, but some versions in the service may not have any traffic allocation. Services that have traffic allocated cannot be deleted until either the service is deleted or their traffic allocation is removed. Allocations must sum to 1. Up to two decimal place precision is supported for IP-based splits and up to three decimal places is supported for cookie-based splits.
582+
518583

products/appengine/inspec.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,6 @@ overrides: !ruby/object:Overrides::ResourceOverrides
4343
exclude: true
4444
Service: !ruby/object:Overrides::Inspec::ResourceOverride
4545
exclude: true
46+
ServiceSplitTraffic: !ruby/object:Overrides::Inspec::ResourceOverride
47+
exclude: true
4648

products/appengine/terraform.yaml

+22-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,28 @@ overrides: !ruby/object:Overrides::ResourceOverrides
109109
primary_resource_id: "web_service"
110110
vars:
111111
bucket_name: "appengine-test-bucket"
112-
112+
ServiceSplitTraffic: !ruby/object:Overrides::Terraform::ResourceOverride
113+
id_format: "apps/{{project}}/services/{{service}}"
114+
import_format: ["apps/{{project}}/services/{{service}}"]
115+
mutex: "apps/{{project}}"
116+
custom_code: !ruby/object:Provider::Terraform::CustomCode
117+
custom_delete: templates/terraform/custom_delete/skip_delete.go.erb
118+
test_check_destroy: templates/terraform/custom_check_destroy/skip_delete_during_test.go.erb
119+
properties:
120+
split: !ruby/object:Overrides::Terraform::PropertyOverride
121+
ignore_read: true
122+
split.allocations: !ruby/object:Overrides::Terraform::PropertyOverride
123+
custom_flatten: templates/terraform/custom_flatten/float64_to_string.go.erb
124+
examples:
125+
- !ruby/object:Provider::Terraform::Examples
126+
name: "app_engine_service_split_traffic"
127+
primary_resource_id: 'myapp'
128+
vars:
129+
service_id: "default"
130+
split.allocations.v1: "1"
131+
bucket_name: "appengine-static-content"
132+
test_env_vars:
133+
org_id: :ORG_ID
113134
# This is for copying files over
114135
files: !ruby/object:Provider::Config::Files
115136
# These files have templating (ERB) code that will be run.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
log.Printf("[DEBUG] Ignoring destroy during test")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
func flatten<%= prefix -%><%= titlelize_property(property) -%>(v interface{}, d *schema.ResourceData) interface{} {
2+
transformed := make(map[string]string)
3+
data := v.(map[string]interface{})
4+
for key := range data {
5+
transformed[key] = fmt.Sprintf("%f", data[key])
6+
}
7+
log.Printf("transformed = %#v", transformed)
8+
return transformed
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
resource "google_storage_bucket" "bucket" {
2+
name = "<%= ctx[:vars]['bucket_name'] %>"
3+
}
4+
5+
resource "google_storage_bucket_object" "object" {
6+
name = "hello-world.zip"
7+
bucket = "${google_storage_bucket.bucket.name}"
8+
source = "./test-fixtures/appengine/hello-world.zip"
9+
}
10+
11+
resource "google_app_engine_standard_app_version" "myapp_v1" {
12+
version_id = "v1"
13+
service = "myapp"
14+
runtime = "nodejs10"
15+
noop_on_destroy = true
16+
entrypoint {
17+
shell = "node ./app.js"
18+
}
19+
deployment {
20+
zip {
21+
source_url = "https://storage.googleapis.com/${google_storage_bucket.bucket.name}/hello-world.zip"
22+
}
23+
}
24+
env_variables = {
25+
port = "8080"
26+
}
27+
depends_on = ["google_storage_bucket_object.object"]
28+
29+
}
30+
resource "google_app_engine_standard_app_version" "myapp_v2" {
31+
version_id = "v2"
32+
service = "myapp"
33+
runtime = "nodejs10"
34+
entrypoint {
35+
shell = "node ./app.js"
36+
}
37+
deployment {
38+
zip {
39+
source_url = "https://storage.googleapis.com/${google_storage_bucket.bucket.name}/hello-world.zip"
40+
}
41+
}
42+
env_variables = {
43+
port = "8080"
44+
}
45+
depends_on = ["google_app_engine_standard_app_version.myapp_v1"]
46+
}
47+
48+
resource "google_app_engine_service_split_traffic" "myapp" {
49+
service = "${google_app_engine_standard_app_version.myapp_v2.service}"
50+
migrate_traffic = false
51+
split {
52+
shard_by = "IP"
53+
allocations = {
54+
v1 = 0.75
55+
v2 = 0.25
56+
}
57+
}
58+
depends_on = ["google_app_engine_standard_app_version.myapp_v2"]
59+
}
60+
61+
62+
resource "google_app_engine_service_split_traffic" "myapp2" {
63+
service = "${google_app_engine_standard_app_version.myapp_v2.service}"
64+
migrate_traffic = false
65+
split {
66+
allocations = {
67+
v1 = 1
68+
}
69+
}
70+
depends_on = ["google_app_engine_service_split_traffic.myapp"]
71+
}

third_party/terraform/website-compiled/google.erb

+2
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,8 @@
257257
</li>
258258
<li<%%= sidebar_current("docs-google-app-engine-application-url-dispatch-rules") %>>
259259
<a href="/docs/providers/google/r/app_engine_application_url_dispatch_rules.html">google_app_engine_application_url_dispatch_rules</a>
260+
<li<%%= sidebar_current("docs-google-app-engine-service-split-traffic") %>>
261+
<a href="/docs/providers/google/r/app_engine_service_split_traffic.html">google_app_engine_standard_app_version</a>
260262
</li>
261263
</ul>
262264
</li>

0 commit comments

Comments
 (0)