Code refactoring for bpa operator
[icn.git] / cmd / bpa-operator / vendor / google.golang.org / appengine / internal / metadata.go
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         "net/http"
16         "net/url"
17 )
18
19 const (
20         metadataHost = "metadata"
21         metadataPath = "/computeMetadata/v1/"
22 )
23
24 var (
25         metadataRequestHeaders = http.Header{
26                 "Metadata-Flavor": []string{"Google"},
27         }
28 )
29
30 // TODO(dsymonds): Do we need to support default values, like Python?
31 func mustGetMetadata(key string) []byte {
32         b, err := getMetadata(key)
33         if err != nil {
34                 panic(fmt.Sprintf("Metadata fetch failed for '%s': %v", key, err))
35         }
36         return b
37 }
38
39 func getMetadata(key string) ([]byte, error) {
40         // TODO(dsymonds): May need to use url.Parse to support keys with query args.
41         req := &http.Request{
42                 Method: "GET",
43                 URL: &url.URL{
44                         Scheme: "http",
45                         Host:   metadataHost,
46                         Path:   metadataPath + key,
47                 },
48                 Header: metadataRequestHeaders,
49                 Host:   metadataHost,
50         }
51         resp, err := http.DefaultClient.Do(req)
52         if err != nil {
53                 return nil, err
54         }
55         defer resp.Body.Close()
56         if resp.StatusCode != 200 {
57                 return nil, fmt.Errorf("metadata server returned HTTP %d", resp.StatusCode)
58         }
59         return ioutil.ReadAll(resp.Body)
60 }