Skip to content

Commit

Permalink
Short-circuit ec2 function defaults when not in AWS
Browse files Browse the repository at this point in the history
Signed-off-by: Dave Henderson <[email protected]>
  • Loading branch information
hairyhenderson committed Sep 3, 2016
1 parent 6f2c5df commit d26ecaa
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 4 deletions.
8 changes: 8 additions & 0 deletions aws/ec2info.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,15 @@ func ec2Client(region string) (client InstanceDescriber) {

// Tag -
func (e *Ec2Info) Tag(tag string, def ...string) string {
if e.metaClient.nonAWS {
returnDefault(def)
}

instanceID := e.metaClient.Meta("instance-id")
if instanceID == "" {
return returnDefault(def)
}

input := &ec2.DescribeInstancesInput{
InstanceIds: aws.StringSlice([]string{instanceID}),
}
Expand Down
15 changes: 15 additions & 0 deletions aws/ec2info_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,21 @@ func TestTag_ValidKey(t *testing.T) {
assert.Equal(t, "bar", e.Tag("foo", "default"))
}

func TestTag_NonEC2(t *testing.T) {
server, ec2meta := MockServer(404, "")
defer server.Close()
client := DummyInstanceDescriber{}
e := &Ec2Info{
describer: func() InstanceDescriber {
return client
},
metaClient: ec2meta,
}

assert.Equal(t, "", e.Tag("foo"))
assert.Equal(t, "default", e.Tag("foo", "default"))
}

// test doubles
type DummyInstanceDescriber struct {
tags []*ec2.Tag
Expand Down
23 changes: 20 additions & 3 deletions aws/ec2meta.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const DefaultEndpoint = "http://169.254.169.254"
type Ec2Meta struct {
Endpoint string
Client *http.Client
nonAWS bool
}

// returnDefault -
Expand All @@ -26,16 +27,32 @@ func returnDefault(def []string) string {
return ""
}

func unreachable(err error) bool {
if strings.Contains(err.Error(), "request canceled") ||
strings.Contains(err.Error(), "no route to host") ||
strings.Contains(err.Error(), "host is down") {
return true
}

return false
}

func (e *Ec2Meta) retrieveMetadata(url string, key string, def ...string) string {
if e.nonAWS {
return returnDefault(def)
}

if e.Client == nil {
e.Client = &http.Client{
Timeout: 5 * time.Second,
}
e.Client = &http.Client{Timeout: 500 * time.Millisecond}
}
resp, err := e.Client.Get(url)
if err != nil {
if unreachable(err) {
e.nonAWS = true
}
return returnDefault(def)
}

defer resp.Body.Close()
if resp.StatusCode > 399 {
return returnDefault(def)
Expand Down
2 changes: 1 addition & 1 deletion aws/testutils.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@ func MockServer(code int, body string) (*httptest.Server, *Ec2Meta) {
}
httpClient := &http.Client{Transport: tr}

client := &Ec2Meta{server.URL + "/", httpClient}
client := &Ec2Meta{server.URL + "/", httpClient, false}
return server, client
}

0 comments on commit d26ecaa

Please sign in to comment.