automan 2.3.5 → 2.3.6
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 +4 -4
- data/Rakefile +0 -5
- data/automan.gemspec +3 -3
- data/lib/automan.rb +0 -1
- data/lib/automan/base.rb +3 -7
- data/lib/automan/beanstalk/deployer.rb +1 -1
- data/lib/automan/beanstalk/package.rb +1 -1
- data/lib/automan/beanstalk/router.rb +1 -1
- data/lib/automan/cli/snapper.rb +23 -3
- data/lib/automan/cli/stacker.rb +0 -19
- data/lib/automan/cloudformation/launcher.rb +3 -6
- data/lib/automan/cloudformation/replacer.rb +1 -1
- data/lib/automan/cloudformation/terminator.rb +1 -1
- data/lib/automan/ec2/image.rb +3 -3
- data/lib/automan/mixins/aws_caller.rb +7 -21
- data/lib/automan/rds/snapshot.rb +25 -35
- data/lib/automan/s3/downloader.rb +1 -10
- data/lib/automan/version.rb +1 -1
- data/spec/beanstalk/application_spec.rb +17 -17
- data/spec/beanstalk/configuration_spec.rb +24 -24
- data/spec/beanstalk/deployer_spec.rb +65 -65
- data/spec/beanstalk/router_spec.rb +19 -18
- data/spec/beanstalk/terminator_spec.rb +16 -16
- data/spec/beanstalk/uploader_spec.rb +13 -13
- data/spec/beanstalk/version_spec.rb +10 -8
- data/spec/cloudformation/launcher_spec.rb +65 -63
- data/spec/cloudformation/replacer_spec.rb +10 -10
- data/spec/cloudformation/terminator_spec.rb +23 -23
- data/spec/cloudformation/uploader_spec.rb +13 -13
- data/spec/ec2/image_spec.rb +55 -55
- data/spec/ec2/instance_spec.rb +17 -17
- data/spec/mixins/aws_caller_spec.rb +9 -9
- data/spec/mixins/utils_spec.rb +28 -27
- data/spec/rds/snapshot_spec.rb +46 -44
- metadata +9 -22
- data/.ruby-gemset +0 -1
- data/.ruby-version +0 -1
- data/.travis.yml +0 -5
- data/lib/automan/elasticache/router.rb +0 -79
- data/spec/elasticache/router_spec.rb +0 -29
- data/templates/stacker/.env.example +0 -14
- data/templates/stacker/.gitignore +0 -2
- data/templates/stacker/.ruby-gemset.tt +0 -1
- data/templates/stacker/.ruby-version +0 -1
- data/templates/stacker/Gemfile +0 -4
- data/templates/stacker/bin/%app_name%.tt +0 -62
- data/templates/stacker/bin/launch_%app_name%.sh.tt +0 -12
data/spec/rds/snapshot_spec.rb
CHANGED
@@ -4,35 +4,35 @@ require 'logger'
|
|
4
4
|
ENV['MAX_SNAPSHOTS'] = "50"
|
5
5
|
|
6
6
|
describe Automan::RDS::Snapshot do
|
7
|
-
it {
|
8
|
-
it {
|
9
|
-
it {
|
10
|
-
it {
|
11
|
-
it {
|
12
|
-
it {
|
7
|
+
it { should respond_to :rds }
|
8
|
+
it { should respond_to :create }
|
9
|
+
it { should respond_to :delete }
|
10
|
+
it { should respond_to :prune }
|
11
|
+
it { should respond_to :latest }
|
12
|
+
it { should respond_to :default_snapshot_name }
|
13
13
|
|
14
14
|
describe '#default_snapshot_name' do
|
15
|
-
subject() do
|
15
|
+
subject(:s) do
|
16
16
|
AWS.stub!
|
17
17
|
s = Automan::RDS::Snapshot.new
|
18
18
|
s.logger = Logger.new('/dev/null')
|
19
|
-
|
19
|
+
s.stub(:db_environment).and_return('dev1')
|
20
20
|
s
|
21
21
|
end
|
22
22
|
|
23
23
|
it "never returns nil" do
|
24
|
-
|
24
|
+
s.default_snapshot_name('somedb').should_not be_nil
|
25
25
|
end
|
26
26
|
|
27
|
-
it "returns environment dash
|
28
|
-
name =
|
29
|
-
|
27
|
+
it "returns environment dash iso8601 string" do
|
28
|
+
name = s.default_snapshot_name('somedb')
|
29
|
+
name.should match /^dev1-(\d{4})-(\d{2})-(\d{2})T(\d{2})-(\d{2})-(\d{2})[+-](\d{2})-(\d{2})/
|
30
30
|
end
|
31
31
|
|
32
32
|
end
|
33
33
|
|
34
34
|
describe '#create' do
|
35
|
-
subject() do
|
35
|
+
subject(:s) do
|
36
36
|
AWS.stub!
|
37
37
|
s = Automan::RDS::Snapshot.new
|
38
38
|
s.logger = Logger.new('/dev/null')
|
@@ -40,56 +40,56 @@ describe Automan::RDS::Snapshot do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
it "raises error if could not find database" do
|
43
|
-
|
43
|
+
s.stub(:find_db).and_return(nil)
|
44
44
|
expect {
|
45
|
-
|
45
|
+
s.create
|
46
46
|
}.to raise_error Automan::RDS::DatabaseDoesNotExistError
|
47
47
|
end
|
48
48
|
|
49
49
|
it "raises error if RDS says database does not exist" do
|
50
50
|
db = double(:db)
|
51
|
-
|
52
|
-
|
51
|
+
db.stub(:exists?).and_return(false)
|
52
|
+
s.stub(:find_db).and_return(db)
|
53
53
|
|
54
54
|
expect {
|
55
|
-
|
55
|
+
s.create
|
56
56
|
}.to raise_error Automan::RDS::DatabaseDoesNotExistError
|
57
57
|
end
|
58
58
|
|
59
59
|
end
|
60
60
|
|
61
61
|
describe '#tagged_can_prune?' do
|
62
|
-
subject() do
|
62
|
+
subject(:s) do
|
63
63
|
AWS.stub!
|
64
64
|
s = Automan::RDS::Snapshot.new
|
65
65
|
s.logger = Logger.new('/dev/null')
|
66
|
-
|
66
|
+
s.stub(:snapshot_arn)
|
67
67
|
s
|
68
68
|
end
|
69
69
|
|
70
70
|
it 'returns true if snapshot is tagged with CanPrune=yes' do
|
71
|
-
|
72
|
-
|
71
|
+
s.stub(:tags).and_return( {'CanPrune' => 'yes'} )
|
72
|
+
s.tagged_can_prune?( double() ).should be_true
|
73
73
|
end
|
74
74
|
|
75
75
|
it 'returns false if snapshot is missing CanPrune tag' do
|
76
|
-
|
77
|
-
|
76
|
+
s.stub(:tags).and_return( {} )
|
77
|
+
s.tagged_can_prune?( double() ).should be_false
|
78
78
|
end
|
79
79
|
|
80
80
|
it 'returns false if snapshot is tagged with CanPrune=nil' do
|
81
|
-
|
82
|
-
|
81
|
+
s.stub(:tags).and_return( {'CanPrune' => nil} )
|
82
|
+
s.tagged_can_prune?( double() ).should be_false
|
83
83
|
end
|
84
84
|
|
85
85
|
it 'returns false if snapshot is tagged with CanPrune=foo' do
|
86
|
-
|
87
|
-
|
86
|
+
s.stub(:tags).and_return( {'CanPrune' => 'foo'} )
|
87
|
+
s.tagged_can_prune?( double() ).should be_false
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
91
|
describe '#available?' do
|
92
|
-
subject() do
|
92
|
+
subject(:s) do
|
93
93
|
AWS.stub!
|
94
94
|
s = Automan::RDS::Snapshot.new
|
95
95
|
s.logger = Logger.new('/dev/null')
|
@@ -97,19 +97,21 @@ describe Automan::RDS::Snapshot do
|
|
97
97
|
end
|
98
98
|
|
99
99
|
it 'returns true if status is "available"' do
|
100
|
-
snap = double(
|
101
|
-
|
100
|
+
snap = double(:snap)
|
101
|
+
snap.stub(:status).and_return('available')
|
102
|
+
s.available?(snap).should be_true
|
102
103
|
end
|
103
104
|
|
104
105
|
it 'returns false if status is foo' do
|
105
|
-
snap = double(
|
106
|
-
|
106
|
+
snap = double(:snap)
|
107
|
+
snap.stub(:status).and_return('foo')
|
108
|
+
s.available?(snap).should be_false
|
107
109
|
end
|
108
110
|
end
|
109
111
|
|
110
112
|
describe '#manual?' do
|
111
113
|
let(:snap) { double }
|
112
|
-
subject() do
|
114
|
+
subject(:s) do
|
113
115
|
AWS.stub!
|
114
116
|
s = Automan::RDS::Snapshot.new
|
115
117
|
s.logger = Logger.new('/dev/null')
|
@@ -117,34 +119,34 @@ describe Automan::RDS::Snapshot do
|
|
117
119
|
end
|
118
120
|
|
119
121
|
it 'returns true if type is "manual"' do
|
120
|
-
|
121
|
-
|
122
|
+
snap.stub(:snapshot_type).and_return('manual')
|
123
|
+
s.manual?(snap).should be_true
|
122
124
|
end
|
123
125
|
|
124
126
|
it 'returns false if type is foo' do
|
125
|
-
|
126
|
-
|
127
|
+
snap.stub(:snapshot_type).and_return('foo')
|
128
|
+
s.manual?(snap).should be_false
|
127
129
|
end
|
128
130
|
end
|
129
131
|
|
130
132
|
describe '#prunable_snapshots' do
|
131
133
|
let(:snap) { double }
|
132
|
-
subject() do
|
134
|
+
subject(:s) do
|
133
135
|
AWS.stub!
|
134
136
|
s = Automan::RDS::Snapshot.new
|
135
137
|
s.logger = Logger.new('/dev/null')
|
136
|
-
|
138
|
+
s.stub(:get_all_snapshots).and_return( [ snap ] )
|
137
139
|
s
|
138
140
|
end
|
139
141
|
|
140
142
|
it 'includes snapshots which can be pruned' do
|
141
|
-
|
142
|
-
|
143
|
+
s.stub(:can_prune?).and_return(true)
|
144
|
+
s.prunable_snapshots.should include(snap)
|
143
145
|
end
|
144
146
|
|
145
147
|
it 'excludes snapshots which should not be pruned' do
|
146
|
-
|
147
|
-
|
148
|
+
s.stub(:can_prune?).and_return(false)
|
149
|
+
s.prunable_snapshots.should_not include(snap)
|
148
150
|
end
|
149
151
|
end
|
150
152
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: automan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.3.
|
4
|
+
version: 2.3.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Chalfant
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-10-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -45,42 +45,42 @@ dependencies:
|
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
48
|
+
version: 2.12.2
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
55
|
+
version: 2.12.2
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: rspec-mocks
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
62
|
+
version: 2.12.2
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
69
|
+
version: 2.12.2
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rspec-expectations
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
76
|
+
version: 2.12.1
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version:
|
83
|
+
version: 2.12.1
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: aws-sdk
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -166,9 +166,6 @@ extensions: []
|
|
166
166
|
extra_rdoc_files: []
|
167
167
|
files:
|
168
168
|
- ".gitignore"
|
169
|
-
- ".ruby-gemset"
|
170
|
-
- ".ruby-version"
|
171
|
-
- ".travis.yml"
|
172
169
|
- Gemfile
|
173
170
|
- LICENSE.txt
|
174
171
|
- README.md
|
@@ -207,7 +204,6 @@ files:
|
|
207
204
|
- lib/automan/ec2/errors.rb
|
208
205
|
- lib/automan/ec2/image.rb
|
209
206
|
- lib/automan/ec2/instance.rb
|
210
|
-
- lib/automan/elasticache/router.rb
|
211
207
|
- lib/automan/mixins/aws_caller.rb
|
212
208
|
- lib/automan/mixins/utils.rb
|
213
209
|
- lib/automan/rds/errors.rb
|
@@ -232,17 +228,9 @@ files:
|
|
232
228
|
- spec/cloudformation/uploader_spec.rb
|
233
229
|
- spec/ec2/image_spec.rb
|
234
230
|
- spec/ec2/instance_spec.rb
|
235
|
-
- spec/elasticache/router_spec.rb
|
236
231
|
- spec/mixins/aws_caller_spec.rb
|
237
232
|
- spec/mixins/utils_spec.rb
|
238
233
|
- spec/rds/snapshot_spec.rb
|
239
|
-
- templates/stacker/.env.example
|
240
|
-
- templates/stacker/.gitignore
|
241
|
-
- templates/stacker/.ruby-gemset.tt
|
242
|
-
- templates/stacker/.ruby-version
|
243
|
-
- templates/stacker/Gemfile
|
244
|
-
- templates/stacker/bin/%app_name%.tt
|
245
|
-
- templates/stacker/bin/launch_%app_name%.sh.tt
|
246
234
|
homepage: ''
|
247
235
|
licenses: []
|
248
236
|
metadata: {}
|
@@ -262,7 +250,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
262
250
|
version: '0'
|
263
251
|
requirements: []
|
264
252
|
rubyforge_project:
|
265
|
-
rubygems_version: 2.
|
253
|
+
rubygems_version: 2.4.8
|
266
254
|
signing_key:
|
267
255
|
specification_version: 4
|
268
256
|
summary: Automates common AWS ops
|
@@ -283,7 +271,6 @@ test_files:
|
|
283
271
|
- spec/cloudformation/uploader_spec.rb
|
284
272
|
- spec/ec2/image_spec.rb
|
285
273
|
- spec/ec2/instance_spec.rb
|
286
|
-
- spec/elasticache/router_spec.rb
|
287
274
|
- spec/mixins/aws_caller_spec.rb
|
288
275
|
- spec/mixins/utils_spec.rb
|
289
276
|
- spec/rds/snapshot_spec.rb
|
data/.ruby-gemset
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
automan
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
ruby-2.1.2
|
data/.travis.yml
DELETED
@@ -1,79 +0,0 @@
|
|
1
|
-
require 'automan'
|
2
|
-
|
3
|
-
module Automan::ElastiCache
|
4
|
-
class Router < Automan::Base
|
5
|
-
|
6
|
-
add_option :environment,
|
7
|
-
:hosted_zone_name,
|
8
|
-
:redis_host
|
9
|
-
|
10
|
-
def node_name_from_elasticache_environment(env)
|
11
|
-
|
12
|
-
opts = {
|
13
|
-
cache_cluster_id: "redis-#{env}",
|
14
|
-
show_cache_node_info: true
|
15
|
-
}
|
16
|
-
|
17
|
-
response = ec.client.describe_cache_clusters opts
|
18
|
-
|
19
|
-
unless response.successful?
|
20
|
-
raise RequestFailedError, "describe_cache_clusters failed: #{response.error}"
|
21
|
-
end
|
22
|
-
|
23
|
-
cluster=response.data[:cache_clusters]
|
24
|
-
if cluster.empty?
|
25
|
-
return nil
|
26
|
-
end
|
27
|
-
|
28
|
-
nodes=Hash[*cluster][:cache_nodes]
|
29
|
-
if nodes.empty?
|
30
|
-
return nil
|
31
|
-
end
|
32
|
-
|
33
|
-
endpoint=Hash[*nodes][:endpoint]
|
34
|
-
if endpoint.empty?
|
35
|
-
return nil
|
36
|
-
end
|
37
|
-
|
38
|
-
logger.info "found redis endpoint at #{endpoint[:address]}"
|
39
|
-
endpoint[:address]
|
40
|
-
end
|
41
|
-
|
42
|
-
# be sure alias_name ends in period
|
43
|
-
def update_dns_alias(zone_name, redis_cname, primary_endpoint)
|
44
|
-
zone = r53.hosted_zones.select {|z| z.name == zone_name}.first
|
45
|
-
rrset = zone.rrsets[redis_cname + '.', 'CNAME']
|
46
|
-
|
47
|
-
if rrset.exists?
|
48
|
-
logger.info "removing old record at #{redis_cname}"
|
49
|
-
rrset.delete
|
50
|
-
end
|
51
|
-
|
52
|
-
logger.info "creating record #{redis_cname} -> #{primary_endpoint}"
|
53
|
-
zone.rrsets.create(
|
54
|
-
redis_cname + '.',
|
55
|
-
'CNAME',
|
56
|
-
:ttl => 300,
|
57
|
-
:resource_records => [{:value => primary_endpoint}]
|
58
|
-
)
|
59
|
-
end
|
60
|
-
|
61
|
-
def run
|
62
|
-
log_options
|
63
|
-
|
64
|
-
logger.info "getting redis primary node name..."
|
65
|
-
primary_endpoint = node_name_from_elasticache_environment environment
|
66
|
-
|
67
|
-
if primary_endpoint.nil?
|
68
|
-
false
|
69
|
-
else
|
70
|
-
update_dns_alias(
|
71
|
-
hosted_zone_name,
|
72
|
-
redis_host,
|
73
|
-
primary_endpoint
|
74
|
-
)
|
75
|
-
true
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'automan'
|
2
|
-
|
3
|
-
describe Automan::ElastiCache::Router do
|
4
|
-
it { is_expected.to respond_to :run }
|
5
|
-
it { is_expected.to respond_to :environment }
|
6
|
-
it { is_expected.to respond_to :hosted_zone_name }
|
7
|
-
it { is_expected.to respond_to :redis_host }
|
8
|
-
|
9
|
-
describe '#run' do
|
10
|
-
subject() do
|
11
|
-
AWS.stub!
|
12
|
-
r = Automan::ElastiCache::Router.new
|
13
|
-
r.ec = AWS::ElastiCache::Client.new
|
14
|
-
r.environment = 'foo'
|
15
|
-
r.hosted_zone_name = 'foo.com'
|
16
|
-
r.redis_host = 'redis.foo.com'
|
17
|
-
r.logger = Logger.new('/dev/null')
|
18
|
-
r
|
19
|
-
end
|
20
|
-
|
21
|
-
it "raises error if it never finds a name" do
|
22
|
-
allow(subject).to receive(:node_name_from_elasticache_environment).and_return(nil)
|
23
|
-
expect {
|
24
|
-
subject.run
|
25
|
-
}.not_to raise_error
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# example .env file
|
3
|
-
# cp .env.example .env
|
4
|
-
#
|
5
|
-
# Set environment variables for all template parameters here.
|
6
|
-
# This .env file is in gitignore to help keep application
|
7
|
-
# secrets from leaking out into source code control.
|
8
|
-
#
|
9
|
-
export VPC_ID=vpc-foo
|
10
|
-
export SUBNET_ID=subnet-foo
|
11
|
-
export REMOTE_ACCESS_SG=sg-foo
|
12
|
-
export KEYPAIR_NAME=fookey
|
13
|
-
export INSTANCE_TYPE=m3.medium
|
14
|
-
export IMAGE_ID=ami-foo
|