// NewAddresses fetches EC2 IP address list from each region. // // If log is nil, defaultLogger is used instead. func NewAddresses(clients *amazon.Clients, log logging.Logger) *Addresses { if log == nil { log = defaultLogger } a := newAddresses() var wg sync.WaitGroup var mu sync.Mutex // protects a.m for region, client := range clients.Regions() { wg.Add(1) go func(region string, client *amazon.Client) { defer wg.Done() addresses, err := client.Addresses() if err != nil { log.Error("[%s] fetching IP addresses error: %s", region, err) return } log.Info("[%s] fetched %d addresses", region, len(addresses)) var ok bool mu.Lock() if _, ok = a.m[client]; !ok { a.m[client] = addresses } mu.Unlock() if ok { panic(fmt.Errorf("[%s] duplicated client=%p: %+v", region, client, addresses)) } }(region, client) } wg.Wait() return a }
// NewMultiInstances fetches EC2 instance list from each region. func NewMultiInstances(clients *amazon.Clients, log logging.Logger) *MultiInstances { if log == nil { log = defaultLogger } var m = newMultiInstances() var wg sync.WaitGroup var mu sync.Mutex // protects m.m for region, client := range clients.Regions() { wg.Add(1) go func(region string, client *amazon.Client) { defer wg.Done() instances, err := client.Instances() if err != nil { log.Error("[%s] fetching instances error: %s", region, err) return } log.Info("[%s] fetched %d instances", region, len(instances)) i := make(Instances, len(instances)) for _, instance := range instances { i[aws.StringValue(instance.InstanceId)] = instance } var ok bool mu.Lock() if _, ok = m.m[client]; !ok { m.m[client] = i } mu.Unlock() if ok { panic(fmt.Errorf("[%s] duplicated client=%p: %+v", region, client, i)) } }(region, client) } wg.Wait() return m }