hiera-aws 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 0d55a811a53f3d447fae3edd306dbb20f86bf56f
4
- data.tar.gz: 008182bf2ef111104ba2e0ed7c85259ffc64eb06
5
- SHA512:
6
- metadata.gz: fc6a9d1bc8816625f318f1a0a7bbc93eb507eee163ae86c3440eb06534b988a3eab3a7bee97b1dc02357b93e1132116e79d0a5fe0f401b535298f34a2191c67d
7
- data.tar.gz: c634ff97a488ba0bfbbfa560b57177550dadff6a94d82e3abefa5f416d5aa8e1a99461136d8b62e386ce11363e3697d82ce7244147133f4a4dc5f081680099da
1
+ ---
2
+ SHA1:
3
+ metadata.gz: df09cbafee105c292fccfa418ce737723bcbdfe2
4
+ data.tar.gz: c605c9aff9a2743e3f6a81bad3828ba4f98b370a
5
+ SHA512:
6
+ metadata.gz: 2f44cb460fc933f9caf7ae5f8e0e5f9370eeba2dd40b1d04e77dad2468707180df49712ee6a66e0046fc79b7d7fbfe7eeaeb4cbcbc65f7802604492fb17adf55
7
+ data.tar.gz: d2aab23ef2d552d48b0f9b58dcdbf5e2ce88dbb86df42d9ddb78c0fcd8c6cd28585c2a16082a94f1ec97ae35c23b8aa2beccfc9c64d8f62760d9a38827f3727a
data/.rubocop.yml CHANGED
@@ -3,6 +3,8 @@ AllCops:
3
3
  - Gemfile
4
4
  - Rakefile
5
5
 
6
+ DotPosition:
7
+ Enabled: false
6
8
  Encoding:
7
9
  Enabled: false
8
10
  HashSyntax:
data/.travis.yml CHANGED
@@ -1,6 +1,8 @@
1
1
  language: ruby
2
2
 
3
- rvm: 1.9.3
3
+ rvm:
4
+ - 1.8.7
5
+ - 1.9.3
4
6
 
5
7
  install: bundle install
6
8
 
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## v0.5.0 (May 15 2014)
2
+
3
+ * Change `redis_cluster_nodes_for_cfn_stack`, `memcached_cluster_nodes_for_cfn_stack`,
4
+ and `redis_cluster_replica_groups_for_cfn_stack` to only return resources that
5
+ are in state "available".
6
+ * Change `redis_cluster_replica_groups_for_cfn_stack` response to include
7
+ `latest_cache_cluster_create_time`, which is the creation time unix timestamp
8
+ of the most current cache cluster in each replication group.
9
+
1
10
  ## v0.4.1 (May 12 2014)
2
11
 
3
12
  * Disable real HTTP connections in RSpec tests by using
data/README.md CHANGED
@@ -67,7 +67,8 @@ The backend currently supports the following keys that you can pass to the
67
67
  ### redis_cluster_nodes_for_cfn_stack
68
68
 
69
69
  Returns an array of all Redis cluster nodes for the CloudFormation stack of an
70
- EC2 instance. The instance is identified by the Puppet fact `$ec2_instance_id`.
70
+ EC2 instance. Only cluster nodes that are in state "available" are returned. The
71
+ instance is identified by the Puppet fact `$ec2_instance_id`.
71
72
 
72
73
  Usage:
73
74
 
@@ -86,8 +87,9 @@ For each Redis cluster node in the array the following hash is returned:
86
87
  ### redis_cluster_replica_groups_for_cfn_stack
87
88
 
88
89
  Returns an array of the Redis Replication Groups of all Redis cluster nodes for
89
- the CloudFormation stack of an EC2 Instance. The instance is identified by the
90
- Puppet fact `$ec2_instance_id`.
90
+ the CloudFormation stack of an EC2 Instance. Only Replication Groups that are in
91
+ state "available" are returned. The instance is identified by the Puppet fact
92
+ `$ec2_instance_id`.
91
93
 
92
94
  Usage:
93
95
 
@@ -100,15 +102,17 @@ For each replica group in the array the following hash is returned:
100
102
  ```json
101
103
  {
102
104
  "replication_group_id" => "some-group-id",
103
- "primary_endpoint" => { "address" => "some.replication.group.primary.endpoint", "port" => 1234 }
105
+ "primary_endpoint" => { "address" => "some.replication.group.primary.endpoint", "port" => 1234 },
106
+ "latest_cache_cluster_create_time" => 1400155680
104
107
  }
105
108
  ```
