in aws-sso-assignment/src/main/java/software/amazon/sso/assignment/CreateHandler.java [30:91]
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;
AssignmentProxy assignmentProxy = new AssignmentProxy(proxy, proxyClient, logger);
if (!callbackContext.isHandlerInvoked()) {
callbackContext.setHandlerInvoked(true);
callbackContext.setRetryAttempts(RETRY_ATTEMPTS);
}
return ProgressEvent.progress(request.getDesiredResourceState(), callbackContext)
.then(progress ->
proxy.initiate("sso::assignment-create", proxyClient,progress.getResourceModel(), progress.getCallbackContext())
.translateToServiceRequest(Translator::translateToCreateRequest)
.makeServiceCall((createRequest, client) -> {
if (assignmentProxy.checkIfAssignmentAlreadyExist(createRequest.instanceArn(), createRequest.targetId(), createRequest.permissionSetArn(), createRequest.principalId(), createRequest.principalTypeAsString())) {
throw new CfnAlreadyExistsException(ResourceModel.TYPE_NAME, "Assignment already exists. Can't process creation.");
}
logger.log("Assignment pre-existence check complete.");
CreateAccountAssignmentResponse response = proxy.injectCredentialsAndInvokeV2(createRequest, proxyClient.client()::createAccountAssignment);
logger.log(String.format("%s is in creating process.", ResourceModel.TYPE_NAME));
return response;
})
.stabilize((modelRequest, response, client, model, context) -> {
String statusTrackId = response.accountAssignmentCreationStatus().requestId();
DescribeAccountAssignmentCreationStatusResponse checkStatusResponse = proxy.injectCredentialsAndInvokeV2(translateToDescribeCreationStatusRequest(model.getInstanceArn(), statusTrackId),
proxyClient.client()::describeAccountAssignmentCreationStatus);
AccountAssignmentOperationStatus creationStatus = checkStatusResponse.accountAssignmentCreationStatus();
if (creationStatus.status().equals(StatusValues.SUCCEEDED)) {
logger.log(String.format("%s [%s] has been stabilized.", ResourceModel.TYPE_NAME, model.getPrimaryIdentifier()));
//reset the retry attemps for following read API
context.setRetryAttempts(RETRY_ATTEMPTS);
return true;
} else if (creationStatus.status().equals(StatusValues.FAILED)) {
throw new CfnGeneralServiceException(String.format(FAILED_WORKFLOW_REQUEST, statusTrackId, creationStatus.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);
})
.progress()
)
.then(progress -> new ReadHandler().handleRequest(proxy, request, callbackContext, proxyClient, logger));
}