chef-provisioning-aws 1.6.1 → 1.7.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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +37 -0
  3. data/Rakefile +8 -5
  4. data/chef-provisioning-aws.gemspec +3 -3
  5. data/lib/chef/provider/aws_cloudsearch_domain.rb +5 -3
  6. data/lib/chef/provider/aws_elasticsearch_domain.rb +131 -0
  7. data/lib/chef/provider/aws_key_pair.rb +2 -2
  8. data/lib/chef/provider/aws_rds_instance.rb +7 -5
  9. data/lib/chef/provider/aws_rds_subnet_group.rb +7 -7
  10. data/lib/chef/provider/aws_route_table.rb +5 -1
  11. data/lib/chef/provider/aws_server_certificate.rb +4 -3
  12. data/lib/chef/provisioning/aws_driver.rb +1 -0
  13. data/lib/chef/provisioning/aws_driver/aws_provider.rb +2 -1
  14. data/lib/chef/provisioning/aws_driver/driver.rb +109 -38
  15. data/lib/chef/provisioning/aws_driver/tagging_strategy/elasticsearch.rb +40 -0
  16. data/lib/chef/provisioning/aws_driver/version.rb +1 -1
  17. data/lib/chef/resource/aws_eip_address.rb +4 -24
  18. data/lib/chef/resource/aws_elasticsearch_domain.rb +42 -0
  19. data/lib/chef/resource/aws_rds_instance.rb +12 -7
  20. data/lib/chef/resource/aws_route53_hosted_zone.rb +1 -1
  21. data/spec/aws_support.rb +2 -2
  22. data/spec/integration/aws_eip_address_spec.rb +32 -18
  23. data/spec/integration/aws_elasticsearch_domain_spec.rb +119 -0
  24. data/spec/integration/aws_key_pair_spec.rb +2 -1
  25. data/spec/integration/aws_rds_instance_spec.rb +3 -3
  26. data/spec/integration/aws_route53_hosted_zone_spec.rb +11 -0
  27. data/spec/integration/aws_route_table_spec.rb +40 -44
  28. data/spec/integration/aws_server_certificate_spec.rb +12 -0
  29. data/spec/integration/load_balancer_spec.rb +47 -1
  30. data/spec/integration/machine_spec.rb +32 -25
  31. metadata +28 -6
@@ -0,0 +1,40 @@
1
+ require 'chef/provisioning/aws_driver/aws_tagger'
2
+
3
+ module Chef::Provisioning::AWSDriver::TaggingStrategy
4
+ class Elasticsearch
5
+
6
+ attr_reader :client, :arn, :desired_tags
7
+
8
+ def initialize(client, arn, desired_tags)
9
+ @client = client
10
+ @arn = arn
11
+ @desired_tags = desired_tags
12
+ end
13
+
14
+ def current_tags
15
+ resp = client.list_tags({arn: arn})
16
+ Hash[resp.tag_list.map {|t| [t.key, t.value]}]
17
+ rescue ::Aws::ElasticsearchService::Errors::ResourceNotFoundException
18
+ Hash.new
19
+ end
20
+
21
+ def set_tags(tags)
22
+ tags = tags.map {|k,v|
23
+ if v.nil?
24
+ {key: k}
25
+ else
26
+ {key: k, value: v}
27
+ end
28
+ }
29
+ client.add_tags({
30
+ arn: arn,
31
+ tag_list: tags
32
+ })
33
+ end
34
+
35
+ def delete_tags(tag_keys)
36
+ client.remove_tags({arn: arn,
37
+ tag_keys: tag_keys})
38
+ end
39
+ end
40
+ end
@@ -1,7 +1,7 @@
1
1
  class Chef
2
2
  module Provisioning
3
3
  module AWSDriver
4
- VERSION = '1.6.1'
4
+ VERSION = '1.7.0'
5
5
  end
6
6
  end
7
7
  end
@@ -1,5 +1,4 @@
1
1
  require 'chef/provisioning/aws_driver/aws_resource_with_entry'
2
- require 'ipaddr'
3
2
 
4
3
  class Chef::Resource::AwsEipAddress < Chef::Provisioning::AWSDriver::AWSResourceWithEntry
