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  }