forked from openshift/installer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
availabilityzones.go
75 lines (63 loc) · 2.13 KB
/
availabilityzones.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package aws
import (
"context"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
awstypes "github.com/openshift/installer/pkg/types/aws"
"github.com/pkg/errors"
)
// availabilityZones retrieves a list of availability zones for the given region.
func describeAvailabilityZones(ctx context.Context, session *session.Session, region string) ([]*ec2.AvailabilityZone, error) {
client := ec2.New(session, aws.NewConfig().WithRegion(region))
resp, err := client.DescribeAvailabilityZonesWithContext(ctx, &ec2.DescribeAvailabilityZonesInput{
Filters: []*ec2.Filter{
{
Name: aws.String("region-name"),
Values: []*string{aws.String(region)},
},
{
Name: aws.String("state"),
Values: []*string{aws.String("available")},
},
},
})
if err != nil {
return nil, errors.Wrap(err, "fetching availability zones")
}
return resp.AvailabilityZones, nil
}
// availabilityZones retrieves a list of availability zones for the given region.
func availabilityZones(ctx context.Context, session *session.Session, region string) ([]string, error) {
azs, err := describeAvailabilityZones(ctx, session, region)
if err != nil {
return nil, errors.Wrap(err, "fetching availability zones")
}
zones := []string{}
for _, zone := range azs {
if *zone.ZoneType == awstypes.AvailabilityZoneTypeDefault {
zones = append(zones, *zone.ZoneName)
}
}
if len(zones) == 0 {
return nil, errors.Errorf("no available zones in %s", region)
}
return zones, nil
}
// localZones retrieves a list of Local zones for the given parent region.
func localZones(ctx context.Context, session *session.Session, region string) ([]string, error) {
azs, err := describeAvailabilityZones(ctx, session, region)
if err != nil {
return nil, errors.Wrap(err, "fetching availability zones type local-zone")
}
zones := []string{}
for _, zone := range azs {
if *zone.ZoneType == awstypes.AvailabilityZoneTypeDefault {
zones = append(zones, *zone.ZoneName)
}
}
if len(zones) == 0 {
return nil, errors.Errorf("no availability zones type local-zone in %s", region)
}
return zones, nil
}