package software.amazon.datasync.locationhdfs; import software.amazon.awssdk.services.datasync.DataSyncClient; import software.amazon.awssdk.services.datasync.model.CreateLocationHdfsRequest; import software.amazon.awssdk.services.datasync.model.CreateLocationHdfsResponse; import software.amazon.awssdk.services.datasync.model.DataSyncException; import software.amazon.awssdk.services.datasync.model.InternalException; import software.amazon.awssdk.services.datasync.model.InvalidRequestException; import software.amazon.cloudformation.exceptions.CfnInvalidRequestException; import software.amazon.cloudformation.exceptions.CfnServiceInternalErrorException; import software.amazon.cloudformation.proxy.AmazonWebServicesClientProxy; import software.amazon.cloudformation.proxy.Logger; import software.amazon.cloudformation.proxy.ProgressEvent; import software.amazon.cloudformation.proxy.ResourceHandlerRequest; import java.util.HashMap; import java.util.Map; public class CreateHandler extends BaseHandler { private static final String AWS_TAG_PREFIX = "aws:"; @Override public ProgressEvent handleRequest( final AmazonWebServicesClientProxy proxy, final ResourceHandlerRequest request, final CallbackContext callbackContext, final Logger logger) { final ResourceModel model = request.getDesiredResourceState(); final DataSyncClient client = ClientBuilder.getClient(); if (callbackContext == null && (request.getDesiredResourceState().getLocationArn() != null)) { throw new CfnInvalidRequestException("LocationArn cannot be specified to create a location."); } Map tagList = request.getDesiredResourceTags(); if (tagList == null) { tagList = new HashMap(); } // Check for invalid requested system tags. for (String key : tagList.keySet()) { if (key.trim().toLowerCase().startsWith(AWS_TAG_PREFIX)) { throw new CfnInvalidRequestException(key + " is an invalid key. aws: prefixed tag key names cannot be requested."); } } // Retrieve default stack-level tags with aws:cloudformation prefix. Map systemTagList = request.getSystemTags(); if (systemTagList != null) { tagList.putAll(systemTagList); } CreateLocationHdfsRequest createLocationHdfsRequest = Translator.translateToCreateRequest(model, tagList); if (Translator.hasInvalidPresignedUrl(model, createLocationHdfsRequest)) { throw new CfnInvalidRequestException("Invalid or expired presigned URL"); } CreateLocationHdfsResponse response; try { response = proxy.injectCredentialsAndInvokeV2(createLocationHdfsRequest, client::createLocationHdfs); logger.log(String.format("%s created successfully.", ResourceModel.TYPE_NAME)); } catch (InvalidRequestException e) { throw new CfnInvalidRequestException(e.getMessage(), e.getCause()); } catch (InternalException e) { throw new CfnServiceInternalErrorException(e.getMessage(), e.getCause()); } catch (DataSyncException e) { throw Translator.translateDataSyncExceptionToCfnException(e); } ResourceModel modelWithArn = ResourceModel.builder() .locationArn(response.locationArn()) .build(); ResourceHandlerRequest requestWithArn = request.toBuilder() .desiredResourceState(modelWithArn) .build(); return new ReadHandler().handleRequest(proxy, requestWithArn, callbackContext, logger); } }