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

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')
}

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
}
