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

buildscript {
  repositories {
    mavenCentral()
  }
}

plugins {
  id "de.undercouch.download" version "3.2.0"
  id "org.nosphere.apache.rat" version "0.2.0"
}

//        Generated by  http://patorjk.com/software/taag/#p=display&f=Bloody&t=Apache%20Bigtop
def final ASCII_bigtop = '''
                                                     :aass..                                    
                                                       =XS22nai,>__. .                            
                                                       =n-- +!!!""^--                             
                                                      .vX>       .                                
                                                     .)e<o;.                                      
                                                   ._v2`-{S> .                                    
                                                 ..<de~..;)Sa,                                    
                                              .._aoX}:===>=-?Xo>, .  .                            
                                        . .__aaoZe!`=><i=s+s;~*XXos,,_ .   .  .                   
                  ...........______=iisaaoXXZY!"~._v(=d=:nc-1s,-~?SX#Xouass,,_____.:..........    
                 =XXoXXXSXXXXXXXXZUZXX21?!"^-.._au*`=u2` ]X>.+*a>,.-"!Y1XSSX##ZZXXXXXXXXXXXoXXc   
                 .{XXXXXX2*?!!"!"^~--- ...__aa2!^- =dX( .+XXc. ~!1nas,,.---~~^""!"!!!?YSXXXXX2+   
                  -"YSXXXo=.   ._=sssaaav1!!~-  ._aXXe`   )SXo>.  -~"?Yoouass_s,,    _vXXXX2}~    
                      -{XXZoai%%*XXSSSX>..    .<uXXX2~  .  {XXXXs,. .  .=dXXXZX2lii%uXXXXe-       
                      .<XXXXX%-  -<XXXXX1|==%vdXXXXXo;:. ._vXXXXXXos_=i|*XXXXX>   -<XXXXX`        
                       =SXXXZc   ..nXXX2> ---=2XXX2^-"|||}"--~{ZXXX1-- .:XXXXo;  . )XXXX2`        
                     . =XXXXZc     nXXXX>    =XXXXe..__s=>_...)XXXX1 . .:SXXXo;   .)XXXX2..       
                       <SXXXXc .  .nXXXS>    =XXXXosummmmBmma,)ZXXX1    :XXXX2;    )XXXXX.        
                      .<XXXXX(    :nXXXS;    <XXXXXm#mmmWmmmmmoZXXX1   ..3XXXo;. . )XXXXX;        
                     . nXXXXX;.   :XXXXX;   .=XXXXXmmmBmmmWmB#XXXXX1  . .nXXXX>    :XXXXXc .      
                    . =oZXXXe;   .<XXXX2` .  )XXXXZmBmBmWmmmW#2XXXX1 .  .vXXXXc     vXXXXo;       
                      +Y3S2Xz__...vXXXXe .  .)ZXXXZmmWmBmmBBm#XXXXXo..   {XXXXz:.___vSS2Y1=       
                    .     ---+"""*!!*Y1s|=_==uXSSSXZUXUXUXUXUXS2XX2n|_=||%Y*??!"""^~---           
                                         .--- - ---------------- - - -.       
      .o.                                  oooo                  oooooooooo.  o8o               .                     
     .888.                                 `888                  `888'   `Y8b `"'             .o8                     
    .8"888.    oo.ooooo.  .oooo.   .ooooo.  888 .oo.   .ooooo.    888     888oooo  .oooooooo.o888oo .ooooo. oo.ooooo. 
   .8' `888.    888' `88b`P  )88b d88' `"Y8 888P"Y88b d88' `88b   888oooo888'`888 888' `88b   888  d88' `88b 888' `88b
  .88ooo8888.   888   888 .oP"888 888       888   888 888ooo888   888    `88b 888 888   888   888  888   888 888   888
 .8'     `888.  888   888d8(  888 888   .o8 888   888 888    .o   888    .88P 888 `88bod8P'   888 .888   888 888   888
o88o     o8888o 888bod8P'`Y888""8o`Y8bod8P'o888o o888o`Y8bod8P'  o888bood8P' o888o`8oooooo.   "888"`Y8bod8P' 888bod8P'
                888                                                               d"     YD                  888      
               o888o                                                              "Y88888P'                 o888o     
'''

