use of gov.cms.bfd.pipeline.ccw.rif.CcwRifLoadOptions in project beneficiary-fhir-data by CMSgov.
the class AppConfiguration method readCcwRifLoadOptionsFromEnvironmentVariables.
@Nullable
static CcwRifLoadOptions readCcwRifLoadOptionsFromEnvironmentVariables(LoadAppOptions loadOptions) {
final boolean enabled = readEnvBooleanOptional(ENV_VAR_KEY_CCW_RIF_JOB_ENABLED).orElse(true);
if (!enabled) {
return null;
}
final String s3BucketName = readEnvStringRequired(ENV_VAR_KEY_BUCKET);
final Optional<String> rifFilterText = readEnvStringOptional(ENV_VAR_KEY_ALLOWED_RIF_TYPE);
final Optional<RifFileType> allowedRifFileType;
if (rifFilterText.isPresent()) {
try {
allowedRifFileType = Optional.of(RifFileType.valueOf(rifFilterText.get()));
} catch (IllegalArgumentException e) {
throw new AppConfigurationException(String.format("Invalid value for configuration environment variable '%s': '%s'", ENV_VAR_KEY_ALLOWED_RIF_TYPE, rifFilterText), e);
}
} else {
allowedRifFileType = Optional.empty();
}
/*
* Just for convenience: make sure DefaultAWSCredentialsProviderChain
* has whatever it needs.
*/
try {
DefaultAWSCredentialsProviderChain awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();
awsCredentialsProvider.getCredentials();
} catch (AmazonClientException e) {
/*
* The credentials provider should throw this if it can't find what
* it needs.
*/
throw new AppConfigurationException(String.format("Missing configuration for AWS credentials (for %s).", DefaultAWSCredentialsProviderChain.class.getName()), e);
}
ExtractionOptions extractionOptions = new ExtractionOptions(s3BucketName, allowedRifFileType);
CcwRifLoadOptions ccwRifLoadOptions = new CcwRifLoadOptions(extractionOptions, loadOptions);
return ccwRifLoadOptions;
}
use of gov.cms.bfd.pipeline.ccw.rif.CcwRifLoadOptions in project beneficiary-fhir-data by CMSgov.
the class AppConfiguration method readConfigFromEnvironmentVariables.
/**
* Per <code>/dev/design-decisions-readme.md</code>, this application accepts its configuration
* via environment variables. Read those in, and build an {@link AppConfiguration} instance from
* them.
*
* <p>As a convenience, this method will also verify that AWS credentials were provided, such that
* {@link DefaultAWSCredentialsProviderChain} can load them. If not, an {@link
* AppConfigurationException} will be thrown.
*
* @return the {@link AppConfiguration} instance represented by the configuration provided to this
* application via the environment variables
* @throws AppConfigurationException An {@link AppConfigurationException} will be thrown if the
* configuration passed to the application are incomplete or incorrect.
*/
static AppConfiguration readConfigFromEnvironmentVariables() {
int hicnHashIterations = readEnvIntPositiveRequired(ENV_VAR_KEY_HICN_HASH_ITERATIONS);
byte[] hicnHashPepper = readEnvBytesRequired(ENV_VAR_KEY_HICN_HASH_PEPPER);
int hicnHashCacheSize = readEnvIntOptional(ENV_VAR_KEY_HICN_HASH_CACHE_SIZE).orElse(DEFAULT_HICN_HASH_CACHE_SIZE);
String databaseUrl = readEnvStringRequired(ENV_VAR_KEY_DATABASE_URL);
String databaseUsername = readEnvStringRequired(ENV_VAR_KEY_DATABASE_USERNAME);
String databasePassword = readEnvStringRequired(ENV_VAR_KEY_DATABASE_PASSWORD);
int loaderThreads = readEnvIntPositiveRequired(ENV_VAR_KEY_LOADER_THREADS);
boolean idempotencyRequired = readEnvBooleanRequired(ENV_VAR_KEY_IDEMPOTENCY_REQUIRED);
boolean filteringNonNullAndNon2022Benes = readEnvBooleanOptional(ENV_VAR_KEY_RIF_FILTERING_NON_NULL_AND_NON_2022_BENES).orElse(DEFAULT_RIF_FILTERING_NON_NULL_AND_NON_2022_BENES);
Optional<String> newRelicMetricKey = readEnvStringOptional(ENV_VAR_NEW_RELIC_METRIC_KEY);
Optional<String> newRelicAppName = readEnvStringOptional(ENV_VAR_NEW_RELIC_APP_NAME);
Optional<String> newRelicMetricHost = readEnvStringOptional(ENV_VAR_NEW_RELIC_METRIC_HOST);
Optional<String> newRelicMetricPath = readEnvStringOptional(ENV_VAR_NEW_RELIC_METRIC_PATH);
Optional<Integer> newRelicMetricPeriod = readEnvIntOptional(ENV_VAR_NEW_RELIC_METRIC_PERIOD);
/*
* Note: For CcwRifLoadJob, databaseMaxPoolSize needs to be double the number of loader threads
* when idempotent loads are being used. Apparently, the queries need a separate Connection?
*/
Optional<Integer> databaseMaxPoolSize = readEnvIntOptional(ENV_VAR_KEY_DATABASE_MAX_POOL_SIZE);
if (databaseMaxPoolSize.isPresent() && databaseMaxPoolSize.get() < 1)
throw new AppConfigurationException(String.format("Invalid value for configuration environment variable '%s': '%s'", ENV_VAR_KEY_DATABASE_MAX_POOL_SIZE, databaseMaxPoolSize));
if (!databaseMaxPoolSize.isPresent())
databaseMaxPoolSize = Optional.of(loaderThreads * 2);
Optional<String> hostname;
try {
hostname = Optional.of(InetAddress.getLocalHost().getHostName());
} catch (UnknownHostException e) {
hostname = Optional.empty();
}
MetricOptions metricOptions = new MetricOptions(newRelicMetricKey, newRelicAppName, newRelicMetricHost, newRelicMetricPath, newRelicMetricPeriod, hostname);
DatabaseOptions databaseOptions = new DatabaseOptions(databaseUrl, databaseUsername, databasePassword, databaseMaxPoolSize.get());
LoadAppOptions loadOptions = new LoadAppOptions(IdHasher.Config.builder().hashIterations(hicnHashIterations).hashPepper(hicnHashPepper).cacheSize(hicnHashCacheSize).build(), loaderThreads, idempotencyRequired, filteringNonNullAndNon2022Benes);
CcwRifLoadOptions ccwRifLoadOptions = readCcwRifLoadOptionsFromEnvironmentVariables(loadOptions);
RdaLoadOptions rdaLoadOptions = readRdaLoadOptionsFromEnvironmentVariables(loadOptions.getIdHasherConfig());
return new AppConfiguration(metricOptions, databaseOptions, ccwRifLoadOptions, rdaLoadOptions);
}
Aggregations