5
4
  aws_sdk_type AWS::EC2::ElasticIp, option_names: [ :public_ip ], id: :public_ip, managed_entry_id_name: 'public_ip', backcompat_data_bag_name: 'eip_addresses'
@@ -10,29 +9,10 @@ class Chef::Resource::AwsEipAddress < Chef::Provisioning::AWSDriver::AWSResource
10
9
  attribute :machine, kind_of: [String, FalseClass]
11
10
  attribute :associate_to_vpc, kind_of: [TrueClass, FalseClass]
12
11
 
13
- #
14
- # Desired public IP address to associate with this Chef resource.
15
- #
16
- # Defaults to 'name' if name is an IP address.
17
- #
18
- # If the IP address is already allocated to your account, Chef will ensure it is
19
- # linked to the current . Thus, this is a way to associate an existing AWS IP
20
- # with Chef:
21
- #
22
- # ```ruby
23
- # aws_eip_address 'frontend_ip' do
24
- # public_ip '205.32.21.0'
25
- # end
26
- # ```
27
- #
28
- attribute :public_ip, kind_of: String, aws_id_attribute: true, coerce: proc { |v| IPAddr.new(v); v },
29
- default: lazy {
30
- begin
31
- IPAddr.new(name)
32
- name
33
- rescue
34
- end
35
- }
12
+ # Like other aws_id_attributes, this is read-only - you cannot provide it and expect
13
+ # aws to honor it
14
+ attribute :public_ip, kind_of: String, aws_id_attribute: true,
15
+ default: lazy { name =~ /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/ ? name : nil }
36
16
 
37
17
  def aws_object
38
18
  driver, public_ip = get_driver_and_id
@@ -0,0 +1,42 @@
1
+ require 'chef/provisioning/aws_driver/aws_resource'
2
+
3
+ module AWS
4
+ class Elasticsearch
5
+ class Domain
6
+ end
7
+ end
8
+ end
9
+
10
+ class Chef::Resource::AwsElasticsearchDomain < Chef::Provisioning::AWSDriver::AWSResource
11
+ include Chef::Provisioning::AWSDriver::AWSTaggable
12
+
13
+ aws_sdk_type ::AWS::Elasticsearch::Domain
14
+
15
+ attribute :domain_name, kind_of: String, name_attribute: true
16
+
17
+ # Cluster Config
18
+ attribute :instance_type, kind_of: String
19
+ attribute :instance_count, kind_of: Integer
20
+ attribute :dedicated_master_enabled, kind_of: [TrueClass, FalseClass]
21
+ attribute :dedicated_master_type, kind_of: String
22
+ attribute :dedicated_master_count, kind_of: Integer
23
+ attribute :zone_awareness_enabled, kind_of: [TrueClass, FalseClass]
24
+
25
+ # EBS Options
26
+ attribute :ebs_enabled, kind_of: [TrueClass, FalseClass]
27
+ attribute :volume_type, equal_to: ["standard", "gp2", "io1"]
28
+ attribute :volume_size, kind_of: Integer
29
+ attribute :iops, kind_of: Integer
30
+
31
+ # Snapshot Options
32
+ attribute :automated_snapshot_start_hour, kind_of: Integer
33
+
34
+ # Access Policies
35
+ attribute :access_policies, kind_of: String
36
+
37
+ def aws_object
38
+ driver.elasticsearch_client
39
+ .describe_elasticsearch_domains(domain_names: [domain_name])[:domain_status_list]
40
+ .find { |d| !d[:deleted] }
41
+ end
42
+ end
@@ -4,7 +4,7 @@ require 'chef/provisioning/aws_driver/aws_taggable'
4
4
  class Chef::Resource::AwsRdsInstance < Chef::Provisioning::AWSDriver::AWSRDSResource
5
5
  include Chef::Provisioning::AWSDriver::AWSTaggable
6
6
 
7
- aws_sdk_type AWS::RDS::DBInstance, id: :db_instance_identifier
7
+ aws_sdk_type ::Aws::RDS::DBInstance, id: :db_instance_identifier
8
8
 
9
9
  attribute :db_instance_identifier, kind_of: String, name_attribute: true
10
10
 
@@ -28,12 +28,17 @@ class Chef::Resource::AwsRdsInstance < Chef::Provisioning::AWSDriver::AWSRDSReso
28
28
  attribute :additional_options, kind_of: Hash, default: {}
