in src/main/java/com/awslabs/aws/greengrass/provisioner/implementations/helpers/BasicFunctionHelper.java [296:408]
private FunctionConf getFunctionConf(Config defaultConfig, DeploymentConf deploymentConf, Either<FunctionAliasArn, File> functionConf, FunctionIsolationMode defaultFunctionIsolationMode) {
ImmutableFunctionConf.Builder functionConfBuilder = ImmutableFunctionConf.builder();
Config config;
Optional<Path> optionalFunctionPath = Optional.empty();
// Store the config file info and load it using function.defaults.conf as the fallback for missing values
if (functionConf.isLeft()) {
// We have the function conf in Lambda
FunctionAliasArn functionAliasArn = functionConf.getLeft();
functionConfBuilder.existingArn(functionAliasArn.getAliasArn());
String functionConfFromLambda = getLambdaFunctionConf(functionAliasArn);
functionConfBuilder.rawConfig(functionConfFromLambda);
config = ConfigFactory.parseString(functionConfFromLambda);
} else {
// We have the function conf in a file
File functionConfFile = functionConf.get();
functionConfBuilder.rawConfig(ioHelper.readFileAsString(functionConfFile));
config = ConfigFactory.parseFile(functionConfFile);
Path functionPath = getFunctionPath(functionConfFile);
functionConfBuilder.buildDirectory(functionPath);
optionalFunctionPath = Optional.of(functionPath);
}
Config functionDefaults = ggVariables.getFunctionDefaults();
// Make sure we use the calculated default function isolation mode as the default (forced to no container when using Docker)
functionDefaults = functionDefaults.withValue(ggConstants.getConfGreengrassContainer(), ConfigValueFactory.fromAnyRef(FunctionIsolationMode.GREENGRASS_CONTAINER.equals(defaultFunctionIsolationMode) ? true : false));
// Use the function.defaults.conf values
config = config.withFallback(functionDefaults);
// Use the default config (environment) values
config = config.withFallback(defaultConfig);
// Resolve the entire fallback config
config = config.resolve();
Language language = Language.valueOf(config.getString("conf.language"));
if (language.equals(Language.Python)) {
log.warn("Legacy Python function forced to Python 2.7");
language = Language.PYTHON2_7;
} else if (language.equals(Language.Java)) {
log.warn("Legacy Java function forced to Java 8");
language = Language.JAVA8;
} else if (language.equals(Language.Node)) {
log.warn("Legacy Node function forced to Node 12.x");
language = Language.NODEJS12_X;
}
functionConfBuilder.language(language);
functionConfBuilder.encodingType(EncodingType.fromValue(config.getString("conf.encodingType").toLowerCase()));
functionConfBuilder.functionName(ImmutableFunctionName.builder().name(config.getString("conf.functionName")).build());
functionConfBuilder.groupName(deploymentConf.getGroupName());
functionConfBuilder.handlerName(config.getString("conf.handlerName"));
functionConfBuilder.aliasName(ImmutableFunctionAlias.builder().alias(config.getString("conf.aliasName")).build());
functionConfBuilder.memorySizeInKb(config.getInt("conf.memorySizeInKb"));
functionConfBuilder.isPinned(config.getBoolean("conf.pinned"));
functionConfBuilder.timeoutInSeconds(config.getInt("conf.timeoutInSeconds"));
functionConfBuilder.fromCloudSubscriptions(config.getStringList(GGConstants.CONF_FROM_CLOUD_SUBSCRIPTIONS));
functionConfBuilder.toCloudSubscriptions(config.getStringList(GGConstants.CONF_TO_CLOUD_SUBSCRIPTIONS));
functionConfBuilder.outputTopics(config.getStringList(GGConstants.CONF_OUTPUT_TOPICS));
functionConfBuilder.inputTopics(config.getStringList(GGConstants.CONF_INPUT_TOPICS));
functionConfBuilder.isAccessSysFs(config.getBoolean("conf.accessSysFs"));
functionConfBuilder.isGreengrassContainer(config.getBoolean(ggConstants.getConfGreengrassContainer()));
functionConfBuilder.uid(typeSafeConfigHelper.getIntegerDefault(Optional.of(config), "conf.uid"));
functionConfBuilder.gid(typeSafeConfigHelper.getIntegerDefault(Optional.of(config), "conf.gid"));
setLocalDeviceResourcesConfig(functionConfBuilder, config);
setLocalVolumeResourcesConfig(functionConfBuilder, config);
setLocalSageMakerResourcesConfig(functionConfBuilder, config);
setLocalS3ResourcesConfig(functionConfBuilder, config);
List<String> secretNames = setLocalSecretsManagerResources(functionConfBuilder, config);
List<String> connectedShadows = getConnectedShadows(functionConfBuilder, config);
functionConfBuilder.connectedShadows(connectedShadows);
// Use the environment variables from the deployment and then add the environment variables from the function
functionConfBuilder.putAllEnvironmentVariables(deploymentConf.getEnvironmentVariables());
setEnvironmentVariablesFromConf(functionConfBuilder, config);
addConnectedShadowsToEnvironment(functionConfBuilder, connectedShadows);
addSecretNamesToEnvironment(functionConfBuilder, secretNames);
if (optionalFunctionPath.isPresent()) {
File cfTemplate = getFunctionCfTemplatePath(optionalFunctionPath.get()).toFile();
if (cfTemplate.exists()) {
functionConfBuilder.cfTemplate(cfTemplate);
}
}
// Optional string lists for core role
functionConfBuilder.coreRoleIamManagedPolicies(typeSafeConfigHelper.getStringListOrReturnEmpty(config, "conf.coreRoleIamManagedPolicies"));
// Optional JSON policy for core role
functionConfBuilder.coreRoleIamPolicy(typeSafeConfigHelper.getObjectAndRenderOrReturnEmpty(config, "conf.coreRoleIamPolicy"));
// Optional string lists for service role
functionConfBuilder.serviceRoleIamManagedPolicies(typeSafeConfigHelper.getStringListOrReturnEmpty(config, "conf.serviceRoleIamManagedPolicies"));
// Optional JSON policy for service role
functionConfBuilder.serviceRoleIamPolicy(typeSafeConfigHelper.getObjectAndRenderOrReturnEmpty(config, "conf.serviceRoleIamPolicy"));
return functionConfBuilder.build();
}