106
109
 
107
110
  ### memcached_cluster_nodes_for_cfn_stack
108
111
 
109
112
  Returns an array of all Memcached cluster nodes for the CloudFormation stack of
110
- an EC2 instance. The instance is identified by the Puppet fact
111
- `$ec2_instance_id`. The returned array has the format `["host1", "host2"]`.
113
+ an EC2 instance. Only cluster nodes that are in state "available" are returned.
114
+ The instance is identified by the Puppet fact `$ec2_instance_id`. The returned
115
+ array has the format `["host1", "host2"]`.
112
116
 
113
117
  Usage:
114
118
 
@@ -118,8 +122,8 @@ cluster_nodes = hiera("memcached_cluster_nodes_for_cfn_stack")
118
122
 
119
123
  ### rds_instances tag=value...
120
124
 
121
- Returns an array of all RDS database instances that have one or more tags
122
- assigned.
125
+ Returns an array of all RDS database instances that are in state "available" and
126
+ have one or more tags assigned.
123
127
 
124
128
  For each instance in the array the following hash is returned:
125
129
 
data/Rakefile CHANGED
@@ -1,13 +1,19 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
- require "rubocop/rake_task"
4
3
 
5
- desc "Run RuboCop style and lint checks"
6
- Rubocop::RakeTask.new(:rubocop)
4
+ # RuboCop only works with newer Ruby versions
5
+ if RUBY_VERSION >= "1.9.2"
6
+ require "rubocop/rake_task"
7
+
8
+ desc "Run RuboCop style and lint checks"
9
+ Rubocop::RakeTask.new(:rubocop)
10
+
11
+ task :test => :rubocop
12
+ end
7
13
 
8
14
  RSpec::Core::RakeTask.new(:spec) do |t|
9
15
  t.rspec_opts = "--color --format documentation"
10
16
  end
11
17
 
12
- task :test => [:rubocop, :spec]
18
+ task :test => :spec
13
19
  task :default => :test
data/hiera-aws.gemspec CHANGED
@@ -23,6 +23,6 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "bundler"
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency "rspec"
26
- spec.add_development_dependency "rubocop", "~> 0.21.0"
26
+ spec.add_development_dependency "rubocop", "~> 0.21.0" if RUBY_VERSION >= "1.9.2"
27
27
  spec.add_development_dependency "webmock"
28
28
  end
@@ -46,6 +46,8 @@ class Hiera
46
46
  end.map do |r|
47
47
  cluster_id = r.physical_resource_id
48
48
  cache_cluster_info(cluster_id)
49
+ end.select do |cluster|
50
+ cluster.fetch(:cache_cluster_status) == "available"
49
51
  end.select do |cluster|
50
52
  # Filter by engine type if provided
51
53
  if cluster_engine
@@ -71,6 +73,7 @@ class Hiera
71
73
  raise MissingFactError, "ec2_instance_id not found" unless ec2_instance_id
72
74
 
73
75
  replica_groups = {}
76
+ cluster_create_times = {}
74
77
  stack_name = cfn_stack_name(ec2_instance_id)
75
78
 
76
79
  clusters = cache_clusters_in_cfn_stack(stack_name, cluster_engine)
@@ -78,10 +81,18 @@ class Hiera
78
81
  replication_group_id = cluster[:replication_group_id]
79
82
  next unless replication_group_id
80
83
 
84
+ cache_cluster_create_time = cluster.fetch(:cache_cluster_create_time)
85
+ if cluster_create_times[replication_group_id].nil? || cluster_create_times[replication_group_id] < cache_cluster_create_time
86
+ cluster_create_times[replication_group_id] = cache_cluster_create_time
87
+ end
88
+
81
89
  client = AWS::ElastiCache::Client.new
90
+
82
91
  replication_group = client.describe_replication_groups(:replication_group_id => replication_group_id)[:replication_groups].first
92
+ next unless replication_group.fetch(:status) == "available"
83
93
 
84
- primary_endpoint = replication_group.fetch(:node_groups).first.fetch(:primary_endpoint)
94
+ node_group = replication_group.fetch(:node_groups).first
95
+ primary_endpoint = node_group.fetch(:primary_endpoint)
85
96
 
