github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/pkg/cloud/iks/zones.go (about) 1 package iks 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/IBM-Cloud/bluemix-go/client" 8 ) 9 10 type Zone struct { 11 ID string 12 Metro string 13 } 14 15 type Zones interface { 16 GetZones(region Region) ([]Zone, error) 17 GetZone(zone string, region Region) (*Zone, error) 18 } 19 20 type zone struct { 21 *client.Client 22 zones map[string][]Zone 23 } 24 25 func newZonesAPI(c *client.Client) Zones { 26 return &zone{ 27 Client: c, 28 zones: nil, 29 } 30 } 31 32 func (v *zone) fetch(region Region) error { 33 if v.zones == nil { 34 v.zones = make(map[string][]Zone) 35 } 36 if _, ok := v.zones[region.Name]; !ok { 37 zones := []Zone{} 38 m := make(map[string]string, 1) 39 m["X-Region"] = region.Name 40 _, err := v.Client.Get("/v1/zones", &zones, m) 41 if err != nil { 42 return err 43 } 44 v.zones[region.Name] = zones 45 } 46 return nil 47 } 48 49 func (v *zone) GetZones(region Region) ([]Zone, error) { 50 if err := v.fetch(region); err != nil { 51 return nil, err 52 } 53 return v.zones[region.Name], nil 54 } 55 56 func (v *zone) GetZone(zonearg string, region Region) (*Zone, error) { 57 if err := v.fetch(region); err != nil { 58 return nil, err 59 } 60 61 for _, zone := range v.zones[region.Name] { 62 if strings.Compare(zonearg, zone.ID) == 0 { 63 return &zone, nil 64 } 65 } 66 return nil, fmt.Errorf("region %q not found in %q", zonearg, region.Name) 67 }