From c1e3a9878947b61996a25fc503463226280c1d69 Mon Sep 17 00:00:00 2001 From: Justin Santa Barbara Date: Thu, 12 Apr 2018 17:42:02 -0400 Subject: [PATCH] AWS: validate region against aws-sdk This is much faster than a call to DescribeRegions. Issue #4451 --- upup/pkg/fi/cloudup/awsup/BUILD.bazel | 1 + upup/pkg/fi/cloudup/awsup/aws_utils.go | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/upup/pkg/fi/cloudup/awsup/BUILD.bazel b/upup/pkg/fi/cloudup/awsup/BUILD.bazel index 2c2dba5b6e..19272db280 100644 --- a/upup/pkg/fi/cloudup/awsup/BUILD.bazel +++ b/upup/pkg/fi/cloudup/awsup/BUILD.bazel @@ -26,6 +26,7 @@ go_library( "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/client:go_default_library", + "//vendor/github.com/aws/aws-sdk-go/aws/endpoints:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/request:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library", "//vendor/github.com/aws/aws-sdk-go/service/autoscaling:go_default_library", diff --git a/upup/pkg/fi/cloudup/awsup/aws_utils.go b/upup/pkg/fi/cloudup/awsup/aws_utils.go index e4474df2f5..aa3cf9670c 100644 --- a/upup/pkg/fi/cloudup/awsup/aws_utils.go +++ b/upup/pkg/fi/cloudup/awsup/aws_utils.go @@ -19,9 +19,11 @@ package awsup import ( "fmt" "os" + "sync" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/endpoints" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/autoscaling" "github.com/aws/aws-sdk-go/service/ec2" @@ -32,9 +34,31 @@ import ( // allRegions is the list of all regions; tests will set the values var allRegions []*ec2.Region +var allRegionsMutex sync.Mutex + +// isRegionCompiledInToAWSSDK checks if the specified region is in the AWS SDK +func isRegionCompiledInToAWSSDK(region string) bool { + resolver := endpoints.DefaultResolver() + partitions := resolver.(endpoints.EnumPartitions).Partitions() + for _, p := range partitions { + for _, r := range p.Regions() { + if r.ID() == region { + return true + } + } + } + return false +} // ValidateRegion checks that an AWS region name is valid func ValidateRegion(region string) error { + if isRegionCompiledInToAWSSDK(region) { + return nil + } + + allRegionsMutex.Lock() + defer allRegionsMutex.Unlock() + if allRegions == nil { glog.V(2).Infof("Querying EC2 for all valid regions")