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

def licenseOutput = "${buildDir}/output"

docker {
  name "golicenses-${sdkName}"
  dockerfile file('../Dockerfile')
  files '../get-licenses.sh', '../go.mod'
  noCache false
  buildArgs(['sdk_location': "github.com/apache/beam/sdks/v2/${sdkName}/container"])
  // If Docker buildx builder is used, explicitly load the image into the local repository.
  // Set the buildx flag to pick up the load flag.
  buildx true
  load true
}

// The mkdir happens at configuration time to allow dockerRun volume to be declared.
mkdir "${licenseOutput}"

dockerRun {
  // Add a random number to the running container name to avoid collisions.
  name "license-container-${sdkName}-" + (new Random().nextInt())
  image "golicenses-${sdkName}:latest"
  volumes "${licenseOutput}": '/output'
  daemonize false
  clean true
}
tasks.dockerRun.dependsOn 'docker'

task createLicenses {
  outputs.cacheIf { true }
  outputs.file("$buildDir/output/licenses/list.csv")
  // Aggressively cache, to avoid slowness and docker run collisions.
  if (!file("$buildDir/output/licenses/list.csv").exists()) {
    dependsOn 'dockerRun'
  }
}
