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

/** DSL documentation
 The structure of this configuration DSL is pretty self-explanatory. The main
 section is 'components' that contains the description of all things included
 into the stack. The following words are considered terminals and shouldn't be
 modified as it will affect the parsing behavior:
   - bigtop
   - version
   - stack
   - version_base
   - apache
   - pkg
   - tarball, source, destinations
   - url, download_path, site, archive
 Also, the following are base constants and if renamed will affect the some of
 the stack's definitions
   - APACHE_MIRROR
   - APACHE_ARCHIVE

 bigtop { // *the name should be change: the parsing code depends on it*
   version = "STACK-VERSION" // *required*
   stack { // *required* Fundamental properties of the Stack: JDK, SDK, GDK, etc
     'jdk' { version = '1.8'; version_base = version }
     'scala' { version = '2.10.4'; version_base = version }
   }
   apache { // *required* These shoudn't be modified unless ASF Infra demands changes
     APACHE_MIRROR = "https://apache.osuosl.org"
     APACHE_ARCHIVE = "https://archive.apache.org/dist"
   }
   git { // *optional* This is a global setting to access protected git repositories,
         //            can be specified per component as well
     user = "john_doe"
     token = "john's access token"
   }
   components { *required; preserve the name* if empty, nothing will be built
     'label' { // label *SHOULD* be the same as the name; otherwise some tasks will fail
       name    = 'component1' // *required* the name of the component
       // 'pkg' value is optional and will be set to that of 'name' i.e. [pkg := name]
       pkg     = name // *optional* and will be set to the 'name' value
       // 'base' is required; [pkg := base ]; [release := 1 ]
       version { base  = 'x.y.z'; pkg   = base; release = 1 }
       tarball {
         source      = "apache-component1-${version.base}.tar.gz"
         // It is advised to use different destination filenames to avoid
         // clashes when working with git repos and downloading the artifacts
         // from the branches with the same names.
         destination = source
       }
       url { // *optional*
         download_path = "/component1/component1-${version.base}"
         site          = "${apache.APACHE_MIRROR}/${download_path}"
         archive       = "${apache.APACHE_ARCHIVE}/${download_path}"
       }
       git {
         // Setting the info to access a git repository. Ref is any valid git reference.
         // If git repo information is provided, the *url* element above will be ignored.
         repo  = "https://github.com/apache/bigtop.git"
         ref   = "branch-name"
         // *dir* defines the name of the top-level folder inside of the tar-ball archive.
         // if set to null, the directory name will be set to tar-ball.dist without
         // the .tar* suffix
         // This setting is important to allow build to locate unpacked source code
         dir   = "${name}-${version.base}-src"
         // *optional*
         // You can setup repo-specific user credentials overriding any global settings
         user  = "john_doe"
         token = "john's access token"
       }
       packaging = 'rpm' // *optional* If this component can be built only as either
                         // DEB or RPM, specify that packaging format explicitly.
                         // If both formats are supported, omit this option.
       maven_parallel_build = true // *optional* maven_parallel_build indicates whether the component can be built in parallel.
                                   // Components with this flag can have the Maven parallel build parameter -PbuildThreads=2C or -PbuildThreads=2
                                   // passed during compilation to enable parallel building and speed up the process.

     }
   }
 }
 End of DSL Documentation */

