@@ -3,10 +3,13 @@ package google
3
3
import (
4
4
"fmt"
5
5
"testing"
6
+ "time"
6
7
7
8
"github.com/hashicorp/terraform/helper/acctest"
8
9
"github.com/hashicorp/terraform/helper/resource"
9
10
"github.com/hashicorp/terraform/terraform"
11
+
12
+ "google.golang.org/api/compute/v1"
10
13
)
11
14
12
15
func TestAccDataflowJobCreate (t * testing.T ) {
@@ -45,6 +48,26 @@ func TestAccDataflowJobRegionCreate(t *testing.T) {
45
48
})
46
49
}
47
50
51
+ func TestAccDataflowJobCreateWithServiceAccount (t * testing.T ) {
52
+ t .Parallel ()
53
+ resource .Test (t , resource.TestCase {
54
+ PreCheck : func () { testAccPreCheck (t ) },
55
+ Providers : testAccProviders ,
56
+ CheckDestroy : testAccCheckDataflowJobDestroy ,
57
+ Steps : []resource.TestStep {
58
+ {
59
+ Config : testAccDataflowJobWithServiceAccount ,
60
+ Check : resource .ComposeTestCheckFunc (
61
+ testAccDataflowJobExists (
62
+ "google_dataflow_job.big_data" ),
63
+ testAccDataflowJobHasServiceAccount (
64
+ "google_dataflow_job.big_data" ),
65
+ ),
66
+ },
67
+ },
68
+ })
69
+ }
70
+
48
71
func testAccCheckDataflowJobDestroy (s * terraform.State ) error {
49
72
for _ , rs := range s .RootModule ().Resources {
50
73
if rs .Type != "google_dataflow_job" {
@@ -105,6 +128,58 @@ func testAccDataflowJobExists(n string) resource.TestCheckFunc {
105
128
}
106
129
}
107
130
131
+ func testAccDataflowJobHasServiceAccount (n string ) resource.TestCheckFunc {
132
+ return func (s * terraform.State ) error {
133
+ rs , ok := s .RootModule ().Resources [n ]
134
+ if ! ok {
135
+ return fmt .Errorf ("Not found: %s" , n )
136
+ }
137
+ if rs .Primary .ID == "" {
138
+ return fmt .Errorf ("No ID is set" )
139
+ }
140
+
141
+ config := testAccProvider .Meta ().(* Config )
142
+
143
+ // Check that the service account was applied to the Dataflow job's
144
+ // generated instance template.
145
+ if serviceAccountEmail , ok := rs .Primary .Attributes ["service_account_email" ]; ok {
146
+ filter := fmt .Sprintf ("properties.labels.dataflow_job_id = %s" , rs .Primary .ID )
147
+ var serviceAccounts []* compute.ServiceAccount
148
+
149
+ // Wait for instance template generation.
150
+ err := resource .Retry (1 * time .Minute , func () * resource.RetryError {
151
+ var err error
152
+ instanceTemplates , err :=
153
+ config .clientCompute .InstanceTemplates .List (config .Project ).Filter (filter ).MaxResults (2 ).Fields ("items/properties/serviceAccounts/email" ).Do ()
154
+ if err != nil {
155
+ return resource .NonRetryableError (err )
156
+ }
157
+ if len (instanceTemplates .Items ) == 0 {
158
+ return resource .RetryableError (fmt .Errorf ("no instance template found for dataflow job" ))
159
+ }
160
+ if len (instanceTemplates .Items ) > 1 {
161
+ return resource .NonRetryableError (fmt .Errorf ("Wrong number of matching instance templates for dataflow job: %s, %d" , rs .Primary .ID , len (instanceTemplates .Items )))
162
+ }
163
+ serviceAccounts = instanceTemplates .Items [0 ].Properties .ServiceAccounts
164
+ return nil
165
+ })
166
+
167
+ if err != nil {
168
+ return fmt .Errorf ("Error getting service account from instance template: %s" , err )
169
+ }
170
+
171
+ if len (serviceAccounts ) > 1 {
172
+ return fmt .Errorf ("Found multiple service accounts for dataflow job: %s, %d" , rs .Primary .ID , len (serviceAccounts ))
173
+ }
174
+ if serviceAccountEmail != serviceAccounts [0 ].Email {
175
+ return fmt .Errorf ("Service account mismatch: %s != %s" , serviceAccountEmail , serviceAccounts [0 ].Email )
176
+ }
177
+ }
178
+
179
+ return nil
180
+ }
181
+ }
182
+
108
183
func testAccDataflowJobRegionExists (n string ) resource.TestCheckFunc {
109
184
return func (s * terraform.State ) error {
110
185
rs , ok := s .RootModule ().Resources [n ]
@@ -171,3 +246,43 @@ resource "google_dataflow_job" "big_data" {
171
246
172
247
on_delete = "cancel"
173
248
}` , acctest .RandString (10 ), acctest .RandString (10 ), getTestProjectFromEnv ())
249
+
250
+ var testAccDataflowJobWithServiceAccount = fmt .Sprintf (`
251
+ resource "google_storage_bucket" "temp" {
252
+ name = "dfjob-test-%s-temp"
253
+
254
+ force_destroy = true
255
+ }
256
+
257
+ resource "google_service_account" "dataflow-sa" {
258
+ account_id = "dataflow-sa"
259
+ display_name = "DataFlow Service Account"
260
+ }
261
+
262
+ resource "google_storage_bucket_iam_member" "dataflow-gcs" {
263
+ bucket = "${google_storage_bucket.temp.name}"
264
+ role = "roles/storage.objectAdmin"
265
+ member = "serviceAccount:${google_service_account.dataflow-sa.email}"
266
+ }
267
+
268
+ resource "google_project_iam_member" "dataflow-worker" {
269
+ role = "roles/dataflow.worker"
270
+ member = "serviceAccount:${google_service_account.dataflow-sa.email}"
271
+ }
272
+
273
+ resource "google_dataflow_job" "big_data" {
274
+ name = "dfjob-test-%s"
275
+
276
+ template_gcs_path = "gs://dataflow-templates/wordcount/template_file"
277
+ temp_gcs_location = "${google_storage_bucket.temp.url}"
278
+
279
+ parameters {
280
+ inputFile = "gs://dataflow-samples/shakespeare/kinglear.txt"
281
+ output = "${google_storage_bucket.temp.url}/output"
282
+ }
283
+ zone = "us-central1-f"
284
+ project = "%s"
285
+ service_account_email = "${google_service_account.dataflow-sa.email}"
286
+
287
+ on_delete = "cancel"
288
+ }` , acctest .RandString (10 ), acctest .RandString (10 ), getTestProjectFromEnv ())
0 commit comments