/*
 * 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 'java' }

version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories { mavenCentral() }

dependencies {
  implementation(group: 'org.json', name: 'json', version: project.'JSON.version')
  implementation 'software.amazon.awssdk:ec2'
  implementation(group: 'com.hierynomus', name: 'sshj', version: project.'sshj.version')
  runtime(group: 'org.slf4j', name: 'slf4j-simple', version: project.'slf4j-simple.version')
}

apply plugin: "io.spring.dependency-management"

dependencyManagement {
  imports { mavenBom 'software.amazon.awssdk:bom:' + project.'software-amazon-awssdk.version' }
}

compileJava {
  options.compilerArgs << '-Xlint:unchecked' << "-Werror"
  options.deprecation = true
}

task(launchCluster, dependsOn: 'classes', type: JavaExec) {
  main = 'org.apache.geode.infrastructure.aws.LaunchCluster'
  workingDir = rootDir
  classpath = sourceSets.main.runtimeClasspath

  systemProperty 'TEST_CI', project.findProperty('ci')
  systemProperty 'PURPOSE', project.findProperty('purpose')
  systemProperty 'INSTANCE_TYPE', project.findProperty('instanceType')
  systemProperty 'TENANCY', project.findProperty('tenancy')
  systemProperty 'AVAILABILITY_ZONE', project.findProperty('availabilityZone')
}

task(destroyCluster, dependsOn: 'classes', type: JavaExec) {
  main = 'org.apache.geode.infrastructure.aws.DestroyCluster'
  workingDir = rootDir
  classpath = sourceSets.main.runtimeClasspath

  systemProperty 'TEST_CI', project.findProperty('ci')
}

task(expireClusters, dependsOn: 'classes', type: JavaExec) {
  main = 'org.apache.geode.infrastructure.aws.ExpireClusters'
  workingDir = rootDir
  classpath = sourceSets.main.runtimeClasspath
}
