chef-provisioning-aws 1.6.1 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
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