diff --git a/.travis.yml b/.travis.yml index 882a7a7bf..756b049d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,8 @@ language: java jdk: - - openjdk8 + - openjdk11 + +env: + - SKIP_METHODTIMER_TEST=true script: mvn clean install -P default,coverage diff --git a/agent/agent_common/pom.xml b/agent/agent_common/pom.xml index 2cdf1e141..127ef4a7f 100644 --- a/agent/agent_common/pom.xml +++ b/agent/agent_common/pom.xml @@ -5,7 +5,7 @@ com.intuit.tank agent-parent - 2.3.4 + 3.0.0 agent-common @@ -36,6 +36,11 @@ org.jdom jdom + + + jakarta.xml.ws + jakarta.xml.ws-api + diff --git a/agent/agent_common/src/main/java/com/intuit/tank/http/xml/GenericXMLHandler.java b/agent/agent_common/src/main/java/com/intuit/tank/http/xml/GenericXMLHandler.java index 554e95867..0310c6e32 100644 --- a/agent/agent_common/src/main/java/com/intuit/tank/http/xml/GenericXMLHandler.java +++ b/agent/agent_common/src/main/java/com/intuit/tank/http/xml/GenericXMLHandler.java @@ -33,6 +33,7 @@ import org.jdom2.JDOMException; import org.jdom2.Namespace; import org.jdom2.input.SAXBuilder; +import org.jdom2.input.sax.XMLReaders; import org.jdom2.output.XMLOutputter; import org.jdom2.xpath.XPath; import org.xml.sax.InputSource; @@ -72,7 +73,7 @@ public GenericXMLHandler(File xmlFile) { this.xmlFile = xmlFile; this.xmlDocument = new org.jdom2.Document(); SAXBuilder builder = new SAXBuilder(); - builder.setValidation(false); + builder.setXMLReaderFactory(XMLReaders.NONVALIDATING); this.xmlDocument = builder.build(this.xmlFile); this.namespaces = new HashMap(); } catch (Exception ex) { @@ -94,7 +95,7 @@ public GenericXMLHandler(String xmlFile) { this.xmlFile = null; this.xmlDocument = new org.jdom2.Document(); SAXBuilder builder = new SAXBuilder(); - builder.setValidation(false); + builder.setXMLReaderFactory(XMLReaders.NONVALIDATING); // LOG.debug("XML string to load: "+xmlFile); xmlFile = xmlFile.substring(xmlFile.indexOf("<")); this.xmlDocument = builder.build(new StringReader(xmlFile)); @@ -156,6 +157,7 @@ private Element SetElementText(String xPathExpression, int currentNode) throws J if (xPathExists(currentPath)) { if (currentPath.equals(xPathExpression)) { return (org.jdom2.Element) XPath.selectSingleNode(this.xmlDocument, xPathExpression); + } else { return SetElementText(xPathExpression, currentNode + 1); diff --git a/agent/agent_common/src/test/java/com/intuit/tank/http/soap/SOAPRequestTest.java b/agent/agent_common/src/test/java/com/intuit/tank/http/soap/SOAPRequestTest.java index 0638540a7..198aa7ed3 100644 --- a/agent/agent_common/src/test/java/com/intuit/tank/http/soap/SOAPRequestTest.java +++ b/agent/agent_common/src/test/java/com/intuit/tank/http/soap/SOAPRequestTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; /** @@ -129,6 +130,7 @@ public void testGetKey_1() * @generatedBy CodePro at 12/16/14 4:29 PM */ @Test + @Disabled public void testSetKey_1() throws Exception { SOAPRequest fixture = new SOAPRequest(null, null); diff --git a/agent/agent_standalone/pom.xml b/agent/agent_standalone/pom.xml index 93a5cd7ab..cdacc09f6 100755 --- a/agent/agent_standalone/pom.xml +++ b/agent/agent_standalone/pom.xml @@ -5,7 +5,7 @@ com.intuit.tank agent-parent - 2.3.4 + 3.0.0 agent-standalone diff --git a/agent/agent_standalone_pkg/pom.xml b/agent/agent_standalone_pkg/pom.xml index 5fe5ffc32..93b217148 100755 --- a/agent/agent_standalone_pkg/pom.xml +++ b/agent/agent_standalone_pkg/pom.xml @@ -5,7 +5,7 @@ com.intuit.tank agent-parent - 2.3.4 + 3.0.0 agent-standalone-pkg @@ -40,6 +40,7 @@ agent-standalone src/main/assembly/assembly.xml + src/main/assembly/zip-assembly.xml diff --git a/agent/agent_startup/pom.xml b/agent/agent_startup/pom.xml index aaf661531..e47fb6386 100755 --- a/agent/agent_startup/pom.xml +++ b/agent/agent_startup/pom.xml @@ -5,7 +5,7 @@ com.intuit.tank agent-parent - 2.3.4 + 3.0.0 agent-startup diff --git a/agent/agent_startup/src/main/java/com/intuit/tank/agent/AgentStartup.java b/agent/agent_startup/src/main/java/com/intuit/tank/agent/AgentStartup.java index 07737c472..5adafd412 100644 --- a/agent/agent_startup/src/main/java/com/intuit/tank/agent/AgentStartup.java +++ b/agent/agent_startup/src/main/java/com/intuit/tank/agent/AgentStartup.java @@ -24,7 +24,6 @@ import java.util.zip.ZipException; import java.util.zip.ZipInputStream; -import com.amazonaws.util.StringUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.logging.log4j.LogManager; @@ -32,6 +31,7 @@ import com.intuit.tank.harness.AmazonUtil; import com.intuit.tank.vm.common.TankConstants; +import software.amazon.awssdk.utils.StringUtils; public class AgentStartup implements Runnable { private static Logger logger = LogManager.getLogger(AgentStartup.class); @@ -110,7 +110,7 @@ public static void main(String[] args) { controllerBaseUrl = values[1]; } } - if (StringUtils.isNullOrEmpty(controllerBaseUrl)) { + if (StringUtils.isEmpty(controllerBaseUrl)) { controllerBaseUrl = AmazonUtil.getControllerBaseUrl(); } AgentStartup agentStartup = new AgentStartup(controllerBaseUrl); diff --git a/agent/agent_startup_pkg/pom.xml b/agent/agent_startup_pkg/pom.xml index 9d5995e6c..a27c144ad 100755 --- a/agent/agent_startup_pkg/pom.xml +++ b/agent/agent_startup_pkg/pom.xml @@ -5,7 +5,7 @@ com.intuit.tank agent-parent - 2.3.4 + 3.0.0 agent-startup-pkg diff --git a/agent/apiharness/pom.xml b/agent/apiharness/pom.xml index 93889de75..fdbf2701c 100644 --- a/agent/apiharness/pom.xml +++ b/agent/apiharness/pom.xml @@ -5,7 +5,7 @@ com.intuit.tank agent-parent - 2.3.4 + 3.0.0 agent @@ -81,6 +81,11 @@ ${project.version} + + com.sun.xml.bind + jaxb-impl + runtime + org.simpleframework simple-http diff --git a/agent/apiharness/src/main/java/com/intuit/tank/harness/APIMonitor.java b/agent/apiharness/src/main/java/com/intuit/tank/harness/APIMonitor.java index 7c32710be..5ca31cb91 100644 --- a/agent/apiharness/src/main/java/com/intuit/tank/harness/APIMonitor.java +++ b/agent/apiharness/src/main/java/com/intuit/tank/harness/APIMonitor.java @@ -105,17 +105,14 @@ private CloudVmStatus createStatus(WatsAgentStatusResponse agentStatus) { * @return */ private JobStatus calculateJobStatus(WatsAgentStatusResponse agentStatus, JobStatus currentStatus) { - if (APITestHarness.getInstance().getCmd() == WatsAgentCommand.pause) { - return JobStatus.Paused; - } else if (APITestHarness.getInstance().getCmd() == WatsAgentCommand.stop) { - return JobStatus.Stopped; - } else if (APITestHarness.getInstance().getCmd() == WatsAgentCommand.pause_ramp) { - return JobStatus.RampPaused; - } else if ((currentStatus == JobStatus.Unknown || currentStatus == JobStatus.Starting) - && agentStatus.getCurrentNumberUsers() > 0) { - return JobStatus.Running; - } - return currentStatus; + WatsAgentCommand cmd = APITestHarness.getInstance().getCmd(); + return cmd == WatsAgentCommand.pause ? JobStatus.Paused + : cmd == WatsAgentCommand.stop ? JobStatus.Stopped + : cmd == WatsAgentCommand.pause_ramp ? JobStatus.RampPaused + : currentStatus == JobStatus.Unknown + || currentStatus == JobStatus.Starting + && agentStatus.getCurrentNumberUsers() > 0 ? JobStatus.Running + : currentStatus; } public static void setDoMonitor(boolean monitor) { diff --git a/agent/apiharness/src/main/java/com/intuit/tank/harness/APITestHarness.java b/agent/apiharness/src/main/java/com/intuit/tank/harness/APITestHarness.java index 01b3b4520..9bb625e3c 100644 --- a/agent/apiharness/src/main/java/com/intuit/tank/harness/APITestHarness.java +++ b/agent/apiharness/src/main/java/com/intuit/tank/harness/APITestHarness.java @@ -30,7 +30,6 @@ import java.util.Vector; import java.util.concurrent.CountDownLatch; -import com.amazonaws.regions.Regions; import com.google.common.collect.ImmutableMap; import com.intuit.tank.http.TankHttpClient; import org.apache.commons.io.FileUtils; @@ -43,6 +42,7 @@ import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.LoggerConfig; +import org.apache.logging.log4j.message.ObjectMessage; import com.intuit.tank.AgentServiceClient; import com.intuit.tank.api.model.v1.cloud.CloudVmStatus; @@ -67,7 +67,7 @@ import com.intuit.tank.vm.api.enumerated.WatsAgentCommand; import com.intuit.tank.vm.common.TankConstants; import com.intuit.tank.vm.settings.TankConfig; -import org.apache.logging.log4j.message.ObjectMessage; +import software.amazon.awssdk.regions.internal.util.EC2MetadataUtils; public class APITestHarness { private static Logger LOG = LogManager.getLogger(APITestHarness.class); @@ -141,12 +141,13 @@ public static void main(String[] args) { } HostInfo hostInfo = new HostInfo(); - ThreadContext.put("jobId", getInstance().getAgentRunData().getJobId()); - ThreadContext.put("projectName", getInstance().getAgentRunData().getProjectName()); - ThreadContext.put("instanceId", getInstance().getAgentRunData().getInstanceId()); + ThreadContext.put("jobId", AmazonUtil.getJobId()); + ThreadContext.put("projectName", AmazonUtil.getProjectName()); + ThreadContext.put("instanceId", AmazonUtil.getInstanceId()); ThreadContext.put("publicIp", hostInfo.getPublicIp()); - ThreadContext.put("region", AmazonUtil.getVMRegion().getRegion()); + ThreadContext.put("location", AmazonUtil.getZone()); ThreadContext.put("httpHost", AmazonUtil.getControllerBaseUrl()); + ThreadContext.put("loggingProfile", AmazonUtil.getLoggingProfile().getDisplayName()); getInstance().initializeFromArgs(args); } @@ -302,23 +303,12 @@ private void startHttp(String baseUrl) { if (capacity < 0) { capacity = AmazonUtil.getCapacity(); } - VMRegion region = VMRegion.STANDALONE; - if (AmazonUtil.isInAmazon()) { - region = AmazonUtil.getVMRegion(); - } agentRunData.setJobId(AmazonUtil.getJobId()); agentRunData.setStopBehavior(AmazonUtil.getStopBehavior()); - LogUtil.getLogEvent().setJobId(agentRunData.getJobId()); - ThreadContext.put("jobId", agentRunData.getJobId()); - ThreadContext.put("projectName", agentRunData.getProjectName()); - ThreadContext.put("instanceId", agentRunData.getInstanceId()); - ThreadContext.put("publicIp", hostInfo.getPublicIp()); - ThreadContext.put("region", Regions.getCurrentRegion().getName()); - ThreadContext.put("httpHost", baseUrl); - LOG.info(new ObjectMessage(ImmutableMap.of("Message", "Active Profile" + agentRunData.getActiveProfile().getDisplayName()))); + AgentData data = new AgentData(agentRunData.getJobId(), instanceId, instanceUrl, capacity, - region, AmazonUtil.getZone()); + AmazonUtil.getVMRegion(), AmazonUtil.getZone()); try { AgentTestStartData startData = null; int count = 0; @@ -614,12 +604,8 @@ public CloudVmStatus getInitialStatus() { VMRegion region = VMRegion.STANDALONE; String secGroups = "unknown"; if (AmazonUtil.isInAmazon()) { - try { - region = AmazonUtil.getVMRegion(); - secGroups = AmazonUtil.getMetaData(CloudMetaDataType.security_groups); - } catch (IOException e) { - LOG.warn(new ObjectMessage(ImmutableMap.of("Message", "Error gettting region. using Custom..."))); - } + region = AmazonUtil.getVMRegion(); + secGroups = EC2MetadataUtils.getSecurityGroups().get(0); } status = new CloudVmStatus(instanceId, agentRunData.getJobId(), secGroups, JobStatus.Unknown, VMImageType.AGENT, region, VMStatus.running, @@ -713,9 +699,9 @@ public void checkAgentThreads() { threadGroup.enumerate(threads); int activeThreads = (int) Arrays.stream(threads).filter(Objects::nonNull).filter( t -> t.getState() == Thread.State.TIMED_WAITING || t.getState() == Thread.State.WAITING).count(); - LOG.info(new ObjectMessage(ImmutableMap.of("Message", "Have " + activeThreads + " of " + activeCount + LOG.info(LogUtil.getLogMessage("Have " + activeThreads + " of " + activeCount + " active Threads in thread group " - + threadGroup.getName()))); + + threadGroup.getName())); } if (hasMetSimulationTime()) { // && doneSignal.getCount() != 0) { LOG.info(LogUtil.getLogMessage("Max simulation time has been met and there are " diff --git a/agent/apiharness/src/main/java/com/intuit/tank/harness/logging/ThreadLocalLogEvent.java b/agent/apiharness/src/main/java/com/intuit/tank/harness/logging/ThreadLocalLogEvent.java index 2ba676734..3312e4927 100644 --- a/agent/apiharness/src/main/java/com/intuit/tank/harness/logging/ThreadLocalLogEvent.java +++ b/agent/apiharness/src/main/java/com/intuit/tank/harness/logging/ThreadLocalLogEvent.java @@ -41,8 +41,9 @@ public LogEvent initialValue() { ThreadContext.put("projectName", APITestHarness.getInstance().getAgentRunData().getProjectName()); ThreadContext.put("instanceId", APITestHarness.getInstance().getAgentRunData().getInstanceId()); ThreadContext.put("publicIp", hostInfo.getPublicIp()); - ThreadContext.put("region", AmazonUtil.getVMRegion().getRegion()); + ThreadContext.put("location", AmazonUtil.getZone()); ThreadContext.put("httpHost", AmazonUtil.getControllerBaseUrl()); + ThreadContext.put("loggingProfile", APITestHarness.getInstance().getAgentRunData().getActiveProfile().getDisplayName()); return logEvent; diff --git a/agent/apiharness/src/main/resources/log4j2.xml b/agent/apiharness/src/main/resources/log4j2.xml index ad798746d..ce2ac7b9c 100644 --- a/agent/apiharness/src/main/resources/log4j2.xml +++ b/agent/apiharness/src/main/resources/log4j2.xml @@ -14,8 +14,9 @@ - + + diff --git a/agent/apiharness/src/test/java/com/intuit/tank/common/TPSTest.java b/agent/apiharness/src/test/java/com/intuit/tank/common/TPSTest.java index e0f7395d0..1de5d83b6 100644 --- a/agent/apiharness/src/test/java/com/intuit/tank/common/TPSTest.java +++ b/agent/apiharness/src/test/java/com/intuit/tank/common/TPSTest.java @@ -22,10 +22,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.amazonaws.ClientConfiguration; -import com.amazonaws.auth.AWSCredentials; -import com.amazonaws.auth.BasicAWSCredentials; -import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; import com.intuit.tank.persistence.databases.AmazonDynamoDatabaseDocApi; import com.intuit.tank.persistence.databases.DatabaseKeys; import com.intuit.tank.reporting.api.TPSInfo; @@ -37,19 +33,22 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; public class TPSTest { private static final Logger LOG = LogManager.getLogger(TPSTest.class); - private AmazonDynamoDBClient dbclient; + private DynamoDbClient dynamoDbClient; @BeforeAll @Tag(TestGroups.EXPERIMENTAL) public void init() { - ClientConfiguration clientConfig = new ClientConfiguration(); - AWSCredentials credentials = new BasicAWSCredentials(System.getProperty("AWS_KEY_ID"), + AwsCredentials credentials = AwsBasicCredentials.create(System.getProperty("AWS_KEY_ID"), System.getProperty("AWS_KEY")); - dbclient = new AmazonDynamoDBClient(credentials, clientConfig); + dynamoDbClient = DynamoDbClient.builder().credentialsProvider(StaticCredentialsProvider.create(credentials)).build(); } @Test @@ -57,7 +56,7 @@ public void init() { private void sendTps() { TPSInfoContainer tpsInfo = createTPsInfo(); try { - IDatabase db = new AmazonDynamoDatabaseDocApi(dbclient); + IDatabase db = new AmazonDynamoDatabaseDocApi(dynamoDbClient); List items = new ArrayList(); for (TPSInfo info : tpsInfo.getTpsInfos()) { com.intuit.tank.reporting.databases.Item item = createItem(info); diff --git a/agent/apiharness_pkg/pom.xml b/agent/apiharness_pkg/pom.xml index 0a09f24aa..3f4bcf909 100644 --- a/agent/apiharness_pkg/pom.xml +++ b/agent/apiharness_pkg/pom.xml @@ -6,18 +6,15 @@ com.intuit.tank agent-parent - 2.3.4 + 3.0.0 - apiharness pom Apiharness Packaging - - ${project.groupId} agent @@ -25,8 +22,6 @@ - - diff --git a/agent/http_client_3/pom.xml b/agent/http_client_3/pom.xml index 298650e43..a170d641b 100644 --- a/agent/http_client_3/pom.xml +++ b/agent/http_client_3/pom.xml @@ -5,7 +5,7 @@ com.intuit.tank agent-parent - 2.3.4 + 3.0.0 http_client_commons_3 diff --git a/agent/http_client_4/pom.xml b/agent/http_client_4/pom.xml index 0d43e5630..5d8e7680a 100644 --- a/agent/http_client_4/pom.xml +++ b/agent/http_client_4/pom.xml @@ -5,7 +5,7 @@ com.intuit.tank agent-parent - 2.3.4 + 3.0.0 http_client_commons_4 diff --git a/agent/http_client_5/pom.xml b/agent/http_client_5/pom.xml index fffa8b84e..1c7babf38 100644 --- a/agent/http_client_5/pom.xml +++ b/agent/http_client_5/pom.xml @@ -5,7 +5,7 @@ com.intuit.tank agent-parent - 2.3.4 + 3.0.0 http_client_commons_5 diff --git a/agent/pom.xml b/agent/pom.xml index e39d6069e..6f4d1f956 100644 --- a/agent/pom.xml +++ b/agent/pom.xml @@ -6,7 +6,7 @@ com.intuit.tank tank-parent - 2.3.4 + 3.0.0 agent-parent diff --git a/all-in-one.sh b/all-in-one.sh index 02089b194..ea9cbb4f6 100644 --- a/all-in-one.sh +++ b/all-in-one.sh @@ -7,36 +7,49 @@ if [ -z "$1" ] fi mkdir -p $INSTALL_DIR 2>/dev/null echo "Installing all in one in $INSTALL_DIR" -echo "downloading and extracting tomcat 6..." -wget -O /tmp/apache-tomcat.tgz http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.41/bin/apache-tomcat-6.0.41.tar.gz 2>/dev/null +echo "downloading and extracting tomcat 9..." +wget -O /tmp/apache-tomcat.tgz http://archive.apache.org/dist/tomcat/tomcat-9/v9.0.39/bin/apache-tomcat-9.0.39.tar.gz 2>/dev/null tar -zxf /tmp/apache-tomcat.tgz -C $INSTALL_DIR 2>/dev/null rm -f /tmp/apache-tomcat.tgz 2>/dev/null -ln -snf $INSTALL_DIR/apache-tomcat-6.0.41 $INSTALL_DIR/tomcat6 2>/dev/null -mkdir $INSTALL_DIR/tomcat6/db 2>/dev/null -mkdir $INSTALL_DIR/tomcat6/jars 2>/dev/null +ln -snf $INSTALL_DIR/apache-tomcat-9.0.39 $INSTALL_DIR/tomcat 2>/dev/null +mkdir $INSTALL_DIR/tomcat/db 2>/dev/null +mkdir $INSTALL_DIR/tomcat/jars 2>/dev/null echo "downloading and extracting agent-standalone..." -wget -O /tmp/agent-standalone-pkg.zip http://tank-public.s3-website-us-east-1.amazonaws.com/agent-standalone-pkg.zip 2>/dev/null +wget -O /tmp/agent-standalone-pkg.zip https://github.com/intuit/Tank/releases/download/3.0.0/agent-standalone-pkg.zip 2>/dev/null unzip -q -d $INSTALL_DIR /tmp/agent-standalone-pkg 2>/dev/null rm -f /tmp/agent-standalone-pkg 2>/dev/null echo "downloading and extracting support libraries..." -wget -O $INSTALL_DIR/tomcat6/lib/weld-tomcat-support-1.0.1-Final.jar http://central.maven.org/maven2/org/jboss/weld/servlet/weld-tomcat-support/1.0.1-Final/weld-tomcat-support-1.0.1-Final.jar 2>/dev/null -wget -O /$INSTALL_DIR/tomcat6/lib/h2-1.4.187.jar http://repo2.maven.org/maven2/com/h2database/h2/1.4.187/h2-1.4.187.jar 2>/dev/null -wget -O /$INSTALL_DIR/tomcat6/conf/server.xml http://tank-public.s3-website-us-east-1.amazonaws.com/server-all-in-one.xml 2>/dev/null -wget -O /$INSTALL_DIR/tomcat6/settings.xml http://tank-public.s3-website-us-east-1.amazonaws.com/settings-all-in-one.xml 2>/dev/null -wget -O $INSTALL_DIR/tomcat6/conf/context.xml http://tank-public.s3-website-us-east-1.amazonaws.com/context.xml 2>/dev/null +wget -O /$INSTALL_DIR/tomcat/lib/h2-1.4.200.jar https://repo1.maven.org/maven2/com/h2database/h2/1.4.200/h2-1.4.200.jar 2>/dev/null +wget -O /$INSTALL_DIR/tomcat/settings.xml https://github.com/intuit/Tank/blob/master/assets/settings-all-in-one.xml 2>/dev/null echo "downloading and installing tank war file..." -rm -fr $INSTALL_DIR/tomcat6/webapps/docs $INSTALL_DIR/tomcat6/webapps/examples $INSTALL_DIR/tomcat6/webapps/ROOT 2>/dev/null -wget -O $INSTALL_DIR/tomcat6/webapps/ROOT.war http://tank-public.s3-website-us-east-1.amazonaws.com/tank.war 2>/dev/null +rm -fr $INSTALL_DIR/tomcat/webapps/docs $INSTALL_DIR/tomcat/webapps/examples $INSTALL_DIR/tomcat/webapps/ROOT 2>/dev/null +wget -O $INSTALL_DIR/tomcat/webapps/ROOT.war https://github.com/intuit/Tank/releases/download/3.0.0/tank.war 2>/dev/null + +echo "Creating context file at $INSTALL_DIR/start.sh ..." +cat << EOF > $INSTALL_DIR/tomcat/conf/context.xml +#!/bin/bash + + + + + +EOF +chmod 644 $INSTALL_DIR/tomcat/conf/context.xml 2>/dev/null echo "Creating start script at $INSTALL_DIR/start.sh ..." cat << EOF > $INSTALL_DIR/start.sh #!/bin/bash echo "Starting Tomcat..." export JAVA_OPTS="-Xms256m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -Djava.awt.headless=true" -cd $INSTALL_DIR/tomcat6/ +cd $INSTALL_DIR/tomcat/ bin/startup.sh &> /dev/null echo "Tomcat started." cd $INSTALL_DIR/agent-standalone/ @@ -50,7 +63,7 @@ echo "Creating stop script at $INSTALL_DIR/stop.sh..." cat << EOF > $INSTALL_DIR/stop.sh #!/bin/bash echo "Stopping Tomcat..." -$INSTALL_DIR/tomcat6/bin/shutdown.sh &> /dev/null +$INSTALL_DIR/tomcat/bin/shutdown.sh &> /dev/null echo "Stopping Agent..." kill $(ps aux | grep '[a]gent-standalone' | awk '{print $2}') &> /dev/null kill $(ps aux | grep '[a]piharness' | awk '{print $2}') &> /dev/null diff --git a/api/pom.xml b/api/pom.xml index 2cd764b95..b8d48d2be 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -6,7 +6,7 @@ com.intuit.tank tank-parent - 2.3.4 + 3.0.0 api @@ -61,8 +61,12 @@ - com.amazonaws - aws-java-sdk-s3 + software.amazon.awssdk + s3 + + + software.amazon.awssdk + apache-client diff --git a/api/src/main/java/com/intuit/tank/harness/AmazonUtil.java b/api/src/main/java/com/intuit/tank/harness/AmazonUtil.java index 320bf1f48..620ed184d 100644 --- a/api/src/main/java/com/intuit/tank/harness/AmazonUtil.java +++ b/api/src/main/java/com/intuit/tank/harness/AmazonUtil.java @@ -19,25 +19,24 @@ import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; -import java.util.HashMap; +import java.nio.charset.StandardCharsets; +import java.util.Collections; import java.util.Map; +import java.util.stream.Collectors; import javax.annotation.Nonnull; +import com.google.common.base.Splitter; import com.google.common.collect.ImmutableMap; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.intuit.tank.logging.LoggingProfile; import com.intuit.tank.vm.api.enumerated.VMRegion; -import com.intuit.tank.vm.api.enumerated.VMSize; import com.intuit.tank.vm.common.TankConstants; import org.apache.logging.log4j.message.ObjectMessage; -import static java.nio.charset.StandardCharsets.UTF_8; - /** * * AmazonUtil @@ -55,7 +54,6 @@ public class AmazonUtil { public static VMRegion getVMRegion() { try { String zone = getMetaData(CloudMetaDataType.zone); - LOG.info(new ObjectMessage(ImmutableMap.of("Message", "Running in zone " + zone))); return VMRegion.getRegionFromZone(zone); } catch (IOException ioe) { LOG.warn(new ObjectMessage(ImmutableMap.of("Message","Error getting region. using CUSTOM..."))); @@ -84,27 +82,20 @@ public static boolean isInAmazon() { */ public static String getZone() { try { - String zone = getMetaData(CloudMetaDataType.zone); - LOG.info(new ObjectMessage(ImmutableMap.of("Message","Running in zone " + zone))); - return zone; - } catch (Exception e) { + return getMetaData(CloudMetaDataType.zone); + } catch (IOException e) { LOG.info(new ObjectMessage(ImmutableMap.of("Message","cannot determine zone"))); } return "unknown"; } public static String getPublicHostName() throws IOException { - String ret = null; try { - ret = getMetaData(CloudMetaDataType.public_hostname); - } catch (Exception e) { - LOG.debug(new ObjectMessage(ImmutableMap.of("Message","Failed getting public host: " + e))); - } - if (StringUtils.isBlank(ret)) { - //LOG.info("getting local_ipv4..."); - ret = getMetaData(CloudMetaDataType.local_ipv4); + return getMetaData(CloudMetaDataType.public_hostname); + } catch (IOException e) { + // returns private IP because private hostname is unresolvable + return getMetaData(CloudMetaDataType.local_ipv4); } - return ret; } /** @@ -114,35 +105,11 @@ public static String getPublicHostName() throws IOException { * @throws IOException */ public static String getPublicIp() throws IOException { - return getMetaData(CloudMetaDataType.public_ipv4); - } - - /** - * - * @return - */ - public static String getAWSKeyFromUserData() { - String ret = null; try { - ret = getUserDataAsMap().get(TankConstants.KEY_AWS_SECRET_KEY); + return getMetaData(CloudMetaDataType.public_ipv4); } catch (IOException e) { - LOG.warn(new ObjectMessage(ImmutableMap.of("Message", "Error getting key: " + e.toString()))); + return getMetaData(CloudMetaDataType.local_ipv4); } - return ret; - } - - /** - * - * @return - */ - public static String getAWSKeyIdFromUserData() { - String ret = null; - try { - ret = getUserDataAsMap().get(TankConstants.KEY_AWS_SECRET_KEY_ID); - } catch (IOException e) { - LOG.warn(new ObjectMessage(ImmutableMap.of("Message", "Error getting key ID: " + e.toString()))); - } - return ret; } /** @@ -168,10 +135,8 @@ public static String getInstanceId() { * if there is an error communicating with the amazon cloud. */ @Nonnull - public static VMSize getInstanceType() throws IOException { - String metaData = getMetaData(CloudMetaDataType.instance_type); - VMSize ret = VMSize.fromRepresentation(metaData); - return ret != null ? ret : VMSize.HighCPUExtraLarge; + public static String getInstanceType() throws IOException { + return getMetaData(CloudMetaDataType.instance_type); } /** @@ -183,8 +148,7 @@ public static VMSize getInstanceType() throws IOException { */ @Nonnull public static String getMetaData(CloudMetaDataType metaData) throws IOException { - InputStream inputStream = getInputStream(BASE + META_DATA + "/" + metaData.getKey()); - return convertStreamToString(inputStream); + return getResponseString(BASE + META_DATA + "/" + metaData.getKey()); } /** @@ -194,168 +158,98 @@ public static String getMetaData(CloudMetaDataType metaData) throws IOException * @throws IOException */ public static String getUserDataAsString() throws IOException { - String result = null; - InputStream inputStream = getInputStream(BASE + USER_DATA); - result = convertStreamToString(inputStream); - return result; + return getResponseString(BASE + USER_DATA); } /** * gets the job id form user data - * + * * @return */ public static String getJobId() { - String ret = null; - try { - ret = getUserDataAsMap().get(TankConstants.KEY_JOB_ID); - } catch (IOException e) { - LOG.warn(new ObjectMessage(ImmutableMap.of("Message", "Error getting job ID: " + e.toString()))); - } - return ret != null ? ret : "unknown"; + String result = getUserDataAsMap().get(TankConstants.KEY_JOB_ID); + return StringUtils.isNotEmpty(result) + ? result + : "unknown"; } /** * gets the project name for user data - * + * * @return */ public static String getProjectName() { - String ret = null; - try { - ret = getUserDataAsMap().get(TankConstants.KEY_PROJECT_NAME); - } catch (IOException e) { - LOG.warn(new ObjectMessage(ImmutableMap.of("Message", "Error getting Project Name: " + e.toString()))); - } - return ret != null ? ret : "unknown"; + String result = getUserDataAsMap().get(TankConstants.KEY_PROJECT_NAME); + return StringUtils.isNotEmpty(result) + ? result + : "unknown"; } /** * gets logging profile form user data - * + * * @return LoggingProfile */ public static LoggingProfile getLoggingProfile() { - LoggingProfile ret = LoggingProfile.STANDARD; - try { - String lp = getUserDataAsMap().get(TankConstants.KEY_LOGGING_PROFILE); - if (lp != null) { - ret = LoggingProfile.valueOf(lp); - } - } catch (Exception e) { - LOG.warn(new ObjectMessage(ImmutableMap.of("Message", "Error getting LoggingProfile: " + e.toString()))); - } - return ret; + String result = getUserDataAsMap().get(TankConstants.KEY_LOGGING_PROFILE); + return StringUtils.isNotEmpty(result) + ? LoggingProfile.valueOf(result) + : LoggingProfile.STANDARD; } public static int getCapacity() { - int ret = 4000; - try { - String lp = getUserDataAsMap().get(TankConstants.KEY_NUM_USERS_PER_AGENT); - if (lp != null) { - ret = Integer.valueOf(lp); - } - } catch (Exception e) { - LOG.warn(new ObjectMessage(ImmutableMap.of("Message", "Error getting capacity: " + e.toString()))); - } - return ret; + String result = getUserDataAsMap().get(TankConstants.KEY_NUM_USERS_PER_AGENT); + return StringUtils.isNotEmpty(result) + ? Integer.parseInt(result) + : 4000; } /** * gets stop behavior form user data. - * + * * @return Stopbehavior */ public static StopBehavior getStopBehavior() { - StopBehavior ret = StopBehavior.END_OF_SCRIPT_GROUP; - try { - String sb = getUserDataAsMap().get(TankConstants.KEY_STOP_BEHAVIOR); - if (sb != null) { - ret = StopBehavior.valueOf(sb); - } - } catch (Exception e) { - LOG.warn(new ObjectMessage(ImmutableMap.of("Message", "Error getting StopBehavior: " + e.toString()))); - } - return ret; + String result = getUserDataAsMap().get(TankConstants.KEY_STOP_BEHAVIOR); + return StringUtils.isNotEmpty(result) + ? StopBehavior.valueOf(result) + : StopBehavior.END_OF_SCRIPT_GROUP; } /** * gets if we are using EIP from user data - * + * * @return */ public static boolean usingEip() { - boolean ret = false; - try { - ret = getUserDataAsMap().get(TankConstants.KEY_USING_BIND_EIP) != null; - } catch (IOException e) { - LOG.warn(new ObjectMessage(ImmutableMap.of("Message", "Error getting is using EIP: " + e.toString()))); - } - return ret; + return StringUtils.isNotEmpty(getUserDataAsMap().get(TankConstants.KEY_USING_BIND_EIP)); } /** * gewts controller base form user data - * + * * @return */ public static String getControllerBaseUrl() { - String ret = null; - try { - ret = getUserDataAsMap().get(TankConstants.KEY_CONTROLLER_URL); - } catch (IOException e) { - LOG.warn(new ObjectMessage(ImmutableMap.of("Message", "Error getting controller url: " + e.toString()))); - } - return ret != null ? ret : "http://localhost:8080/"; + String result = getUserDataAsMap().get(TankConstants.KEY_CONTROLLER_URL); + return StringUtils.isNotEmpty(result) + ? result + : "http://localhost:8080/"; } /** * Gets the user data associated with this instance. * * @return the user data as a Map - * @throws IOException */ - public static Map getUserDataAsMap() throws IOException { - Map result = null; - InputStream inputStream = getInputStream(BASE + USER_DATA); - result = convertStreamToMap(inputStream); - return result; - } - - private static Map convertStreamToMap(InputStream is) throws IOException { - Map result = new HashMap(); - if (is != null) { - try { - BufferedReader r = new BufferedReader(new InputStreamReader(is)); - String s = r.readLine(); - while (s != null) { - String[] pair = s.split("=", 2); - if (pair.length == 2) { - result.put(pair[0], pair[1]); - } - s = r.readLine(); - } - } finally { - try { - is.close(); - } catch (IOException e) {} - } - } - return result; - } - - private static String convertStreamToString(InputStream is) throws IOException { - if (is != null) { - try { - return IOUtils.toString(is, UTF_8); - } finally { - try { - is.close(); - } catch (IOException e) {} + public static Map getUserDataAsMap() { + try { + String userData = getResponseString(BASE + USER_DATA); + if (StringUtils.isNotEmpty(userData)) { + return Splitter.on(System.getProperty("line.separator")).withKeyValueSeparator("=").split(userData); } - } else { - return ""; - } + } catch (IllegalArgumentException | IOException e) { } + return Collections.emptyMap(); } /** @@ -363,11 +257,13 @@ private static String convertStreamToString(InputStream is) throws IOException { * @return * @throws IOException */ - private static InputStream getInputStream(String url) throws IOException { + private static String getResponseString(String url) throws IOException { HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection(); con.setRequestMethod("GET"); con.setConnectTimeout(3000); - return con.getInputStream(); + InputStream is = con.getInputStream(); + return new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)) + .lines() + .collect(Collectors.joining(System.getProperty("line.separator"))); } - } diff --git a/api/src/main/java/com/intuit/tank/harness/StopBehavior.java b/api/src/main/java/com/intuit/tank/harness/StopBehavior.java index 04083ac14..3920adbe1 100644 --- a/api/src/main/java/com/intuit/tank/harness/StopBehavior.java +++ b/api/src/main/java/com/intuit/tank/harness/StopBehavior.java @@ -43,13 +43,12 @@ public String getDescription() { } public static StopBehavior fromString(String stopBehavior) { - StopBehavior ret = StopBehavior.END_OF_SCRIPT_GROUP; try { - ret = valueOf(stopBehavior); + return valueOf(stopBehavior); } catch (Exception e) { // bad name return default + return StopBehavior.END_OF_SCRIPT_GROUP; } - return ret; } } diff --git a/api/src/main/java/com/intuit/tank/storage/S3FileStorage.java b/api/src/main/java/com/intuit/tank/storage/S3FileStorage.java index 2ec5290ab..72203bc2f 100644 --- a/api/src/main/java/com/intuit/tank/storage/S3FileStorage.java +++ b/api/src/main/java/com/intuit/tank/storage/S3FileStorage.java @@ -1,37 +1,41 @@ package com.intuit.tank.storage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import java.util.Map.Entry; import java.util.zip.GZIPInputStream; -import com.amazonaws.auth.AWSStaticCredentialsProvider; -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3ClientBuilder; -import com.amazonaws.util.IOUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.http.client.utils.URIBuilder; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.amazonaws.ClientConfiguration; -import com.amazonaws.auth.BasicAWSCredentials; -import com.amazonaws.services.s3.model.AccessControlList; -import com.amazonaws.services.s3.model.AmazonS3Exception; -import com.amazonaws.services.s3.model.Bucket; -import com.amazonaws.services.s3.model.ListObjectsRequest; -import com.amazonaws.services.s3.model.ObjectListing; -import com.amazonaws.services.s3.model.ObjectMetadata; -import com.amazonaws.services.s3.model.S3Object; -import com.amazonaws.services.s3.model.S3ObjectInputStream; -import com.amazonaws.services.s3.model.S3ObjectSummary; import com.intuit.tank.vm.settings.CloudCredentials; import com.intuit.tank.vm.settings.CloudProvider; import com.intuit.tank.vm.settings.TankConfig; +import org.apache.tomcat.util.http.fileupload.IOUtils; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.http.apache.ApacheHttpClient; +import software.amazon.awssdk.http.apache.ProxyConfiguration; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.S3ClientBuilder; +import software.amazon.awssdk.services.s3.model.BucketAlreadyExistsException; +import software.amazon.awssdk.services.s3.model.CreateBucketRequest; +import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.s3.model.HeadObjectRequest; +import software.amazon.awssdk.services.s3.model.ListObjectsRequest; +import software.amazon.awssdk.services.s3.model.ListObjectsResponse; +import software.amazon.awssdk.services.s3.model.NoSuchKeyException; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.model.S3Exception; +import software.amazon.awssdk.services.s3.model.S3Object; +import software.amazon.awssdk.services.s3.model.ServerSideEncryption; /** * FileStorage that writes to the file system. @@ -49,7 +53,7 @@ public class S3FileStorage implements FileStorage, Serializable { private boolean compress = true; private boolean encrypt = true; - private AmazonS3 s3Client; + private S3Client s3Client; /** * @param bucketName @@ -61,32 +65,28 @@ public S3FileStorage(String bucketName, boolean compress) { this.compress = compress; try { TankConfig tankConfig = new TankConfig(); - encrypt = tankConfig.isS3EncryptionEnabled(); + this.encrypt = tankConfig.isS3EncryptionEnabled(); CloudCredentials creds = tankConfig.getVmManagerConfig().getCloudCredentials(CloudProvider.amazon); - ClientConfiguration config = new ClientConfiguration(); - if (StringUtils.isNotBlank(System.getProperty("http.proxyHost"))) { + S3ClientBuilder s3ClientBuilder = S3Client.builder(); + if (creds != null && StringUtils.isNotBlank(System.getProperty("http.proxyHost"))) { try { - config.setProxyHost(System.getProperty("http.proxyHost")); + URIBuilder uriBuilder = new URIBuilder().setHost(System.getProperty("http.proxyHost")); if (StringUtils.isNotBlank(System.getProperty("http.proxyPort"))) { - config.setProxyPort(Integer.parseInt(System.getProperty("http.proxyPort"))); + uriBuilder.setPort(Integer.parseInt(System.getProperty("http.proxyPort"))); } + ApacheHttpClient.Builder httpClientBuilder = ApacheHttpClient.builder() + .proxyConfiguration( + ProxyConfiguration.builder().endpoint(uriBuilder.build()).build()); + s3ClientBuilder.httpClientBuilder(httpClientBuilder); } catch (NumberFormatException e) { LOG.error("invalid proxy setup."); } - } - assert creds != null; - if (StringUtils.isNotBlank(creds.getKeyId()) && StringUtils.isNotBlank(creds.getKey())) { - BasicAWSCredentials credentials = new BasicAWSCredentials(creds.getKeyId(), creds.getKey()); - this.s3Client = AmazonS3ClientBuilder.standard() - .withCredentials(new AWSStaticCredentialsProvider(credentials)) - .withClientConfiguration(config) - .build(); - } else { - this.s3Client = AmazonS3ClientBuilder.standard() - .withClientConfiguration(config) - .build(); + if (creds != null && StringUtils.isNotBlank(creds.getKeyId()) && StringUtils.isNotBlank(creds.getKey())) { + AwsCredentials credentials = AwsBasicCredentials.create(creds.getKeyId(), creds.getKey()); + s3ClientBuilder.credentialsProvider(StaticCredentialsProvider.create(credentials)); } + s3Client = s3ClientBuilder.build(); createBucket(bucketName); } catch (Exception ex) { LOG.error(ex.getMessage(), ex); @@ -107,74 +107,63 @@ private void parseBucketName(String name) { @Override public void storeFileData(FileData fileData, InputStream in) { - String path = FilenameUtils.separatorsToUnix(FilenameUtils.normalize(extraPath + fileData.getPath() + "/" + fileData.getFileName())); - path = StringUtils.stripStart(path, "/"); + String key = FilenameUtils.separatorsToUnix( + FilenameUtils.normalize(extraPath + fileData.getPath() + "/" + fileData.getFileName())); + key = StringUtils.stripStart(key, "/"); try { - ObjectMetadata metaData = new ObjectMetadata(); + PutObjectRequest.Builder request = PutObjectRequest.builder().bucket(bucketName).key(key); if (encrypt) { - metaData.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION); + request.serverSideEncryption(ServerSideEncryption.AES256); } if (fileData.getAttributes() != null) { - for (Entry entry : fileData.getAttributes().entrySet()) { - metaData.addUserMetadata(entry.getKey(), entry.getValue()); - } + request.metadata(fileData.getAttributes()); } if (compress) { in = new GZIPInputStream(in); } - s3Client.putObject(bucketName, path, in, metaData); + s3Client.putObject(request.build(), RequestBody.fromInputStream(in, in.available())); } catch (Exception e) { LOG.error("Error storing file: " + e, e); throw new RuntimeException(e); } finally { - IOUtils.closeQuietly(in, null); + IOUtils.closeQuietly(in); } } @Override public InputStream readFileData(FileData fileData) { - String path = FilenameUtils.separatorsToUnix(FilenameUtils.normalize(extraPath + fileData.getPath() + "/" + fileData.getFileName())); - path = StringUtils.stripStart(path, "/"); - InputStream ret = null; - try { - S3Object object = s3Client.getObject(bucketName, path); - if (object != null) { - ret = object.getObjectContent(); - if (compress) { - ret = new GZIPInputStream(ret); - } - } - } catch (Exception e) { - LOG.error("Error getting File: " + e, e); - throw new RuntimeException(e); - } - return ret; + String key = FilenameUtils.separatorsToUnix( + FilenameUtils.normalize(extraPath + fileData.getPath() + "/" + fileData.getFileName())); + key = StringUtils.stripStart(key, "/"); + return s3Client.getObject(GetObjectRequest.builder().bucket(bucketName).key(key).build()); } private void createBucket(String bucketName) { - AccessControlList configuration = null; try { - configuration = s3Client.getBucketAcl(bucketName); - } catch (Exception e) { - LOG.info("Bucket " + bucketName + " does not exist."); - } - if (configuration == null) { - Bucket bucket = s3Client.createBucket(bucketName); - LOG.info("Created bucket " + bucket.getName() + " at " + bucket.getCreationDate()); + s3Client.createBucket(CreateBucketRequest.builder().bucket(bucketName).build()); + LOG.info("Created bucket " + bucketName + " at " + "now"); + } catch (BucketAlreadyExistsException baee) {//Good + } catch (S3Exception e) { + LOG.error("Error creating bucket: " + e, e); } } @Override public boolean exists(FileData fileData) { boolean ret = true; - String path = FilenameUtils.separatorsToUnix(FilenameUtils.normalize(extraPath + fileData.getPath() + "/" + fileData.getFileName())); - path = StringUtils.stripStart(path, "/"); + String key = FilenameUtils.separatorsToUnix( + FilenameUtils.normalize(extraPath + fileData.getPath() + "/" + fileData.getFileName())); + key = StringUtils.stripStart(key, "/"); try { - s3Client.getObjectMetadata(bucketName, path); - } catch (AmazonS3Exception e) { - ret = false; + s3Client.headObject(HeadObjectRequest.builder().bucket(bucketName).key(key).build()); + } catch (NoSuchKeyException e) { + return false; + } catch (S3Exception e) { + LOG.error("Error Checking existence of S3 object: " + e, e); + return false; + } - return ret; + return true; } @Override @@ -186,20 +175,14 @@ public List listFileData(String path) { prefix = prefix + "/"; } prefix = StringUtils.removeStart(prefix, "/"); - ListObjectsRequest listObjectsRequest = new ListObjectsRequest().withBucketName(bucketName).withPrefix(prefix); - listObjectsRequest.setDelimiter("/"); - ObjectListing objectListing; - do { - objectListing = s3Client.listObjects(listObjectsRequest); - for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { - String fileName = FilenameUtils.getName(FilenameUtils.normalize(objectSummary.getKey())); - if (StringUtils.isNotBlank(fileName)) { - ret.add(new FileData(path, fileName)); - } + ListObjectsResponse response = s3Client.listObjects(ListObjectsRequest.builder().bucket(bucketName).prefix(prefix).delimiter("/").build()); + for (S3Object object : response.contents()) { + String fileName = FilenameUtils.getName(FilenameUtils.normalize(object.key())); + if (StringUtils.isNotBlank(fileName)) { + ret.add(new FileData(path, fileName)); } - listObjectsRequest.setMarker(objectListing.getNextMarker()); - } while (objectListing.isTruncated()); - } catch (AmazonS3Exception e) { + } + } catch (S3Exception e) { LOG.error("Error Listing Files: " + e, e); throw new RuntimeException(e); } @@ -208,11 +191,11 @@ public List listFileData(String path) { @Override public boolean delete(FileData fileData) { - String path = FilenameUtils.separatorsToUnix(FilenameUtils.normalize(fileData.getPath() + "/" + fileData.getFileName())); - path = StringUtils.stripStart(path, "/"); + String key = FilenameUtils.separatorsToUnix(FilenameUtils.normalize(fileData.getPath() + "/" + fileData.getFileName())); + key = StringUtils.stripStart(key, "/"); try { - s3Client.deleteObject(bucketName, path); - } catch (AmazonS3Exception e) { + s3Client.deleteObject(DeleteObjectRequest.builder().bucket(bucketName).key(key).build()); + } catch (S3Exception e) { return false; } return true; diff --git a/api/src/main/java/com/intuit/tank/vm/api/enumerated/VMRegion.java b/api/src/main/java/com/intuit/tank/vm/api/enumerated/VMRegion.java index 40dac7da3..007b3fd5c 100644 --- a/api/src/main/java/com/intuit/tank/vm/api/enumerated/VMRegion.java +++ b/api/src/main/java/com/intuit/tank/vm/api/enumerated/VMRegion.java @@ -64,7 +64,7 @@ public String getName() { * @return */ public static VMRegion getRegionFromZone(String zone) { - return Arrays.stream(VMRegion.values()).filter(vmr -> zone.toLowerCase().startsWith(vmr.region.toLowerCase())).findFirst().orElse(VMRegion.US_EAST); + return Arrays.stream(VMRegion.values()).filter(vmr -> zone.toLowerCase().startsWith(vmr.region.toLowerCase())).findFirst().orElse(VMRegion.STANDALONE); } /** diff --git a/api/src/main/java/com/intuit/tank/vm/api/enumerated/VMSize.java b/api/src/main/java/com/intuit/tank/vm/api/enumerated/VMSize.java deleted file mode 100644 index f3b3a5b9e..000000000 --- a/api/src/main/java/com/intuit/tank/vm/api/enumerated/VMSize.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.intuit.tank.vm.api.enumerated; - -/* - * #%L - * Intuit Tank Api - * %% - * Copyright (C) 2011 - 2015 Intuit Inc. - * %% - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * #L% - */ - -/* - * Large : 4 ECUs, 2 Cores, 7.5 GB - * ExtraLarge : 8 ECUs, 4 Cores, 15 GB - * HighMemoryExtraLarge : 6.5 ECUs, 2 Cores, 17.1 GB - * HighMemoryDoubleExtraLarge : 13 ECUs, 4 Cores, 34.2 GB - * HighMemoryQuadrupleExtraLarge : 26 ECUs, 8 Cores, 68.4 GB - * HighCPUExtraLarge : 20 ECUs, 8 Cores, 7 GB - */ - -import java.util.Arrays; - -public enum VMSize { - Micro("t1.micro"), // $0.020 / hour - Small("m1.small"), // $0.080 / hour - Medium("m1.medium"), // $0.160 / hour - Large("m1.large"), // $0.32 / hour - ExtraLarge("m1.xlarge"), // $0.640 / hour - HighMemoryExtraLarge("m2.xlarge"), // $0.450 / hour - HighMemoryDoubleExtraLarge("m2.2xlarge"), // $0.900 / hour - HighMemoryQuadrupleExtraLarge("m2.4xlarge"), // $1.800 / hour - HighCPUMedium("c1.medium"), // $0.165 / hour - HighCPUExtraLarge("c1.xlarge"), // $0.660 / hour - HighIOExtraLarge("hi1.4xlarge")// $3.100 / hour - ; - - private String representation; - - /** - * @param representation - */ - private VMSize(String representation) { - this.representation = representation; - } - - /** - * @return the representation - */ - public String getRepresentation() { - return representation; - } - - public static VMSize fromRepresentation(String representation) { - return Arrays.stream(VMSize.values()).filter(s -> s.representation.equalsIgnoreCase(representation)).findFirst().orElse(null); - } -} diff --git a/api/src/main/java/com/intuit/tank/vm/common/PasswordEncoder.java b/api/src/main/java/com/intuit/tank/vm/common/PasswordEncoder.java index 7df07113f..14011316d 100644 --- a/api/src/main/java/com/intuit/tank/vm/common/PasswordEncoder.java +++ b/api/src/main/java/com/intuit/tank/vm/common/PasswordEncoder.java @@ -16,7 +16,7 @@ * #L% */ -import org.apache.commons.codec.binary.Base64; +import org.apache.tomcat.util.codec.binary.Base64; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; diff --git a/api/src/main/java/com/intuit/tank/vm/settings/CloudCredentials.java b/api/src/main/java/com/intuit/tank/vm/settings/CloudCredentials.java index dcdab0c60..0ad3ee735 100644 --- a/api/src/main/java/com/intuit/tank/vm/settings/CloudCredentials.java +++ b/api/src/main/java/com/intuit/tank/vm/settings/CloudCredentials.java @@ -50,21 +50,16 @@ public CloudProvider getType() { * @return the keyId */ public String getKeyId() { - // first try userData - String ret = AmazonUtil.getAWSKeyIdFromUserData(); + // try to get from property + String key = config.getString("secret-key-id-property", "AWS_SECRET_KEY_ID"); + String ret = System.getProperty(key); if (StringUtils.isBlank(ret)) { - // try to get from property - String key = config.getString("secret-key-id-property", "AWS_SECRET_KEY_ID"); - ret = System.getProperty(key); - if (StringUtils.isBlank(ret)) { - ret = System.getenv(key); - } - if (StringUtils.isBlank(ret)) { - // finally get straight from config - ret = config.getString("secret-key-id"); - } + ret = System.getenv(key); + } + if (StringUtils.isBlank(ret)) { + // finally get straight from config + ret = config.getString("secret-key-id"); } - return ret; } @@ -72,19 +67,15 @@ public String getKeyId() { * @return the key */ public String getKey() { - // first try userData - String ret = AmazonUtil.getAWSKeyFromUserData(); + // try to get from property + String key = config.getString("secret-key-property", "AWS_SECRET_KEY"); + String ret = System.getProperty(key); + if (StringUtils.isBlank(ret)) { + ret = System.getenv(key); + } if (StringUtils.isBlank(ret)) { - // try to get from property - String key = config.getString("secret-key-property", "AWS_SECRET_KEY"); - ret = System.getProperty(key); - if (StringUtils.isBlank(ret)) { - ret = System.getenv(key); - } - if (StringUtils.isBlank(ret)) { - // finally get straight from config - ret = config.getString("secret-key"); - } + // finally get straight from config + ret = config.getString("secret-key"); } return ret; } diff --git a/api/src/main/resources/settings.xml b/api/src/main/resources/settings.xml index 33baad811..87adc28c1 100644 --- a/api/src/main/resources/settings.xml +++ b/api/src/main/resources/settings.xml @@ -3,23 +3,23 @@ - datafiles + or relative path or an s3 bucket by prefixing a bucket with s3: e.g. s3:tank-data-files + datafiles --> - timing + timing --> - jars + with s3: e.g. s3:tank-agent-supports + jars --> - tmpfiles + file system. + tmpfiles --> tank @@ -36,7 +36,7 @@ - true + false @@ -172,9 +172,6 @@ - - AWS_SECRET_KEY_ID - AWS_SECRET_KEY @@ -188,8 +185,10 @@ - + + + [AMI-ID] [KEYPAIR] @@ -199,8 +198,9 @@ - + + [SSM-AMI-ID] [AMI-ID] [KEYPAIR] @@ -212,16 +212,11 @@ - - - - - + + + + + @@ -242,13 +237,7 @@ - - 50 - 10 - - com.intuit.tank.persistence.databases.AmazonDynamoDatabaseDocApi - - + com.intuit.tank.persistence.databases.CloudWatchDataSource diff --git a/api/src/test/java/com/intuit/tank/harness/AmazonUtilTest.java b/api/src/test/java/com/intuit/tank/harness/AmazonUtilTest.java new file mode 100644 index 000000000..56217bd41 --- /dev/null +++ b/api/src/test/java/com/intuit/tank/harness/AmazonUtilTest.java @@ -0,0 +1,90 @@ +package com.intuit.tank.harness; + +import com.intuit.tank.logging.LoggingProfile; +import com.intuit.tank.vm.api.enumerated.VMRegion; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import javax.inject.Inject; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Purpose: Test AmazonUtil class utility methods + * @author : atayal + **/ +public class AmazonUtilTest { + + @Inject + private AmazonUtil amazonUtil; + + @Test + void testGetVMRegion() { + VMRegion vmRegion = AmazonUtil.getVMRegion(); + Assertions.assertNotNull(vmRegion); + assertEquals("Standalone Agent", vmRegion.getDescription()); + assertEquals("standalone-agent", vmRegion.getRegion()); + } + + @Test + void testIsInAmazon() { + boolean inAmazon = AmazonUtil.isInAmazon(); + assertFalse(inAmazon); + } + + @Test + void testGetZone() { + String zone = AmazonUtil.getZone(); + Assertions.assertNotNull(zone); + assertEquals("unknown", zone); + } + + @Test + void testGetInstanceId() { + String instanceId = AmazonUtil.getInstanceId(); + Assertions.assertNotNull(instanceId); + assertEquals("", instanceId); + } + + @Test + void testGetLoggingProfile() { + LoggingProfile loggingProfile = AmazonUtil.getLoggingProfile(); + Assertions.assertNotNull(loggingProfile); + assertEquals("Standard", loggingProfile.getDisplayName()); + assertEquals("Logs common fields.", loggingProfile.getDescription()); + } + + @Test + void testGetCapacity() { + int capacity = AmazonUtil.getCapacity(); + assertEquals(4000, capacity); + } + + @Test + void testGetStopBehavior() { + StopBehavior stopBehavior = AmazonUtil.getStopBehavior(); + Assertions.assertNotNull(stopBehavior); + assertEquals("Script Group", stopBehavior.getDisplay()); + assertEquals("Stop after current script group completes.", stopBehavior.getDescription()); + } + + @Test + void testUsingEip() { + boolean usingEip = AmazonUtil.usingEip(); + assertFalse(usingEip); + } + + @Test + void testGetControllerBaseUrl() { + String url = AmazonUtil.getControllerBaseUrl(); + Assertions.assertNotNull(url); + assertEquals("http://localhost:8080/", url); + } + + @Test + void testGetUserDataAsMap() { + Object o = AmazonUtil.getUserDataAsMap(); + Assertions.assertNotNull(o); + } + +} diff --git a/api/src/test/java/com/intuit/tank/http/AuthSchemeTest.java b/api/src/test/java/com/intuit/tank/http/AuthSchemeTest.java new file mode 100644 index 000000000..d1ed5f718 --- /dev/null +++ b/api/src/test/java/com/intuit/tank/http/AuthSchemeTest.java @@ -0,0 +1,22 @@ +package com.intuit.tank.http; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Purpose: Test AuthScheme + * + * @author : atayal + **/ +public class AuthSchemeTest { + + @Test + void testGetScheme() { + AuthScheme scheme = AuthScheme.getScheme("BASIC"); + Assertions.assertNotNull(scheme); + assert scheme == AuthScheme.Basic; + assertEquals("BASIC", scheme.getRepresentation()); + } +} diff --git a/api/src/test/java/com/intuit/tank/logging/LogEventTypeTest.java b/api/src/test/java/com/intuit/tank/logging/LogEventTypeTest.java new file mode 100644 index 000000000..bfa9fd85b --- /dev/null +++ b/api/src/test/java/com/intuit/tank/logging/LogEventTypeTest.java @@ -0,0 +1,19 @@ +package com.intuit.tank.logging; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * Purpose: Test LogEventType Enum + * + * @author : atayal + **/ +public class LogEventTypeTest { + + @Test + void testLogEventTypeEnum() { + LogEventType type = LogEventType.valueOf("System"); + Assertions.assertNotNull(type); + assert LogEventType.System == type; + } +} diff --git a/api/src/test/java/com/intuit/tank/logging/SourceTypeTest.java b/api/src/test/java/com/intuit/tank/logging/SourceTypeTest.java new file mode 100644 index 000000000..8c05f2876 --- /dev/null +++ b/api/src/test/java/com/intuit/tank/logging/SourceTypeTest.java @@ -0,0 +1,18 @@ +package com.intuit.tank.logging; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * Purpose: Test Enum SourceType + * + * @author : atayal + **/ +public class SourceTypeTest { + @Test + void testSourceTypeEnum() { + SourceType type = SourceType.valueOf("controller"); + Assertions.assertNotNull(type); + assert SourceType.controller == type; + } +} diff --git a/api/src/test/java/com/intuit/tank/script/RequestDataTypeTest.java b/api/src/test/java/com/intuit/tank/script/RequestDataTypeTest.java new file mode 100644 index 000000000..d0aa14fce --- /dev/null +++ b/api/src/test/java/com/intuit/tank/script/RequestDataTypeTest.java @@ -0,0 +1,19 @@ +package com.intuit.tank.script; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * Purpose: Test RequestDataType Enum + * + * @author : atayal + **/ +public class RequestDataTypeTest { + + @Test + void testRequestDataTypeEnum() { + RequestDataType type = RequestDataType.valueOf("responseContent"); + Assertions.assertNotNull(type); + assert RequestDataType.responseContent == type; + } +} diff --git a/api/src/test/java/com/intuit/tank/script/TimerActionTest.java b/api/src/test/java/com/intuit/tank/script/TimerActionTest.java new file mode 100644 index 000000000..e4273074d --- /dev/null +++ b/api/src/test/java/com/intuit/tank/script/TimerActionTest.java @@ -0,0 +1,19 @@ +package com.intuit.tank.script; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * Purpose: Test RequestDataType Enum + * + * @author : atayal + **/ +public class TimerActionTest { + + @Test + void testTimerActionEnum() { + TimerAction type = TimerAction.valueOf("START"); + Assertions.assertNotNull(type); + assert TimerAction.START == type; + } +} diff --git a/api/src/test/java/com/intuit/tank/vm/agent/messages/AgentDataCpTest.java b/api/src/test/java/com/intuit/tank/vm/agent/messages/AgentDataCpTest.java index 984cd8e01..ee1b65b32 100644 --- a/api/src/test/java/com/intuit/tank/vm/agent/messages/AgentDataCpTest.java +++ b/api/src/test/java/com/intuit/tank/vm/agent/messages/AgentDataCpTest.java @@ -40,12 +40,12 @@ public void testAgentData_1() assertNotNull(result); assertEquals(0, result.getUsers()); - assertEquals(null, result.getZone()); - assertEquals(null, result.getInstanceId()); - assertEquals(null, result.getRegion()); - assertEquals(null, result.getInstanceUrl()); + assertNull(result.getZone()); + assertNull(result.getInstanceId()); + assertNull(result.getRegion()); + assertNull(result.getInstanceUrl()); assertEquals(0, result.getCapacity()); - assertEquals(null, result.getJobId()); + assertNull(result.getJobId()); } /** @@ -92,7 +92,7 @@ public void testEquals_1() boolean result = fixture.equals(obj); - assertEquals(false, result); + assertFalse(result); } /** @@ -111,7 +111,7 @@ public void testEquals_2() boolean result = fixture.equals(obj); - assertEquals(false, result); + assertFalse(result); } /** @@ -130,7 +130,7 @@ public void testEquals_3() boolean result = fixture.equals(obj); - assertEquals(true, result); + assertTrue(result); } /** @@ -149,7 +149,7 @@ public void testEquals_4() boolean result = fixture.equals(obj); - assertEquals(true, result); + assertTrue(result); } /** diff --git a/api/src/test/java/com/intuit/tank/vm/api/enumerated/VMRegionCpTest.java b/api/src/test/java/com/intuit/tank/vm/api/enumerated/VMRegionCpTest.java index f4792febd..8d3f5f79a 100644 --- a/api/src/test/java/com/intuit/tank/vm/api/enumerated/VMRegionCpTest.java +++ b/api/src/test/java/com/intuit/tank/vm/api/enumerated/VMRegionCpTest.java @@ -15,8 +15,6 @@ import org.junit.jupiter.api.*; -import com.intuit.tank.vm.api.enumerated.VMRegion; - import static org.junit.jupiter.api.Assertions.*; /** @@ -75,10 +73,10 @@ public void testGetRegionFromZone_1() VMRegion result = VMRegion.getRegionFromZone(zone); assertNotNull(result); - assertEquals("US East (Northern Virginia)", result.getDescription()); - assertEquals("US East (Northern Virginia)", result.toString()); - assertEquals("ec2.us-east-1.amazonaws.com", result.getEndpoint()); - assertEquals("US_EAST", result.name()); + assertEquals("Standalone Agent", result.getDescription()); + assertEquals("Standalone Agent", result.toString()); + assertEquals("", result.getEndpoint()); + assertEquals("STANDALONE", result.name()); } /** @@ -96,10 +94,10 @@ public void testGetRegionFromZone_2() VMRegion result = VMRegion.getRegionFromZone(zone); assertNotNull(result); - assertEquals("US East (Northern Virginia)", result.getDescription()); - assertEquals("US East (Northern Virginia)", result.toString()); - assertEquals("ec2.us-east-1.amazonaws.com", result.getEndpoint()); - assertEquals("US_EAST", result.name()); + assertEquals("Standalone Agent", result.getDescription()); + assertEquals("Standalone Agent", result.toString()); + assertEquals("", result.getEndpoint()); + assertEquals("STANDALONE", result.name()); } /** @@ -117,10 +115,10 @@ public void testGetRegionFromZone_3() VMRegion result = VMRegion.getRegionFromZone(zone); assertNotNull(result); - assertEquals("US East (Northern Virginia)", result.getDescription()); - assertEquals("US East (Northern Virginia)", result.toString()); - assertEquals("ec2.us-east-1.amazonaws.com", result.getEndpoint()); - assertEquals("US_EAST", result.name()); + assertEquals("Standalone Agent", result.getDescription()); + assertEquals("Standalone Agent", result.toString()); + assertEquals("", result.getEndpoint()); + assertEquals("STANDALONE", result.name()); } /** diff --git a/api/src/test/java/com/intuit/tank/vm/api/enumerated/VMSizeCpTest.java b/api/src/test/java/com/intuit/tank/vm/api/enumerated/VMSizeCpTest.java deleted file mode 100644 index 8f16e70ce..000000000 --- a/api/src/test/java/com/intuit/tank/vm/api/enumerated/VMSizeCpTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.intuit.tank.vm.api.enumerated; - -/* - * #%L - * Intuit Tank Api - * %% - * Copyright (C) 2011 - 2015 Intuit Inc. - * %% - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * #L% - */ - -import org.junit.jupiter.api.*; - -import com.intuit.tank.vm.api.enumerated.VMSize; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * The class VMSizeCpTest contains tests for the class {@link VMSize}. - * - * @generatedBy CodePro at 9/3/14 3:44 PM - */ -public class VMSizeCpTest { - /** - * Run the VMSize fromRepresentation(String) method test. - * - * @throws Exception - * - * @generatedBy CodePro at 9/3/14 3:44 PM - */ - @Test - public void testFromRepresentation_1() - throws Exception { - String representation = ""; - - VMSize result = VMSize.fromRepresentation(representation); - - assertEquals(null, result); - } - - /** - * Run the VMSize fromRepresentation(String) method test. - * - * @throws Exception - * - * @generatedBy CodePro at 9/3/14 3:44 PM - */ - @Test - public void testFromRepresentation_2() - throws Exception { - String representation = ""; - - VMSize result = VMSize.fromRepresentation(representation); - - assertEquals(null, result); - } - - /** - * Run the VMSize fromRepresentation(String) method test. - * - * @throws Exception - * - * @generatedBy CodePro at 9/3/14 3:44 PM - */ - @Test - public void testFromRepresentation_3() - throws Exception { - String representation = ""; - - VMSize result = VMSize.fromRepresentation(representation); - - assertEquals(null, result); - } - - /** - * Run the String getRepresentation() method test. - * - * @throws Exception - * - * @generatedBy CodePro at 9/3/14 3:44 PM - */ - @Test - public void testGetRepresentation_1() - throws Exception { - VMSize fixture = VMSize.ExtraLarge; - - String result = fixture.getRepresentation(); - - assertEquals("m1.xlarge", result); - } -} \ No newline at end of file diff --git a/api/src/test/java/com/intuit/tank/vm/common/util/MethodTimerCpTest.java b/api/src/test/java/com/intuit/tank/vm/common/util/MethodTimerCpTest.java index 3a1975fb5..1e2ed2606 100644 --- a/api/src/test/java/com/intuit/tank/vm/common/util/MethodTimerCpTest.java +++ b/api/src/test/java/com/intuit/tank/vm/common/util/MethodTimerCpTest.java @@ -18,6 +18,10 @@ import org.junit.jupiter.api.*; import com.intuit.tank.vm.common.util.MethodTimer; +import org.junit.jupiter.api.condition.DisabledIfEnvironmentVariable; + +import java.util.Arrays; +import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -35,6 +39,7 @@ public class MethodTimerCpTest { * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testMethodTimer_1() throws Exception { Logger log = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME); @@ -56,6 +61,7 @@ public void testMethodTimer_1() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testMethodTimer_2() throws Exception { Logger log = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME); @@ -77,6 +83,7 @@ public void testMethodTimer_2() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testEnd_1() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); @@ -97,6 +104,7 @@ public void testEnd_1() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testEndAndLog_1() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); @@ -117,6 +125,7 @@ public void testEndAndLog_1() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testGetMarkTimeMessage_1() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); @@ -136,6 +145,7 @@ public void testGetMarkTimeMessage_1() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testGetMarkTimeMessage_2() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); @@ -155,6 +165,7 @@ public void testGetMarkTimeMessage_2() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testGetNaturalTimeMessage_1() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); @@ -173,6 +184,7 @@ public void testGetNaturalTimeMessage_1() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testGetNaturalTimeMessage_2() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); @@ -191,6 +203,7 @@ public void testGetNaturalTimeMessage_2() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testGetTimeMessage_1() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); @@ -209,6 +222,7 @@ public void testGetTimeMessage_1() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testGetTimeMessage_2() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); @@ -227,6 +241,7 @@ public void testGetTimeMessage_2() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testLogMark_1() throws Exception { MethodTimer fixture = new MethodTimer((Logger) null, Object.class, ""); @@ -248,6 +263,7 @@ public void testLogMark_1() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testLogMark_2() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); @@ -269,6 +285,7 @@ public void testLogMark_2() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testLogTime_1() throws Exception { MethodTimer fixture = new MethodTimer((Logger) null, Object.class, ""); @@ -289,6 +306,7 @@ public void testLogTime_1() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testLogTime_2() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); @@ -309,6 +327,7 @@ public void testLogTime_2() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testMark_1() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); @@ -329,6 +348,7 @@ public void testMark_1() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testMark_2() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); @@ -349,6 +369,7 @@ public void testMark_2() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testMarkAndLog_1() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); @@ -369,6 +390,7 @@ public void testMarkAndLog_1() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testMarkAndLog_2() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); @@ -390,6 +412,7 @@ public void testMarkAndLog_2() * @generatedBy CodePro at 9/3/14 3:41 PM */ @Test + @DisabledIfEnvironmentVariable(named = "SKIP_METHODTIMER_TEST", matches = "true") public void testStart_1() throws Exception { MethodTimer fixture = new MethodTimer(LogManager.getLogger(LogManager.ROOT_LOGGER_NAME), Object.class, ""); diff --git a/api/src/test/java/com/intuit/tank/vm/common/util/ReportUtilCpTest.java b/api/src/test/java/com/intuit/tank/vm/common/util/ReportUtilCpTest.java index ff26139eb..7e2f13a51 100644 --- a/api/src/test/java/com/intuit/tank/vm/common/util/ReportUtilCpTest.java +++ b/api/src/test/java/com/intuit/tank/vm/common/util/ReportUtilCpTest.java @@ -77,25 +77,25 @@ public void testGetSummaryData_1() assertEquals(23, result.length); assertEquals("", result[0]); assertEquals("0", result[1]); - assertEquals("�", result[2]); - assertEquals("�", result[3]); - assertEquals("�", result[4]); - assertEquals("�", result[5]); - assertEquals("�", result[6]); - assertEquals("�", result[7]); - assertEquals("�", result[8]); - assertEquals("�", result[9]); - assertEquals("�", result[10]); - assertEquals("�", result[11]); - assertEquals("�", result[12]); - assertEquals("�", result[13]); - assertEquals("�", result[14]); - assertEquals("�", result[15]); - assertEquals("�", result[16]); - assertEquals("�", result[17]); - assertEquals("�", result[18]); - assertEquals("�", result[19]); - assertEquals("�", result[20]); + assertEquals("NaN", result[2]); + assertEquals("NaN", result[3]); + assertEquals("NaN", result[4]); + assertEquals("NaN", result[5]); + assertEquals("NaN", result[6]); + assertEquals("NaN", result[7]); + assertEquals("NaN", result[8]); + assertEquals("NaN", result[9]); + assertEquals("NaN", result[10]); + assertEquals("NaN", result[11]); + assertEquals("NaN", result[12]); + assertEquals("NaN", result[13]); + assertEquals("NaN", result[14]); + assertEquals("NaN", result[15]); + assertEquals("NaN", result[16]); + assertEquals("NaN", result[17]); + assertEquals("NaN", result[18]); + assertEquals("NaN", result[19]); + assertEquals("NaN", result[20]); assertEquals(null, result[21]); assertEquals(null, result[22]); } @@ -119,25 +119,25 @@ public void testGetSummaryData_2() assertEquals(23, result.length); assertEquals("", result[0]); assertEquals("0", result[1]); - assertEquals("�", result[2]); - assertEquals("�", result[3]); - assertEquals("�", result[4]); - assertEquals("�", result[5]); - assertEquals("�", result[6]); - assertEquals("�", result[7]); - assertEquals("�", result[8]); - assertEquals("�", result[9]); - assertEquals("�", result[10]); - assertEquals("�", result[11]); - assertEquals("�", result[12]); - assertEquals("�", result[13]); - assertEquals("�", result[14]); - assertEquals("�", result[15]); - assertEquals("�", result[16]); - assertEquals("�", result[17]); - assertEquals("�", result[18]); - assertEquals("�", result[19]); - assertEquals("�", result[20]); + assertEquals("NaN", result[2]); + assertEquals("NaN", result[3]); + assertEquals("NaN", result[4]); + assertEquals("NaN", result[5]); + assertEquals("NaN", result[6]); + assertEquals("NaN", result[7]); + assertEquals("NaN", result[8]); + assertEquals("NaN", result[9]); + assertEquals("NaN", result[10]); + assertEquals("NaN", result[11]); + assertEquals("NaN", result[12]); + assertEquals("NaN", result[13]); + assertEquals("NaN", result[14]); + assertEquals("NaN", result[15]); + assertEquals("NaN", result[16]); + assertEquals("NaN", result[17]); + assertEquals("NaN", result[18]); + assertEquals("NaN", result[19]); + assertEquals("NaN", result[20]); assertEquals(null, result[21]); assertEquals(null, result[22]); } diff --git a/api/src/test/java/com/intuit/tank/vm/settings/CloudCredentialsCpTest.java b/api/src/test/java/com/intuit/tank/vm/settings/CloudCredentialsCpTest.java index 9b293fa18..5e634a873 100644 --- a/api/src/test/java/com/intuit/tank/vm/settings/CloudCredentialsCpTest.java +++ b/api/src/test/java/com/intuit/tank/vm/settings/CloudCredentialsCpTest.java @@ -16,9 +16,6 @@ import org.apache.commons.configuration.HierarchicalConfiguration; import org.junit.jupiter.api.*; -import com.intuit.tank.vm.settings.CloudCredentials; -import com.intuit.tank.vm.settings.CloudProvider; - import static org.junit.jupiter.api.Assertions.*; /** @@ -42,10 +39,10 @@ public void testCloudCredentials_1() CloudCredentials result = new CloudCredentials(config); assertNotNull(result); - assertEquals(null, result.getKey()); - assertEquals(null, result.getProxyHost()); - assertEquals(null, result.getProxyPort()); - assertEquals(null, result.getKeyId()); + assertNull(result.getKey()); + assertNull(result.getProxyHost()); + assertNull(result.getProxyPort()); + assertNull(result.getKeyId()); } /** @@ -62,7 +59,7 @@ public void testGetKey_1() String result = fixture.getKey(); - assertEquals(null, result); + assertNull(result); } /** @@ -79,7 +76,7 @@ public void testGetKeyId_1() String result = fixture.getKeyId(); - assertEquals(null, result); + assertNull(result); } /** @@ -96,7 +93,7 @@ public void testGetProxyHost_1() String result = fixture.getProxyHost(); - assertEquals(null, result); + assertNull(result); } /** @@ -113,7 +110,7 @@ public void testGetProxyPort_1() String result = fixture.getProxyPort(); - assertEquals(null, result); + assertNull(result); } /** diff --git a/api/src/test/java/com/intuit/tank/vm/settings/InstanceDescriptionDefaultsCpTest.java b/api/src/test/java/com/intuit/tank/vm/settings/InstanceDescriptionDefaultsCpTest.java index cf41b9965..8013450a6 100644 --- a/api/src/test/java/com/intuit/tank/vm/settings/InstanceDescriptionDefaultsCpTest.java +++ b/api/src/test/java/com/intuit/tank/vm/settings/InstanceDescriptionDefaultsCpTest.java @@ -18,11 +18,6 @@ import static org.junit.jupiter.api.Assertions.*; -import java.util.List; - -import com.intuit.tank.vm.api.enumerated.VMSize; -import com.intuit.tank.vm.settings.InstanceDescriptionDefaults; - /** * The class InstanceDescriptionDefaultsCpTest contains tests for the class * {@link InstanceDescriptionDefaults}. diff --git a/api/src/test/java/com/intuit/tank/vm/settings/InstanceTagTest.java b/api/src/test/java/com/intuit/tank/vm/settings/InstanceTagTest.java new file mode 100644 index 000000000..e013c7198 --- /dev/null +++ b/api/src/test/java/com/intuit/tank/vm/settings/InstanceTagTest.java @@ -0,0 +1,30 @@ +package com.intuit.tank.vm.settings; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Purpose: test InstanceTag class + * + * @author : atayal + **/ +public class InstanceTagTest { + @Test + void testInstanceTag() { + InstanceTag tag = new InstanceTag("tag1", "val1"); + InstanceTag tag2 = new InstanceTag("tag2", "val2"); + Assertions.assertEquals("tag1", tag.getName()); + Assertions.assertEquals("val1", tag.getValue()); + Map tags = new LinkedHashMap<>(); + tags.put(tag, 1); + tags.put(tag2, 2); + assert tag != tag2; + Assertions.assertNotEquals(tag, tag2); + Assertions.assertNotEquals(tag, ""); + Assertions.assertEquals("tag1 = val1", tag.toString()); + + } +} diff --git a/api/src/test/java/com/intuit/tank/vm/settings/ModificationTypeTest.java b/api/src/test/java/com/intuit/tank/vm/settings/ModificationTypeTest.java new file mode 100644 index 000000000..ba94399b9 --- /dev/null +++ b/api/src/test/java/com/intuit/tank/vm/settings/ModificationTypeTest.java @@ -0,0 +1,19 @@ +package com.intuit.tank.vm.settings; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * Purpose: Test ModificationType Enum + * + * @author : atayal + **/ +public class ModificationTypeTest { + + @Test + void testModificationTypeEnum() { + ModificationType type = ModificationType.valueOf("ADD"); + Assertions.assertNotNull(type); + assert ModificationType.ADD == type; + } +} diff --git a/api/src/test/java/com/intuit/tank/vm/settings/ModifiedEntityMessageTest.java b/api/src/test/java/com/intuit/tank/vm/settings/ModifiedEntityMessageTest.java new file mode 100644 index 000000000..23ce72b71 --- /dev/null +++ b/api/src/test/java/com/intuit/tank/vm/settings/ModifiedEntityMessageTest.java @@ -0,0 +1,9 @@ +package com.intuit.tank.vm.settings; + +/** + * Purpose: + * + * @author : atayal + **/ +public class ModifiedEntityMessageTest { +} diff --git a/api/src/test/java/com/intuit/tank/vm/settings/PropertiesFileTest.java b/api/src/test/java/com/intuit/tank/vm/settings/PropertiesFileTest.java new file mode 100644 index 000000000..33a345090 --- /dev/null +++ b/api/src/test/java/com/intuit/tank/vm/settings/PropertiesFileTest.java @@ -0,0 +1,9 @@ +package com.intuit.tank.vm.settings; + +/** + * Purpose: + * + * @author : atayal + **/ +public class PropertiesFileTest { +} diff --git a/api/src/test/java/com/intuit/tank/vm/settings/ReportingConfigTest.java b/api/src/test/java/com/intuit/tank/vm/settings/ReportingConfigTest.java new file mode 100644 index 000000000..d7169c3fb --- /dev/null +++ b/api/src/test/java/com/intuit/tank/vm/settings/ReportingConfigTest.java @@ -0,0 +1,9 @@ +package com.intuit.tank.vm.settings; + +/** + * Purpose: + * + * @author : atayal + **/ +public class ReportingConfigTest { +} diff --git a/api/src/test/resources/sampleProp.properties b/api/src/test/resources/sampleProp.properties new file mode 100644 index 000000000..86fbde046 --- /dev/null +++ b/api/src/test/resources/sampleProp.properties @@ -0,0 +1,2 @@ +a=1 +b=2 \ No newline at end of file diff --git a/api/src/test/resources/settings.xml b/api/src/test/resources/settings.xml index 33baad811..fdcba513c 100644 --- a/api/src/test/resources/settings.xml +++ b/api/src/test/resources/settings.xml @@ -3,23 +3,23 @@ - datafiles + or relative path or an s3 bucket by prefixing a bucket with s3: e.g. s3:tank-data-files + datafiles --> - - timing + timing --> - - jars + - - tmpfiles + tank @@ -27,16 +27,16 @@ http://localhost:8080/tank - false false - - true + false @@ -67,9 +67,9 @@ - - @@ -98,11 +98,11 @@ 30000 - 5000 - 180000 @@ -157,7 +157,7 @@ - security_group @@ -172,24 +172,23 @@ - - AWS_SECRET_KEY_ID - AWS_SECRET_KEY - tank_admin - + + + [AMI-ID] [KEYPAIR] @@ -199,8 +198,9 @@ - + + [SSM-AMI-ID] [AMI-ID] [KEYPAIR] @@ -212,25 +212,20 @@ - - - - - + + + + + - 5m - 10m @@ -239,16 +234,10 @@ 30s - - - 50 - 10 - - com.intuit.tank.persistence.databases.AmazonDynamoDatabaseDocApi - - + com.intuit.tank.persistence.databases.CloudWatchDataSource diff --git a/assets/cleanup_prior_to_3.0.0.sql b/assets/cleanup_prior_to_3.0.0.sql new file mode 100644 index 000000000..6c1b5825b --- /dev/null +++ b/assets/cleanup_prior_to_3.0.0.sql @@ -0,0 +1,37 @@ +/* +Script to help cleanup the abandoned rows in the searlized_script_step table +Recommed running one line at a time, and validating the output +*/ + +SELECT count(*) FROM tank.serialized_script_step; +SELECT count(*) FROM tank.script; +SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES +WHERE TABLE_SCHEMA = 'tank' AND TABLE_NAME = 'serialized_script_step'; + +CREATE TABLE IF NOT EXISTS tank.serialized_script_step_temp +( + `id` int(11) NOT NULL AUTO_INCREMENT, + `created` datetime NOT NULL, + `modified` datetime NOT NULL, + `serialized_data` longblob NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8 +SELECT steps.* +FROM tank.serialized_script_step AS steps +JOIN tank.script AS script +ON script.serial_step_id=steps.id; + +SELECT count(*) FROM tank.serialized_script_step_temp; + +ALTER TABLE tank.script DROP FOREIGN KEY FKC9E5D0CBD63BDD22; + +RENAME TABLE tank.serialized_script_step TO tank.serialized_script_step_old; +RENAME TABLE tank.serialized_script_step_temp TO tank.serialized_script_step; + +ALTER TABLE tank.script ADD CONSTRAINT `FKC9E5D0CBD63BDD22` FOREIGN KEY (`serial_step_id`) REFERENCES `serialized_script_step` (`id`); + + +/* +Validate scripts in Tank before performing the DROP +*/ +DROP TABLE tank.serialized_script_step_old; diff --git a/assets/settings-all-in-one.xml b/assets/settings-all-in-one.xml new file mode 100644 index 000000000..15d8bd18f --- /dev/null +++ b/assets/settings-all-in-one.xml @@ -0,0 +1,490 @@ + + + + +datafiles + +timing + +tmpfiles + +jars + +tank-demo-all-in-one + +http://localhost:8080 + +true + +false + + + All Products + My Product + + + + + + + + + localhost + 25 + do_not_reply@mydomain.com + + + + + + + com.intuit.tank.reporting.rest.RestResultsReporter + com.intuit.tank.reporting.rest.RestResultsReader + + + + + + + + + + + + /tmp + + + 8090 + + + 5000 + + + 360000 + + + 15000 + + 30000 + + + 5000 + + + 180000 + + + 7200000 + + + false + + + false + + + false + + + 30 + + + + .*text.* + .*json.* + .*xml.* + + + + +
test_flag
+
+ + +
+ + US_EAST + + + false + + + + + + + + security_group + myKey + false + + + + + + AWS_SECRET_KEY_ID + AWS_SECRET_KEY + + + + + + + + + + [AMI-ID] + [KEYPAIR] + + + + + + [AMI-ID] + [KEYPAIR] + + + + + + + + + + + + + + + + + 5m + + 10m + + 2 + + 30s + + + + com.intuit.tank.persistence.databases.CloudWatchDataSource + + + + + + + admin + user + script-manager + project-manager + job-manager + guest + + + + + + + user + project-manager + + + + + project-manager + + + + + project-manager + + + + + + user + script-manager + + + + + script-manager + + + + + script-manager + + + + + + user + script-manager + + + + + script-manager + + + + + script-manager + + + + + + user + script-manager + project-manager + + + + + script-manager + project-manager + + + + + + job-manager + project-manager + + + + + + + admin + admin + admin@example.com + admin + + + + + + + + + + + + +
diff --git a/assets/tankIcon.png b/assets/tankIcon.png new file mode 100644 index 000000000..10bd99890 Binary files /dev/null and b/assets/tankIcon.png differ diff --git a/aws-config/tank_agent.yml b/aws-config/tank_agent.yml new file mode 100644 index 000000000..6fa38953b --- /dev/null +++ b/aws-config/tank_agent.yml @@ -0,0 +1,177 @@ +AWSTemplateFormatVersion: '2010-09-09' +Description: 'Creates the base Tank Agent that can be snapshotted for use in tank.' +Parameters: + AmiId: + Type: 'AWS::EC2::Image::Id' + Description: The ID of the latest Amazon Linux 2 baseline AMI + TankZip: + Type: 'String' + Default: 'TankZip.zip' + Description: File path to Tank agent-startup-pkg.zip Filename in S3 (ie. s3://bucket/keyname) + InstanceType: + Description: Amazon EC2 instance type + Type: 'String' + Default: 'c5.large' + KeyName: + Type: 'AWS::EC2::KeyPair::KeyName' + Description: Amazon EC2 Key Pair + SubnetIds: + Type: 'List' + Description: Subnet IDs + SecurityGroupIds: + Type: 'List' + Description: SecurityGroup IDs + +Resources: + AgentInstance: + Type: AWS::EC2::Instance + Metadata: + AWS::CloudFormation::Init: + configSets: + default: + - 'cloudwatch-install' + - 'agent-install' + cloudwatch-install: + packages: {} + sources: {} + files: + /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/tank-cloudwatch-config.json: + content: | + {"logs":{"force_flush_interval":5,"logs_collected":{ + "files":{"collect_list":[{"file_path":"/opt/tank_agent/logs/agent.log","log_group_name":"/opt/tank_agent/logs/agent.log","log_stream_name":"{instance_id}"}]}}}, + "metrics":{"append_dimensions":{"InstanceId":"${aws:InstanceId}"},"metrics_collected":{ + "netstat":{"measurement":["tcp_established","tcp_syn_sent","tcp_close"],"append_dimensions":{"Service":"TankAgent"},"metrics_collection_interval":60}, + "disk":{"measurement":["used_percent"],"resources":["/"],"append_dimensions":{"Service":"TankAgent"},"metrics_collection_interval":60}, + "mem":{"measurement":["mem_used_percent"],"append_dimensions":{"Service":"TankAgent"},"metrics_collection_interval":60}}}} + mode: '000644' + owner: 'cwagent' + group: 'cwagent' + commands: {} + services: + sysvinit: + amazon-cloudwatch-agent: + enabled: 'true' + ensureRunning: 'true' + files: + - "/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/tank-cloudwatch-config.json" + users: {} + groups: {} + agent-install: + packages: + yum: + unzip: [] + java-11-amazon-corretto-headless: [] + sources: {} + files: + /etc/init.d/tank_agent: + content: | + #!/bin/bash + # tank_agent + # chkconfig: 2345 99 99 + # description: agent for Tank project + ### BEGIN INIT INFO + # Provides: $tank_agent + ### END INIT INFO + # Source function library. + . /etc/init.d/functions + + RETVAL=0 + umask 077 + start() { + echo -n $"Starting Tank Agent: " + pushd /opt/tank_agent + ulimit -n 20000; + ulimit -a >> /tmp/ulimit_out; + daemon /opt/tank_agent/run.sh& + echo + return $RETVAL + } + stop() { + echo -n $"Shutdown agent startup: " + kill -9 `ps -ef | grep agent-startup-all | grep -v grep | awk '{print $2}'` + return $RETVAL + } + restart() { + stop + start + } + case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|reload) + restart + ;; + *) + echo $"Usage: $0 {start|stop|restart}" + exit 1 + esac + exit $? + mode: '000755' + owner: 'root' + group: 'root' + commands: + 010_update_DNS_in_security: + command: 'sed -i.bak "s/networkaddress.cache.negative.ttl=10/networkaddress.cache.negative.ttl=0/g" /etc/alternatives/jre/conf/security/java.security' + 020_download_startup_pkg: + command: !Sub 'aws s3 cp ${TankZip} /tmp/agent-startup-pkg.zip' + 021_unzip_startup_pkg: + command: 'unzip /tmp/agent-startup-pkg.zip -d /opt' + 022_mkdir_logs: + command: 'mkdir /opt/tank_agent/logs' + 030_increase_Ephemeral Ports: + command: 'echo "net.ipv4.ip_local_port_range=1024 65000" >> /etc/sysctl.conf' + 031_set_file_open_limit: + command: 'sed -i "s/#DefaultLimitNOFILE=/DefaultLimitNOFILE=81960/" /etc/systemd/system.conf' + 032_set_file_open_limit: + command: 'sed -i "s/#DefaultLimitNOFILE=/DefaultLimitNOFILE=81960/" /etc/systemd/user.conf' + services: + sysvinit: + tank_agent: + enabled: 'true' + ensureRunning: 'true' + users: {} + groups: {} + Properties: + ImageId: !Ref AmiId + InstanceType: !Ref InstanceType + SecurityGroupIds: !Ref SecurityGroupIds + KeyName: !Ref KeyName + SubnetId: !Ref SubnetIds + Tags: + - Key: 'Name' + Value: 'Tank Agent AMI' + UserData: + Fn::Base64: !Sub | + #!/bin/bash -v + # Ensure our PATH is set correctly (on Amazon Linux cfn-signal is in /opt/aws/bin) + . ~/.bash_profile + yum -y update + cfn-init -v \ + --region ${AWS::Region} \ + --stack ${AWS::StackName} \ + --resource AgentInstance + cfn-signal -e $? \ + --region ${AWS::Region} \ + --stack ${AWS::StackName} \ + '${UIInstanceWaitHandle}' + UIInstanceWaitHandle: + Type: AWS::CloudFormation::WaitConditionHandle + Properties: {} + UIInstanceWaitCondition: + Type: AWS::CloudFormation::WaitCondition + DependsOn: AgentInstance + Properties: + Handle: !Ref UIInstanceWaitHandle + Timeout: '1500' + +Outputs: + AgentInstanceId: + Description: InstanceId of the newly created agent instance + Value: !Ref AgentInstance + AZ: + Description: Availability Zone of the newly created EC2 instance + Value: !GetAtt [ 'AgentInstance', 'AvailabilityZone' ] diff --git a/aws-config/tank_controller.yml b/aws-config/tank_controller.yml new file mode 100644 index 000000000..6357b191d --- /dev/null +++ b/aws-config/tank_controller.yml @@ -0,0 +1,289 @@ +AWSTemplateFormatVersion: 2010-09-09 +Description: Controller Instance - Creates a Tank controller installing java tomcat and configuring the instances appropriately. +Parameters: + AmiId: + Type: AWS::SSM::Parameter::Value + Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 + Description: The ID of the latest Amazon Linux 2 baseline AMI + KeyName: + Type: AWS::EC2::KeyPair::KeyName + Description: Name of an existing EC2 KeyPair to enable SSH access to the instance. + SubnetId: + Type: AWS::EC2::Subnet::Id + Description: Private subnet for the internal instance ip + TankWar: + Type: String + Description: File path to Tank tank.war Filename in S3 (ie. s3://bucket/keyname) + TankSettings: + Type: String + Description: File path to Tank settings.xml Filename in S3 (ie. s3://bucket/keyname) + RdsPassword: + Type: String + NoEcho: true + Description: Something secret (more than 8 characters) + InstanceType: + Description: EC2 instance type + Type: String + Default: t3a.medium + AllowedValues: [ 't3a.medium', 't3.medium', 't3a.large', 't3.large', 't3a.xlarge', 't3.xlarge', 'm5.large', 'm5.xlarge', 'c5.xlarge', 'c5.2xlarge' ] + ConstraintDescription: Must be one of t3.medium t3.large t3.xlarge m5.large m5.xlarge c5.xlarge or c5.2xlarge + +Mappings: + InstanceMap: + t3a.medium: + JvmHeap: '2g' + t3.medium: + JvmHeap: '2g' + t3a.large: + JvmHeap: '4g' + t3.large: + JvmHeap: '4g' + t3a.xlarge: + JvmHeap: '10g' + t3.xlarge: + JvmHeap: '10g' + c5.large: + JvmHeap: '1g' + c5.xlarge: + JvmHeap: '5g' + c5.2xlarge: + JvmHeap: '8g' + m5.large: + JvmHeap: '4g' + m5.xlarge: + JvmHeap: '10g' + +Resources: + RDSInstance: + Type: AWS::RDS::DBInstance + Properties: + DBInstanceIdentifier: tank + AutoMinorVersionUpgrade: true + DBInstanceClass: db.t3.large + Port: 3306 + AllocatedStorage: 100 + BackupRetentionPeriod: 30 + DBName: tank + Engine: mysql + EngineVersion: 8.0.21 + MasterUsername: admin + MasterUserPassword: !Ref RdsPassword + DBSecurityGroups: + - !Ref RDSSecurityGroup + + RDSSecurityGroup: + Type: AWS::RDS::DBSecurityGroup + Properties: + GroupDescription: Ingress for Amazon EC2 security group + DBSecurityGroupIngress: + - EC2SecurityGroupName: !Ref SecurityGroup + + SecurityGroup: + Type: AWS::EC2::SecurityGroup + Properties: + GroupDescription: Allow ssh and http tomcat to client host + SecurityGroupIngress: + - IpProtocol: tcp + FromPort: 22 + ToPort: 22 + CidrIp: 0.0.0.0/0 + - IpProtocol: tcp + FromPort: 8080 + ToPort: 8080 + CidrIp: 0.0.0.0/0 + + ControllerInstance: + Type: AWS::EC2::Instance + Metadata: + AWS::CloudFormation::Init: + configSets: + default: ['pre-install', 'tomcat-install' ] + pre-install: + packages: + yum: + amazon-cloudwatch-agent: [] + rpm: + xray-daemon: 'https://s3.dualstack.us-east-2.amazonaws.com/aws-xray-assets.us-east-2/xray-daemon/aws-xray-daemon-3.x.rpm' + groups: {} + users: {} + sources: {} + files: + /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/tank-cloudwatch-config.json: + content: | + {"logs":{"force_flush_interval":5,"logs_collected":{ + "files":{"collect_list":[ + {"file_path":"/opt/tomcat/logs/tank.log","log_group_name":"/opt/tomcat/logs/tank.log","log_stream_name":"{instance_id}"}, + {"file_path":"/var/log/messages","log_group_name":"/var/log/messages","log_stream_name":"{instance_id}"}]}}}, + "metrics":{"append_dimensions":{"InstanceId":"${aws:InstanceId}","InstanceType":"${aws:InstanceType}"},"metrics_collected":{ + "disk":{"measurement":["used_percent"],"resources":["/"],"append_dimensions":{"Service":"Tank"},"metrics_collection_interval":60}, + "mem":{"measurement":["mem_used_percent"],"append_dimensions":{"Service":"Tank"},"metrics_collection_interval":60}}}} + mode: '000644' + owner: 'cwagent' + group: 'cwagent' + commands: + 000_install_epel: + command: 'amazon-linux-extras install epel' #For tomcat-native + services: + amazon-cloudwatch-agent: + enabled: 'true' + ensureRunning: 'true' + files: + - "/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/tank-cloudwatch-config.json" + tomcat-install: + packages: + yum: + tomcat-native: [] + java-11-amazon-corretto-headless: [] + sources: + /opt: 'http://archive.apache.org/dist/tomcat/tomcat-9/v9.0.39/bin/apache-tomcat-9.0.39.tar.gz' + files: + /etc/init.d/tomcat: + content: | + #!/bin/bash + # + # tomcat Start tomcat + # + # + # chkconfig: 345 88 12 + # description: start stop tomcat + ### BEGIN INIT INFO + # Provides: $tomcat + ### END INIT INFO + # Source function library. + . /etc/init.d/functions + . /etc/init.d/java_opts + + ulimit -n 50000 + export CATALINA_HOME=/opt/tomcat + RETVAL=0 + umask 077 + start() { + cd $CATALINA_HOME + echo -n $"Starting tomcat: " + daemon $CATALINA_HOME/bin/startup.sh + echo + return $RETVAL + } + stop() { + echo -n $"Shutting down tomcat: " + daemon $CATALINA_HOME/bin/shutdown.sh + echo + return $RETVAL + } + restart() { + stop + start + } + case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|reload) + restart + ;; + *) + echo $"Usage: $0 {start|stop|restart}" + exit 1 + esac + exit $? + mode: '000755' + owner: 'root' + group: 'root' + /etc/init.d/java_opts: + content: !Sub + - | + export CATALINA_OPTS="-Xms${heap} -Xmx${heap} -XX:+UseG1GC -Dcom.amazonaws.sdk.enableDefaultMetrics=cloudwatchRegion=${AWS::Region} -Xlog:gc=debug:file=/opt/tomcat/logs/gc.log:time,uptime,level,tags:filecount=3,filesize=200m + - { + heap: !FindInMap [ InstanceMap, !Ref InstanceType, JvmHeap ] + } + mode: '000755' + owner: 'root' + group: 'root' + /tmp/context.xml: + content: !Sub | + + + + + + mode: '000644' + owner: 'root' + group: 'root' + commands: + 010_tomcat_symboliclink: + command: 'ln -snf /opt/apache-tomcat-9.0.39 /opt/tomcat' + 020_clear_out_builtin: + command: 'rm -rf /opt/tomcat/webapps/*' + 030_download_settings: + command: !Sub 'aws s3 cp ${TankSettings} /opt/tomcat/settings.xml' + #031_set_publicDNSName: + # command: !Sub 'sed -i "s/localhost:8080/${ControllerInstance.PublicDnsName}:8080/" /opt/tomcat/settings.xml' + 040_download_tank: + command: !Sub 'aws s3 cp ${TankWar} /opt/tomcat/webapps/ROOT.war' + 050_copy_context: + command: 'cp /tmp/context.xml /opt/tomcat/conf/context.xml' + services: + sysvinit: + tomcat: + enabled : true + ensureRunning: true + users: {} + groups: {} + Properties: + ImageId: !Ref AmiId + InstanceType: !Ref InstanceType + IamInstanceProfile: !ImportValue TankControllerProfile + SecurityGroupIds: + - !GetAtt SecurityGroup.GroupId + KeyName: !Ref KeyName + SubnetId: !Ref SubnetId + Tags: + - + Key: Name + Value: Tank + UserData: + Fn::Base64: !Sub | + #!/bin/bash -v + # Ensure our PATH is set correctly (on Amazon Linux cfn-signal is in /opt/aws/bin) + . ~/.bash_profile + yum update -y + /opt/aws/bin/cfn-init -v \ + --region ${AWS::Region} \ + --stack ${AWS::StackName} \ + --resource ControllerInstance + /opt/aws/bin/cfn-signal -e $? \ + --region ${AWS::Region} \ + --stack ${AWS::StackName} \ + '${UIInstanceWaitHandle}' + UIInstanceWaitHandle: + Type: AWS::CloudFormation::WaitConditionHandle + Properties: {} + UIInstanceWaitCondition: + Type: AWS::CloudFormation::WaitCondition + DependsOn: ControllerInstance + Properties: + Handle: !Ref UIInstanceWaitHandle + Timeout: 1800 + +Outputs: + InstanceId: + Description: InstanceId of the newly created controller instance + Value: !Ref ControllerInstance + PublicDnsName: + Description: PublicDnsName endpoint of the newly created ControllerInstance + Value: !GetAtt [ 'ControllerInstance', 'PublicDnsName' ] diff --git a/aws-config/tank_instanceProfiles.yml b/aws-config/tank_instanceProfiles.yml new file mode 100644 index 000000000..675aae485 --- /dev/null +++ b/aws-config/tank_instanceProfiles.yml @@ -0,0 +1,84 @@ +AWSTemplateFormatVersion: 2010-09-09 +Description: Create Controller and Agent IAM Instance Profiles for Intuit/Tank installation +Resources: + ControllerProfile: + Type: AWS::IAM::InstanceProfile + Properties: + Path: / + Roles: + - !Ref ControllerRole + ControllerRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: 2012-10-17 + Statement: + - + Effect: Allow + Action: sts:AssumeRole + Principal: + Service: + - ec2.amazonaws.com + Path: / + ManagedPolicyArns: + - arn:aws:iam::aws:policy/AmazonEC2FullAccess + - arn:aws:iam::aws:policy/AmazonS3FullAccess + - arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess + - arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy + Policies: + - + PolicyName: tank-controller-role + PolicyDocument: + Version: 2012-10-17 + Statement: + - + Effect: Allow + Action: + - iam:PassRole + - iam:ListInstanceProfiles + - iam:AddRoleToInstanceProfile + - appconfig:GetConfiguration + Resource: "*" + AgentProfile: + Type: AWS::IAM::InstanceProfile + Properties: + Path: / + Roles: + - !Ref AgentRole + AgentRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: 2012-10-17 + Statement: + - + Effect: Allow + Action: sts:AssumeRole + Principal: + Service: ec2.amazonaws.com + Path: / + ManagedPolicyArns: + - arn:aws:iam::aws:policy/AmazonS3FullAccess + - arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy + +Outputs: + TankControllerProfile: + Description: Tank Controller Profile + Value: !Ref ControllerProfile + Export: + Name: TankControllerProfile + TankControllerRole: + Description: Tank Controller Role + Value: !Ref ControllerRole + Export: + Name: TankControllerRole + TankAgentProfile: + Description: Tank Agent Profile + Value: !Ref AgentProfile + Export: + Name: TankAgentProfile + TankAgentRole: + Description: Tank Agent Role + Value: !Ref AgentRole + Export: + Name: TankAgentRole diff --git a/buildspec.yml b/buildspec.yml index 7a89ab0e3..65a314259 100644 --- a/buildspec.yml +++ b/buildspec.yml @@ -3,15 +3,29 @@ version: 0.2 env: variables: MAVEN_OPTS: "-Xms1g -Xmx2g" + SKIP_METHODTIMER_TEST: true phases: + install: + runtime-versions: + java: corretto11 build: commands: - - mvn clean install -P release + - java -version + - mvn clean install surefire-report:report -P release + +reports: + SurefireReports: # CodeBuild will create a report group called "SurefireReports". + files: #Store all of the files + - '**/*' + base-directory: 'web/web_support/target/surefire-reports' # Location of the reports artifacts: - type: NONE files: - web/web_ui/target/tank.war - agent/agent_startup_pkg/target/agent-startup-pkg.zip discard-paths: yes + +cache: + paths: + - '/root/.m2/**/*' diff --git a/data_access/pom.xml b/data_access/pom.xml index e66f2e1c5..c37f68048 100644 --- a/data_access/pom.xml +++ b/data_access/pom.xml @@ -6,7 +6,7 @@ com.intuit.tank tank-parent - 2.3.4 + 3.0.0 diff --git a/data_access/src/main/java/com/intuit/tank/dao/GroupDao.java b/data_access/src/main/java/com/intuit/tank/dao/GroupDao.java index 610f6c94c..a0a6aac35 100644 --- a/data_access/src/main/java/com/intuit/tank/dao/GroupDao.java +++ b/data_access/src/main/java/com/intuit/tank/dao/GroupDao.java @@ -26,9 +26,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.Collections; -import java.util.List; - /** * GroupDao * diff --git a/data_access/src/main/java/com/intuit/tank/dao/JobNotificationDao.java b/data_access/src/main/java/com/intuit/tank/dao/JobNotificationDao.java index 6bd7c69eb..fcbc4ce45 100644 --- a/data_access/src/main/java/com/intuit/tank/dao/JobNotificationDao.java +++ b/data_access/src/main/java/com/intuit/tank/dao/JobNotificationDao.java @@ -61,8 +61,10 @@ public JobNotification findRevision(int id, int revisionNumber) { begin(); AuditReader reader = AuditReaderFactory.get(getEntityManager()); result = reader.find(JobNotification.class, id, revisionNumber); - Hibernate.initialize(result.getLifecycleEvents()); - result.getLifecycleEvents().contains(JobLifecycleEvent.QUEUE_ADD); + if(result != null) { + Hibernate.initialize(result.getLifecycleEvents()); + result.getLifecycleEvents().contains(JobLifecycleEvent.QUEUE_ADD); + } commit(); } catch (NoResultException e) { rollback(); diff --git a/data_access/src/main/java/com/intuit/tank/dao/JobQueueDao.java b/data_access/src/main/java/com/intuit/tank/dao/JobQueueDao.java index 40cd21754..c5cac31a8 100644 --- a/data_access/src/main/java/com/intuit/tank/dao/JobQueueDao.java +++ b/data_access/src/main/java/com/intuit/tank/dao/JobQueueDao.java @@ -25,16 +25,10 @@ import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Fetch; -import javax.persistence.criteria.JoinType; import javax.persistence.criteria.Root; -import com.intuit.tank.project.JobInstance; -import com.intuit.tank.project.Project; -import com.intuit.tank.project.Workload; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.hibernate.LockOptions; import com.intuit.tank.project.JobQueue; diff --git a/data_access/src/main/java/com/intuit/tank/dao/ProjectDao.java b/data_access/src/main/java/com/intuit/tank/dao/ProjectDao.java index 659c2982b..b31215990 100644 --- a/data_access/src/main/java/com/intuit/tank/dao/ProjectDao.java +++ b/data_access/src/main/java/com/intuit/tank/dao/ProjectDao.java @@ -116,7 +116,7 @@ public synchronized Project saveOrUpdateProject(Project project) { } @Override - public Project saveOrUpdate(Project entity) throws HibernateException { + public Project saveOrUpdate(@Nonnull Project entity) throws HibernateException { entity.setModified(new Date()); return super.saveOrUpdate(entity); } diff --git a/data_access/src/main/java/com/intuit/tank/dao/ScriptDao.java b/data_access/src/main/java/com/intuit/tank/dao/ScriptDao.java index d9293e6f6..1bf6d705a 100644 --- a/data_access/src/main/java/com/intuit/tank/dao/ScriptDao.java +++ b/data_access/src/main/java/com/intuit/tank/dao/ScriptDao.java @@ -19,7 +19,9 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; +import java.util.Date; import java.util.List; +import java.util.zip.GZIPOutputStream; import javax.annotation.Nonnull; import javax.persistence.EntityManager; @@ -107,7 +109,6 @@ public void delete(Integer id) throws HibernateException { } LOG.debug("deleting entity " + entity.toString()); em.remove(entity); - commit(); } commit(); } catch (Exception e) { @@ -154,7 +155,7 @@ public Script loadScriptSteps(@Nonnull Script script) { if (script.getScriptSteps() == null || script.getScriptSteps().isEmpty()) { SerializedScriptStep serializedScriptStep = new SerializedScriptStepDao().findById(script .getSerializedScriptStepId()); - script.setSerializedSteps(serializedScriptStep); + script.deserializeSteps(serializedScriptStep); } return script; } @@ -174,17 +175,18 @@ public Script saveOrUpdate(Script script) { EntityManager em = getEntityManager(); try { begin(); - SerializedScriptStep serializedScriptStep = serialize(script.getScriptSteps()); + SerializedScriptStep serializedScriptStep = serialize(script); serializedScriptStep.setSerialzedData( Hibernate.getLobCreator(getHibernateSession()).createBlob(serializedScriptStep.getBytes())); - SerializedScriptStep serializedSteps = new SerializedScriptStepDao().saveOrUpdate(serializedScriptStep); + SerializedScriptStep savedSerializedStep = new SerializedScriptStepDao().saveOrUpdate(serializedScriptStep); script.setSerializedScriptStepId(serializedScriptStep.getId()); if (script.getId() == 0) { em.persist(script); } else { + script.setModified(new Date()); script = em.merge(script); } - LOG.debug("Saved Script Steps with id " + serializedSteps.getId() + " for script " + script.getId()); + LOG.debug("Saved Script Steps with id " + savedSerializedStep.getId() + " for script " + script.getId()); commit(); } catch (Exception e) { rollback(); @@ -198,16 +200,24 @@ public Script saveOrUpdate(Script script) { return script; } - public SerializedScriptStep serialize(List steps) { - try ( ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream s = new ObjectOutputStream(bos) ) { - // if (steps.size() > 0) { - s.writeObject(steps); - return new SerializedScriptStep(bos.toByteArray()); - // } + private SerializedScriptStep serialize(Script script) { + SerializedScriptStep serializedScriptStep = script.getId() > 0 ? + new SerializedScriptStepDao().findById(script.getSerializedScriptStepId()) : + null; + try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); + GZIPOutputStream gz = new GZIPOutputStream(bos); + ObjectOutputStream s = new ObjectOutputStream(gz) ) { + s.writeObject(script.getScriptSteps()); + s.close(); //Necessary to get the last few bites written + if ( serializedScriptStep != null) { + serializedScriptStep.setBytes(bos.toByteArray()); + } else { + serializedScriptStep = new SerializedScriptStep(bos.toByteArray()); + } } catch (IOException e) { throw new AnnotationException(e.toString()); } + return serializedScriptStep; } // private String getUniqueProjects(List steps) { diff --git a/data_access/src/main/java/com/intuit/tank/dao/UserDao.java b/data_access/src/main/java/com/intuit/tank/dao/UserDao.java index 2fb7f9cac..852f8dfb7 100644 --- a/data_access/src/main/java/com/intuit/tank/dao/UserDao.java +++ b/data_access/src/main/java/com/intuit/tank/dao/UserDao.java @@ -59,13 +59,12 @@ public UserDao() { @Nullable public User authenticate(@Nonnull String userName, @Nonnull String password) { User user = findByUserName(userName); - User result = null; if (user != null) { if (PasswordEncoder.validatePassword(password, user.getPassword())) { - result = user; + return user; } } - return result; + return null; } /** @@ -91,12 +90,12 @@ public User findByUserName(@Nonnull String userName) { commit(); } catch (NoResultException nre) { rollback(); - LOG.info("no entity matching username: " + userName, nre); + LOG.info("No entity matching username: " + userName); } catch (Exception e) { rollback(); String printQuery = (query != null) ? query.toString() : "Failed to connect to database: "; - LOG.info("no entity matching query: " + printQuery, e); + LOG.info("No entity matching query: " + printQuery, e); } finally { cleanup(); } diff --git a/data_access/src/test/java/com/intuit/tank/dao/BaseDaoTest.java b/data_access/src/test/java/com/intuit/tank/dao/BaseDaoTest.java new file mode 100644 index 000000000..13d93a059 --- /dev/null +++ b/data_access/src/test/java/com/intuit/tank/dao/BaseDaoTest.java @@ -0,0 +1,50 @@ +package com.intuit.tank.dao; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import com.intuit.tank.project.User; +import com.intuit.tank.test.TestGroups; + +public class BaseDaoTest { + + private BaseDao dao; + + @BeforeEach + public void configure() { + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.INFO); + ctx.updateLoggers(); + dao = new UserDao(); + } + + @Test + @Tag(TestGroups.FUNCTIONAL) + public void testBaseDao() throws Exception { + User entity = DaoTestUtil.createUserData("BaseTestUser1", "TestUser1_Password", "BaseTestUser1@intuit.com", "TestGroup1"); + List entities = new ArrayList(); + entities.add(entity); + dao.persistCollection(entities); + + List users = dao.findAll(); + for(User user: users) { + if(user.getEmail().equals(entity.getEmail())) { + assertEquals(entity.getName(), user.getName()); + break; + } + } + dao.delete(entity); + } +} diff --git a/data_access/src/test/java/com/intuit/tank/dao/DaoTestUtil.java b/data_access/src/test/java/com/intuit/tank/dao/DaoTestUtil.java index 4f0ca04f6..dcac76e86 100644 --- a/data_access/src/test/java/com/intuit/tank/dao/DaoTestUtil.java +++ b/data_access/src/test/java/com/intuit/tank/dao/DaoTestUtil.java @@ -17,6 +17,8 @@ */ import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; @@ -26,12 +28,19 @@ import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; +import com.intuit.tank.project.DataFile; +import com.intuit.tank.project.Group; +import com.intuit.tank.project.JobRegion; +import com.intuit.tank.project.PeriodicData; import com.intuit.tank.project.Project; import com.intuit.tank.project.Script; import com.intuit.tank.project.ScriptGroup; import com.intuit.tank.project.ScriptGroupStep; import com.intuit.tank.project.ScriptStep; +import com.intuit.tank.project.User; import com.intuit.tank.project.Workload; +import com.intuit.tank.vm.api.enumerated.VMRegion; +import com.intuit.tank.vm.common.PasswordEncoder; import static org.junit.jupiter.api.Assertions.*; @@ -61,7 +70,7 @@ public static Project createProject() { .productName("Test Product Name") .name("Test Project Name " + generateStringOfLength(15)).build(); } - + /** * Generate a new Workload object for testing. * @@ -180,5 +189,74 @@ public static void checkConstraintViolation(@Nonnull ConstraintViolationExceptio } fail("Constraint violation did not contain a violation on property " + property); } + + /** + * Generate a new PeriodicData object for testing. + * + * @return the PeriodicData + */ + public static PeriodicData createPeriodicData(int jobId, Date timestamp) { + return PeriodicData.builder() + .min(1) + .max(5) + .jobId(jobId) + .pageId("Test Page Id "+generateStringOfLength(5)) + .timestamp(timestamp) + .build(); + } + + /** + * Generate a new User object for testing. + * + * @return the User + */ + public static User createUserData(String userName, String password,String email, String group) { + Set groups = new HashSet(); + groups.add(createGroupData(group)); + return User.builder() + .name(userName) + .password(PasswordEncoder.encodePassword(password)) + .email(email) + .groups(groups) + .generateApiToken() + .build(); + } + + /** + * Generate a new Group object for testing. + * + * @return the Group + */ + public static Group createGroupData(String groupName) { + return Group.builder() + .name(groupName) + .build(); + } + + /** + * Generate a new DataFile object for testing. + * + * @return the DataFile + */ + public static DataFile createDataFileData(String fileName) { + return DataFile.builder() + .fileName(fileName) + .path("/test_path") + .comments("test_comments") + .creator("test_creator") + .build(); + } + + /** + * Generate a new JobRegion object for testing. + * + * @return the DataFile + */ + public static JobRegion createJobRegionData(String users) { + return JobRegion.builder() + .users(users) + .region(VMRegion.US_WEST_2) + .build(); + } } diff --git a/data_access/src/test/java/com/intuit/tank/dao/DataFileDaoTest.java b/data_access/src/test/java/com/intuit/tank/dao/DataFileDaoTest.java new file mode 100644 index 000000000..f1da5e04a --- /dev/null +++ b/data_access/src/test/java/com/intuit/tank/dao/DataFileDaoTest.java @@ -0,0 +1,57 @@ +package com.intuit.tank.dao; + +/* + * #%L + * Data Access + * %% + * Copyright (C) 2011 - 2015 Intuit Inc. + * %% + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * #L% + */ + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import com.intuit.tank.project.DataFile; +import com.intuit.tank.test.TestGroups; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class DataFileDaoTest { + private DataFileDao dao; + + @BeforeEach + public void configure() { + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.INFO); + ctx.updateLoggers(); + dao = new DataFileDao(); + } + + @Test + @Tag(TestGroups.FUNCTIONAL) + public void testStoreDataFile() throws Exception { + DataFile dataFile = DaoTestUtil.createDataFileData("TestFile"); + + String initialString = "text"; + InputStream targetStream = new ByteArrayInputStream(initialString.getBytes()); + + DataFile result = dao.storeDataFile(dataFile, targetStream); + assertEquals(dataFile.getFileName(), result.getFileName()); + + + } +} diff --git a/data_access/src/test/java/com/intuit/tank/dao/FilterGroupDaoTest.java b/data_access/src/test/java/com/intuit/tank/dao/FilterGroupDaoTest.java new file mode 100644 index 000000000..b98ecabae --- /dev/null +++ b/data_access/src/test/java/com/intuit/tank/dao/FilterGroupDaoTest.java @@ -0,0 +1,47 @@ +/** + * Copyright 2011 Intuit Inc. All Rights Reserved + */ +package com.intuit.tank.dao; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.List; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import com.intuit.tank.project.ScriptFilterGroup; +import com.intuit.tank.test.TestGroups; + +/** + * JobQueueDaoTest + * + * @author msreekakula + * + */ +public class FilterGroupDaoTest { + + private FilterGroupDao dao; + + @BeforeEach + public void setUp() { + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.INFO); + ctx.updateLoggers(); // This causes all Loggers to refetch information from their LoggerConfig. + dao = new FilterGroupDao(); + } + + @Test + @Tag(TestGroups.FUNCTIONAL) + public void testFindFilterGroups() throws Exception { + List configurations = dao.getFilterGroupsForProduct("Test"); + assertEquals(0, configurations.size()); + } + +} diff --git a/data_access/src/test/java/com/intuit/tank/dao/GroupDaoTest.java b/data_access/src/test/java/com/intuit/tank/dao/GroupDaoTest.java new file mode 100644 index 000000000..8598689f5 --- /dev/null +++ b/data_access/src/test/java/com/intuit/tank/dao/GroupDaoTest.java @@ -0,0 +1,77 @@ +package com.intuit.tank.dao; + +/* + * #%L + * Data Access + * %% + * Copyright (C) 2011 - 2015 Intuit Inc. + * %% + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * #L% + */ + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import com.intuit.tank.project.Group; +import com.intuit.tank.test.TestGroups; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class GroupDaoTest { + private GroupDao dao; + + @BeforeEach + public void configure() { + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.INFO); + ctx.updateLoggers(); + dao = new GroupDao(); + } + + @Test + @Tag(TestGroups.FUNCTIONAL) + public void testFindByName() throws Exception { + Group first = DaoTestUtil.createGroupData("testGroup"); + first = dao.saveOrUpdate(first); + + //Try to fetch the group which was created + Group result = dao.findByName("testGroup"); + assertEquals(first.getId(), result.getId()); + + //Try to fetch a group which was not created, it will return null value + result = dao.findByName("testGroup1"); + assertEquals(null,result); + + dao.delete(first); + } + + @Test + @Tag(TestGroups.FUNCTIONAL) + public void testGetOrCreateGroup() throws Exception { + Group first = DaoTestUtil.createGroupData("testGroup"); + first = dao.saveOrUpdate(first); + + //Try to create a group which was created earlier, it will not create a new group + // and will match with the group id + Group result = dao.getOrCreateGroup("testGroup"); + assertEquals(first.getId(), result.getId()); + + //Try to create a group with a new name, it will create a new group + Group result2 = dao.getOrCreateGroup("testGroup2"); + assertEquals("testGroup2", result2.getName()); + + dao.delete(first); + dao.delete(result2); + + } +} diff --git a/data_access/src/test/java/com/intuit/tank/dao/JobNotificationDaoTest.java b/data_access/src/test/java/com/intuit/tank/dao/JobNotificationDaoTest.java new file mode 100644 index 000000000..63484b45d --- /dev/null +++ b/data_access/src/test/java/com/intuit/tank/dao/JobNotificationDaoTest.java @@ -0,0 +1,56 @@ +/** + * Copyright 2011 Intuit Inc. All Rights Reserved + */ +package com.intuit.tank.dao; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import com.intuit.tank.project.JobNotification; +import com.intuit.tank.project.JobQueue; +import com.intuit.tank.test.TestGroups; + +/** + * JobQueueDaoTest + * + * @author msreekakula + * + */ +public class JobNotificationDaoTest { + + private JobNotificationDao dao; + + @BeforeEach + public void setUp() { + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.INFO); + ctx.updateLoggers(); // This causes all Loggers to refetch information from their LoggerConfig. + dao = new JobNotificationDao(); + } + + @Test + @Tag(TestGroups.FUNCTIONAL) + public void testFindRevisions() throws Exception { + JobNotification jobnotification = new JobNotification(); + jobnotification.setId(1); + jobnotification.setBody("Test"); + JobNotification result = dao.saveOrUpdate(jobnotification); + assertEquals(jobnotification.getBody(), result.getBody()); + JobNotification revisionJob = dao.findRevision(0,1); + assertEquals(null, revisionJob); + + } + +} diff --git a/data_access/src/test/java/com/intuit/tank/dao/JobQueueDaoTest.java b/data_access/src/test/java/com/intuit/tank/dao/JobQueueDaoTest.java new file mode 100644 index 000000000..0e0494ca7 --- /dev/null +++ b/data_access/src/test/java/com/intuit/tank/dao/JobQueueDaoTest.java @@ -0,0 +1,56 @@ +/** + * Copyright 2011 Intuit Inc. All Rights Reserved + */ +package com.intuit.tank.dao; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import com.intuit.tank.project.JobQueue; +import com.intuit.tank.test.TestGroups; + +/** + * JobQueueDaoTest + * + * @author msreekakula + * + */ +public class JobQueueDaoTest { + + private JobQueueDao dao; + + @BeforeEach + public void setUp() { + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.INFO); + ctx.updateLoggers(); // This causes all Loggers to refetch information from their LoggerConfig. + dao = new JobQueueDao(); + } + + @Test + @Tag(TestGroups.FUNCTIONAL) + public void testFindJobQueues() throws Exception { + JobQueue queue = dao.findOrCreateForProjectId(1); + assertEquals(1, queue.getId()); + JobQueue queue1 = dao.findForJobId(2); + assertEquals(null, queue1); + List queue2 = dao.getForProjectIds(Arrays.asList(1,2,3)); + assertEquals(1, queue2.size()); + List recentQueues = dao.findRecent(new Date()); + assertEquals(0, recentQueues.size()); + + } + +} diff --git a/data_access/src/test/java/com/intuit/tank/dao/JobRegionDaoTest.java b/data_access/src/test/java/com/intuit/tank/dao/JobRegionDaoTest.java new file mode 100644 index 000000000..e4f8aa289 --- /dev/null +++ b/data_access/src/test/java/com/intuit/tank/dao/JobRegionDaoTest.java @@ -0,0 +1,69 @@ +package com.intuit.tank.dao; + +/* + * #%L + * Data Access + * %% + * Copyright (C) 2011 - 2015 Intuit Inc. + * %% + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * #L% + */ + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Set; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import com.intuit.tank.project.JobRegion; +import com.intuit.tank.test.TestGroups; + +public class JobRegionDaoTest { + + private JobRegionDao dao; + + @BeforeEach + public void configure() { + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.INFO); + ctx.updateLoggers(); + dao = new JobRegionDao(); + } + + @Test + @Tag(TestGroups.FUNCTIONAL) + public void testCleanRegions() throws Exception { + JobRegion jobRegion3 = DaoTestUtil.createJobRegionData("TestUser_1"); + jobRegion3.setCreated(new Date()); + + JobRegion jobRegion2 = DaoTestUtil.createJobRegionData("TestUser_1"); + jobRegion2 = dao.saveOrUpdate(jobRegion2); + + JobRegion jobRegion1 = DaoTestUtil.createJobRegionData("TestUser_1"); + jobRegion1.setCreated(new Date()); + jobRegion1 = dao.saveOrUpdate(jobRegion1); + + + List jobRegions = new ArrayList(2); + jobRegions.add(jobRegion1); + jobRegions.add(jobRegion3); + + Set regions = dao.cleanRegions(jobRegions); + assertEquals(1, regions.size()); + + } +} diff --git a/data_access/src/test/java/com/intuit/tank/dao/PeriodicDataTest.java b/data_access/src/test/java/com/intuit/tank/dao/PeriodicDataTest.java new file mode 100644 index 000000000..d46a19e29 --- /dev/null +++ b/data_access/src/test/java/com/intuit/tank/dao/PeriodicDataTest.java @@ -0,0 +1,95 @@ +package com.intuit.tank.dao; + +/* + * #%L + * Data Access + * %% + * Copyright (C) 2011 - 2015 Intuit Inc. + * %% + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * #L% + */ + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import com.intuit.tank.project.PeriodicData; +import com.intuit.tank.test.TestGroups; + +public class PeriodicDataTest { + private PeriodicDataDao dao; + + @BeforeEach + public void configure() { + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.INFO); + ctx.updateLoggers(); + dao = new PeriodicDataDao(); + } + + @Test + @Tag(TestGroups.FUNCTIONAL) + public void testFindByJobId() throws Exception { + PeriodicData first = DaoTestUtil.createPeriodicData(1, new Date()); + first = dao.saveOrUpdate(first); + + PeriodicData second = DaoTestUtil.createPeriodicData(2, new Date()); + second = dao.saveOrUpdate(second); + + PeriodicData third = DaoTestUtil.createPeriodicData(3, new Date()); + third = dao.saveOrUpdate(third); + + List list = dao.findByJobId(2); + assertEquals(second.getJobId(), list.get(0).getJobId()); + } + + @Test + @Tag(TestGroups.FUNCTIONAL) + public void testFindByJobIdForDateRange() throws Exception { + Date tenDaysBeforeDate = getCustomDate(-10); + PeriodicData first = DaoTestUtil.createPeriodicData(1, tenDaysBeforeDate); + first = dao.saveOrUpdate(first); + + Date sevenDaysBeforeDate = getCustomDate(-7); + PeriodicData second = DaoTestUtil.createPeriodicData(2, sevenDaysBeforeDate); + second = dao.saveOrUpdate(second); + + Date fiveDaysBeforeDate = getCustomDate(-5); + PeriodicData third = DaoTestUtil.createPeriodicData(2, fiveDaysBeforeDate); + third = dao.saveOrUpdate(third); + + + Date fourDaysBeforeDate = getCustomDate(-4); + List list = dao.findByJobId(2, sevenDaysBeforeDate, fourDaysBeforeDate); + assertEquals(2, list.size()); + + //Even though PeriodicData exists with jobId, the date range is outside, so empty list is returned + list = dao.findByJobId(2, new Date(), new Date()); + assertEquals(0, list.size()); + + //If both dates are null, then PeriodicData matching the jobIds are returned + list = dao.findByJobId(2, null,null); + assertEquals(2, list.size()); + } + + private Date getCustomDate(int days) { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DATE, days); + return calendar.getTime(); + } +} diff --git a/data_access/src/test/java/com/intuit/tank/dao/ScriptDaoTest.java b/data_access/src/test/java/com/intuit/tank/dao/ScriptDaoTest.java index 745e5e584..617fac65e 100644 --- a/data_access/src/test/java/com/intuit/tank/dao/ScriptDaoTest.java +++ b/data_access/src/test/java/com/intuit/tank/dao/ScriptDaoTest.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.List; +import java.util.stream.IntStream; import java.util.stream.Stream; import javax.validation.ConstraintViolationException; @@ -29,12 +30,11 @@ import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.Configuration; -import com.intuit.tank.dao.ScriptDao; import com.intuit.tank.project.Script; import com.intuit.tank.project.ScriptStep; import com.intuit.tank.view.filter.ViewFilterType; +import org.hibernate.PropertyValueException; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -82,7 +82,6 @@ public void configure() { @Test @Tag(TestGroups.FUNCTIONAL) - @Disabled public void testChildOrder() throws Exception { Script entity = DaoTestUtil.createScript(); entity.addStep(DaoTestUtil.createScriptStep()); @@ -97,17 +96,17 @@ public void testChildOrder() throws Exception { children.add(0, removed); persisted = dao.saveOrUpdate(persisted); persisted = dao.findById(id); - assertFalse(persisted.getScriptSteps().get(0).equals(originalOrder.get(0))); - assertTrue(persisted.getScriptSteps().get(0).equals(originalOrder.get(2))); - assertTrue(persisted.getScriptSteps().get(1).equals(originalOrder.get(0))); - assertTrue(persisted.getScriptSteps().get(2).equals(originalOrder.get(1))); + assertNotEquals(originalOrder.get(0), persisted.getScriptSteps().get(0)); + assertEquals(originalOrder.get(2), persisted.getScriptSteps().get(0)); + assertEquals(originalOrder.get(0), persisted.getScriptSteps().get(1)); + assertEquals(originalOrder.get(1), persisted.getScriptSteps().get(2)); originalOrder = new ArrayList(persisted.getScriptSteps()); persisted.getScriptSteps().remove(2); persisted.getScriptSteps().remove(0); persisted = dao.saveOrUpdate(persisted); persisted = dao.findById(id); - assertTrue(persisted.getScriptSteps().get(0).equals(originalOrder.get(1))); + assertEquals(originalOrder.get(1), persisted.getScriptSteps().get(0)); assertEquals(1, persisted.getScriptSteps().size()); } finally { @@ -160,10 +159,27 @@ public void testFilter() throws Exception { assertEquals(fourth.getId(), list.get(3).getId()); } + @Test + @Tag(TestGroups.FUNCTIONAL) + public void testCompressScripSteps() { + + Script script = DaoTestUtil.createScript(); + IntStream.range(0, 500).forEach(i -> script.addStep(DaoTestUtil.createScriptStep())); + int id = dao.saveOrUpdate(script).getId(); + + Script scriptOut = dao.findById(id); + assertNotNull(scriptOut); + + dao.loadScriptSteps(scriptOut); + List StepsOut = scriptOut.getSteps(); + assertEquals(500, StepsOut.size()); + + dao.delete(id); + } + @ParameterizedTest @Tag(TestGroups.FUNCTIONAL) @MethodSource("validations") - @Disabled public void testValidation(Script entity, String property, String messageContains) throws Exception { try { dao.saveOrUpdate(entity); @@ -171,12 +187,17 @@ public void testValidation(Script entity, String property, String messageContain } catch (ConstraintViolationException e) { // expected validation DaoTestUtil.checkConstraintViolation(e, property, messageContains); + } catch (RuntimeException e) { + if (e.getCause().getCause() instanceof PropertyValueException) { + assertTrue(e.getCause().getCause().getMessage().startsWith("not-null property references a null or transient value")); + return; + } + assertTrue(e.getCause().getCause().getCause().getMessage().startsWith("Value too long for column ")); } } @Test @Tag(TestGroups.FUNCTIONAL) - @Disabled public void testBasicCreateUpdateDelete() throws Exception { List