29
29
 
30
30
  def aws_object
31
- res = driver.rds.instances[name]
32
- if res.exists? && ! ['deleted', 'deleting'].include?(res.status)
33
- res
34
- else
35
- nil
36
- end
31
+ result = self.driver.rds_resource.db_instance(name)
32
+ return nil unless result && result.db_instance_status != 'deleting'
33
+ result
34
+ rescue ::Aws::RDS::Errors::DBInstanceNotFound
35
+ nil
36
+ end
37
+
38
+ def db_instance_status
39
+ aws_object.db_instance_status if aws_object
40
+ rescue ::Aws::RDS::Errors::DBInstanceNotFound
41
+ nil
37
42
  end
38
43
 
39
44
  def rds_tagging_type
@@ -36,7 +36,7 @@ class Chef::Resource::AwsRoute53HostedZone < Chef::Provisioning::AWSDriver::AWSR
36
36
  attribute :name, kind_of: String, callbacks: { "domain name cannot end with a dot" => lambda { |n| n !~ /\.$/ } }
37
37
 
38
38
  # The comment included in the CreateHostedZoneRequest element. String <= 256 characters.
39
- attribute :comment, kind_of: String
39
+ attribute :comment, kind_of: String, default: ""
40
40
 
41
41
  # the resource name and the AWS ID have to be related here, since they're tightly coupled elsewhere.
42
42
  attribute :aws_route53_zone_id, kind_of: String, aws_id_attribute: true,
@@ -23,7 +23,7 @@ module AWSSupport
23
23
  require 'aws'
24
24
  require 'aws_support/deep_matcher/matchable_object'
25
25
  require 'aws_support/deep_matcher/matchable_array'
26
- DeepMatcher::MatchableObject.matchable_classes << proc { |o| o.class.name =~ /^(AWS|Aws)::(EC2|ELB|IAM|S3|RDS|CloudSearch|Route53)($|::)/ }
26
+ DeepMatcher::MatchableObject.matchable_classes << proc { |o| o.class.name =~ /^(AWS|Aws)::(EC2|ELB|IAM|S3|RDS|CloudSearch|Route53|ElasticsearchService)($|::)/ }
27
27
  DeepMatcher::MatchableArray.matchable_classes << AWS::Core::Data::List
28
28
 
29
29
  def purge_all
@@ -95,7 +95,7 @@ module AWSSupport
95
95
  module_eval(&block)
96
96
  end
97
97
 
98
- if ENV['AWS_TEST_DRIVER']
98
+ if ENV['AWS_TEST_DRIVER'] && !ENV['AWS_TEST_DRIVER'].empty?
99
99
  aws_driver = Chef::Provisioning.driver_for_url(ENV['AWS_TEST_DRIVER'])
100
100
  when_the_repository "exists #{description ? "and #{description}" : ""}", *tags, &context_block
101
101
  else
@@ -13,10 +13,38 @@ describe Chef::Resource::AwsEipAddress do
13
13
  ).and be_idempotent
14
14
  end
15
15
 
