pkg/config/controller_config.go (122 lines of code) (raw):

package config import ( "errors" "fmt" "os" "strconv" "strings" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/ec2metadata" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/ec2" ) const ( LatticeGatewayControllerName = "application-networking.k8s.aws/gateway-api-controller" defaultLogLevel = "Info" ) const ( REGION = "REGION" CLUSTER_VPC_ID = "CLUSTER_VPC_ID" CLUSTER_NAME = "CLUSTER_NAME" DEFAULT_SERVICE_NETWORK = "DEFAULT_SERVICE_NETWORK" DISABLE_TAGGING_SERVICE_API = "DISABLE_TAGGING_SERVICE_API" ENABLE_SERVICE_NETWORK_OVERRIDE = "ENABLE_SERVICE_NETWORK_OVERRIDE" AWS_ACCOUNT_ID = "AWS_ACCOUNT_ID" DEV_MODE = "DEV_MODE" WEBHOOK_ENABLED = "WEBHOOK_ENABLED" ROUTE_MAX_CONCURRENT_RECONCILES = "ROUTE_MAX_CONCURRENT_RECONCILES" ) var VpcID = "" var AccountID = "" var Region = "" var DefaultServiceNetwork = "" var ClusterName = "" var DevMode = "" var WebhookEnabled = "" var DisableTaggingServiceAPI = false var ServiceNetworkOverrideMode = false var RouteMaxConcurrentReconciles = 1 func ConfigInit() error { sess, _ := session.NewSession() metadata := NewEC2Metadata(sess) return configInit(sess, metadata) } func configInit(sess *session.Session, metadata EC2Metadata) error { var err error DevMode = os.Getenv(DEV_MODE) WebhookEnabled = os.Getenv(WEBHOOK_ENABLED) VpcID = os.Getenv(CLUSTER_VPC_ID) if VpcID == "" { VpcID, err = metadata.VpcID() if err != nil { return fmt.Errorf("vpcId is not specified: %s", err) } } Region = os.Getenv(REGION) if Region == "" { Region, err = metadata.Region() if err != nil { return fmt.Errorf("region is not specified: %s", err) } } AccountID = os.Getenv(AWS_ACCOUNT_ID) if AccountID == "" { AccountID, err = metadata.AccountId() if err != nil { return fmt.Errorf("account is not specified: %s", err) } } DefaultServiceNetwork = os.Getenv(DEFAULT_SERVICE_NETWORK) overrideFlag := os.Getenv(ENABLE_SERVICE_NETWORK_OVERRIDE) if strings.ToLower(overrideFlag) == "true" && DefaultServiceNetwork != "" { ServiceNetworkOverrideMode = true } disableTaggingAPI := os.Getenv(DISABLE_TAGGING_SERVICE_API) if strings.ToLower(disableTaggingAPI) == "true" { DisableTaggingServiceAPI = true } ClusterName, err = getClusterName(sess) if err != nil { return fmt.Errorf("cannot get cluster name: %s", err) } routeMaxConcurrentReconciles := os.Getenv(ROUTE_MAX_CONCURRENT_RECONCILES) if routeMaxConcurrentReconciles != "" { routeMaxConcurrentReconcilesInt, err := strconv.Atoi(routeMaxConcurrentReconciles) if err != nil { return fmt.Errorf("invalid value for ROUTE_MAX_CONCURRENT_RECONCILES: %s", err) } RouteMaxConcurrentReconciles = routeMaxConcurrentReconcilesInt } return nil } // try to find cluster name, search in env then in ec2 instance tags func getClusterName(sess *session.Session) (string, error) { cn := os.Getenv(CLUSTER_NAME) if cn != "" { return cn, nil } // fallback to ec2 instance tags meta := ec2metadata.New(sess) doc, err := meta.GetInstanceIdentityDocument() if err != nil { return "", err } instanceId := doc.InstanceID region, err := meta.Region() if err != nil { return "", err } ec2Client := ec2.New(sess, &aws.Config{Region: aws.String(region)}) tagReq := &ec2.DescribeTagsInput{Filters: []*ec2.Filter{{ Name: aws.String("resource-id"), Values: []*string{aws.String(instanceId)}, }}} tagRes, err := ec2Client.DescribeTags(tagReq) if err != nil { return "", err } for _, tag := range tagRes.Tags { if *tag.Key == "aws:eks:cluster-name" { return *tag.Value, nil } } return "", errors.New("not found in env and metadata") }