chef-provisioning-aws 1.5.1 → 1.6.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 +4 -4
- data/Gemfile +1 -3
- data/README.md +8 -5
- data/Rakefile +7 -1
- data/chef-provisioning-aws.gemspec +37 -0
- data/lib/chef/provider/aws_cloudsearch_domain.rb +11 -0
- data/lib/chef/provider/aws_internet_gateway.rb +4 -0
- data/lib/chef/provider/aws_security_group.rb +27 -14
- data/lib/chef/provider/aws_subnet.rb +14 -3
- data/lib/chef/provider/aws_vpc.rb +52 -12
- data/lib/chef/provisioning/aws_driver/driver.rb +42 -33
- data/lib/chef/provisioning/aws_driver/version.rb +1 -1
- data/lib/chef/provisioning/driver_init/aws.rb +1 -1
- data/spec/aws_support.rb +3 -1
- data/spec/aws_support/deep_matcher/match_values_failure_messages.rb +14 -3
- data/spec/aws_support/matchers/create_an_aws_object.rb +1 -1
- data/spec/integration/aws_security_group_spec.rb +331 -17
- data/spec/integration/load_balancer_spec.rb +5 -3
- data/spec/integration/machine_image_spec.rb +14 -1
- data/spec/integration/machine_spec.rb +48 -4
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c186bb7a22b11f6bc9e02f6cc1a2545b6a9889b
|
4
|
+
data.tar.gz: 8d58524a6a73a86543eb3f6a62d769bf7afe5fe5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14c2b8d978b7291fcf5cf52b81f36237df7f0d6dd6f4f2400a999d4f8298301322331444a655fd8b8cfaa5002d52abff00c5c13a608ccf6e8fa717b27e7ee7ae
|
7
|
+
data.tar.gz: 44f55a7e710faf8e72f1874ee3b8109fe8522d63f734a5f4f6b1598ff98089a2b8c1f8aac693aeb312320c7cd5d4fc7933eb4d011a934289d656afc943ab166b
|
data/Gemfile
CHANGED
@@ -3,6 +3,4 @@ gem "simplecov"
|
|
3
3
|
gemspec
|
4
4
|
|
5
5
|
#gem 'chef-provisioning', path: '../chef-provisioning'
|
6
|
-
|
7
|
-
#gem "pry-byebug"
|
8
|
-
#gem "pry-stack_explorer"
|
6
|
+
gem 'chef-provisioning', github: 'chef/chef-provisioning', branch: 'master'
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
This README is a work in progress. Please add to it!
|
4
4
|
|
5
|
-
#
|
5
|
+
# Prerequisites
|
6
6
|
|
7
7
|
## Credentials
|
8
8
|
|
@@ -127,10 +127,12 @@ are left that AWS can charge for.
|
|
127
127
|
|
128
128
|
# Machine Options
|
129
129
|
|
130
|
-
TODO - Finish documenting these
|
131
|
-
|
132
130
|
You can pass machine options that will be used by `machine`, `machine_batch` and `machine_image` to
|
133
|
-
configure the machine.
|
131
|
+
configure the machine.
|
132
|
+
|
133
|
+
These options are an extension of the [base options](https://github.com/chef/chef-provisioning#machine-options). Please see that for a list of the `machine_options` shared between drivers.
|
134
|
+
|
135
|
+
The full syntax available in the `bootstrap_options` hash is the hash expected by the AWS [`create_instances`](http://docs.aws.amazon.com/sdkforruby/api/Aws/EC2/Resource.html#create_instances-instance_method) method. The options seen below in the example are the default options.
|
134
136
|
|
135
137
|
```ruby
|
136
138
|
with_machine_options({
|
@@ -146,10 +148,11 @@ with_machine_options({
|
|
146
148
|
},
|
147
149
|
use_private_ip_for_ssh: false, # DEPRECATED, use `transport_address_location`
|
148
150
|
transport_address_location: :public_ip, # `:public_ip` (default), `:private_ip` or `:dns`. Defines how SSH or WinRM should find an address to communicate with the instance.
|
151
|
+
is_windows: true, # false by default
|
149
152
|
})
|
150
153
|
```
|
151
154
|
|
152
|
-
This options hash can be supplied to either `with_machine_options` or directly into the `machine_options`
|
155
|
+
This options hash can be supplied to either `with_machine_options` at the recipe level or directly into the `machine_options`
|
153
156
|
attribute.
|
154
157
|
|
155
158
|
# Load Balancer Options
|
data/Rakefile
CHANGED
@@ -39,7 +39,13 @@ end
|
|
39
39
|
|
40
40
|
desc "travis specific task - runs CI integration tests (regular and super_slow in parallel) and sets up travis specific ENV variables"
|
41
41
|
task :travis, [:sub_task] do |t, args|
|
42
|
-
pattern = "load_balancer_spec.rb,
|
42
|
+
pattern = "load_balancer_spec.rb,machine_spec.rb,aws_iam_instance_profile_spec.rb,aws_security_group_spec.rb" # This is a comma seperated list
|
43
43
|
pattern = pattern.split(",").map {|p| "spec/integration/**/*#{p}"}.join(",")
|
44
44
|
Rake::Task[args[:sub_task]].invoke(pattern)
|
45
45
|
end
|
46
|
+
|
47
|
+
desc "travis task for machine_image tests - these take so long to run that we only run the first test"
|
48
|
+
RSpec::Core::RakeTask.new(:machine_image) do |spec|
|
49
|
+
spec.pattern = 'spec/integration/machine_image_spec.rb'
|
50
|
+
spec.rspec_opts = "-b -t super_slow -e 'machine_image can create an image in the VPC'"
|
51
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__) + '/lib')
|
2
|
+
require 'chef/provisioning/aws_driver/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'chef-provisioning-aws'
|
6
|
+
s.version = Chef::Provisioning::AWSDriver::VERSION
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.extra_rdoc_files = ['README.md', 'LICENSE' ]
|
9
|
+
s.summary = 'Provisioner for creating aws containers in Chef Provisioning.'
|
10
|
+
s.description = s.summary
|
11
|
+
s.author = 'John Ewart'
|
12
|
+
s.email = 'jewart@getchef.com'
|
13
|
+
s.homepage = 'https://github.com/opscode/chef-provisioning-aws'
|
14
|
+
|
15
|
+
s.add_dependency 'chef-provisioning', '~> 1.4'
|
16
|
+
|
17
|
+
s.add_dependency 'aws-sdk-v1', '>= 1.59.0'
|
18
|
+
s.add_dependency 'aws-sdk', '~> 2.1'
|
19
|
+
s.add_dependency 'retryable', '~> 2.0.1'
|
20
|
+
s.add_dependency 'ubuntu_ami', '~> 0.4.1'
|
21
|
+
|
22
|
+
# chef-zero is only a development dependency because we leverage its RSpec support
|
23
|
+
s.add_development_dependency 'chef-zero', '~> 4.2'
|
24
|
+
s.add_development_dependency 'chef', '~> 12.4'
|
25
|
+
s.add_development_dependency 'rspec', '~> 3.0'
|
26
|
+
s.add_development_dependency 'rake'
|
27
|
+
s.add_development_dependency 'pry'
|
28
|
+
s.add_development_dependency 'pry-byebug'
|
29
|
+
s.add_development_dependency 'pry-stack_explorer'
|
30
|
+
|
31
|
+
s.bindir = "bin"
|
32
|
+
s.executables = %w( )
|
33
|
+
|
34
|
+
s.require_path = 'lib'
|
35
|
+
s.files = %w(Gemfile Rakefile LICENSE README.md) + Dir.glob("*.gemspec") +
|
36
|
+
Dir.glob("{distro,lib,tasks,spec}/**/*", File::FNM_DOTMATCH).reject {|f| File.directory?(f) }
|
37
|
+
end
|
@@ -10,6 +10,11 @@ class Chef::Provider::AwsCloudsearchDomain < Chef::Provisioning::AWSDriver::AWSP
|
|
10
10
|
end
|
11
11
|
|
12
12
|
update_aws_object(domain)
|
13
|
+
|
14
|
+
# TODO: since we don't support updating index fields yet,
|
15
|
+
# it will not be handled by update_aws_object, so we need to
|
16
|
+
# create the index fields here.
|
17
|
+
create_index_fields
|
13
18
|
end
|
14
19
|
|
15
20
|
def destroy_aws_object(domain)
|
@@ -121,6 +126,12 @@ class Chef::Provider::AwsCloudsearchDomain < Chef::Provisioning::AWSDriver::AWSP
|
|
121
126
|
cs_client.define_index_field(domain_name: new_resource.name, index_field: field)
|
122
127
|
end
|
123
128
|
|
129
|
+
def create_index_fields
|
130
|
+
new_resource.index_fields.each do |field|
|
131
|
+
create_index_field(field)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
124
135
|
#
|
125
136
|
# API Query Functions
|
126
137
|
#
|
@@ -52,10 +52,14 @@ class Chef::Provider::AwsInternetGateway < Chef::Provisioning::AWSDriver::AWSPro
|
|
52
52
|
|
53
53
|
def attach_vpc(vpc, desired_gateway)
|
54
54
|
if vpc.internet_gateway && vpc.internet_gateway != desired_gateway
|
55
|
+
current_driver = self.new_resource.driver
|
56
|
+
current_chef_server = self.new_resource.chef_server
|
55
57
|
Cheffish.inline_resource(self, action) do
|
56
58
|
aws_vpc vpc.id do
|
57
59
|
cidr_block vpc.cidr_block
|
58
60
|
internet_gateway false
|
61
|
+
driver current_driver
|
62
|
+
chef_server current_chef_server
|
59
63
|
end
|
60
64
|
end
|
61
65
|
end
|
@@ -93,14 +93,14 @@ class Chef::Provider::AwsSecurityGroup < Chef::Provisioning::AWSDriver::AWSProvi
|
|
93
93
|
|
94
94
|
authorize: proc do |port_range, protocol, actors|
|
95
95
|
names = actors.map { |a| a.is_a?(Hash) ? a[:group_id] : a }
|
96
|
-
converge_by "authorize #{names.join(', ')} to send traffic to group #{new_resource.name} (#{sg.id}) on port_range #{port_range} with protocol #{protocol}" do
|
96
|
+
converge_by "authorize #{names.join(', ')} to send traffic to group #{new_resource.name} (#{sg.id}) on port_range #{port_range.inspect} with protocol #{protocol || 'nil'}" do
|
97
97
|
sg.authorize_ingress(protocol, port_range, *actors)
|
98
98
|
end
|
99
99
|
end,
|
100
100
|
|
101
101
|
revoke: proc do |port_range, protocol, actors|
|
102
102
|
names = actors.map { |a| a.is_a?(Hash) ? a[:group_id] : a }
|
103
|
-
converge_by "revoke the ability of #{names.join(', ')} to send traffic to group #{new_resource.name} (#{sg.id}) on port_range #{port_range} with protocol #{protocol}" do
|
103
|
+
converge_by "revoke the ability of #{names.join(', ')} to send traffic to group #{new_resource.name} (#{sg.id}) on port_range #{port_range.inspect} with protocol #{protocol || 'nil'}" do
|
104
104
|
sg.revoke_ingress(protocol, port_range, *actors)
|
105
105
|
end
|
106
106
|
end
|
@@ -122,8 +122,7 @@ class Chef::Provider::AwsSecurityGroup < Chef::Provisioning::AWSDriver::AWSProvi
|
|
122
122
|
when Array
|
123
123
|
# [ { port: X, protocol: Y, sources: [ ... ]}]
|
124
124
|
new_resource.outbound_rules.each do |rule|
|
125
|
-
|
126
|
-
add_rule(desired_rules, port_ranges, get_actors(vpc, rule[:destinations]))
|
125
|
+
add_rule(desired_rules, get_port_ranges(rule), get_actors(vpc, rule[:destinations]))
|
127
126
|
end
|
128
127
|
|
129
128
|
else
|
@@ -137,14 +136,14 @@ class Chef::Provider::AwsSecurityGroup < Chef::Provisioning::AWSDriver::AWSProvi
|
|
137
136
|
|
138
137
|
authorize: proc do |port_range, protocol, actors|
|
139
138
|
names = actors.map { |a| a.is_a?(Hash) ? a[:group_id] : a }
|
140
|
-
converge_by "authorize group #{new_resource.name} (#{sg.id}) to send traffic to #{names.join(', ')} on port_range #{port_range} with protocol #{protocol}" do
|
139
|
+
converge_by "authorize group #{new_resource.name} (#{sg.id}) to send traffic to #{names.join(', ')} on port_range #{port_range.inspect} with protocol #{protocol || 'nil'}" do
|
141
140
|
sg.authorize_egress(*actors, ports: port_range, protocol: protocol)
|
142
141
|
end
|
143
142
|
end,
|
144
143
|
|
145
144
|
revoke: proc do |port_range, protocol, actors|
|
146
145
|
names = actors.map { |a| a.is_a?(Hash) ? a[:group_id] : a }
|
147
|
-
converge_by "revoke the ability of group #{new_resource.name} (#{sg.id}) to send traffic to #{names.join(', ')} on port_range #{port_range} with protocol #{protocol}" do
|
146
|
+
converge_by "revoke the ability of group #{new_resource.name} (#{sg.id}) to send traffic to #{names.join(', ')} on port_range #{port_range.inspect} with protocol #{protocol || 'nil'}" do
|
148
147
|
sg.revoke_egress(*actors, ports: port_range, protocol: protocol)
|
149
148
|
end
|
150
149
|
end
|
@@ -203,29 +202,43 @@ class Chef::Provider::AwsSecurityGroup < Chef::Provisioning::AWSDriver::AWSProvi
|
|
203
202
|
end
|
204
203
|
end
|
205
204
|
|
205
|
+
# When protocol is unspecified (anything besides tcp, udp or icmp) then
|
206
|
+
# you cannot specify ports. When specifying tcp, udp, or icmp AWS wants
|
207
|
+
# port_range 0..0. -1..-1 will cause error
|
206
208
|
def get_port_ranges(port_spec)
|
207
209
|
case port_spec
|
208
210
|
when Integer
|
211
|
+
port_spec = 0 if port_spec == -1
|
209
212
|
[ { port_range: port_spec..port_spec, protocol: :tcp } ]
|
210
213
|
when Range
|
214
|
+
port_spec = 0..0 if port_spec == (-1..-1)
|
211
215
|
[ { port_range: port_spec, protocol: :tcp } ]
|
212
216
|
when Array
|
213
217
|
port_spec.map { |p| get_port_ranges(p) }.flatten
|
214
|
-
when
|
215
|
-
|
218
|
+
when String, Symbol
|
219
|
+
protocol = port_spec.to_s.downcase.to_sym
|
220
|
+
if protocol.to_s =~ /(any|all|-1)/i
|
221
|
+
[ { port_range: -1..-1, protocol: :"-1" } ]
|
222
|
+
else
|
223
|
+
[ { port_range: 0..0, protocol: protocol } ]
|
224
|
+
end
|
216
225
|
when Hash
|
217
|
-
port_range = port_spec[:port_range] || port_spec[:ports] || port_spec[:port]
|
226
|
+
port_range = port_spec[:port_range] || port_spec[:ports] || port_spec[:port] || 0
|
218
227
|
port_range = port_range..port_range if port_range.is_a?(Integer)
|
219
228
|
if port_spec[:protocol]
|
220
|
-
|
221
|
-
|
229
|
+
protocol = port_spec[:protocol].to_s.downcase.to_sym
|
230
|
+
if protocol.to_s =~ /(any|all|-1)/i
|
231
|
+
[ { port_range: -1..-1, protocol: :"-1" } ]
|
232
|
+
else
|
233
|
+
[ { port_range: port_range, protocol: protocol } ]
|
234
|
+
end
|
222
235
|
else
|
223
236
|
get_port_ranges(port_range)
|
224
237
|
end
|
225
238
|
# The to_s.to_sym dance is because if you specify a protocol number, AWS symbolifies it,
|
226
239
|
# but 26.to_sym doesn't work (so we have to to_s it first).
|
227
240
|
when nil
|
228
|
-
[ { port_range:
|
241
|
+
[ { port_range: -1..-1, protocol: :"-1" } ]
|
229
242
|
end
|
230
243
|
end
|
231
244
|
|
@@ -251,7 +264,7 @@ class Chef::Provider::AwsSecurityGroup < Chef::Provisioning::AWSDriver::AWSProvi
|
|
251
264
|
|
252
265
|
# load_balancer: <load balancer name>
|
253
266
|
elsif actor_spec.keys == [ :load_balancer ]
|
254
|
-
lb = Chef::Resource::AwsLoadBalancer.get_aws_object(actor_spec
|
267
|
+
lb = Chef::Resource::AwsLoadBalancer.get_aws_object(actor_spec[:load_balancer], resource: new_resource)
|
255
268
|
get_actors(vpc, lb)
|
256
269
|
|
257
270
|
# security_group: <security group name>
|
@@ -278,7 +291,7 @@ class Chef::Provider::AwsSecurityGroup < Chef::Provisioning::AWSDriver::AWSProvi
|
|
278
291
|
IPAddr.new(actor_spec)
|
279
292
|
# Add /32 to the end of raw IP addresses
|
280
293
|
actor_spec =~ /\// ? actor_spec : "#{actor_spec}/32"
|
281
|
-
rescue
|
294
|
+
rescue IPAddr::InvalidAddressError
|
282
295
|
Chef::Resource::AwsSecurityGroup.get_aws_object(actor_spec, resource: new_resource)
|
283
296
|
end
|
284
297
|
|
@@ -61,17 +61,28 @@ class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
|
|
61
61
|
if purging
|
62
62
|
# TODO possibly convert to http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/EC2/Client.html#terminate_instances-instance_method
|
63
63
|
p = Chef::ChefFS::Parallelizer.new(5)
|
64
|
+
current_driver = self.new_resource.driver
|
65
|
+
current_chef_server = self.new_resource.chef_server
|
64
66
|
p.parallel_do(subnet.instances.to_a) do |instance|
|
65
67
|
Cheffish.inline_resource(self, action) do
|
66
68
|
aws_instance instance.id do
|
67
69
|
action :purge
|
70
|
+
driver current_driver
|
71
|
+
chef_server current_chef_server
|
68
72
|
end
|
69
73
|
end
|
70
74
|
end
|
71
75
|
p.parallel_do(subnet.network_interfaces.to_a) do |network|
|
72
|
-
|
73
|
-
|
74
|
-
|
76
|
+
# It is common during subnet purging for the instance to be terminated but
|
77
|
+
# temporarily hanging around - this causes a `The network interface at device index 0 cannot be detached`
|
78
|
+
# error to be raised when trying to detach
|
79
|
+
retry_with_backoff(AWS::EC2::Errors::OperationNotPermitted) do
|
80
|
+
Cheffish.inline_resource(self, action) do
|
81
|
+
aws_network_interface network do
|
82
|
+
action :purge
|
83
|
+
driver current_driver
|
84
|
+
chef_server current_chef_server
|
85
|
+
end
|
75
86
|
end
|
76
87
|
end
|
77
88
|
end
|
@@ -65,31 +65,46 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def destroy_aws_object(vpc)
|
68
|
+
current_driver = self.new_resource.driver
|
69
|
+
current_chef_server = self.new_resource.chef_server
|
68
70
|
if purging
|
69
71
|
vpc.subnets.each do |s|
|
70
72
|
Cheffish.inline_resource(self, action) do
|
71
73
|
aws_subnet s do
|
72
74
|
action :purge
|
75
|
+
driver current_driver
|
76
|
+
chef_server current_chef_server
|
73
77
|
end
|
74
78
|
end
|
75
79
|
end
|
76
80
|
# If any of the below resources start needing complicated delete logic (dependent resources needing to
|
77
81
|
# be deleted) move that logic into `delete_aws_resource` and add the purging logic to the resource
|
78
|
-
vpc.network_acls.each
|
82
|
+
vpc.network_acls.each do |na|
|
83
|
+
next if na.default?
|
84
|
+
Cheffish.inline_resource(self, action) do
|
85
|
+
aws_network_acl na do
|
86
|
+
action :purge
|
87
|
+
driver current_driver
|
88
|
+
chef_server current_chef_server
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
79
92
|
vpc.network_interfaces.each do |ni|
|
80
93
|
Cheffish.inline_resource(self, action) do
|
81
94
|
aws_network_interface ni do
|
82
95
|
action :purge
|
96
|
+
driver current_driver
|
97
|
+
chef_server current_chef_server
|
83
98
|
end
|
84
99
|
end
|
85
100
|
end
|
86
|
-
|
87
101
|
vpc.security_groups.each do |sg|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
102
|
+
next if sg.name == 'default'
|
103
|
+
Cheffish.inline_resource(self, action) do
|
104
|
+
aws_security_group sg do
|
105
|
+
action :purge
|
106
|
+
driver current_driver
|
107
|
+
chef_server current_chef_server
|
93
108
|
end
|
94
109
|
end
|
95
110
|
end
|
@@ -97,11 +112,12 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
97
112
|
#SDK V2
|
98
113
|
vpc_new_sdk = new_resource.driver.ec2_resource.vpc(vpc.id)
|
99
114
|
vpc_new_sdk.route_tables.each do |rt|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
115
|
+
next if rt.associations.any? { |association| association.main }
|
116
|
+
Cheffish.inline_resource(self, action) do
|
117
|
+
aws_route_table rt do
|
118
|
+
action :purge
|
119
|
+
driver current_driver
|
120
|
+
chef_server current_chef_server
|
105
121
|
end
|
106
122
|
end
|
107
123
|
end
|
@@ -126,6 +142,8 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
126
142
|
Cheffish.inline_resource(self, action) do
|
127
143
|
aws_vpc_peering_connection pc_resource do
|
128
144
|
action :purge
|
145
|
+
driver current_driver
|
146
|
+
chef_server current_chef_server
|
129
147
|
end
|
130
148
|
end
|
131
149
|
end
|
@@ -141,6 +159,8 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
141
159
|
else
|
142
160
|
action :detach
|
143
161
|
end
|
162
|
+
driver current_driver
|
163
|
+
chef_server current_chef_server
|
144
164
|
end
|
145
165
|
end
|
146
166
|
end
|
@@ -179,6 +199,8 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
179
199
|
|
180
200
|
def update_internet_gateway(vpc)
|
181
201
|
current_ig = vpc.internet_gateway
|
202
|
+
current_driver = self.new_resource.driver
|
203
|
+
current_chef_server = self.new_resource.chef_server
|
182
204
|
case new_resource.internet_gateway
|
183
205
|
when String, Chef::Resource::AwsInternetGateway, AWS::EC2::InternetGateway
|
184
206
|
new_ig = Chef::Resource::AwsInternetGateway.get_aws_object(new_resource.internet_gateway, resource: new_resource)
|
@@ -186,6 +208,12 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
186
208
|
Cheffish.inline_resource(self, action) do
|
187
209
|
aws_internet_gateway new_ig do
|
188
210
|
vpc vpc.id
|
211
|
+
# We have to set the driver & chef server on all resources because
|
212
|
+
# `with_chef_driver(...) do` gets evaluated at compile-time and these
|
213
|
+
# resources aren't constructed until converge-time. So the driver has
|
214
|
+
# been reset at this point
|
215
|
+
driver current_driver
|
216
|
+
chef_server current_chef_server
|
189
217
|
end
|
190
218
|
end
|
191
219
|
elsif current_ig != new_ig
|
@@ -196,9 +224,13 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
196
224
|
else
|
197
225
|
action :detach
|
198
226
|
end
|
227
|
+
driver current_driver
|
228
|
+
chef_server current_chef_server
|
199
229
|
end
|
200
230
|
aws_internet_gateway new_ig do
|
201
231
|
vpc vpc.id
|
232
|
+
driver current_driver
|
233
|
+
chef_server current_chef_server
|
202
234
|
end
|
203
235
|
end
|
204
236
|
end
|
@@ -208,6 +240,8 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
208
240
|
aws_internet_gateway "igw-managed-by-#{vpc.id}" do
|
209
241
|
vpc vpc.id
|
210
242
|
aws_tags 'OwnedByVPC' => vpc.id
|
243
|
+
driver current_driver
|
244
|
+
chef_server current_chef_server
|
211
245
|
end
|
212
246
|
end
|
213
247
|
end
|
@@ -220,6 +254,8 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
220
254
|
else
|
221
255
|
action :detach
|
222
256
|
end
|
257
|
+
driver current_driver
|
258
|
+
chef_server current_chef_server
|
223
259
|
end
|
224
260
|
end
|
225
261
|
end
|
@@ -250,10 +286,14 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
250
286
|
# creating the VPC
|
251
287
|
main_route_table ||= vpc.route_tables.main_route_table
|
252
288
|
main_routes = new_resource.main_routes
|
289
|
+
current_driver = self.new_resource.driver
|
290
|
+
current_chef_server = self.new_resource.chef_server
|
253
291
|
Cheffish.inline_resource(self, action) do
|
254
292
|
aws_route_table main_route_table.id do
|
255
293
|
vpc vpc
|
256
294
|
routes main_routes
|
295
|
+
driver current_driver
|
296
|
+
chef_server current_chef_server
|
257
297
|
end
|
258
298
|
end
|
259
299
|
main_route_table
|
@@ -575,15 +575,28 @@ EOD
|
|
575
575
|
end
|
576
576
|
|
577
577
|
if instance.state.name != "running"
|
578
|
-
wait_until_machine(action_handler, machine_spec, "finish stopping", instance) { instance.state.name != "stopping" }
|
578
|
+
wait_until_machine(action_handler, machine_spec, "finish stopping", instance) { |instance| instance.state.name != "stopping" }
|
579
579
|
if instance.state.name == "stopped"
|
580
580
|
action_handler.perform_action "Start #{machine_spec.name} (#{machine_spec.reference['instance_id']}) in #{aws_config.region} ..." do
|
581
581
|
instance.start
|
582
582
|
end
|
583
583
|
end
|
584
|
-
|
584
|
+
wait_until_instance_running(action_handler, machine_spec, instance)
|
585
585
|
end
|
586
586
|
|
587
|
+
# Windows machines potentially do a bunch of extra stuff - setting hostname,
|
588
|
+
# sending out encrypted password, restarting instance, etc.
|
589
|
+
if machine_spec.reference['is_windows']
|
590
|
+
wait_until_machine(action_handler, machine_spec, "receive 'Windows is ready' message from the AWS console", instance) { |instance|
|
591
|
+
output = instance.console_output.output
|
592
|
+
if output.nil? || output.empty?
|
593
|
+
false
|
594
|
+
else
|
595
|
+
output = Base64.decode64(output)
|
596
|
+
output =~ /Message: Windows is Ready to use/
|
597
|
+
end
|
598
|
+
}
|
599
|
+
end
|
587
600
|
wait_for_transport(action_handler, machine_spec, machine_options)
|
588
601
|
machine_for(machine_spec, machine_options, instance)
|
589
602
|
end
|
@@ -598,6 +611,19 @@ EOD
|
|
598
611
|
machine_for(machine_spec, machine_spec.reference)
|
599
612
|
end
|
600
613
|
|
614
|
+
def stop_machine(action_handler, machine_spec, machine_options)
|
615
|
+
instance = instance_for(machine_spec)
|
616
|
+
if instance && instance.exists?
|
617
|
+
wait_until_machine(action_handler, machine_spec, "finish coming up so we can stop it", instance) { |instance| instance.state.name != "pending" }
|
618
|
+
if instance.state.name == "running"
|
619
|
+
action_handler.perform_action "Stop #{machine_spec.name} (#{instance.id}) in #{aws_config.region} ..." do
|
620
|
+
instance.stop
|
621
|
+
end
|
622
|
+
end
|
623
|
+
wait_until_machine(action_handler, machine_spec, "stop", instance) { |instance| %w[stopped terminated].include?(instance.state.name) }
|
624
|
+
end
|
625
|
+
end
|
626
|
+
|
601
627
|
def destroy_machine(action_handler, machine_spec, machine_options)
|
602
628
|
d = self
|
603
629
|
Provisioning.inline_resource(action_handler) do
|
@@ -894,15 +920,22 @@ EOD
|
|
894
920
|
endpoint = "http://#{remote_host}:#{port}/wsman"
|
895
921
|
type = :plaintext
|
896
922
|
pem_bytes = get_private_key(instance.key_name)
|
897
|
-
encrypted_admin_password = wait_for_admin_password(machine_spec)
|
898
923
|
|
899
|
-
|
900
|
-
|
901
|
-
|
924
|
+
# TODO plaintext password = bad
|
925
|
+
password = machine_spec.reference['winrm_password']
|
926
|
+
if password.nil? || password.empty?
|
927
|
+
encrypted_admin_password = instance.password_data.password_data
|
928
|
+
if encrypted_admin_password.nil? || encrypted_admin_password.empty?
|
929
|
+
raise "You did not specify winrm_password in the machine options and no encrytpted password could be fetched from the instance"
|
930
|
+
end
|
931
|
+
decoded = Base64.decode64(encrypted_admin_password)
|
932
|
+
private_key = OpenSSL::PKey::RSA.new(pem_bytes)
|
933
|
+
password = private_key.private_decrypt decoded
|
934
|
+
end
|
902
935
|
|
903
936
|
winrm_options = {
|
904
937
|
:user => machine_spec.reference['winrm_username'] || 'Administrator',
|
905
|
-
:pass =>
|
938
|
+
:pass => password,
|
906
939
|
:disable_sspi => true,
|
907
940
|
:basic_auth_only => true
|
908
941
|
}
|
@@ -910,30 +943,6 @@ EOD
|
|
910
943
|
Chef::Provisioning::Transport::WinRM.new("#{endpoint}", type, winrm_options, {})
|
911
944
|
end
|
912
945
|
|
913
|
-
def wait_for_admin_password(machine_spec)
|
914
|
-
time_elapsed = 0
|
915
|
-
sleep_time = 10
|
916
|
-
max_wait_time = 900 # 15 minutes
|
917
|
-
encrypted_admin_password = nil
|
918
|
-
instance_id = machine_spec.reference['instance_id']
|
919
|
-
|
920
|
-
Chef::Log.info "waiting for #{machine_spec.name}'s admin password to be available..."
|
921
|
-
while time_elapsed < max_wait_time && encrypted_admin_password.nil?
|
922
|
-
response = ec2.client.get_password_data({ :instance_id => instance_id })
|
923
|
-
encrypted_admin_password = response['password_data'.to_sym]
|
924
|
-
|
925
|
-
if encrypted_admin_password.nil?
|
926
|
-
Chef::Log.info "#{time_elapsed}/#{max_wait_time}s elapsed -- sleeping #{sleep_time} for #{machine_spec.name}'s admin password."
|
927
|
-
sleep(sleep_time)
|
928
|
-
time_elapsed += sleep_time
|
929
|
-
end
|
930
|
-
end
|
931
|
-
|
932
|
-
Chef::Log.info "#{machine_spec.name}'s admin password is available!"
|
933
|
-
|
934
|
-
encrypted_admin_password
|
935
|
-
end
|
936
|
-
|
937
946
|
def create_ssh_transport(machine_spec, machine_options, instance)
|
938
947
|
ssh_options = ssh_options_for(machine_spec, machine_options, instance)
|
939
948
|
username = machine_spec.reference['ssh_username'] || machine_options[:ssh_username] || default_ssh_username
|
@@ -1053,7 +1062,7 @@ EOD
|
|
1053
1062
|
end
|
1054
1063
|
end
|
1055
1064
|
|
1056
|
-
def
|
1065
|
+
def wait_until_instance_running(action_handler, machine_spec, instance=nil)
|
1057
1066
|
wait_until_machine(action_handler, machine_spec, "be ready", instance) { |instance|
|
1058
1067
|
instance.state.name == "running"
|
1059
1068
|
}
|
@@ -1252,7 +1261,7 @@ EOD
|
|
1252
1261
|
end
|
1253
1262
|
machine_options = Cheffish::MergedConfig.new(machine_options, {:transport_address_location => :private_ip})
|
1254
1263
|
end
|
1255
|
-
%w(is_windows ssh_username sudo transport_address_location ssh_gateway).each do |key|
|
1264
|
+
%w(is_windows winrm_username winrm_port winrm_password ssh_username sudo transport_address_location ssh_gateway).each do |key|
|
1256
1265
|
machine_spec.reference[key] = machine_options[key.to_sym] if machine_options[key.to_sym]
|
1257
1266
|
end
|
1258
1267
|
instance
|
data/spec/aws_support.rb
CHANGED
@@ -171,7 +171,9 @@ module AWSSupport
|
|
171
171
|
context.module_eval do
|
172
172
|
after :example do
|
173
173
|
# Close up delayed streams so they don't print out their garbage later in the run
|
174
|
-
|
174
|
+
unless chef_config[:include_output_after_example]
|
175
|
+
delayed_streams.each { |s| s.close }
|
176
|
+
end
|
175
177
|
|
176
178
|
# Destroy any objects we know got created during the test
|
177
179
|
created_during_test.reverse_each do |resource_name, name|
|
@@ -43,9 +43,20 @@ module AWSSupport
|
|
43
43
|
if ! actual_setlike.respond_to?(:to_set)
|
44
44
|
result << "expected #{identifier || "setlike"} to be castable to a Set, but it isn't!"
|
45
45
|
else
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
actual_set = actual_setlike.to_set
|
47
|
+
expected_set.each do |expected|
|
48
|
+
unless actual_set.any? { |actual|
|
49
|
+
match_values_failure_messages(expected, actual, identifier).flatten.empty?
|
50
|
+
}
|
51
|
+
result << "- #{description_of(expected)}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
actual_set.each do |actual|
|
55
|
+
unless expected_set.any? { |expected|
|
56
|
+
match_values_failure_messages(expected, actual, identifier).flatten.empty?
|
57
|
+
}
|
58
|
+
result << "+ #{description_of(actual)}"
|
59
|
+
end
|
49
60
|
end
|
50
61
|
end
|
51
62
|
result
|
@@ -8,7 +8,7 @@ module AWSSupport
|
|
8
8
|
include RSpec::Matchers::Composable
|
9
9
|
include AWSSupport::DeepMatcher
|
10
10
|
|
11
|
-
# @param custom_matcher [Block] A block with 1 argument that will be provided the
|
11
|
+
# @param custom_matcher [Block] A block with 1 argument that will be provided the aws_object
|
12
12
|
def initialize(example, resource_class, name, expected_values, custom_matcher)
|
13
13
|
@example = example
|
14
14
|
@resource_class = resource_class
|
@@ -105,8 +105,14 @@ describe Chef::Resource::AwsSecurityGroup do
|
|
105
105
|
end
|
106
106
|
|
107
107
|
with_aws "in a VPC" do
|
108
|
-
|
109
|
-
|
108
|
+
purge_all
|
109
|
+
setup_public_vpc
|
110
|
+
|
111
|
+
load_balancer "testloadbalancer" do
|
112
|
+
load_balancer_options({
|
113
|
+
subnets: ["test_public_subnet"],
|
114
|
+
security_groups: ["test_security_group"]
|
115
|
+
})
|
110
116
|
end
|
111
117
|
|
112
118
|
it "aws_security_group 'test_sg' with no attributes works" do
|
@@ -121,35 +127,343 @@ describe Chef::Resource::AwsSecurityGroup do
|
|
121
127
|
).and be_idempotent
|
122
128
|
end
|
123
129
|
|
124
|
-
it "
|
130
|
+
it "can specify rules as a mapping from source/destination to port and protocol" do
|
125
131
|
expect_recipe {
|
126
132
|
aws_security_group 'test_sg' do
|
133
|
+
# We need to define a list of ports and its easier to use a method than
|
134
|
+
# have to add a new number when changing this test
|
135
|
+
def counter()
|
136
|
+
@ip_counter ||= 0
|
137
|
+
@ip_counter += 1
|
138
|
+
end
|
139
|
+
|
127
140
|
vpc 'test_vpc'
|
128
|
-
inbound_rules
|
129
|
-
|
141
|
+
inbound_rules(
|
142
|
+
"10.0.0.#{counter}/32" => { port_range: -1..-1, protocol: -1 },
|
143
|
+
"10.0.0.#{counter}/32" => { port: -1, protocol: -1 },
|
144
|
+
"10.0.0.#{counter}/32" => { port: 1002, protocol: -1 },
|
145
|
+
"10.0.0.#{counter}/32" => { ports: 1003..1003, protocol: -1 },
|
146
|
+
"10.0.0.#{counter}/32" => { port_range: 1004..1005, protocol: -1 },
|
147
|
+
"10.0.0.#{counter}/32" => { port_range: [1006, 1007, 1108], protocol: -1 },
|
148
|
+
# If the protocol isn't `-1` and you don't specify all the ports
|
149
|
+
# aws wants `port_range` to be nil
|
150
|
+
"10.0.0.#{counter}/32" => { ports: nil, protocol: :tcp },
|
151
|
+
"10.0.0.#{counter}/32" => { port_range: 0..65535, protocol: :udp },
|
152
|
+
"10.0.0.#{counter}/32" => { port_range: -1, protocol: :icmp },
|
153
|
+
"10.0.0.#{counter}/32" => { port_range: 1..2, protocol: :icmp },
|
154
|
+
"10.0.0.#{counter}/32" => { port_range: 1011, protocol: :any },
|
155
|
+
"10.0.0.#{counter}/32" => { port_range: 1012, protocol: nil },
|
156
|
+
"10.0.0.#{counter}/32" => { port: 1013 },
|
157
|
+
"10.0.0.#{counter}/32" => { port: 1014..1014 },
|
158
|
+
"10.0.0.#{counter}/32" => { port: [1015, 1016, 1117] },
|
159
|
+
"10.0.0.#{counter}/32" => { port: :icmp },
|
160
|
+
"10.0.0.#{counter}/32" => { port: 'tCp' },
|
161
|
+
"10.0.0.#{counter}/32" => { port: nil },
|
162
|
+
"10.0.0.#{counter}/32" => { protocol: -1 },
|
163
|
+
"10.0.0.#{counter}/32" => { protocol: :any },
|
164
|
+
"10.0.0.#{counter}/32" => { protocol: 'UDP' },
|
165
|
+
"10.0.0.#{counter}/32" => { protocol: nil },
|
166
|
+
"10.0.0.#{counter}/32" => 1020,
|
167
|
+
"10.0.0.#{counter}/32" => 1021..1023,
|
168
|
+
"10.0.0.#{counter}/32" => [1024, 1025, 1125],
|
169
|
+
"10.0.0.#{counter}/32" => :icmp,
|
170
|
+
"10.0.0.#{counter}/32" => 'Icmp',
|
171
|
+
"10.0.0.#{counter}/32" => :tcp,
|
172
|
+
"10.0.0.#{counter}/32" => 'UDP',
|
173
|
+
"10.0.0.#{counter}/32" => nil,
|
174
|
+
"10.0.0.#{counter}/32" => -1,
|
175
|
+
"10.0.0.#{counter}/32" => :"-1",
|
176
|
+
["10.0.0.#{counter}/32", "10.0.0.#{counter}/32"] => :all,
|
177
|
+
'test_security_group' => 1200,
|
178
|
+
test_security_group.aws_object.id => 1201,
|
179
|
+
test_security_group.aws_object => 1202,
|
180
|
+
test_security_group => 1203,
|
181
|
+
# cannot get the ID from the v1 api object
|
182
|
+
#testloadbalancer.aws_object.id => 1205,
|
183
|
+
testloadbalancer.aws_object => 1206,
|
184
|
+
# Cannot specify a LoadBalancer resource, only AwsLoadBalancer
|
185
|
+
#testloadbalancer => 1207,
|
186
|
+
{group_name: 'test_security_group'} => 1208,
|
187
|
+
{load_balancer: 'testloadbalancer'} => 1209,
|
188
|
+
{security_group: 'test_security_group'} => 1210,
|
189
|
+
)
|
190
|
+
outbound_rules(
|
191
|
+
{ port_range: -1..-1, protocol: -1 } => "10.0.0.#{counter}/32",
|
192
|
+
{ port: -1, protocol: -1 } => "10.0.0.#{counter}/32",
|
193
|
+
{ port: 1002, protocol: -1 } => "10.0.0.#{counter}/32",
|
194
|
+
{ ports: 1003..1003, protocol: -1 } => "10.0.0.#{counter}/32",
|
195
|
+
{ port_range: 1004..1005, protocol: -1 } => "10.0.0.#{counter}/32",
|
196
|
+
{ port_range: [1006, 1007, 1108], protocol: -1 } => "10.0.0.#{counter}/32",
|
197
|
+
# If the protocol isn't `-1` and you don't specify all the ports
|
198
|
+
# aws wants `port_range` to be nil{ ports: nil, protocol: :tcp } => "10.0.0.#{counter}/32",
|
199
|
+
{ port_range: 0..65535, protocol: :udp } => "10.0.0.#{counter}/32",
|
200
|
+
{ port_range: -1, protocol: :icmp } => "10.0.0.#{counter}/32",
|
201
|
+
{ port_range: 1..2, protocol: :icmp } => "10.0.0.#{counter}/32",
|
202
|
+
{ port_range: 1011, protocol: :any } => "10.0.0.#{counter}/32",
|
203
|
+
{ port_range: 1012, protocol: nil } => "10.0.0.#{counter}/32",
|
204
|
+
{ port: 1013 } => "10.0.0.#{counter}/32",
|
205
|
+
{ port: 1014..1014 } => "10.0.0.#{counter}/32",
|
206
|
+
{ port: [1015, 1016, 1117] } => "10.0.0.#{counter}/32",
|
207
|
+
{ port: :icmp } => "10.0.0.#{counter}/32",
|
208
|
+
{ port: 'tCp' } => "10.0.0.#{counter}/32",
|
209
|
+
{ port: nil } => "10.0.0.#{counter}/32",
|
210
|
+
{ protocol: -1 } => "10.0.0.#{counter}/32",
|
211
|
+
{ protocol: :any } => "10.0.0.#{counter}/32",
|
212
|
+
{ protocol: 'UDP' } => "10.0.0.#{counter}/32",
|
213
|
+
{ protocol: nil } => "10.0.0.#{counter}/32",
|
214
|
+
1020 => "10.0.0.#{counter}/32",
|
215
|
+
1021..1023 => "10.0.0.#{counter}/32",
|
216
|
+
[1024, 1025, 1125] => "10.0.0.#{counter}/32",
|
217
|
+
:icmp => "10.0.0.#{counter}/32",
|
218
|
+
'Icmp' => "10.0.0.#{counter}/32",
|
219
|
+
:tcp => "10.0.0.#{counter}/32",
|
220
|
+
'UDP' => "10.0.0.#{counter}/32",
|
221
|
+
nil => "10.0.0.#{counter}/32",
|
222
|
+
-1 => "10.0.0.#{counter}/32",
|
223
|
+
:"-1" => "10.0.0.#{counter}/32",
|
224
|
+
:all => ["10.0.0.#{counter}/32", "10.0.0.#{counter}/32"],
|
225
|
+
1200 => 'test_security_group',
|
226
|
+
1201 => test_security_group.aws_object.id,
|
227
|
+
1202 => test_security_group.aws_object,
|
228
|
+
1203 => test_security_group,
|
229
|
+
# cannot get the ID from the v1 api object
|
230
|
+
#1205 => testloadbalancer.aws_object.id,
|
231
|
+
1206 => testloadbalancer.aws_object,
|
232
|
+
# Cannot specify a LoadBalancer resource, only AwsLoadBalancer
|
233
|
+
#1207 => testloadbalancer,
|
234
|
+
1208 => {group_name: 'test_security_group'},
|
235
|
+
1209 => {load_balancer: 'testloadbalancer'},
|
236
|
+
1210 => {security_group: 'test_security_group'},
|
237
|
+
)
|
130
238
|
end
|
131
239
|
}.to create_an_aws_security_group('test_sg',
|
132
240
|
vpc_id: test_vpc.aws_object.id,
|
133
|
-
ip_permissions_list: [
|
134
|
-
{
|
241
|
+
ip_permissions_list: Set[
|
242
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.1/32"}, {:cidr_ip=>"10.0.0.11/32"}, {:cidr_ip=>"10.0.0.19/32"}, {:cidr_ip=>"10.0.0.2/32"}, {:cidr_ip=>"10.0.0.20/32"}, {:cidr_ip=>"10.0.0.3/32"}, {:cidr_ip=>"10.0.0.30/32"}, {:cidr_ip=>"10.0.0.32/32"}, {:cidr_ip=>"10.0.0.33/32"}, {:cidr_ip=>"10.0.0.34/32"}, {:cidr_ip=>"10.0.0.4/32"}, {:cidr_ip=>"10.0.0.5/32"}, {:cidr_ip=>"10.0.0.6/32"}], :ip_protocol=>"-1"},
|
243
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.17/32"}, {:cidr_ip=>"10.0.0.18/32"}, {:cidr_ip=>"10.0.0.22/32"}, {:cidr_ip=>"10.0.0.28/32"}, {:cidr_ip=>"10.0.0.31/32"}, {:cidr_ip=>"10.0.0.7/32"}], :ip_protocol=>"tcp", :from_port=>0, :to_port=>0},
|
244
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.8/32"}], :ip_protocol=>"udp", :from_port=>0, :to_port=>65535},
|
245
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.9/32"}], :ip_protocol=>"icmp", :from_port=>-1, :to_port=>-1},
|
246
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.10/32"}], :ip_protocol=>"icmp", :from_port=>1, :to_port=>2},
|
247
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.12/32"}], :ip_protocol=>"tcp", :from_port=>1012, :to_port=>1012},
|
248
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.13/32"}], :ip_protocol=>"tcp", :from_port=>1013, :to_port=>1013},
|
249
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.14/32"}], :ip_protocol=>"tcp", :from_port=>1014, :to_port=>1014},
|
250
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.15/32"}], :ip_protocol=>"tcp", :from_port=>1117, :to_port=>1117},
|
251
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.15/32"}], :ip_protocol=>"tcp", :from_port=>1015, :to_port=>1015},
|
252
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.15/32"}], :ip_protocol=>"tcp", :from_port=>1016, :to_port=>1016},
|
253
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.16/32"}, {:cidr_ip=>"10.0.0.26/32"}, {:cidr_ip=>"10.0.0.27/32"}], :ip_protocol=>"icmp", :from_port=>0, :to_port=>0},
|
254
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.21/32"}, {:cidr_ip=>"10.0.0.29/32"}], :ip_protocol=>"udp", :from_port=>0, :to_port=>0},
|
255
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.23/32"}], :ip_protocol=>"tcp", :from_port=>1020, :to_port=>1020},
|
256
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.24/32"}], :ip_protocol=>"tcp", :from_port=>1021, :to_port=>1023},
|
257
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.25/32"}], :ip_protocol=>"tcp", :from_port=>1024, :to_port=>1024},
|
258
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.25/32"}], :ip_protocol=>"tcp", :from_port=>1025, :to_port=>1025},
|
259
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.25/32"}], :ip_protocol=>"tcp", :from_port=>1125, :to_port=>1125},
|
260
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1200, :to_port=>1200},
|
261
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1201, :to_port=>1201},
|
262
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1202, :to_port=>1202},
|
263
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1203, :to_port=>1203},
|
264
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1206, :to_port=>1206},
|
265
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1208, :to_port=>1208},
|
266
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1209, :to_port=>1209},
|
267
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1210, :to_port=>1210}
|
135
268
|
],
|
136
|
-
ip_permissions_list_egress: [
|
269
|
+
ip_permissions_list_egress: Set[
|
270
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.35/32"}, {:cidr_ip=>"10.0.0.36/32"}, {:cidr_ip=>"10.0.0.37/32"}, {:cidr_ip=>"10.0.0.38/32"}, {:cidr_ip=>"10.0.0.39/32"}, {:cidr_ip=>"10.0.0.40/32"}, {:cidr_ip=>"10.0.0.44/32"}, {:cidr_ip=>"10.0.0.52/32"}, {:cidr_ip=>"10.0.0.53/32"}, {:cidr_ip=>"10.0.0.63/32"}, {:cidr_ip=>"10.0.0.65/32"}, {:cidr_ip=>"10.0.0.66/32"}, {:cidr_ip=>"10.0.0.67/32"}], :ip_protocol=>"-1"},
|
271
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.41/32"}], :ip_protocol=>"udp", :from_port=>0, :to_port=>65535},
|
272
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.42/32"}], :ip_protocol=>"icmp", :from_port=>-1, :to_port=>-1},
|
273
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.43/32"}], :ip_protocol=>"icmp", :from_port=>1, :to_port=>2},
|
274
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.45/32"}], :ip_protocol=>"tcp", :from_port=>1012, :to_port=>1012},
|
275
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.46/32"}], :ip_protocol=>"tcp", :from_port=>1013, :to_port=>1013},
|
276
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.47/32"}], :ip_protocol=>"tcp", :from_port=>1014, :to_port=>1014},
|
277
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.48/32"}], :ip_protocol=>"tcp", :from_port=>1015, :to_port=>1015},
|
278
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.48/32"}], :ip_protocol=>"tcp", :from_port=>1016, :to_port=>1016},
|
279
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.48/32"}], :ip_protocol=>"tcp", :from_port=>1117, :to_port=>1117},
|
280
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.49/32"}, {:cidr_ip=>"10.0.0.59/32"}, {:cidr_ip=>"10.0.0.60/32"}], :ip_protocol=>"icmp", :from_port=>0, :to_port=>0},
|
281
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.50/32"}, {:cidr_ip=>"10.0.0.51/32"}, {:cidr_ip=>"10.0.0.55/32"}, {:cidr_ip=>"10.0.0.61/32"}, {:cidr_ip=>"10.0.0.64/32"}], :ip_protocol=>"tcp", :from_port=>0, :to_port=>0},
|
282
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.54/32"}, {:cidr_ip=>"10.0.0.62/32"}], :ip_protocol=>"udp", :from_port=>0, :to_port=>0},
|
283
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.56/32"}], :ip_protocol=>"tcp", :from_port=>1020, :to_port=>1020},
|
284
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.57/32"}], :ip_protocol=>"tcp", :from_port=>1021, :to_port=>1023},
|
285
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.58/32"}], :ip_protocol=>"tcp", :from_port=>1024, :to_port=>1024},
|
286
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.58/32"}], :ip_protocol=>"tcp", :from_port=>1025, :to_port=>1025},
|
287
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.58/32"}], :ip_protocol=>"tcp", :from_port=>1125, :to_port=>1125},
|
288
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1200, :to_port=>1200},
|
289
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1201, :to_port=>1201},
|
290
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1202, :to_port=>1202},
|
291
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1203, :to_port=>1203},
|
292
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1206, :to_port=>1206},
|
293
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1208, :to_port=>1208},
|
294
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1209, :to_port=>1209},
|
295
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1210, :to_port=>1210}
|
296
|
+
]
|
137
297
|
).and be_idempotent
|
138
298
|
end
|
139
299
|
|
140
|
-
it "
|
300
|
+
it "can specify rules as a hash" do
|
141
301
|
expect_recipe {
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
302
|
+
aws_security_group 'test_sg' do
|
303
|
+
# We need to define a list of ports and its easier to use a method than
|
304
|
+
# have to add a new number when changing this test
|
305
|
+
def counter()
|
306
|
+
@ip_counter ||= 0
|
307
|
+
@ip_counter += 1
|
308
|
+
end
|
309
|
+
|
310
|
+
vpc 'test_vpc'
|
311
|
+
inbound_rules([
|
312
|
+
{ sources: "10.0.0.#{counter}/32", port_range: -1..-1, protocol: -1 },
|
313
|
+
{ sources: "10.0.0.#{counter}/32", port: -1, protocol: -1 },
|
314
|
+
{ sources: "10.0.0.#{counter}/32", port: 1002, protocol: -1 },
|
315
|
+
{ sources: "10.0.0.#{counter}/32", ports: 1003..1003, protocol: -1 },
|
316
|
+
{ sources: "10.0.0.#{counter}/32", port_range: 1004..1005, protocol: -1 },
|
317
|
+
{ sources: "10.0.0.#{counter}/32", port_range: [1006, 1007, 1108], protocol: -1 },
|
318
|
+
# If the protocol isn't `-1` and you don't specify all the ports
|
319
|
+
# aws wants `port_range` to be nil
|
320
|
+
{ sources: "10.0.0.#{counter}/32", ports: nil, protocol: :tcp },
|
321
|
+
{ sources: "10.0.0.#{counter}/32", port_range: 0..65535, protocol: :udp },
|
322
|
+
{ sources: "10.0.0.#{counter}/32", port_range: -1, protocol: :icmp },
|
323
|
+
{ sources: "10.0.0.#{counter}/32", port_range: 1..2, protocol: :icmp },
|
324
|
+
{ sources: "10.0.0.#{counter}/32", port_range: 1011, protocol: :any },
|
325
|
+
{ sources: "10.0.0.#{counter}/32", port_range: 1012, protocol: nil },
|
326
|
+
{ sources: "10.0.0.#{counter}/32", port: 1013 },
|
327
|
+
{ sources: "10.0.0.#{counter}/32", port: 1014..1014 },
|
328
|
+
{ sources: "10.0.0.#{counter}/32", port: [1015, 1016, 1117] },
|
329
|
+
{ sources: "10.0.0.#{counter}/32", port: :icmp },
|
330
|
+
{ sources: "10.0.0.#{counter}/32", port: 'tCp' },
|
331
|
+
{ sources: "10.0.0.#{counter}/32", port: nil },
|
332
|
+
{ sources: "10.0.0.#{counter}/32", protocol: -1 },
|
333
|
+
{ sources: "10.0.0.#{counter}/32", protocol: :any },
|
334
|
+
{ sources: "10.0.0.#{counter}/32", protocol: 'UDP' },
|
335
|
+
{ sources: "10.0.0.#{counter}/32", protocol: nil },
|
336
|
+
{ sources: "10.0.0.#{counter}/32", port_range: 1020 },
|
337
|
+
{ sources: "10.0.0.#{counter}/32", port_range: 1021..1023 },
|
338
|
+
{ sources: "10.0.0.#{counter}/32", port_range: [1024, 1025, 1125] },
|
339
|
+
{ sources: "10.0.0.#{counter}/32", port_range: :icmp },
|
340
|
+
{ sources: "10.0.0.#{counter}/32", port_range: 'Icmp' },
|
341
|
+
{ sources: "10.0.0.#{counter}/32", port_range: :tcp },
|
342
|
+
{ sources: "10.0.0.#{counter}/32", port_range: 'UDP' },
|
343
|
+
{ sources: "10.0.0.#{counter}/32", port_range: nil },
|
344
|
+
{ sources: "10.0.0.#{counter}/32", port_range: -1 },
|
345
|
+
{ sources: "10.0.0.#{counter}/32", port_range: :"-1" },
|
346
|
+
{ sources: ["10.0.0.#{counter}/32", "10.0.0.#{counter}/32"], port_range: :all },
|
347
|
+
{ sources: 'test_security_group', port: 1200 },
|
348
|
+
{ sources: test_security_group.aws_object.id, port: 1201 },
|
349
|
+
{ sources: test_security_group.aws_object, port: 1202 },
|
350
|
+
{ sources: test_security_group, port: 1203 },
|
351
|
+
# cannot get the ID from the v1 api object
|
352
|
+
#testloadbalancer.aws_object.id => 1205,
|
353
|
+
{ sources: testloadbalancer.aws_object, port: 1206 },
|
354
|
+
# Cannot specify a LoadBalancer resource, only AwsLoadBalancer
|
355
|
+
#testloadbalancer => 1207,
|
356
|
+
{ sources: {group_name: 'test_security_group'}, port: 1208 },
|
357
|
+
{ sources: {load_balancer: 'testloadbalancer'}, port: 1209 },
|
358
|
+
{ sources: {security_group: 'test_security_group'}, port: 1210 },
|
359
|
+
])
|
360
|
+
outbound_rules([
|
361
|
+
{ port_range: -1..-1, protocol: -1, destinations: "10.0.0.#{counter}/32" },
|
362
|
+
{ port: -1, protocol: -1, destinations: "10.0.0.#{counter}/32" },
|
363
|
+
{ port: 1002, protocol: -1, destinations: "10.0.0.#{counter}/32" },
|
364
|
+
{ ports: 1003..1003, protocol: -1, destinations: "10.0.0.#{counter}/32" },
|
365
|
+
{ port_range: 1004..1005, protocol: -1, destinations: "10.0.0.#{counter}/32" },
|
366
|
+
{ port_range: [1006, 1007, 1108], protocol: -1, destinations: "10.0.0.#{counter}/32" },
|
367
|
+
# If the protocol isn't `-1` and you don't specify all the ports
|
368
|
+
# aws wants `port_range` to be nil{ ports: nil, protocol: :tcp } => "10.0.0.#{counter}/32",
|
369
|
+
{ port_range: 0..65535, protocol: :udp, destinations: "10.0.0.#{counter}/32" },
|
370
|
+
{ port_range: -1, protocol: :icmp, destinations: "10.0.0.#{counter}/32" },
|
371
|
+
{ port_range: 1..2, protocol: :icmp, destinations: "10.0.0.#{counter}/32" },
|
372
|
+
{ port_range: 1011, protocol: :any, destinations: "10.0.0.#{counter}/32" },
|
373
|
+
{ port_range: 1012, protocol: nil, destinations: "10.0.0.#{counter}/32" },
|
374
|
+
{ port: 1013, destinations: "10.0.0.#{counter}/32" },
|
375
|
+
{ port: 1014..1014, destinations: "10.0.0.#{counter}/32" },
|
376
|
+
{ port: [1015, 1016, 1117], destinations: "10.0.0.#{counter}/32" },
|
377
|
+
{ port: :icmp, destinations: "10.0.0.#{counter}/32" },
|
378
|
+
{ port: 'tCp', destinations: "10.0.0.#{counter}/32" },
|
379
|
+
{ port: nil, destinations: "10.0.0.#{counter}/32" },
|
380
|
+
{ protocol: -1, destinations: "10.0.0.#{counter}/32" },
|
381
|
+
{ protocol: :any, destinations: "10.0.0.#{counter}/32" },
|
382
|
+
{ protocol: 'UDP', destinations: "10.0.0.#{counter}/32" },
|
383
|
+
{ protocol: nil, destinations: "10.0.0.#{counter}/32" },
|
384
|
+
{ port_range: 1020, destinations: "10.0.0.#{counter}/32" },
|
385
|
+
{ port_range: 1021..1023, destinations: "10.0.0.#{counter}/32" },
|
386
|
+
{ port_range: [1024, 1025, 1125], destinations: "10.0.0.#{counter}/32" },
|
387
|
+
{ port_range: :icmp, destinations: "10.0.0.#{counter}/32" },
|
388
|
+
{ port_range: 'Icmp', destinations: "10.0.0.#{counter}/32" },
|
389
|
+
{ port_range: :tcp, destinations: "10.0.0.#{counter}/32" },
|
390
|
+
{ port_range: 'UDP', destinations: "10.0.0.#{counter}/32" },
|
391
|
+
{ port_range: nil, destinations: "10.0.0.#{counter}/32" },
|
392
|
+
{ port_range: -1, destinations: "10.0.0.#{counter}/32" },
|
393
|
+
{ port_range: :"-1", destinations: "10.0.0.#{counter}/32" },
|
394
|
+
{ port_range: :all, destinations: ["10.0.0.#{counter}/32", "10.0.0.#{counter}/32"] },
|
395
|
+
{ port: 1200, destinations: 'test_security_group' },
|
396
|
+
{ port: 1201, destinations: test_security_group.aws_object.id },
|
397
|
+
{ port: 1202, destinations: test_security_group.aws_object },
|
398
|
+
{ port: 1203, destinations: test_security_group },
|
399
|
+
# cannot get the ID from the v1 api object
|
400
|
+
#{ port: 1205, destinations: testloadbalancer.aws_object.id },
|
401
|
+
{ port: 1206, destinations: testloadbalancer.aws_object },
|
402
|
+
# Cannot specify a LoadBalancer resource, only AwsLoadBalancer
|
403
|
+
#{ port: 1207, destinations: testloadbalancer },
|
404
|
+
{ port: 1208, destinations: {group_name: 'test_security_group'} },
|
405
|
+
{ port: 1209, destinations: {load_balancer: 'testloadbalancer'} },
|
406
|
+
{ port: 1210, destinations: {security_group: 'test_security_group'} },
|
407
|
+
])
|
408
|
+
end
|
147
409
|
}.to create_an_aws_security_group('test_sg',
|
148
410
|
vpc_id: test_vpc.aws_object.id,
|
149
|
-
ip_permissions_list: [
|
150
|
-
{
|
411
|
+
ip_permissions_list: Set[
|
412
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.1/32"}, {:cidr_ip=>"10.0.0.11/32"}, {:cidr_ip=>"10.0.0.19/32"}, {:cidr_ip=>"10.0.0.2/32"}, {:cidr_ip=>"10.0.0.20/32"}, {:cidr_ip=>"10.0.0.3/32"}, {:cidr_ip=>"10.0.0.32/32"}, {:cidr_ip=>"10.0.0.33/32"}, {:cidr_ip=>"10.0.0.34/32"}, {:cidr_ip=>"10.0.0.4/32"}, {:cidr_ip=>"10.0.0.5/32"}, {:cidr_ip=>"10.0.0.6/32"}], :ip_protocol=>"-1"},
|
413
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.17/32"}, {:cidr_ip=>"10.0.0.18/32"}, {:cidr_ip=>"10.0.0.22/32"}, {:cidr_ip=>"10.0.0.28/32"}, {:cidr_ip=>"10.0.0.30/32"}, {:cidr_ip=>"10.0.0.31/32"}, {:cidr_ip=>"10.0.0.7/32"}], :ip_protocol=>"tcp", :from_port=>0, :to_port=>0},
|
414
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.8/32"}], :ip_protocol=>"udp", :from_port=>0, :to_port=>65535},
|
415
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.9/32"}], :ip_protocol=>"icmp", :from_port=>-1, :to_port=>-1},
|
416
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.10/32"}], :ip_protocol=>"icmp", :from_port=>1, :to_port=>2},
|
417
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.12/32"}], :ip_protocol=>"tcp", :from_port=>1012, :to_port=>1012},
|
418
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.13/32"}], :ip_protocol=>"tcp", :from_port=>1013, :to_port=>1013},
|
419
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.14/32"}], :ip_protocol=>"tcp", :from_port=>1014, :to_port=>1014},
|
420
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.15/32"}], :ip_protocol=>"tcp", :from_port=>1117, :to_port=>1117},
|
421
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.15/32"}], :ip_protocol=>"tcp", :from_port=>1015, :to_port=>1015},
|
422
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.15/32"}], :ip_protocol=>"tcp", :from_port=>1016, :to_port=>1016},
|
423
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.16/32"}, {:cidr_ip=>"10.0.0.26/32"}, {:cidr_ip=>"10.0.0.27/32"}], :ip_protocol=>"icmp", :from_port=>0, :to_port=>0},
|
424
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.21/32"}, {:cidr_ip=>"10.0.0.29/32"}], :ip_protocol=>"udp", :from_port=>0, :to_port=>0},
|
425
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.23/32"}], :ip_protocol=>"tcp", :from_port=>1020, :to_port=>1020},
|
426
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.24/32"}], :ip_protocol=>"tcp", :from_port=>1021, :to_port=>1023},
|
427
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.25/32"}], :ip_protocol=>"tcp", :from_port=>1024, :to_port=>1024},
|
428
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.25/32"}], :ip_protocol=>"tcp", :from_port=>1025, :to_port=>1025},
|
429
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.25/32"}], :ip_protocol=>"tcp", :from_port=>1125, :to_port=>1125},
|
430
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1200, :to_port=>1200},
|
431
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1201, :to_port=>1201},
|
432
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1202, :to_port=>1202},
|
433
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1203, :to_port=>1203},
|
434
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1206, :to_port=>1206},
|
435
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1208, :to_port=>1208},
|
436
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1209, :to_port=>1209},
|
437
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1210, :to_port=>1210}
|
151
438
|
],
|
152
|
-
ip_permissions_list_egress: [
|
439
|
+
ip_permissions_list_egress: Set[
|
440
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.35/32"}, {:cidr_ip=>"10.0.0.36/32"}, {:cidr_ip=>"10.0.0.37/32"}, {:cidr_ip=>"10.0.0.38/32"}, {:cidr_ip=>"10.0.0.39/32"}, {:cidr_ip=>"10.0.0.40/32"}, {:cidr_ip=>"10.0.0.44/32"}, {:cidr_ip=>"10.0.0.52/32"}, {:cidr_ip=>"10.0.0.53/32"}, {:cidr_ip=>"10.0.0.65/32"}, {:cidr_ip=>"10.0.0.66/32"}, {:cidr_ip=>"10.0.0.67/32"}], :ip_protocol=>"-1"},
|
441
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.41/32"}], :ip_protocol=>"udp", :from_port=>0, :to_port=>65535},
|
442
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.42/32"}], :ip_protocol=>"icmp", :from_port=>-1, :to_port=>-1},
|
443
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.43/32"}], :ip_protocol=>"icmp", :from_port=>1, :to_port=>2},
|
444
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.45/32"}], :ip_protocol=>"tcp", :from_port=>1012, :to_port=>1012},
|
445
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.46/32"}], :ip_protocol=>"tcp", :from_port=>1013, :to_port=>1013},
|
446
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.47/32"}], :ip_protocol=>"tcp", :from_port=>1014, :to_port=>1014},
|
447
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.48/32"}], :ip_protocol=>"tcp", :from_port=>1015, :to_port=>1015},
|
448
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.48/32"}], :ip_protocol=>"tcp", :from_port=>1016, :to_port=>1016},
|
449
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.48/32"}], :ip_protocol=>"tcp", :from_port=>1117, :to_port=>1117},
|
450
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.49/32"}, {:cidr_ip=>"10.0.0.59/32"}, {:cidr_ip=>"10.0.0.60/32"}], :ip_protocol=>"icmp", :from_port=>0, :to_port=>0},
|
451
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.50/32"}, {:cidr_ip=>"10.0.0.51/32"}, {:cidr_ip=>"10.0.0.55/32"}, {:cidr_ip=>"10.0.0.61/32"}, {:cidr_ip=>"10.0.0.63/32"}, {:cidr_ip=>"10.0.0.64/32"}], :ip_protocol=>"tcp", :from_port=>0, :to_port=>0},
|
452
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.54/32"}, {:cidr_ip=>"10.0.0.62/32"}], :ip_protocol=>"udp", :from_port=>0, :to_port=>0},
|
453
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.56/32"}], :ip_protocol=>"tcp", :from_port=>1020, :to_port=>1020},
|
454
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.57/32"}], :ip_protocol=>"tcp", :from_port=>1021, :to_port=>1023},
|
455
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.58/32"}], :ip_protocol=>"tcp", :from_port=>1024, :to_port=>1024},
|
456
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.58/32"}], :ip_protocol=>"tcp", :from_port=>1025, :to_port=>1025},
|
457
|
+
{:groups=>[], :ip_ranges=>Set[{:cidr_ip=>"10.0.0.58/32"}], :ip_protocol=>"tcp", :from_port=>1125, :to_port=>1125},
|
458
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1200, :to_port=>1200},
|
459
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1201, :to_port=>1201},
|
460
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1202, :to_port=>1202},
|
461
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1203, :to_port=>1203},
|
462
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1206, :to_port=>1206},
|
463
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1208, :to_port=>1208},
|
464
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1209, :to_port=>1209},
|
465
|
+
{:groups=>[{:group_id=>test_security_group.aws_object.id}], :ip_ranges=>[], :ip_protocol=>"tcp", :from_port=>1210, :to_port=>1210}
|
466
|
+
]
|
153
467
|
).and be_idempotent
|
154
468
|
end
|
155
469
|
end
|
@@ -302,9 +302,11 @@ describe Chef::Resource::LoadBalancer do
|
|
302
302
|
})
|
303
303
|
machines ['test_load_balancer_machine1', test_load_balancer_machine2.aws_object.id]
|
304
304
|
end
|
305
|
-
}.to create_an_aws_load_balancer('test-load-balancer'
|
306
|
-
|
307
|
-
|
305
|
+
}.to create_an_aws_load_balancer('test-load-balancer') { |aws_object|
|
306
|
+
instances = aws_object.instances
|
307
|
+
ids = instances.map {|i| i.id}
|
308
|
+
expect(ids.to_set).to eq([test_load_balancer_machine1.aws_object.id, test_load_balancer_machine2.aws_object.id].to_set)
|
309
|
+
}.and be_idempotent
|
308
310
|
end
|
309
311
|
|
310
312
|
context "with an existing load_balancer with machine1 attached" do
|
@@ -7,7 +7,8 @@ describe Chef::Resource::MachineImage do
|
|
7
7
|
with_aws "with a VPC and a public subnet" do
|
8
8
|
before :all do
|
9
9
|
chef_config[:log_level] = :warn
|
10
|
-
|
10
|
+
chef_config[:include_output_after_example] = true
|
11
|
+
Chef::Config.chef_provisioning[:machine_max_wait_time] = 300
|
11
12
|
Chef::Config.chef_provisioning[:image_max_wait_time] = 600
|
12
13
|
end
|
13
14
|
|
@@ -21,6 +22,9 @@ describe Chef::Resource::MachineImage do
|
|
21
22
|
subnet_id: 'test_public_subnet',
|
22
23
|
key_name: 'test_key_pair',
|
23
24
|
instance_type: 'm3.medium'
|
25
|
+
},
|
26
|
+
ssh_options: {
|
27
|
+
timeout: 60
|
24
28
|
}
|
25
29
|
end
|
26
30
|
}.to create_an_aws_image('test_machine_image',
|
@@ -36,6 +40,9 @@ describe Chef::Resource::MachineImage do
|
|
36
40
|
subnet_id: 'test_public_subnet',
|
37
41
|
key_name: 'test_key_pair',
|
38
42
|
instance_type: 'm3.medium'
|
43
|
+
},
|
44
|
+
ssh_options: {
|
45
|
+
timeout: 60
|
39
46
|
}
|
40
47
|
end
|
41
48
|
}
|
@@ -70,6 +77,9 @@ describe Chef::Resource::MachineImage do
|
|
70
77
|
machine_options bootstrap_options: {
|
71
78
|
key_name: 'test_key_pair',
|
72
79
|
instance_type: 'm3.medium'
|
80
|
+
},
|
81
|
+
ssh_options: {
|
82
|
+
timeout: 60
|
73
83
|
}
|
74
84
|
aws_tags key1: "value"
|
75
85
|
end
|
@@ -86,6 +96,9 @@ describe Chef::Resource::MachineImage do
|
|
86
96
|
machine_options bootstrap_options: {
|
87
97
|
key_name: 'test_key_pair',
|
88
98
|
instance_type: 'm3.medium'
|
99
|
+
},
|
100
|
+
ssh_options: {
|
101
|
+
timeout: 60
|
89
102
|
}
|
90
103
|
aws_tags key1: "value"
|
91
104
|
end
|
@@ -188,10 +188,14 @@ describe Chef::Resource::Machine do
|
|
188
188
|
|
189
189
|
context "with a placement group" do
|
190
190
|
before(:context) {
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
191
|
+
begin
|
192
|
+
driver.ec2_client.create_placement_group({
|
193
|
+
group_name: "agroup",
|
194
|
+
strategy: "cluster"
|
195
|
+
})
|
196
|
+
rescue Aws::EC2::Errors::InvalidPlacementGroupDuplicate
|
197
|
+
# We don't need to create it because it already exists
|
198
|
+
end
|
195
199
|
}
|
196
200
|
|
197
201
|
# Must do after the context so we have waited for the instance to terminate
|
@@ -293,6 +297,46 @@ describe Chef::Resource::Machine do
|
|
293
297
|
).and be_idempotent
|
294
298
|
end
|
295
299
|
|
300
|
+
context "with an existing machine", :super_slow do
|
301
|
+
machine 'test_machine' do
|
302
|
+
machine_options bootstrap_options: {
|
303
|
+
subnet_id: 'test_public_subnet',
|
304
|
+
key_name: 'test_key_pair'
|
305
|
+
}
|
306
|
+
action :allocate
|
307
|
+
end
|
308
|
+
|
309
|
+
it "stops the machine with the :stop action" do
|
310
|
+
expect_recipe {
|
311
|
+
machine 'test_machine' do
|
312
|
+
action :stop
|
313
|
+
end
|
314
|
+
}.to update_an_aws_instance('test_machine',
|
315
|
+
state: {:name => "stopped"}
|
316
|
+
).and be_idempotent
|
317
|
+
end
|
318
|
+
|
319
|
+
it "starts a machine that has been stopped" do
|
320
|
+
expect_recipe {
|
321
|
+
machine 'test_machine' do
|
322
|
+
action :stop
|
323
|
+
end
|
324
|
+
machine 'test_machine' do
|
325
|
+
action :ready
|
326
|
+
end
|
327
|
+
}.to update_an_aws_instance('test_machine',
|
328
|
+
state: {:name => "running"}
|
329
|
+
)
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
it "doesn't create a machine if the initial action is :stop", :super_slow do
|
334
|
+
expect_recipe {
|
335
|
+
machine 'test_machine' do
|
336
|
+
action :stop
|
337
|
+
end
|
338
|
+
}.not_to create_an_aws_instance('test_machine')
|
339
|
+
end
|
296
340
|
end
|
297
341
|
|
298
342
|
with_aws "Without a VPC" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-provisioning-aws
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Ewart
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chef-provisioning
|
@@ -190,6 +190,7 @@ files:
|
|
190
190
|
- LICENSE
|
191
191
|
- README.md
|
192
192
|
- Rakefile
|
193
|
+
- chef-provisioning-aws.gemspec
|
193
194
|
- lib/chef/provider/aws_auto_scaling_group.rb
|
194
195
|
- lib/chef/provider/aws_cache_cluster.rb
|
195
196
|
- lib/chef/provider/aws_cache_replication_group.rb
|