github.com/timstclair/heapster@v0.20.0-alpha1/Godeps/_workspace/src/google.golang.org/appengine/internal/metadata.go (about) 1 // Copyright 2014 Google Inc. All rights reserved. 2 // Use of this source code is governed by the Apache 2.0 3 // license that can be found in the LICENSE file. 4 5 package internal 6 7 // This file has code for accessing metadata. 8 // 9 // References: 10 // https://cloud.google.com/compute/docs/metadata 11 12 import ( 13 "fmt" 14 "io/ioutil" 15 "log" 16 "net/http" 17 "net/url" 18 ) 19 20 const ( 21 metadataHost = "metadata" 22 metadataPath = "/computeMetadata/v1/" 23 ) 24 25 var ( 26 metadataRequestHeaders = http.Header{ 27 "X-Google-Metadata-Request": []string{"True"}, 28 } 29 ) 30 31 // TODO(dsymonds): Do we need to support default values, like Python? 32 func mustGetMetadata(key string) []byte { 33 b, err := getMetadata(key) 34 if err != nil { 35 log.Fatalf("Metadata fetch failed: %v", err) 36 } 37 return b 38 } 39 40 func getMetadata(key string) ([]byte, error) { 41 // TODO(dsymonds): May need to use url.Parse to support keys with query args. 42 req := &http.Request{ 43 Method: "GET", 44 URL: &url.URL{ 45 Scheme: "http", 46 Host: metadataHost, 47 Path: metadataPath + key, 48 }, 49 Header: metadataRequestHeaders, 50 Host: metadataHost, 51 } 52 resp, err := http.DefaultClient.Do(req) 53 if err != nil { 54 return nil, err 55 } 56 defer resp.Body.Close() 57 if resp.StatusCode != 200 { 58 return nil, fmt.Errorf("metadata server returned HTTP %d", resp.StatusCode) 59 } 60 return ioutil.ReadAll(resp.Body) 61 }