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  }