86
97
  replica_groups[replication_group_id] = {
87
98
  :primary_endpoint => primary_endpoint
@@ -91,7 +102,8 @@ class Hiera
91
102
  replica_groups.map do |k, v|
92
103
  {
93
104
  "replication_group_id" => k,
94
- "primary_endpoint" => stringify_keys(v[:primary_endpoint])
105
+ "primary_endpoint" => stringify_keys(v[:primary_endpoint]),
106
+ "latest_cache_cluster_create_time" => cluster_create_times[k].strftime("%s"),
95
107
  }
96
108
  end
97
109
  end
@@ -33,7 +33,8 @@ class Hiera
33
33
  private
34
34
 
35
35
  def db_instances
36
- @db_instances ||= @client.describe_db_instances[:db_instances]
36
+ @client.describe_db_instances[:db_instances].
37
+ select { |i| i[:db_instance_status] == "available" }
37
38
  end
38
39
 
39
40
  def db_instances_with_tags(tags)
@@ -1,7 +1,7 @@
1
1
  class Hiera
2
2
  module Backend
3
3
  module Aws # rubocop:disable Documentation
4
- VERSION = "0.4.1"
4
+ VERSION = "0.5.0"
5
5
  end
6
6
  end
7
7
  end
@@ -1,9 +1,14 @@
1
1
  require "spec_helper"
2
2
  require "hiera/backend/aws/elasticache"
3
+ require "date"
3
4
 
4
5
  class Hiera
5
6
  module Backend # rubocop:disable Documentation
6
7
  describe Aws::ElastiCache do
8
+
9
+ let(:time_earlier) { Time.new }
10
+ let(:time_later) { time_earlier + 1 }
11
+
7
12
  let(:ec2_client) do
8
13
  double(
9
14
  :instances => {
@@ -13,46 +18,175 @@ class Hiera
13
18
  }
14
19
  )
15
20
  end
21
+
16
22
  let(:cfn_client) do
17
23
  double(
18
24
  :stacks => {
19
25
  "some-stack-name" => double(
20
26
  :resources => [
27
+ # these are listed in reverse/random order to proove that
28
+ # tests don't rely on ordering.
29
+ double(
30
+ :resource_type => "AWS::ElastiCache::CacheCluster",
31
+ :physical_resource_id => "another-redis-cluster-id"
32
+ ),
21
33
  double(
22
34
  :resource_type => "AWS::ElastiCache::CacheCluster",
23
- :physical_resource_id => "some-cluster-id"
24
- )
35
+ :physical_resource_id => "some-redis-cluster-id"
36
+ ),
37
+ double(
38
+ :resource_type => "AWS::ElastiCache::CacheCluster",
39
+ :physical_resource_id => "another-memcache-cluster-id"
40
+ ),
41
+ double(
42
+ :resource_type => "AWS::ElastiCache::CacheCluster",
43
+ :physical_resource_id => "some-memcache-cluster-id"
44
+ ),
25
45
  ]
26
46
  )
27
47
  }
28
48
  )
29
49
  end
50
+
30
51
  let(:elasticache) do
31
52
  scope = { "ec2_instance_id" => "some-ec2-instance-id" }
32
53
  Aws::ElastiCache.new scope
33
54
  end
34
55
 
35
- let(:some_cache_node) { { :endpoint => { :address => "1.1.1.1", :port => 1234 } } }
36
- let(:another_cache_node) { { :endpoint => { :address => "2.2.2.2", :port => 1234 } } }
56
+ let(:some_cache_node) { { :endpoint => { :address => "1.1.1.1", :port => 1111 } } }
57
+ let(:another_cache_node) { { :endpoint => { :address => "2.2.2.2", :port => 2222 } } }
58
+ let(:third_cache_node) { { :endpoint => { :address => "3.3.3.3", :port => 3333 } } }
59
+ let(:fourth_cache_node) { { :endpoint => { :address => "4.4.4.4", :port => 4444 } } }
37
60
 
