use of com.sequenceiq.cloudbreak.api.endpoint.v4.stacks.base.InstanceStatus.FAILED in project cloudbreak by hortonworks.
the class SdxBackupRestoreService method getStackResponseAttemptResult.
private AttemptResult<StackV4Response> getStackResponseAttemptResult(SdxCluster sdxCluster, String pollingMessage, FlowState flowState) throws JsonProcessingException {
StackV4Response stackV4Response = ThreadBasedUserCrnProvider.doAsInternalActor(regionAwareInternalCrnGeneratorFactory.iam().getInternalCrnForServiceAsString(), () -> stackV4Endpoint.get(0L, sdxCluster.getClusterName(), Collections.emptySet(), sdxCluster.getAccountId()));
LOGGER.info("Response from cloudbreak: {}", JsonUtil.writeValueAsString(stackV4Response));
ClusterV4Response cluster = stackV4Response.getCluster();
if (isStackOrClusterDrStatusComplete(stackV4Response.getStatus()) && isStackOrClusterDrStatusComplete(cluster.getStatus())) {
return sdxDrSucceeded(stackV4Response);
} else if (isStackOrClusterStatusFailed(stackV4Response.getStatus())) {
LOGGER.info("{} failed for Stack {} with status {}", pollingMessage, stackV4Response.getName(), stackV4Response.getStatus());
return sdxDrFailed(sdxCluster, stackV4Response.getStatusReason(), pollingMessage);
} else if (isStackOrClusterStatusFailed(stackV4Response.getCluster().getStatus())) {
LOGGER.info("{} failed for Cluster {} status {}", pollingMessage, stackV4Response.getCluster().getName(), stackV4Response.getCluster().getStatus());
return sdxDrFailed(sdxCluster, stackV4Response.getCluster().getStatusReason(), pollingMessage);
} else if (FINISHED.equals(flowState)) {
LOGGER.info("Flow finished, but Backup/Restore is not complete: {}", sdxCluster.getClusterName());
return sdxDrFailed(sdxCluster, "stack is in improper state", pollingMessage);
} else {
LOGGER.info("Flow is unknown state");
return sdxDrFailed(sdxCluster, "Flow is unknown state", pollingMessage);
}
}
use of com.sequenceiq.cloudbreak.api.endpoint.v4.stacks.base.InstanceStatus.FAILED in project cloudbreak by hortonworks.
the class SdxBackupRestoreService method databaseRestore.
public void databaseRestore(SdxOperation drStatus, Long clusterId, String backupId, String backupLocation) {
try {
sdxOperationRepository.save(drStatus);
sdxClusterRepository.findById(clusterId).ifPresentOrElse(sdxCluster -> {
String initiatorUserCrn = ThreadBasedUserCrnProvider.getUserCrn();
RestoreV4Response restoreV4Response = ThreadBasedUserCrnProvider.doAsInternalActor(regionAwareInternalCrnGeneratorFactory.iam().getInternalCrnForServiceAsString(), () -> stackV4Endpoint.restoreDatabaseByNameInternal(0L, sdxCluster.getClusterName(), backupLocation, backupId, initiatorUserCrn));
updateSuccessStatus(drStatus.getOperationId(), sdxCluster, restoreV4Response.getFlowIdentifier(), SdxOperationStatus.TRIGGERRED);
}, () -> {
updateFailureStatus(drStatus.getOperationId(), clusterId, String.format("SDX cluster with Id [%d] not found", clusterId));
});
} catch (WebApplicationException e) {
String errorMessage = webApplicationExceptionMessageExtractor.getErrorMessage(e);
String message = String.format("Database restore failed for datalake-id: [%d]. Message: [%s]", clusterId, errorMessage);
throw new CloudbreakApiException(message);
}
}
use of com.sequenceiq.cloudbreak.api.endpoint.v4.stacks.base.InstanceStatus.FAILED in project cloudbreak by hortonworks.
the class SdxBackupRestoreService method databaseBackup.
public void databaseBackup(SdxOperation drStatus, Long clusterId, SdxDatabaseBackupRequest backupRequest) {
try {
sdxOperationRepository.save(drStatus);
sdxClusterRepository.findById(clusterId).ifPresentOrElse(sdxCluster -> {
String initiatorUserCrn = ThreadBasedUserCrnProvider.getUserCrn();
BackupV4Response backupV4Response = ThreadBasedUserCrnProvider.doAsInternalActor(regionAwareInternalCrnGeneratorFactory.iam().getInternalCrnForServiceAsString(), () -> stackV4Endpoint.backupDatabaseByNameInternal(0L, sdxCluster.getClusterName(), backupRequest.getBackupId(), backupRequest.getBackupLocation(), backupRequest.getCloseConnections(), initiatorUserCrn));
updateSuccessStatus(drStatus.getOperationId(), sdxCluster, backupV4Response.getFlowIdentifier(), SdxOperationStatus.TRIGGERRED);
}, () -> {
updateFailureStatus(drStatus.getOperationId(), clusterId, String.format("SDX cluster with Id [%d] not found", clusterId));
});
} catch (WebApplicationException e) {
String errorMessage = webApplicationExceptionMessageExtractor.getErrorMessage(e);
String message = String.format("Database backup failed for datalake-id: [%d]. Message: [%s]", clusterId, errorMessage);
throw new CloudbreakApiException(message);
}
}
use of com.sequenceiq.cloudbreak.api.endpoint.v4.stacks.base.InstanceStatus.FAILED in project cloudbreak by hortonworks.
the class CloudbreakPoller method getStackResponseAttemptResult.
private AttemptResult<StackStatusV4Response> getStackResponseAttemptResult(String process, SdxCluster sdxCluster, FlowState flowState, Set<Status> targetStatuses, Set<Status> failedStatuses) {
StackStatusV4Response statusResponse = getStackAndClusterStatusWithInternalActor(sdxCluster);
LOGGER.info("Response from cloudbreak: {}", statusResponse);
if (FAILED.equals(flowState)) {
String message = sdxStatusService.getShortStatusMessage(statusResponse);
LOGGER.info("{} flow finished, but failed. {}", process, message);
return failedPolling(process, sdxCluster, message);
} else if (oneOf(statusResponse.getStatus(), targetStatuses) && oneOf(statusResponse.getClusterStatus(), targetStatuses)) {
return AttemptResults.finishWith(statusResponse);
} else if (oneOf(statusResponse.getStatus(), failedStatuses)) {
LOGGER.info("{} failed. Stack is in {} status.", process, statusResponse.getStatus());
return failedPolling(process, sdxCluster, statusResponse.getStatusReason());
} else if (oneOf(statusResponse.getClusterStatus(), failedStatuses)) {
LOGGER.info("{} failed. Cluster is in {} status.", process, statusResponse.getClusterStatus());
return failedPolling(process, sdxCluster, statusResponse.getClusterStatusReason());
} else if (FINISHED.equals(flowState)) {
String message = sdxStatusService.getShortStatusMessage(statusResponse);
LOGGER.info("{} flow finished, but stack or cluster is not available. {}", process, message);
return failedPolling(process, sdxCluster, message);
} else {
return AttemptResults.justContinue();
}
}
use of com.sequenceiq.cloudbreak.api.endpoint.v4.stacks.base.InstanceStatus.FAILED in project cloudbreak by hortonworks.
the class CreateExternalDatabaseHandler method accept.
@Override
public void accept(Event<CreateExternalDatabaseRequest> createExternalDatabaseRequest) {
LOGGER.debug("In CreateExternalDatabaseHandler.accept");
CreateExternalDatabaseRequest request = createExternalDatabaseRequest.getData();
Stack stack = stackService.getById(request.getResourceId());
DatabaseAvailabilityType externalDatabase = ObjectUtils.defaultIfNull(stack.getExternalDatabaseCreationType(), DatabaseAvailabilityType.NONE);
LOGGER.debug("External database: {} for stack {}", externalDatabase.name(), stack.getName());
Selectable result;
try {
String resourceCrn = null;
if (externalDatabase.isEmbedded()) {
LOGGER.info("External database for stack {} is not requested.", stack.getName());
} else {
LOGGER.debug("Updating stack {} status from {} to {}", stack.getName(), stack.getStatus().name(), DetailedStackStatus.EXTERNAL_DATABASE_CREATION_IN_PROGRESS.name());
stackUpdaterService.updateStatus(stack.getId(), DetailedStackStatus.EXTERNAL_DATABASE_CREATION_IN_PROGRESS, ResourceEvent.CLUSTER_EXTERNAL_DATABASE_CREATION_STARTED, "External database creation in progress");
LOGGER.debug("Getting environment CRN for stack {}", stack.getName());
DetailedEnvironmentResponse environment = environmentClientService.getByCrn(stack.getEnvironmentCrn());
environmentValidator.checkValidEnvironment(stack.getName(), externalDatabase, environment);
provisionService.provisionDatabase(stack.getCluster(), externalDatabase, environment);
LOGGER.debug("Updating stack {} status from {} to {}", stack.getName(), stack.getStatus().name(), DetailedStackStatus.PROVISION_REQUESTED.name());
stackUpdaterService.updateStatus(stack.getId(), DetailedStackStatus.PROVISION_REQUESTED, ResourceEvent.CLUSTER_EXTERNAL_DATABASE_CREATION_FINISHED, "External database creation finished");
resourceCrn = stack.getCluster().getDatabaseServerCrn();
}
result = new CreateExternalDatabaseResult(stack.getId(), EXTERNAL_DATABASE_WAIT_SUCCESS_EVENT.event(), stack.getName(), resourceCrn);
} catch (UserBreakException e) {
LOGGER.info("Database polling exited before timeout. Cause: ", e);
result = createFailedEvent(stack, e);
} catch (PollerStoppedException e) {
LOGGER.info(String.format("Database poller stopped for stack: %s", stack.getName()), e);
result = createFailedEvent(stack, e);
} catch (PollerException e) {
LOGGER.info(String.format("Database polling failed for stack: %s", stack.getName()), e);
result = createFailedEvent(stack, e);
} catch (Exception e) {
LOGGER.error(String.format("Exception during DB creation for stack/cluster: %s", stack.getName()), e);
result = createFailedEvent(stack, e);
}
LOGGER.debug("Sending reactor notification for selector {}", result.selector());
eventBus.notify(result.selector(), new Event<>(createExternalDatabaseRequest.getHeaders(), result));
}
Aggregations