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

plugins { id 'org.apache.beam.module' }
applyGoNature()
applyDockerNature()

description = "Apache Beam :: SDKs :: Python :: Container"

// Figure out why the golang plugin does not add a build dependency between projects.
// Without the line below, we get spurious errors about not being able to resolve
// "./github.com/apache/beam/sdks/go"
resolveBuildDependencies.dependsOn ":sdks:go:goBuild"

configurations {
  sdkSourceTarball
  sdkHarnessLauncher
}

dependencies {
  golang {
    // TODO(herohde): use "./" prefix to prevent gogradle use base github path, for now.
    // TODO(herohde): get the pkg subdirectory only, if possible. We spend mins pulling cmd/beamctl deps.
    build name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
    test name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
  }
  sdkSourceTarball project(path: ":sdks:python", configuration: "distConfig")
}

task copyDockerfileDependencies(type: Copy, dependsOn: goBuild) {
  from configurations.sdkSourceTarball
  from file("./base_image_requirements.txt")
  into "build/target"
  if(configurations.sdkSourceTarball.isEmpty()) {
    throw new StopExecutionException('sdk source tarball is empty');
  }
}

golang {
  packagePath = 'github.com/apache/beam/sdks/python/boot'
  goBuild {
    // Build for linux and mac.
    targetPlatform = ['linux-amd64', 'darwin-amd64']
    outputLocation = './build/target/launcher/${GOOS}_${GOARCH}/boot'
  }
}

docker {
  name containerImageName(name: "python")
  files "./build"
}

artifacts {
  sdkHarnessLauncher file: file('./build/target/launcher'), builtBy: goBuild
}

// Ensure that making the docker image builds any required artifacts
dockerPrepare.dependsOn goBuild
dockerPrepare.dependsOn copyDockerfileDependencies