38
- before do
61
+ let(:some_redis_cache_cluster) do
62
+ {
63
+ :cache_nodes => [some_cache_node, another_cache_node],
64
+ :engine => "redis",
65
+ :cache_cluster_status => "available",
66
+ :cache_cluster_create_time => time_earlier,
67
+ }
68
+ end
69
+
70
+ let(:another_redis_cache_cluster) do
71
+ {
72
+ :cache_nodes => [third_cache_node, fourth_cache_node],
73
+ :engine => "redis",
74
+ :cache_cluster_status => "available",
75
+ :cache_cluster_create_time => time_later,
76
+ }
77
+ end
78
+
79
+ let(:redis_cache_clusters) do
80
+ {
81
+ :cache_clusters => [some_redis_cache_cluster, another_redis_cache_cluster]
82
+ }
83
+ end
84
+
85
+ let(:some_memcache_cache_cluster) do
86
+ {
87
+ :cache_nodes => [some_cache_node, another_cache_node],
88
+ :engine => "memcached",
89
+ :cache_cluster_status => "available",
90
+ }
91
+ end
92
+
93
+ let(:another_memcache_cache_cluster) do
94
+ {
95
+ :cache_nodes => [third_cache_node, fourth_cache_node],
96
+ :engine => "memcached",
97
+ :cache_cluster_status => "available",
98
+ }
99
+ end
100
+
101
+ let(:memcache_cache_clusters) do
102
+ {
103
+ :cache_clusters => [some_memcache_cache_cluster, another_memcache_cache_cluster]
104
+ }
105
+ end
106
+
107
+ let(:all_cache_clusters) do
108
+ {
109
+ :cache_clusters => redis_cache_clusters[:cache_clusters] + memcache_cache_clusters[:cache_clusters],
110
+ }
111
+ end
112
+
113
+ let(:some_replication_group) do
114
+ {
115
+ :replication_group_id => "some-replication-group-id",
116
+ :node_groups => [{
117
+ :primary_endpoint => { :address => "some.replication.group.primary.endpoint", :port => 12_345 },
118
+ }],
119
+ :status => "available",
120
+ }
121
+ end
122
+
123
+ let(:another_replication_group) do
124
+ {
125
+ :replication_group_id => "another-replication-group-id",
126
+ :node_groups => [{
127
+ :primary_endpoint => { :address => "another.replication.group.primary.endpoint", :port => 23_456 },
128
+ }],
129
+ :status => "available",
130
+ }
131
+ end
132
+
133
+ let(:all_replication_groups) do
134
+ {
135
+ :replication_groups => [some_replication_group, another_replication_group]
136
+ }
137
+ end
138
+
139
+ before(:each) do
39
140
  AWS::EC2.stub(:new => ec2_client)
40
141
  AWS::CloudFormation.stub(:new => cfn_client)
142
+ @client = double
143
+
144
+ allow(@client).to receive(:describe_cache_clusters).and_return(all_cache_clusters)
145
+
146
+ allow(@client).to receive(:describe_cache_clusters).
147
+ with(
148
+ :cache_cluster_id => "some-redis-cluster-id",
149
+ :show_cache_node_info => true
150
+ ).
151
+ and_return(:cache_clusters => [some_redis_cache_cluster])
152
+
153
+ allow(@client).to receive(:describe_cache_clusters).
154
+ with(
155
+ :cache_cluster_id => "another-redis-cluster-id",
156
+ :show_cache_node_info => true
157
+ ).
158
+ and_return(:cache_clusters => [another_redis_cache_cluster])
159
+
160
+ allow(@client).to receive(:describe_cache_clusters).
161
+ with(
162
+ :cache_cluster_id => "some-memcache-cluster-id",
163
+ :show_cache_node_info => true
164
+ ).
165
+ and_return(:cache_clusters => [some_memcache_cache_cluster])
166
+
167
+ allow(@client).to receive(:describe_cache_clusters).
168
+ with(
169
+ :cache_cluster_id => "another-memcache-cluster-id",
170
+ :show_cache_node_info => true
171
+ ).
172
+ and_return(:cache_clusters => [another_memcache_cache_cluster])
173
+
174
+ allow(@client).to receive(:describe_replication_groups).
175
+ with(
176
+ :replication_group_id => "some-replication-group-id"
177
+ ).
178
+ and_return(:replication_groups => [some_replication_group])
179
+
180
+ allow(@client).to receive(:describe_replication_groups).
181
+ with(
182
+ :replication_group_id => "another-replication-group-id"
183
+ ).
184
+ and_return(:replication_groups => [another_replication_group])
185
+
186
+ allow(@client).to receive(:describe_replication_groups).with({}).and_return(all_replication_groups)
41
187
  end
42
188
 
43
189
  describe "#redis_cluster_nodes_for_cfn_stack" do
44
- let(:cache_clusters) do
45
- {
46
- :cache_clusters => [{
47
- :cache_nodes => [
48
- some_cache_node,
49
- another_cache_node
50
-
51
- ],
52
- :engine => "redis"
53
- }]
54
- }
55
- end
56
190
 
