ami_spec 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ami_spec.rb +11 -0
- data/lib/ami_spec/aws_instance.rb +6 -1
- data/lib/ami_spec/aws_instance_options.rb +1 -0
- data/lib/ami_spec/version.rb +1 -1
- data/spec/ami_spec_spec.rb +20 -0
- data/spec/aws_instance_spec.rb +14 -1
- metadata +2 -2
data/lib/ami_spec.rb
CHANGED
@@ -36,6 +36,8 @@ module AmiSpec
|
|
36
36
|
# The username to SSH to the AMI with.
|
37
37
|
# ssh_retries::
|
38
38
|
# Set the maximum number of ssh retries while waiting for the instance to boot.
|
39
|
+
# tags:::
|
40
|
+
# Additional tags to add to launched instances in the form of comma separated key=value pairs
|
39
41
|
# debug::
|
40
42
|
# Don't terminate the instances on exit
|
41
43
|
# == Returns:
|
@@ -96,6 +98,7 @@ module AmiSpec
|
|
96
98
|
opt :aws_public_ip, "Launch instances with a public IP"
|
97
99
|
opt :ssh_retries, "The number of times we should try sshing to the ec2 instance before giving up. Defaults to 30",
|
98
100
|
type: :int, default: 30
|
101
|
+
opt :tags, "Additional tags to add to launched instances in the form of comma separated key=value pairs. i.e. Name=AmiSpec", type: :string, default: ""
|
99
102
|
opt :debug, "Don't terminate instances on exit"
|
100
103
|
opt :wait_for_rc, "Wait for oldschool SystemV scripts to run before conducting tests. Currently only supports Ubuntu with upstart"
|
101
104
|
end
|
@@ -113,6 +116,14 @@ module AmiSpec
|
|
113
116
|
fail "You must specify either role and ami or role_ami_file"
|
114
117
|
end
|
115
118
|
|
119
|
+
options[:tags] = parse_tags(options[:tags])
|
120
|
+
|
116
121
|
exit run(options)
|
117
122
|
end
|
123
|
+
|
124
|
+
def self.parse_tags(tags)
|
125
|
+
tag_pairs = tags.split(',')
|
126
|
+
tag_key_values = tag_pairs.collect{ |pair| pair.split('=')}.flatten
|
127
|
+
Hash[*tag_key_values]
|
128
|
+
end
|
118
129
|
end
|
@@ -20,6 +20,7 @@ module AmiSpec
|
|
20
20
|
@public_ip = options.fetch(:aws_public_ip)
|
21
21
|
@region = options.fetch(:aws_region)
|
22
22
|
@security_group_ids = options.fetch(:aws_security_groups)
|
23
|
+
@tags = ec2ify_tags(options.fetch(:tags))
|
23
24
|
end
|
24
25
|
|
25
26
|
def_delegators :@instance, :instance_id, :tags, :terminate, :private_ip_address, :public_ip_address
|
@@ -39,6 +40,10 @@ module AmiSpec
|
|
39
40
|
!@region.nil? ? {region: @region} : {}
|
40
41
|
end
|
41
42
|
|
43
|
+
def ec2ify_tags(tags)
|
44
|
+
tags.map { |k,v| {key: k, value: v} }
|
45
|
+
end
|
46
|
+
|
42
47
|
def instances_options
|
43
48
|
params = {
|
44
49
|
image_id: @ami,
|
@@ -61,7 +66,7 @@ module AmiSpec
|
|
61
66
|
end
|
62
67
|
|
63
68
|
def tag_instance
|
64
|
-
@instance.create_tags(tags: [{ key: 'AmiSpec', value: @role }])
|
69
|
+
@instance.create_tags(tags: [{ key: 'AmiSpec', value: @role }] + @tags)
|
65
70
|
end
|
66
71
|
end
|
67
72
|
end
|
data/lib/ami_spec/version.rb
CHANGED
data/spec/ami_spec_spec.rb
CHANGED
@@ -21,6 +21,12 @@ describe AmiSpec do
|
|
21
21
|
)
|
22
22
|
end
|
23
23
|
|
24
|
+
describe '#invoke' do
|
25
|
+
it 'raises a system exit with no arguments' do
|
26
|
+
expect{ described_class.invoke }.to raise_error(SystemExit)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
24
30
|
describe '#run' do
|
25
31
|
before do
|
26
32
|
allow(AmiSpec::WaitForSSH).to receive(:wait).and_return(true)
|
@@ -51,4 +57,18 @@ describe AmiSpec do
|
|
51
57
|
end
|
52
58
|
end
|
53
59
|
end
|
60
|
+
|
61
|
+
describe '#parse_tags' do
|
62
|
+
it 'parses a single key/value pair' do
|
63
|
+
expect(described_class.parse_tags("Name=AmiSpec")).to eq( { "Name"=>"AmiSpec" } )
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'parses multiple key/value pairs' do
|
67
|
+
expect(described_class.parse_tags("Name=AmiSpec,Owner=Me")).to eq( { "Name"=>"AmiSpec", "Owner"=>"Me" } )
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'parses an empty string' do
|
71
|
+
expect(described_class.parse_tags("")).to eq({})
|
72
|
+
end
|
73
|
+
end
|
54
74
|
end
|
data/spec/aws_instance_spec.rb
CHANGED
@@ -7,6 +7,7 @@ describe AmiSpec::AwsInstance do
|
|
7
7
|
let(:client_double) { instance_double(Aws::EC2::Client) }
|
8
8
|
let(:new_ec2_double) { instance_double(Aws::EC2::Types::Instance) }
|
9
9
|
let(:ec2_double) { instance_double(Aws::EC2::Instance) }
|
10
|
+
let(:tags) { {} }
|
10
11
|
subject(:aws_instance) do
|
11
12
|
described_class.new(
|
12
13
|
role: role,
|
@@ -16,7 +17,8 @@ describe AmiSpec::AwsInstance do
|
|
16
17
|
aws_instance_type: 't2.micro',
|
17
18
|
aws_public_ip: false,
|
18
19
|
aws_security_groups: sec_group_id,
|
19
|
-
aws_region: region
|
20
|
+
aws_region: region,
|
21
|
+
tags: tags
|
20
22
|
)
|
21
23
|
end
|
22
24
|
|
@@ -78,6 +80,17 @@ describe AmiSpec::AwsInstance do
|
|
78
80
|
end
|
79
81
|
end
|
80
82
|
|
83
|
+
context 'with tags' do
|
84
|
+
let(:tags) { {"Name" => "AmiSpec"} }
|
85
|
+
|
86
|
+
it 'tags the instance' do
|
87
|
+
expect(ec2_double).to receive(:create_tags).with(
|
88
|
+
{tags: [{ key: 'AmiSpec', value: role}, { key: "Name", value: "AmiSpec"}]}
|
89
|
+
)
|
90
|
+
start
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
81
94
|
it 'tags the instance with a role' do
|
82
95
|
expect(ec2_double).to receive(:create_tags).with(
|
83
96
|
hash_including(tags: [{ key: 'AmiSpec', value: role}])
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ami_spec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2016-
|
13
|
+
date: 2016-09-15 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: aws-sdk
|