129 lines
3.7 KiB
Go
129 lines
3.7 KiB
Go
// Copyright (C) MongoDB, Inc. 2023-present.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
// not use this file except in compliance with the License. You may obtain
|
|
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
package driverutil
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
const AwsLambdaPrefix = "AWS_Lambda_"
|
|
|
|
const (
|
|
// FaaS environment variable names
|
|
|
|
// EnvVarAWSExecutionEnv is the AWS Execution environment variable.
|
|
EnvVarAWSExecutionEnv = "AWS_EXECUTION_ENV"
|
|
// EnvVarAWSLambdaRuntimeAPI is the AWS Lambda runtime API variable.
|
|
EnvVarAWSLambdaRuntimeAPI = "AWS_LAMBDA_RUNTIME_API"
|
|
// EnvVarFunctionsWorkerRuntime is the functions worker runtime variable.
|
|
EnvVarFunctionsWorkerRuntime = "FUNCTIONS_WORKER_RUNTIME"
|
|
// EnvVarKService is the K Service variable.
|
|
EnvVarKService = "K_SERVICE"
|
|
// EnvVarFunctionName is the function name variable.
|
|
EnvVarFunctionName = "FUNCTION_NAME"
|
|
// EnvVarVercel is the Vercel variable.
|
|
EnvVarVercel = "VERCEL"
|
|
// EnvVarK8s is the K8s variable.
|
|
EnvVarK8s = "KUBERNETES_SERVICE_HOST"
|
|
)
|
|
|
|
const (
|
|
// FaaS environment variable names
|
|
|
|
// EnvVarAWSRegion is the AWS region variable.
|
|
EnvVarAWSRegion = "AWS_REGION"
|
|
// EnvVarAWSLambdaFunctionMemorySize is the AWS Lambda function memory size variable.
|
|
EnvVarAWSLambdaFunctionMemorySize = "AWS_LAMBDA_FUNCTION_MEMORY_SIZE"
|
|
// EnvVarFunctionMemoryMB is the function memory in megabytes variable.
|
|
EnvVarFunctionMemoryMB = "FUNCTION_MEMORY_MB"
|
|
// EnvVarFunctionTimeoutSec is the function timeout in seconds variable.
|
|
EnvVarFunctionTimeoutSec = "FUNCTION_TIMEOUT_SEC"
|
|
// EnvVarFunctionRegion is the function region variable.
|
|
EnvVarFunctionRegion = "FUNCTION_REGION"
|
|
// EnvVarVercelRegion is the Vercel region variable.
|
|
EnvVarVercelRegion = "VERCEL_REGION"
|
|
)
|
|
|
|
const (
|
|
// FaaS environment names used by the client
|
|
|
|
// EnvNameAWSLambda is the AWS Lambda environment name.
|
|
EnvNameAWSLambda = "aws.lambda"
|
|
// EnvNameAzureFunc is the Azure Function environment name.
|
|
EnvNameAzureFunc = "azure.func"
|
|
// EnvNameGCPFunc is the Google Cloud Function environment name.
|
|
EnvNameGCPFunc = "gcp.func"
|
|
// EnvNameVercel is the Vercel environment name.
|
|
EnvNameVercel = "vercel"
|
|
)
|
|
|
|
// GetFaasEnvName parses the FaaS environment variable name and returns the
|
|
// corresponding name used by the client. If none of the variables or variables
|
|
// for multiple names are populated the client.env value MUST be entirely
|
|
// omitted. When variables for multiple "client.env.name" values are present,
|
|
// "vercel" takes precedence over "aws.lambda"; any other combination MUST cause
|
|
// "client.env" to be entirely omitted.
|
|
func GetFaasEnvName() string {
|
|
envVars := []string{
|
|
EnvVarAWSExecutionEnv,
|
|
EnvVarAWSLambdaRuntimeAPI,
|
|
EnvVarFunctionsWorkerRuntime,
|
|
EnvVarKService,
|
|
EnvVarFunctionName,
|
|
EnvVarVercel,
|
|
}
|
|
|
|
// If none of the variables are populated the client.env value MUST be
|
|
// entirely omitted.
|
|
names := make(map[string]struct{})
|
|
|
|
for _, envVar := range envVars {
|
|
val := os.Getenv(envVar)
|
|
if val == "" {
|
|
continue
|
|
}
|
|
|
|
var name string
|
|
|
|
switch envVar {
|
|
case EnvVarAWSExecutionEnv:
|
|
if !strings.HasPrefix(val, AwsLambdaPrefix) {
|
|
continue
|
|
}
|
|
|
|
name = EnvNameAWSLambda
|
|
case EnvVarAWSLambdaRuntimeAPI:
|
|
name = EnvNameAWSLambda
|
|
case EnvVarFunctionsWorkerRuntime:
|
|
name = EnvNameAzureFunc
|
|
case EnvVarKService, EnvVarFunctionName:
|
|
name = EnvNameGCPFunc
|
|
case EnvVarVercel:
|
|
// "vercel" takes precedence over "aws.lambda".
|
|
delete(names, EnvNameAWSLambda)
|
|
|
|
name = EnvNameVercel
|
|
}
|
|
|
|
names[name] = struct{}{}
|
|
if len(names) > 1 {
|
|
// If multiple names are populated the client.env value
|
|
// MUST be entirely omitted.
|
|
names = nil
|
|
|
|
break
|
|
}
|
|
}
|
|
|
|
for name := range names {
|
|
return name
|
|
}
|
|
|
|
return ""
|
|
}
|