summaryrefslogtreecommitdiff
path: root/aws/ec2info.go
blob: 0261eb02a8153ad235c84f000c528142bf170ca3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package aws

import (
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/ec2"
)

// Ec2Info -
type Ec2Info struct {
	describer  func() InstanceDescriber
	metaClient *Ec2Meta
}

// InstanceDescriber - A subset of ec2iface.EC2API that we can use to call EC2.DescribeInstances
type InstanceDescriber interface {
	DescribeInstances(*ec2.DescribeInstancesInput) (*ec2.DescribeInstancesOutput, error)
}

// NewEc2Info -
func NewEc2Info() *Ec2Info {
	metaClient := &Ec2Meta{}
	return &Ec2Info{
		describer: func() InstanceDescriber {
			region := metaClient.Region()
			return ec2Client(region)
		},
		metaClient: metaClient,
	}
}

func ec2Client(region string) (client InstanceDescriber) {
	config := aws.NewConfig()
	config = config.WithRegion(region)
	client = ec2.New(session.New(config))
	return client
}

// Tag -
func (e *Ec2Info) Tag(tag string, def ...string) string {
	instanceID := e.metaClient.Meta("instance-id")
	input := &ec2.DescribeInstancesInput{
		InstanceIds: aws.StringSlice([]string{instanceID}),
	}
	output, err := e.describer().DescribeInstances(input)
	if err != nil {
		return returnDefault(def)
	}
	if output != nil && len(output.Reservations) > 0 &&
		len(output.Reservations[0].Instances) > 0 &&
		len(output.Reservations[0].Instances[0].Tags) > 0 {
		for _, v := range output.Reservations[0].Instances[0].Tags {
			if *v.Key == tag {
				return *v.Value
			}
		}
	}

	return returnDefault(def)
}