16
- describe 'action :delete' do
17
- with_converge {
18
- aws_eip_address "test_eip"
16
+ it "raises an error trying to reference an eip that does not exist" do
17
+ r = recipe {
18
+ aws_eip_address "0.0.0.0"
19
19
  }
20
+ expect {r.converge}.to raise_error(/Chef::Resource::AwsEipAddress\[0.0.0.0\] does not exist!/)
21
+ end
22
+
23
+ context "with an existing aws_eip_address" do
24
+ aws_eip_address "test_eip"
25
+
26
+ it "can reference the ip address by id in the name field" do
27
+ expect_recipe {
28
+ aws_eip_address test_eip.aws_object.public_ip
29
+ }.to match_an_aws_eip_address(test_eip.aws_object.public_ip,
30
+ public_ip: test_eip.aws_object.public_ip
31
+ ).and be_idempotent
32
+ end
33
+
34
+ it "can reference the ip address in the public_ip field" do
35
+ expect_recipe {
36
+ aws_eip_address "random_identifier" do
37
+ public_ip test_eip.aws_object.public_ip
38
+ end
39
+ }.to match_an_aws_eip_address("random_identifier",
40
+ public_ip: test_eip.aws_object.public_ip
41
+ ).and be_idempotent
42
+ end
43
+ end
44
+
45
+ describe 'action :delete' do
46
+ aws_eip_address "test_eip"
47
+
20
48
  it "deletes the elastic ip" do
21
49
  # TODO all the `with_*` and `expect_*` methods from Cheffish
22
50
  # automatically converge the block - we don't want to do that,
@@ -44,27 +72,13 @@ describe Chef::Resource::AwsEipAddress do
44
72
  end
45
73
 
46
74
  it "associates an EIP with a machine" do
47
- test_machine_aws_obj = nil
48
- expect_recipe {
49
- ruby_block 'look up test machine' do
50
- block do
51
- test_machine_aws_obj = Chef::Resource::AwsInstance.get_aws_object(
52
- 'test_machine',
53
- run_context: run_context,
54
- driver: run_context.chef_provisioning.current_driver,
55
- managed_entry_store: Chef::Provisioning.chef_managed_entry_store(run_context.cheffish.current_chef_server)
56
- )
57
- end
58
- end
59
- }
60
-
61
75
  expect_recipe {
62
76
  aws_eip_address "test_eip" do
63
77
  associate_to_vpc true
64
78
  machine "test_machine"
65
79
  end
66
80
  }.to create_an_aws_eip_address('test_eip',
67
- instance_id: test_machine_aws_obj.id
81
+ instance_id: test_machine.aws_object.id
68
82
  ).and be_idempotent
69
83
  end
70
84
 
@@ -0,0 +1,119 @@
1
+ require 'spec_helper'
2
+
3
+ def policy(user)
4
+ <<EOF
5
+ {
6
+ "Version": "2012-10-17",
7
+ "Statement": [
8
+ {
9
+ "Effect": "Allow",
10
+ "Sid": "test-policy",
11
+ "Principal": {
12
+ "AWS": "#{user}"
13
+ },
14
+ "Action": "es:*",
15
+ "Resource": "*"
16
+ }
17
+ ]
18
+ }
19
+ EOF
20
+ end
21
+
22
+ def all_options_domain(name)
23
+ aws_elasticsearch_domain name do
24
+ instance_type "m3.medium.elasticsearch"
25
+ instance_count 2
26
+ dedicated_master_enabled true
27
+ dedicated_master_type "m3.medium.elasticsearch"
28
+ dedicated_master_count 2
29
+ zone_awareness_enabled true
30
+ ebs_enabled true
31
+ volume_type "io1"
32
+ volume_size 35
33
+ iops 1000
34
+ automated_snapshot_start_hour 2
35
+ access_policies policy(driver.iam_client.get_user.user.arn)
36
+ aws_tags key1: "value"
37
+ end
38
+ end
39
+
40
+ describe Chef::Resource::AwsElasticsearchDomain do
41
+ extend AWSSupport
42
+
43
+ let(:all_options_result) do
44
+ {created: true,
45
+ elasticsearch_cluster_config: {
46
+ instance_type: "m3.medium.elasticsearch",
47
+ instance_count: 2,
48
+ dedicated_master_enabled: true,
49
+ dedicated_master_type: "m3.medium.elasticsearch",
50
+ zone_awareness_enabled: true
51
+ },
52
+ ebs_options: {
53
+ ebs_enabled: true,
54
+ volume_size: 35,
55
+ volume_type: "io1",
56
+ iops: 1000
57
+ },
58
+ snapshot_options: {
59
+ automated_snapshot_start_hour: 2
60
+ }
61
+ }
62
+ end
63
+
64
+ when_the_chef_12_server "exists", organization: "foo", server_scope: :context do
65
+ with_aws "when connected to AWS" do
66
+ time = DateTime.now.strftime('%Q')
67
+
68
+ it "returns nil when aws_object is called for something that does not exist" do
69
+ r = nil
70
+ converge {
71
+ r = aws_elasticsearch_domain "wont-exist" do
72
+ action :nothing
73
+ end
74
+ }
75
+ expect(r.aws_object).to eq(nil)
76
+ end
77
+
78
+ it "aws_elasticsearch_domain 'test-#{time}' creates a elasticsearch domain" do
79
+ expect_recipe {
80
+ all_options_domain("test-#{time}")
81
+ }.to create_an_aws_elasticsearch_domain("test-#{time}", all_options_result).and be_idempotent
82
+ end
83
+
84
+ context "with an existing elasticsearch domain" do
85
+ aws_elasticsearch_domain "test-#{time}-2"
86
+
87
+ it "can update all options" do
88
+ expect_recipe {
89
+ all_options_domain("test-#{time}-2")
90
+ }.to update_an_aws_elasticsearch_domain("test-#{time}-2", all_options_result)
91
+ end
92
+
93
+ it "updates the aws_tags" do
94
+ expect_recipe {
95
+ all_options_domain("test-#{time}-2")
96
+ }.to have_aws_elasticsearch_domain_tags("test-#{time}-2", {'key1' => 'value'})
97
+ end
98
+
99
+ it "removes all aws_elasticsearch_domain tags" do
100
+ expect_recipe {
101
+ aws_elasticsearch_domain "test-#{time}-2" do
102
+ aws_tags {}
103
+ end
104
+ }.to have_aws_elasticsearch_domain_tags("test-#{time}-2", {}).and be_idempotent
105
+ end
106
+
107
+
108
+ it "destroys an elasticsearch domain" do
109
+ r = recipe {
110
+ aws_elasticsearch_domain "test-#{time}-2" do
111
+ action :destroy
112
+ end
113
+ }
114
+ expect(r).to destroy_an_aws_elasticsearch_domain("test-#{time}-2")
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -12,7 +12,8 @@ describe Chef::Resource::AwsKeyPair do
12
12
  it "aws_key_pair 'test_key_pair' creates a key pair" do
13
13
  expect(recipe {
14
14
  aws_key_pair 'test_key_pair' do
15
- private_key_options format: :der, type: :rsa
15
+ private_key_options format: :pem, type: :rsa, regenerate_if_different: true
16
+ allow_overwrite true
16
17
  end
17
18
  }).to create_an_aws_key_pair('test_key_pair').and be_idempotent
18
19
  end
@@ -53,9 +53,9 @@ describe Chef::Resource::AwsRdsInstance do
53
53
  db_instance_class: "db.t1.micro",
54
54
  master_username: "thechief",
55
55
  ).and be_idempotent
