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)
}