diff --git a/cmd/cloudinit/cloudinit.go b/cmd/cloudinit/cloudinit.go index 12f92476..e1606e62 100644 --- a/cmd/cloudinit/cloudinit.go +++ b/cmd/cloudinit/cloudinit.go @@ -32,6 +32,7 @@ import ( "github.com/coreos/coreos-cloudinit/datasource/file" "github.com/coreos/coreos-cloudinit/datasource/metadata/digitalocean" "github.com/coreos/coreos-cloudinit/datasource/metadata/ec2" + "github.com/coreos/coreos-cloudinit/datasource/metadata/gce" "github.com/coreos/coreos-cloudinit/datasource/metadata/packet" "github.com/coreos/coreos-cloudinit/datasource/proc_cmdline" "github.com/coreos/coreos-cloudinit/datasource/url" @@ -254,12 +255,7 @@ func getDatasources(cfg *rancherConfig.CloudConfig) []datasource.Datasource { } case "gce": if network { - gceCloudConfigFile, err := GetAndCreateGceDataSourceFilename() - if err != nil { - log.Errorf("Could not retrieve GCE CloudConfig %s", err) - continue - } - dss = append(dss, file.NewDatasource(gceCloudConfigFile)) + dss = append(dss, gce.NewDatasource("http://metadata.google.internal/")) } case "packet": if !network { diff --git a/cmd/cloudinit/gce.go b/cmd/cloudinit/gce.go deleted file mode 100644 index 947715af..00000000 --- a/cmd/cloudinit/gce.go +++ /dev/null @@ -1,140 +0,0 @@ -package cloudinit - -import ( - "strings" - - log "github.com/Sirupsen/logrus" - yaml "github.com/cloudfoundry-incubator/candiedyaml" - "github.com/rancher/os/util" - "google.golang.org/cloud/compute/metadata" -) - -type GceCloudConfig struct { - FileName string - UserData string - NonUserDataSSHKeys []string -} - -const ( - gceCloudConfigFile = "/var/lib/rancher/conf/gce_cloudinit_config.yml" -) - -func NewGceCloudConfig() *GceCloudConfig { - - userData, err := metadata.InstanceAttributeValue("user-data") - if err != nil { - log.Errorf("Could not retrieve user-data: %s", err) - } - - projectSSHKeys, err := metadata.ProjectAttributeValue("sshKeys") - if err != nil { - log.Errorf("Could not retrieve project SSH Keys: %s", err) - } - - instanceSSHKeys, err := metadata.InstanceAttributeValue("sshKeys") - if err != nil { - log.Errorf("Could not retrieve instance SSH Keys: %s", err) - } - - nonUserDataSSHKeysRaw := projectSSHKeys + "\n" + instanceSSHKeys - nonUserDataSSHKeys := gceSshKeyFormatter(nonUserDataSSHKeysRaw) - - gceCC := &GceCloudConfig{ - FileName: gceCloudConfigFile, - UserData: userData, - NonUserDataSSHKeys: nonUserDataSSHKeys, - } - - return gceCC -} - -func GetAndCreateGceDataSourceFilename() (string, error) { - gceCC := NewGceCloudConfig() - err := gceCC.saveToFile(gceCC.FileName) - if err != nil { - log.Errorf("Error: %s", err) - return "", err - } - return gceCC.FileName, nil -} - -func (cc *GceCloudConfig) saveToFile(filename string) error { - //Get Merged UserData sshkeys - data, err := cc.getMergedUserData() - if err != nil { - log.Errorf("Could not process userdata: %s", err) - return err - } - //write file - writeFile(filename, data) - return nil -} - -func (cc *GceCloudConfig) getMergedUserData() ([]byte, error) { - var returnUserData []byte - userdata := make(map[string]interface{}) - - if cc.UserData != "" { - log.Infof("Found UserData Config") - err := yaml.Unmarshal([]byte(cc.UserData), &userdata) - if err != nil { - log.Errorf("Could not unmarshal data: %s", err) - return nil, err - } - } - - var auth_keys []string - if _, exists := userdata["ssh_authorized_keys"]; exists { - udSshKeys := userdata["ssh_authorized_keys"].([]interface{}) - log.Infof("userdata %s", udSshKeys) - - for _, value := range udSshKeys { - auth_keys = append(auth_keys, value.(string)) - } - } - if cc.NonUserDataSSHKeys != nil { - for _, value := range cc.NonUserDataSSHKeys { - auth_keys = append(auth_keys, value) - } - } - userdata["ssh_authorized_keys"] = auth_keys - - yamlUserData, err := yaml.Marshal(&userdata) - if err != nil { - log.Errorf("Could not Marshal userdata: %s", err) - return nil, err - } else { - returnUserData = append([]byte("#cloud-config\n"), yamlUserData...) - } - - return returnUserData, nil -} - -func writeFile(filename string, data []byte) error { - if err := util.WriteFileAtomic(filename, data, 400); err != nil { - log.Errorf("Could not write file %v", err) - return err - } - return nil -} - -func gceSshKeyFormatter(rawKeys string) []string { - keySlice := strings.Split(rawKeys, "\n") - var cloudFormatedKeys []string - - if len(keySlice) > 0 { - for i := range keySlice { - keyString := keySlice[i] - sIdx := strings.Index(keyString, ":") - if sIdx != -1 { - key := strings.TrimSpace(keyString[sIdx+1:]) - keyA := strings.Split(key, " ") - key = strings.Join(keyA, " ") - if key != "" { - cloudFormatedKeys = append(cloudFormatedKeys, key) - } - } - } - } - return cloudFormatedKeys -} diff --git a/trash.conf b/trash.conf index 6d4a8c53..52f1e194 100644 --- a/trash.conf +++ b/trash.conf @@ -5,7 +5,7 @@ github.com/boltdb/bolt v1.2.0 github.com/cloudfoundry-incubator/candiedyaml 01cbc92901719f599b11f3a7e3b1768d7002b0bb https://github.com/rancher/candiedyaml github.com/cloudfoundry/gosigar 3ed7c74352dae6dc00bdc8c74045375352e3ec05 github.com/codegangsta/cli 95199f812193f6f1e8bbe0a916d9f3ed50729909 https://github.com/ibuildthecloud/cli-1.git -github.com/coreos/coreos-cloudinit dede20ddbc6a3fea5cada4dc3bfa2ebed1a6cbbc https://github.com/rancher/coreos-cloudinit.git +github.com/coreos/coreos-cloudinit v1.11.0-3-gb1c1753 https://github.com/rancher/coreos-cloudinit.git github.com/coreos/go-systemd v4 github.com/coreos/yaml 6b16a5714269b2f70720a45406b1babd947a17ef github.com/davecgh/go-spew 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d diff --git a/vendor/github.com/coreos/coreos-cloudinit/.travis.yml b/vendor/github.com/coreos/coreos-cloudinit/.travis.yml index 07494db3..62ee8cde 100644 --- a/vendor/github.com/coreos/coreos-cloudinit/.travis.yml +++ b/vendor/github.com/coreos/coreos-cloudinit/.travis.yml @@ -1,12 +1,9 @@ language: go -sudo: false matrix: include: - - go: 1.4 - install: - - go get golang.org/x/tools/cmd/cover - - go get golang.org/x/tools/cmd/vet - go: 1.5 + env: GO15VENDOREXPERIMENT=1 + - go: 1.6 script: - ./test diff --git a/vendor/github.com/coreos/coreos-cloudinit/MAINTAINERS b/vendor/github.com/coreos/coreos-cloudinit/MAINTAINERS index e358970b..a4d60bbf 100644 --- a/vendor/github.com/coreos/coreos-cloudinit/MAINTAINERS +++ b/vendor/github.com/coreos/coreos-cloudinit/MAINTAINERS @@ -1,3 +1,2 @@ Alex Crawford (@crawford) Jonathan Boulle (@jonboulle) -Brian Waldon (@bcwaldon) diff --git a/vendor/github.com/coreos/coreos-cloudinit/config/config.go b/vendor/github.com/coreos/coreos-cloudinit/config/config.go index ede380b4..ce598942 100644 --- a/vendor/github.com/coreos/coreos-cloudinit/config/config.go +++ b/vendor/github.com/coreos/coreos-cloudinit/config/config.go @@ -68,6 +68,22 @@ func NewCloudConfig(contents string) (*CloudConfig, error) { return &cfg, err } +// Decode decodes the content of cloud config. Currently only WriteFiles section +// supports several types of encoding and all of them are supported. After +// decode operation, Encoding type is unset. +func (cc *CloudConfig) Decode() error { + for i, file := range cc.WriteFiles { + content, err := DecodeContent(file.Content, file.Encoding) + if err != nil { + return err + } + + cc.WriteFiles[i].Content = string(content) + cc.WriteFiles[i].Encoding = "" + } + + return nil +} func (cc CloudConfig) String() string { bytes, err := yaml.Marshal(cc) if err != nil { diff --git a/vendor/github.com/coreos/coreos-cloudinit/config/etcd2.go b/vendor/github.com/coreos/coreos-cloudinit/config/etcd2.go index 4070800e..d0e0575a 100644 --- a/vendor/github.com/coreos/coreos-cloudinit/config/etcd2.go +++ b/vendor/github.com/coreos/coreos-cloudinit/config/etcd2.go @@ -27,6 +27,7 @@ type Etcd2 struct { DiscoverySRV string `yaml:"discovery_srv" env:"ETCD_DISCOVERY_SRV"` DiscoveryProxy string `yaml:"discovery_proxy" env:"ETCD_DISCOVERY_PROXY"` ElectionTimeout int `yaml:"election_timeout" env:"ETCD_ELECTION_TIMEOUT"` + EnablePprof bool `yaml:"enable_pprof" env:"ETCD_ENABLE_PPROF"` ForceNewCluster bool `yaml:"force_new_cluster" env:"ETCD_FORCE_NEW_CLUSTER"` HeartbeatInterval int `yaml:"heartbeat_interval" env:"ETCD_HEARTBEAT_INTERVAL"` InitialAdvertisePeerURLs string `yaml:"initial_advertise_peer_urls" env:"ETCD_INITIAL_ADVERTISE_PEER_URLS"` @@ -52,6 +53,7 @@ type Etcd2 struct { ProxyRefreshInterval int `yaml:"proxy_refresh_interval" env:"ETCD_PROXY_REFRESH_INTERVAL"` ProxyWriteTimeout int `yaml:"proxy_write_timeout" env:"ETCD_PROXY_WRITE_TIMEOUT"` SnapshotCount int `yaml:"snapshot_count" env:"ETCD_SNAPSHOT_COUNT"` + StrictReconfigCheck bool `yaml:"strict_reconfig_check" env:"ETCD_STRICT_RECONFIG_CHECK"` TrustedCAFile string `yaml:"trusted_ca_file" env:"ETCD_TRUSTED_CA_FILE"` WalDir string `yaml:"wal_dir" env:"ETCD_WAL_DIR"` } diff --git a/vendor/github.com/coreos/coreos-cloudinit/config/ignition.go b/vendor/github.com/coreos/coreos-cloudinit/config/ignition.go index 413a636c..2d9bdd50 100644 --- a/vendor/github.com/coreos/coreos-cloudinit/config/ignition.go +++ b/vendor/github.com/coreos/coreos-cloudinit/config/ignition.go @@ -20,7 +20,10 @@ import ( func IsIgnitionConfig(userdata string) bool { var cfg struct { - Version *int `json:"ignitionVersion" yaml:"ignition_version"` + Version *int `json:"ignitionVersion"` + Ignition struct { + Version *string `json:"version"` + } `json:"ignition"` } - return (json.Unmarshal([]byte(userdata), &cfg) == nil && cfg.Version != nil) + return (json.Unmarshal([]byte(userdata), &cfg) == nil && (cfg.Version != nil || cfg.Ignition.Version != nil)) } diff --git a/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/digitalocean/metadata.go b/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/digitalocean/metadata.go index fa6c605c..71982d0c 100644 --- a/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/digitalocean/metadata.go +++ b/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/digitalocean/metadata.go @@ -66,7 +66,7 @@ type metadataService struct { } func NewDatasource(root string) *metadataService { - return &metadataService{MetadataService: metadata.NewDatasource(root, apiVersion, userdataUrl, metadataPath)} + return &metadataService{MetadataService: metadata.NewDatasource(root, apiVersion, userdataUrl, metadataPath, nil)} } func (ms *metadataService) FetchMetadata() (metadata datasource.Metadata, err error) { diff --git a/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/ec2/metadata.go b/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/ec2/metadata.go index 141fdc94..5489e1d3 100644 --- a/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/ec2/metadata.go +++ b/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/ec2/metadata.go @@ -39,7 +39,7 @@ type metadataService struct { } func NewDatasource(root string) *metadataService { - return &metadataService{metadata.NewDatasource(root, apiVersion, userdataPath, metadataPath)} + return &metadataService{metadata.NewDatasource(root, apiVersion, userdataPath, metadataPath, nil)} } func (ms metadataService) FetchMetadata() (datasource.Metadata, error) { diff --git a/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/gce/metadata.go b/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/gce/metadata.go new file mode 100644 index 00000000..494741c7 --- /dev/null +++ b/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/gce/metadata.go @@ -0,0 +1,89 @@ +// Copyright 2016 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package gce + +import ( + "fmt" + "net" + "net/http" + + "github.com/coreos/coreos-cloudinit/datasource" + "github.com/coreos/coreos-cloudinit/datasource/metadata" +) + +const ( + apiVersion = "computeMetadata/v1/" + metadataPath = apiVersion + "instance/" + userdataPath = apiVersion + "instance/attributes/user-data" +) + +type metadataService struct { + metadata.MetadataService +} + +func NewDatasource(root string) *metadataService { + return &metadataService{metadata.NewDatasource(root, apiVersion, userdataPath, metadataPath, http.Header{"Metadata-Flavor": {"Google"}})} +} + +func (ms metadataService) FetchMetadata() (datasource.Metadata, error) { + public, err := ms.fetchIP("network-interfaces/0/access-configs/0/external-ip") + if err != nil { + return datasource.Metadata{}, err + } + local, err := ms.fetchIP("network-interfaces/0/ip") + if err != nil { + return datasource.Metadata{}, err + } + hostname, err := ms.fetchString("hostname") + if err != nil { + return datasource.Metadata{}, err + } + + return datasource.Metadata{ + PublicIPv4: public, + PrivateIPv4: local, + Hostname: hostname, + }, nil +} + +func (ms metadataService) Type() string { + return "gce-metadata-service" +} + +func (ms metadataService) fetchString(key string) (string, error) { + data, err := ms.FetchData(ms.MetadataUrl() + key) + if err != nil { + return "", err + } + + return string(data), nil +} + +func (ms metadataService) fetchIP(key string) (net.IP, error) { + str, err := ms.fetchString(key) + if err != nil { + return nil, err + } + + if str == "" { + return nil, nil + } + + if ip := net.ParseIP(str); ip != nil { + return ip, nil + } else { + return nil, fmt.Errorf("couldn't parse %q as IP address", str) + } +} diff --git a/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/metadata.go b/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/metadata.go index 2baa4f17..9d52e933 100644 --- a/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/metadata.go +++ b/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/metadata.go @@ -15,6 +15,7 @@ package metadata import ( + "net/http" "strings" "github.com/coreos/coreos-cloudinit/pkg" @@ -28,11 +29,11 @@ type MetadataService struct { MetadataPath string } -func NewDatasource(root, apiVersion, userdataPath, metadataPath string) MetadataService { +func NewDatasource(root, apiVersion, userdataPath, metadataPath string, header http.Header) MetadataService { if !strings.HasSuffix(root, "/") { root += "/" } - return MetadataService{root, pkg.NewHttpClient(), apiVersion, userdataPath, metadataPath} + return MetadataService{root, pkg.NewHttpClientHeader(header), apiVersion, userdataPath, metadataPath} } func (ms MetadataService) IsAvailable() bool { diff --git a/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/packet/metadata.go b/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/packet/metadata.go index 3c7d499d..19d3931a 100644 --- a/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/packet/metadata.go +++ b/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/packet/metadata.go @@ -62,7 +62,7 @@ type metadataService struct { } func NewDatasource(root string) *metadataService { - return &metadataService{MetadataService: metadata.NewDatasource(root, apiVersion, userdataUrl, metadataPath)} + return &metadataService{MetadataService: metadata.NewDatasource(root, apiVersion, userdataUrl, metadataPath, nil)} } func (ms *metadataService) FetchMetadata() (metadata datasource.Metadata, err error) { diff --git a/vendor/github.com/coreos/coreos-cloudinit/initialize/user_data.go b/vendor/github.com/coreos/coreos-cloudinit/initialize/user_data.go index c728d64e..42cbcd50 100644 --- a/vendor/github.com/coreos/coreos-cloudinit/initialize/user_data.go +++ b/vendor/github.com/coreos/coreos-cloudinit/initialize/user_data.go @@ -36,7 +36,16 @@ func ParseUserData(contents string) (interface{}, error) { return config.NewScript(contents) case config.IsCloudConfig(contents): log.Printf("Parsing user-data as cloud-config") - return config.NewCloudConfig(contents) + cc, err := config.NewCloudConfig(contents) + if err != nil { + return nil, err + } + + if err := cc.Decode(); err != nil { + return nil, err + } + + return cc, nil case config.IsIgnitionConfig(contents): return nil, ErrIgnitionConfig default: diff --git a/vendor/github.com/coreos/coreos-cloudinit/pkg/http_client.go b/vendor/github.com/coreos/coreos-cloudinit/pkg/http_client.go index c4fb8032..79556a88 100644 --- a/vendor/github.com/coreos/coreos-cloudinit/pkg/http_client.go +++ b/vendor/github.com/coreos/coreos-cloudinit/pkg/http_client.go @@ -62,8 +62,8 @@ type HttpClient struct { // Maximum number of connection retries. Defaults to 15 MaxRetries int - // Whether or not to skip TLS verification. Defaults to false - SkipTLS bool + // Headers to add to the request. + Header http.Header client *http.Client } @@ -74,11 +74,15 @@ type Getter interface { } func NewHttpClient() *HttpClient { + return NewHttpClientHeader(nil) +} + +func NewHttpClientHeader(header http.Header) *HttpClient { hc := &HttpClient{ InitialBackoff: 50 * time.Millisecond, MaxBackoff: time.Second * 5, MaxRetries: 15, - SkipTLS: false, + Header: header, client: &http.Client{ Timeout: 10 * time.Second, }, @@ -139,7 +143,13 @@ func (h *HttpClient) GetRetry(rawurl string) ([]byte, error) { } func (h *HttpClient) Get(dataURL string) ([]byte, error) { - if resp, err := h.client.Get(dataURL); err == nil { + request, err := http.NewRequest("GET", dataURL, nil) + if err != nil { + return nil, err + } + + request.Header = h.Header + if resp, err := h.client.Do(request); err == nil { defer resp.Body.Close() switch resp.StatusCode / 100 { case HTTP_2xx: diff --git a/vendor/github.com/coreos/coreos-cloudinit/system/env_file.go b/vendor/github.com/coreos/coreos-cloudinit/system/env_file.go index 6b2c926d..4c6e08b1 100644 --- a/vendor/github.com/coreos/coreos-cloudinit/system/env_file.go +++ b/vendor/github.com/coreos/coreos-cloudinit/system/env_file.go @@ -106,7 +106,7 @@ func WriteEnvFile(ef *EnvFile, root string) error { // keys returns the keys of a map in sorted order func keys(m map[string]string) (s []string) { - for k, _ := range m { + for k := range m { s = append(s, k) } sort.Strings(s) diff --git a/vendor/github.com/coreos/coreos-cloudinit/system/file.go b/vendor/github.com/coreos/coreos-cloudinit/system/file.go index 50b1466e..57f48e27 100644 --- a/vendor/github.com/coreos/coreos-cloudinit/system/file.go +++ b/vendor/github.com/coreos/coreos-cloudinit/system/file.go @@ -45,17 +45,16 @@ func (f *File) Permissions() (os.FileMode, error) { return os.FileMode(perm), nil } +// WriteFile writes given endecoded file to the filesystem func WriteFile(f *File, root string) (string, error) { + if f.Encoding != "" { + return "", fmt.Errorf("Unable to write file with encoding %s", f.Encoding) + } + fullpath := path.Join(root, f.Path) dir := path.Dir(fullpath) log.Printf("Writing file to %q", fullpath) - content, err := config.DecodeContent(f.Content, f.Encoding) - - if err != nil { - return "", fmt.Errorf("Unable to decode %s (%v)", f.Path, err) - } - if err := EnsureDirectoryExists(dir); err != nil { return "", err } @@ -71,7 +70,7 @@ func WriteFile(f *File, root string) (string, error) { return "", err } - if err := ioutil.WriteFile(tmp.Name(), content, perm); err != nil { + if err := ioutil.WriteFile(tmp.Name(), []byte(f.Content), perm); err != nil { return "", err } diff --git a/vendor/github.com/coreos/coreos-cloudinit/test b/vendor/github.com/coreos/coreos-cloudinit/test index 645e967a..be9454ab 100755 --- a/vendor/github.com/coreos/coreos-cloudinit/test +++ b/vendor/github.com/coreos/coreos-cloudinit/test @@ -2,42 +2,26 @@ source ./build -SRC=" - config - config/validate - datasource - datasource/configdrive - datasource/file - datasource/metadata - datasource/metadata/cloudsigma - datasource/metadata/digitalocean - datasource/metadata/ec2 - datasource/proc_cmdline - datasource/test - datasource/url - datasource/vmware - datasource/waagent - initialize - network - pkg - system - . -" +SRC=$(find . -name '*.go' \ + -not -path "./vendor/*") + +PKG=$(cd gopath/src/${REPO_PATH}; go list ./... | \ + grep --invert-match vendor) echo "Checking gofix..." go tool fix -diff $SRC echo "Checking gofmt..." -gofmt -d -e $SRC - -# split SRC into an array and prepend REPO_PATH to each local package for go vet -split_vet=(${SRC// / }) -VET_TEST="${REPO_PATH} ${split_vet[@]/#/${REPO_PATH}/}" +res=$(gofmt -d -e -s $SRC) +echo "${res}" +if [ -n "${res}" ]; then + exit 1 +fi echo "Checking govet..." -go vet $VET_TEST +go vet $PKG echo "Running tests..." -go test -timeout 60s -cover $@ ${VET_TEST} --race +go test -timeout 60s -cover $@ ${PKG} --race echo "Success" diff --git a/vendor/github.com/coreos/coreos-cloudinit/vendor.manifest b/vendor/github.com/coreos/coreos-cloudinit/vendor.manifest new file mode 100644 index 00000000..c7e212b8 --- /dev/null +++ b/vendor/github.com/coreos/coreos-cloudinit/vendor.manifest @@ -0,0 +1,11 @@ +# If you manipulate the contents of vendor/, amend this accordingly. +# pkg version +github.com/cloudsigma/cepgo 1bfc4895bf5c4d3b599f3f6ee142299488c8739b +github.com/coreos/go-systemd/dbus 4fbc5060a317b142e6c7bfbedb65596d5f0ab99b +github.com/coreos/yaml 6b16a5714269b2f70720a45406b1babd947a17ef +github.com/dotcloud/docker/pkg/netlink 55d41c3e21e1593b944c06196ffb2ac57ab7f653 +github.com/guelfey/go.dbus f6a3a2366cc39b8479cadc499d3c735fb10fbdda +github.com/tarm/goserial cdabc8d44e8e84f58f18074ae44337e1f2f375b9 +github.com/sigma/vmw-guestinfo 95dd4126d6e8b4ef1970b3f3fe2e8cdd470d2903 +github.com/sigma/vmw-ovflib 56b4f44581cac03d17d8270158bdfd0942ffe790 +github.com/sigma/bdoor babf2a4017b020d4ce04e8167076186e82645dd1 diff --git a/vendor/google.golang.org/cloud/.travis.yml b/vendor/google.golang.org/cloud/.travis.yml deleted file mode 100644 index c037df0d..00000000 --- a/vendor/google.golang.org/cloud/.travis.yml +++ /dev/null @@ -1,11 +0,0 @@ -sudo: false -language: go -go: -- 1.4 -- 1.5 -install: -- go get -v google.golang.org/cloud/... -script: -- openssl aes-256-cbc -K $encrypted_912ff8fa81ad_key -iv $encrypted_912ff8fa81ad_iv -in key.json.enc -out key.json -d -- GCLOUD_TESTS_GOLANG_PROJECT_ID="dulcet-port-762" GCLOUD_TESTS_GOLANG_KEY="$(pwd)/key.json" - go test -v -tags=integration google.golang.org/cloud/... diff --git a/vendor/google.golang.org/cloud/AUTHORS b/vendor/google.golang.org/cloud/AUTHORS deleted file mode 100644 index 3da443dc..00000000 --- a/vendor/google.golang.org/cloud/AUTHORS +++ /dev/null @@ -1,12 +0,0 @@ -# This is the official list of cloud authors for copyright purposes. -# This file is distinct from the CONTRIBUTORS files. -# See the latter for an explanation. - -# Names should be added to this file as: -# Name or Organization -# The email address is not required for organizations. - -Google Inc. -Palm Stone Games, Inc. -Péter Szilágyi -Tyler Treat diff --git a/vendor/google.golang.org/cloud/CONTRIBUTING.md b/vendor/google.golang.org/cloud/CONTRIBUTING.md deleted file mode 100644 index 9a1cab28..00000000 --- a/vendor/google.golang.org/cloud/CONTRIBUTING.md +++ /dev/null @@ -1,114 +0,0 @@ -# Contributing - -1. Sign one of the contributor license agreements below. -1. `go get golang.org/x/review/git-codereview` to install the code reviewing tool. -1. Get the cloud package by running `go get -d google.golang.org/cloud`. - 1. If you have already checked out the source, make sure that the remote git - origin is https://code.googlesource.com/gocloud: - - git remote set-url origin https://code.googlesource.com/gocloud -1. Make changes and create a change by running `git codereview change `, -provide a command message, and use `git codereview mail` to create a Gerrit CL. -1. Keep amending to the change and mail as your recieve feedback. - -## Integration Tests - -Additional to the unit tests, you may run the integration test suite. - -To run the integrations tests, creating and configuration of a project in the -Google Developers Console is required. Once you create a project, set the -following environment variables to be able to run the against the actual APIs. - -- **GCLOUD_TESTS_GOLANG_PROJECT_ID**: Developers Console project's ID (e.g. bamboo-shift-455) -- **GCLOUD_TESTS_GOLANG_KEY**: The path to the JSON key file. - -Create a storage bucket with the same name as the project id set in **GCLOUD_TESTS_GOLANG_PROJECT_ID**. -The storage integration test will create and delete some objects in this bucket. - -Install the [gcloud command-line tool][gcloudcli] to your machine and use it -to create the indexes used in the datastore integration tests with indexes -found in `datastore/testdata/index.yaml`: - -From the project's root directory: - -``` sh -# Install the app component -$ gcloud components update app - -# Set the default project in your env -$ gcloud config set project $GCLOUD_TESTS_GOLANG_PROJECT_ID - -# Authenticate the gcloud tool with your account -$ gcloud auth login - -# Create the indexes -$ gcloud preview datastore create-indexes datastore/testdata/index.yaml - -``` - -You can run the integration tests by running: - -``` sh -$ go test -v -tags=integration google.golang.org/cloud/... -``` - -## Contributor License Agreements - -Before we can accept your pull requests you'll need to sign a Contributor -License Agreement (CLA): - -- **If you are an individual writing original source code** and **you own the -- intellectual property**, then you'll need to sign an [individual CLA][indvcla]. -- **If you work for a company that wants to allow you to contribute your work**, -then you'll need to sign a [corporate CLA][corpcla]. - -You can sign these electronically (just scroll to the bottom). After that, -we'll be able to accept your pull requests. - -## Contributor Code of Conduct - -As contributors and maintainers of this project, -and in the interest of fostering an open and welcoming community, -we pledge to respect all people who contribute through reporting issues, -posting feature requests, updating documentation, -submitting pull requests or patches, and other activities. - -We are committed to making participation in this project -a harassment-free experience for everyone, -regardless of level of experience, gender, gender identity and expression, -sexual orientation, disability, personal appearance, -body size, race, ethnicity, age, religion, or nationality. - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery -* Personal attacks -* Trolling or insulting/derogatory comments -* Public or private harassment -* Publishing other's private information, -such as physical or electronic -addresses, without explicit permission -* Other unethical or unprofessional conduct. - -Project maintainers have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct. -By adopting this Code of Conduct, -project maintainers commit themselves to fairly and consistently -applying these principles to every aspect of managing this project. -Project maintainers who do not follow or enforce the Code of Conduct -may be permanently removed from the project team. - -This code of conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. - -Instances of abusive, harassing, or otherwise unacceptable behavior -may be reported by opening an issue -or contacting one or more of the project maintainers. - -This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, -available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/) - -[gcloudcli]: https://developers.google.com/cloud/sdk/gcloud/ -[indvcla]: https://developers.google.com/open-source/cla/individual -[corpcla]: https://developers.google.com/open-source/cla/corporate diff --git a/vendor/google.golang.org/cloud/CONTRIBUTORS b/vendor/google.golang.org/cloud/CONTRIBUTORS deleted file mode 100644 index 475ac6a6..00000000 --- a/vendor/google.golang.org/cloud/CONTRIBUTORS +++ /dev/null @@ -1,24 +0,0 @@ -# People who have agreed to one of the CLAs and can contribute patches. -# The AUTHORS file lists the copyright holders; this file -# lists people. For example, Google employees are listed here -# but not in AUTHORS, because Google holds the copyright. -# -# https://developers.google.com/open-source/cla/individual -# https://developers.google.com/open-source/cla/corporate -# -# Names should be added to this file as: -# Name - -# Keep the list alphabetically sorted. - -Andrew Gerrand -Brad Fitzpatrick -Burcu Dogan -Dave Day -David Symonds -Glenn Lewis -Johan Euphrosine -Luna Duclos -Michael McGreevy -Péter Szilágyi -Tyler Treat diff --git a/vendor/google.golang.org/cloud/LICENSE b/vendor/google.golang.org/cloud/LICENSE deleted file mode 100644 index a4c5efd8..00000000 --- a/vendor/google.golang.org/cloud/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2014 Google Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/google.golang.org/cloud/README.md b/vendor/google.golang.org/cloud/README.md deleted file mode 100644 index 10d3995d..00000000 --- a/vendor/google.golang.org/cloud/README.md +++ /dev/null @@ -1,135 +0,0 @@ -# Google Cloud for Go - -[![Build Status](https://travis-ci.org/GoogleCloudPlatform/gcloud-golang.svg?branch=master)](https://travis-ci.org/GoogleCloudPlatform/gcloud-golang) - -**NOTE:** These packages are experimental, and may occasionally make -backwards-incompatible changes. - -**NOTE:** Github repo is a mirror of [https://code.googlesource.com/gocloud](https://code.googlesource.com/gocloud). - -Go packages for Google Cloud Platform services. Supported APIs include: - - * Google Cloud Datastore - * Google Cloud Storage - * Google Cloud Pub/Sub - * Google Cloud Container Engine - -``` go -import "google.golang.org/cloud" -``` - -Documentation and examples are available at -[https://godoc.org/google.golang.org/cloud](https://godoc.org/google.golang.org/cloud). - -## Authorization - -Authorization, throughout the package, is delegated to the godoc.org/golang.org/x/oauth2. -Refer to the [godoc documentation](https://godoc.org/golang.org/x/oauth2) -for examples on using oauth2 with the Cloud package. - -## Google Cloud Datastore - -[Google Cloud Datastore][cloud-datastore] ([docs][cloud-datastore-docs]) is a fully -managed, schemaless database for storing non-relational data. Cloud Datastore -automatically scales with your users and supports ACID transactions, high availability -of reads and writes, strong consistency for reads and ancestor queries, and eventual -consistency for all other queries. - -Follow the [activation instructions][cloud-datastore-activation] to use the Google -Cloud Datastore API with your project. - -[https://godoc.org/google.golang.org/cloud/datastore](https://godoc.org/google.golang.org/cloud/datastore) - - -```go -type Post struct { - Title string - Body string `datastore:",noindex"` - PublishedAt time.Time -} -keys := []*datastore.Key{ - datastore.NewKey(ctx, "Post", "post1", 0, nil), - datastore.NewKey(ctx, "Post", "post2", 0, nil), -} -posts := []*Post{ - {Title: "Post 1", Body: "...", PublishedAt: time.Now()}, - {Title: "Post 2", Body: "...", PublishedAt: time.Now()}, -} -if _, err := datastore.PutMulti(ctx, keys, posts); err != nil { - log.Println(err) -} -``` - -## Google Cloud Storage - -[Google Cloud Storage][cloud-storage] ([docs][cloud-storage-docs]) allows you to store -data on Google infrastructure with very high reliability, performance and availability, -and can be used to distribute large data objects to users via direct download. - -[https://godoc.org/google.golang.org/cloud/storage](https://godoc.org/google.golang.org/cloud/storage) - - -```go -// Read the object1 from bucket. -rc, err := storage.NewReader(ctx, "bucket", "object1") -if err != nil { - log.Fatal(err) -} -slurp, err := ioutil.ReadAll(rc) -rc.Close() -if err != nil { - log.Fatal(err) -} -``` - -## Google Cloud Pub/Sub (Alpha) - -> Google Cloud Pub/Sub is in **Alpha status**. As a result, it might change in -> backward-incompatible ways and is not recommended for production use. It is not -> subject to any SLA or deprecation policy. - -[Google Cloud Pub/Sub][cloud-pubsub] ([docs][cloud-pubsub-docs]) allows you to connect -your services with reliable, many-to-many, asynchronous messaging hosted on Google's -infrastructure. Cloud Pub/Sub automatically scales as you need it and provides a foundation -for building your own robust, global services. - -[https://godoc.org/google.golang.org/cloud/pubsub](https://godoc.org/google.golang.org/cloud/pubsub) - - -```go -// Publish "hello world" on topic1. -msgIDs, err := pubsub.Publish(ctx, "topic1", &pubsub.Message{ - Data: []byte("hello world"), -}) -if err != nil { - log.Println(err) -} -// Pull messages via subscription1. -msgs, err := pubsub.Pull(ctx, "subscription1", 1) -if err != nil { - log.Println(err) -} -``` - -## Contributing - -Contributions are welcome. Please, see the -[CONTRIBUTING](https://github.com/GoogleCloudPlatform/gcloud-golang/blob/master/CONTRIBUTING.md) -document for details. We're using Gerrit for our code reviews. Please don't open pull -requests against this repo, new pull requests will be automatically closed. - -Please note that this project is released with a Contributor Code of Conduct. -By participating in this project you agree to abide by its terms. -See [Contributor Code of Conduct](https://github.com/GoogleCloudPlatform/gcloud-golang/blob/master/CONTRIBUTING.md#contributor-code-of-conduct) -for more information. - -[cloud-datastore]: https://cloud.google.com/datastore/ -[cloud-datastore-docs]: https://cloud.google.com/datastore/docs -[cloud-datastore-activation]: https://cloud.google.com/datastore/docs/activate - -[cloud-pubsub]: https://cloud.google.com/pubsub/ -[cloud-pubsub-docs]: https://cloud.google.com/pubsub/docs - -[cloud-storage]: https://cloud.google.com/storage/ -[cloud-storage-docs]: https://cloud.google.com/storage/docs/overview -[cloud-storage-create-bucket]: https://cloud.google.com/storage/docs/cloud-console#_creatingbuckets diff --git a/vendor/google.golang.org/cloud/compute/metadata/metadata.go b/vendor/google.golang.org/cloud/compute/metadata/metadata.go deleted file mode 100644 index 972972dd..00000000 --- a/vendor/google.golang.org/cloud/compute/metadata/metadata.go +++ /dev/null @@ -1,327 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package metadata provides access to Google Compute Engine (GCE) -// metadata and API service accounts. -// -// This package is a wrapper around the GCE metadata service, -// as documented at https://developers.google.com/compute/docs/metadata. -package metadata // import "google.golang.org/cloud/compute/metadata" - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "net" - "net/http" - "net/url" - "os" - "strings" - "sync" - "time" - - "google.golang.org/cloud/internal" -) - -type cachedValue struct { - k string - trim bool - mu sync.Mutex - v string -} - -var ( - projID = &cachedValue{k: "project/project-id", trim: true} - projNum = &cachedValue{k: "project/numeric-project-id", trim: true} - instID = &cachedValue{k: "instance/id", trim: true} -) - -var metaClient = &http.Client{ - Transport: &internal.Transport{ - Base: &http.Transport{ - Dial: (&net.Dialer{ - Timeout: 750 * time.Millisecond, - KeepAlive: 30 * time.Second, - }).Dial, - ResponseHeaderTimeout: 750 * time.Millisecond, - }, - }, -} - -// NotDefinedError is returned when requested metadata is not defined. -// -// The underlying string is the suffix after "/computeMetadata/v1/". -// -// This error is not returned if the value is defined to be the empty -// string. -type NotDefinedError string - -func (suffix NotDefinedError) Error() string { - return fmt.Sprintf("metadata: GCE metadata %q not defined", string(suffix)) -} - -// Get returns a value from the metadata service. -// The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/". -// -// If the GCE_METADATA_HOST environment variable is not defined, a default of -// 169.254.169.254 will be used instead. -// -// If the requested metadata is not defined, the returned error will -// be of type NotDefinedError. -func Get(suffix string) (string, error) { - val, _, err := getETag(suffix) - return val, err -} - -// getETag returns a value from the metadata service as well as the associated -// ETag. This func is otherwise equivalent to Get. -func getETag(suffix string) (value, etag string, err error) { - // Using a fixed IP makes it very difficult to spoof the metadata service in - // a container, which is an important use-case for local testing of cloud - // deployments. To enable spoofing of the metadata service, the environment - // variable GCE_METADATA_HOST is first inspected to decide where metadata - // requests shall go. - host := os.Getenv("GCE_METADATA_HOST") - if host == "" { - // Using 169.254.169.254 instead of "metadata" here because Go - // binaries built with the "netgo" tag and without cgo won't - // know the search suffix for "metadata" is - // ".google.internal", and this IP address is documented as - // being stable anyway. - host = "169.254.169.254" - } - url := "http://" + host + "/computeMetadata/v1/" + suffix - req, _ := http.NewRequest("GET", url, nil) - req.Header.Set("Metadata-Flavor", "Google") - res, err := metaClient.Do(req) - if err != nil { - return "", "", err - } - defer res.Body.Close() - if res.StatusCode == http.StatusNotFound { - return "", "", NotDefinedError(suffix) - } - if res.StatusCode != 200 { - return "", "", fmt.Errorf("status code %d trying to fetch %s", res.StatusCode, url) - } - all, err := ioutil.ReadAll(res.Body) - if err != nil { - return "", "", err - } - return string(all), res.Header.Get("Etag"), nil -} - -func getTrimmed(suffix string) (s string, err error) { - s, err = Get(suffix) - s = strings.TrimSpace(s) - return -} - -func (c *cachedValue) get() (v string, err error) { - defer c.mu.Unlock() - c.mu.Lock() - if c.v != "" { - return c.v, nil - } - if c.trim { - v, err = getTrimmed(c.k) - } else { - v, err = Get(c.k) - } - if err == nil { - c.v = v - } - return -} - -var onGCE struct { - sync.Mutex - set bool - v bool -} - -// OnGCE reports whether this process is running on Google Compute Engine. -func OnGCE() bool { - defer onGCE.Unlock() - onGCE.Lock() - if onGCE.set { - return onGCE.v - } - onGCE.set = true - - // We use the DNS name of the metadata service here instead of the IP address - // because we expect that to fail faster in the not-on-GCE case. - res, err := metaClient.Get("http://metadata.google.internal") - if err != nil { - return false - } - onGCE.v = res.Header.Get("Metadata-Flavor") == "Google" - return onGCE.v -} - -// Subscribe subscribes to a value from the metadata service. -// The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/". -// -// Subscribe calls fn with the latest metadata value indicated by the provided -// suffix. If the metadata value is deleted, fn is called with the empty string -// and ok false. Subscribe blocks until fn returns a non-nil error or the value -// is deleted. Subscribe returns the error value returned from the last call to -// fn, which may be nil when ok == false. -func Subscribe(suffix string, fn func(v string, ok bool) error) error { - const failedSubscribeSleep = time.Second * 5 - - // First check to see if the metadata value exists at all. - val, lastETag, err := getETag(suffix) - if err != nil { - return err - } - - if err := fn(val, true); err != nil { - return err - } - - ok := true - suffix += "?wait_for_change=true&last_etag=" - for { - val, etag, err := getETag(suffix + url.QueryEscape(lastETag)) - if err != nil { - if _, deleted := err.(NotDefinedError); !deleted { - time.Sleep(failedSubscribeSleep) - continue // Retry on other errors. - } - ok = false - } - lastETag = etag - - if err := fn(val, ok); err != nil || !ok { - return err - } - } -} - -// ProjectID returns the current instance's project ID string. -func ProjectID() (string, error) { return projID.get() } - -// NumericProjectID returns the current instance's numeric project ID. -func NumericProjectID() (string, error) { return projNum.get() } - -// InternalIP returns the instance's primary internal IP address. -func InternalIP() (string, error) { - return getTrimmed("instance/network-interfaces/0/ip") -} - -// ExternalIP returns the instance's primary external (public) IP address. -func ExternalIP() (string, error) { - return getTrimmed("instance/network-interfaces/0/access-configs/0/external-ip") -} - -// Hostname returns the instance's hostname. This will be of the form -// ".c..internal". -func Hostname() (string, error) { - return getTrimmed("instance/hostname") -} - -// InstanceTags returns the list of user-defined instance tags, -// assigned when initially creating a GCE instance. -func InstanceTags() ([]string, error) { - var s []string - j, err := Get("instance/tags") - if err != nil { - return nil, err - } - if err := json.NewDecoder(strings.NewReader(j)).Decode(&s); err != nil { - return nil, err - } - return s, nil -} - -// InstanceID returns the current VM's numeric instance ID. -func InstanceID() (string, error) { - return instID.get() -} - -// InstanceName returns the current VM's instance ID string. -func InstanceName() (string, error) { - host, err := Hostname() - if err != nil { - return "", err - } - return strings.Split(host, ".")[0], nil -} - -// Zone returns the current VM's zone, such as "us-central1-b". -func Zone() (string, error) { - zone, err := getTrimmed("instance/zone") - // zone is of the form "projects//zones/". - if err != nil { - return "", err - } - return zone[strings.LastIndex(zone, "/")+1:], nil -} - -// InstanceAttributes returns the list of user-defined attributes, -// assigned when initially creating a GCE VM instance. The value of an -// attribute can be obtained with InstanceAttributeValue. -func InstanceAttributes() ([]string, error) { return lines("instance/attributes/") } - -// ProjectAttributes returns the list of user-defined attributes -// applying to the project as a whole, not just this VM. The value of -// an attribute can be obtained with ProjectAttributeValue. -func ProjectAttributes() ([]string, error) { return lines("project/attributes/") } - -func lines(suffix string) ([]string, error) { - j, err := Get(suffix) - if err != nil { - return nil, err - } - s := strings.Split(strings.TrimSpace(j), "\n") - for i := range s { - s[i] = strings.TrimSpace(s[i]) - } - return s, nil -} - -// InstanceAttributeValue returns the value of the provided VM -// instance attribute. -// -// If the requested attribute is not defined, the returned error will -// be of type NotDefinedError. -// -// InstanceAttributeValue may return ("", nil) if the attribute was -// defined to be the empty string. -func InstanceAttributeValue(attr string) (string, error) { - return Get("instance/attributes/" + attr) -} - -// ProjectAttributeValue returns the value of the provided -// project attribute. -// -// If the requested attribute is not defined, the returned error will -// be of type NotDefinedError. -// -// ProjectAttributeValue may return ("", nil) if the attribute was -// defined to be the empty string. -func ProjectAttributeValue(attr string) (string, error) { - return Get("project/attributes/" + attr) -} - -// Scopes returns the service account scopes for the given account. -// The account may be empty or the string "default" to use the instance's -// main account. -func Scopes(serviceAccount string) ([]string, error) { - if serviceAccount == "" { - serviceAccount = "default" - } - return lines("instance/service-accounts/" + serviceAccount + "/scopes") -} diff --git a/vendor/google.golang.org/cloud/internal/cloud.go b/vendor/google.golang.org/cloud/internal/cloud.go deleted file mode 100644 index 8b0db1b5..00000000 --- a/vendor/google.golang.org/cloud/internal/cloud.go +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package internal provides support for the cloud packages. -// -// Users should not import this package directly. -package internal - -import ( - "fmt" - "net/http" - "sync" - - "golang.org/x/net/context" -) - -type contextKey struct{} - -func WithContext(parent context.Context, projID string, c *http.Client) context.Context { - if c == nil { - panic("nil *http.Client passed to WithContext") - } - if projID == "" { - panic("empty project ID passed to WithContext") - } - return context.WithValue(parent, contextKey{}, &cloudContext{ - ProjectID: projID, - HTTPClient: c, - }) -} - -const userAgent = "gcloud-golang/0.1" - -type cloudContext struct { - ProjectID string - HTTPClient *http.Client - - mu sync.Mutex // guards svc - svc map[string]interface{} // e.g. "storage" => *rawStorage.Service -} - -// Service returns the result of the fill function if it's never been -// called before for the given name (which is assumed to be an API -// service name, like "datastore"). If it has already been cached, the fill -// func is not run. -// It's safe for concurrent use by multiple goroutines. -func Service(ctx context.Context, name string, fill func(*http.Client) interface{}) interface{} { - return cc(ctx).service(name, fill) -} - -func (c *cloudContext) service(name string, fill func(*http.Client) interface{}) interface{} { - c.mu.Lock() - defer c.mu.Unlock() - - if c.svc == nil { - c.svc = make(map[string]interface{}) - } else if v, ok := c.svc[name]; ok { - return v - } - v := fill(c.HTTPClient) - c.svc[name] = v - return v -} - -// Transport is an http.RoundTripper that appends -// Google Cloud client's user-agent to the original -// request's user-agent header. -type Transport struct { - // Base represents the actual http.RoundTripper - // the requests will be delegated to. - Base http.RoundTripper -} - -// RoundTrip appends a user-agent to the existing user-agent -// header and delegates the request to the base http.RoundTripper. -func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { - req = cloneRequest(req) - ua := req.Header.Get("User-Agent") - if ua == "" { - ua = userAgent - } else { - ua = fmt.Sprintf("%s %s", ua, userAgent) - } - req.Header.Set("User-Agent", ua) - return t.Base.RoundTrip(req) -} - -// cloneRequest returns a clone of the provided *http.Request. -// The clone is a shallow copy of the struct and its Header map. -func cloneRequest(r *http.Request) *http.Request { - // shallow copy of the struct - r2 := new(http.Request) - *r2 = *r - // deep copy of the Header - r2.Header = make(http.Header) - for k, s := range r.Header { - r2.Header[k] = s - } - return r2 -} - -func ProjID(ctx context.Context) string { - return cc(ctx).ProjectID -} - -func HTTPClient(ctx context.Context) *http.Client { - return cc(ctx).HTTPClient -} - -// cc returns the internal *cloudContext (cc) state for a context.Context. -// It panics if the user did it wrong. -func cc(ctx context.Context) *cloudContext { - if c, ok := ctx.Value(contextKey{}).(*cloudContext); ok { - return c - } - panic("invalid context.Context type; it should be created with cloud.NewContext") -} diff --git a/vendor/google.golang.org/cloud/key.json.enc b/vendor/google.golang.org/cloud/key.json.enc deleted file mode 100644 index 2f673a84..00000000 Binary files a/vendor/google.golang.org/cloud/key.json.enc and /dev/null differ