57
191
  it "raises an exception when ec2_instance_id fact is missing" do
58
192
  elasticache = Aws::ElastiCache.new
@@ -62,168 +196,81 @@ class Hiera
62
196
  end
63
197
 
64
198
  it "returns all Redis cluster nodes for CloudFormation stack of EC2 instance" do
65
- client = double
66
- allow(client).to receive(:describe_cache_clusters).and_return(cache_clusters)
67
- AWS::ElastiCache::Client.stub(:new => client)
68
-
69
- expect(elasticache.redis_cluster_nodes_for_cfn_stack).to eq [
70
- { "endpoint" => { "address" => "1.1.1.1", "port" => 1234 } },
71
- { "endpoint" => { "address" => "2.2.2.2", "port" => 1234 } },
199
+ AWS::ElastiCache::Client.stub(:new => @client)
200
+ elasticache.redis_cluster_nodes_for_cfn_stack.should =~ [
201
+ { "endpoint" => { "address" => "1.1.1.1", "port" => 1111 } },
202
+ { "endpoint" => { "address" => "2.2.2.2", "port" => 2222 } },
203
+ { "endpoint" => { "address" => "3.3.3.3", "port" => 3333 } },
204
+ { "endpoint" => { "address" => "4.4.4.4", "port" => 4444 } },
72
205
  ]
73
206
  end
74
207
  end
75
208
 
76
209
  describe "#redis_cluster_replica_groups_for_cfn_stack" do
77
- let(:cache_clusters) do
78
- {
79
- :cache_clusters => [{
80
- :cache_nodes => [
81
- some_cache_node,
82
-
83
- ],
84
- :replication_group_id => "some-group-id",
85
- :engine => "redis",
86
- }]
87
- }
88
- end
89
- let(:replication_groups) do
90
- {
91
- :replication_groups => [{
92
- :node_groups => [{
93
- :primary_endpoint => { :address => "some.replication.group.primary.endpoint", :port => 1234 }
94
- }]
95
- }]
96
- }
97
- end
98
210
 
99
- it "returns all Redis replica groups for CloudFormation stack of EC2 instance" do
100
- client = double
101
- allow(client).to receive(:describe_cache_clusters).and_return(cache_clusters)
102
- allow(client).to receive(:describe_replication_groups).with(:replication_group_id => "some-group-id").and_return(replication_groups)
103
- AWS::ElastiCache::Client.stub(:new => client)
104
-
105
- expect(elasticache.redis_cluster_replica_groups_for_cfn_stack).to eq [
106
- {
107
- "replication_group_id" => "some-group-id",
108
- "primary_endpoint" => { "address" => "some.replication.group.primary.endpoint", "port" => 1234 }
109
- },
110
- ]
211
+ let(:some_redis_cache_cluster) do
212
+ super().merge :replication_group_id => "some-replication-group-id"
111
213
  end
112
214
 
113
215
  context "multiple defined cache clusters are in the same replica group" do
114
- let(:cache_clusters) do
115
- {
116
- :cache_clusters => [
117
- {
118
- :cache_nodes => [
119
- some_cache_node,
120
- ],
121
- :replication_group_id => "some-group-id",
122
- :engine => "redis",
123
- },
124
- {
125
- :cache_nodes => [
126
- another_cache_node,
127
- ],
128
- :replication_group_id => "some-group-id",
129
- :engine => "redis",
130
- },
131
- ]
132
- }
133
- end
134
- let(:replication_groups) do
135
- {
136
- :replication_groups => [{
137
- :node_groups => [{
138
- :primary_endpoint => { :address => "some.replication.group.primary.endpoint", :port => 1234 }
139
- }]
140
- }]
141
- }
216
+
217
+ let(:another_redis_cache_cluster) do
218
+ super().merge :replication_group_id => "some-replication-group-id"
142
219
  end
143
220
 
144
221
  it "returns a deduplicated list of Redis replica groups" do
145
- client = double
146
- allow(client).to receive(:describe_cache_clusters).and_return(cache_clusters)
147
- allow(client).to receive(:describe_replication_groups).with(:replication_group_id => "some-group-id").and_return(replication_groups)
148
- AWS::ElastiCache::Client.stub(:new => client)
149
-
150
- expect(elasticache.redis_cluster_replica_groups_for_cfn_stack).to eq [
151
- {
152
- "replication_group_id" => "some-group-id",
153
- "primary_endpoint" => { "address" => "some.replication.group.primary.endpoint", "port" => 1234 }
154
- },
155
- ]
222
+ AWS::ElastiCache::Client.stub(:new => @client)
223
+ actual = elasticache.redis_cluster_replica_groups_for_cfn_stack
224
+ expect(actual.length).to be 1
225
+ expect(actual.first).to include(
226
+ "replication_group_id" => "some-replication-group-id",
227
+ "primary_endpoint" => { "address" => "some.replication.group.primary.endpoint", "port" => 12_345 }
228
+ )
156
229
  end
157
230
  end
158
231
 
159
- context "one defined cluster is found without replica group" do
160
- let(:cfn_client) do
161
- double(
162
- :stacks => {
163
- "some-stack-name" => double(
164
- :resources => [
165
- double(
166
- :resource_type => "AWS::ElastiCache::CacheCluster",
167
- :physical_resource_id => "some-cluster-id"
168
- ),
169
- double(
170
- :resource_type => "AWS::ElastiCache::CacheCluster",
171
- :physical_resource_id => "another-cluster-id"
172
- ),
173
- ]
174
- )
175
- }
176
- )
232
+ context "multiple defined cache clusters with different creation times are in the same replica group" do
233
+
234
+ let(:another_redis_cache_cluster) do
235
+ super().merge :replication_group_id => "some-replication-group-id"
177
236
  end
178
- let(:cache_clusters) do
179
- {
180
- "some-cluster-id" => {
181
- :cache_clusters => [
182
- {
183
- :cache_nodes => [
184
- some_cache_node,
185
- ],
186
- :replication_group_id => "some-group-id",
187
- :engine => "redis",
188
- },
189
- ]
190
- },
191
- "another-cluster-id" => {
192
- :cache_clusters => [
193
- {
194
- :cache_nodes => [
195
- another_cache_node,
196
- ],
197
- :engine => "redis",
198
- },
199
- ]
237
+
238
+ it "returns the most current cache cluster creation timestamp for the whole replication group in order to know which replica group is the most current" do
239
+ AWS::ElastiCache::Client.stub(:new => @client)
240
+
241
+ actual = elasticache.redis_cluster_replica_groups_for_cfn_stack
242
+
243
+ actual.should eq [
244
+ {
245
+ "replication_group_id" => "some-replication-group-id",
246
+ "primary_endpoint" => { "address" => "some.replication.group.primary.endpoint", "port" => 12_345 },
247
+ "latest_cache_cluster_create_time" => time_later.strftime("%s"),
200
248
  }
201
- }
202
- end
203
- let(:replication_groups) do
204
- {
205
- :replication_groups => [{
206
- :node_groups => [{
207
- :primary_endpoint => { :address => "some.replication.group.primary.endpoint", :port => 1234 }
208
- }]
209
- }]
210
- }
249
+ ]
211
250
  end
251
+ end
252
+
253
+ context "two replica groups with one cache cluster each, one cache cluster being newer than the other" do
212
254
 
213
- it "returns all Redis replica groups and does not fail" do
255
+ let(:another_redis_cache_cluster) do
256
+ super().merge :replication_group_id => "another-replication-group-id"
257
+ end
214
258
 
215
- client = double
216
- allow(client).to receive(:describe_cache_clusters) do |options|
217
- cache_clusters.fetch(options.fetch(:cache_cluster_id))
218
- end
259
+ it "returns the most current cache cluster creation time for each replication group" do
260
+ AWS::ElastiCache::Client.stub(:new => @client)
219
261
 
220
- allow(client).to receive(:describe_replication_groups).with(:replication_group_id => "some-group-id").and_return(replication_groups)
221
- AWS::ElastiCache::Client.stub(:new => client)
262
+ actual = elasticache.redis_cluster_replica_groups_for_cfn_stack
222
263
 
223
- expect(elasticache.redis_cluster_replica_groups_for_cfn_stack).to eq [
264
+ actual.should =~ [
265
+ {
266
+ "replication_group_id" => "some-replication-group-id",
267
+ "primary_endpoint" => { "address" => "some.replication.group.primary.endpoint", "port" => 12_345 },
268
+ "latest_cache_cluster_create_time" => time_earlier.strftime("%s"),
269
+ },
224
270
  {
225
- "replication_group_id" => "some-group-id",
226
- "primary_endpoint" => { "address" => "some.replication.group.primary.endpoint", "port" => 1234 }
271
+ "replication_group_id" => "another-replication-group-id",
272
+ "primary_endpoint" => { "address" => "another.replication.group.primary.endpoint", "port" => 23_456 },
273
+ "latest_cache_cluster_create_time" => time_later.strftime("%s"),
227
274
  },
228
275
  ]
229
276
  end
@@ -238,27 +285,9 @@ class Hiera
238
285
  end.to raise_error Aws::MissingFactError
239
286
  end
240
287
 
241
- context "single cache cluster" do
242
- let(:cache_clusters) do
243
- {
244
- :cache_clusters => [{
245
- :cache_nodes => [
246
- { :endpoint => { :address => "3.3.3.3", :port => 5678 } },
247
- { :endpoint => { :address => "4.4.4.4", :port => 5678 } }
248
-
249
- ],
250
- :engine => "memcached"
251
- }]
252
- }
253
- end
254
-
255
- it "returns all Memcached cluster nodes for CloudFormation stack of EC2 instance" do
256
- client = double
257
- allow(client).to receive(:describe_cache_clusters).and_return(cache_clusters)
258
- AWS::ElastiCache::Client.stub(:new => client)
259
-
260
- expect(elasticache.memcached_cluster_nodes_for_cfn_stack).to eq ["3.3.3.3", "4.4.4.4"]
261
- end
288
+ it "returns all Memcached cluster nodes for CloudFormation stack of EC2 instance" do
289
+ AWS::ElastiCache::Client.stub(:new => @client)
290
+ elasticache.memcached_cluster_nodes_for_cfn_stack.should =~ ["1.1.1.1", "2.2.2.2", "3.3.3.3", "4.4.4.4"]
262
291
  end
263
292
  end
264
293
  end
data/spec/aws_rds_spec.rb CHANGED
@@ -10,18 +10,27 @@ class Hiera
10
10
  :db_instances => [
11
11
  {
12
12
  :db_instance_identifier => "db1",
13
- :endpoint => { :address => "db1.some-region.rds.amazonaws.com" },
14
- :engine => "mysql"
13
+ :endpoint => { :address => "db1.some-region.rds.amazonaws.com" },
14
+ :engine => "mysql",
15
+ :db_instance_status => "available",
15
16
  },
16
17
  {
17
18
  :db_instance_identifier => "db2",
18
- :endpoint => { :address => "db2.some-region.rds.amazonaws.com" },
19
- :engine => "mysql"
19
+ :endpoint => { :address => "db2.some-region.rds.amazonaws.com" },
20
+ :engine => "mysql",
21
+ :db_instance_status => "available",
20
22
  },
21
23
  {
22
24
  :db_instance_identifier => "db3",
23
- :endpoint => { :address => "db3.some-region.rds.amazonaws.com" },
24
- :engine => "mysql"
25
+ :endpoint => { :address => "db3.some-region.rds.amazonaws.com" },
26
+ :engine => "mysql",
27
+ :db_instance_status => "available",
28
+ },
29
+ {
30
+ :db_instance_identifier => "db4",
31
+ :endpoint => nil,
32
+ :engine => "mysql",
33
+ :db_instance_status => "modifying",
25
34
  }
26
35
  ]
27
36
  }
@@ -44,6 +53,12 @@ class Hiera
44
53
  { :key => "environment", :value => "production" },
45
54
  { :key => "role", :value => "mgmt-db" }
46
55
  ]
56
+ },
57
+ "arn:aws:rds:some-region:12345678:db:db4" => {
58
+ :tag_list => [
59
+ { :key => "environment", :value => "production" },
60
+ { :key => "role", :value => "mgmt-db" }
61
+ ]
47
62
  }