def final langLevel = "1.8"

rat {
  excludes = [
      ".git/**",
      ".idea/**",
       "**/.gitignore",
       /* Test data with rigid structure and/or binary */
       "bigtop-tests/test-artifacts/**/resources/**",
       "bigtop-tests/smoke-tests/alluxio/datafile",
       "bigtop-tests/smoke-tests/flink/test.data",
       "bigtop-tests/smoke-tests/hive/passwd.ql",
       "bigtop-tests/smoke-tests/phoenix/*.csv",
       "bigtop-tests/smoke-tests/phoenix/*.sql",
       "bigtop-tests/smoke-tests/logstash/resources/**",
       "**/target/**",
       "**/build/**",
       "**/.gradle/**",
       "**/*.iml",
       ".gradle",
       "output/**",
       "MAINTAINERS.txt",
       "buildSrc/build/**",
       "bigtop-data-generators/**/input_data/**",
       "docker/**/*.yaml",
       "bigtop-deploy/puppet/**/*.yaml",
       "bigtop-deploy/puppet/modules/hadoop/files/*/id_hdfsuser*",
       "bigtop-deploy/puppet/modules/bigtop-util/Gemfile.lock",
       "bigtop-deploy/puppet/modules/kibana/templates/*",
       "bigtop-deploy/puppet/modules/zeppelin/templates/interpreter.json",
       /* Debian package files that have a rigid structure
          (* matches package name) */
       "bigtop-packages/src/deb/*/*.dirs",
       "bigtop-packages/src/deb/*/dirs",
       "bigtop-packages/src/deb/*/*.install",
       "bigtop-packages/src/deb/*/*.include",
       "bigtop-packages/src/deb/**/include-binaries",
       "bigtop-packages/src/deb/**/format",
       "bigtop-packages/src/deb/*/*.manpages",
       "bigtop-packages/src/deb/*/*.docs",
       "bigtop-packages/src/deb/*/docs",
       "bigtop-packages/src/deb/*/compat",
       "bigtop-packages/src/deb/*/source/format",
       "bigtop-packages/src/deb/*/*.lintian-overrides",
       "bigtop-packages/src/deb/*/shlibs.local",
       "bigtop-packages/src/**/*.diff",
       "bigtop-packages/src/common/*/*.json",
       "bigtop-packages/src/common/**/*.default",
       "bigtop-packages/src/common/bigtop-ambari-mpack/bgtp-ambari-mpack/src/main/resources/**",
       "bigtop-repos/apt/distributions",
       /* Juju charm files with rigid structure */
       "bigtop-packages/src/charm/**/wheelhouse.txt",
       "bigtop-packages/src/charm/**/*.json",
       "bigtop-packages/src/charm/**/*.svg",
       "bigtop-packages/src/charm/**/*.yaml",
       "bigtop-packages/src/charm/**/resources/**/*.txt",
       "bigtop-packages/src/common/spark/licenses-binary/*",
       "bigtop-deploy/juju/**/*.yaml",
       "bigtop-tests/cloud-weather-report/**/*.yaml",
       /* Misc individual files */
       "src/site/resources/bigtop.rdf",
       "src/site/resources/images/bigtop-logo.ai",
       /* File with FreeBSD documentation license */
       "src/site/resources/css/freebsd_docbook.css",
       "test/MANIFEST.txt",
       "bigtop-deploy/puppet/modules/hadoop/templates/taskcontroller.cfg",
       "bigtop-deploy/puppet/modules/hadoop/templates/container-executor.cfg",
       "bigtop-deploy/puppet/README.md",
       "bigtop-deploy/puppet/config/site.csv.example",
       "dl/**",
       "bigtop-deploy/puppet/modules/gpdb/templates/**",
       "provisioner/docker/config/hiera.yaml",
       "provisioner/docker/config/hieradata/PLACEHOLDER",
       "provisioner/docker/config/hosts",
       "bigtop_toolchain/files/*.patch",
       "bigtop-bigpetstore/bigpetstore-transaction-queue/.dockerignore",
  ]
}


