| #!groovy | |
| /* | |
| * Licensed to the Apache Software Foundation (ASF) under one | |
| * or more contributor license agreements. See the NOTICE file | |
| * distributed with this work for additional information | |
| * regarding copyright ownership. The ASF licenses this file | |
| * to you 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. | |
| */ | |
| t = new TestScripts(args) | |
| /* | |
| * Run the Dataflow quickstart from https://beam.apache.org/get-started/quickstart-java/ | |
| */ | |
| t.describe 'Run Apache Beam Java SDK Quickstart - Dataflow' | |
| t.intent 'Gets the WordCount Example Code' | |
| QuickstartArchetype.generate(t) | |
| t.intent 'Runs the WordCount Code with Dataflow runner' | |
| // Remove any count files | |
| t.run """gcloud storage rm gs://${t.gcsBucket()}/count* || echo 'No files'""" | |
| // Run the wordcount example with the Dataflow runner | |
| t.run """mvn compile exec:java -q \ | |
| -Dmaven.wagon.http.retryHandler.class=default \ | |
| -Dmaven.wagon.http.retryHandler.count=5 \ | |
| -Dmaven.wagon.http.pool=false \ | |
| -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 \ | |
| -Dhttp.keepAlive=false \ | |
| -Dexec.mainClass=org.apache.beam.examples.WordCount \ | |
| -Dexec.args="--runner=DataflowRunner \ | |
| --project=${t.gcpProject()} \ | |
| --region=${t.gcpRegion()} \ | |
| --gcpTempLocation=gs://${t.gcsBucket()}/tmp \ | |
| --output=gs://${t.gcsBucket()}/counts \ | |
| --inputFile=gs://apache-beam-samples/shakespeare/*" \ | |
| -Pdataflow-runner""" | |
| int retries = 5 | |
| int waitTime = 15 // seconds | |
| def outputPath = "gs://${t.gcsBucket()}/count" | |
| def outputFound = false | |
| for (int i = 0; i < retries; i++) { | |
| def files = t.run("gcloud storage ls ${outputPath}*") | |
| if (files?.trim()) { | |
| outputFound = true | |
| break | |
| } | |
| t.intent("Output not found yet. Waiting ${waitTime}s...") | |
| Thread.sleep(waitTime * 1000) | |
| } | |
| if (!outputFound) { | |
| throw new RuntimeException("No output files found for WordCount after ${retries * waitTime} seconds.") | |
| } | |
| // Verify wordcount text | |
| String result = t.run """gcloud storage cat ${outputPath}* | grep Montague:""" | |
| t.see "Montague: 47", result | |
| // Remove count files | |
| t.run """gcloud storage rm gs://${t.gcsBucket()}/count*""" | |
| // Clean up | |
| t.done() |