48
63
  }
49
64
  end
metadata CHANGED
@@ -1,110 +1,73 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: hiera-aws
3
- version: !ruby/object:Gem::Version
4
- version: 0.4.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Mathias Lafeldt
8
8
  - Deniz Adrian
9
9
  - Soenke Ruempler
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-05-12 00:00:00.000000000 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
13
+
14
+ date: 2014-05-15 00:00:00 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ prerelease: false
16
18
  name: aws-sdk
17
- requirement: !ruby/object:Gem::Requirement
18
- requirements:
19
- - - '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
19
  type: :runtime
20
+ requirement: &id001 !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - &id002
23
+ - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: "0"
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
23
28
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- requirements:
26
- - - '>='
27
- - !ruby/object:Gem::Version
28
- version: '0'
29
- - !ruby/object:Gem::Dependency
30
29
  name: bundler
31
- requirement: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - '>='
34
- - !ruby/object:Gem::Version
35
- version: '0'
36
30
  type: :development
31
+ requirement: &id003 !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - *id002
34
+ version_requirements: *id003
35
+ - !ruby/object:Gem::Dependency
37
36
  prerelease: false
38
- version_requirements: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - '>='
41
- - !ruby/object:Gem::Version
42
- version: '0'
43
- - !ruby/object:Gem::Dependency
44
37
  name: rake
