chef-provisioning-aws 1.1.1 → 1.2.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
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9a8ee86c530dd398dad4b925b119b8d88db9f55a
4
- data.tar.gz: 367430b7e0cdee74064297461617a9545c9c1aa1
3
+ metadata.gz: c249f182469f97f148ae38d524c4d968cdd8f1e3
4
+ data.tar.gz: da61c4cfe294ca2f50605e63ff77042feffb1b74
5
5
  SHA512:
6
- metadata.gz: 76da770b34ea861319e125e2125aee36d61b2ce47ed333a26aceae6939576c5f498d054b9f84eff7f1ad46b7d7ca61e6f5cbb5c236742dd761697b8b25eb50f1
7
- data.tar.gz: b0c8b49ae247b81214853e172b417c77ed40928da2903f6a4b79085bac2fb4cd91f108a827a9059d60259daa712b2084be4414dcd5202f1d37f1ce4649e98339
6
+ metadata.gz: 0cce99948b3f6f240fddae731ce3de418c9a239761a8a18776629e27e0b8c82843b202d4b91061d4cd002344c03e14ad36e02f6eecd4437fbbadd0347558affb
7
+ data.tar.gz: 28e75762b4b912ff030150ea2c9ca09290286b9eda36d6efbe0ed5e15b93f31ba16ffec6657220eabf0fbd85452a2ea9e8439cfd3f78082c10f7c1b6a2c230e6
data/README.md CHANGED
@@ -1,17 +1,190 @@
1
- # chef-provisioning-aws
1
+ # Chef Provisioning AWS
2
2
 
3
- An implementation of the AWS driver using the AWS Ruby SDK (v1). It also implements a large number of AWS-specific resources such as:
3
+ This README is a work in progress. Please add to it!
4
4
 