allprojects {
  apply plugin: 'java'
  apply plugin: 'maven'

  group = 'org.apache.bigtop'
  version = '1.6.0-SNAPSHOT'

  description = """Bigtop"""

  sourceCompatibility = langLevel
  targetCompatibility = langLevel

  repositories {
    mavenCentral()
  }
}

subprojects {
  apply plugin: 'groovy'
}

project(':itest-common') {
  description = """iTest: system and integration testing in the cloud"""

  dependencies {
    compile group: 'org.codehaus.groovy', name: 'groovy-all', version:'2.5.4'
    compile group: 'junit', name: 'junit', version:'4.11'
    compile group: 'commons-logging', name: 'commons-logging', version:'1.1'
    compile group: 'org.apache.ant', name: 'ant', version:'1.8.2'
    compile group: 'org.apache.ant', name: 'ant-junit', version:'1.8.2'
  }

  task packageITest(type: Jar) {
    from sourceSets.main.output
    //classifier = 'tests'
  }

  artifacts.archives packageITest

  test.doFirst {
    if (System.getenv('JAVA_HOME') == null)
      throw new GradleException("JAVA_HOME is required to test ${project.name}")
  }
  test {
    exclude '**/Dummy*'
  }
}

/**
 * checkSmokeTestProjects() configures smoke-tests:<component>:test task only
 * in if the project has smoke.tests properties set.
 * This is done to avoid running cluster smoke tests during the normal life-cycle
 * of the project development
 */
def checkClusterTestProjects = { property ->
  def suiteName = property.replaceAll('.', '-')
  FileTree fTree = fileTree(dir: "bigtop-tests/$suiteName", include: '*/build.gradle')
  fTree.each() { smokeProject ->
    def parent = smokeProject.getParentFile().name
    project (":bigtop-tests:$suiteName:$parent") {
      test {
        onlyIf {project.hasProperty(suiteName)}
      }
    }
  }
}

def TESTARTIFACTS_GROUP = 'test artifacts'
def DEVENV_GROUP = 'development tools'
def DEPLOY_GROUP = 'deployment'
def DOCKERBUILD_GROUP = 'docker build'

// All packaging logic is separated into its own build module
apply from: 'packages.gradle'

// Wrapping all release logic to simplify the release process
apply from: 'release.gradle'

task toolchain(type:Exec,
    description: 'Setup dev. env via toolchain; Requires: Puppet, sudo',
    group: DEVENV_GROUP) {
  def command = ['sudo', 'puppet', 'apply', '-d']
  def version = "sudo puppet --version".execute().text
  if ('3.7' <= version && version < '4') {
    command.addAll(['--parser', 'future'])
  }
  command.addAll(["--modulepath=${projectDir.absolutePath}:/etc/puppet/modules:/usr/share/puppet/modules:/etc/puppetlabs/code/modules",
    '-e', 'include bigtop_toolchain::installer'])
  workingDir '.'
  commandLine command
}
task "toolchain-puppetmodules"(type:Exec,
    description: 'Setup puppet modules via toolchain; Requires: Puppet, sudo',
    group: DEVENV_GROUP) {
  def command = [
      'sudo', 'puppet', 'apply', '-d',
      "--modulepath=${projectDir.absolutePath}", '-e',
      'include bigtop_toolchain::puppet_modules'
  ]
  workingDir '.'
  commandLine command
}
task "toolchain-devtools"(type:Exec,
    description: 'Setup additional dev. tools like Groovy SDK via toolchain; Requires: Puppet, sudo',
    group: DEVENV_GROUP) {
  def command = [
      'sudo', 'puppet', 'apply', '-d',
      "--modulepath=${projectDir.absolutePath}", '-e',
      'include bigtop_toolchain::development_tools'
  ]
  workingDir '.'
  commandLine command
}

