func fetchIPFromMetadataServer()

in dp_check/dp_check.go [171:206]


func fetchIPFromMetadataServer(addrFamilyStr string) (*net.IP, error) {
	const metadataServerPrimaryNICPath = "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0"
	var metadataServerURL string
	if addrFamilyStr == "IPv4" {
		metadataServerURL = metadataServerPrimaryNICPath + "/ip"
	} else if addrFamilyStr == "IPv6" {
		metadataServerURL = metadataServerPrimaryNICPath + "/ipv6s"
	} else {
		return nil, fmt.Errorf("Invalid address family %v is not IPv4 or IPv6", addrFamilyStr)
	}
	client := &http.Client{}
	infoLog.Printf("Check if this VM has a %v address allocated to its primary network interface by sending http GET request to: %v", addrFamilyStr, metadataServerURL)
	req, err := http.NewRequest("GET", metadataServerURL, nil)
	if err != nil {
		return nil, err
	}
	req.Header.Add("Metadata-Flavor", "Google")
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}
	if resp.StatusCode == 200 {
		address := net.ParseIP(strings.TrimSuffix(string(body), "\n"))
		infoLog.Printf("Received %v address %s from metadata server", addrFamilyStr, address)
		return &address, nil
	}
	if resp.StatusCode == 404 {
		return nil, fmt.Errorf("This VM doesn't have a %v address allocated to its primary network interface", addrFamilyStr)
	}
	return nil, fmt.Errorf("Received status code %d in response to metadata server GET request to URL: %s. This is unexpected (we only expect status codes 200 or 404), and so this may indicate a bug", resp.StatusCode, metadataServerURL)
}