/*
 * 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.
 */

/**
 * Build a Docker image to bootstrap FlinkJobServerDriver which requires a Java environment.
 * Alternatively, it can also be bootstrapped through :beam-runners-flink_2.11-job-server:runShadow
 * or by directly running the generated JAR file.
 */

apply plugin: org.apache.beam.gradle.BeamModulePlugin
applyDockerNature()

description = "Apache Beam :: Runners :: Flink :: Job Server :: Container"

configurations {
  dockerDependency
}

dependencies {
  dockerDependency project(path: ":beam-runners-flink_2.11-job-server", configuration: "shadow")
}

task copyDockerfileDependencies(type: Copy) {
  // Required Jars
  from configurations.dockerDependency
  rename 'beam-runners-flink_2.11-job-server.*.jar', 'beam-runners-flink-job-server.jar'
  into "build/target"
  // Entry script
  from file("./flink-job-server.sh")
  into "build/target"
}

docker {
  name containerImageName(name: "flink-job-server")
  files "./build/"
}

// Ensure that we build the required resources and copy and file dependencies from related projects
dockerPrepare.dependsOn copyDockerfileDependencies
