@Override public void saveRequestHistoryUpdate(SingularityRequestHistory requestHistory) { if (LOG.isTraceEnabled()) { LOG.trace("saveRequestHistoryUpdate requestHistory {}", requestHistory); } history.insertRequestHistory(requestHistory.getRequest().getId(), singularityRequestTranscoder.toBytes(requestHistory.getRequest()), new Date(requestHistory.getCreatedAt()), requestHistory.getEventType().name(), getUserField(requestHistory.getUser()), getMessageField(requestHistory.getMessage())); }
@Override public SingularityRequestHistory map(int index, ResultSet r, StatementContext ctx) throws SQLException { try { return new SingularityRequestHistory(r.getTimestamp("createdAt").getTime(), Optional.fromNullable(r.getString(userColumn)), RequestHistoryType.valueOf(r.getString("requestState")), singularityRequestTranscoder.fromBytes(r.getBytes("request")), Optional.fromNullable(r.getString("message"))); } catch (SingularityTranscoderException e) { throw new ResultSetException("Could not deserialize database result", e, ctx); } } }
private String getRequestHistoryUpdateId(SingularityRequestHistory requestUpdate) { return requestUpdate.getRequest().getId() + "-" + requestUpdate.getEventType().name() + "-" + requestUpdate.getCreatedAt(); }
@Override public int compareTo(SingularityRequestHistory o) { return ComparisonChain .start() .compare(o.getCreatedAt(), createdAt) .compare(request.getId(), o.getRequest().getId()) .result(); }
public SingularityRequestHistoryParent(List<SingularityRequestHistory> history, String requestId) { this.history = history; this.requestId = requestId; long newestTimestamp = 0; for (SingularityRequestHistory historyItem : history) { if (historyItem.getCreatedAt() > newestTimestamp) { newestTimestamp = historyItem.getCreatedAt(); } } createTime = newestTimestamp; }
private Collection<String> getS3PrefixesForRequest(S3Configuration s3Configuration, String requestId, Optional<Long> startArg, Optional<Long> endArg, String group) { Optional<SingularityRequestHistory> firstHistory = requestHistoryHelper.getFirstHistory(requestId); checkNotFound(firstHistory.isPresent(), "No request history found for %s", requestId); long start = firstHistory.get().getCreatedAt(); if (startArg.isPresent()) { start = Math.max(startArg.get(), start); } Optional<SingularityRequestHistory> lastHistory = requestHistoryHelper.getLastHistory(requestId); long end = System.currentTimeMillis(); if (lastHistory.isPresent() && (lastHistory.get().getEventType() == RequestHistoryType.DELETED || lastHistory.get().getEventType() == RequestHistoryType.PAUSED)) { end = lastHistory.get().getCreatedAt() + TimeUnit.DAYS.toMillis(1); } if (endArg.isPresent()) { end = Math.min(endArg.get(), end); } Collection<String> prefixes = SingularityS3FormatHelper.getS3KeyPrefixes(s3Configuration.getS3KeyFormat(), requestId, start, end, group); for (SingularityS3UploaderFile additionalFile : s3Configuration.getS3UploaderAdditionalFiles()) { if (additionalFile.getS3UploaderKeyPattern().isPresent() && !additionalFile.getS3UploaderKeyPattern().get().equals(s3Configuration.getS3KeyFormat())) { prefixes.addAll(SingularityS3FormatHelper.getS3KeyPrefixes(additionalFile.getS3UploaderKeyPattern().get(), requestId, start, end, group)); } } LOG.trace("Request {} got S3 prefixes {} for start {}, end {}", requestId, prefixes, start, end); return prefixes; }
if (historyItem.getEventType() == RequestHistoryType.DELETED) { Assert.assertEquals("a msg", historyItem.getMessage().get()); } else if (historyItem.getEventType() == RequestHistoryType.SCALED) { Assert.assertEquals(280, historyItem.getMessage().get().length()); } else if (historyItem.getEventType() == RequestHistoryType.DELETING) { Assert.assertEquals("a msg", historyItem.getMessage().get()); } else { Assert.assertTrue(!historyItem.getMessage().isPresent());
private String applyPlaceholders(String uri, SingularityRequestHistory requestHistory) { return uri .replaceAll("\\$REQUEST_ID", requestHistory.getRequest().getId()); }
@Test public void itCorrectlyUpdatesRequestDeletingStateHistory() { initRequest(); Assert.assertEquals(RequestState.ACTIVE, requestManager.getRequest(requestId).get().getState()); Assert.assertEquals(1, requestManager.getRequestHistory(requestId).size()); requestManager.startDeletingRequest(request, Optional.absent(), Optional.<String>absent(), Optional.<String>absent(), Optional.of("the cake is a lie")); Assert.assertEquals(RequestState.DELETING, requestManager.getRequest(requestId).get().getState()); Assert.assertEquals(2, requestManager.getRequestHistory(requestId).size()); cleaner.drainCleanupQueue(); Assert.assertEquals(3, requestManager.getRequestHistory(requestId).size()); List<RequestHistoryType> historyTypes = new ArrayList<>(); for (SingularityRequestHistory request : requestManager.getRequestHistory(requestId)) { historyTypes.add(request.getEventType()); } Assert.assertTrue(historyTypes.contains(RequestHistoryType.CREATED)); Assert.assertTrue(historyTypes.contains(RequestHistoryType.DELETING)); Assert.assertTrue(historyTypes.contains(RequestHistoryType.DELETED)); }
private boolean userModifiedRequestLast(Optional<SingularityRequestHistory> lastHistory, SingularityUser user) { return lastHistory.isPresent() && userMatches(lastHistory.get().getUser(), user); }
private String getHistoryPath(SingularityRequestHistory history) { return ZKPaths.makePath(getHistoryParentPath(history.getRequest().getId()), history.getEventType() + "-" + history.getCreatedAt()); }
private boolean healthchecksSkipped(SingularityTaskId taskId, List<SingularityRequestHistory> requestHistories, SingularityDeploy deploy) { if (deploy.getSkipHealthchecksOnDeploy().or(false)) { return true; } Optional<SingularityTask> maybeTask = taskManager.getTask(taskId); if (maybeTask.isPresent()) { if (maybeTask.get().getTaskRequest().getPendingTask().getSkipHealthchecks().or(false)) { return true; } Optional<Long> runningStartTime = getRunningAt(taskManager.getTaskHistoryUpdates(taskId)); if (runningStartTime.isPresent()) { Optional<SingularityRequestHistory> previousHistory = Optional.absent(); for (SingularityRequestHistory history : requestHistories) { if (history.getCreatedAt() < runningStartTime.get() && (!previousHistory.isPresent() || previousHistory.get().getCreatedAt() < history.getCreatedAt())) { previousHistory = Optional.of(history); } } if (previousHistory.isPresent() && previousHistory.get().getRequest().getSkipHealthchecks().or(false)) { return true; } } } return false; }
private long getLastActionTimeForRequest(SingularityRequest request, Optional<SingularityRequestHistory> lastHistory, Optional<SingularityRequestDeployState> deployState, Optional<SingularityTaskIdHistory> mostRecentTask) { long lastUpdate = 0; if (lastHistory.isPresent()) { lastUpdate = lastHistory.get().getCreatedAt(); } if (deployState.isPresent()) { if (deployState.get().getActiveDeploy().isPresent()) { lastUpdate = Math.max(lastUpdate, deployState.get().getActiveDeploy().get().getTimestamp()); } if (deployState.get().getPendingDeploy().isPresent()) { lastUpdate = Math.max(lastUpdate, deployState.get().getPendingDeploy().get().getTimestamp()); } } // Only consider most recent task time for non-long-running if (mostRecentTask.isPresent() && !request.getRequestType().isLongRunning()) { lastUpdate = Math.max(lastUpdate, mostRecentTask.get().getUpdatedAt()); } return lastUpdate; } }
private Collection<String> getS3PrefixesForRequest(S3Configuration s3Configuration, String requestId, Optional<Long> startArg, Optional<Long> endArg, String group) { Optional<SingularityRequestHistory> firstHistory = requestHistoryHelper.getFirstHistory(requestId); checkNotFound(firstHistory.isPresent(), "No request history found for %s", requestId); long start = firstHistory.get().getCreatedAt(); if (startArg.isPresent()) { start = Math.max(startArg.get(), start); } Optional<SingularityRequestHistory> lastHistory = requestHistoryHelper.getLastHistory(requestId); long end = System.currentTimeMillis(); if (lastHistory.isPresent() && (lastHistory.get().getEventType() == RequestHistoryType.DELETED || lastHistory.get().getEventType() == RequestHistoryType.PAUSED)) { end = lastHistory.get().getCreatedAt() + TimeUnit.DAYS.toMillis(1); } if (endArg.isPresent()) { end = Math.min(endArg.get(), end); } Collection<String> prefixes = SingularityS3FormatHelper.getS3KeyPrefixes(s3Configuration.getS3KeyFormat(), requestId, start, end, group); for (SingularityS3UploaderFile additionalFile : s3Configuration.getS3UploaderAdditionalFiles()) { if (additionalFile.getS3UploaderKeyPattern().isPresent() && !additionalFile.getS3UploaderKeyPattern().get().equals(s3Configuration.getS3KeyFormat())) { prefixes.addAll(SingularityS3FormatHelper.getS3KeyPrefixes(additionalFile.getS3UploaderKeyPattern().get(), requestId, start, end, group)); } } LOG.trace("Request {} got S3 prefixes {} for start {}, end {}", requestId, prefixes, start, end); return prefixes; }
if (historyItem.getEventType() == RequestHistoryType.DELETED) { Assert.assertEquals("a msg", historyItem.getMessage().get()); } else if (historyItem.getEventType() == RequestHistoryType.SCALED) { Assert.assertEquals(280, historyItem.getMessage().get().length()); } else if (historyItem.getEventType() == RequestHistoryType.DELETING) { Assert.assertEquals("a msg", historyItem.getMessage().get()); } else { Assert.assertTrue(!historyItem.getMessage().isPresent());
private Optional<String> getRequestGroup(final String requestId, SingularityUser user) { final Optional<SingularityRequestWithState> maybeRequest = requestManager.getRequest(requestId); if (maybeRequest.isPresent()) { authorizationHelper.checkForAuthorization(maybeRequest.get().getRequest(), user, SingularityAuthorizationScope.READ); return maybeRequest.get().getRequest().getGroup(); } else { Optional<SingularityRequestHistory> maybeRequestHistory = requestHistoryHelper.getLastHistory(requestId); if (maybeRequestHistory.isPresent()) { authorizationHelper.checkForAuthorization(maybeRequestHistory.get().getRequest(), user, SingularityAuthorizationScope.READ); return maybeRequestHistory.get().getRequest().getGroup(); } else { // Deleted requests with no history data are searchable, but only by admins since we have no auth information about them authorizationHelper.checkAdminAuthorization(user); return Optional.absent(); } } }
@Test public void itCorrectlyUpdatesRequestDeletingStateHistory() { initRequest(); Assert.assertEquals(RequestState.ACTIVE, requestManager.getRequest(requestId).get().getState()); Assert.assertEquals(1, requestManager.getRequestHistory(requestId).size()); requestManager.startDeletingRequest(request, Optional.absent(), Optional.<String>absent(), Optional.<String>absent(), Optional.of("the cake is a lie")); Assert.assertEquals(RequestState.DELETING, requestManager.getRequest(requestId).get().getState()); Assert.assertEquals(2, requestManager.getRequestHistory(requestId).size()); cleaner.drainCleanupQueue(); Assert.assertEquals(3, requestManager.getRequestHistory(requestId).size()); List<RequestHistoryType> historyTypes = new ArrayList<>(); for (SingularityRequestHistory request : requestManager.getRequestHistory(requestId)) { historyTypes.add(request.getEventType()); } Assert.assertTrue(historyTypes.contains(RequestHistoryType.CREATED)); Assert.assertTrue(historyTypes.contains(RequestHistoryType.DELETING)); Assert.assertTrue(historyTypes.contains(RequestHistoryType.DELETED)); }
private boolean userModifiedRequestLast(Optional<SingularityRequestHistory> lastHistory, SingularityUser user) { return lastHistory.isPresent() && userMatches(lastHistory.get().getUser(), user); }
@Override public void saveRequestHistoryUpdate(SingularityRequestHistory requestHistory) { if (LOG.isTraceEnabled()) { LOG.trace("saveRequestHistoryUpdate requestHistory {}", requestHistory); } history.insertRequestHistory(requestHistory.getRequest().getId(), singularityRequestTranscoder.toBytes(requestHistory.getRequest()), new Date(requestHistory.getCreatedAt()), requestHistory.getEventType().name(), getUserField(requestHistory.getUser()), getMessageField(requestHistory.getMessage())); }
private String getRequestHistoryUpdateId(SingularityRequestHistory requestUpdate) { return requestUpdate.getRequest().getId() + "-" + requestUpdate.getEventType().name() + "-" + requestUpdate.getCreatedAt(); }