private FunctionConf getFunctionConf()

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();
    }