task "docker-provisioner"(type:Exec,
    description: '''
Provision a Bigtop stack cluster on Docker container(s). Default to CentOS and 1 node.
Properties:
  -Pconfig=[CONFIG_FILE] (located under provisioner/docker/)
  -Penable_local_repo
  -Pimage=[DOCKER_IMAGE] (overwrites -POS and -Pprefix)
  -Pmemory=[4g|8g|...]
  -Pnum_instances=[NUM_INSTANCES]
  -Pnexus=[NEXUS_URL] (NEXUS_URL is optional)
  -POS=[centos-7|fedora-26|debian-9|ubuntu-16.04|opensuse-42.3]
  -Pprefix=[trunk|1.2.1|1.2.0|1.1.0|...]
  -Prepository=[REPO_URL]
  -Prun_smoke_tests (run test components defined in config file)
  -Psmoke_tests=[COMPONENTS]
  -Pstack=[COMPONENTS]

For detailed explaination, please refer to the helper message:
  $ provisioner/docker/docker-hadoop.sh --help

Examples:
Create a 3 node cluster:
  $ ./gradlew -Pnum_instances=3 docker-provisioner
Run smoke tests on 3 node cluster:
  $ ./gradlew -Pnum_instances=3 -Prun_smoke_tests docker-provisioner
Specify custom configuration file:
  $ ./gradlew -Pconfig=config_debian-9.yaml docker-provisioner
''',
    group: DEPLOY_GROUP) {
  def _config = project.hasProperty("config") ? config : "config.yaml"
  def _num_instances = project.hasProperty("num_instances") ? num_instances : 1
  def _OS = project.hasProperty("OS") ? OS : 'centos-7'
  def _prefix = project.hasProperty("prefix") ? prefix : 'trunk'
  def command = [
      './docker-hadoop.sh',
      '-C', _config,
      '--create', _num_instances,
  ]
  if ( project.hasProperty("stack") ) {
    command.add('--stack')
    command.add("${stack}")
  }
  if ( project.hasProperty("run_smoke_tests") ) {
    command.add("--smoke-tests")
  }
  if ( project.hasProperty("smoke_tests") ) {
    command.add('--smoke-tests')
    command.add("${smoke_tests}")
  }
  if ( project.hasProperty("nexus") ) {
    command.add('--nexus')
    command.add("${nexus}")
  }
  if ( project.hasProperty("enable_local_repo") ) {
    command.add('--enable-local-repo')
  }
  if (project.hasProperty("OS") || project.hasProperty("prefix")) {
    command.add('--image')
    command.add("bigtop/puppet:${_prefix}-${_OS}")
  }
  if (project.hasProperty("image")) {
    command.add('--image')
    command.add("${image}")
  }
  if (project.hasProperty("repository")) {
    command.add('--repo')
    command.add("${repository}")
  }
  if (project.hasProperty("memory")) {
    command.add('--memory')
    command.add("${memory}")
  }
  workingDir 'provisioner/docker'
  commandLine command
}
task "docker-provisioner-ssh"(type:Exec,
    description: 'Show command to get in to the provisioned container',
    group: DEPLOY_GROUP) {
  workingDir 'provisioner/docker'
  def message = "To get in to the container, do: \n\ndocker exec -ti <CONTAIER_NAME> bash \n\nYou can get container name by ./gradlew docker-provisioner-status"
  def command = [
      '/bin/echo',
      message
  ]
  commandLine command
}
task "docker-provisioner-status"(type:Exec,
    description: 'Show status of Bigtop Docker cluster',
    group: DEPLOY_GROUP) {
  def command = [
      './docker-hadoop.sh',
      '--list',
  ]
  workingDir 'provisioner/docker'
  commandLine command
}
task "docker-provisioner-destroy"(type:Exec,
    description: 'Destroy provisioned Bigtop Docker cluster',
    group: DEPLOY_GROUP) {
  def command = [
      './docker-hadoop.sh',
      '--destroy'
  ]
  workingDir 'provisioner/docker'
  commandLine command
}

task installTopLevel(type:Exec) {
  workingDir "."
  commandLine 'mvn clean install -f pom.xml'.split(" ")
}

