chef-provisioning-aws 1.4.1 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +8 -0
- data/README.md +26 -39
- data/Rakefile +13 -5
- data/lib/chef/provider/aws_iam_instance_profile.rb +60 -0
- data/lib/chef/provider/aws_iam_role.rb +98 -0
- data/lib/chef/provider/aws_image.rb +1 -1
- data/lib/chef/provider/aws_internet_gateway.rb +75 -0
- data/lib/chef/provider/aws_route_table.rb +3 -2
- data/lib/chef/provider/aws_s3_bucket.rb +4 -1
- data/lib/chef/provider/aws_security_group.rb +1 -1
- data/lib/chef/provider/aws_vpc.rb +50 -45
- data/lib/chef/provisioning/aws_driver.rb +22 -1
- data/lib/chef/provisioning/aws_driver/aws_provider.rb +13 -5
- data/lib/chef/provisioning/aws_driver/aws_resource.rb +173 -165
- data/lib/chef/provisioning/aws_driver/credentials.rb +12 -0
- data/lib/chef/provisioning/aws_driver/driver.rb +82 -37
- data/lib/chef/provisioning/aws_driver/super_lwrp.rb +56 -43
- data/lib/chef/provisioning/aws_driver/version.rb +1 -1
- data/lib/chef/resource/aws_dhcp_options.rb +1 -1
- data/lib/chef/resource/aws_ebs_volume.rb +1 -1
- data/lib/chef/resource/aws_eip_address.rb +1 -1
- data/lib/chef/resource/aws_iam_instance_profile.rb +33 -0
- data/lib/chef/resource/aws_iam_role.rb +55 -0
- data/lib/chef/resource/aws_image.rb +1 -1
- data/lib/chef/resource/aws_instance.rb +1 -1
- data/lib/chef/resource/aws_internet_gateway.rb +36 -6
- data/lib/chef/resource/aws_load_balancer.rb +1 -1
- data/lib/chef/resource/aws_network_acl.rb +1 -1
- data/lib/chef/resource/aws_network_interface.rb +1 -1
- data/lib/chef/resource/aws_route53_hosted_zone.rb +261 -0
- data/lib/chef/resource/aws_route53_record_set.rb +162 -0
- data/lib/chef/resource/aws_route_table.rb +1 -1
- data/lib/chef/resource/aws_security_group.rb +1 -1
- data/lib/chef/resource/aws_sns_topic.rb +1 -1
- data/lib/chef/resource/aws_subnet.rb +1 -1
- data/lib/chef/resource/aws_vpc.rb +1 -1
- data/lib/chef/resource/aws_vpc_peering_connection.rb +1 -1
- data/spec/aws_support.rb +11 -13
- data/spec/aws_support/matchers/create_an_aws_object.rb +7 -1
- data/spec/aws_support/matchers/have_aws_object_tags.rb +1 -1
- data/spec/aws_support/matchers/match_an_aws_object.rb +7 -1
- data/spec/aws_support/matchers/update_an_aws_object.rb +8 -2
- data/spec/integration/aws_eip_address_spec.rb +74 -0
- data/spec/integration/aws_iam_instance_profile_spec.rb +159 -0
- data/spec/integration/aws_iam_role_spec.rb +177 -0
- data/spec/integration/aws_internet_gateway_spec.rb +161 -0
- data/spec/integration/aws_network_interface_spec.rb +3 -4
- data/spec/integration/aws_route53_hosted_zone_spec.rb +522 -0
- data/spec/integration/aws_route_table_spec.rb +52 -4
- data/spec/integration/aws_s3_bucket_spec.rb +1 -1
- data/spec/integration/load_balancer_spec.rb +303 -8
- data/spec/integration/machine_batch_spec.rb +1 -0
- data/spec/integration/machine_image_spec.rb +32 -17
- data/spec/integration/machine_spec.rb +11 -29
- data/spec/unit/chef/provisioning/aws_driver/driver_spec.rb +0 -1
- data/spec/unit/chef/provisioning/aws_driver/route53_spec.rb +105 -0
- metadata +48 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ac3b4009283033918629bde10eae733c25b8a73
|
4
|
+
data.tar.gz: 486f831a4168454ad62c9b5ebccd48e7f57249d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83fc3ef810c239b52c0c00246f08ba97fa5f4b4af3ab116324a7cdf52929815e9006ecc89e92837f1311510b0b9960ca43c41a50385e856bcc12a022a602efa6
|
7
|
+
data.tar.gz: 2dd1b0c595deccae3767740d0abe2d6058c2322ef214a16640dc4386c8586b09efcd39ad667ec29f21aadedbb835aba29b37556b67fb84e0d5bbf661946d5afd
|
data/Gemfile
ADDED
data/README.md
CHANGED
@@ -6,12 +6,20 @@ This README is a work in progress. Please add to it!
|
|
6
6
|
|
7
7
|
## Credentials
|
8
8
|
|
9
|
-
|
9
|
+
There are 3 ways you can provide your AWS Credentials. We will look for credentials in the order from below and use the first one found. This precedence order is taken from http://docs.aws.amazon.com/sdkforruby/api/index.html#Configuration:
|
10
10
|
|
11
|
-
|
11
|
+
1. Through the environment variables `ENV["AWS_ACCESS_KEY_ID"]`, `ENV["AWS_SECRET_ACCESS_KEY"]` and optionally `ENV["AWS_SESSION_TOKEN"]`
|
12
|
+
2. The shared credentials ini file. The default location is `~/.aws/credentials` but you can overwrite this by specifying `ENV["AWS_CONFIG_FILE"]`. You can specify
|
13
|
+
multiple profiles in this file and select one with the `ENV["AWS_DEFAULT_PROFILE"]`
|
14
|
+
environment variable or via the driver url. For example, a driver url of `aws:staging:us-east-1` would use the profile `staging`. If you do not specify a profile then the `default` one is used. Read
|
15
|
+
[this](http://blogs.aws.amazon.com/security/post/Tx3D6U6WSFGOK2H/A-New-and-Standardized-Way-to-Manage-Credentials-in-the-AWS-SDKs) for more information about profiles.
|
16
|
+
3. From an instance profile when running on EC2. This accesses the local
|
17
|
+
metadata service to discover the local instance's IAM instance profile.
|
12
18
|
|
13
19
|
## Configurable Options
|
14
20
|
|
21
|
+
### aws_retry_limit
|
22
|
+
|
15
23
|
When using `machine_batch` with a large number of machines it is possible to overwhelm the AWS SDK until it starts returning `AWS::EC2::Errors::RequestLimitExceeded`. You can configure the AWS SDK to retry these errors automatically by specifying
|
16
24
|
|
17
25
|
```ruby
|
@@ -20,14 +28,22 @@ chef_provisioning({:aws_retry_limit => 10})
|
|
20
28
|
|
21
29
|
in your client.rb for the provisioning workstation. The default `:aws_retry_limit` is 5.
|
22
30
|
|
31
|
+
### image_max_wait_time and machine_max_wait_time
|
32
|
+
|
33
|
+
By default, the time we will wait for a `machine` to become ready or for the transport to become ready is 120 seconds (each).
|
34
|
+
For a `machine_image` we wait 300 seconds for the AMI to be created. These timeouts can be configured with
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
chef_provisioning({:image_max_wait_time => 600, :machine_max_wait_time => 240})
|
38
|
+
```
|
39
|
+
|
40
|
+
in your client.rb for the provisioning workstation.
|
41
|
+
|
23
42
|
# Resources
|
24
43
|
|
25
44
|
TODO: List out weird/unique things about resources here. We don't need to document every resource
|
26
45
|
because users can look at the resource model.
|
27
46
|
|
28
|
-
TODO: document `aws_object` and `get_aws_object` and how you can get the aws object for a base
|
29
|
-
chef-provisioning resource like machine or load_balancer
|
30
|
-
|
31
47
|
## aws_key_pair
|
32
48
|
|
33
49
|
You can specify an existing key pair to upload by specifying the following:
|
@@ -171,7 +187,6 @@ The available parameters for `load_balancer_options` can be viewed in the [aws d
|
|
171
187
|
NOTES:
|
172
188
|
|
173
189
|
1. You can specify either `ssl_certificate_id` or `server_certificate` in a listener but the value to both parameters should be the ARN of an existing IAM::ServerCertificate object.
|
174
|
-
2. Instead of specifying `tags` in the `load_balancer_options`, you should specify `aws_tags`. See the note on [tagging base resources](https://github.com/chef/chef-provisioning-aws#base-resources).
|
175
190
|
|
176
191
|
# RDS Instance Options
|
177
192
|
|
@@ -260,8 +275,11 @@ Finally, you should add 3 standard tests for taggable objects - 1) Tags can be c
|
|
260
275
|
|
261
276
|
## \#aws\_object
|
262
277
|
|
263
|
-
All chef-provisioning-aws resources have a `aws_object` method that will return the AWS object. The
|
264
|
-
|
278
|
+
All chef-provisioning-aws resources have a `aws_object` method that will return the AWS object. The base
|
279
|
+
resources `machine`, `machine_image` and `load_balancer` are monkeypatched to also include the `aws_object`
|
280
|
+
method and should respond to it like all other resources.
|
281
|
+
|
282
|
+
The AWS object won't exist until the resource converges, however. An example of how to do this looks like:
|
265
283
|
|
266
284
|
```ruby
|
267
285
|
my_vpc = aws_vpc 'my_vpc' do
|
@@ -336,37 +354,6 @@ perform [lookup_options](https://github.com/chef/chef-provisioning-aws/blob/mast
|
|
336
354
|
This tries to turn elements with names like `vpc`, `security_group_ids`, `machines`, `launch_configurations`,
|
337
355
|
`load_balancers`, etc. to the correct AWS object.
|
338
356
|
|
339
|
-
## Looking up chef-provisioning resources
|
340
|
-
|
341
|
-
The base chef-provisioning resources (machine, machine_batch, load_balancer, machine_image) don't
|
342
|
-
have the `aws_object` method defined on them because they are not `AWSResource` classes. To
|
343
|
-
look them up use the class method `get_aws_object` defined on the chef-provisioning-aws specific
|
344
|
-
resource:
|
345
|
-
|
346
|
-
```ruby
|
347
|
-
machine_image 'my_image' do
|
348
|
-
...
|
349
|
-
end
|
350
|
-
|
351
|
-
ruby_block "look up machine_image object" do
|
352
|
-
block do
|
353
|
-
aws_object = Chef::Resource::AwsImage.get_aws_object(
|
354
|
-
'my_image',
|
355
|
-
run_context: run_context,
|
356
|
-
driver: run_context.chef_provisioning.current_driver,
|
357
|
-
managed_entry_store: Chef::Provisioning.chef_managed_entry_store(run_context.cheffish.current_chef_server)
|
358
|
-
)
|
359
|
-
end
|
360
|
-
end
|
361
|
-
```
|
362
|
-
|
363
|
-
To look up a machine, use the `AwsInstance` class, to look up a load balancer use the `AwsLoadBalancer`
|
364
|
-
class, etc. The first parameter you pass should be the same resource name as used in the base
|
365
|
-
chef-provisioning resource.
|
366
|
-
|
367
|
-
Again, the AWS object will not exist until the converge phase, so the aws_object will only be
|
368
|
-
available using a `lazy` attribute modifier or in a `ruby_block`.
|
369
|
-
|
370
357
|
# Running Integration Tests
|
371
358
|
|
372
359
|
To run the integration tests execute `bundle exec rspec`. If you have not set it up,
|
data/Rakefile
CHANGED
@@ -14,14 +14,15 @@ RSpec::Core::RakeTask.new(:spec) do |spec|
|
|
14
14
|
end
|
15
15
|
|
16
16
|
desc "run integration specs"
|
17
|
-
RSpec::Core::RakeTask.new(:integration) do |spec|
|
18
|
-
spec.pattern = 'spec/integration/**/*_spec.rb'
|
17
|
+
RSpec::Core::RakeTask.new(:integration, [:pattern]) do |spec, args|
|
18
|
+
spec.pattern = args[:pattern] || 'spec/integration/**/*_spec.rb'
|
19
|
+
spec.rspec_opts = "-b"
|
19
20
|
end
|
20
21
|
|
21
22
|
desc "run :super_slow specs (machine/machine_image)"
|
22
|
-
RSpec::Core::RakeTask.new(:
|
23
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
24
|
-
spec.rspec_opts = "-t super_slow"
|
23
|
+
RSpec::Core::RakeTask.new(:super_slow, [:pattern]) do |spec, args|
|
24
|
+
spec.pattern = args[:pattern] || 'spec/integration/**/*_spec.rb'
|
25
|
+
spec.rspec_opts = "-b -t super_slow"
|
25
26
|
end
|
26
27
|
|
27
28
|
desc "run all specs, except :super_slow"
|
@@ -35,3 +36,10 @@ task :all_slow do
|
|
35
36
|
Rake::Task[t].invoke
|
36
37
|
end
|
37
38
|
end
|
39
|
+
|
40
|
+
desc "travis specific task - runs CI integration tests (regular and super_slow in parallel) and sets up travis specific ENV variables"
|
41
|
+
task :travis, [:sub_task] do |t, args|
|
42
|
+
pattern = "load_balancer_spec.rb,machine_image_spec.rb" # This is a comma seperated list
|
43
|
+
pattern = pattern.split(",").map {|p| "spec/integration/**/*#{p}"}.join(",")
|
44
|
+
Rake::Task[args[:sub_task]].invoke(pattern)
|
45
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'chef/provisioning/aws_driver/aws_provider'
|
2
|
+
|
3
|
+
class Chef::Provider::AwsInstanceProfile < Chef::Provisioning::AWSDriver::AWSProvider
|
4
|
+
provides :aws_iam_instance_profile
|
5
|
+
|
6
|
+
def action_create
|
7
|
+
iam_instance_profile = super
|
8
|
+
|
9
|
+
update_attached_role(iam_instance_profile)
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
protected
|
14
|
+
|
15
|
+
def detach_role(iam_instance_profile)
|
16
|
+
iam_instance_profile.roles.each do |r|
|
17
|
+
converge_by "detaching role #{r.name} from instance profile #{new_resource.name}" do
|
18
|
+
iam_instance_profile.remove_role(role_name: r.name)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def update_attached_role(iam_instance_profile)
|
24
|
+
options = Chef::Provisioning::AWSDriver::AWSResource.lookup_options({ iam_role: new_resource.role }, resource: new_resource)
|
25
|
+
role = options[:iam_role]
|
26
|
+
|
27
|
+
if new_resource.role && !iam_instance_profile.roles.map(&:name).include?(role)
|
28
|
+
detach_role(iam_instance_profile)
|
29
|
+
converge_by "associating role #{role} with instance profile #{new_resource.name}" do
|
30
|
+
# Despite having collection methods for roles, instance profile can only have single role associated
|
31
|
+
iam_instance_profile.add_role({
|
32
|
+
role_name: role
|
33
|
+
})
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def create_aws_object
|
39
|
+
converge_by "create IAM instance profile #{new_resource.name}" do
|
40
|
+
new_resource.driver.iam_resource.create_instance_profile({
|
41
|
+
path: new_resource.path || "/",
|
42
|
+
instance_profile_name: new_resource.name
|
43
|
+
})
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def update_aws_object(iam_instance_profile)
|
48
|
+
# Nothing to update on our object because the role relationship is managed
|
49
|
+
# through the action
|
50
|
+
iam_instance_profile
|
51
|
+
end
|
52
|
+
|
53
|
+
def destroy_aws_object(iam_instance_profile)
|
54
|
+
detach_role(iam_instance_profile)
|
55
|
+
converge_by "delete #{iam_instance_profile.name}" do
|
56
|
+
iam_instance_profile.delete
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'chef/provisioning/aws_driver/aws_provider'
|
2
|
+
require 'chef/json_compat'
|
3
|
+
|
4
|
+
class Chef::Provider::AwsIamRole < Chef::Provisioning::AWSDriver::AWSProvider
|
5
|
+
provides :aws_iam_role
|
6
|
+
|
7
|
+
def iam_client
|
8
|
+
new_resource.driver.iam_client
|
9
|
+
end
|
10
|
+
|
11
|
+
def iam_resource
|
12
|
+
new_resource.driver.iam_resource
|
13
|
+
end
|
14
|
+
|
15
|
+
def action_create
|
16
|
+
role = super
|
17
|
+
|
18
|
+
if !new_resource.inline_policies.nil?
|
19
|
+
update_inline_policy(role)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def create_aws_object
|
26
|
+
converge_by "create IAM Role #{new_resource.name}" do
|
27
|
+
iam_resource.create_role({
|
28
|
+
path: new_resource.path,
|
29
|
+
role_name: new_resource.name,
|
30
|
+
assume_role_policy_document: new_resource.assume_role_policy_document
|
31
|
+
})
|
32
|
+
end
|
33
|
+
iam_resource.role(new_resource.name)
|
34
|
+
end
|
35
|
+
|
36
|
+
def update_aws_object(role)
|
37
|
+
if new_resource.path && new_resource.path != role.path
|
38
|
+
raise "Path of IAM Role #{new_resource.name} is #{role.path}, but desired path is #{new_resource.path}. IAM Role paths cannot be updated!"
|
39
|
+
end
|
40
|
+
if new_resource.assume_role_policy_document && policy_update_required?(role.assume_role_policy_document, new_resource.assume_role_policy_document)
|
41
|
+
converge_by "update IAM Role #{role.name} assume_role_policy_document" do
|
42
|
+
iam_client.update_assume_role_policy({
|
43
|
+
role_name: new_resource.name,
|
44
|
+
policy_document: new_resource.assume_role_policy_document
|
45
|
+
})
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def destroy_aws_object(role)
|
51
|
+
converge_by "delete IAM Role #{role.name}" do
|
52
|
+
role.instance_profiles.each do |profile|
|
53
|
+
profile.remove_role(role_name: role.name)
|
54
|
+
end
|
55
|
+
role.policies.each do |policy|
|
56
|
+
converge_by "delete IAM Role inline policy #{policy.name}" do
|
57
|
+
policy.delete
|
58
|
+
end
|
59
|
+
end
|
60
|
+
role.delete
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def update_inline_policy(role)
|
67
|
+
desired_inline_policies = Hash[new_resource.inline_policies.map {|k, v| [k.to_s, v]}]
|
68
|
+
current_inline_policies = Hash[role.policies.map {|p| [p.name, p.policy_document]}]
|
69
|
+
|
70
|
+
policies_to_put = desired_inline_policies.reject {|k,v| current_inline_policies[k] && !policy_update_required?(current_inline_policies[k], v)}
|
71
|
+
policies_to_delete = current_inline_policies.keys - desired_inline_policies.keys
|
72
|
+
|
73
|
+
policies_to_put.each do |policy_name, policy|
|
74
|
+
converge_by "Adding or updating inline Role policy #{policy_name}" do
|
75
|
+
iam_client.put_role_policy({
|
76
|
+
role_name: role.name,
|
77
|
+
policy_name: policy_name,
|
78
|
+
policy_document: policy
|
79
|
+
})
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
policies_to_delete.each do |policy_name|
|
84
|
+
converge_by "Deleting inline Role policy #{policy_name}" do
|
85
|
+
iam_client.delete_role_policy({
|
86
|
+
role_name: role.name,
|
87
|
+
policy_name: policy_name
|
88
|
+
})
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def policy_update_required?(current_policy, desired_policy)
|
94
|
+
# We parse the JSON into a hash to get rid of whitespace and ordering issues
|
95
|
+
Chef::JSONCompat.parse(URI.decode(current_policy)) != Chef::JSONCompat.parse(desired_policy)
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
@@ -29,7 +29,7 @@ class Chef::Provider::AwsImage < Chef::Provisioning::AWSDriver::AWSProvider
|
|
29
29
|
# destroyed - we just need to make sure that has completed successfully
|
30
30
|
instance = new_resource.driver.ec2.instances[instance_id]
|
31
31
|
converge_by "waiting until instance #{instance.id} is :terminated" do
|
32
|
-
wait_for_status(instance, :terminated, [AWS::EC2::Errors::InvalidInstanceID::NotFound])
|
32
|
+
wait_for_status(instance, :terminated, [AWS::EC2::Errors::InvalidInstanceID::NotFound, AWS::Core::Resource::NotFound])
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'chef/provisioning/aws_driver/aws_provider'
|
2
|
+
require 'retryable'
|
3
|
+
|
4
|
+
class Chef::Provider::AwsInternetGateway < Chef::Provisioning::AWSDriver::AWSProvider
|
5
|
+
include Chef::Provisioning::AWSDriver::TaggingStrategy::EC2ConvergeTags
|
6
|
+
|
7
|
+
provides :aws_internet_gateway
|
8
|
+
|
9
|
+
def action_detach
|
10
|
+
internet_gateway = Chef::Resource::AwsInternetGateway.get_aws_object(new_resource.name, resource: new_resource)
|
11
|
+
detach_vpc(internet_gateway)
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
def create_aws_object
|
17
|
+
desired_vpc = Chef::Resource::AwsVpc.get_aws_object(new_resource.vpc, resource: new_resource) if new_resource.vpc
|
18
|
+
|
19
|
+
converge_by "create internet gateway #{new_resource.name} in region #{region}" do
|
20
|
+
internet_gateway = new_resource.driver.ec2.internet_gateways.create
|
21
|
+
retry_with_backoff(AWS::EC2::Errors::InvalidInternetGatewayID::NotFound) do
|
22
|
+
internet_gateway.tags['Name'] = new_resource.name
|
23
|
+
end
|
24
|
+
|
25
|
+
if desired_vpc
|
26
|
+
attach_vpc(desired_vpc, internet_gateway)
|
27
|
+
end
|
28
|
+
|
29
|
+
internet_gateway
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def update_aws_object(internet_gateway)
|
34
|
+
current_vpc = internet_gateway.vpc
|
35
|
+
|
36
|
+
if new_resource.vpc
|
37
|
+
desired_vpc = Chef::Resource::AwsVpc.get_aws_object(new_resource.vpc, resource: new_resource)
|
38
|
+
if current_vpc != desired_vpc
|
39
|
+
attach_vpc(desired_vpc, internet_gateway)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def destroy_aws_object(internet_gateway)
|
45
|
+
converge_by "delete internet gateway #{new_resource.name} in region #{region}" do
|
46
|
+
detach_vpc(internet_gateway)
|
47
|
+
internet_gateway.delete
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def attach_vpc(vpc, desired_gateway)
|
54
|
+
if vpc.internet_gateway && vpc.internet_gateway != desired_gateway
|
55
|
+
Cheffish.inline_resource(self, action) do
|
56
|
+
aws_vpc vpc.id do
|
57
|
+
cidr_block vpc.cidr_block
|
58
|
+
internet_gateway false
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
converge_by "attach vpc #{vpc.id} to #{desired_gateway.id}" do
|
63
|
+
desired_gateway.vpc = vpc
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def detach_vpc(internet_gateway)
|
68
|
+
if internet_gateway.vpc
|
69
|
+
converge_by "detach vpc #{internet_gateway.vpc.id} from internet gateway #{internet_gateway.id}" do
|
70
|
+
internet_gateway.detach(internet_gateway.vpc)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
@@ -100,7 +100,8 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
|
|
100
100
|
|
101
101
|
# Delete anything that's left (that wasn't replaced)
|
102
102
|
current_routes.values.each do |current_route|
|
103
|
-
|
103
|
+
current_target = current_route.gateway_id || current_route.instance_id || current_route.network_interface_id || current_route.vpc_peering_connection_id
|
104
|
+
action_handler.perform_action "remove route sending #{current_route.destination_cidr_block} to #{current_target}" do
|
104
105
|
current_route.delete
|
105
106
|
end
|
106
107
|
end
|
@@ -141,7 +142,7 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
|
|
141
142
|
route_target = { internet_gateway: route_target }
|
142
143
|
when /^eni-[A-Fa-f0-9]{8}$/, Chef::Resource::AwsNetworkInterface, AWS::EC2::NetworkInterface
|
143
144
|
route_target = { network_interface: route_target }
|
144
|
-
when /^pcx-[A-Fa-f0-9]{8}$/, Chef::Resource::AwsVpcPeeringConnection, ::Aws::EC2::
|
145
|
+
when /^pcx-[A-Fa-f0-9]{8}$/, Chef::Resource::AwsVpcPeeringConnection, ::Aws::EC2::VpcPeeringConnection
|
145
146
|
route_target = { vpc_peering_connection: route_target }
|
146
147
|
when String, Chef::Resource::AwsInstance
|
147
148
|
route_target = { instance: route_target }
|
@@ -50,7 +50,7 @@ class Chef::Provider::AwsS3Bucket < Chef::Provisioning::AWSDriver::AWSProvider
|
|
50
50
|
|
51
51
|
def create_aws_object
|
52
52
|
converge_by "create S3 bucket #{new_resource.name}" do
|
53
|
-
new_resource.driver.s3.buckets.create(new_resource.name)
|
53
|
+
new_resource.driver.s3.buckets.create(new_resource.name, new_resource.options)
|
54
54
|
# S3 buckets already have a top level name property so they don't need
|
55
55
|
# a 'Name' tag
|
56
56
|
end
|
@@ -60,6 +60,9 @@ class Chef::Provider::AwsS3Bucket < Chef::Provisioning::AWSDriver::AWSProvider
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def destroy_aws_object(bucket)
|
63
|
+
if purging
|
64
|
+
new_resource.recursive_delete(true)
|
65
|
+
end
|
63
66
|
converge_by "delete S3 bucket #{new_resource.name}" do
|
64
67
|
if new_resource.recursive_delete
|
65
68
|
bucket.delete!
|
@@ -24,7 +24,7 @@ class Chef::Provider::AwsSecurityGroup < Chef::Provisioning::AWSDriver::AWSProvi
|
|
24
24
|
Chef::Log.debug("VPC: #{options[:vpc]}")
|
25
25
|
|
26
26
|
sg = new_resource.driver.ec2.security_groups.create(new_resource.name, options)
|
27
|
-
retry_with_backoff(AWS::EC2::Errors::InvalidSecurityGroupsID::NotFound) do
|
27
|
+
retry_with_backoff(AWS::EC2::Errors::InvalidSecurityGroupsID::NotFound, AWS::EC2::Errors::InvalidGroup::NotFound) do
|
28
28
|
sg.tags['Name'] = new_resource.name
|
29
29
|
end
|
30
30
|
sg
|