diff --git a/aip-console-jenkins/README.md b/aip-console-jenkins/README.md index 8c4a40ae..815be9e5 100644 --- a/aip-console-jenkins/README.md +++ b/aip-console-jenkins/README.md @@ -334,9 +334,12 @@ Under `Advanced Settings` you will find the following parameters : The Snapshot step provides the following parameters : * *Application Name* (**required**): The name of tshe application for which the analysis will be run. -* *Snapshot Name* : The name of the Snapshot to create. If left blank, the snapshot will be named with the following pattern: `Snapshot-YYYY-MM-DDThh-mm-ss` depending on current date and time. +* *Snapshot Name* : The name of the Snapshot to create. If left blank, the snapshot will be named with the following + pattern: `Snapshot-YYYY-MM-DDThh-mm-ss` depending on current date and time. * *Publish to Imaging*: Publish to Imaging if Imaging is configured with AIP Console -* *Publish to the Health Dashboard* : When checked, consolidates snapshots and publishes data to the Health Dashboards. Checked by default. +* *Publish to the Health Dashboard* : When checked, consolidates snapshots and publishes data to the Health Dashboards. + Checked by default. +* *Sleep Duration*: Number of seconds used to refresh the ongoing job status Under `Advanced Settings` you will find the following parameters : diff --git a/aip-console-jenkins/src/main/java/io/jenkins/plugins/aipconsole/SnapshotAction.java b/aip-console-jenkins/src/main/java/io/jenkins/plugins/aipconsole/SnapshotAction.java index cebc6e37..66a72bb1 100644 --- a/aip-console-jenkins/src/main/java/io/jenkins/plugins/aipconsole/SnapshotAction.java +++ b/aip-console-jenkins/src/main/java/io/jenkins/plugins/aipconsole/SnapshotAction.java @@ -23,6 +23,7 @@ public class SnapshotAction extends BaseAction implements RunAction2 { private boolean failureIgnored = false; private long timeout = Constants.DEFAULT_HTTP_TIMEOUT; private boolean consolidation = true; + private long sleepDuration = Constants.DEFAULT_SLEEP_DURATION; @CheckForNull public String getApplicationName() { @@ -120,4 +121,12 @@ public String getDisplayName() { public String getUrlName() { return null; } + + public long getSleepDuration() { + return sleepDuration; + } + + public void setSleepDuration(long sleepDuration) { + this.sleepDuration = sleepDuration; + } } diff --git a/aip-console-jenkins/src/main/java/io/jenkins/plugins/aipconsole/SnapshotBuilder.java b/aip-console-jenkins/src/main/java/io/jenkins/plugins/aipconsole/SnapshotBuilder.java index b1c01894..f35a8e4b 100644 --- a/aip-console-jenkins/src/main/java/io/jenkins/plugins/aipconsole/SnapshotBuilder.java +++ b/aip-console-jenkins/src/main/java/io/jenkins/plugins/aipconsole/SnapshotBuilder.java @@ -9,6 +9,7 @@ import com.castsoftware.aip.console.tools.core.dto.jobs.JobState; import com.castsoftware.aip.console.tools.core.dto.jobs.JobType; import com.castsoftware.aip.console.tools.core.dto.jobs.LogContentDto; +import com.castsoftware.aip.console.tools.core.dto.jobs.ScanAndReScanApplicationJobRequest; import com.castsoftware.aip.console.tools.core.exceptions.ApiCallException; import com.castsoftware.aip.console.tools.core.exceptions.ApplicationServiceException; import com.castsoftware.aip.console.tools.core.exceptions.JobServiceException; @@ -55,6 +56,7 @@ import static io.jenkins.plugins.aipconsole.Messages.SnapshotBuilder_Snapshot_error_jobFailure; import static io.jenkins.plugins.aipconsole.Messages.SnapshotBuilder_Snapshot_error_noAnalyzedVersion; import static io.jenkins.plugins.aipconsole.Messages.SnapshotBuilder_Snapshot_error_version; +import static io.jenkins.plugins.aipconsole.Messages.SnapshotBuilder_Snapshot_info_fastScanWorkflow; import static io.jenkins.plugins.aipconsole.Messages.SnapshotBuilder_Snapshot_info_pollJobMessage; import static io.jenkins.plugins.aipconsole.Messages.SnapshotBuilder_Snapshot_success_complete; @@ -78,6 +80,7 @@ public class SnapshotBuilder extends BaseActionBuilder implements SimpleBuildSte private boolean failureIgnored = false; private long timeout = Constants.DEFAULT_HTTP_TIMEOUT; private boolean consolidation = true; + private long sleepDuration; @DataBoundConstructor public SnapshotBuilder(String applicationName) { @@ -235,6 +238,38 @@ public void perform(@Nonnull Run run, @Nonnull FilePath workspace, @Nonnul } boolean forcedConsolidation = processImaging || consolidation; + //TODO: refactor after release to get separated workflows + if (app.isOnboarded()) { + log.println(SnapshotBuilder_Snapshot_info_fastScanWorkflow(expandedAppName)); + ScanAndReScanApplicationJobRequest.ScanAndReScanApplicationJobRequestBuilder requestBuilder = ScanAndReScanApplicationJobRequest.builder() + .appGuid(applicationGuid); + String targetNode = app.getTargetNode(); + if (StringUtils.isNotEmpty(targetNode)) { + requestBuilder.targetNode(targetNode); + } + caipVersion = app.getCaipVersion(); + if (StringUtils.isNotEmpty(caipVersion)) { + requestBuilder.caipVersion(caipVersion); + } + if (StringUtils.isNotEmpty(resolveSnapshotName)) { + requestBuilder.snapshotName(resolveSnapshotName); + } + + requestBuilder.processImaging(processImaging); + requestBuilder.publishToEngineering(forcedConsolidation); + //Should remains true to prevent deep-analyze to trigger analyze step when publis and imaging options are set false + requestBuilder.uploadApplication(true); + + log.println("Job request : " + requestBuilder.build().toString()); + + JenkinsLogPollingProviderServiceImpl jnksLogPollingProvider = new JenkinsLogPollingProviderServiceImpl(jobsService, run, listener, getDescriptor().configuration.isVerbose(), getSleepDuration()); + String appGuid = applicationService.runDeepAnalysis(requestBuilder.build(), jnksLogPollingProvider); + if (StringUtils.isEmpty(appGuid)) { + run.setResult(Result.FAILURE); + } + return; + } + JobRequestBuilder requestBuilder = JobRequestBuilder.newInstance(applicationGuid, null, JobType.ANALYZE, caipVersion) .nodeName(app.getTargetNode()) .startStep(Constants.SNAPSHOT_STEP_NAME) @@ -289,6 +324,15 @@ public void perform(@Nonnull Run run, @Nonnull FilePath workspace, @Nonnul } } + public long getSleepDuration() { + return sleepDuration; + } + + @DataBoundSetter + public void setSleepDuration(long sleepDuration) { + this.sleepDuration = sleepDuration; + } + private JobState pollJob(String jobGuid, PrintStream log) throws JobServiceException { return jobsService.pollAndWaitForJobFinished(jobGuid, jobStatusWithSteps -> log.println( diff --git a/aip-console-jenkins/src/main/resources/io/jenkins/plugins/aipconsole/Messages.properties b/aip-console-jenkins/src/main/resources/io/jenkins/plugins/aipconsole/Messages.properties index d3993bef..7cbbbdb6 100644 --- a/aip-console-jenkins/src/main/resources/io/jenkins/plugins/aipconsole/Messages.properties +++ b/aip-console-jenkins/src/main/resources/io/jenkins/plugins/aipconsole/Messages.properties @@ -89,6 +89,7 @@ SnapshotBuilder.Snapshot.error.jobException=An error occurred while starting or SnapshotBuilder.Snapshot.info.startJob=Snapshot Job is started. SnapshotBuilder.Snapshot.info.pollJobMessage=Checking status of Snapshot job. SnapshotBuilder.Snapshot.success.complete=Snapshot for application ''{0}'' completed successfully. +SnapshotBuilder.Snapshot.info.fastScanWorkflow=Triggering Snapshot for an application using the Fast-Scan workflow: ''{0}'' # Analyze Builder and Action AnalyzeBuilder.DescriptorImpl.displayName=Console Analyze Application diff --git a/aip-console-jenkins/src/main/resources/io/jenkins/plugins/aipconsole/SnapshotBuilder/config.jelly b/aip-console-jenkins/src/main/resources/io/jenkins/plugins/aipconsole/SnapshotBuilder/config.jelly index bcaf22e1..c994fde0 100644 --- a/aip-console-jenkins/src/main/resources/io/jenkins/plugins/aipconsole/SnapshotBuilder/config.jelly +++ b/aip-console-jenkins/src/main/resources/io/jenkins/plugins/aipconsole/SnapshotBuilder/config.jelly @@ -10,14 +10,17 @@ - + + + + - + diff --git a/aip-console-jenkins/src/main/resources/io/jenkins/plugins/aipconsole/SnapshotBuilder/config.properties b/aip-console-jenkins/src/main/resources/io/jenkins/plugins/aipconsole/SnapshotBuilder/config.properties index d31db0e3..2e39ee2a 100644 --- a/aip-console-jenkins/src/main/resources/io/jenkins/plugins/aipconsole/SnapshotBuilder/config.properties +++ b/aip-console-jenkins/src/main/resources/io/jenkins/plugins/aipconsole/SnapshotBuilder/config.properties @@ -15,3 +15,5 @@ apiKey=API Key apiKey.descr=The API Key to access AIP Console consolidation=Publish application to the Health dashboard consolidation.descr=Consolidate snapshot or publish application to the Health dashboard +sleepDuration=sleep duration +sleepDuration.descr=Number of seconds between two refreshes of the status of the ongoing job diff --git a/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/OnboardApplicationDeepAnalysisCommand.java b/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/OnboardApplicationDeepAnalysisCommand.java index c98b41fc..4aa9344c 100644 --- a/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/OnboardApplicationDeepAnalysisCommand.java +++ b/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/OnboardApplicationDeepAnalysisCommand.java @@ -39,11 +39,6 @@ public class OnboardApplicationDeepAnalysisCommand extends BasicCollable { description = "The name of the snapshot to create") private String snapshotName; - @CommandLine.Option(names = {"--sleep-duration"}, - description = "Number of seconds used to refresh the ongoing job status. The default value is: ${DEFAULT-VALUE}", - defaultValue = "15") - private long sleepDuration; - @CommandLine.Option(names = "--module-option" , description = "Generates a user defined module option for either technology module or analysis unit module. Possible value is one of: full_content, one_per_au, one_per_techno (default: ${DEFAULT-VALUE})") private ModuleGenerationType moduleGenerationType = ModuleGenerationType.FULL_CONTENT; @@ -66,7 +61,7 @@ public Integer processCallCommand() throws Exception { } log.info("Deep-Analysis args:"); - log.info(String.format("\tApplication: %s%n\tsnapshot name: %s%n\tmodule generation type: %s%n\tsleep: %d%n", applicationName, StringUtils.isEmpty(snapshotName) ? "Auto assigned" : snapshotName, moduleGenerationType.toString(), sleepDuration)); + log.info(String.format("\tApplication: %s%n\tsnapshot name: %s%n\tmodule generation type: %s%n\tsleep: %d%n", applicationName, StringUtils.isEmpty(snapshotName) ? "Auto assigned" : snapshotName, moduleGenerationType.toString(), getSharedOptions().getSleepDuration())); Thread shutdownHook = null; try { @@ -103,7 +98,7 @@ public Integer processCallCommand() throws Exception { String caipVersion = app.getCaipVersion(); String targetNode = app.getTargetNode(); - CliLogPollingProviderImpl cliLogPolling = new CliLogPollingProviderImpl(jobsService, getSharedOptions().isVerbose(), sleepDuration); + CliLogPollingProviderImpl cliLogPolling = new CliLogPollingProviderImpl(jobsService, getSharedOptions().isVerbose(), getSharedOptions().getSleepDuration()); //Run Analysis if (!applicationService.isImagingAvailable()) { diff --git a/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/OnboardApplicationFastScanCommand.java b/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/OnboardApplicationFastScanCommand.java index 25044a66..b8ff9fc5 100644 --- a/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/OnboardApplicationFastScanCommand.java +++ b/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/OnboardApplicationFastScanCommand.java @@ -61,11 +61,6 @@ public class OnboardApplicationFastScanCommand extends BasicCollable { , description = "Project's exclusion rules, separated with comma. Valid values: ${COMPLETION-CANDIDATES}") private ExclusionRuleType[] exclusionRules; - @CommandLine.Option(names = {"--sleep-duration"}, - description = "Number of seconds used to refresh the ongoing job status. The default value is: ${DEFAULT-VALUE}", - defaultValue = "1") - private long sleepDuration; - @CommandLine.Mixin private SharedOptions sharedOptions; @@ -89,7 +84,7 @@ public Integer processCallCommand() throws Exception { } log.info("Fast-Scan args:"); - log.info(String.format("\tApplication: %s%n\tFile: %s%n\tsleep: %d%n", applicationName, filePath.getAbsolutePath(), sleepDuration)); + log.info(String.format("\tApplication: %s%n\tFile: %s%n\tsleep: %d%n", applicationName, filePath.getAbsolutePath(), sharedOptions.getSleepDuration())); String applicationGuid; Thread shutdownHook = null; @@ -106,7 +101,7 @@ public Integer processCallCommand() throws Exception { log.info("About to trigger New workflow for: 'Fast-Scan'"); String sourcePath = uploadFile(app != null ? app.getGuid() : null); - CliLogPollingProviderImpl cliLogPolling = new CliLogPollingProviderImpl(jobsService, getSharedOptions().isVerbose(), sleepDuration); + CliLogPollingProviderImpl cliLogPolling = new CliLogPollingProviderImpl(jobsService, getSharedOptions().isVerbose(), getSharedOptions().getSleepDuration()); if (app == null) { applicationGuid = applicationService.onboardApplication(applicationName, domainName, getSharedOptions().isVerbose(), sourcePath); log.info("Onboard Application job has started: application GUID= " + applicationGuid); diff --git a/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/PublishToImagingCommand.java b/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/PublishToImagingCommand.java index 7b91842e..b5f50700 100644 --- a/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/PublishToImagingCommand.java +++ b/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/PublishToImagingCommand.java @@ -3,6 +3,7 @@ import com.castsoftware.aip.console.tools.core.dto.ApplicationDto; import com.castsoftware.aip.console.tools.core.dto.VersionDto; import com.castsoftware.aip.console.tools.core.dto.VersionStatus; +import com.castsoftware.aip.console.tools.core.dto.jobs.ScanAndReScanApplicationJobRequest; import com.castsoftware.aip.console.tools.core.exceptions.ApplicationServiceException; import com.castsoftware.aip.console.tools.core.services.ApplicationService; import com.castsoftware.aip.console.tools.core.services.JobsService; @@ -14,8 +15,8 @@ import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; import picocli.CommandLine; import java.util.EnumSet; @@ -80,7 +81,30 @@ protected Integer processCallCommand() throws Exception { return Constants.RETURN_ONBOARD_VERSION_STATUS_INVALID; } - CliLogPollingProviderImpl cliLogPolling = new CliLogPollingProviderImpl(jobsService, getSharedOptions().isVerbose(), 15); + CliLogPollingProviderImpl cliLogPolling = new CliLogPollingProviderImpl(jobsService, getSharedOptions().isVerbose(), getSharedOptions().getSleepDuration()); + //TODO: refactor after release to get separated workflows + if (applicationDto.isOnboarded()) { + log.info("Triggering Publish to Imaging for an application using Fast-Scan workflow."); + ScanAndReScanApplicationJobRequest.ScanAndReScanApplicationJobRequestBuilder requestBuilder = ScanAndReScanApplicationJobRequest.builder() + .appGuid(applicationDto.getGuid()); + String targetNode = applicationDto.getTargetNode(); + if (StringUtils.isNotEmpty(targetNode)) { + requestBuilder.targetNode(targetNode); + } + String caipVersion = applicationDto.getCaipVersion(); + if (StringUtils.isNotEmpty(caipVersion)) { + requestBuilder.caipVersion(caipVersion); + } + requestBuilder.processImaging(true); + + String appGuid = applicationService.runDeepAnalysis(requestBuilder.build(), cliLogPolling); + if (StringUtils.isEmpty(appGuid)) { + log.error("Something went wrong while Publishing to Imaging."); + return Constants.RETURN_JOB_FAILED; + } + return Constants.RETURN_OK; + } + String appGuid = applicationService.publishToImaging(applicationDto.getGuid(), cliLogPolling); if (StringUtils.isEmpty(appGuid)) { diff --git a/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/SharedOptions.java b/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/SharedOptions.java index 5c96488a..14bde5ea 100644 --- a/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/SharedOptions.java +++ b/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/SharedOptions.java @@ -30,6 +30,11 @@ public class SharedOptions { + " if specified without parameter: ${FALLBACK-VALUE}", fallbackValue = "true") private boolean verbose = true; + @CommandLine.Option(names = {"--sleep-duration"}, + description = "Number of seconds used to refresh the ongoing job status. The default value is: ${DEFAULT-VALUE}", + defaultValue = "10") + private long sleepDuration; + @CommandLine.Unmatched private List unmatchedOptions; @@ -103,6 +108,14 @@ public String getFullServerRootUrl() { return serverRootUrl; } + public long getSleepDuration() { + return sleepDuration; + } + + public void setSleepDuration(long sleepDuration) { + this.sleepDuration = sleepDuration; + } + @Override public String toString() { return "SharedOptions{" + @@ -112,7 +125,8 @@ public String toString() { ", username='" + username + '\'' + ", timeout='" + timeout + '\'' + ", unmatchedOptions=" + unmatchedOptions + - ", log output= " + verbose + + ", log verbose= " + verbose + + ", sleep duration= " + sleepDuration + '}'; } } diff --git a/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/SnapshotCommand.java b/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/SnapshotCommand.java index 1ae7470e..2ed4e9a4 100644 --- a/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/SnapshotCommand.java +++ b/aip-console-tools-cli/src/main/java/com/castsoftware/aip/console/tools/commands/SnapshotCommand.java @@ -8,6 +8,7 @@ import com.castsoftware.aip.console.tools.core.dto.jobs.JobRequestBuilder; import com.castsoftware.aip.console.tools.core.dto.jobs.JobState; import com.castsoftware.aip.console.tools.core.dto.jobs.JobType; +import com.castsoftware.aip.console.tools.core.dto.jobs.ScanAndReScanApplicationJobRequest; import com.castsoftware.aip.console.tools.core.exceptions.ApiCallException; import com.castsoftware.aip.console.tools.core.exceptions.ApiKeyMissingException; import com.castsoftware.aip.console.tools.core.exceptions.ApplicationServiceException; @@ -17,6 +18,7 @@ import com.castsoftware.aip.console.tools.core.services.RestApiService; import com.castsoftware.aip.console.tools.core.utils.Constants; import com.castsoftware.aip.console.tools.core.utils.SemVerUtils; +import com.castsoftware.aip.console.tools.providers.CliLogPollingProviderImpl; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -154,8 +156,39 @@ public Integer call() throws Exception { snapshotName = String.format("Snapshot-%s", new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(new Date())); } - // Run snapshot boolean forcedConsolidation = processImaging || consolidation; + //TODO: refactor after release to get separated workflows + if (app.isOnboarded()) { + log.info("Triggering snapshot for an application using Fast-Scan workflow."); + ScanAndReScanApplicationJobRequest.ScanAndReScanApplicationJobRequestBuilder requestBuilder = ScanAndReScanApplicationJobRequest.builder() + .appGuid(applicationGuid); + String targetNode = app.getTargetNode(); + if (StringUtils.isNotEmpty(targetNode)) { + requestBuilder.targetNode(targetNode); + } + String caipVersion = app.getCaipVersion(); + if (StringUtils.isNotEmpty(caipVersion)) { + requestBuilder.caipVersion(caipVersion); + } + if (StringUtils.isNotEmpty(snapshotName)) { + requestBuilder.snapshotName(snapshotName); + } + + requestBuilder.processImaging(processImaging); + requestBuilder.publishToEngineering(forcedConsolidation); + //Should remains true to prevent deep-analyze to trigger analyze step when publis and imaging options are set false + requestBuilder.uploadApplication(true); + + CliLogPollingProviderImpl cliLogPolling = new CliLogPollingProviderImpl(jobsService, getSharedOptions().isVerbose(), getSharedOptions().getSleepDuration()); + String appGuid = applicationService.runDeepAnalysis(requestBuilder.build(), cliLogPolling); + if (StringUtils.isEmpty(appGuid)) { + log.error("Snapshot operating wasn't performed successfully. Toggle verbose ON or check CAST Console logs for more details."); + return Constants.RETURN_JOB_FAILED; + } + return Constants.RETURN_OK; + } + + // Run snapshot in legacy workflow JobRequestBuilder builder = JobRequestBuilder.newInstance(applicationGuid, null, JobType.ANALYZE, app.getCaipVersion()) .nodeName(app.getTargetNode()) .startStep(Constants.SNAPSHOT_STEP_NAME) @@ -165,7 +198,7 @@ public Integer call() throws Exception { .uploadApplication(true) .snapshotDate(applicationService.getVersionDate(snapshotDateString)) .processImaging(processImaging) - .uploadApplication(forcedConsolidation) + .uploadApplication(true) .endStep(SemVerUtils.isNewerThan115(apiInfoDto.getApiVersionSemVer()) ? Constants.UPLOAD_APP_SNAPSHOT : Constants.SNAPSHOT_INDICATOR); diff --git a/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/AipConsoleToolsCliBaseTest.java b/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/AipConsoleToolsCliBaseTest.java index 8dfdc342..f9e799eb 100644 --- a/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/AipConsoleToolsCliBaseTest.java +++ b/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/AipConsoleToolsCliBaseTest.java @@ -10,6 +10,7 @@ import com.castsoftware.aip.console.tools.core.services.UploadService; import com.castsoftware.aip.console.tools.core.utils.Constants; import com.castsoftware.aip.console.tools.factories.SpringAwareCommandFactory; +import lombok.extern.slf4j.Slf4j; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -31,6 +32,7 @@ import static org.mockito.Mockito.when; +@Slf4j public abstract class AipConsoleToolsCliBaseTest { @Autowired protected SpringAwareCommandFactory springAwareCommandFactory; @@ -168,6 +170,7 @@ protected void runStringArgs(Callable command, String[] args) { } } } catch (Throwable t) { + log.error(t.getMessage()); exitCode = Constants.UNKNOWN_ERROR; } } diff --git a/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/OnboardApplicationFastScanCommandIntegrationTest.java b/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/OnboardApplicationFastScanCommandIntegrationTest.java index 12b706a8..e6096e96 100644 --- a/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/OnboardApplicationFastScanCommandIntegrationTest.java +++ b/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/OnboardApplicationFastScanCommandIntegrationTest.java @@ -149,7 +149,7 @@ public void testOnboardApplicationFastScan_OnboardingDisabled() throws Exception runStringArgs(fastScanCommand, args); CommandLine.Model.CommandSpec spec = cliToTest.getCommandSpec(); assertThat(spec, is(notNullValue())); - assertThat(fastScanCommand.getSleepDuration(), is(1L)); //default value taken + assertThat(fastScanCommand.getSharedOptions().getSleepDuration(), is(10L)); //default value taken assertThat(exitCode, is(Constants.RETURN_ONBOARD_APPLICATION_DISABLED)); } @@ -185,7 +185,7 @@ public void testOnboardApplicationFastScan_WithoutExistingVersion() throws Excep runStringArgs(fastScanCommand, args); CommandLine.Model.CommandSpec spec = cliToTest.getCommandSpec(); assertThat(spec, is(notNullValue())); - assertThat(fastScanCommand.getSleepDuration(), is(6L)); + assertThat(fastScanCommand.getSharedOptions().getSleepDuration(), is(6L)); assertThat(exitCode, is(Constants.RETURN_OK)); } diff --git a/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/PublishToImagingCommandIntegrationTest.java b/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/PublishToImagingCommandIntegrationTest.java index 5f14aa7a..cf9fa1f2 100644 --- a/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/PublishToImagingCommandIntegrationTest.java +++ b/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/PublishToImagingCommandIntegrationTest.java @@ -52,7 +52,7 @@ public void testPublishToImagingCommand_invalidParameter() throws Exception { } @Test - public void testPublishToImagingCommand_OnboarApplicationSettingsOFF() throws Exception { + public void testPublishToImagingCommand_OnboardApplicationSettingsOFF() throws Exception { String[] args = new String[]{"--apikey", TestConstants.TEST_API_KEY, "--app-name", TestConstants.TEST_CREATRE_APP }; diff --git a/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/SnapshotCommandIntegrationTest.java b/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/SnapshotCommandIntegrationTest.java index 47985f28..61874937 100644 --- a/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/SnapshotCommandIntegrationTest.java +++ b/aip-console-tools-cli/src/test/java/com/castsoftware/aip/console/tools/SnapshotCommandIntegrationTest.java @@ -1,17 +1,17 @@ package com.castsoftware.aip.console.tools; import com.castsoftware.aip.console.tools.commands.SnapshotCommand; +import com.castsoftware.aip.console.tools.core.dto.ApplicationDto; import com.castsoftware.aip.console.tools.core.dto.VersionDto; import com.castsoftware.aip.console.tools.core.dto.VersionStatus; import com.castsoftware.aip.console.tools.core.dto.jobs.JobExecutionDto; import com.castsoftware.aip.console.tools.core.dto.jobs.JobRequestBuilder; import com.castsoftware.aip.console.tools.core.dto.jobs.JobState; -import com.castsoftware.aip.console.tools.core.dto.jobs.JobStatusWithSteps; +import com.castsoftware.aip.console.tools.core.dto.jobs.ScanAndReScanApplicationJobRequest; import com.castsoftware.aip.console.tools.core.exceptions.ApplicationServiceException; import com.castsoftware.aip.console.tools.core.exceptions.JobServiceException; -import com.castsoftware.aip.console.tools.core.exceptions.PackagePathInvalidException; -import com.castsoftware.aip.console.tools.core.exceptions.UploadException; import com.castsoftware.aip.console.tools.core.utils.Constants; +import com.castsoftware.aip.console.tools.providers.CliLogPollingProviderImpl; import org.apache.commons.lang3.StringUtils; import org.junit.Test; import org.junit.runner.RunWith; @@ -60,7 +60,7 @@ protected void cleanupTestCommand() { } @Test - public void testSnapshotCommand_WhenAnalysisNotDone() throws ApplicationServiceException, UploadException, JobServiceException, PackagePathInvalidException { + public void testSnapshotCommand_WhenAnalysisNotDone() throws ApplicationServiceException { boolean verbose = true; String[] args = new String[]{"--apikey", TestConstants.TEST_API_KEY, "--app-name=" + TestConstants.TEST_CREATRE_APP, @@ -79,6 +79,63 @@ public void testSnapshotCommand_WhenAnalysisNotDone() throws ApplicationServiceE assertThat(exitCode, is(Constants.RETURN_VERSION_WITH_ANALYSIS_DONE_NOT_FOUND)); } + @Test + public void testSnapshotCommand_WhenFastScanWorkFlow_JobFailed() throws ApplicationServiceException { + boolean verbose = true; + String[] args = new String[]{"--apikey", TestConstants.TEST_API_KEY, + "--app-name=" + TestConstants.TEST_CREATRE_APP, + "--version-name", TestConstants.TEST_VERSION_NAME, + "--snapshot-name", "SNAP-Name-here", + "--process-imaging"}; + + ApplicationDto applicationDto = ApplicationDto.builder() + .guid(TestConstants.TEST_APP_GUID) + .name(TestConstants.TEST_CREATRE_APP) + .onboarded(true) + .schemaPrefix("ShouldHave_One").build(); + + when(applicationService.getApplicationFromName(TestConstants.TEST_CREATRE_APP)).thenReturn(applicationDto); + VersionDto versionDto = new VersionDto(); + versionDto.setName(TestConstants.TEST_VERSION_NAME); + versionDto.setStatus(VersionStatus.ANALYSIS_DONE); + when(applicationService.getApplicationVersion(TestConstants.TEST_APP_GUID)).thenReturn(Sets.newSet(versionDto)); + + runStringArgs(snapshotCommand, args); + + CommandLine.Model.CommandSpec spec = cliToTest.getCommandSpec(); + assertThat(spec, is(notNullValue())); + assertThat(exitCode, is(Constants.RETURN_JOB_FAILED)); + } + + @Test + public void testSnapshotCommand_WhenFastScanWorkFlow_JobSucceeded() throws ApplicationServiceException { + boolean verbose = true; + String[] args = new String[]{"--apikey", TestConstants.TEST_API_KEY, + "--app-name=" + TestConstants.TEST_CREATRE_APP, + "--version-name", TestConstants.TEST_VERSION_NAME, + "--snapshot-name", "SNAP-Name-here", + "--process-imaging"}; + + ApplicationDto applicationDto = ApplicationDto.builder() + .guid(TestConstants.TEST_APP_GUID) + .name(TestConstants.TEST_CREATRE_APP) + .onboarded(true) + .schemaPrefix("ShouldHave_One").build(); + + when(applicationService.getApplicationFromName(TestConstants.TEST_CREATRE_APP)).thenReturn(applicationDto); + VersionDto versionDto = new VersionDto(); + versionDto.setName(TestConstants.TEST_VERSION_NAME); + versionDto.setStatus(VersionStatus.ANALYSIS_DONE); + when(applicationService.getApplicationVersion(TestConstants.TEST_APP_GUID)).thenReturn(Sets.newSet(versionDto)); + when(applicationService.runDeepAnalysis(any(ScanAndReScanApplicationJobRequest.class), any(CliLogPollingProviderImpl.class))).thenReturn(TestConstants.TEST_APP_GUID); + + runStringArgs(snapshotCommand, args); + + CommandLine.Model.CommandSpec spec = cliToTest.getCommandSpec(); + assertThat(spec, is(notNullValue())); + assertThat(exitCode, is(Constants.RETURN_OK)); + } + @Test public void testSnapshotCommand_JobCompleted() throws ApplicationServiceException, JobServiceException { boolean verbose = true; diff --git a/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/dto/jobs/ScanAndReScanApplicationJobRequest.java b/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/dto/jobs/ScanAndReScanApplicationJobRequest.java index 1151995f..8b3bc93b 100644 --- a/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/dto/jobs/ScanAndReScanApplicationJobRequest.java +++ b/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/dto/jobs/ScanAndReScanApplicationJobRequest.java @@ -1,5 +1,6 @@ package com.castsoftware.aip.console.tools.core.dto.jobs; +import com.castsoftware.aip.console.tools.core.dto.ModuleGenerationType; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -24,6 +25,13 @@ public class ScanAndReScanApplicationJobRequest { private String moduleGenerationType; + public ScanAndReScanApplicationJobRequest moduleGenerationType(ModuleGenerationType generationType) { + if (generationType != null && (generationType != ModuleGenerationType.FULL_CONTENT)) { + moduleGenerationType = generationType.toString(); + } + return this; + } + @Override public String toString() { return "Request{" + @@ -31,7 +39,11 @@ public String toString() { ", targetNode='" + targetNode + '\'' + ", caipVersion='" + caipVersion + '\'' + ", snapshotName='" + snapshotName + '\'' + - ", moduleGenerationType='" + moduleGenerationType + '\'' + + ", runAnalysis='" + runAnalysis + '\'' + + ", uploadApplication='" + uploadApplication + '\'' + + ", publishToEngineering='" + publishToEngineering + '\'' + + ", publishToEngineering='" + publishToEngineering + '\'' + + ", processImaging='" + processImaging + '\'' + '}'; } } diff --git a/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/ApplicationService.java b/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/ApplicationService.java index 1c4aea6a..4479d686 100644 --- a/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/ApplicationService.java +++ b/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/ApplicationService.java @@ -12,6 +12,7 @@ import com.castsoftware.aip.console.tools.core.dto.VersionStatus; import com.castsoftware.aip.console.tools.core.dto.jobs.JobRequestBuilder; import com.castsoftware.aip.console.tools.core.dto.jobs.LogPollingProvider; +import com.castsoftware.aip.console.tools.core.dto.jobs.ScanAndReScanApplicationJobRequest; import com.castsoftware.aip.console.tools.core.exceptions.ApplicationServiceException; import com.castsoftware.aip.console.tools.core.exceptions.JobServiceException; import com.castsoftware.aip.console.tools.core.exceptions.PackagePathInvalidException; @@ -74,9 +75,11 @@ String fastScan(String applicationGuid, String sourcePath, String versionName, D void setEnableOnboarding(boolean enabled) throws ApplicationServiceException; boolean isImagingAvailable() throws ApplicationServiceException; - + String runDeepAnalysis(String applicationGuid, String targetNode, String caipVersion, String snapshotName, ModuleGenerationType moduleGenerationType, boolean verbose, LogPollingProvider logPollingProvider) throws ApplicationServiceException; + String runDeepAnalysis(ScanAndReScanApplicationJobRequest fastScanRequest, LogPollingProvider logPollingProvider) throws ApplicationServiceException; + /** * Retrieve an application's GUID from the given application name. *

diff --git a/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/ApplicationServiceImpl.java b/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/ApplicationServiceImpl.java index 9191e9ea..36959b0a 100644 --- a/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/ApplicationServiceImpl.java +++ b/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/ApplicationServiceImpl.java @@ -21,6 +21,7 @@ import com.castsoftware.aip.console.tools.core.dto.jobs.JobRequestBuilder; import com.castsoftware.aip.console.tools.core.dto.jobs.JobState; import com.castsoftware.aip.console.tools.core.dto.jobs.LogPollingProvider; +import com.castsoftware.aip.console.tools.core.dto.jobs.ScanAndReScanApplicationJobRequest; import com.castsoftware.aip.console.tools.core.exceptions.ApiCallException; import com.castsoftware.aip.console.tools.core.exceptions.ApplicationServiceException; import com.castsoftware.aip.console.tools.core.exceptions.JobServiceException; @@ -52,7 +53,7 @@ public class ApplicationServiceImpl implements ApplicationService { public ApplicationServiceImpl(RestApiService restApiService, JobsService jobsService) { this.restApiService = restApiService; - this.jobService = jobsService; + jobService = jobsService; } @Override @@ -234,9 +235,29 @@ public String discoverApplication(String applicationGuid, String sourcePath, Str @Override public String runDeepAnalysis(String applicationGuid, String targetNode, String caipVersion, String snapshotName, ModuleGenerationType moduleGenerationType, boolean verbose, LogPollingProvider logPollingProvider) throws ApplicationServiceException { + ScanAndReScanApplicationJobRequest.ScanAndReScanApplicationJobRequestBuilder requestBuilder = ScanAndReScanApplicationJobRequest.builder() + .appGuid(applicationGuid); + if (StringUtils.isNotEmpty(targetNode)) { + requestBuilder.targetNode(targetNode); + } + if (StringUtils.isNotEmpty(caipVersion)) { + requestBuilder.caipVersion(caipVersion); + } + if (StringUtils.isNotEmpty(snapshotName)) { + requestBuilder.snapshotName(snapshotName); + } + //The module parameter should be left empty or null when dealing with full content + if (moduleGenerationType != null && (moduleGenerationType != ModuleGenerationType.FULL_CONTENT)) { + requestBuilder.moduleGenerationType(moduleGenerationType.toString()); + } + return runDeepAnalysis(requestBuilder.build(), logPollingProvider); + } + + @Override + public String runDeepAnalysis(ScanAndReScanApplicationJobRequest fastScanRequest, LogPollingProvider logPollingProvider) throws ApplicationServiceException { log.log(Level.INFO, "Starting job to perform Deep Analysis action (Run Analysis) "); try { - String jobGuid = jobService.startDeepAnalysis(applicationGuid, targetNode, caipVersion, snapshotName, moduleGenerationType); + String jobGuid = jobService.startDeepAnalysis(fastScanRequest); log.log(Level.INFO, "Deep Analysis running job GUID= " + jobGuid); return logPollingProvider != null ? logPollingProvider.pollJobLog(jobGuid) : null; } catch (JobServiceException e) { diff --git a/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/JobsService.java b/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/JobsService.java index 084cd611..907d4773 100644 --- a/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/JobsService.java +++ b/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/JobsService.java @@ -6,6 +6,7 @@ import com.castsoftware.aip.console.tools.core.dto.jobs.JobRequestBuilder; import com.castsoftware.aip.console.tools.core.dto.jobs.JobState; import com.castsoftware.aip.console.tools.core.dto.jobs.LogContentDto; +import com.castsoftware.aip.console.tools.core.dto.jobs.ScanAndReScanApplicationJobRequest; import com.castsoftware.aip.console.tools.core.exceptions.JobServiceException; import java.util.Date; @@ -67,6 +68,8 @@ public interface JobsService { String startDeepAnalysis(String applicationGuid, String nodeName, String caipVersion, String snapshotName, ModuleGenerationType moduleGenerationType) throws JobServiceException; + String startDeepAnalysis(ScanAndReScanApplicationJobRequest fastScanRequest) throws JobServiceException; + String startPublishToImaging(String applicationGuid, String nodeName, String caipVersion) throws JobServiceException; /** diff --git a/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/JobsServiceImpl.java b/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/JobsServiceImpl.java index b980147f..49f53e07 100644 --- a/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/JobsServiceImpl.java +++ b/aip-console-tools-core/src/main/java/com/castsoftware/aip/console/tools/core/services/JobsServiceImpl.java @@ -56,7 +56,7 @@ public class JobsServiceImpl implements JobsService { public JobsServiceImpl(RestApiService restApiService) { this.restApiService = restApiService; - this.pollingSleepDuration = POLL_SLEEP_DURATION; + pollingSleepDuration = POLL_SLEEP_DURATION; } public JobsServiceImpl(RestApiService restApiService, long pollingSleepDuration) { @@ -208,10 +208,14 @@ public String startDeepAnalysis(String applicationGuid, String nodeName, String if (moduleGenerationType != null && (moduleGenerationType != ModuleGenerationType.FULL_CONTENT)) { requestBuilder.moduleGenerationType(moduleGenerationType.toString()); } + return startDeepAnalysis(requestBuilder.build()); + } - log.info("Job Parameters: " + requestBuilder.build().toString()); + @Override + public String startDeepAnalysis(ScanAndReScanApplicationJobRequest fastScanRequest) throws JobServiceException { + log.fine("Job Parameters: " + fastScanRequest.toString()); try { - SuccessfulJobStartDto jobStartDto = restApiService.postForEntity(ApiEndpointHelper.getDeepAnalysisEndPoint(), requestBuilder.build(), SuccessfulJobStartDto.class); + SuccessfulJobStartDto jobStartDto = restApiService.postForEntity(ApiEndpointHelper.getDeepAnalysisEndPoint(), fastScanRequest, SuccessfulJobStartDto.class); return jobStartDto.getJobGuid(); } catch (ApiCallException e) { log.log(Level.SEVERE, "Unable to perform ReScan application action (Run Analysis)", e);