task installiTest(dependsOn: installTopLevel, type:Exec) {
  workingDir "."
  commandLine 'mvn clean install -f bigtop-test-framework/pom.xml -DskipTests'.split(" ")
}
task installTestArtifacts(dependsOn: installiTest, type:Exec) {
  workingDir "."
  commandLine 'mvn clean install -f bigtop-tests/test-artifacts/pom.xml'.split(" ")
}
task installConf(type:Exec) {
  workingDir "."
  commandLine 'mvn clean install -f bigtop-tests/test-execution/conf/pom.xml'.split(" ")
}
task installCommon(type:Exec) {
  workingDir "."
  commandLine 'mvn clean install -f bigtop-tests/test-execution/common/pom.xml'.split(" ")
}
task installAllLocalArtifacts (
    description: "Prepare and locally install all test artifacts",
    group: TESTARTIFACTS_GROUP) {
}

/**
 * Allows user to specify which artifacts to install by dynamically generating tasks.
 */
def artifactToInstall = {
  def final BASE_DIR = projectDir.absolutePath
  def final TEST_DIR = "$BASE_DIR/bigtop-tests/test-artifacts"

  def project = new XmlSlurper().parse("$TEST_DIR/pom.xml")
  project.modules.module.each { artifact ->
    task "install-${artifact}" (description: "Installs ${artifact} artifact with Maven",
        group: TESTARTIFACTS_GROUP,
        dependsOn: installiTest
    ) doLast {
      def final PATH = "${TEST_DIR}/$artifact/pom.xml"
      def final WRAPPER = "mvn clean install -f " + PATH
      exec {
        workingDir '.'
        commandLine WRAPPER.split(" ")
      }
    }
  }
}


def _NEXUS_URL = project.hasProperty("NEXUS_URL") ? NEXUS_URL : "http://localhost:8081/nexus"

def generate_nexus_tasks = { name, url, snapshot ->
  task "configure-nexus-${name}"(type: Exec) {
    def req = [ data : [ id: name, name: name, repoType: "proxy", repoPolicy : snapshot, browseable: true, "indexable": true, "notFoundCacheTTL": 1440,
			  "artifactMaxAge": 1440, "metadataMaxAge": 1440, "itemMaxAge": 1440, "provider": "maven2",
			  "providerRole": "org.sonatype.nexus.proxy.repository.Repository", "downloadRemoteIndexes": true,
			  "autoBlockActive": true, "fileTypeValidation": true, "exposed": true, "checksumPolicy": "WARN",
			  "remoteStorage": ["remoteStorageUrl": url, "authentication": null,
					    "connectionSettings": null]]]
    def root = new groovy.json.JsonBuilder(req)
    def p = root.toString()
    def _NEXUS_USERPASS = project.hasProperty("NEXUS_USERPASS") ? NEXUS_USERPASS : "admin:admin123"

    File.createTempFile("temp",".tmp").with {
      deleteOnExit()

      write root.toString()

      workingDir '.'
      commandLine  "curl", "-o", "/dev/null", "-s", "-w", "%{http_code}", "-X", "POST", "-d", "@$absolutePath",
        "--header", "Content-Type: application/json", "-u", "$_NEXUS_USERPASS", "$_NEXUS_URL/service/local/repositories"
      standardOutput = new ByteArrayOutputStream()

      doLast {
        def httpCode = standardOutput.toString()
        switch (httpCode) {
          case "200":
            println "Nexus proxy ${name} successfully configured"
            break
          case "400":
            println "Skipped because Nexus proxy ${name} already configured"
            break
          default:
            throw new GradleException("Failed to configure Nexus proxy ${name} with http code ${httpCode} returned. " +
             "Run with --info option to see the executed command")
            break
        }
      }
    }
  }
}

