chef-provisioning-aws 1.3.1 → 1.4.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/README.md +70 -69
- data/Rakefile +22 -2
- data/lib/chef/provider/aws_auto_scaling_group.rb +3 -2
- data/lib/chef/provider/aws_cache_cluster.rb +3 -2
- data/lib/chef/provider/aws_cache_replication_group.rb +5 -4
- data/lib/chef/provider/aws_cache_subnet_group.rb +5 -4
- data/lib/chef/provider/aws_cloudsearch_domain.rb +163 -0
- data/lib/chef/provider/aws_dhcp_options.rb +9 -6
- data/lib/chef/provider/aws_ebs_volume.rb +7 -3
- data/lib/chef/provider/aws_eip_address.rb +8 -7
- data/lib/chef/provider/aws_image.rb +8 -3
- data/lib/chef/provider/aws_instance.rb +14 -2
- data/lib/chef/provider/aws_key_pair.rb +2 -1
- data/lib/chef/provider/aws_launch_configuration.rb +4 -2
- data/lib/chef/provider/aws_load_balancer.rb +18 -0
- data/lib/chef/provider/aws_network_acl.rb +6 -2
- data/lib/chef/provider/aws_network_interface.rb +11 -24
- data/lib/chef/provider/aws_rds_instance.rb +66 -0
- data/lib/chef/provider/aws_rds_subnet_group.rb +89 -0
- data/lib/chef/provider/aws_route_table.rb +42 -23
- data/lib/chef/provider/aws_s3_bucket.rb +32 -8
- data/lib/chef/provider/aws_security_group.rb +11 -4
- data/lib/chef/provider/aws_server_certificate.rb +23 -0
- data/lib/chef/provider/aws_sns_topic.rb +4 -3
- data/lib/chef/provider/aws_sqs_queue.rb +3 -2
- data/lib/chef/provider/aws_subnet.rb +10 -7
- data/lib/chef/provider/aws_vpc.rb +54 -21
- data/lib/chef/provider/aws_vpc_peering_connection.rb +88 -0
- data/lib/chef/provisioning/aws_driver.rb +8 -0
- data/lib/chef/provisioning/aws_driver/aws_provider.rb +45 -76
- data/lib/chef/provisioning/aws_driver/aws_rds_resource.rb +11 -0
- data/lib/chef/provisioning/aws_driver/aws_resource.rb +14 -2
- data/lib/chef/provisioning/aws_driver/aws_resource_with_entry.rb +2 -8
- data/lib/chef/provisioning/aws_driver/aws_taggable.rb +18 -0
- data/lib/chef/provisioning/aws_driver/aws_tagger.rb +61 -0
- data/lib/chef/provisioning/aws_driver/credentials2.rb +51 -0
- data/lib/chef/provisioning/aws_driver/driver.rb +214 -162
- data/lib/chef/provisioning/aws_driver/tagging_strategy/ec2.rb +64 -0
- data/lib/chef/provisioning/aws_driver/tagging_strategy/elb.rb +39 -0
- data/lib/chef/provisioning/aws_driver/tagging_strategy/rds.rb +92 -0
- data/lib/chef/provisioning/aws_driver/tagging_strategy/s3.rb +41 -0
- data/lib/chef/provisioning/aws_driver/version.rb +1 -1
- data/lib/chef/resource/aws_cache_cluster.rb +1 -2
- data/lib/chef/resource/aws_cloudsearch_domain.rb +46 -0
- data/lib/chef/resource/aws_dhcp_options.rb +2 -0
- data/lib/chef/resource/aws_ebs_volume.rb +3 -1
- data/lib/chef/resource/aws_eip_address.rb +0 -3
- data/lib/chef/resource/aws_image.rb +3 -0
- data/lib/chef/resource/aws_instance.rb +7 -2
- data/lib/chef/resource/aws_internet_gateway.rb +2 -0
- data/lib/chef/resource/aws_load_balancer.rb +3 -0
- data/lib/chef/resource/aws_network_acl.rb +2 -0
- data/lib/chef/resource/aws_network_interface.rb +3 -1
- data/lib/chef/resource/aws_rds_instance.rb +42 -0
- data/lib/chef/resource/aws_rds_subnet_group.rb +29 -0
- data/lib/chef/resource/aws_route_table.rb +7 -5
- data/lib/chef/resource/aws_s3_bucket.rb +3 -0
- data/lib/chef/resource/aws_security_group.rb +2 -7
- data/lib/chef/resource/aws_server_certificate.rb +21 -0
- data/lib/chef/resource/aws_subnet.rb +2 -0
- data/lib/chef/resource/aws_vpc.rb +4 -1
- data/lib/chef/resource/aws_vpc_peering_connection.rb +73 -0
- data/spec/acceptance/aws_ebs_volume/nodes/ettores-mbp.lan.json +3 -0
- data/spec/aws_support.rb +25 -8
- data/spec/aws_support/aws_resource_run_wrapper.rb +5 -1
- data/spec/aws_support/deep_matcher/match_values_failure_messages.rb +19 -0
- data/spec/aws_support/matchers/create_an_aws_object.rb +1 -1
- data/spec/aws_support/matchers/destroy_an_aws_object.rb +1 -1
- data/spec/aws_support/matchers/have_aws_object_tags.rb +9 -15
- data/spec/aws_support/matchers/match_an_aws_object.rb +1 -1
- data/spec/aws_support/matchers/update_an_aws_object.rb +1 -1
- data/spec/integration/aws_cloudsearch_domain_spec.rb +31 -0
- data/spec/integration/aws_dhcp_options_spec.rb +73 -0
- data/spec/integration/aws_ebs_volume_spec.rb +97 -0
- data/spec/integration/aws_network_acl_spec.rb +51 -0
- data/spec/integration/aws_network_interface_spec.rb +89 -0
- data/spec/integration/aws_rds_instance_spec.rb +150 -0
- data/spec/integration/aws_rds_subnet_group_spec.rb +105 -0
- data/spec/integration/aws_route_table_spec.rb +94 -7
- data/spec/integration/aws_s3_bucket_spec.rb +88 -0
- data/spec/integration/aws_security_group_spec.rb +47 -0
- data/spec/integration/aws_server_certificate_spec.rb +24 -0
- data/spec/integration/aws_subnet_spec.rb +51 -2
- data/spec/integration/aws_vpc_peering_connection_spec.rb +99 -0
- data/spec/integration/aws_vpc_spec.rb +73 -0
- data/spec/integration/load_balancer_spec.rb +101 -0
- data/spec/integration/machine_image_spec.rb +61 -6
- data/spec/integration/machine_spec.rb +26 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/unit/{aws_driver → chef/provisioning/aws_driver}/credentials_spec.rb +0 -0
- data/spec/unit/chef/provisioning/aws_driver/driver_spec.rb +88 -0
- metadata +63 -20
- data/spec/integration/aws_tagged_items_spec.rb +0 -166
@@ -2,6 +2,9 @@ require 'chef/provisioning/aws_driver/aws_provider'
|
|
2
2
|
require 'retryable'
|
3
3
|
|
4
4
|
class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
|
5
|
+
include Chef::Provisioning::AWSDriver::TaggingStrategy::EC2ConvergeTags
|
6
|
+
|
7
|
+
provides :aws_route_table
|
5
8
|
|
6
9
|
def action_create
|
7
10
|
route_table = super
|
@@ -17,14 +20,23 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
|
|
17
20
|
|
18
21
|
def create_aws_object
|
19
22
|
options = {}
|
20
|
-
options[:
|
23
|
+
options[:vpc_id] = new_resource.vpc
|
21
24
|
options = AWSResource.lookup_options(options, resource: new_resource)
|
22
|
-
self.vpc = Chef::Resource::AwsVpc.get_aws_object(options[:vpc], resource: new_resource)
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
ec2_resource = new_resource.driver.ec2_resource
|
27
|
+
self.vpc = ec2_resource.vpc(options[:vpc_id])
|
28
|
+
|
29
|
+
converge_by "create route table #{new_resource.name} in VPC #{new_resource.vpc} (#{vpc.id}) and region #{region}" do
|
30
|
+
route_table = vpc.create_route_table
|
31
|
+
retry_with_backoff(::Aws::EC2::Errors::ServiceError) do
|
32
|
+
route_table.create_tags({
|
33
|
+
:tags => [
|
34
|
+
{
|
35
|
+
:key => "Name",
|
36
|
+
:value => new_resource.name
|
37
|
+
}
|
38
|
+
]
|
39
|
+
})
|
28
40
|
end
|
29
41
|
route_table
|
30
42
|
end
|
@@ -34,9 +46,9 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
|
|
34
46
|
self.vpc = route_table.vpc
|
35
47
|
|
36
48
|
if new_resource.vpc
|
37
|
-
|
38
|
-
if vpc !=
|
39
|
-
raise "VPC of route table #{new_resource.to_s} is #{
|
49
|
+
desired_vpc_id = Chef::Resource::AwsVpc.get_aws_object_id(new_resource.vpc, resource: new_resource)
|
50
|
+
if vpc.id != desired_vpc_id
|
51
|
+
raise "VPC of route table #{new_resource.to_s} is #{vpc.id}, but desired VPC is #{desired_vpc_id}! The AWS SDK does not support updating the main route table except by creating a new route table."
|
40
52
|
end
|
41
53
|
end
|
42
54
|
end
|
@@ -45,7 +57,7 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
|
|
45
57
|
converge_by "delete #{new_resource.to_s} in #{region}" do
|
46
58
|
begin
|
47
59
|
route_table.delete
|
48
|
-
rescue
|
60
|
+
rescue ::Aws::EC2::Errors::DependencyViolation
|
49
61
|
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
62
|
end
|
51
63
|
end
|
@@ -60,8 +72,9 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
|
|
60
72
|
current_routes = {}
|
61
73
|
route_table.routes.each do |route|
|
62
74
|
# Ignore the automatic local route
|
63
|
-
|
64
|
-
next if
|
75
|
+
route_target = route.gateway_id || route.instance_id || route.network_interface_id || route.vpc_peering_connection_id
|
76
|
+
next if route_target == 'local'
|
77
|
+
next if ignore_route_targets.find { |target| route_target.match(/#{target}/) }
|
65
78
|
current_routes[route.destination_cidr_block] = route
|
66
79
|
end
|
67
80
|
|
@@ -72,14 +85,15 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
|
|
72
85
|
# If we already have a route to that CIDR block, replace it.
|
73
86
|
if current_routes[destination_cidr_block]
|
74
87
|
current_route = current_routes.delete(destination_cidr_block)
|
75
|
-
|
76
|
-
|
88
|
+
current_target = current_route.gateway_id || current_route.instance_id || current_route.network_interface_id || current_route.vpc_peering_connection_id
|
89
|
+
if current_target != target
|
90
|
+
action_handler.perform_action "reroute #{destination_cidr_block} to #{route_target} (#{target}) instead of #{current_route.target}" do
|
77
91
|
current_route.replace(options)
|
78
92
|
end
|
79
93
|
end
|
80
94
|
else
|
81
|
-
action_handler.perform_action "route #{destination_cidr_block} to #{route_target} (#{target
|
82
|
-
route_table.create_route(destination_cidr_block
|
95
|
+
action_handler.perform_action "route #{destination_cidr_block} to #{route_target} (#{target})" do
|
96
|
+
route_table.create_route({ :destination_cidr_block => destination_cidr_block }.merge(options))
|
83
97
|
end
|
84
98
|
end
|
85
99
|
end
|
@@ -93,7 +107,7 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
|
|
93
107
|
end
|
94
108
|
|
95
109
|
def update_virtual_private_gateways(route_table, gateway_ids)
|
96
|
-
current_propagating_vgw_set = route_table.
|
110
|
+
current_propagating_vgw_set = route_table.propagating_vgws
|
97
111
|
|
98
112
|
# Add propagated routes
|
99
113
|
if gateway_ids
|
@@ -119,7 +133,7 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
|
|
119
133
|
def get_route_target(vpc, route_target)
|
120
134
|
case route_target
|
121
135
|
when :internet_gateway
|
122
|
-
route_target = { internet_gateway: vpc.
|
136
|
+
route_target = { internet_gateway: vpc.internet_gateways.first.id }
|
123
137
|
if !route_target[:internet_gateway]
|
124
138
|
raise "VPC #{new_resource.vpc} (#{vpc.id}) does not have an internet gateway to route to! Use `internet_gateway true` on the VPC itself to create one."
|
125
139
|
end
|
@@ -127,11 +141,13 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
|
|
127
141
|
route_target = { internet_gateway: route_target }
|
128
142
|
when /^eni-[A-Fa-f0-9]{8}$/, Chef::Resource::AwsNetworkInterface, AWS::EC2::NetworkInterface
|
129
143
|
route_target = { network_interface: route_target }
|
144
|
+
when /^pcx-[A-Fa-f0-9]{8}$/, Chef::Resource::AwsVpcPeeringConnection, ::Aws::EC2::AwsVpcPeeringConnection
|
145
|
+
route_target = { vpc_peering_connection: route_target }
|
130
146
|
when String, Chef::Resource::AwsInstance
|
131
147
|
route_target = { instance: route_target }
|
132
148
|
when Chef::Resource::Machine
|
133
149
|
route_target = { instance: route_target.name }
|
134
|
-
when AWS::EC2::Instance
|
150
|
+
when AWS::EC2::Instance, ::Aws::EC2::Instance
|
135
151
|
route_target = { instance: route_target.id }
|
136
152
|
when Hash
|
137
153
|
if route_target.size != 1
|
@@ -141,16 +157,19 @@ class Chef::Provider::AwsRouteTable < Chef::Provisioning::AWSDriver::AWSProvider
|
|
141
157
|
else
|
142
158
|
raise "Unrecognized route destination #{route_target.inspect}"
|
143
159
|
end
|
160
|
+
updated_route_target = {}
|
144
161
|
route_target.each do |name, value|
|
145
162
|
case name
|
146
163
|
when :instance
|
147
|
-
|
164
|
+
updated_route_target[:instance_id] = Chef::Resource::AwsInstance.get_aws_object_id(value, resource: new_resource)
|
148
165
|
when :network_interface
|
149
|
-
|
166
|
+
updated_route_target[:network_interface_id] = Chef::Resource::AwsNetworkInterface.get_aws_object_id(value, resource: new_resource)
|
150
167
|
when :internet_gateway
|
151
|
-
|
168
|
+
updated_route_target[:gateway_id] = Chef::Resource::AwsInternetGateway.get_aws_object_id(value, resource: new_resource)
|
169
|
+
when :vpc_peering_connection
|
170
|
+
updated_route_target[:vpc_peering_connection_id] = Chef::Resource::AwsVpcPeeringConnection.get_aws_object_id(value, resource: new_resource)
|
152
171
|
end
|
153
172
|
end
|
154
|
-
|
173
|
+
updated_route_target
|
155
174
|
end
|
156
175
|
end
|
@@ -1,25 +1,45 @@
|
|
1
1
|
require 'chef/provisioning/aws_driver/aws_provider'
|
2
|
+
require 'chef/provisioning/aws_driver/tagging_strategy/s3'
|
2
3
|
require 'date'
|
3
4
|
|
4
5
|
class Chef::Provider::AwsS3Bucket < Chef::Provisioning::AWSDriver::AWSProvider
|
6
|
+
|
7
|
+
def aws_tagger
|
8
|
+
@aws_tagger ||= begin
|
9
|
+
s3_strategy = Chef::Provisioning::AWSDriver::TaggingStrategy::S3.new(
|
10
|
+
# I'm using the V2 client here because it has much better support for tags
|
11
|
+
new_resource.driver.s3_client,
|
12
|
+
new_resource.name,
|
13
|
+
new_resource.aws_tags
|
14
|
+
)
|
15
|
+
Chef::Provisioning::AWSDriver::AWSTagger.new(s3_strategy, action_handler)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def converge_tags
|
20
|
+
aws_tagger.converge_tags
|
21
|
+
end
|
22
|
+
|
23
|
+
provides :aws_s3_bucket
|
24
|
+
|
5
25
|
def action_create
|
6
26
|
bucket = super
|
7
27
|
|
8
28
|
if new_resource.enable_website_hosting
|
9
29
|
if !bucket.website?
|
10
|
-
converge_by "
|
30
|
+
converge_by "enable website configuration for bucket #{new_resource.name}" do
|
11
31
|
bucket.website_configuration = AWS::S3::WebsiteConfiguration.new(
|
12
32
|
new_resource.website_options)
|
13
33
|
end
|
14
34
|
elsif modifies_website_configuration?(bucket)
|
15
|
-
converge_by "
|
35
|
+
converge_by "reconfigure website configuration for bucket #{new_resource.name} to #{new_resource.website_options}" do
|
16
36
|
bucket.website_configuration = AWS::S3::WebsiteConfiguration.new(
|
17
37
|
new_resource.website_options)
|
18
38
|
end
|
19
39
|
end
|
20
40
|
else
|
21
41
|
if bucket.website?
|
22
|
-
converge_by "
|
42
|
+
converge_by "disable website configuration for bucket #{new_resource.name}" do
|
23
43
|
bucket.website_configuration = nil
|
24
44
|
end
|
25
45
|
end
|
@@ -29,10 +49,10 @@ class Chef::Provider::AwsS3Bucket < Chef::Provisioning::AWSDriver::AWSProvider
|
|
29
49
|
protected
|
30
50
|
|
31
51
|
def create_aws_object
|
32
|
-
converge_by "create
|
33
|
-
|
34
|
-
|
35
|
-
|
52
|
+
converge_by "create S3 bucket #{new_resource.name}" do
|
53
|
+
new_resource.driver.s3.buckets.create(new_resource.name)
|
54
|
+
# S3 buckets already have a top level name property so they don't need
|
55
|
+
# a 'Name' tag
|
36
56
|
end
|
37
57
|
end
|
38
58
|
|
@@ -41,7 +61,11 @@ class Chef::Provider::AwsS3Bucket < Chef::Provisioning::AWSDriver::AWSProvider
|
|
41
61
|
|
42
62
|
def destroy_aws_object(bucket)
|
43
63
|
converge_by "delete S3 bucket #{new_resource.name}" do
|
44
|
-
|
64
|
+
if new_resource.recursive_delete
|
65
|
+
bucket.delete!
|
66
|
+
else
|
67
|
+
bucket.delete
|
68
|
+
end
|
45
69
|
end
|
46
70
|
end
|
47
71
|
|
@@ -4,6 +4,9 @@ require 'ipaddr'
|
|
4
4
|
require 'set'
|
5
5
|
|
6
6
|
class Chef::Provider::AwsSecurityGroup < Chef::Provisioning::AWSDriver::AWSProvider
|
7
|
+
include Chef::Provisioning::AWSDriver::TaggingStrategy::EC2ConvergeTags
|
8
|
+
|
9
|
+
provides :aws_security_group
|
7
10
|
|
8
11
|
def action_create
|
9
12
|
sg = super
|
@@ -14,31 +17,35 @@ class Chef::Provider::AwsSecurityGroup < Chef::Provisioning::AWSDriver::AWSProvi
|
|
14
17
|
protected
|
15
18
|
|
16
19
|
def create_aws_object
|
17
|
-
converge_by "
|
20
|
+
converge_by "create security group #{new_resource.name} in #{region}" do
|
18
21
|
options = { description: new_resource.description }
|
19
22
|
options[:vpc] = new_resource.vpc if new_resource.vpc
|
20
23
|
options = AWSResource.lookup_options(options, resource: new_resource)
|
21
24
|
Chef::Log.debug("VPC: #{options[:vpc]}")
|
22
25
|
|
23
26
|
sg = new_resource.driver.ec2.security_groups.create(new_resource.name, options)
|
27
|
+
retry_with_backoff(AWS::EC2::Errors::InvalidSecurityGroupsID::NotFound) do
|
28
|
+
sg.tags['Name'] = new_resource.name
|
29
|
+
end
|
30
|
+
sg
|
24
31
|
end
|
25
32
|
end
|
26
33
|
|
27
34
|
def update_aws_object(sg)
|
28
35
|
if !new_resource.description.nil? && new_resource.description != sg.description
|
29
|
-
raise "Security
|
36
|
+
raise "Security group descriptions cannot be changed after being created! Desired description for #{new_resource.name} (#{sg.id}) was \"#{new_resource.description}\" and actual description is \"#{sg.description}\""
|
30
37
|
end
|
31
38
|
if !new_resource.vpc.nil?
|
32
39
|
desired_vpc = Chef::Resource::AwsVpc.get_aws_object_id(new_resource.vpc, resource: new_resource)
|
33
40
|
if desired_vpc != sg.vpc_id
|
34
|
-
raise "Security
|
41
|
+
raise "Security group VPC cannot be changed after being created! Desired VPC for #{new_resource.name} (#{sg.id}) was #{new_resource.vpc} (#{desired_vpc}) and actual VPC is #{sg.vpc_id}"
|
35
42
|
end
|
36
43
|
end
|
37
44
|
apply_rules(sg)
|
38
45
|
end
|
39
46
|
|
40
47
|
def destroy_aws_object(sg)
|
41
|
-
converge_by "delete #{new_resource.to_s} in #{region}" do
|
48
|
+
converge_by "delete security group #{new_resource.to_s} in #{region}" do
|
42
49
|
sg.delete
|
43
50
|
end
|
44
51
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'chef/provisioning/aws_driver/aws_provider'
|
2
|
+
|
3
|
+
class Chef::Provider::AwsServerCertificate < Chef::Provisioning::AWSDriver::AWSProvider
|
4
|
+
provides :aws_server_certificate
|
5
|
+
|
6
|
+
def update_aws_object(certificate)
|
7
|
+
Chef::Log.warn("aws_server_certificate does not support modifying an existing certificate")
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_aws_object
|
11
|
+
converge_by "create server certificate #{new_resource.name}" do
|
12
|
+
new_resource.driver.iam.server_certificates.upload(:name => new_resource.name,
|
13
|
+
:certificate_body => new_resource.certificate_body,
|
14
|
+
:private_key => new_resource.private_key)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def destroy_aws_object(certificate)
|
19
|
+
converge_by "delete server certificate #{new_resource.name}" do
|
20
|
+
certificate.delete
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -2,11 +2,12 @@ require 'chef/provisioning/aws_driver/aws_provider'
|
|
2
2
|
require 'date'
|
3
3
|
|
4
4
|
class Chef::Provider::AwsSnsTopic < Chef::Provisioning::AWSDriver::AWSProvider
|
5
|
-
|
5
|
+
provides :aws_sns_topic
|
6
|
+
|
6
7
|
protected
|
7
8
|
|
8
9
|
def create_aws_object
|
9
|
-
converge_by "
|
10
|
+
converge_by "create SNS topic #{new_resource.name} in #{region}" do
|
10
11
|
new_resource.driver.sns.topics.create(new_resource.name)
|
11
12
|
end
|
12
13
|
end
|
@@ -15,7 +16,7 @@ class Chef::Provider::AwsSnsTopic < Chef::Provisioning::AWSDriver::AWSProvider
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def destroy_aws_object(topic)
|
18
|
-
converge_by "
|
19
|
+
converge_by "delete SNS topic #{topic.name} in #{region}" do
|
19
20
|
topic.delete
|
20
21
|
end
|
21
22
|
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'chef/provisioning/aws_driver/aws_provider'
|
2
2
|
|
3
3
|
class Chef::Provider::AwsSqsQueue < Chef::Provisioning::AWSDriver::AWSProvider
|
4
|
-
|
4
|
+
provides :aws_sqs_queue
|
5
|
+
|
5
6
|
def create_aws_object
|
6
|
-
converge_by "create
|
7
|
+
converge_by "create SQS queue #{new_resource.name} in #{region}" do
|
7
8
|
retry_with_backoff(AWS::SQS::Errors::QueueDeletedRecently) do
|
8
9
|
new_resource.driver.sqs.queues.create(new_resource.name, new_resource.options || {})
|
9
10
|
end
|
@@ -4,6 +4,9 @@ require 'date'
|
|
4
4
|
require 'chef/resource/aws_vpc'
|
5
5
|
|
6
6
|
class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
|
7
|
+
include Chef::Provisioning::AWSDriver::TaggingStrategy::EC2ConvergeTags
|
8
|
+
|
9
|
+
provides :aws_subnet
|
7
10
|
|
8
11
|
def action_create
|
9
12
|
subnet = super
|
@@ -30,7 +33,7 @@ class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
|
|
30
33
|
options[:availability_zone] = new_resource.availability_zone if new_resource.availability_zone
|
31
34
|
options = Chef::Provisioning::AWSDriver::AWSResource.lookup_options(options, resource: new_resource)
|
32
35
|
|
33
|
-
converge_by "create
|
36
|
+
converge_by "create subnet #{new_resource.name} with CIDR #{cidr_block} in VPC #{new_resource.vpc} (#{options[:vpc]}) in #{region}" do
|
34
37
|
subnet = new_resource.driver.ec2.subnets.create(cidr_block, options)
|
35
38
|
retry_with_backoff(AWS::EC2::Errors::InvalidSubnetID::NotFound) do
|
36
39
|
subnet.tags['Name'] = new_resource.name
|
@@ -47,7 +50,7 @@ class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
|
|
47
50
|
end
|
48
51
|
vpc = Chef::Resource::AwsVpc.get_aws_object(new_resource.vpc, resource: new_resource)
|
49
52
|
if vpc && subnet.vpc != vpc
|
50
|
-
raise "
|
53
|
+
raise "VPC for subnet #{new_resource.name} is #{new_resource.vpc} (#{vpc.id}), but existing subnet (#{subnet.id})'s vpc is #{subnet.vpc.id}. Modification of subnet VPC is unsupported!"
|
51
54
|
end
|
52
55
|
if new_resource.availability_zone && subnet.availability_zone_name != new_resource.availability_zone
|
53
56
|
raise "availability_zone for subnet #{new_resource.name} is #{new_resource.availability_zone}, but existing subnet (#{subnet.id})'s availability_zone is #{subnet.availability_zone}. Modification of subnet availability_zone is unsupported!"
|
@@ -60,7 +63,7 @@ class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
|
|
60
63
|
p = Chef::ChefFS::Parallelizer.new(5)
|
61
64
|
p.parallel_do(subnet.instances.to_a) do |instance|
|
62
65
|
Cheffish.inline_resource(self, action) do
|
63
|
-
aws_instance instance do
|
66
|
+
aws_instance instance.id do
|
64
67
|
action :purge
|
65
68
|
end
|
66
69
|
end
|
@@ -118,12 +121,12 @@ class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
|
|
118
121
|
# we have work to do here: we need to make the relationship explicit so that
|
119
122
|
# it won't be changed when the main route table of the VPC changes.
|
120
123
|
converge_by "set route table of subnet #{new_resource.name} to #{new_resource.route_table}" do
|
121
|
-
subnet.route_table = route_table
|
124
|
+
subnet.route_table = route_table.id
|
122
125
|
end
|
123
|
-
elsif current_route_table_association.route_table != route_table
|
126
|
+
elsif current_route_table_association.route_table.id != route_table.id
|
124
127
|
# The route table is different now. Change it.
|
125
128
|
converge_by "change route table of subnet #{new_resource.name} to #{new_resource.route_table} (was #{current_route_table_association.route_table.id})" do
|
126
|
-
subnet.route_table = route_table
|
129
|
+
subnet.route_table = route_table.id
|
127
130
|
end
|
128
131
|
end
|
129
132
|
end
|
@@ -134,7 +137,7 @@ class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
|
|
134
137
|
network_acl_id =
|
135
138
|
AWSResource.lookup_options({ network_acl: new_resource.network_acl }, resource: new_resource)[:network_acl]
|
136
139
|
if subnet.network_acl.id != network_acl_id
|
137
|
-
converge_by "update network
|
140
|
+
converge_by "update network ACL of subnet #{new_resource.name} to #{new_resource.network_acl}" do
|
138
141
|
subnet.network_acl = network_acl_id
|
139
142
|
end
|
140
143
|
end
|
@@ -4,6 +4,9 @@ require 'chef/provisioning'
|
|
4
4
|
require 'retryable'
|
5
5
|
|
6
6
|
class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
7
|
+
include Chef::Provisioning::AWSDriver::TaggingStrategy::EC2ConvergeTags
|
8
|
+
|
9
|
+
provides :aws_vpc
|
7
10
|
|
8
11
|
class NeverObtainedExistence < RuntimeError; end
|
9
12
|
|
@@ -42,10 +45,12 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
42
45
|
options = { }
|
43
46
|
options[:instance_tenancy] = new_resource.instance_tenancy if new_resource.instance_tenancy
|
44
47
|
|
45
|
-
converge_by "create
|
48
|
+
converge_by "create VPC #{new_resource.name} in #{region}" do
|
46
49
|
vpc = new_resource.driver.ec2.vpcs.create(new_resource.cidr_block, options)
|
47
50
|
wait_for_state(vpc, [:available])
|
48
|
-
|
51
|
+
retry_with_backoff(AWS::EC2::Errors::InvalidVpcID::NotFound) do
|
52
|
+
vpc.tags['Name'] = new_resource.name
|
53
|
+
end
|
49
54
|
vpc
|
50
55
|
end
|
51
56
|
end
|
@@ -78,34 +83,62 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
78
83
|
end
|
79
84
|
end
|
80
85
|
end
|
81
|
-
|
82
|
-
|
86
|
+
|
87
|
+
vpc.security_groups.each do |sg|
|
88
|
+
unless sg.name == 'default'
|
83
89
|
Cheffish.inline_resource(self, action) do
|
84
|
-
|
90
|
+
aws_security_group sg do
|
85
91
|
action :purge
|
86
92
|
end
|
87
93
|
end
|
88
94
|
end
|
89
95
|
end
|
90
|
-
|
91
|
-
|
96
|
+
|
97
|
+
#SDK V2
|
98
|
+
vpc_new_sdk = new_resource.driver.ec2_resource.vpc(vpc.id)
|
99
|
+
vpc_new_sdk.route_tables.each do |rt|
|
100
|
+
unless rt.associations.any? { |association| association.main }
|
92
101
|
Cheffish.inline_resource(self, action) do
|
93
|
-
|
102
|
+
aws_route_table rt do
|
94
103
|
action :purge
|
95
104
|
end
|
96
105
|
end
|
97
106
|
end
|
98
107
|
end
|
108
|
+
|
109
|
+
vpc_peering_connections = []
|
110
|
+
%w(
|
111
|
+
requester-vpc-info.vpc-id
|
112
|
+
accepter-vpc-info.vpc-id
|
113
|
+
).each do |filter|
|
114
|
+
vpc_peering_connections += new_resource.driver.ec2_client.describe_vpc_peering_connections({
|
115
|
+
:filters => [
|
116
|
+
{
|
117
|
+
:name => filter,
|
118
|
+
:values => [vpc.id]
|
119
|
+
}
|
120
|
+
]
|
121
|
+
}).vpc_peering_connections
|
122
|
+
end
|
123
|
+
|
124
|
+
vpc_peering_connections.each do |pc_type|
|
125
|
+
pc_resource = new_resource.driver.ec2_resource.vpc_peering_connection(pc_type.vpc_peering_connection_id)
|
126
|
+
Cheffish.inline_resource(self, action) do
|
127
|
+
aws_vpc_peering_connection pc_resource do
|
128
|
+
action :purge
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
99
132
|
end
|
100
133
|
|
101
134
|
# Detach or destroy the internet gateway
|
102
135
|
ig = vpc.internet_gateway
|
103
136
|
if ig
|
104
|
-
converge_by "detach Internet
|
137
|
+
converge_by "detach Internet gateway #{ig.id} in #{region} from #{new_resource.to_s}" do
|
105
138
|
ig.detach(vpc.id)
|
106
139
|
end
|
107
140
|
if ig.tags['OwnedByVPC'] == vpc.id
|
108
|
-
converge_by "destroy Internet
|
141
|
+
converge_by "destroy Internet gateway #{ig.id} in #{region} (owned by #{new_resource.to_s})" do
|
109
142
|
ig.delete
|
110
143
|
end
|
111
144
|
end
|
@@ -149,40 +182,40 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
149
182
|
when String, Chef::Resource::AwsInternetGateway, AWS::EC2::InternetGateway
|
150
183
|
new_ig = Chef::Resource::AwsInternetGateway.get_aws_object(new_resource.internet_gateway, resource: new_resource)
|
151
184
|
if !current_ig
|
152
|
-
converge_by "attach Internet
|
185
|
+
converge_by "attach Internet gateway #{new_resource.internet_gateway} to VPC #{vpc.id}" do
|
153
186
|
new_ig.attach(vpc.id)
|
154
187
|
end
|
155
188
|
elsif current_ig != new_ig
|
156
|
-
converge_by "replace Internet
|
189
|
+
converge_by "replace Internet gateway #{current_ig.id} on VPC #{vpc.id} with new Internet gateway #{new_ig.id}" do
|
157
190
|
current_ig.detach(vpc.id)
|
158
191
|
new_ig.attach(vpc.id)
|
159
192
|
end
|
160
193
|
if current_ig.tags['OwnedByVPC'] == vpc.id
|
161
|
-
converge_by "destroy Internet
|
194
|
+
converge_by "destroy Internet gateway #{current_ig.id} in #{region} (owned by VPC #{vpc.id})" do
|
162
195
|
current_ig.delete
|
163
196
|
end
|
164
197
|
end
|
165
198
|
end
|
166
199
|
when true
|
167
200
|
if !current_ig
|
168
|
-
converge_by "attach
|
201
|
+
converge_by "attach Internet gateway to VPC #{vpc.id}" do
|
169
202
|
current_ig = AWS.ec2(config: vpc.config).internet_gateways.create
|
170
203
|
retry_with_backoff(NeverObtainedExistence) do
|
171
|
-
raise NeverObtainedExistence.new("
|
204
|
+
raise NeverObtainedExistence.new("Internet gateway for VPC #{vpc.id} never obtained existence") unless current_ig.exists?
|
172
205
|
end
|
173
|
-
action_handler.report_progress "create Internet
|
206
|
+
action_handler.report_progress "create Internet gateway #{current_ig.id}"
|
174
207
|
current_ig.tags['OwnedByVPC'] = vpc.id
|
175
|
-
action_handler.report_progress "tag Internet
|
208
|
+
action_handler.report_progress "tag Internet gateway #{current_ig.id} as OwnedByVpc: #{vpc.id}"
|
176
209
|
vpc.internet_gateway = current_ig
|
177
210
|
end
|
178
211
|
end
|
179
212
|
when false
|
180
213
|
if current_ig
|
181
|
-
converge_by "detach Internet
|
214
|
+
converge_by "detach Internet gateway #{current_ig.id} from VPC #{vpc.id}" do
|
182
215
|
current_ig.detach(vpc.id)
|
183
216
|
end
|
184
217
|
if current_ig.tags['OwnedByVPC'] == vpc.id
|
185
|
-
converge_by "destroy Internet
|
218
|
+
converge_by "destroy Internet gateway #{current_ig.id} in #{region} (owned by VPC #{vpc.id})" do
|
186
219
|
current_ig.delete
|
187
220
|
end
|
188
221
|
end
|
@@ -193,7 +226,7 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
193
226
|
def update_main_route_table(vpc)
|
194
227
|
desired_route_table = Chef::Resource::AwsRouteTable.get_aws_object(new_resource.main_route_table, resource: new_resource)
|
195
228
|
current_route_table = vpc.route_tables.main_route_table
|
196
|
-
if current_route_table != desired_route_table
|
229
|
+
if current_route_table.id != desired_route_table.id
|
197
230
|
main_association = current_route_table.associations.select { |a| a.main? }.first
|
198
231
|
if !main_association
|
199
232
|
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."
|
@@ -214,7 +247,7 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
214
247
|
# creating the VPC
|
215
248
|
main_route_table ||= vpc.route_tables.main_route_table
|
216
249
|
main_routes = new_resource.main_routes
|
217
|
-
aws_route_table main_route_table do
|
250
|
+
aws_route_table main_route_table.id do
|
218
251
|
vpc vpc
|
219
252
|
routes main_routes
|
220
253
|
end
|