Skip to content

Commit e0c790c

Browse files
authored
add functionality to get a random region for a specific service (#1269)
1 parent 4e55865 commit e0c790c

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

modules/aws/region.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package aws
22

33
import (
4+
"fmt"
45
"os"
56

67
"github.com/aws/aws-sdk-go/aws"
78
"github.com/aws/aws-sdk-go/service/ec2"
9+
"github.com/aws/aws-sdk-go/service/ssm"
810
"github.com/gruntwork-io/terratest/modules/collections"
911
"github.com/gruntwork-io/terratest/modules/logger"
1012
"github.com/gruntwork-io/terratest/modules/random"
@@ -156,3 +158,52 @@ func GetAvailabilityZonesE(t testing.TestingT, region string) ([]string, error)
156158

157159
return out, nil
158160
}
161+
162+
// GetRegionsForService gets all AWS regions in which a service is available.
163+
func GetRegionsForService(t testing.TestingT, serviceName string) []string {
164+
out, err := GetRegionsForServiceE(t, serviceName)
165+
if err != nil {
166+
t.Fatal(err)
167+
}
168+
return out
169+
}
170+
171+
// GetRegionsForService gets all AWS regions in which a service is available and returns errors.
172+
// See https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-public-parameters-global-infrastructure.html
173+
func GetRegionsForServiceE(t testing.TestingT, serviceName string) ([]string, error) {
174+
// These values are available in any region, defaulting to us-east-1 since it's the oldest
175+
ssmClient, err := NewSsmClientE(t, "us-east-1")
176+
177+
if err != nil {
178+
return nil, err
179+
}
180+
181+
paramPath := "/aws/service/global-infrastructure/services/%s/regions"
182+
req, resp := ssmClient.GetParametersByPathRequest(&ssm.GetParametersByPathInput{
183+
Path: aws.String(fmt.Sprintf(paramPath, serviceName)),
184+
})
185+
186+
ssmErr := req.Send()
187+
if ssmErr != nil {
188+
return nil, err
189+
}
190+
191+
var availableRegions []string
192+
for _, p := range resp.Parameters {
193+
availableRegions = append(availableRegions, *p.Value)
194+
}
195+
196+
return availableRegions, nil
197+
}
198+
199+
// GetRandomRegionForService retrieves a list of AWS regions in which a service is available
200+
// Then returns one region randomly from the list
201+
func GetRandomRegionForService(t testing.TestingT, serviceName string) string {
202+
availableRegions, err := GetRegionsForServiceE(t, serviceName)
203+
204+
if err != nil {
205+
t.Fatal(err)
206+
}
207+
208+
return GetRandomRegion(t, availableRegions, nil)
209+
}

modules/aws/region_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,14 @@ func TestGetAvailabilityZones(t *testing.T) {
5454
assert.Regexp(t, fmt.Sprintf("^%s[a-z]$", randomRegion), az)
5555
}
5656
}
57+
58+
func TestGetRandomRegionForService(t *testing.T) {
59+
t.Parallel()
60+
61+
serviceName := "apigatewayv2"
62+
63+
regionsForService, _ := GetRegionsForServiceE(t, serviceName)
64+
randomRegionForService := GetRandomRegionForService(t, serviceName)
65+
66+
assert.Contains(t, regionsForService, randomRegionForService)
67+
}

0 commit comments

Comments
 (0)