def repos = [ [ "name": "conjars", "url" : "http://conjars.org", 'snapshot':'RELEASE'],
          [ "name": "repository.jboss.org", "url": "http://repository.jboss.org/nexus/content/groups/public/", 'snapshot': 'RELEASE'],
          [ "name": "apache.snapshots.https", "url": "https://repository.apache.org/content/repositories/snapshots", "snapshot": 'SNAPSHOT'],
          [ "name": "apache.snapshots", "url": "https://repository.apache.org/content/repositories/snapshots", "snapshot": 'SNAPSHOT'],
          [ "name": "maven2-repository.atlassian", "url": "https://maven.atlassian.com/repository/public", "snapshot": 'RELEASE']]

repos.each { r->
  generate_nexus_tasks( r.name, r.url, r.snapshot)
}

task "configure-nexus"(dependsOn: tasks.findAll { alltask -> alltask.name.startsWith("configure-nexus-")}*.name,
      description: 'configure build to use a sonatype nexus server.\n' +
        '  Use -PNEXUS_URL=http://server:8081 to overwrite default server http://localhost:8081/nexus\n' +
        '  Use -PNEXUS_USERPASS=user:passwd to overwrite default username passwd admin:admin123') doLast {
   def m2Dir = System.getProperty("user.home") + "/.m2"
   mkdir(m2Dir)
   def m2Writer = new File(m2Dir + "/settings.xml")
   def writeMirrorLine = { name ->
     m2Writer.append("<mirror><name>$name</name><url>$_NEXUS_URL/content/repositories/$name/</url><mirrorOf>$name</mirrorOf></mirror>")
   }
   m2Writer.text = "<settings><mirrors>"
   writeMirrorLine( "central")
   repos.each{ r->
     writeMirrorLine( r.name)
   }
   m2Writer.append("</mirrors></settings>")

    def gradleDir = System.getProperty("user.home") + "/.gradle/init.d"
    mkdir(gradleDir)
    def gradleWriter = new File(gradleDir + "/bigtop_nexus.gradle")
    gradleWriter.text = """
allprojects {
    repositories {
        maven {
            url "$_NEXUS_URL/content/repositories/central"
        }
    }
}
    """
}

task "bigtop-puppet"(type:Exec,
    description: '''
Build bigtop/puppet images
Usage:
  $ ./gradlew -POS=[centos-7|fedora-26|debian-9|ubuntu-16.04|opensuse-42.3] -Pprefix=[trunk|1.2.1|1.2.0|1.1.0|...] bigtop-puppet
Example:
  $ ./gradlew -POS=debian-9 -Pprefix=1.0.0 bigtop-puppet
  The built image name: bigtop/puppet:1.0.0-debian-9
      ''',
    group: DOCKERBUILD_GROUP) {
  def _prefix = project.hasProperty("prefix") ? prefix : "trunk"
  def _OS = project.hasProperty("OS") ? OS : "centos-7"
  def command = [
      './build.sh', _prefix + '-' + _OS,
  ]
  workingDir './docker/bigtop-puppet'
  commandLine command
}

task "bigtop-slaves"(type:Exec,
    description: '''
Build bigtop/slaves images
Usage:
  $ ./gradlew -POS=[centos-7|fedora-26|debian-9|ubuntu-16.04|opensuse-42.3] -Pprefix=[trunk|1.2.1|1.2.0|1.1.0|...] bigtop-slaves
Example:
  $ ./gradlew -POS=debian-9 -Pprefix=1.0.0 bigtop-slaves
  The built image name: bigtop/slaves:1.0.0-debian-9
      ''',
    group: DOCKERBUILD_GROUP) {
  def _prefix = project.hasProperty("prefix") ? prefix : "trunk"
  def _OS = project.hasProperty("OS") ? OS : "centos-7"
  def command = [
      './build.sh', _prefix + '-' + _OS,
  ]
  workingDir './docker/bigtop-slaves'
  commandLine command
}

project.afterEvaluate {
  checkClusterTestProjects("smoke.tests")
  artifactToInstall(dependsOn: [installTopLevel, installCommon, installConf, installiTest])
}

installAllLocalArtifacts.dependsOn installTopLevel, installCommon, installConf, installiTest, installTestArtifacts

help.doFirst {
  println ASCII_bigtop
}
