chef-provisioning-aws 1.0.4 → 1.1.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 +18 -0
- data/Rakefile +5 -0
- data/lib/chef/provider/aws_ebs_volume.rb +14 -4
- data/lib/chef/provider/aws_image.rb +31 -0
- data/lib/chef/provider/aws_instance.rb +14 -0
- data/lib/chef/provider/aws_load_balancer.rb +9 -0
- data/lib/chef/provider/aws_network_interface.rb +209 -0
- data/lib/chef/provider/aws_security_group.rb +9 -4
- data/lib/chef/provider/aws_subnet.rb +16 -1
- data/lib/chef/provider/aws_vpc.rb +16 -0
- data/lib/chef/provisioning/aws_driver/aws_provider.rb +44 -0
- data/lib/chef/provisioning/aws_driver/aws_resource.rb +1 -1
- data/lib/chef/provisioning/aws_driver/driver.rb +6 -5
- data/lib/chef/provisioning/aws_driver/version.rb +1 -1
- data/lib/chef/resource/aws_image.rb +1 -2
- data/lib/chef/resource/aws_instance.rb +1 -2
- data/lib/chef/resource/aws_load_balancer.rb +1 -1
- data/lib/chef/resource/aws_network_interface.rb +23 -5
- data/lib/chef/resource/aws_vpc.rb +0 -8
- data/spec/aws_support.rb +235 -0
- data/spec/aws_support/aws_resource_run_wrapper.rb +45 -0
- data/spec/aws_support/deep_matcher.rb +40 -0
- data/spec/aws_support/deep_matcher/fuzzy_match_objects.rb +57 -0
- data/spec/aws_support/deep_matcher/match_values_failure_messages.rb +145 -0
- data/spec/aws_support/deep_matcher/matchable_array.rb +24 -0
- data/spec/aws_support/deep_matcher/matchable_object.rb +25 -0
- data/spec/aws_support/deep_matcher/rspec_monkeypatches.rb +25 -0
- data/spec/aws_support/delayed_stream.rb +41 -0
- data/spec/aws_support/matchers/create_an_aws_object.rb +60 -0
- data/spec/aws_support/matchers/update_an_aws_object.rb +66 -0
- data/spec/integration/aws_ebs_volume_spec.rb +31 -0
- data/spec/integration/aws_key_pair_spec.rb +21 -0
- data/spec/integration/aws_route_table_spec.rb +40 -0
- data/spec/integration/aws_security_group_spec.rb +7 -5
- data/spec/integration/aws_subnet_spec.rb +56 -0
- data/spec/integration/aws_vpc_spec.rb +109 -0
- data/spec/integration/machine_batch_spec.rb +36 -0
- data/spec/integration/machine_image_spec.rb +49 -0
- data/spec/integration/machine_spec.rb +64 -0
- data/spec/spec_helper.rb +8 -2
- data/spec/unit/aws_driver/credentials_spec.rb +54 -0
- metadata +27 -5
- data/spec/support/aws_support.rb +0 -211
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chef::Resource::AwsEbsVolume do
|
4
|
+
extend AWSSupport
|
5
|
+
|
6
|
+
when_the_chef_12_server "exists", organization: 'foo', server_scope: :context do
|
7
|
+
with_aws "when connected to AWS" do
|
8
|
+
|
9
|
+
it "aws_ebs_volume 'test_volume' creates an ebs volume" do
|
10
|
+
expect_recipe {
|
11
|
+
aws_ebs_volume "test_volume" do
|
12
|
+
availability_zone 'a'
|
13
|
+
size 8
|
14
|
+
end
|
15
|
+
}.to create_an_aws_ebs_volume('test_volume',
|
16
|
+
:size => 8
|
17
|
+
).and be_idempotent
|
18
|
+
end
|
19
|
+
|
20
|
+
it "aws_ebs_volume 'test_volume_az' creates an ebs volume when provided proper full AZ" do
|
21
|
+
expect_recipe {
|
22
|
+
aws_ebs_volume "test_volume_az" do
|
23
|
+
availability_zone "#{driver.aws_config.region}a"
|
24
|
+
size 8
|
25
|
+
end
|
26
|
+
}.to create_an_aws_ebs_volume('test_volume_az')
|
27
|
+
.and be_idempotent
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chef::Resource::AwsKeyPair do
|
4
|
+
extend AWSSupport
|
5
|
+
|
6
|
+
when_the_chef_12_server "exists", organization: 'foo', server_scope: :context do
|
7
|
+
with_aws "when connected to AWS" do
|
8
|
+
before :each do
|
9
|
+
driver.ec2.key_pairs['test_key_pair'].delete
|
10
|
+
end
|
11
|
+
|
12
|
+
it "aws_key_pair 'test_key_pair' creates a key pair" do
|
13
|
+
expect_recipe {
|
14
|
+
aws_key_pair 'test_key_pair' do
|
15
|
+
private_key_options format: :der, type: :rsa
|
16
|
+
end
|
17
|
+
}.to create_an_aws_key_pair('test_key_pair').and be_idempotent
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chef::Resource::AwsRouteTable do
|
4
|
+
extend AWSSupport
|
5
|
+
|
6
|
+
when_the_chef_12_server "exists", organization: 'foo', server_scope: :context do
|
7
|
+
with_aws "with a VPC with an internet gateway" do
|
8
|
+
aws_vpc "test_vpc" do
|
9
|
+
cidr_block '10.0.0.0/24'
|
10
|
+
internet_gateway true
|
11
|
+
end
|
12
|
+
|
13
|
+
it "aws_route_table 'test_route_table' with no parameters except VPC creates a route table" do
|
14
|
+
expect_recipe {
|
15
|
+
aws_route_table 'test_route_table' do
|
16
|
+
vpc 'test_vpc'
|
17
|
+
end
|
18
|
+
}.to create_an_aws_route_table('test_route_table',
|
19
|
+
routes: [
|
20
|
+
{ destination_cidr_block: '10.0.0.0/24', 'target.id' => 'local', state: :active }
|
21
|
+
]
|
22
|
+
).and be_idempotent
|
23
|
+
end
|
24
|
+
|
25
|
+
it "aws_route_table 'test_route_table' with routes creates a route table" do
|
26
|
+
expect_recipe {
|
27
|
+
aws_route_table 'test_route_table' do
|
28
|
+
vpc 'test_vpc'
|
29
|
+
routes '0.0.0.0/0' => :internet_gateway
|
30
|
+
end
|
31
|
+
}.to create_an_aws_route_table('test_route_table',
|
32
|
+
routes: [
|
33
|
+
{ destination_cidr_block: '10.0.0.0/24', 'target.id' => 'local', state: :active },
|
34
|
+
{ destination_cidr_block: '0.0.0.0/0', 'target.id' => test_vpc.aws_object.internet_gateway.id, state: :active }
|
35
|
+
]
|
36
|
+
).and be_idempotent
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'chef/provisioning/aws_driver/credentials'
|
3
2
|
|
4
|
-
describe
|
3
|
+
describe Chef::Resource::AwsSecurityGroup do
|
5
4
|
extend AWSSupport
|
6
5
|
|
7
6
|
when_the_chef_12_server "exists", organization: 'foo', server_scope: :context do
|
@@ -38,16 +37,19 @@ describe 'Aws Security Group' do
|
|
38
37
|
).and be_idempotent
|
39
38
|
end
|
40
39
|
|
41
|
-
it "aws_security_group 'test_sg' with inbound rules works" do
|
40
|
+
it "aws_security_group 'test_sg' with inbound and outbound rules works" do
|
42
41
|
expect_recipe {
|
43
42
|
aws_security_group 'test_sg' do
|
44
43
|
vpc 'test_vpc'
|
45
44
|
inbound_rules '0.0.0.0/0' => 22
|
45
|
+
outbound_rules 22 => '0.0.0.0/0'
|
46
46
|
end
|
47
47
|
}.to create_an_aws_security_group('test_sg',
|
48
48
|
vpc_id: test_vpc.aws_object.id,
|
49
|
-
ip_permissions_list: [
|
50
|
-
|
49
|
+
ip_permissions_list: [
|
50
|
+
{ groups: [], ip_ranges: [{cidr_ip: "0.0.0.0/0"}], ip_protocol: "tcp", from_port: 22, to_port: 22},
|
51
|
+
],
|
52
|
+
ip_permissions_list_egress: [{groups: [], ip_ranges: [{cidr_ip: "0.0.0.0/0"}], ip_protocol: "tcp", from_port: 22, to_port: 22 }]
|
51
53
|
).and be_idempotent
|
52
54
|
end
|
53
55
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chef::Resource::AwsSubnet do
|
4
|
+
extend AWSSupport
|
5
|
+
|
6
|
+
when_the_chef_12_server "exists", organization: 'foo', server_scope: :context do
|
7
|
+
with_aws "with a VPC with an internet gateway and route table" do
|
8
|
+
before :context do
|
9
|
+
driver.ec2.vpcs.with_tag('Name', 'test_vpc').each do |vpc|
|
10
|
+
recipe do
|
11
|
+
aws_vpc vpc do
|
12
|
+
action :purge
|
13
|
+
end
|
14
|
+
end.converge
|
15
|
+
end
|
16
|
+
end
|
17
|
+
aws_vpc "test_vpc" do
|
18
|
+
cidr_block '10.0.0.0/24'
|
19
|
+
internet_gateway true
|
20
|
+
end
|
21
|
+
|
22
|
+
aws_route_table 'test_route_table' do
|
23
|
+
vpc 'test_vpc'
|
24
|
+
end
|
25
|
+
|
26
|
+
it "aws_subnet 'test_subnet' with no parameters except VPC creates a route table" do
|
27
|
+
expect_recipe {
|
28
|
+
aws_subnet 'test_subnet' do
|
29
|
+
vpc 'test_vpc'
|
30
|
+
end
|
31
|
+
}.to create_an_aws_subnet('test_subnet',
|
32
|
+
vpc_id: test_vpc.aws_object.id,
|
33
|
+
cidr_block: test_vpc.aws_object.cidr_block
|
34
|
+
).and be_idempotent
|
35
|
+
end
|
36
|
+
|
37
|
+
it "aws_subnet 'test_subnet' with all parameters creates a route table" do
|
38
|
+
az = driver.ec2.availability_zones.first.name
|
39
|
+
expect_recipe {
|
40
|
+
aws_subnet 'test_subnet' do
|
41
|
+
vpc 'test_vpc'
|
42
|
+
cidr_block '10.0.0.0/24'
|
43
|
+
availability_zone az
|
44
|
+
map_public_ip_on_launch true
|
45
|
+
route_table 'test_route_table'
|
46
|
+
end
|
47
|
+
}.to create_an_aws_subnet('test_subnet',
|
48
|
+
vpc_id: test_vpc.aws_object.id,
|
49
|
+
cidr_block: '10.0.0.0/24',
|
50
|
+
'availability_zone.name' => az,
|
51
|
+
'route_table.id' => test_route_table.aws_object.id
|
52
|
+
).and be_idempotent
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chef::Resource::AwsVpc do
|
4
|
+
extend AWSSupport
|
5
|
+
|
6
|
+
when_the_chef_12_server "exists", organization: 'foo', server_scope: :context do
|
7
|
+
with_aws "When AWS has a DHCP options" do
|
8
|
+
# Empty DHCP options for the purposes of associating
|
9
|
+
aws_dhcp_options 'test_dhcp_options' do
|
10
|
+
end
|
11
|
+
|
12
|
+
context "Creating an aws_vpc" do
|
13
|
+
it "aws_vpc 'vpc' with cidr_block '10.0.0.0/24' creates a VPC" do
|
14
|
+
expect_recipe {
|
15
|
+
aws_vpc 'test_vpc' do
|
16
|
+
cidr_block '10.0.0.0/24'
|
17
|
+
end
|
18
|
+
}.to create_an_aws_vpc('test_vpc',
|
19
|
+
cidr_block: '10.0.0.0/24',
|
20
|
+
instance_tenancy: :default,
|
21
|
+
state: :available,
|
22
|
+
internet_gateway: nil
|
23
|
+
).and be_idempotent
|
24
|
+
end
|
25
|
+
|
26
|
+
it "aws_vpc 'vpc' with all attributes creates a VPC" do
|
27
|
+
expect_recipe {
|
28
|
+
aws_vpc 'test_vpc' do
|
29
|
+
cidr_block '10.0.0.0/24'
|
30
|
+
internet_gateway true
|
31
|
+
instance_tenancy :dedicated
|
32
|
+
main_routes '0.0.0.0/0' => :internet_gateway
|
33
|
+
dhcp_options 'test_dhcp_options'
|
34
|
+
enable_dns_support true
|
35
|
+
enable_dns_hostnames true
|
36
|
+
end
|
37
|
+
}.to create_an_aws_vpc('test_vpc',
|
38
|
+
cidr_block: '10.0.0.0/24',
|
39
|
+
instance_tenancy: :dedicated,
|
40
|
+
dhcp_options_id: test_dhcp_options.aws_object.id,
|
41
|
+
state: :available,
|
42
|
+
"route_tables.main_route_table.routes" => [
|
43
|
+
{
|
44
|
+
destination_cidr_block: '10.0.0.0/24',
|
45
|
+
target: { id: 'local' }
|
46
|
+
},
|
47
|
+
{
|
48
|
+
destination_cidr_block: '0.0.0.0/0',
|
49
|
+
target: an_instance_of(AWS::EC2::InternetGateway)
|
50
|
+
}
|
51
|
+
],
|
52
|
+
internet_gateway: an_instance_of(AWS::EC2::InternetGateway)
|
53
|
+
).and be_idempotent
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "and an existing VPC with values filled in" do
|
58
|
+
aws_vpc 'test_vpc' do
|
59
|
+
cidr_block '10.0.0.0/24'
|
60
|
+
internet_gateway true
|
61
|
+
instance_tenancy :dedicated
|
62
|
+
main_routes '0.0.0.0/0' => :internet_gateway
|
63
|
+
dhcp_options 'test_dhcp_options'
|
64
|
+
enable_dns_support true
|
65
|
+
enable_dns_hostnames true
|
66
|
+
end
|
67
|
+
|
68
|
+
context "and a route table inside that VPC" do
|
69
|
+
aws_route_table 'test_route_table' do
|
70
|
+
vpc 'test_vpc'
|
71
|
+
end
|
72
|
+
|
73
|
+
it "aws_vpc can update the main_route_table to it" do
|
74
|
+
expect_recipe {
|
75
|
+
aws_vpc 'test_vpc' do
|
76
|
+
main_route_table 'test_route_table'
|
77
|
+
end
|
78
|
+
}.to update_an_aws_vpc('test_vpc',
|
79
|
+
"route_tables.main_route_table.id" => test_route_table.aws_object.id
|
80
|
+
).and be_idempotent
|
81
|
+
end
|
82
|
+
|
83
|
+
# Clean up the main route table association so we can cleanly delete
|
84
|
+
before :each do
|
85
|
+
@old_main = test_vpc.aws_object.route_tables.main_route_table
|
86
|
+
end
|
87
|
+
after :each do
|
88
|
+
new_main = test_vpc.aws_object.route_tables.main_route_table
|
89
|
+
if new_main != @old_main
|
90
|
+
main_association = new_main.associations.select { |a| a.main? }.first
|
91
|
+
if main_association
|
92
|
+
test_vpc.aws_object.client.replace_route_table_association(
|
93
|
+
association_id: main_association.id,
|
94
|
+
route_table_id: @old_main.id)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
it "aws_vpc 'vpc' with no attributes fails to create a VPC (must specify cidr_block)" do
|
102
|
+
expect_recipe {
|
103
|
+
aws_vpc 'test_vpc' do
|
104
|
+
end
|
105
|
+
}.to be_up_to_date
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chef::Resource::MachineBatch do
|
4
|
+
extend AWSSupport
|
5
|
+
|
6
|
+
when_the_chef_12_server "exists", organization: 'foo', server_scope: :context do
|
7
|
+
with_aws "with a VPC and a public subnet" do
|
8
|
+
|
9
|
+
before :all do
|
10
|
+
chef_config[:log_level] = :warn
|
11
|
+
end
|
12
|
+
|
13
|
+
purge_all
|
14
|
+
setup_public_vpc
|
15
|
+
it "machine_batch creates multiple machines", :super_slow do
|
16
|
+
expect_recipe {
|
17
|
+
machine_batch 'test_machines' do
|
18
|
+
(1..3).each do |i|
|
19
|
+
machine "test_machine#{i}" do
|
20
|
+
machine_options bootstrap_options: {
|
21
|
+
subnet_id: 'test_public_subnet',
|
22
|
+
key_name: 'test_key_pair'
|
23
|
+
}
|
24
|
+
action :allocate
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
}.to create_an_aws_instance('test_machine1'
|
29
|
+
).and create_an_aws_instance('test_machine2'
|
30
|
+
).and create_an_aws_instance('test_machine3'
|
31
|
+
).and be_idempotent
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chef::Resource::MachineImage do
|
4
|
+
extend AWSSupport
|
5
|
+
|
6
|
+
when_the_chef_12_server "exists", organization: 'foo', server_scope: :context do
|
7
|
+
with_aws "with a VPC and a public subnet" do
|
8
|
+
before :all do
|
9
|
+
chef_config[:log_level] = :warn
|
10
|
+
end
|
11
|
+
|
12
|
+
purge_all
|
13
|
+
setup_public_vpc
|
14
|
+
|
15
|
+
it "machine_image can create an image in the VPC", :super_slow do
|
16
|
+
expect_recipe {
|
17
|
+
machine_image 'test_machine_image' do
|
18
|
+
machine_options bootstrap_options: {
|
19
|
+
subnet_id: 'test_public_subnet',
|
20
|
+
key_name: 'test_key_pair'
|
21
|
+
}
|
22
|
+
end
|
23
|
+
}.to create_an_aws_image('test_machine_image',
|
24
|
+
name: 'test_machine_image'
|
25
|
+
).and be_idempotent
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
with_aws "Without a VPC" do
|
30
|
+
before :all do
|
31
|
+
chef_config[:log_level] = :warn
|
32
|
+
end
|
33
|
+
|
34
|
+
it "machine_image with no options can create an image in the VPC", :super_slow do
|
35
|
+
expect_recipe {
|
36
|
+
aws_key_pair 'test_key_pair' do
|
37
|
+
allow_overwrite true
|
38
|
+
end
|
39
|
+
machine_image 'test_machine_image' do
|
40
|
+
machine_options bootstrap_options: { key_name: 'test_key_pair' }
|
41
|
+
end
|
42
|
+
}.to create_an_aws_image('test_machine_image',
|
43
|
+
name: 'test_machine_image'
|
44
|
+
).and create_an_aws_key_pair('test_key_pair'
|
45
|
+
).and be_idempotent
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chef::Resource::Machine do
|
4
|
+
extend AWSSupport
|
5
|
+
|
6
|
+
when_the_chef_12_server "exists", organization: 'foo', server_scope: :context do
|
7
|
+
with_aws "with a VPC and a public subnet" do
|
8
|
+
|
9
|
+
before :all do
|
10
|
+
chef_config[:log_level] = :warn
|
11
|
+
end
|
12
|
+
|
13
|
+
purge_all
|
14
|
+
setup_public_vpc
|
15
|
+
it "machine with few options allocates a machine", :super_slow do
|
16
|
+
expect_recipe {
|
17
|
+
machine 'test_machine' do
|
18
|
+
machine_options bootstrap_options: {
|
19
|
+
subnet_id: 'test_public_subnet',
|
20
|
+
key_name: 'test_key_pair'
|
21
|
+
}
|
22
|
+
action :allocate
|
23
|
+
end
|
24
|
+
}.to create_an_aws_instance('test_machine'
|
25
|
+
).and be_idempotent
|
26
|
+
end
|
27
|
+
|
28
|
+
it "machine with few options converges a machine", :super_slow do
|
29
|
+
expect_recipe {
|
30
|
+
machine 'test_machine' do
|
31
|
+
machine_options bootstrap_options: {
|
32
|
+
subnet_id: 'test_public_subnet',
|
33
|
+
key_name: 'test_key_pair'
|
34
|
+
}
|
35
|
+
action :allocate
|
36
|
+
end
|
37
|
+
}.to create_an_aws_instance('test_machine'
|
38
|
+
).and be_idempotent
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
with_aws "Without a VPC" do
|
43
|
+
|
44
|
+
before :all do
|
45
|
+
chef_config[:log_level] = :warn
|
46
|
+
end
|
47
|
+
|
48
|
+
#purge_all
|
49
|
+
it "machine with no options creates an machine", :super_slow do
|
50
|
+
expect_recipe {
|
51
|
+
aws_key_pair 'test_key_pair' do
|
52
|
+
allow_overwrite true
|
53
|
+
end
|
54
|
+
machine 'test_machine' do
|
55
|
+
machine_options bootstrap_options: { key_name: 'test_key_pair' }
|
56
|
+
action :allocate
|
57
|
+
end
|
58
|
+
}.to create_an_aws_instance('test_machine'
|
59
|
+
).and create_an_aws_key_pair('test_key_pair'
|
60
|
+
).and be_idempotent
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|