56
- i = driver.rds.client.describe_db_instances(:db_instance_identifier => "test-rds-instance")[:db_instances].first
57
- expect(i[:db_subnet_group][:db_subnet_group_name]).to eq("test-db-subnet-group")
58
- expect(i[:publicly_accessible]).to eq(false)
56
+ r = driver.rds_resource.db_instance("test-rds-instance")
57
+ expect(r.db_subnet_group.db_subnet_group_name).to eq("test-db-subnet-group")
58
+ expect(r.publicly_accessible).to eq(false)
59
59
  end
60
60
 
61
61
  it "aws_rds_instance prefers explicit options" do
@@ -64,6 +64,17 @@ describe Chef::Resource::AwsRoute53HostedZone do
64
64
  }.to create_an_aws_route53_hosted_zone(zone_name,
65
65
  config: { comment: expected_comment }).and be_idempotent
66
66
  end
67
+
68
+ it "updates the zone comment when none is given" do
69
+ expect_recipe {
70
+ aws_route53_hosted_zone zone_name do
71
+ comment "Initial comment."
72
+ end
73
+ aws_route53_hosted_zone zone_name do
74
+ end
75
+ }.to create_an_aws_route53_hosted_zone(zone_name,
76
+ config: { comment: nil }).and be_idempotent
77
+ end
67
78
  end
68
79
 
69
80
  context "RecordSets" do
@@ -8,6 +8,10 @@ describe Chef::Resource::AwsRouteTable do
8
8
  purge_all
9
9
  setup_public_vpc
10
10
 
11
+ aws_network_interface 'test_network_interface' do
12
+ subnet 'test_public_subnet'
13
+ end
14
+
11
15
  it "aws_route_table 'test_route_table' with no parameters except VPC creates a route table" do