5
- * SQS Queues
6
- * SNS Topics
7
- * Elastic Load Balancers
8
- * VPCs
9
- * Security Groups
10
- * Instances
11
- * Images
12
- * Autoscaling Groups
13
- * SSH Key pairs
14
- * Launch configs
5
+ # Resources
6
+
7
+ TODO: List out weird/unique things about resources here. We don't need to document every resource
8
+ because users can look at the resource model.
9
+
10
+ ## aws_vpc
11
+
12
+ If you specify `internet_gateway true` the VPC will create and manage its own internet gateway.
13
+ Specifying `internet_gateway false` will delete that managed internet gateway.
14
+
15
+ Specifying `main_routes` without `main_route_table` will update the 'default' route table
16
+ that is created when AWS creates the VPC.
17
+
18
+ Specifying `main_route_table` without specifying `main_routes` will update the main route
19
+ association to point to the provided route table.
20
+
21
+ If you specify both `main_routes` and `main_route_table` we will update the `main_route_table`
22
+ to have the specified `main_routes`. IE, running
23
+
24
+ ```ruby
25
+ aws_route_table 'ref-main-route-table' do
26
+ vpc 'ref-vpc'
27
+ routes '0.0.0.0/0' => :internet_gateway
28
+ end
29
+
30
+ aws_vpc 'ref-vpc' do
31
+ main_route_table 'ref-main-route-table'
32
+ main_routes '0.0.0.0/1' => :internet_gateway
33
+ end
34
+
35
+ aws_vpc 'ref-vpc' do
36
+ main_routes '0.0.0.0/2' => :internet_gateway
37
+ end
38
+ ```
39
+
40
+ will cause resource flapping. The `ref-main-route-table` resource will set the routes to `/0`
41
+ and then the vpc will set the routes to `/1`. Then because `ref-main-route-table` is set
42
+ to the main route for `ref-vpc` the third resource will set the routes to `/2`.
43
+
44
+ The takeaway from this is that you should either specify `main_routes` on your VPC and only
45
+ manage the routes through that, OR only specify `main_route_table` and manage the routes
46
+ through the `aws_route_table` resource.
47
+
48
+ ### Purging
49
+
50
+ If you specify `action :purge` on the VPC it will attempt to delete ALL resources contained in this
51
+ VPC before deleting the actual VPC.
52
+
53
+ A potential danger of this is that it does not delete the data bag entries for tracked AWS objects.
54
+ If you `:purge` a VPC and it has `aws_route_table[ref-route]` in it, the data bag entry for
55
+ `ref-route` is not automatically destroyed. Purge is most useful for testing to ensure no objects
56
+ are left that AWS can charge for.
57
+
58
+ ## aws_key_pair
59
+
60
+ TODO - document how to specify an existing local key
61
+
62
+ ## Machine Options
63
+
64
+ You can pass machine options that will be used by `machine`, `machine_batch` and `machine_image` to
65
+ configure the machine. These are all the available options:
66
+
67
+ ```ruby
68
+ with_machine_options({
69
+ bootstrap_options: {
70
+ key_name: 'ref-key-pair',
71
+ ...
72
+ },
73
+ ...
74
+ })
75
+ ```
76
+
77
+ This options hash can be supplied to either `with_machine_options` or directly into the `machine_options`
78
+ attribute.
79
+
80
+ ## Looking up AWS objects
81
+
82
+ ### \#aws\_object
83
+
84
+ All chef-provisioning-aws resources have a `aws_object` method that will return the AWS object. The AWS
85
+ object won't exist until the resource converges, however. An example of how to do this looks like:
86
+
87
+ ```ruby
88
+ my_vpc = aws_vpc 'my_vpc' do
89
+ cidr_block '10.0.0.0/24'
90
+ main_routes '0.0.0.0/0' => :internet_gateway
91
+ internet_gateway true
92
+ end
93
+
94
+ my_sg = aws_security_group 'my_sg' do
95
+ vpc lazy { my_vpc.aws_object.id }
96
+ inbound_rules '0.0.0.0/0' => [ 22, 80 ]
97
+ end
98
+
99
+ my_subnet = aws_subnet 'my_subnet' do
100
+ vpc lazy { my_vpc.aws_object.id }
101
+ cidr_block '10.0.0.0/24'
102
+ availability_zone 'eu-west-1a'
103
+ map_public_ip_on_launch true
104
+ end
105
+
106
+ machine 'my_machine' do
107
+ machine_options(
108
+ lazy do
109
+ {
110
+ bootstrap_options: {
111
+ subnet_id: my_subnet.aws_object.id,
112
+ security_group_ids: [my_sg.aws_object.id]
113
+ }
114
+ }
115
+ end
116
+ )
117
+ end
118
+ ```
119
+
120
+ Note the use of the `lazy` attribute modifier. This is necessary because when the resources are compiled
121
+ the aws_objects do not exist yet, so we must wait to reference them until the converge phase.
122
+
123
+ ### \#lookup\_options
124
+
125
+ You have access to the aws object when necessary, but often it isn't needed. The above example is better
126
+ written as:
127
+
128
+ ```ruby
129
+ aws_vpc 'my_vpc' do
130
+ cidr_block '10.0.0.0/24'
131
+ main_routes '0.0.0.0/0' => :internet_gateway
132
+ internet_gateway true
133
+ end
134
+
135
+ aws_security_group 'my_sg' do
136
+ vpc 'my_vpc'
137
+ inbound_rules '0.0.0.0/0' => [ 22, 80 ]
138
+ end
139
+
140
+ aws_subnet 'my_subnet' do
141
+ vpc 'my_vpc'
142
+ cidr_block '10.0.0.0/24'
143
+ availability_zone 'eu-west-1a'
144
+ map_public_ip_on_launch true
145
+ end
146
+
147
+ machine 'my_machine' do
148
+ machine_options bootstrap_options: {
149
+ subnet_id: 'my_subnet',
150
+ security_group_ids: ['my_sg']
151
+ }
152
+ end
153
+ ```
154
+
155
+ When specifying `bootstrap_options` and any attributes which reference another aws resource, we
156
+ perform [lookup_options](https://github.com/chef/chef-provisioning-aws/blob/master/lib/chef/provisioning/aws_driver/aws_resource.rb#L63-L91).
157
+ This tries to turn elements with names like `vpc`, `security_group_ids`, `machines`, `launch_configurations`,
158
+ `load_balancers`, etc. to the correct AWS object.
159
+
160
+ ### Looking up chef-provisioning resources
161
+
162
+ The base chef-provisioning resources (machine, machine_batch, load_balancer, machine_image) don't
163
+ have the `aws_object` method defined on them because they are not `AWSResource` classes. To
164
+ look them up use the class method `get_aws_object` defined on the chef-provisioning-aws specific
165
+ resource:
166
+
167
+ ```ruby
168
+ machine_image 'my_image' do
169
+ ...
170
+ end
171
+
172
+ ruby_block "look up machine_image object" do
173
+ aws_object = Chef::Resource::AwsImage.get_aws_object(
174
+ 'my_image',
175
+ run_context: run_context,
176
+ driver: run_context.chef_provisioning.current_driver,
177
+ managed_entry_store: Chef::Provisioning.chef_managed_entry_store(self.chef_server)
178
+ )
179
+ end
180
+ ```
181
+
182
+ To look up a machine, use the `AwsInstance` class, to look up a load balancer use the `AwsLoadBalancer`
183
+ class, etc. The first parameter you pass should be the same resource name as used in the base
184
+ chef-provisioning resource.
185
+
186
+ Again, the AWS object will not exist until the converge phase, so the aws_object will only be
187
+ available using a `lazy` attribute modifier or in a `ruby_block`.
15
188
 
16
189
  # Running Integration Tests
17
190
 
@@ -30,3 +203,55 @@ you!
30
203
  If you find the tests leaving behind resources during normal conditions (IE, not when there is an
31
204
  unexpected exception) please file a bug. Most objects can be cleaned up by deleting the `test_vpc`
32
205
  from within the AWS browser console.
206
+
207
+ # Tagging Resources
208
+
209
+ ## Aws Resources
210
+
211
+ All resources which extend Chef::Provisioning::AWSDriver::AWSResourceWithEntry support the ability
212
+ to add tags, except AwsEipAddress. AWS does not support tagging on AwsEipAddress. To add a tag
213
+ to any aws resource, us the `aws_tags` attribute and provide it a hash:
214
+
215
+ ```ruby
216
+ aws_ebs_volume 'ref-volume' do
217
+ aws_tags company: 'my_company', 'key_as_string' => :value_as_symbol
218
+ end
219
+
220
+ aws_vpc 'ref-vpc' do
221
+ aws_tags 'Name' => 'custom-vpc-name'
222
+ end
223
+ ```
224
+
225
+ The hash of tags can use symbols or strings for both keys and values. The tags will be converged
226
+ idempotently, meaning no write will occur if no tags are changing.
227
+
228
+ We will not touch the `'Name'` tag UNLESS you specifically pass it. If you do not pass it, we
229
+ leave it alone.
230
+
231
+ ## Base Resources
232
+
233
+ Because base resources from chef-provisioning do not have the `aws_tag` attribute, they must be
234
+ tagged in their options:
235
+
236
+ ```ruby
237
+ machine 'ref-machine-1' do
238
+ machine_options :aws_tags => {:marco => 'polo', :happyhappy => 'joyjoy'}
239
+ end
240
+
241
+ machine_batch "ref-batch" do
242
+ machine 'ref-machine-2' do
243
+ machine_options :aws_tags => {:marco => 'polo', :happyhappy => 'joyjoy'}
244
+ converge false
245
+ end
246
+ machine 'ref-machine-3' do
247
+ machine_options :aws_tags => {:othercustomtags => 'byebye'}
248
+ converge false
249
+ end
250
+ end
251
+
252
+ load_balancer 'ref-elb' do
253
+ load_balancer_options :aws_tags => {:marco => 'polo', :happyhappy => 'joyjoy'}
254
+ end
255
+ ```
256
+
257
+ See `docs/examples/aws_tags.rb` for further examples.
@@ -1,4 +1,5 @@
1
1
  require 'chef/provisioning/aws_driver/aws_provider'
2
+ require 'retryable'
2
3
 
3
4
  class Chef::Provider::AwsDhcpOptions < Chef::Provisioning::AWSDriver::AWSProvider
4
5
  protected
@@ -11,7 +12,9 @@ class Chef::Provider::AwsDhcpOptions < Chef::Provisioning::AWSDriver::AWSProvide
11
12
 
12
13
  converge_by "create new dhcp_options #{new_resource.name} in #{region}" do
13
14
  dhcp_options = new_resource.driver.ec2.dhcp_options.create(options)
14
- dhcp_options.tags['Name'] = new_resource.name
15
+ Retryable.retryable(:tries => 15, :sleep => 1, :on => AWS::EC2::Errors::InvalidDhcpOptionsID::NotFound) do
16
+ dhcp_options.tags['Name'] = new_resource.name
17
+ end
15
18
  dhcp_options
16
19
  end
17
20
  end
@@ -2,7 +2,7 @@ require 'chef/provisioning/aws_driver/aws_provider'
2
2
 
3
3
  class Chef::Provider::AwsLoadBalancer < Chef::Provisioning::AWSDriver::AWSProvider
4
4
  def destroy_aws_object(load_balancer)
5
- converge_by "delete load balancer #{new_resource.name} (#{load_balancer.id}) in VPC #{load_balancer.vpc.id} in #{region}" do
5
+ converge_by "delete load balancer #{new_resource.name} (#{load_balancer.name}) in #{region}" do
6
6
  load_balancer.delete
7
7
  end
8
8
  end
@@ -1,4 +1,5 @@
1
1
  require 'chef/provisioning/aws_driver/aws_provider'
2
+ require 'retryable'
2
3
 
3
4
  class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
4
5
 
@@ -6,8 +7,10 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
6
7
  route_table = super
7
8
 
8
9
  if !new_resource.routes.nil?
9
- update_routes(vpc, route_table)
10
+ update_routes(vpc, route_table, new_resource.ignore_route_targets)
10
11
  end
12
+
13
+ update_virtual_private_gateways(route_table, new_resource.virtual_private_gateways)
11
14
  end
12
15
 
13
16
  protected
@@ -20,7 +23,9 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
20
23
 
21
24
  converge_by "create new route table #{new_resource.name} in VPC #{new_resource.vpc} (#{vpc.id}) and region #{region}" do
22
25
  route_table = new_resource.driver.ec2.route_tables.create(options)
23
- route_table.tags['Name'] = new_resource.name
26
+ Retryable.retryable(:tries => 15, :sleep => 1, :on => AWS::EC2::Errors::InvalidRouteTableID::NotFound) do
27
+ route_table.tags['Name'] = new_resource.name
28
+ end
24
29
  route_table
25
30
  end
26
31
  end
@@ -31,14 +36,18 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
31
36
  if new_resource.vpc
32
37
  desired_vpc = Chef::Resource::AwsVpc.get_aws_object(new_resource.vpc, resource: new_resource)
33
38
  if vpc != desired_vpc
34
- raise "VPC of route table #{new_resource.name} (#{route_table.id}) is #{route_table.vpc.id}, but desired vpc is #{new_resource.vpc}! Moving (or rather, recreating) a route table is not yet supported."
39
+ raise "VPC of route table #{new_resource.to_s} is #{route_table.vpc.id}, but desired vpc is #{new_resource.vpc}! The AWS SDK does not support updating the main route table except by creating a new route table."
35
40
  end
36
41
  end
37
42
  end
38
43
 
39
44
  def destroy_aws_object(route_table)
40
- converge_by "delete route table #{new_resource.name} (#{route_table.id}) in #{region}" do
41
- route_table.delete
45
+ converge_by "delete #{new_resource.to_s} in #{region}" do
46
+ begin
47
+ route_table.delete
48
+ rescue AWS::EC2::Errors::DependencyViolation
49
+ raise "#{new_resource.to_s} could not be deleted because it is the main route table for #{route_table.vpc.id} or it is being used by a subnet"
50
+ end
42
51
  end
43
52
  end
44
53
 
@@ -46,12 +55,13 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
46
55
 
47
56
  attr_accessor :vpc
48
57
 
49
- def update_routes(vpc, route_table)
58
+ def update_routes(vpc, route_table, ignore_route_targets = [])
50
59
  # Collect current routes
51
60
  current_routes = {}
52
61
  route_table.routes.each do |route|
53
62
  # Ignore the automatic local route
54
63
  next if route.target.id == 'local'
64
+ next if ignore_route_targets.find { |target| route.target.id.match(/#{target}/) }
55
65
  current_routes[route.destination_cidr_block] = route
56
66
  end
57
67
 
@@ -82,6 +92,30 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
82
92
  end
83
93
  end
84
94
 
95
+ def update_virtual_private_gateways(route_table, gateway_ids)
96
+ current_propagating_vgw_set = route_table.client.describe_route_tables(route_table_ids: [route_table.id]).route_table_set.first.propagating_vgw_set
97
+
98
+ # Add propagated routes
99
+ if gateway_ids
100
+ gateway_ids.each do |gateway_id|
101
+ if !current_propagating_vgw_set.reject! { |vgw_set| vgw_set[:gateway_id] == gateway_id }
102
+ action_handler.perform_action "enable route propagation for route table #{route_table.id} to virtual private gateway #{gateway_id}" do
103
+ route_table.client.enable_vgw_route_propagation(route_table_id: route_table.id, gateway_id: gateway_id)
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ # Delete anything that's left
110
+ if current_propagating_vgw_set
111
+ current_propagating_vgw_set.each do |vgw_set|
112
+ action_handler.perform_action "disabling route propagation for route table #{route_table.id} from virtual private gateway #{vgw_set[:gateway_id]}" do
113
+ route_table.client.disable_vgw_route_propagation(route_table_id: route_table.id, gateway_id: vgw_set[:gateway_id])
114
+ end
115
+ end
116
+ end
117
+ end
118
+
85
119
  def get_route_target(vpc, route_target)
86
120
  case route_target
87
121
  when :internet_gateway
@@ -38,7 +38,7 @@ class Chef::Provider::AwsSecurityGroup < Chef::Provisioning::AWSDriver::AWSProvi
38
38
  end
39
39
 
40
40
  def destroy_aws_object(sg)
41
- converge_by "Deleting SG #{new_resource.name} in #{region}" do
41
+ converge_by "delete #{new_resource.to_s} in #{region}" do
42
42
  sg.delete
43
43
  end
44
44
  end
@@ -61,8 +61,15 @@ class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
61
61
  end
62
62
  end
63
63
  end
64
+ p.parallel_do(subnet.network_interfaces.to_a) do |network|
65
+ Cheffish.inline_resource(self, action) do
66
+ aws_network_interface network do
67
+ action :purge
68
+ end
69
+ end
70
+ end
64
71
  end
65
- converge_by "delete subnet #{new_resource.name} in VPC #{new_resource.vpc} in #{region}" do
72
+ converge_by "delete #{new_resource.to_s} in VPC #{new_resource.vpc} in #{region}" do
66
73
  # If the subnet doesn't exist we can't check state on it - state can only be :pending or :available
67
74
  begin
68
75
  subnet.delete
@@ -1,5 +1,7 @@
1
1
  require 'chef/provisioning/aws_driver/aws_provider'
2
2
  require 'date'
3
+ require 'chef/provisioning'
4
+ require 'retryable'
3
5
 
4
6
  class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
5
7
 
@@ -18,12 +20,12 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
18
20
 
19
21
  # Replace the main route table for the VPC
20
22
  if !new_resource.main_route_table.nil?
21
- main_route_table = update_main_route_table(vpc)
23
+ update_main_route_table(vpc)
22
24
  end
23
25
 
24
26
  # Update the main route table
25
27
  if !new_resource.main_routes.nil?
26
- update_main_routes(vpc, main_route_table)
28
+ update_main_routes(vpc, new_resource.main_route_table)
27
29
  end
28
30
 
29
31
  # Update DHCP options
@@ -57,7 +59,7 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
57
59
  def destroy_aws_object(vpc)
58
60
  if purging
59
61
  vpc.subnets.each do |s|
60
- Cheffish.inline_resource(self, action) do # if action isn't defined, we want :purge
62
+ Cheffish.inline_resource(self, action) do
61
63
  aws_subnet s do
62
64
  action :purge
63
65
  end
@@ -66,27 +68,49 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
66
68
  # If any of the below resources start needing complicated delete logic (dependent resources needing to
67
69
  # be deleted) move that logic into `delete_aws_resource` and add the purging logic to the resource
68
70
  vpc.network_acls.each { |o| o.delete unless o.default? }
69
- vpc.network_interfaces.each { |o| o.delete }
70
- vpc.route_tables.each { |o| o.delete unless o.main? }
71
- vpc.security_groups.each { |o| o.delete unless o.name == 'default' }
71
+ vpc.network_interfaces.each do |ni|
72
+ Cheffish.inline_resource(self, action) do
73
+ aws_network_interface ni do
74
+ action :purge
75
+ end
76
+ end
77
+ end
78
+ vpc.route_tables.each do |rt|
79
+ unless rt.main?
80
+ Cheffish.inline_resource(self, action) do
81
+ aws_route_table rt do
82
+ action :purge
83
+ end
84
+ end
85
+ end
86
+ end
87
+ vpc.security_groups.each do |sg|
88
+ unless sg.name == 'default'
89
+ Cheffish.inline_resource(self, action) do
90
+ aws_security_group sg do
91
+ action :purge
92
+ end
93
+ end
94
+ end
95
+ end
72
96
  end
73
97
 
74
98
  # Detach or destroy the internet gateway
75
99
  ig = vpc.internet_gateway
76
100
  if ig
77
- converge_by "detach Internet Gateway #{ig.id} in #{region} from VPC #{new_resource.name} (#{vpc.id}" do
101
+ converge_by "detach Internet Gateway #{ig.id} in #{region} from #{new_resource.to_s}" do
78
102
  ig.detach(vpc.id)
79
103
  end
80
104
  if ig.tags['OwnedByVPC'] == vpc.id
81
- converge_by "destroy Internet Gateway #{ig.id} in #{region} (owned by VPC #{new_resource.name} (#{vpc.id}))" do
105
+ converge_by "destroy Internet Gateway #{ig.id} in #{region} (owned by #{new_resource.to_s})" do
82
106
  ig.delete
83
107
  end
84
108
  end
85
109
  end
86
110
 
87
- # TODO delete main route table & routes if they exist and we created them
111
+ # We cannot delete the main route table, and it will be deleted when the VPC is deleted anyways
88
112
 
89
- converge_by "delete VPC #{new_resource.name} (#{vpc.id}) in #{region}" do
113
+ converge_by "delete #{new_resource.to_s} in #{region}" do
90
114
  vpc.delete
91
115
  end
92
116
  end
@@ -140,6 +164,9 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
140
164
  if !current_ig
141
165
  converge_by "attach new Internet Gateway to VPC #{vpc.id}" do
142
166
  current_ig = AWS.ec2(config: vpc.config).internet_gateways.create
167
+ Retryable.retryable(:tries => 15, :sleep => 1, :matching => /never obtained existence/) do
168
+ raise "internet gateway for VPC #{vpc.id} never obtained existence" unless current_ig.exists?
169
+ end
143
170
  action_handler.report_progress "create Internet Gateway #{current_ig.id}"
144
171
  current_ig.tags['OwnedByVPC'] = vpc.id
145
172
  action_handler.report_progress "tag Internet Gateway #{current_ig.id} as OwnedByVpc: #{vpc.id}"
@@ -166,22 +193,27 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
166
193
  if current_route_table != desired_route_table
167
194
  main_association = current_route_table.associations.select { |a| a.main? }.first
168
195
  if !main_association
169
- raise "No main route table association found for VPC #{new_resource.name} (#{vpc.id})'s current main route table #{current_route_table.id}: error! Probably a race condition."
196
+ raise "No main route table association found for #{new_resource.to_s} current main route table #{current_route_table.id}: error! Probably a race condition."
170
197
  end
171
- converge_by "change main route table for VPC #{new_resource.name} (#{vpc.id}) to #{desired_route_table.id} (was #{current_route_table.id})" do
198
+ converge_by "change main route table for #{new_resource.to_s} to #{desired_route_table.id} (was #{current_route_table.id})" do
172
199
  vpc.client.replace_route_table_association(
173
200
  association_id: main_association.id,
174
- route_table_id: desired_route_table.id)
201
+ route_table_id: desired_route_table.id
202
+ )
175
203
  end
176
204
  end
177
205
  desired_route_table
178
206
  end
179
207
 
180
208
  def update_main_routes(vpc, main_route_table)
209
+ # If no route table is provided and we fetch the current main one from AWS,
210
+ # there is no guarantee that is the 'default' route table created when
211
+ # creating the VPC
181
212
  main_route_table ||= vpc.route_tables.main_route_table
213
+ main_routes = new_resource.main_routes
182
214
  aws_route_table main_route_table do
183
215
  vpc vpc
184
- routes new_resource.main_routes
216
+ routes main_routes
185
217
  end
186
218
  main_route_table
187
219
  end
@@ -190,7 +222,7 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
190
222
  dhcp_options = vpc.dhcp_options
191
223
  desired_dhcp_options = Chef::Resource::AwsDhcpOptions.get_aws_object(new_resource.dhcp_options, resource: new_resource)
192
224
  if dhcp_options != desired_dhcp_options
193
- converge_by "change DHCP options for VPC #{new_resource.name} (#{vpc.id}) to #{new_resource.dhcp_options} (#{desired_dhcp_options.id}) - was #{dhcp_options.id}" do
225
+ converge_by "change DHCP options for #{new_resource.to_s} to #{new_resource.dhcp_options} (#{desired_dhcp_options.id}) - was #{dhcp_options.id}" do
194
226
  vpc.dhcp_options = desired_dhcp_options
195
227
  end
196
228
  end