45
- requirement: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - '>='
48
- - !ruby/object:Gem::Version
49
- version: '0'
50
38
  type: :development
39
+ requirement: &id004 !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - *id002
42
+ version_requirements: *id004
43
+ - !ruby/object:Gem::Dependency
51
44
  prerelease: false
52
- version_requirements: !ruby/object:Gem::Requirement
53
- requirements:
54
- - - '>='
55
- - !ruby/object:Gem::Version
56
- version: '0'
57
- - !ruby/object:Gem::Dependency
58
45
  name: rspec
59
- requirement: !ruby/object:Gem::Requirement
60
- requirements:
61
- - - '>='
62
- - !ruby/object:Gem::Version
63
- version: '0'
64
- type: :development
65
- prerelease: false
66
- version_requirements: !ruby/object:Gem::Requirement
67
- requirements:
68
- - - '>='
69
- - !ruby/object:Gem::Version
70
- version: '0'
71
- - !ruby/object:Gem::Dependency
72
- name: rubocop
73
- requirement: !ruby/object:Gem::Requirement
74
- requirements:
75
- - - ~>
76
- - !ruby/object:Gem::Version
77
- version: 0.21.0
78
46
  type: :development
47
+ requirement: &id005 !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - *id002
50
+ version_requirements: *id005
51
+ - !ruby/object:Gem::Dependency
79
52
  prerelease: false
