diff --git a/api/src/main/java/com/epam/pipeline/acl/run/RunApiService.java b/api/src/main/java/com/epam/pipeline/acl/run/RunApiService.java index ccd696de11..1f851fb429 100644 --- a/api/src/main/java/com/epam/pipeline/acl/run/RunApiService.java +++ b/api/src/main/java/com/epam/pipeline/acl/run/RunApiService.java @@ -54,7 +54,13 @@ import com.epam.pipeline.manager.cluster.InstanceOfferManager; import com.epam.pipeline.manager.filter.FilterManager; import com.epam.pipeline.manager.filter.WrongFilterException; -import com.epam.pipeline.manager.pipeline.*; +import com.epam.pipeline.manager.pipeline.ArchiveRunService; +import com.epam.pipeline.manager.pipeline.PipelineRunAsManager; +import com.epam.pipeline.manager.pipeline.PipelineRunCRUDService; +import com.epam.pipeline.manager.pipeline.PipelineRunDockerOperationManager; +import com.epam.pipeline.manager.pipeline.PipelineRunKubernetesManager; +import com.epam.pipeline.manager.pipeline.PipelineRunManager; +import com.epam.pipeline.manager.pipeline.RunLogManager; import com.epam.pipeline.manager.pipeline.runner.ConfigurationRunner; import com.epam.pipeline.manager.security.acl.AclFilter; import com.epam.pipeline.manager.security.acl.AclMask; @@ -224,8 +230,9 @@ public PipelineRun updateTags(final Long runId, final TagsVO tagsVO, final boole @PreAuthorize(ADMIN_ONLY) @AclMask - public List loadRunsActivityStats(final LocalDateTime start, final LocalDateTime end) { - return runManager.loadRunsActivityStats(start, end); + public List loadRunsActivityStats(final LocalDateTime start, final LocalDateTime end, + final boolean archive) { + return runManager.loadRunsActivityStats(start, end, archive); } @AclFilter diff --git a/api/src/main/java/com/epam/pipeline/controller/pipeline/PipelineRunController.java b/api/src/main/java/com/epam/pipeline/controller/pipeline/PipelineRunController.java index f60a9cd80e..8a709cf13c 100644 --- a/api/src/main/java/com/epam/pipeline/controller/pipeline/PipelineRunController.java +++ b/api/src/main/java/com/epam/pipeline/controller/pipeline/PipelineRunController.java @@ -61,7 +61,13 @@ import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.MediaType; import org.springframework.util.Assert; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -504,8 +510,9 @@ public Result> loadRunsActivityStats( @RequestParam(value = "from") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) final LocalDateTime start, @RequestParam(value = "to") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) - final LocalDateTime end) { - return Result.success(runApiService.loadRunsActivityStats(start, end)); + final LocalDateTime end, + @RequestParam(defaultValue = "false", required = false) final boolean archive) { + return Result.success(runApiService.loadRunsActivityStats(start, end, archive)); } @PostMapping(value = "/run/cmd") diff --git a/api/src/main/java/com/epam/pipeline/dao/pipeline/PipelineRunDao.java b/api/src/main/java/com/epam/pipeline/dao/pipeline/PipelineRunDao.java index 97ef5739c8..0070ec4cf4 100644 --- a/api/src/main/java/com/epam/pipeline/dao/pipeline/PipelineRunDao.java +++ b/api/src/main/java/com/epam/pipeline/dao/pipeline/PipelineRunDao.java @@ -138,6 +138,7 @@ public class PipelineRunDao extends NamedParameterJdbcDaoSupport { private String loadRunByPrettyUrlQuery; private String updateTagsQuery; private String loadAllRunsPossiblyActiveInPeriodQuery; + private String loadAllRunsPossiblyActiveInPeriodWithArchiveQuery; private String loadAllRunsByStatusQuery; private String loadAllRunsByIdsQuery; private String loadRunByPodIPQuery; @@ -189,7 +190,8 @@ public PipelineRun loadPipelineRun(Long id) { } @Transactional(propagation = Propagation.REQUIRED) - public List loadPipelineRunsActiveInPeriod(final LocalDateTime start, final LocalDateTime end) { + public List loadPipelineRunsActiveInPeriod(final LocalDateTime start, final LocalDateTime end, + final boolean archive) { final MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("PERIOD_START", start); params.addValue("PERIOD_END", end); @@ -198,8 +200,11 @@ public List loadPipelineRunsActiveInPeriod(final LocalDateTime star TaskStatus.PAUSED.getId(), TaskStatus.RESUMING.getId()); params.addValue("TARGET_LAST_STATUSES", targetLastStatuses); - return addServiceUrls(getNamedParameterJdbcTemplate().query(loadAllRunsPossiblyActiveInPeriodQuery, - params, PipelineRunParameters.getRowMapper())); + final String query = archive + ? loadAllRunsPossiblyActiveInPeriodWithArchiveQuery + : loadAllRunsPossiblyActiveInPeriodQuery; + return addServiceUrls(getNamedParameterJdbcTemplate() + .query(query, params, PipelineRunParameters.getRowMapper())); } public String loadSshPassword(Long id) { @@ -1594,6 +1599,12 @@ public void setLoadAllRunsPossiblyActiveInPeriodQuery(final String loadAllRunsPo this.loadAllRunsPossiblyActiveInPeriodQuery = loadAllRunsPossiblyActiveInPeriodQuery; } + @Required + public void setLoadAllRunsPossiblyActiveInPeriodWithArchiveQuery( + final String loadAllRunsPossiblyActiveInPeriodWithArchiveQuery) { + this.loadAllRunsPossiblyActiveInPeriodWithArchiveQuery = loadAllRunsPossiblyActiveInPeriodWithArchiveQuery; + } + @Required public void setLoadAllRunsByStatusQuery(final String loadAllRunsByStatusQuery) { this.loadAllRunsByStatusQuery = loadAllRunsByStatusQuery; diff --git a/api/src/main/java/com/epam/pipeline/manager/pipeline/PipelineRunManager.java b/api/src/main/java/com/epam/pipeline/manager/pipeline/PipelineRunManager.java index 8482bc5a9e..d2a01b369d 100644 --- a/api/src/main/java/com/epam/pipeline/manager/pipeline/PipelineRunManager.java +++ b/api/src/main/java/com/epam/pipeline/manager/pipeline/PipelineRunManager.java @@ -1072,11 +1072,13 @@ public PipelineRun updateTags(final Long runId, final TagsVO newTags, final bool * * @param start beginning of evaluating period * @param end ending of evaluating period + * @param archive optional archived runs loading * @return run with statuses adjusted */ @Transactional(propagation = Propagation.REQUIRED) - public List loadRunsActivityStats(final LocalDateTime start, final LocalDateTime end) { - final List runs = pipelineRunDao.loadPipelineRunsActiveInPeriod(start, end); + public List loadRunsActivityStats(final LocalDateTime start, final LocalDateTime end, + final boolean archive) { + final List runs = pipelineRunDao.loadPipelineRunsActiveInPeriod(start, end, archive); final List runIds = runs.stream() .map(BaseEntity::getId) .collect(Collectors.toList()); diff --git a/api/src/main/resources/dao/pipeline-run-dao.xml b/api/src/main/resources/dao/pipeline-run-dao.xml index 8e426f6d98..5882c7e028 100644 --- a/api/src/main/resources/dao/pipeline-run-dao.xml +++ b/api/src/main/resources/dao/pipeline-run-dao.xml @@ -1767,6 +1767,136 @@ ]]> + + + + + { @@ -224,8 +238,15 @@ public void testLoadPipelineRunsActiveInPeriod() { } }); final List pipelineRuns = pipelineRunDao.loadPipelineRunsActiveInPeriod(SYNC_PERIOD_START, - SYNC_PERIOD_END); + SYNC_PERIOD_END, + false); assertEquals(4, pipelineRuns.size()); + + final List pipelineRunsWithArchive = pipelineRunDao.loadPipelineRunsActiveInPeriod( + SYNC_PERIOD_START, + SYNC_PERIOD_END, + true); + assertEquals(5, pipelineRunsWithArchive.size()); } @Test @@ -1535,6 +1556,15 @@ private void createRunWithStartEndDates(final LocalDateTime startDate, final Loc pipelineRunDao.createPipelineRun(run); } + private void archiveRunWithStartEndDates(final LocalDateTime startDate, final LocalDateTime endDate) { + final PipelineRun run = buildPipelineRun(testPipeline.getId(), + TestUtils.convertLocalDateTimeToDate(startDate), + TestUtils.convertLocalDateTimeToDate(endDate)); + run.setStatus(TaskStatus.STOPPED); + run.setId(pipelineRunDao.createRunId()); + archiveRunDao.batchInsertArchiveRuns(Collections.singletonList(run)); + } + private PipelineRun buildRunWithTool(final Long pipelineId, final String prettyUrl, final List sids) { final PipelineRun pipelineRun = buildPipelineRun(pipelineId); pipelineRun.setDockerImage(DOCKER_IMAGE); diff --git a/api/src/test/java/com/epam/pipeline/manager/pipeline/PipelineRunManagerLaunchTest.java b/api/src/test/java/com/epam/pipeline/manager/pipeline/PipelineRunManagerLaunchTest.java index 070ccc5927..5c4fe29c90 100644 --- a/api/src/test/java/com/epam/pipeline/manager/pipeline/PipelineRunManagerLaunchTest.java +++ b/api/src/test/java/com/epam/pipeline/manager/pipeline/PipelineRunManagerLaunchTest.java @@ -399,16 +399,18 @@ public void launchPipelineShouldRegisterNotificationsRequestsIfSpecified() { @Test public void shouldLoadRunsActivityStats() { doReturn(asList(getPipelineRun(ID, TEST_USER), getPipelineRun(ID_2, TEST_USER))) - .when(pipelineRunDao).loadPipelineRunsActiveInPeriod(eq(TEST_PERIOD), eq(TEST_PERIOD_18)); + .when(pipelineRunDao).loadPipelineRunsActiveInPeriod(eq(TEST_PERIOD), eq(TEST_PERIOD_18), eq(false)); doReturn(getStatusMap()).when(runStatusManager).loadRunStatus(anyListOf(Long.class)); - Map runMap = pipelineRunManager.loadRunsActivityStats(TEST_PERIOD, TEST_PERIOD_18).stream() + Map runMap = pipelineRunManager + .loadRunsActivityStats(TEST_PERIOD, TEST_PERIOD_18, false).stream() .collect(toMap(BaseEntity::getId, identity())); assertEquals(asList(TEST_STATUS_1, TEST_STATUS_2), runMap.get(ID).getRunStatuses()); assertEquals(singletonList(TEST_STATUS_3), runMap.get(ID_2).getRunStatuses()); - verify(pipelineRunDao).loadPipelineRunsActiveInPeriod(any(LocalDateTime.class), any(LocalDateTime.class)); + verify(pipelineRunDao).loadPipelineRunsActiveInPeriod( + any(LocalDateTime.class), any(LocalDateTime.class), anyBoolean()); verify(runStatusManager).loadRunStatus(anyListOf(Long.class)); } diff --git a/api/src/test/java/com/epam/pipeline/test/acl/AclTestBeans.java b/api/src/test/java/com/epam/pipeline/test/acl/AclTestBeans.java index a7cd7bee7e..9dc3aa1454 100644 --- a/api/src/test/java/com/epam/pipeline/test/acl/AclTestBeans.java +++ b/api/src/test/java/com/epam/pipeline/test/acl/AclTestBeans.java @@ -100,7 +100,29 @@ import com.epam.pipeline.manager.notification.SystemNotificationManager; import com.epam.pipeline.manager.notification.UserNotificationManager; import com.epam.pipeline.manager.ontology.OntologyManager; -import com.epam.pipeline.manager.pipeline.*; +import com.epam.pipeline.manager.pipeline.ArchiveRunService; +import com.epam.pipeline.manager.pipeline.DocumentGenerationPropertyManager; +import com.epam.pipeline.manager.pipeline.FolderCrudManager; +import com.epam.pipeline.manager.pipeline.FolderManager; +import com.epam.pipeline.manager.pipeline.FolderTemplateManager; +import com.epam.pipeline.manager.pipeline.ParameterMapper; +import com.epam.pipeline.manager.pipeline.PipelineConfigurationManager; +import com.epam.pipeline.manager.pipeline.PipelineFileGenerationManager; +import com.epam.pipeline.manager.pipeline.PipelineManager; +import com.epam.pipeline.manager.pipeline.PipelineRunAsManager; +import com.epam.pipeline.manager.pipeline.PipelineRunCRUDService; +import com.epam.pipeline.manager.pipeline.PipelineRunDockerOperationManager; +import com.epam.pipeline.manager.pipeline.PipelineRunKubernetesManager; +import com.epam.pipeline.manager.pipeline.PipelineRunManager; +import com.epam.pipeline.manager.pipeline.PipelineVersionManager; +import com.epam.pipeline.manager.pipeline.RestartRunManager; +import com.epam.pipeline.manager.pipeline.RunLogManager; +import com.epam.pipeline.manager.pipeline.RunScheduleManager; +import com.epam.pipeline.manager.pipeline.RunStatusManager; +import com.epam.pipeline.manager.pipeline.StopServerlessRunManager; +import com.epam.pipeline.manager.pipeline.ToolGroupManager; +import com.epam.pipeline.manager.pipeline.ToolManager; +import com.epam.pipeline.manager.pipeline.ToolScanInfoManager; import com.epam.pipeline.manager.pipeline.runner.ConfigurationProviderManager; import com.epam.pipeline.manager.pipeline.runner.ConfigurationRunner; import com.epam.pipeline.manager.preference.PreferenceManager; diff --git a/api/src/test/java/com/epam/pipeline/test/aspect/AspectTestBeans.java b/api/src/test/java/com/epam/pipeline/test/aspect/AspectTestBeans.java index 4220d4d750..16100ec904 100644 --- a/api/src/test/java/com/epam/pipeline/test/aspect/AspectTestBeans.java +++ b/api/src/test/java/com/epam/pipeline/test/aspect/AspectTestBeans.java @@ -49,7 +49,16 @@ import com.epam.pipeline.dao.notification.NotificationDao; import com.epam.pipeline.dao.notification.NotificationSettingsDao; import com.epam.pipeline.dao.notification.NotificationTemplateDao; -import com.epam.pipeline.dao.pipeline.*; +import com.epam.pipeline.dao.pipeline.ArchiveRunDao; +import com.epam.pipeline.dao.pipeline.DocumentGenerationPropertyDao; +import com.epam.pipeline.dao.pipeline.FolderDao; +import com.epam.pipeline.dao.pipeline.PipelineDao; +import com.epam.pipeline.dao.pipeline.PipelineRunDao; +import com.epam.pipeline.dao.pipeline.RestartRunDao; +import com.epam.pipeline.dao.pipeline.RunLogDao; +import com.epam.pipeline.dao.pipeline.RunScheduleDao; +import com.epam.pipeline.dao.pipeline.RunStatusDao; +import com.epam.pipeline.dao.pipeline.StopServerlessRunDao; import com.epam.pipeline.dao.preference.PreferenceDao; import com.epam.pipeline.dao.region.CloudRegionDao; import com.epam.pipeline.dao.run.RunServiceUrlDao; diff --git a/billing-report-agent/src/main/java/com/epam/pipeline/billingreportagent/service/impl/CloudPipelineAPIClient.java b/billing-report-agent/src/main/java/com/epam/pipeline/billingreportagent/service/impl/CloudPipelineAPIClient.java index ecc6656039..75e7f1919f 100644 --- a/billing-report-agent/src/main/java/com/epam/pipeline/billingreportagent/service/impl/CloudPipelineAPIClient.java +++ b/billing-report-agent/src/main/java/com/epam/pipeline/billingreportagent/service/impl/CloudPipelineAPIClient.java @@ -60,7 +60,7 @@ public List loadAllUsers() { } public List loadAllPipelineRunsActiveInPeriod(final String from, final String to) { - return retryingApiExecutor.execute(cloudPipelineAPI.loadRunsActivityStats(from, to)); + return retryingApiExecutor.execute(cloudPipelineAPI.loadRunsActivityStats(from, to, true)); } public List loadAllDataStorages() { diff --git a/cloud-pipeline-common/model/src/main/java/com/epam/pipeline/client/pipeline/CloudPipelineAPI.java b/cloud-pipeline-common/model/src/main/java/com/epam/pipeline/client/pipeline/CloudPipelineAPI.java index 0d200ee6bb..f772a55b38 100644 --- a/cloud-pipeline-common/model/src/main/java/com/epam/pipeline/client/pipeline/CloudPipelineAPI.java +++ b/cloud-pipeline-common/model/src/main/java/com/epam/pipeline/client/pipeline/CloudPipelineAPI.java @@ -285,7 +285,8 @@ Call>> loadRepositoryContent(@Path(ID) Long id, Call> createNotification(@Body NotificationMessageVO notification); @GET("run/activity") - Call>> loadRunsActivityStats(@Query(FROM) String from, @Query(TO) String to); + Call>> loadRunsActivityStats(@Query(FROM) String from, @Query(TO) String to, + @Query("archive") boolean archive); @GET("run/pools/{id}") Call>> loadRunsByPool(@Path(ID) Long poolId);