github.com/kubernetes-incubator/kube-aws@v0.16.4/flatcar/amiregistry/amiregistry.go (about)

     1  package amiregistry
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  )
     7  
     8  func GetAMI(region, channel string) (string, error) {
     9  
    10  	amis, err := GetAMIData(channel)
    11  
    12  	if err != nil {
    13  		return "", fmt.Errorf("uanble to fetch AMI for channel \"%s\": %v", channel, err)
    14  	}
    15  
    16  	for _, v := range amis {
    17  		if v["name"] != region {
    18  			continue
    19  		}
    20  		if hvm, ok := v["hvm"]; ok {
    21  			return hvm, nil
    22  		} else {
    23  			break
    24  		}
    25  	}
    26  
    27  	return "", fmt.Errorf("could not find \"hvm\" image for region \"%s\" in flatcar channel \"%s\"", region, channel)
    28  }
    29  
    30  func GetAMIData(channel string) ([]map[string]string, error) {
    31  	url := fmt.Sprintf("https://%s.release.flatcar-linux.net/amd64-usr/current/flatcar_production_ami_all.json", channel)
    32  	r, err := newHttp().Get(url)
    33  	if err != nil {
    34  		return nil, fmt.Errorf("failed to get AMI data from url \"%s\": %v", channel, err)
    35  	}
    36  
    37  	if r.StatusCode != 200 {
    38  		return nil, fmt.Errorf("failed to get AMI data from url \"%s\": invalid status code: %d", url, r.StatusCode)
    39  	}
    40  
    41  	output := map[string][]map[string]string{}
    42  
    43  	err = json.NewDecoder(r.Body).Decode(&output)
    44  	if err != nil {
    45  		return nil, fmt.Errorf("failed to parse AMI data from url \"%s\": %v", url, err)
    46  	}
    47  	r.Body.Close()
    48  
    49  	return output["amis"], nil
    50  }