80
- version_requirements: !ruby/object:Gem::Requirement
81
- requirements:
82
- - - ~>
83
- - !ruby/object:Gem::Version
84
- version: 0.21.0
85
- - !ruby/object:Gem::Dependency
86
53
  name: webmock
87
- requirement: !ruby/object:Gem::Requirement
88
- requirements:
89
- - - '>='
90
- - !ruby/object:Gem::Version
91
- version: '0'
92
54
  type: :development
93
- prerelease: false
94
- version_requirements: !ruby/object:Gem::Requirement
95
- requirements:
96
- - - '>='
97
- - !ruby/object:Gem::Version
98
- version: '0'
55
+ requirement: &id006 !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - *id002
58
+ version_requirements: *id006
99
59
  description: Hiera AWS Backend
100
- email:
60
+ email:
101
61
  - mathias.lafeldt@jimdo.com
102
62
  - deniz.adrian@jimdo.com
103
63
  - soenke.ruempler@jimdo.com
104
64
  executables: []
65
+
105
66
  extensions: []
67
+
106
68
  extra_rdoc_files: []
107
- files:
69
+
70
+ files:
108
71
  - .gitignore
109
72
  - .rubocop.yml
110
73
  - .travis.yml
@@ -125,30 +88,29 @@ files:
125
88
  - spec/aws_rds_spec.rb
126
89
  - spec/spec_helper.rb
127
90
  homepage: https://github.com/Jimdo/hiera-aws
128
- licenses:
91
+ licenses:
129
92
  - Apache 2.0
130
93
  metadata: {}
94
+
131
95
  post_install_message:
132
96
  rdoc_options: []
133
- require_paths:
97
+
98
+ require_paths:
134
99
  - lib
135
- required_ruby_version: !ruby/object:Gem::Requirement
136
- requirements:
137
- - - '>='
138
- - !ruby/object:Gem::Version
139
- version: '0'
140
- required_rubygems_version: !ruby/object:Gem::Requirement
141
- requirements:
142
- - - '>='
143
- - !ruby/object:Gem::Version
144
- version: '0'
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - *id002
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - *id002
145
106
  requirements: []
107
+
146
108
  rubyforge_project:
147
- rubygems_version: 2.1.9
109
+ rubygems_version: 2.0.3
148
110
  signing_key:
149
111
  specification_version: 4
150
112
  summary: Hiera AWS Backend
151
- test_files:
113
+ test_files:
152
114
  - spec/aws_backend_spec.rb
153
115
  - spec/aws_base_spec.rb
154
116
  - spec/aws_elasticache_spec.rb