bigtop {
/** Base Configuration of the mirror and archives */
  version = "3.4.0-SNAPSHOT"
  base_version = version.takeWhile { it != '-' }
  stack {
    'jdk' { version = "1." + ( System.getenv('BIGTOP_JDK') ?: "8" ); version_base = version }
    'scala' { version = '2.12.13'; version_base = version }
  }
  apache {
    APACHE_MIRROR = "https://apache.osuosl.org"
    APACHE_ARCHIVE = "https://archive.apache.org/dist"
  }
/** End of Base Configuration */

  /** Dependencies section defines the order in which packages should be built.
      The syntax is as follows:
           dependsOn := [list of dependents]
      So, below phoenix ought to be build after the hbase has been built

      To build a component with its dependencies, run build with -Dbuildwithdeps=true
  */
  dependencies = [
    'bigtop-utils':['bigtop-groovy', 'bigtop-jsvc',
                    'flink', 'zookeeper'],
    'bigtop-groovy':['hadoop'],
    'bigtop-jsvc':['hadoop'],
    zookeeper:['hadoop', 'hbase', 'kafka'],
    hadoop:['hbase', 'hive', 'tez',
      'solr', 'spark', 'ranger',
      'phoenix', 'alluxio', 'zeppelin'
    ],
    hbase:['phoenix', 'hive'],
    hive:['zeppelin'],
    spark:['livy', 'zeppelin'],
  ]

  components {
    'zookeeper' {
      name    = 'zookeeper'
      pkg     = name
      rpm_pkg_suffix = "_" + bigtop.base_version.replace(".", "_")
      version {
        base  = '3.7.2'
        pkg   = base
        release = 1
      }
      tarball {
        source      = "apache-zookeeper-${version.base}.tar.gz"
        destination = source
      }
      url {
        download_path = "/zookeeper/zookeeper-${version.base}"
        site          = "${apache.APACHE_MIRROR}/${download_path}"
        archive       = "${apache.APACHE_ARCHIVE}/${download_path}"
      }
      maven_parallel_build = true
    }
    'hadoop' {
      name    = 'hadoop'
      rpm_pkg_suffix = "_" + bigtop.base_version.replace(".", "_")
      relNotes = 'Apache Hadoop'
      version { base = '3.3.6'; pkg = base; release = 1 }
      tarball { destination = "${name}-${version.base}.tar.gz"
                source      = "${name}-${version.base}-src.tar.gz" }
      url     { download_path = "/$name/common/$name-${version.base}"
                site = "${apache.APACHE_MIRROR}/${download_path}"
                archive = "${apache.APACHE_ARCHIVE}/${download_path}" }
      maven_parallel_build = true
    }
    'hbase' {
      name    = 'hbase'
      rpm_pkg_suffix = "_" + bigtop.base_version.replace(".", "_")
      relNotes = 'Apache HBase'
      version { base = '2.4.17'; pkg = base; release = 1 }
      tarball { destination = "${name}-${version.base}.tar.gz"
                source      = "${name}-${version.base}-src.tar.gz" }
      url     { download_path = "/$name/${version.base}/"
                site = "${apache.APACHE_MIRROR}/${download_path}"
                archive = "${apache.APACHE_ARCHIVE}/${download_path}" }
      maven_parallel_build = true
    }

    'hive' {
      name    = 'hive'
      rpm_pkg_suffix = "_" + bigtop.base_version.replace(".", "_")
      relNotes = 'Apache Hive'
      version { base = '3.1.3'; pkg = base; release = 1 }
      tarball { destination = "apache-${name}-${version.base}-src.tar.gz"
                source      = destination }
      url     { download_path = "/$name/$name-${version.base}/"
                site = "${apache.APACHE_MIRROR}/${download_path}"
                archive = "${apache.APACHE_ARCHIVE}/${download_path}" }
      maven_parallel_build = true
    }
    'tez' {
      name    = 'tez'
      rpm_pkg_suffix = "_" + bigtop.base_version.replace(".", "_")
      relNotes = 'Apache TEZ'
      version { base = '0.10.2'; pkg = base; release = 1 }
      tarball { destination = "apache-${name}-${version.base}-src.tar.gz"
                source      = destination }
      url     { download_path = "/$name/${version.base}/"
                site = "${apache.APACHE_MIRROR}/${download_path}"
                archive = "${apache.APACHE_ARCHIVE}/${download_path}" }
      maven_parallel_build = true
    }
    'solr' {
      name    = 'solr'
      rpm_pkg_suffix = "_" + bigtop.base_version.replace(".", "_")
      relNotes = 'Apache Solr'
      version { base = '8.11.2'; pkg = base; release = 2 }
      tarball { destination = "$name-${version.base}-src.tgz"
                source      = destination }
      url     { download_path = "lucene/$name/${version.base}"
                site = "${apache.APACHE_MIRROR}/${download_path}"
                archive = "${apache.APACHE_ARCHIVE}/${download_path}" }
    }
    'spark' {
      name    = 'spark'
      pkg     = 'spark'
      rpm_pkg_suffix = "_" + bigtop.base_version.replace(".", "_")
      relNotes = 'Apache Spark'
      /*
       * Remember to fetch the new LICENSE-binary and licenses-binary files
       * when upgrading spark version.
       * See comments in [bigtop-packages/src/common/spark/install_spark.sh] for details.
       */
      version { base = '3.3.4'; pkg = base; release = 1 }
      tarball { destination = "$name-${version.base}.tar.gz"
                source      = "$name-${version.base}.tgz" }
      url     { download_path = "/$name/$name-${version.base}"
                site = "${apache.APACHE_MIRROR}/${download_path}"
                archive = "${apache.APACHE_ARCHIVE}/${download_path}" }
    }

    'flink' {
      name    = 'flink'
      rpm_pkg_suffix = "_" + bigtop.base_version.replace(".", "_")
      relNotes = 'Apache Flink'
      version { base = '1.16.2'; pkg = base; release = 1 }
      tarball { destination = "$name-${version.base}.tar.gz"
                source      = "$name-${version.base}-src.tgz" }
      url     { download_path = "/$name/$name-${version.base}"
                site = "${apache.APACHE_MIRROR}/${download_path}"
                archive = "${apache.APACHE_ARCHIVE}/${download_path}" }
      maven_parallel_build = true
    }


    'phoenix' {
      name    = 'phoenix'
      relNotes = 'Apache Phoenix: A SQL skin over HBase'
      version { base = "5.1.3"; pkg = base; release = 1 }
      tarball { destination = "$name-${version.base}-src.tar.gz"
                source      = destination }
      url     { download_path = "/$name/$name-${version.base}"
                site = "${apache.APACHE_MIRROR}/${download_path}"
                archive = "${apache.APACHE_ARCHIVE}/${download_path}" }
      maven_parallel_build = true
    }
    'bigtop-groovy' {
      name    = 'bigtop-groovy'
      relNotes = "Groovy: a dynamic language for the Java platform"
      version { base = '2.5.4'; pkg = '2.5.4'; release = 1 }
      tarball { destination = "$name-${version.base}.tar.gz";
                source      = "apache-groovy-binary-${version.base}.zip" }
      url     { download_path = "/groovy/${version.base}/distribution/"
                site = "${apache.APACHE_MIRROR}/${download_path}"
                archive = "${apache.APACHE_ARCHIVE}/${download_path}" }
    }
    'bigtop-utils' {
      name    = "bigtop-utils"
      relNotes = "Service package for Apache Bigtop runtime"
      version { base = bigtop.version; pkg = base-"-SNAPSHOT"; release = 1 }
      tarball { destination = "bigtop-utils-${version.base}.tar.gz" }
    }
    'bigtop-select' {
      name    = "bigtop-select"
      relNotes = "Service package for Apache Bigtop information to use Ambari"
      version { base = bigtop.version; pkg = base-"-SNAPSHOT"; release = 1 }
      tarball { destination = "bigtop-select-${version.base}.tar.gz" }
      packaging = 'rpm'
    }
    'bigtop-jsvc' {
      name    = "bigtop-jsvc"
      relNotes = "Apache Common Daemon (jsvc) service package"
      version { base = '1.2.4'; pkg = base; release = 1 }
      tarball { source      = "commons-daemon-${version.base}-native-src.tar.gz"
                destination = "commons-daemon-${version.base}.tar.gz" }
      url     { download_path = "/commons/daemon/source"
                site = "${apache.APACHE_MIRROR}/${download_path}"
                archive = "${apache.APACHE_ARCHIVE}/${download_path}" }
    }
    'alluxio' {
      name    = "alluxio"
      pkg     = "alluxio"
      rpm_pkg_suffix = "_" + bigtop.base_version.replace(".", "_")
      relNotes = "Alluxio: a memory-centric distributed file system"
      version { base = '2.9.3'; pkg = base; release = 1 }
      tarball { destination = "$name-${version.base}.tar.gz"
                source      = "v${version.base}.tar.gz" }
      url     { site = "https://github.com/Alluxio/alluxio/archive"
                archive = site }
      maven_parallel_build = true
    }
    'kafka' {
      name    = 'kafka'
      rpm_pkg_suffix = "_" + bigtop.base_version.replace(".", "_")
      relNotes = 'Apache Kafka'
      version { base = '2.8.2'; pkg = base; release = 1 }
      tarball { destination = "$name-${version.base}.tar.gz"
                source      = "$name-${version.base}-src.tgz" }
      url     { download_path = "/$name/${version.base}/"
                site = "${apache.APACHE_MIRROR}/${download_path}"
                archive = "${apache.APACHE_ARCHIVE}/${download_path}" }
    }
    'zeppelin' {
      name    = 'zeppelin'
      rpm_pkg_suffix = "_" + bigtop.base_version.replace(".", "_")
      relNotes = 'Apache Zeppelin'
      version { base = '0.11.0'; pkg = base; release = 1 }
      tarball { source      = "$name-${version.base}.tgz"
                destination = "$name-${version.base}.tar.gz" }
      url     { download_path = "/$name/$name-${version.base}/"
                site = "${apache.APACHE_MIRROR}/${download_path}"
                archive = "${apache.APACHE_ARCHIVE}/${download_path}" }
      maven_parallel_build = true
    }
    'gpdb' {
      name    = 'gpdb'
      relNotes = 'GreenPlum'
      version { base = '6.23.4'; pkg = '6.23.4'; release = 1 }
      tarball { destination = "$name-${version.base}.tar.gz"
                source      = "${version.base}.tar.gz" }
      url     { site = "https://github.com/greenplum-db/gpdb/archive/"
                archive = site }
    }
    'livy' {
      name    = 'livy'
      relNotes = 'Apache Livy'
      version { base = '0.8.0'; pkg = base; release = 1 }
      tarball { destination = "${name}-${version.base}.zip"
                source      = "apache-livy-${version.base}-incubating-src.zip" }
      url     { download_path = "incubator/livy/${version.base}-incubating/"
                site = "${apache.APACHE_MIRROR}/${download_path}"
                archive = "${apache.APACHE_ARCHIVE}/${download_path}" }
      maven_parallel_build = true
    }
    'ranger' {
      name    = 'ranger'
      rpm_pkg_suffix = "_" + bigtop.base_version.replace(".", "_")
      relNotes = 'Apache Ranger'
      version { base = '2.4.0'; pkg = base; release = 1 }
      tarball { destination = "release-$name-${version.base}.tar.gz"
                source      = destination }
      url     { site = "https://github.com/apache/ranger/archive/refs/tags"
                archive = site }
      maven_parallel_build = true
    }
  }
}
