in aws-sso-assignment/src/main/java/software/amazon/sso/assignment/DeleteHandler.java [29:84]
protected ProgressEvent<ResourceModel, CallbackContext> handleRequest(
final AmazonWebServicesClientProxy proxy,
final ResourceHandlerRequest<ResourceModel> request,
final CallbackContext callbackContext,
final ProxyClient<SsoAdminClient> proxyClient,
final Logger logger) {
this.logger = logger;
if (!callbackContext.isHandlerInvoked()) {
callbackContext.setHandlerInvoked(true);
callbackContext.setRetryAttempts(RETRY_ATTEMPTS);
}
AssignmentProxy assignmentProxy = new AssignmentProxy(proxy, proxyClient, logger);
return ProgressEvent.progress(request.getDesiredResourceState(), callbackContext)
.then(progress -> proxy.initiate("sso::assignment-delete", proxyClient, progress.getResourceModel(), progress.getCallbackContext())
.translateToServiceRequest(Translator::translateToDeleteRequest)
.makeServiceCall((modelRequest, client) -> {
if (!assignmentProxy.checkIfAssignmentAlreadyExist(modelRequest.instanceArn(), modelRequest.targetId(), modelRequest.permissionSetArn(), modelRequest.principalId(), modelRequest.principalTypeAsString())) {
throw new CfnNotFoundException(ResourceModel.TYPE_NAME, "Assignment not exist any more. Can't process deletion.");
}
logger.log("Assignment pre-existence check complete.");
DeleteAccountAssignmentResponse response = proxy.injectCredentialsAndInvokeV2(modelRequest, client.client()::deleteAccountAssignment);
logger.log(String.format("%s is in deleting process.", ResourceModel.TYPE_NAME));
return response;
})
.stabilize((modelRequest, response, client, model, context) -> {
String statusTrackId = response.accountAssignmentDeletionStatus().requestId();
DescribeAccountAssignmentDeletionStatusResponse checkStatusResponse = proxy.injectCredentialsAndInvokeV2(translateToDescribeDeletionStatusRequest(model.getInstanceArn(), statusTrackId),
proxyClient.client()::describeAccountAssignmentDeletionStatus);
AccountAssignmentOperationStatus deletionStatus = checkStatusResponse.accountAssignmentDeletionStatus();
if (deletionStatus.status().equals(StatusValues.SUCCEEDED)) {
logger.log(String.format("%s [%s] has been stabilized.", ResourceModel.TYPE_NAME, model.getPrimaryIdentifier()));
return true;
} else if (deletionStatus.status().equals(StatusValues.FAILED)) {
throw new CfnGeneralServiceException(String.format(FAILED_WORKFLOW_REQUEST, statusTrackId, deletionStatus.failureReason()));
}
return false;
})
.handleError((awsRequest, exception, client, resourceModel, context) -> {
if (exception instanceof ConflictException || exception instanceof ThrottlingException) {
return ProgressEvent.defaultInProgressHandler(callbackContext, getRetryTime(exception), resourceModel);
} else if (exception instanceof InternalServerException) {
if (context.getRetryAttempts() == RETRY_ATTEMPTS_ZERO) {
return ProgressEvent.defaultFailureHandler(exception, mapExceptionToHandlerCode(exception));
}
context.decrementRetryAttempts();
return ProgressEvent.defaultInProgressHandler(callbackContext, getRetryTime(exception), resourceModel);
}
return ProgressEvent.defaultFailureHandler(exception, HandlerErrorCode.GeneralServiceException);
})
.done((createPermissionSetRequest, createPermissionSetResponse, proxyInvocation, model, context) -> ProgressEvent.defaultSuccessHandler(null)));
}