chef-provisioning-aws 2.2.2 → 3.0.0.pre.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/chef-provisioning-aws.gemspec +0 -1
- data/lib/chef/provider/aws_auto_scaling_group.rb +9 -6
- data/lib/chef/provider/aws_dhcp_options.rb +21 -11
- data/lib/chef/provider/aws_ebs_volume.rb +26 -24
- data/lib/chef/provider/aws_eip_address.rb +11 -12
- data/lib/chef/provider/aws_image.rb +1 -1
- data/lib/chef/provider/aws_internet_gateway.rb +18 -10
- data/lib/chef/provider/aws_key_pair.rb +6 -6
- data/lib/chef/provider/aws_launch_configuration.rb +7 -9
- data/lib/chef/provider/aws_nat_gateway.rb +2 -2
- data/lib/chef/provider/aws_network_acl.rb +11 -8
- data/lib/chef/provider/aws_network_interface.rb +34 -29
- data/lib/chef/provider/aws_rds_parameter_group.rb +1 -1
- data/lib/chef/provider/aws_rds_subnet_group.rb +1 -1
- data/lib/chef/provider/aws_route_table.rb +7 -7
- data/lib/chef/provider/aws_s3_bucket.rb +24 -12
- data/lib/chef/provider/aws_security_group.rb +202 -25
- data/lib/chef/provider/aws_server_certificate.rb +3 -4
- data/lib/chef/provider/aws_sns_topic.rb +4 -3
- data/lib/chef/provider/aws_sqs_queue.rb +7 -3
- data/lib/chef/provider/aws_subnet.rb +45 -21
- data/lib/chef/provider/aws_vpc.rb +59 -30
- data/lib/chef/provisioning/aws_driver/aws_provider.rb +12 -3
- data/lib/chef/provisioning/aws_driver/aws_resource.rb +2 -2
- data/lib/chef/provisioning/aws_driver/aws_resource_with_entry.rb +1 -1
- data/lib/chef/provisioning/aws_driver/aws_tagger.rb +2 -2
- data/lib/chef/provisioning/aws_driver/credentials.rb +1 -1
- data/lib/chef/provisioning/aws_driver/credentials2.rb +5 -1
- data/lib/chef/provisioning/aws_driver/driver.rb +124 -34
- data/lib/chef/provisioning/aws_driver/tagging_strategy/rds.rb +4 -4
- data/lib/chef/provisioning/aws_driver/tagging_strategy/s3.rb +1 -1
- data/lib/chef/provisioning/aws_driver/version.rb +1 -1
- data/lib/chef/resource/aws_auto_scaling_group.rb +2 -2
- data/lib/chef/resource/aws_cache_cluster.rb +4 -4
- data/lib/chef/resource/aws_cache_replication_group.rb +3 -3
- data/lib/chef/resource/aws_cache_subnet_group.rb +4 -4
- data/lib/chef/resource/aws_cloudsearch_domain.rb +1 -1
- data/lib/chef/resource/aws_cloudwatch_alarm.rb +1 -1
- data/lib/chef/resource/aws_dhcp_options.rb +10 -3
- data/lib/chef/resource/aws_ebs_volume.rb +10 -4
- data/lib/chef/resource/aws_eip_address.rb +4 -4
- data/lib/chef/resource/aws_elasticsearch_domain.rb +1 -1
- data/lib/chef/resource/aws_iam_role.rb +1 -1
- data/lib/chef/resource/aws_internet_gateway.rb +11 -4
- data/lib/chef/resource/aws_key_pair.rb +4 -3
- data/lib/chef/resource/aws_launch_configuration.rb +5 -4
- data/lib/chef/resource/aws_load_balancer.rb +14 -3
- data/lib/chef/resource/aws_nat_gateway.rb +2 -2
- data/lib/chef/resource/aws_network_acl.rb +10 -10
- data/lib/chef/resource/aws_network_interface.rb +12 -6
- data/lib/chef/resource/aws_rds_parameter_group.rb +6 -6
- data/lib/chef/resource/aws_rds_subnet_group.rb +4 -5
- data/lib/chef/resource/aws_route53_record_set.rb +1 -1
- data/lib/chef/resource/aws_route_table.rb +1 -1
- data/lib/chef/resource/aws_s3_bucket.rb +3 -2
- data/lib/chef/resource/aws_security_group.rb +6 -6
- data/lib/chef/resource/aws_server_certificate.rb +4 -5
- data/lib/chef/resource/aws_sns_topic.rb +4 -4
- data/lib/chef/resource/aws_sqs_queue.rb +3 -3
- data/lib/chef/resource/aws_subnet.rb +5 -5
- data/lib/chef/resource/aws_vpc.rb +12 -6
- data/lib/chef/resource/aws_vpc_peering_connection.rb +2 -2
- data/spec/aws_support.rb +12 -9
- data/spec/aws_support/deep_matcher/match_values_failure_messages.rb +15 -5
- data/spec/integration/aws_dhcp_options_spec.rb +7 -7
- data/spec/integration/aws_ebs_volume_spec.rb +1 -1
- data/spec/integration/aws_internet_gateway_spec.rb +19 -18
- data/spec/integration/aws_key_pair_spec.rb +1 -1
- data/spec/integration/aws_nat_gateway_spec.rb +3 -6
- data/spec/integration/aws_network_acl_spec.rb +19 -11
- data/spec/integration/aws_network_interface_spec.rb +26 -20
- data/spec/integration/aws_rds_instance_spec.rb +6 -7
- data/spec/integration/aws_rds_subnet_group_spec.rb +6 -6
- data/spec/integration/aws_route53_hosted_zone_spec.rb +1 -1
- data/spec/integration/aws_s3_bucket_spec.rb +1 -2
- data/spec/integration/aws_security_group_spec.rb +272 -198
- data/spec/integration/aws_server_certificate_spec.rb +60 -78
- data/spec/integration/aws_subnet_spec.rb +8 -4
- data/spec/integration/aws_vpc_spec.rb +29 -23
- data/spec/integration/machine_spec.rb +1 -1
- data/spec/unit/chef/provisioning/aws_driver/credentials_spec.rb +13 -0
- data/spec/unit/chef/provisioning/aws_driver/driver_spec.rb +1 -1
- data/spec/unit/chef/provisioning/aws_driver/route53_spec.rb +1 -1
- metadata +5 -20
- data/spec/persistence_file.txt +0 -220
@@ -10,12 +10,11 @@ class Chef::Provider::AwsServerCertificate < Chef::Provisioning::AWSDriver::AWSP
|
|
10
10
|
def create_aws_object
|
11
11
|
converge_by "create server certificate #{new_resource.name}" do
|
12
12
|
opts = {
|
13
|
-
:
|
13
|
+
:server_certificate_name => new_resource.name,
|
14
14
|
:certificate_body => new_resource.certificate_body,
|
15
|
-
:private_key => new_resource.private_key
|
16
|
-
}
|
15
|
+
:private_key => new_resource.private_key }
|
17
16
|
opts[:certificate_chain] = new_resource.certificate_chain if new_resource.certificate_chain
|
18
|
-
new_resource.driver.iam.
|
17
|
+
new_resource.driver.iam.upload_server_certificate(**opts)
|
19
18
|
end
|
20
19
|
end
|
21
20
|
|
@@ -8,7 +8,7 @@ class Chef::Provider::AwsSnsTopic < Chef::Provisioning::AWSDriver::AWSProvider
|
|
8
8
|
|
9
9
|
def create_aws_object
|
10
10
|
converge_by "create SNS topic #{new_resource.name} in #{region}" do
|
11
|
-
new_resource.driver.sns.
|
11
|
+
new_resource.driver.sns.create_topic(name: new_resource.name)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -16,8 +16,9 @@ class Chef::Provider::AwsSnsTopic < Chef::Provisioning::AWSDriver::AWSProvider
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def destroy_aws_object(topic)
|
19
|
-
|
20
|
-
|
19
|
+
topic_arn_name = topic.attributes.values_at("TopicArn").first
|
20
|
+
converge_by "delete SNS topic_arn #{topic_arn_name} in #{region}" do
|
21
|
+
new_resource.driver.sns.delete_topic(topic_arn: topic_arn_name)
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
@@ -4,9 +4,13 @@ class Chef::Provider::AwsSqsQueue < Chef::Provisioning::AWSDriver::AWSProvider
|
|
4
4
|
provides :aws_sqs_queue
|
5
5
|
|
6
6
|
def create_aws_object
|
7
|
+
options = AWSResource.lookup_options(new_resource.options || {}, resource: new_resource)
|
8
|
+
option_sqs = {}
|
9
|
+
option_sqs[:queue_name] = new_resource.name if new_resource.name
|
10
|
+
option_sqs[:attributes] = options
|
7
11
|
converge_by "create SQS queue #{new_resource.name} in #{region}" do
|
8
|
-
retry_with_backoff(
|
9
|
-
new_resource.driver.sqs.
|
12
|
+
retry_with_backoff(::Aws::SQS::Errors::QueueDeletedRecently) do
|
13
|
+
new_resource.driver.sqs.create_queue(option_sqs)
|
10
14
|
end
|
11
15
|
end
|
12
16
|
end
|
@@ -16,7 +20,7 @@ class Chef::Provider::AwsSqsQueue < Chef::Provisioning::AWSDriver::AWSProvider
|
|
16
20
|
|
17
21
|
def destroy_aws_object(queue)
|
18
22
|
converge_by "delete SQS queue #{new_resource.name} in #{region}" do
|
19
|
-
queue.
|
23
|
+
new_resource.driver.sqs.delete_queue(queue_url: queue.queue_url)
|
20
24
|
end
|
21
25
|
end
|
22
26
|
end
|
@@ -29,15 +29,15 @@ class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
|
|
29
29
|
if !cidr_block
|
30
30
|
cidr_block = Chef::Resource::AwsVpc.get_aws_object(new_resource.vpc, resource: new_resource).cidr_block
|
31
31
|
end
|
32
|
-
options = { :
|
32
|
+
options = { vpc_id: new_resource.vpc, cidr_block: cidr_block }
|
33
33
|
options[:availability_zone] = new_resource.availability_zone if new_resource.availability_zone
|
34
34
|
options = Chef::Provisioning::AWSDriver::AWSResource.lookup_options(options, resource: new_resource)
|
35
35
|
|
36
|
-
converge_by "create subnet #{new_resource.name} with CIDR #{cidr_block} in VPC #{new_resource.vpc} (#{options[:
|
37
|
-
subnet = new_resource.driver.
|
38
|
-
retry_with_backoff(
|
39
|
-
subnet.tags[
|
40
|
-
subnet.tags[
|
36
|
+
converge_by "create subnet #{new_resource.name} with CIDR #{cidr_block} in VPC #{new_resource.vpc} (#{options[:vpc_id]}) in #{region}" do
|
37
|
+
subnet = new_resource.driver.ec2_resource.create_subnet(options)
|
38
|
+
retry_with_backoff(::Aws::EC2::Errors::InvalidSubnetIDNotFound) do
|
39
|
+
new_resource.driver.ec2_resource.create_tags(resources: [subnet.id],tags: [{key: "Name", value: new_resource.name}])
|
40
|
+
new_resource.driver.ec2_resource.create_tags(resources: [subnet.id],tags: [{key: "VPC", value: new_resource.vpc}])
|
41
41
|
end
|
42
42
|
subnet
|
43
43
|
end
|
@@ -49,10 +49,10 @@ class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
|
|
49
49
|
raise "cidr_block for subnet #{new_resource.name} is #{new_resource.cidr_block}, but existing subnet (#{subnet.id})'s cidr_block is #{subnet.cidr_block}. Modification of subnet cidr_block is unsupported!"
|
50
50
|
end
|
51
51
|
vpc = Chef::Resource::AwsVpc.get_aws_object(new_resource.vpc, resource: new_resource)
|
52
|
-
if vpc && subnet.vpc != vpc
|
52
|
+
if vpc && subnet.vpc.id != vpc.id
|
53
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!"
|
54
54
|
end
|
55
|
-
if new_resource.availability_zone && subnet.
|
55
|
+
if new_resource.availability_zone && subnet.availability_zone != new_resource.availability_zone
|
56
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!"
|
57
57
|
end
|
58
58
|
end
|
@@ -76,7 +76,7 @@ class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
|
|
76
76
|
# It is common during subnet purging for the instance to be terminated but
|
77
77
|
# temporarily hanging around - this causes a `The network interface at device index 0 cannot be detached`
|
78
78
|
# error to be raised when trying to detach
|
79
|
-
retry_with_backoff(
|
79
|
+
retry_with_backoff(::Aws::EC2::Errors::OperationNotPermitted) do
|
80
80
|
Cheffish.inline_resource(self, action) do
|
81
81
|
aws_network_interface network do
|
82
82
|
action :purge
|
@@ -91,7 +91,7 @@ class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
|
|
91
91
|
# If the subnet doesn't exist we can't check state on it - state can only be :pending or :available
|
92
92
|
begin
|
93
93
|
subnet.delete
|
94
|
-
rescue
|
94
|
+
rescue ::Aws::EC2::Errors::InvalidSubnetIDNotFound
|
95
95
|
end
|
96
96
|
end
|
97
97
|
end
|
@@ -100,7 +100,7 @@ class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
|
|
100
100
|
|
101
101
|
def update_map_public_ip_on_launch(subnet)
|
102
102
|
if !new_resource.map_public_ip_on_launch.nil?
|
103
|
-
subnet_desc = subnet.client.describe_subnets(subnet_ids: [ subnet.id ])[:
|
103
|
+
subnet_desc = subnet.client.describe_subnets(subnet_ids: [ subnet.id ])[:subnets].first
|
104
104
|
if new_resource.map_public_ip_on_launch
|
105
105
|
if !subnet_desc[:map_public_ip_on_launch]
|
106
106
|
converge_by "turn on automatic public IPs for subnet #{subnet.id}" do
|
@@ -118,26 +118,46 @@ class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
|
|
118
118
|
end
|
119
119
|
|
120
120
|
def update_route_table(subnet)
|
121
|
+
current_route_table_association = subnet.client.describe_route_tables(filters: [{name: "vpc-id", values: [subnet.vpc.id]}]).route_tables
|
122
|
+
route_table_entry = nil
|
123
|
+
do_break = false
|
124
|
+
# Below snippet gives the entry of route_table who is associated with current subnet either by matching its
|
125
|
+
# subnet_id or with a default subnet (i.e by checking association.main == true & in that case
|
126
|
+
# association.subnet_id is nil)
|
127
|
+
current_route_table_association.each do |route_tbl|
|
128
|
+
if !route_tbl.associations.empty?
|
129
|
+
route_tbl.associations.each do |r|
|
130
|
+
if r.subnet_id == subnet.id
|
131
|
+
route_table_entry = r
|
132
|
+
do_break = true
|
133
|
+
break
|
134
|
+
elsif r.subnet_id.nil? && r.main == true
|
135
|
+
route_table_entry = r
|
136
|
+
end
|
137
|
+
end
|
138
|
+
break if do_break
|
139
|
+
end
|
140
|
+
end
|
121
141
|
if new_resource.route_table == :default_to_main
|
122
|
-
if !
|
142
|
+
if !route_table_entry.main
|
123
143
|
converge_by "reset route table of subnet #{new_resource.name} to the VPC default" do
|
124
|
-
subnet.
|
144
|
+
subnet.client.disassociate_route_table(association_id: route_table_entry.route_table_association_id)
|
125
145
|
end
|
126
146
|
end
|
127
147
|
else
|
128
148
|
route_table = Chef::Resource::AwsRouteTable.get_aws_object(new_resource.route_table, resource: new_resource)
|
129
|
-
|
130
|
-
if current_route_table_association.main?
|
149
|
+
if route_table_entry.main && route_table_entry.subnet_id.nil?
|
131
150
|
# Even if the user sets the route table explicitly to the main route table,
|
132
151
|
# we have work to do here: we need to make the relationship explicit so that
|
133
152
|
# it won't be changed when the main route table of the VPC changes.
|
134
153
|
converge_by "set route table of subnet #{new_resource.name} to #{new_resource.route_table}" do
|
135
|
-
subnet.route_table
|
154
|
+
subnet.client.associate_route_table(route_table_id: route_table.id, subnet_id: subnet.id)
|
136
155
|
end
|
137
|
-
elsif
|
156
|
+
elsif route_table_entry.route_table_id != route_table.id
|
138
157
|
# The route table is different now. Change it.
|
139
|
-
converge_by "change route table of subnet #{new_resource.name} to #{new_resource.route_table} (was #{
|
140
|
-
subnet.
|
158
|
+
converge_by "change route table of subnet #{new_resource.name} to #{new_resource.route_table} (was #{route_table_entry.route_table_id})" do
|
159
|
+
subnet.client.disassociate_route_table(association_id: route_table_entry.route_table_association_id) if route_table_entry.main == false
|
160
|
+
subnet.client.associate_route_table(route_table_id: route_table.id, subnet_id: subnet.id)
|
141
161
|
end
|
142
162
|
end
|
143
163
|
end
|
@@ -147,9 +167,13 @@ class Chef::Provider::AwsSubnet < Chef::Provisioning::AWSDriver::AWSProvider
|
|
147
167
|
if new_resource.network_acl
|
148
168
|
network_acl_id =
|
149
169
|
AWSResource.lookup_options({ network_acl: new_resource.network_acl }, resource: new_resource)[:network_acl]
|
150
|
-
|
170
|
+
# Below snippet gives the entry of network_acl who is associated with current subnet by matching its subnet_id
|
171
|
+
network_acl_association = subnet.client.describe_network_acls(filters: [{name: "vpc-id", values: [subnet.vpc.id]}, {name: "association.subnet-id", values: [subnet.id]}]).network_acls.first.associations
|
172
|
+
current_network_acl_association = network_acl_association.find { |r| r.subnet_id == subnet.id } unless network_acl_association.empty?
|
173
|
+
|
174
|
+
if current_network_acl_association.network_acl_id != network_acl_id && !current_network_acl_association.nil?
|
151
175
|
converge_by "update network ACL of subnet #{new_resource.name} to #{new_resource.network_acl}" do
|
152
|
-
subnet.
|
176
|
+
subnet.client.replace_network_acl_association(association_id: current_network_acl_association.network_acl_association_id, network_acl_id: network_acl_id)
|
153
177
|
end
|
154
178
|
end
|
155
179
|
end
|
@@ -42,21 +42,23 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
42
42
|
protected
|
43
43
|
|
44
44
|
def create_aws_object
|
45
|
-
options = {
|
45
|
+
options = {}
|
46
46
|
options[:instance_tenancy] = new_resource.instance_tenancy if new_resource.instance_tenancy
|
47
|
+
options[:cidr_block] = new_resource.cidr_block
|
47
48
|
|
48
49
|
converge_by "create VPC #{new_resource.name} in #{region}" do
|
49
|
-
|
50
|
+
ec2_resource = ::Aws::EC2::Resource.new(new_resource.driver.ec2)
|
51
|
+
vpc = ec2_resource.create_vpc({ cidr_block: new_resource.cidr_block, instance_tenancy: options[:instance_tenancy] })
|
50
52
|
wait_for_state(vpc, [:available])
|
51
|
-
retry_with_backoff(
|
52
|
-
vpc.tags[
|
53
|
+
retry_with_backoff(::Aws::EC2::Errors::InvalidVpcIDNotFound) do
|
54
|
+
ec2_resource.create_tags(resources: [vpc.vpc_id], tags: [{ key: "Name", value: new_resource.name }])
|
53
55
|
end
|
54
56
|
vpc
|
55
57
|
end
|
56
58
|
end
|
57
59
|
|
58
60
|
def update_aws_object(vpc)
|
59
|
-
if new_resource.instance_tenancy && new_resource.instance_tenancy != vpc.instance_tenancy
|
61
|
+
if new_resource.instance_tenancy && new_resource.instance_tenancy.to_s != vpc.instance_tenancy
|
60
62
|
raise "Tenancy of VPC #{new_resource.name} is #{vpc.instance_tenancy}, but desired tenancy is #{new_resource.instance_tenancy}. Instance tenancy of VPCs cannot be changed!"
|
61
63
|
end
|
62
64
|
if new_resource.cidr_block && new_resource.cidr_block != vpc.cidr_block
|
@@ -71,8 +73,8 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
71
73
|
#SDK V2
|
72
74
|
nat_gateways = new_resource.driver.ec2_client.describe_nat_gateways({
|
73
75
|
:filter => [
|
74
|
-
{ name:
|
75
|
-
{ name:
|
76
|
+
{ name: "vpc-id", values: [vpc.id] },
|
77
|
+
{ name: "state", values: ["available", "pending"] },
|
76
78
|
]
|
77
79
|
}).nat_gateways
|
78
80
|
|
@@ -100,7 +102,7 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
100
102
|
# If any of the below resources start needing complicated delete logic (dependent resources needing to
|
101
103
|
# be deleted) move that logic into `delete_aws_resource` and add the purging logic to the resource
|
102
104
|
vpc.network_acls.each do |na|
|
103
|
-
next if na.
|
105
|
+
next if na.is_default
|
104
106
|
Cheffish.inline_resource(self, action) do
|
105
107
|
aws_network_acl na do
|
106
108
|
action :purge
|
@@ -118,8 +120,9 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
118
120
|
end
|
119
121
|
end
|
120
122
|
end
|
123
|
+
|
121
124
|
vpc.security_groups.each do |sg|
|
122
|
-
next if sg.
|
125
|
+
next if sg.group_name == "default"
|
123
126
|
Cheffish.inline_resource(self, action) do
|
124
127
|
aws_security_group sg do
|
125
128
|
action :purge
|
@@ -151,9 +154,9 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
151
154
|
:filters => [
|
152
155
|
{
|
153
156
|
:name => filter,
|
154
|
-
:values => [vpc.id]
|
155
|
-
}
|
156
|
-
]
|
157
|
+
:values => [vpc.id],
|
158
|
+
},
|
159
|
+
],
|
157
160
|
}).vpc_peering_connections
|
158
161
|
end
|
159
162
|
|
@@ -170,11 +173,13 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
170
173
|
end
|
171
174
|
|
172
175
|
# Detach or destroy the internet gateway
|
173
|
-
ig = vpc.
|
176
|
+
ig = vpc.internet_gateways.first
|
174
177
|
if ig
|
175
178
|
Cheffish.inline_resource(self, action) do
|
176
179
|
aws_internet_gateway ig do
|
177
|
-
|
180
|
+
ig_tag = ig.tags.find { |i| i.key == "OwnedByVPC" }
|
181
|
+
ig_vpc = ig_tag.value unless ig_tag.nil?
|
182
|
+
if ig_vpc == vpc.id
|
178
183
|
action :purge
|
179
184
|
else
|
180
185
|
action :detach
|
@@ -218,11 +223,11 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
218
223
|
end
|
219
224
|
|
220
225
|
def update_internet_gateway(vpc)
|
221
|
-
current_ig = vpc.
|
226
|
+
current_ig = vpc.internet_gateways.first
|
222
227
|
current_driver = self.new_resource.driver
|
223
228
|
current_chef_server = self.new_resource.chef_server
|
224
229
|
case new_resource.internet_gateway
|
225
|
-
when String, Chef::Resource::AwsInternetGateway,
|
230
|
+
when String, Chef::Resource::AwsInternetGateway, ::Aws::EC2::InternetGateway
|
226
231
|
new_ig = Chef::Resource::AwsInternetGateway.get_aws_object(new_resource.internet_gateway, resource: new_resource)
|
227
232
|
if !current_ig
|
228
233
|
Cheffish.inline_resource(self, action) do
|
@@ -239,7 +244,9 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
239
244
|
elsif current_ig != new_ig
|
240
245
|
Cheffish.inline_resource(self, action) do
|
241
246
|
aws_internet_gateway current_ig do
|
242
|
-
|
247
|
+
ig_tag = current_ig.tags.find { |i| i.key == "OwnedByVPC" }
|
248
|
+
ig_vpc = ig_tag.value unless ig_tag.nil?
|
249
|
+
if ig_vpc == vpc.id
|
243
250
|
action :destroy
|
244
251
|
else
|
245
252
|
action :detach
|
@@ -268,8 +275,10 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
268
275
|
when false
|
269
276
|
if current_ig
|
270
277
|
Cheffish.inline_resource(self, action) do
|
271
|
-
aws_internet_gateway current_ig
|
272
|
-
|
278
|
+
aws_internet_gateway current_ig do
|
279
|
+
ig_tag = current_ig.tags.find { |i| i.key == "OwnedByVPC" }
|
280
|
+
ig_vpc = ig_tag.value unless ig_tag.nil?
|
281
|
+
if ig_vpc == vpc.id
|
273
282
|
action :destroy
|
274
283
|
else
|
275
284
|
action :detach
|
@@ -284,15 +293,28 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
284
293
|
|
285
294
|
def update_main_route_table(vpc)
|
286
295
|
desired_route_table = Chef::Resource::AwsRouteTable.get_aws_object(new_resource.main_route_table, resource: new_resource)
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
296
|
+
main_route_table = nil
|
297
|
+
current_route_table = nil
|
298
|
+
# Below snippet gives the entry of main_route_table and current_route_table entry who is associated with current vpc.It is an replacement of "vpc.route_tables.main_route_table"
|
299
|
+
vpc.route_tables.entries.each do |entry|
|
300
|
+
if !entry.associations.empty?
|
301
|
+
entry.associations.each do |r|
|
302
|
+
if r.main == true
|
303
|
+
main_route_table = r
|
304
|
+
elsif r.main == false
|
305
|
+
current_route_table = r
|
306
|
+
end
|
307
|
+
end
|
292
308
|
end
|
293
|
-
|
309
|
+
end
|
310
|
+
current_route_table ||= main_route_table
|
311
|
+
if current_route_table.route_table_id != desired_route_table.id
|
312
|
+
if main_route_table.nil?
|
313
|
+
raise "No main route table association found for #{new_resource.to_s} current main route table. error! Probably a race condition."
|
314
|
+
end
|
315
|
+
converge_by "change main route table for #{new_resource.to_s} to #{desired_route_table.id} (was #{current_route_table.route_table_id})" do
|
294
316
|
vpc.client.replace_route_table_association(
|
295
|
-
association_id:
|
317
|
+
association_id: main_route_table.id,
|
296
318
|
route_table_id: desired_route_table.id
|
297
319
|
)
|
298
320
|
end
|
@@ -304,12 +326,16 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
304
326
|
# If no route table is provided and we fetch the current main one from AWS,
|
305
327
|
# there is no guarantee that is the 'default' route table created when
|
306
328
|
# creating the VPC
|
307
|
-
main_route_table
|
329
|
+
main_route_table = nil
|
330
|
+
# Below snippet gives the entry of main_route_table entry who is associated with current vpc.It is an replacement of "vpc.route_tables.main_route_table"
|
331
|
+
vpc.route_tables.entries.each do |entry|
|
332
|
+
main_route_table = entry.associations.find { |r| r.main == true } unless entry.associations.empty?
|
333
|
+
end
|
308
334
|
main_routes = new_resource.main_routes
|
309
335
|
current_driver = self.new_resource.driver
|
310
336
|
current_chef_server = self.new_resource.chef_server
|
311
337
|
Cheffish.inline_resource(self, action) do
|
312
|
-
aws_route_table main_route_table.
|
338
|
+
aws_route_table main_route_table.route_table_id do
|
313
339
|
vpc vpc
|
314
340
|
routes main_routes
|
315
341
|
driver current_driver
|
@@ -322,9 +348,12 @@ class Chef::Provider::AwsVpc < Chef::Provisioning::AWSDriver::AWSProvider
|
|
322
348
|
def update_dhcp_options(vpc)
|
323
349
|
dhcp_options = vpc.dhcp_options
|
324
350
|
desired_dhcp_options = Chef::Resource::AwsDhcpOptions.get_aws_object(new_resource.dhcp_options, resource: new_resource)
|
325
|
-
if dhcp_options != desired_dhcp_options
|
351
|
+
if dhcp_options.id != desired_dhcp_options.id
|
326
352
|
converge_by "change DHCP options for #{new_resource.to_s} to #{new_resource.dhcp_options} (#{desired_dhcp_options.id}) - was #{dhcp_options.id}" do
|
327
|
-
vpc.
|
353
|
+
vpc.associate_dhcp_options({
|
354
|
+
dhcp_options_id: desired_dhcp_options.id, # required
|
355
|
+
dry_run: false,
|
356
|
+
})
|
328
357
|
end
|
329
358
|
end
|
330
359
|
end
|
@@ -29,7 +29,7 @@ class AWSProvider < Chef::Provider::LWRPBase
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def region
|
32
|
-
new_resource.driver.region
|
32
|
+
new_resource.driver.aws_config[:region]
|
33
33
|
end
|
34
34
|
|
35
35
|
#
|
@@ -273,9 +273,18 @@ class AWSProvider < Chef::Provider::LWRPBase
|
|
273
273
|
Chef::Log.debug("Current exception in wait_for is #{exception.inspect}") if exception
|
274
274
|
begin
|
275
275
|
yield(aws_object) if block_given?
|
276
|
-
|
276
|
+
if aws_object.class.to_s.eql?("Aws::EC2::Vpc")
|
277
|
+
vpc = new_resource.driver.ec2.describe_vpcs(vpc_ids: [aws_object.vpc_id]).vpcs
|
278
|
+
current_response = "[:#{vpc[0].state}]"
|
279
|
+
elsif aws_object.class.to_s.eql?("Aws::EC2::NetworkInterface")
|
280
|
+
result = new_resource.driver.ec2_resource.network_interface(aws_object.id)
|
281
|
+
current_response = "[:#{result.status}]"
|
282
|
+
current_response = "[:in_use]" if current_response.eql?("[:in-use]")
|
283
|
+
elsif aws_object.class.to_s.eql?("Aws::EC2::NatGateway")
|
284
|
+
current_response = "[:#{aws_object.state}]"
|
285
|
+
end
|
277
286
|
Chef::Log.debug("Current response in wait_for from [#{query_method}] is #{current_response}")
|
278
|
-
unless expected_responses.include?(current_response)
|
287
|
+
unless expected_responses.to_s.include?(current_response)
|
279
288
|
raise StatusTimeoutError.new(aws_object, current_response, expected_responses)
|
280
289
|
end
|
281
290
|
rescue *acceptable_errors
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'aws'
|
1
|
+
require 'aws-sdk'
|
2
2
|
require 'chef/provisioning/aws_driver/super_lwrp'
|
3
3
|
require 'chef/provisioning/chef_managed_entry_store'
|
4
4
|
# Enough resources will eventually require this that we put 1 require in here
|
@@ -87,7 +87,7 @@ module AWSDriver
|
|
87
87
|
# `AWSResource.lookup_options` will translate each ID with
|
88
88
|
# `AwsSubnet.get_aws_object('subnet1')`, which supports Chef names
|
89
89
|
# (`mysubnet`) as well as AWS subnet Ids (`subnet-1234abcd`) or AWS objects
|
90
|
-
# (
|
90
|
+
# (`::Aws::EC2::Subnet`).
|
91
91
|
#
|
92
92
|
# Keys that represent non-AWS-objects (such as `timeout`) are left alone.
|
93
93
|
#
|
@@ -20,7 +20,7 @@ class Chef::Provisioning::AWSDriver::AWSResourceWithEntry < Chef::Provisioning::
|
|
20
20
|
#
|
21
21
|
# Save the ID of this object to Chef.
|
22
22
|
#
|
23
|
-
# @param aws_object [
|
23
|
+
# @param aws_object [::Aws::EC2::Core] The AWS object containing the ID.
|
24
24
|
# @param action_handler [Chef::Provisioning::ActionHandler] The action handler,
|
25
25
|
# which handles progress reporting, update reporting ("little green text")
|
26
26
|
# and dry run.
|
@@ -16,7 +16,7 @@ class AWSTagger
|
|
16
16
|
def_delegators :@tagging_strategy, :desired_tags, :current_tags, :set_tags, :delete_tags
|
17
17
|
|
18
18
|
def converge_tags
|
19
|
-
if desired_tags.nil?
|
19
|
+
if desired_tags.nil? || desired_tags.empty?
|
20
20
|
Chef::Log.debug "aws_tags not provided, nothing to converge"
|
21
21
|
return
|
22
22
|
end
|
@@ -37,7 +37,7 @@ class AWSTagger
|
|
37
37
|
Retryable.retryable(
|
38
38
|
:tries => 20,
|
39
39
|
:sleep => lambda { |n| [2**n, 10].min },
|
40
|
-
:on => [
|
40
|
+
:on => [::Aws::EC2::Errors, Aws::S3::Errors, ::Aws::S3::Errors::ServiceError,]
|
41
41
|
) do |retries, exception|
|
42
42
|
if retries > 0
|
43
43
|
Chef::Log.info "Retrying the tagging, previous try failed with #{exception.inspect}"
|