ami_spec 0.3.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +28 -26
- data/lib/ami_spec.rb +13 -0
- data/lib/ami_spec/aws_instance.rb +11 -0
- data/lib/ami_spec/aws_instance_options.rb +2 -0
- data/lib/ami_spec/server_spec.rb +9 -1
- data/lib/ami_spec/server_spec_options.rb +3 -0
- data/lib/ami_spec/version.rb +1 -1
- data/spec/aws_instance_spec.rb +35 -1
- metadata +24 -41
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 791efe6c0784b76689e581dd3d4172d9069471c81e1f06cf6a3671b2edb2e5c3
|
4
|
+
data.tar.gz: bb3c40ff9295d4dafc97cbc7ec6e54b5514d29a13cd39a17647b1170ee6d7839
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c82b27a4a85ac7fbdc3bac38bf4736d8675167349ffb41bf97deaa9358ae54fa2dea58e286c5ead916058266b3cddb5aca6c0fa0e24c1f4b0e1a0d4e2052ac00
|
7
|
+
data.tar.gz: 857dfa433808063a4a64c8dba5cc2e493f3f064e3a94b69565f28eb49a7a4cedd5950f83e09ad5ec784174c291d0f0ddc016fcd1b9ed07b4135da10a67fb3395
|
data/README.md
CHANGED
@@ -29,32 +29,34 @@ Run `bundle install`
|
|
29
29
|
```cli
|
30
30
|
$ bundle exec ami_spec --help
|
31
31
|
Options:
|
32
|
-
-r, --role=<s>
|
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
|
-
--
|
32
|
+
-r, --role=<s> The role to test, this should map to a directory in the spec
|
33
|
+
folder
|
34
|
+
-a, --ami=<s> The ami ID to run tests against
|
35
|
+
-o, --role-ami-file=<s> A file containing comma separated roles and amis. i.e.
|
36
|
+
web_server,ami-id.
|
37
|
+
-s, --specs=<s> The directory to find ServerSpecs
|
38
|
+
-u, --subnet-id=<s> The subnet to start the instance in
|
39
|
+
-k, --key-name=<s> The SSH key name to assign to instances
|
40
|
+
-e, --key-file=<s> The SSH private key file associated to the key_name
|
41
|
+
-h, --ssh-user=<s> The user to ssh to the instance as
|
42
|
+
-w, --aws-region=<s> The AWS region, defaults to AWS_DEFAULT_REGION environment
|
43
|
+
variable
|
44
|
+
-i, --aws-instance-type=<s> The ec2 instance type, defaults to t2.micro (default:
|
45
|
+
t2.micro)
|
46
|
+
-c, --aws-security-groups=<s+> Security groups to associate to the launched instances. May be
|
47
|
+
specified multiple times
|
48
|
+
-p, --aws-public-ip Launch instances with a public IP
|
49
|
+
-t, --ssh-retries=<i> The number of times we should try sshing to the ec2 instance
|
50
|
+
before giving up. Defaults to 30 (default: 30)
|
51
|
+
-g, --tags=<s> Additional tags to add to launched instances in the form of
|
52
|
+
comma separated key=value pairs. i.e. Name=AmiSpec (default: )
|
53
|
+
-d, --debug Don't terminate instances on exit
|
54
|
+
-f, --wait-for-rc Wait for oldschool SystemV scripts to run before conducting
|
55
|
+
tests. Currently only supports Ubuntu with upstart
|
56
|
+
-l, --user-data-file=<s> File path for aws ec2 user data
|
57
|
+
-m, --iam-instance-profile-arn=<s> IAM instance profile to use
|
58
|
+
--help Show this message
|
59
|
+
|
58
60
|
```
|
59
61
|
|
60
62
|
AmiSpec will launch an EC2 instance from the given AMI (`--ami`), in a subnet (`--subnet-id`) with a key-pair (`--key-name`)
|
data/lib/ami_spec.rb
CHANGED
@@ -40,6 +40,8 @@ module AmiSpec
|
|
40
40
|
# Additional tags to add to launched instances in the form of comma separated key=value pairs
|
41
41
|
# debug::
|
42
42
|
# Don't terminate the instances on exit
|
43
|
+
# buildkite::
|
44
|
+
# Output section separators for buildkite
|
43
45
|
# == Returns:
|
44
46
|
# Boolean - The result of all the server specs.
|
45
47
|
def self.run(options)
|
@@ -100,7 +102,10 @@ module AmiSpec
|
|
100
102
|
type: :int, default: 30
|
101
103
|
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: ""
|
102
104
|
opt :debug, "Don't terminate instances on exit"
|
105
|
+
opt :buildkite, "Output section separators for buildkite"
|
103
106
|
opt :wait_for_rc, "Wait for oldschool SystemV scripts to run before conducting tests. Currently only supports Ubuntu with upstart"
|
107
|
+
opt :user_data_file, "File path for aws ec2 user data", type: :string
|
108
|
+
opt :iam_instance_profile_arn, "IAM instance profile to use", type: :string
|
104
109
|
end
|
105
110
|
|
106
111
|
if options[:role] && options[:ami]
|
@@ -116,6 +121,14 @@ module AmiSpec
|
|
116
121
|
fail "You must specify either role and ami or role_ami_file"
|
117
122
|
end
|
118
123
|
|
124
|
+
unless File.exist? options[:key_file]
|
125
|
+
fail "Key file #{options[:key_file]} not found"
|
126
|
+
end
|
127
|
+
|
128
|
+
unless options[:user_data_file] and File.exist? options[:user_data_file]
|
129
|
+
fail "User Data file #{options[:user_data_file]} not found"
|
130
|
+
end
|
131
|
+
|
119
132
|
options[:tags] = parse_tags(options[:tags])
|
120
133
|
|
121
134
|
exit run(options)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'aws-sdk'
|
2
2
|
require 'forwardable'
|
3
|
+
require 'base64'
|
3
4
|
|
4
5
|
module AmiSpec
|
5
6
|
class AwsInstance
|
@@ -21,6 +22,8 @@ module AmiSpec
|
|
21
22
|
@region = options.fetch(:aws_region)
|
22
23
|
@security_group_ids = options.fetch(:aws_security_groups)
|
23
24
|
@tags = ec2ify_tags(options.fetch(:tags))
|
25
|
+
@user_data_file = options.fetch(:user_data_file, nil)
|
26
|
+
@iam_instance_profile_arn = options.fetch(:iam_instance_profile_arn, nil)
|
24
27
|
end
|
25
28
|
|
26
29
|
def_delegators :@instance, :instance_id, :tags, :terminate, :private_ip_address, :public_ip_address
|
@@ -58,6 +61,14 @@ module AmiSpec
|
|
58
61
|
}]
|
59
62
|
}
|
60
63
|
|
64
|
+
params[:user_data] = Base64.encode64(File.read(@user_data_file)) unless @user_data_file.nil?
|
65
|
+
|
66
|
+
unless @iam_instance_profile_arn.nil?
|
67
|
+
params[:iam_instance_profile] = {
|
68
|
+
arn: @iam_instance_profile_arn
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
61
72
|
unless @security_group_ids.nil?
|
62
73
|
params[:network_interfaces][0][:groups] = @security_group_ids
|
63
74
|
end
|
data/lib/ami_spec/server_spec.rb
CHANGED
@@ -15,10 +15,17 @@ module AmiSpec
|
|
15
15
|
@spec = options.fetch(:specs)
|
16
16
|
@user = options.fetch(:ssh_user)
|
17
17
|
@key_file = options.fetch(:key_file)
|
18
|
+
@buildkite = options.fetch(:buildkite)
|
19
|
+
@user_data_file = options.fetch(:user_data_file)
|
20
|
+
@iam_instance_profile_arn = options.fetch(:user_data_file)
|
18
21
|
end
|
19
22
|
|
20
23
|
def run
|
21
|
-
|
24
|
+
if @buildkite
|
25
|
+
puts "--- Running tests for #{@role}"
|
26
|
+
else
|
27
|
+
puts "Running tests for #{@role}"
|
28
|
+
end
|
22
29
|
|
23
30
|
$LOAD_PATH.unshift(@spec) unless $LOAD_PATH.include?(@spec)
|
24
31
|
require File.join(@spec, 'spec_helper')
|
@@ -38,6 +45,7 @@ module AmiSpec
|
|
38
45
|
|
39
46
|
Specinfra::Backend::Ssh.clear
|
40
47
|
|
48
|
+
puts "^^^ +++" if @buildkite && !result.zero?
|
41
49
|
result.zero?
|
42
50
|
end
|
43
51
|
end
|
data/lib/ami_spec/version.rb
CHANGED
data/spec/aws_instance_spec.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'base64'
|
3
|
+
require 'tempfile'
|
2
4
|
|
3
5
|
describe AmiSpec::AwsInstance do
|
4
6
|
let(:role) { 'web_server' }
|
@@ -8,6 +10,9 @@ describe AmiSpec::AwsInstance do
|
|
8
10
|
let(:new_ec2_double) { instance_double(Aws::EC2::Types::Instance) }
|
9
11
|
let(:ec2_double) { instance_double(Aws::EC2::Instance) }
|
10
12
|
let(:tags) { {} }
|
13
|
+
let(:iam_instance_profile_arn) { nil }
|
14
|
+
let(:user_data_file) { nil }
|
15
|
+
|
11
16
|
subject(:aws_instance) do
|
12
17
|
described_class.new(
|
13
18
|
role: role,
|
@@ -18,7 +23,9 @@ describe AmiSpec::AwsInstance do
|
|
18
23
|
aws_public_ip: false,
|
19
24
|
aws_security_groups: sec_group_id,
|
20
25
|
aws_region: region,
|
21
|
-
tags: tags
|
26
|
+
tags: tags,
|
27
|
+
user_data_file: user_data_file,
|
28
|
+
iam_instance_profile_arn: iam_instance_profile_arn
|
22
29
|
)
|
23
30
|
end
|
24
31
|
|
@@ -91,6 +98,33 @@ describe AmiSpec::AwsInstance do
|
|
91
98
|
end
|
92
99
|
end
|
93
100
|
|
101
|
+
context 'with user_data' do
|
102
|
+
let(:user_data_file) {
|
103
|
+
file = Tempfile.new('user_data.txt')
|
104
|
+
file.write("my file\ncontent")
|
105
|
+
file.close
|
106
|
+
file.path
|
107
|
+
}
|
108
|
+
|
109
|
+
it 'does include user_data' do
|
110
|
+
expect(client_double).to receive(:run_instances).with(
|
111
|
+
hash_including(:user_data => Base64.encode64("my file\ncontent"))
|
112
|
+
)
|
113
|
+
start
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'with iam_instance_profile_arn' do
|
118
|
+
let(:iam_instance_profile_arn) { "my_arn" }
|
119
|
+
|
120
|
+
it 'does include iam_instance_profile_arn' do
|
121
|
+
expect(client_double).to receive(:run_instances).with(
|
122
|
+
hash_including(:iam_instance_profile => { arn: 'my_arn'})
|
123
|
+
)
|
124
|
+
start
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
94
128
|
it 'tags the instance with a role' do
|
95
129
|
expect(ec2_double).to receive(:create_tags).with(
|
96
130
|
hash_including(tags: [{ key: 'AmiSpec', value: role}])
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ami_spec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Patrick Robinson
|
@@ -10,118 +9,104 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date:
|
12
|
+
date: 2018-06-06 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: aws-sdk
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
|
-
- - ~>
|
18
|
+
- - "~>"
|
21
19
|
- !ruby/object:Gem::Version
|
22
20
|
version: '2'
|
23
21
|
type: :runtime
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
|
-
- - ~>
|
25
|
+
- - "~>"
|
29
26
|
- !ruby/object:Gem::Version
|
30
27
|
version: '2'
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
29
|
name: rake
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
31
|
requirements:
|
36
|
-
- -
|
32
|
+
- - ">="
|
37
33
|
- !ruby/object:Gem::Version
|
38
34
|
version: '0'
|
39
35
|
type: :runtime
|
40
36
|
prerelease: false
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
|
-
- -
|
39
|
+
- - ">="
|
45
40
|
- !ruby/object:Gem::Version
|
46
41
|
version: '0'
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
43
|
name: serverspec
|
49
44
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
45
|
requirements:
|
52
|
-
- -
|
46
|
+
- - ">="
|
53
47
|
- !ruby/object:Gem::Version
|
54
48
|
version: '0'
|
55
49
|
type: :runtime
|
56
50
|
prerelease: false
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
52
|
requirements:
|
60
|
-
- -
|
53
|
+
- - ">="
|
61
54
|
- !ruby/object:Gem::Version
|
62
55
|
version: '0'
|
63
56
|
- !ruby/object:Gem::Dependency
|
64
57
|
name: specinfra
|
65
58
|
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
59
|
requirements:
|
68
|
-
- -
|
60
|
+
- - ">="
|
69
61
|
- !ruby/object:Gem::Version
|
70
62
|
version: '2.45'
|
71
63
|
type: :runtime
|
72
64
|
prerelease: false
|
73
65
|
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
66
|
requirements:
|
76
|
-
- -
|
67
|
+
- - ">="
|
77
68
|
- !ruby/object:Gem::Version
|
78
69
|
version: '2.45'
|
79
70
|
- !ruby/object:Gem::Dependency
|
80
71
|
name: trollop
|
81
72
|
requirement: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
73
|
requirements:
|
84
|
-
- -
|
74
|
+
- - ">="
|
85
75
|
- !ruby/object:Gem::Version
|
86
76
|
version: '0'
|
87
77
|
type: :runtime
|
88
78
|
prerelease: false
|
89
79
|
version_requirements: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
80
|
requirements:
|
92
|
-
- -
|
81
|
+
- - ">="
|
93
82
|
- !ruby/object:Gem::Version
|
94
83
|
version: '0'
|
95
84
|
- !ruby/object:Gem::Dependency
|
96
85
|
name: hashie
|
97
86
|
requirement: !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
87
|
requirements:
|
100
|
-
- -
|
88
|
+
- - ">="
|
101
89
|
- !ruby/object:Gem::Version
|
102
90
|
version: '0'
|
103
91
|
type: :runtime
|
104
92
|
prerelease: false
|
105
93
|
version_requirements: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
94
|
requirements:
|
108
|
-
- -
|
95
|
+
- - ">="
|
109
96
|
- !ruby/object:Gem::Version
|
110
97
|
version: '0'
|
111
98
|
- !ruby/object:Gem::Dependency
|
112
99
|
name: net-ssh
|
113
100
|
requirement: !ruby/object:Gem::Requirement
|
114
|
-
none: false
|
115
101
|
requirements:
|
116
|
-
- - <
|
102
|
+
- - "<"
|
117
103
|
- !ruby/object:Gem::Version
|
118
104
|
version: '3.0'
|
119
105
|
type: :runtime
|
120
106
|
prerelease: false
|
121
107
|
version_requirements: !ruby/object:Gem::Requirement
|
122
|
-
none: false
|
123
108
|
requirements:
|
124
|
-
- - <
|
109
|
+
- - "<"
|
125
110
|
- !ruby/object:Gem::Version
|
126
111
|
version: '3.0'
|
127
112
|
description: Acceptance testing your AMIs
|
@@ -131,9 +116,9 @@ executables:
|
|
131
116
|
extensions: []
|
132
117
|
extra_rdoc_files: []
|
133
118
|
files:
|
134
|
-
- .gitignore
|
135
|
-
- .ruby-version
|
136
|
-
- .travis.yml
|
119
|
+
- ".gitignore"
|
120
|
+
- ".ruby-version"
|
121
|
+
- ".travis.yml"
|
137
122
|
- Gemfile
|
138
123
|
- LICENSE.txt
|
139
124
|
- README.md
|
@@ -154,31 +139,29 @@ files:
|
|
154
139
|
- spec/wait_for_ssh_spec.rb
|
155
140
|
homepage: https://github.com/envato/ami-spec
|
156
141
|
licenses: []
|
142
|
+
metadata: {}
|
157
143
|
post_install_message:
|
158
144
|
rdoc_options: []
|
159
145
|
require_paths:
|
160
146
|
- lib
|
161
147
|
required_ruby_version: !ruby/object:Gem::Requirement
|
162
|
-
none: false
|
163
148
|
requirements:
|
164
|
-
- -
|
149
|
+
- - ">="
|
165
150
|
- !ruby/object:Gem::Version
|
166
151
|
version: '0'
|
167
152
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
|
-
none: false
|
169
153
|
requirements:
|
170
|
-
- -
|
154
|
+
- - ">="
|
171
155
|
- !ruby/object:Gem::Version
|
172
156
|
version: '0'
|
173
157
|
requirements: []
|
174
158
|
rubyforge_project:
|
175
|
-
rubygems_version:
|
159
|
+
rubygems_version: 2.7.6
|
176
160
|
signing_key:
|
177
|
-
specification_version:
|
161
|
+
specification_version: 4
|
178
162
|
summary: Acceptance testing your AMIs
|
179
163
|
test_files:
|
180
164
|
- spec/ami_spec_spec.rb
|
181
165
|
- spec/aws_instance_spec.rb
|
182
166
|
- spec/spec_helper.rb
|
183
167
|
- spec/wait_for_ssh_spec.rb
|
184
|
-
has_rdoc:
|