12
16
  expect_recipe {
13
17
  aws_route_table 'test_route_table' do
@@ -15,7 +19,7 @@ describe Chef::Resource::AwsRouteTable do
15
19
  end
16
20
  }.to create_an_aws_route_table('test_route_table',
17
21
  routes: [
18
- { destination_cidr_block: '10.0.0.0/24', gateway_id: 'local', state: "active" }
22
+ { destination_cidr_block: '10.0.0.0/16', gateway_id: 'local', state: "active" }
19
23
  ]
20
24
  ).and be_idempotent
21
25
  end
@@ -27,29 +31,20 @@ describe Chef::Resource::AwsRouteTable do
27
31
  routes '0.0.0.0/0' => :internet_gateway
28
32
  end
29
33
  }.to create_an_aws_route_table('test_route_table',
30
- routes: [
31
- { destination_cidr_block: '10.0.0.0/24', gateway_id: 'local', state: "active" },
34
+ routes: Set[
35
+ { destination_cidr_block: '10.0.0.0/16', gateway_id: 'local', state: "active" },
32
36
  { destination_cidr_block: '0.0.0.0/0', gateway_id: test_vpc.aws_object.internet_gateway.id, state: "active" }
33
37
  ]
34
38
  ).and be_idempotent
35
39
  end
36
40
 
37
41
  it "ignores routes whose target matches ignore_route_targets" do
38
- eni = nil
39
42
  expect_recipe {
40
- aws_subnet 'test_subnet' do
41
- vpc 'test_vpc'
42
- end
43
-
44
- eni = aws_network_interface 'test_network_interface' do
45
- subnet 'test_subnet'
46
- end
47
-
48
43
  aws_route_table 'test_route_table' do
49
44
  vpc 'test_vpc'
50
45
  routes(
51
46
  '0.0.0.0/0' => :internet_gateway,
52
- '172.31.0.0/16' => eni
47
+ '172.31.0.0/16' => test_network_interface
53
48
  )
54
49
  end
55
50
 
@@ -59,33 +54,19 @@ describe Chef::Resource::AwsRouteTable do
59
54
  ignore_route_targets ['^eni-']
60
55
  end
61
56
  }.to create_an_aws_route_table('test_route_table',
62
- routes: [
63
- { destination_cidr_block: '10.0.0.0/24', gateway_id: 'local', state: "active" },
64
- { destination_cidr_block: '172.31.0.0/16', network_interface_id: eni.aws_object.id, state: "blackhole" },
57
+ routes: Set[
58
+ { destination_cidr_block: '10.0.0.0/16', gateway_id: 'local', state: "active" },
59
+ { destination_cidr_block: '172.31.0.0/16', network_interface_id: test_network_interface.aws_object.id, state: "blackhole" },
65
60
  { destination_cidr_block: '0.0.0.0/0', gateway_id: test_vpc.aws_object.internet_gateway.id, state: "active" },
66
61
  ]
67
62
  ).and be_idempotent
68
63
  end
69
64
 
70
- it "creates aws_route_table tags" do
71
- expect_recipe {
72
- aws_route_table 'test_route_table' do
73
- vpc 'test_vpc'
74
- aws_tags key1: "value"
75
- end
76
- }.to create_an_aws_route_table('test_route_table')
77
- .and have_aws_route_table_tags('test_route_table',
78
- {
79
- 'Name' => 'test_route_table',
80
- 'key1' => 'value'
81
- }
82
- ).and be_idempotent
83
- end
84
-
85
65
  context "with an existing routing table" do
86
66
  aws_route_table 'test_route_table' do
87
67
  vpc 'test_vpc'
88
- routes '0.0.0.0/0' => :internet_gateway
68
+ routes '0.0.0.0/0' => :internet_gateway,
69
+ '1.0.0.0/8' => :internet_gateway
89
70
  end
90
71
 
91
72
  it "updates an existing routing table" do
@@ -93,12 +74,12 @@ describe Chef::Resource::AwsRouteTable do
93
74
  aws_route_table 'test_route_table' do
94
75
  vpc 'test_vpc'
95
76
  routes '0.0.0.0/0' => :internet_gateway,
96
- '10.1.0.0/24' => :internet_gateway
77
+ '2.0.0.0/8' => :internet_gateway
97
78
  end
98
79
  }.to update_an_aws_route_table('test_route_table',
99
- routes: [
100
- { destination_cidr_block: '10.1.0.0/24', gateway_id: test_vpc.aws_object.internet_gateway.id, state: "active" },
101
- { destination_cidr_block: '10.0.0.0/24', gateway_id: 'local', state: "active" },
80
+ routes: Set[
81
+ { destination_cidr_block: '2.0.0.0/8', gateway_id: test_vpc.aws_object.internet_gateway.id, state: "active" },
82
+ { destination_cidr_block: '10.0.0.0/16', gateway_id: 'local', state: "active" },
102
83
  { destination_cidr_block: '0.0.0.0/0', gateway_id: test_vpc.aws_object.internet_gateway.id, state: "active" },
103
84
  ]
104
85
  ).and be_idempotent
@@ -119,19 +100,34 @@ describe Chef::Resource::AwsRouteTable do
119
100
  aws_route_table 'test_route_table' do
120
101
  vpc 'test_vpc'
121
102
  routes '0.0.0.0/0' => :internet_gateway,
122
- '10.1.0.0/16' => 'test_machine'
103
+ '11.0.0.0/8' => 'test_machine'
123
104
  end
124
105
 
125
106
  }.to create_an_aws_route_table('test_route_table',
126
- routes: [
107
+ routes: Set[
127
108
  { destination_cidr_block: '10.0.0.0/16', gateway_id: 'local', state: "active" },
128
- { destination_cidr_block: '10.1.0.0/16', instance_id: test_machine.aws_object.id, state: "active" },
109
+ { destination_cidr_block: '11.0.0.0/8', instance_id: test_machine.aws_object.id, state: "active" },
129
110
  { destination_cidr_block: '0.0.0.0/0', gateway_id: test_vpc.aws_object.internet_gateway.id, state: "active" },
130
111
  ]
131
112
  ).and be_idempotent
132
113
  end
133
114
  end
134
115
 
116
+ it "creates aws_route_table tags" do
117
+ expect_recipe {
118
+ aws_route_table 'test_route_table' do
119
+ vpc 'test_vpc'
120
+ aws_tags key1: "value"
121
+ end
122
+ }.to create_an_aws_route_table('test_route_table')
123
+ .and have_aws_route_table_tags('test_route_table',
124
+ {
125
+ 'Name' => 'test_route_table',
126
+ 'key1' => 'value'
127
+ }
128
+ ).and be_idempotent
129
+ end
130
+
135
131
  context "with existing tags" do
136
132
  aws_route_table 'test_route_table' do
137
133
  vpc 'test_vpc'
@@ -170,7 +166,7 @@ describe Chef::Resource::AwsRouteTable do
170
166
  end
171
167
 
172
168
  with_aws "with two VPC's with an internet gateway" do
173
- aws_vpc "test_vpc" do
169
+ aws_vpc "test_vpc_1" do
174
170
  cidr_block '10.0.0.0/24'
175
171
  internet_gateway true
176
172
  end
@@ -184,22 +180,22 @@ describe Chef::Resource::AwsRouteTable do
184
180
  pcx = nil
185
181
  expect_recipe {
186
182
  pcx = aws_vpc_peering_connection 'test_peering_connection' do
187
- vpc 'test_vpc'
183
+ vpc 'test_vpc_1'
188
184
  peer_vpc 'test_vpc_2'
189
185
  end
190
186
 
191
187
  aws_route_table 'test_route_table' do
192
- vpc 'test_vpc'
188
+ vpc 'test_vpc_1'
193
189
  routes(
194
190
  '100.100.0.0/16' => pcx,
195
191
  '0.0.0.0/0' => :internet_gateway
196
192
  )
197
193
  end
198
194
  }.to create_an_aws_route_table('test_route_table',
199
- routes: [
195
+ routes: Set[
200
196
  { destination_cidr_block: '10.0.0.0/24', gateway_id: 'local', state: "active" },
201
197
  { destination_cidr_block: '100.100.0.0/16', vpc_peering_connection_id: pcx.aws_object.id, state: "active" },
202
- { destination_cidr_block: '0.0.0.0/0', gateway_id: test_vpc.aws_object.internet_gateway.id, state: "active" }
198
+ { destination_cidr_block: '0.0.0.0/0', gateway_id: test_vpc_1.aws_object.internet_gateway.id, state: "active" }
203
199
  ]
204
200
  ).and be_idempotent
205
201
  end