use of org.finra.herd.model.api.xml.AwsCredential in project herd by FINRAOS.
the class BusinessObjectDataRestControllerTest method testGetBusinessObjectDataDownloadCredential.
@Test
public void testGetBusinessObjectDataDownloadCredential() {
// Create a business object data key.
BusinessObjectDataKey businessObjectDataKey = new BusinessObjectDataKey(BDEF_NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION, PARTITION_VALUE, SUBPARTITION_VALUES, DATA_VERSION);
// Create an AWS credential.
AwsCredential awsCredential = new AwsCredential(AWS_ASSUMED_ROLE_ACCESS_KEY, AWS_ASSUMED_ROLE_SECRET_KEY, AWS_ASSUMED_ROLE_SESSION_TOKEN, AWS_ASSUMED_ROLE_SESSION_EXPIRATION_TIME);
// Create a storage unit download credential.
StorageUnitDownloadCredential storageUnitDownloadCredential = new StorageUnitDownloadCredential(awsCredential);
// Mock the external calls.
when(storageUnitService.getStorageUnitDownloadCredential(businessObjectDataKey, STORAGE_NAME)).thenReturn(storageUnitDownloadCredential);
// Call the method under test.
BusinessObjectDataDownloadCredential result = businessObjectDataRestController.getBusinessObjectDataDownloadCredential(BDEF_NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION, PARTITION_VALUE, DATA_VERSION, STORAGE_NAME, getDelimitedFieldValues(SUBPARTITION_VALUES));
// Verify the external calls.
verify(storageUnitService).getStorageUnitDownloadCredential(businessObjectDataKey, STORAGE_NAME);
verifyNoMoreInteractionsHelper();
// Validate the results.
assertEquals(new BusinessObjectDataDownloadCredential(awsCredential), result);
}
use of org.finra.herd.model.api.xml.AwsCredential in project herd by FINRAOS.
the class BusinessObjectDataRestControllerTest method testGetBusinessObjectDataUploadCredential.
@Test
public void testGetBusinessObjectDataUploadCredential() {
// Create a business object data key.
BusinessObjectDataKey businessObjectDataKey = new BusinessObjectDataKey(BDEF_NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION, PARTITION_VALUE, SUBPARTITION_VALUES, DATA_VERSION);
// Create an AWS credential.
AwsCredential awsCredential = new AwsCredential(AWS_ASSUMED_ROLE_ACCESS_KEY, AWS_ASSUMED_ROLE_SECRET_KEY, AWS_ASSUMED_ROLE_SESSION_TOKEN, AWS_ASSUMED_ROLE_SESSION_EXPIRATION_TIME);
// Create a storage unit download credential.
StorageUnitUploadCredential storageUnitUploadCredential = new StorageUnitUploadCredential(awsCredential, AWS_KMS_KEY_ID);
// Mock the external calls.
when(storageUnitService.getStorageUnitUploadCredential(businessObjectDataKey, CREATE_NEW_VERSION, STORAGE_NAME)).thenReturn(storageUnitUploadCredential);
// Call the method under test.
BusinessObjectDataUploadCredential result = businessObjectDataRestController.getBusinessObjectDataUploadCredential(BDEF_NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION, PARTITION_VALUE, DATA_VERSION, CREATE_NEW_VERSION, STORAGE_NAME, getDelimitedFieldValues(SUBPARTITION_VALUES));
// Verify the external calls.
verify(storageUnitService).getStorageUnitUploadCredential(businessObjectDataKey, CREATE_NEW_VERSION, STORAGE_NAME);
verifyNoMoreInteractionsHelper();
// Validate the results.
assertEquals(new BusinessObjectDataUploadCredential(awsCredential, AWS_KMS_KEY_ID), result);
}
use of org.finra.herd.model.api.xml.AwsCredential in project herd by FINRAOS.
the class UploaderController method performUpload.
/**
* Executes the uploader workflow.
*
* @param regServerAccessParamsDto the DTO for the parameters required to communicate with the registration server
* @param manifestPath the local path to the manifest file
* @param params the S3 file transfer request parameters being used to pass the following arguments: <ul> <li><code>s3AccessKey</code> the S3 access key
* <li><code>s3SecretKey</code> the S3 secret key <li><code>localPath</code> the local path to directory containing data files
* <li><code>httpProxyHost</code> the HTTP proxy host <li><code>httpProxyPort</code> the HTTP proxy port <li><code>maxThreads</code> the maximum number of
* threads to use for file transfer to S3< <li><code>useRrs</code> specifies whether S3 reduced redundancy storage option will be used when copying to S3
* </ul>
* @param createNewVersion if not set, only initial version of the business object data is allowed to be created
* @param force if set, allows upload to proceed when the latest version of the business object data has UPLOADING status by invalidating that version
* @param maxRetryAttempts the maximum number of the business object data registration retry attempts
* @param retryDelaySecs the delay in seconds between the business object data registration retry attempts
*
* @throws InterruptedException if the upload thread was interrupted.
* @throws JAXBException if a JAXB error was encountered.
* @throws IOException if an I/O error was encountered.
* @throws URISyntaxException if a URI syntax error was encountered.
*/
@SuppressFBWarnings(value = "BC_UNCONFIRMED_CAST_OF_RETURN_VALUE", justification = "manifestReader.readJsonManifest will always return an UploaderInputManifestDto object.")
public void performUpload(RegServerAccessParamsDto regServerAccessParamsDto, File manifestPath, S3FileTransferRequestParamsDto params, Boolean createNewVersion, Boolean force, Integer maxRetryAttempts, Integer retryDelaySecs) throws InterruptedException, JAXBException, IOException, URISyntaxException {
boolean cleanUpS3KeyPrefixOnFailure = false;
BusinessObjectDataKey businessObjectDataKey = null;
try {
// Process manifest file
UploaderInputManifestDto manifest = manifestReader.readJsonManifest(manifestPath);
String storageName = getStorageNameFromManifest(manifest);
manifest.setStorageName(storageName);
// Validate local files and prepare a list of source files to copy to S3.
List<File> sourceFiles = getValidatedLocalFiles(params.getLocalPath(), manifest.getManifestFiles());
// Validate that we do not have duplicate files listed in the manifest file.
List<File> duplicateFiles = findDuplicateFiles(sourceFiles);
if (!duplicateFiles.isEmpty()) {
throw new IllegalArgumentException(String.format("Manifest contains duplicate file names. Duplicates: [\"%s\"]", StringUtils.join(duplicateFiles, "\", \"")));
}
// Initialize uploader web client.
uploaderWebClient.setRegServerAccessParamsDto(regServerAccessParamsDto);
// Handle the latest business object data version if one exists.
checkLatestBusinessObjectDataVersion(manifest, force);
// Pre-register a new version of business object data in UPLOADING state with the registration server.
BusinessObjectData businessObjectData = uploaderWebClient.preRegisterBusinessObjectData(manifest, storageName, createNewVersion);
// Get business object data key.
businessObjectDataKey = businessObjectDataHelper.getBusinessObjectDataKey(businessObjectData);
// Get the business object data version.
Integer businessObjectDataVersion = businessObjectDataKey.getBusinessObjectDataVersion();
// Add credential provider.
params.getAdditionalAwsCredentialsProviders().add(new AutoRefreshCredentialProvider() {
@Override
public AwsCredential getNewAwsCredential() throws Exception {
return uploaderWebClient.getBusinessObjectDataUploadCredential(manifest, storageName, businessObjectDataVersion, null).getAwsCredential();
}
});
// Get S3 key prefix from the business object data pre-registration response.
String s3KeyPrefix = IterableUtils.get(businessObjectData.getStorageUnits(), 0).getStorageDirectory().getDirectoryPath();
// Get S3 bucket information.
Storage storage = uploaderWebClient.getStorage(storageName);
// Get S3 bucket name. Please note that since this value is required we pass a "true" flag.
String s3BucketName = storageHelper.getStorageAttributeValueByName(configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_BUCKET_NAME), storage, true);
// Set the KMS ID, if available
String kmsKeyId = storageHelper.getStorageAttributeValueByName(configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_KMS_KEY_ID), storage, false);
params.setKmsKeyId(kmsKeyId);
// Special handling for the maxThreads command line option.
params.setMaxThreads(adjustIntegerValue(params.getMaxThreads(), MIN_THREADS, MAX_THREADS));
// Populate several missing fields in the S3 file transfer request parameters DTO.
params.setS3BucketName(s3BucketName);
// Since the S3 key prefix represents a directory, we add a trailing '/' character to it.
params.setS3KeyPrefix(s3KeyPrefix + "/");
params.setFiles(sourceFiles);
// When listing S3 files, by default, we do not ignore 0 byte objects that represent S3 directories.
if (s3Service.listDirectory(params).isEmpty()) {
cleanUpS3KeyPrefixOnFailure = true;
} else {
throw new IllegalStateException(String.format("The destination S3 folder is not empty. S3 Bucket Name: \"%s\". S3 key prefix: \"%s\".", params.getS3BucketName(), params.getS3KeyPrefix()));
}
// Upload files.
s3Service.uploadFileList(params);
// Get the list of files uploaded to S3 key prefix.
if (LOGGER.isInfoEnabled()) {
logS3KeyPrefixContents(params);
}
// Add storage files to the business object data.
addStorageFilesWithRetry(businessObjectDataKey, manifest, params, storage.getName(), maxRetryAttempts, retryDelaySecs);
// Change status of the business object data to VALID.
uploaderWebClient.updateBusinessObjectDataStatus(businessObjectDataKey, BusinessObjectDataStatusEntity.VALID);
} catch (InterruptedException | JAXBException | IOException | URISyntaxException e) {
// occurred, let's rollback the data transfer (clean up the S3 key prefix).
if (cleanUpS3KeyPrefixOnFailure) {
LOGGER.info(String.format("Rolling back the S3 data transfer by deleting keys/objects with prefix \"%s\" from bucket \"%s\".", params.getS3KeyPrefix(), params.getS3BucketName()));
s3Service.deleteDirectoryIgnoreException(params);
}
// If a new business object data version got pre-registered, update it's status to INVALID.
if (businessObjectDataKey != null) {
uploaderWebClient.updateBusinessObjectDataStatusIgnoreException(businessObjectDataKey, BusinessObjectDataStatusEntity.INVALID);
}
throw e;
}
}
use of org.finra.herd.model.api.xml.AwsCredential in project herd by FINRAOS.
the class UploaderWebClientTest method testGetBusinessObjectDataUploadCredential2.
@Test
public void testGetBusinessObjectDataUploadCredential2() throws Exception {
DataBridgeBaseManifestDto manifest = new DataBridgeBaseManifestDto();
manifest.setNamespace("test1");
manifest.setBusinessObjectDefinitionName("test2");
manifest.setBusinessObjectFormatUsage("test3");
manifest.setBusinessObjectFormatFileType("test4");
manifest.setBusinessObjectFormatVersion("test5");
manifest.setPartitionValue("test6");
String storageName = "test8";
Integer businessObjectDataVersion = 1234;
Boolean createNewVersion = null;
uploaderWebClient.getRegServerAccessParamsDto().setUseSsl(true);
BusinessObjectDataUploadCredential businessObjectDataUploadCredential = uploaderWebClient.getBusinessObjectDataUploadCredential(manifest, storageName, businessObjectDataVersion, createNewVersion);
Assert.assertNotNull(businessObjectDataUploadCredential);
AwsCredential awsCredential = businessObjectDataUploadCredential.getAwsCredential();
Assert.assertNotNull(awsCredential);
Assert.assertEquals("https://testWebServiceHostname:1234/herd-app/rest/businessObjectData/upload/credential/namespaces/test1" + "/businessObjectDefinitionNames/test2/businessObjectFormatUsages/test3/businessObjectFormatFileTypes/test4/businessObjectFormatVersions/test5" + "/partitionValues/test6?storageName=test8&businessObjectDataVersion=1234", awsCredential.getAwsAccessKey());
}
use of org.finra.herd.model.api.xml.AwsCredential in project herd by FINRAOS.
the class UploaderWebClientTest method testGetBusinessObjectDataUploadCredential3.
@Test
public void testGetBusinessObjectDataUploadCredential3() throws Exception {
DataBridgeBaseManifestDto manifest = new DataBridgeBaseManifestDto();
manifest.setNamespace("test1");
manifest.setBusinessObjectDefinitionName("test2");
manifest.setBusinessObjectFormatUsage("test3");
manifest.setBusinessObjectFormatFileType("test4");
manifest.setBusinessObjectFormatVersion("test5");
manifest.setPartitionValue("test6");
manifest.setSubPartitionValues(Arrays.asList("test7", "test8"));
String storageName = "test8";
Integer businessObjectDataVersion = null;
Boolean createNewVersion = true;
uploaderWebClient.getRegServerAccessParamsDto().setUseSsl(true);
BusinessObjectDataUploadCredential businessObjectDataUploadCredential = uploaderWebClient.getBusinessObjectDataUploadCredential(manifest, storageName, businessObjectDataVersion, createNewVersion);
Assert.assertNotNull(businessObjectDataUploadCredential);
AwsCredential awsCredential = businessObjectDataUploadCredential.getAwsCredential();
Assert.assertNotNull(awsCredential);
Assert.assertEquals("https://testWebServiceHostname:1234/herd-app/rest/businessObjectData/upload/credential/namespaces/test1" + "/businessObjectDefinitionNames/test2/businessObjectFormatUsages/test3/businessObjectFormatFileTypes/test4/businessObjectFormatVersions/test5" + "/partitionValues/test6?storageName=test8&subPartitionValues=test7%7Ctest8&createNewVersion=true", awsCredential.getAwsAccessKey());
}
Aggregations