chef-provisioning-aws 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5d4c4e48ec76622cc159966e0862a69e92dcc794
4
- data.tar.gz: 6db5dc3f481f314c3abc02d8389d773e84cd01b7
3
+ metadata.gz: eda6856be96232e40cce33671b0ed5b92ea9b693
4
+ data.tar.gz: 58a87deccbffab115c4799f7244030e1d60021d8
5
5
  SHA512:
6
- metadata.gz: 31a85827c948b002ccc16889f9e075f1689b05d26a38a24ce6bf871b94b609dcf828b7baf3f1cec46e4d0f270bd129fed9a1bf66fe0ad63fb4413c3ba41a712f
7
- data.tar.gz: f7d87089964113885f12dcfe193af3dbc7fb39d0bbb955fd4da53bb30c682701c54d6b35a051f922300ecbd848dd1ac87e0b963509af212f1a8d8ef02469c801
6
+ metadata.gz: d9b18ddd408a632dd03005160807a3fd398f9326009df0dfe27b270860a0beeba6173bca3c39feec22b990ead226075e1507fa35b89689a4d98078341658952b
7
+ data.tar.gz: ef03d0848060e8bc2097eba525cc33f61d22fcc5ee544205f3ba09af55b75ea8597dc654c41f8d471a216a89900edef409a95b606a20d066a3e2e44b7f8b7a64
@@ -0,0 +1,85 @@
1
+ require 'chef/provider/aws_provider'
2
+ require 'chef/provisioning/machine_spec'
3
+ require 'cheffish'
4
+
5
+ class Chef::Provider::AwsEipAddress < Chef::Provider::AwsProvider
6
+
7
+ action :create do
8
+ if existing_ip == nil
9
+ converge_by "Creating new EIP address in #{new_resource.region_name}" do
10
+ eip = ec2.elastic_ips.create :vpc => new_resource.associate_to_vpc
11
+ new_resource.public_ip eip.public_ip
12
+ new_resource.domain eip.domain
13
+ new_resource.instance_id eip.instance_id
14
+ end
15
+ else
16
+ new_resource.public_ip existing_ip.public_ip
17
+ new_resource.domain existing_ip.domain
18
+ new_resource.instance_id existing_ip.instance_id
19
+ end
20
+ new_resource.save
21
+ end
22
+
23
+ action :delete do
24
+ if existing_ip
25
+ converge_by "Deleting EIP Address #{new_resource.name} in #{new_resource.region_name}" do
26
+ #if it's attached to something in a vpc, disassociate first
27
+ if existing_ip.instance_id != nil && existing_ip.domain == 'vpc'
28
+ existing_ip.disassociate
29
+ end
30
+ existing_ip.delete
31
+ new_resource.delete
32
+ end
33
+ end
34
+ end
35
+
36
+ action :associate do
37
+ converge_by "Associating EIP Address #{new_resource.name} in #{new_resource.region_name}" do
38
+ if existing_ip == nil
39
+ action_create
40
+ end
41
+ eip = ec2.elastic_ips[new_resource.public_ip]
42
+ begin
43
+ spec = Chef::Provisioning::ChefMachineSpec.get(new_resource.machine)
44
+ if spec == nil
45
+ Chef::Application.fatal!("Could not find machine #{new_resource.machine}")
46
+ else
47
+ eip.associate :instance => spec.location['instance_id']
48
+ end
49
+ new_resource.instance_id eip.instance_id
50
+ rescue => e
51
+ Chef::Application.fatal!("Error Associating EIP: #{e}")
52
+ end
53
+ new_resource.save
54
+ end
55
+ end
56
+
57
+ action :disassociate do
58
+ converge_by "Disassociating EIP Address #{new_resource.name} in #{new_resource.region_name}" do
59
+ begin
60
+ if existing_ip != nil
61
+ existing_ip.disassociate
62
+ new_resource.instance_id nil
63
+ new_resource.save
64
+ else
65
+ Chef::Log.warn("No EIP found to disassociate")
66
+ end
67
+ rescue => e
68
+ Chef::Application.fatal!("Error Disassociating EIP: #{e}")
69
+ end
70
+ end
71
+ end
72
+
73
+ def existing_ip
74
+ new_resource.hydrate
75
+ @existing_ip ||= new_resource.public_ip == nil ? nil : begin
76
+ eip = ec2.elastic_ips[new_resource.public_ip]
77
+ eip
78
+ rescue => e
79
+ Chef::Application.fatal!("Error looking for EIP Address: #{e}")
80
+ nil
81
+ end
82
+ end
83
+
84
+
85
+ end
@@ -176,7 +176,7 @@ class Chef::Provider::AwsKeyPair < Chef::Provider::AwsProvider
176
176
  @current_resource = Chef::Resource::AwsKeyPair.new(new_resource.name, run_context)
177
177
 
178
178
  current_key_pair = ec2.key_pairs[new_resource.name]
179
- if current_key_pair
179
+ if current_key_pair && current_key_pair.exists?
180
180
  @current_fingerprint = current_key_pair ? current_key_pair.fingerprint : nil
181
181
  else
182
182
  current_resource.action :delete
@@ -7,6 +7,20 @@ class Chef::Provider::AwsS3Bucket < Chef::Provider::AwsProvider
7
7
  converge_by "Creating new S3 bucket #{fqn}" do
8
8
  bucket = s3.buckets.create(fqn)
9
9
  bucket.tags['Name'] = new_resource.name
10
+ if new_resource.enable_website_hosting
11
+ bucket.website_configuration = AWS::S3::WebsiteConfiguration.new(
12
+ new_resource.website_options)
13
+ end
14
+ end
15
+ elsif requires_modification?
16
+ converge_by "Modifying S3 Bucket #{fqn}" do
17
+ if existing_bucket.website_configuration == nil && new_resource.enable_website_hosting ||
18
+ existing_bucket.website_configuration != nil && new_resource.enable_website_hosting
19
+ existing_bucket.website_configuration = AWS::S3::WebsiteConfiguration.new(
20
+ new_resource.website_options)
21
+ else
22
+ existing_bucket.remove_website_configuration
23
+ end
10
24
  end
11
25
  end
12
26
 
@@ -29,13 +43,29 @@ class Chef::Provider::AwsS3Bucket < Chef::Provider::AwsProvider
29
43
  @existing_bucket ||= s3.buckets[fqn] if s3.buckets[fqn].exists?
30
44
  end
31
45
 
32
- # Fully qualified bucket name (i.e resource_region unless otherwise specified)
33
- def id
34
- new_resource.bucket_name
46
+ def requires_modification?
47
+ if existing_bucket.website_configuration == nil
48
+ new_resource.enable_website_hosting
49
+ else
50
+ !new_resource.enable_website_hosting ||
51
+ !compare_website_configuration
52
+ end
35
53
  end
36
54
 
37
- def fqn
38
- super.gsub('_', '-')
55
+ def compare_website_configuration
56
+ # This is incomplete, routing rules have many optional values, so its
57
+ # possible aws will put in default values for those which won't be in
58
+ # the requested config.
59
+ new_web_config = new_resource.website_options
60
+ current_web_config = existing_bucket.website_configuration.to_hash
61
+
62
+ current_web_config[:index_document] == new_web_config.fetch(:index_document, {}) &&
63
+ current_web_config[:error_document] == new_web_config.fetch(:error_document, {}) &&
64
+ current_web_config[:routing_rules] == new_web_config.fetch(:routing_rules, [])
39
65
  end
40
66
 
67
+ # Fully qualified bucket name (i.e resource_region unless otherwise specified)
68
+ def id
69
+ new_resource.bucket_name || new_resource.name
70
+ end
41
71
  end
@@ -1,10 +1,11 @@
1
1
  require 'inifile'
2
2
  require 'csv'
3
+ require 'chef/mixin/deep_merge'
3
4
 
4
5
  class Chef
5
6
  module Provisioning
6
7
  module AWSDriver
7
- # Reads in a credentials file in Amazon's download format and presents the credentials to you
8
+ # Reads in credential files in Amazon's download format and presents the credentials to you
8
9
  class Credentials
9
10
  def initialize
10
11
  @credentials = {}
@@ -12,6 +13,7 @@ module AWSDriver
12
13
  end
13
14
 
14
15
  include Enumerable
16
+ include Chef::Mixin::DeepMerge
15
17
 
16
18
  def default
17
19
  if @credentials.size == 0
@@ -32,8 +34,16 @@ module AWSDriver
32
34
  @credentials.each(&block)
33
35
  end
34
36
 
35
- def load_ini(credentials_ini_file)
36
- inifile = IniFile.load(File.expand_path(credentials_ini_file))
37
+ def load_inis(config_ini_file, credentials_ini_file = nil)
38
+ @credentials = load_config_ini(config_ini_file)
39
+ @credentials = deep_merge!(@credentials,
40
+ load_credentials_ini(credentials_ini_file)
41
+ ) if credentials_ini_file
42
+ end
43
+
44
+ def load_config_ini(config_ini_file)
45
+ inifile = IniFile.load(File.expand_path(config_ini_file))
46
+ config = {}
37
47
  if inifile
38
48
  inifile.each_section do |section|
39
49
  if section =~ /^\s*profile\s+(.+)$/ || section =~ /^\s*(default)\s*/
@@ -43,14 +53,27 @@ module AWSDriver
43
53
  result
44
54
  end
45
55
  profile[:name] = profile_name
46
- @credentials[profile_name] = profile
56
+ config[profile_name] = profile
47
57
  end
48
58
  end
49
- else
50
- # Get it to throw an error
51
- File.open(File.expand_path(credentials_ini_file)) do
59
+ end
60
+ config
61
+ end
62
+
63
+ def load_credentials_ini(credentials_ini_file)
64
+ inifile = IniFile.load(File.expand_path(credentials_ini_file))
65
+ config = {}
66
+ if inifile
67
+ inifile.each_section do |section|
68
+ profile = inifile[section].inject({}) do |result, pair|
69
+ result[pair[0].to_sym] = pair[1]
70
+ result
71
+ end
72
+ profile[:name] = section
73
+ config[section] = profile
52
74
  end
53
75
  end
76
+ config
54
77
  end
55
78
 
56
79
  def load_csv(credentials_csv_file)
@@ -66,8 +89,13 @@ module AWSDriver
66
89
 
67
90
  def load_default
68
91
  config_file = ENV['AWS_CONFIG_FILE'] || File.expand_path('~/.aws/config')
92
+ credentials_file = ENV['AWS_CREDENTIAL_FILE'] || File.expand_path('~/.aws/credentials')
69
93
  if File.file?(config_file)
70
- load_ini(config_file)
94
+ if File.file?(credentials_file)
95
+ load_inis(config_file, credentials_file)
96
+ else
97
+ load_inis(config_file)
98
+ end
71
99
  end
72
100
  end
73
101
 
@@ -56,8 +56,6 @@ module AWSDriver
56
56
  security_group_name = lb_options[:security_group_name] || 'default'
57
57
  security_group_id = lb_options[:security_group_id]
58
58
 
59
- # TODO confused: this variable doesn't appear to be used?
60
- # default_sg = ec2.security_groups.filter('group-name', 'default')
61
59
  security_group = if security_group_id.nil?
62
60
  ec2.security_groups.filter('group-name', security_group_name).first
63
61
  else
@@ -186,6 +184,18 @@ module AWSDriver
186
184
  end
187
185
 
188
186
  def destroy_load_balancer(action_handler, lb_spec, lb_options)
187
+ return if lb_spec == nil
188
+
189
+ actual_elb = load_balancer_for(lb_spec)
190
+ if actual_elb && actual_elb.exists?
191
+ # Remove ELB from AWS
192
+ action_handler.perform_action "Deleting EC2 ELB #{lb_spec.id}" do
193
+ actual_elb.delete
194
+ end
195
+ end
196
+
197
+ # Remove LB spec from databag
198
+ lb_spec.delete(action_handler)
189
199
  end
190
200
 
191
201
  # Image methods
@@ -201,7 +211,7 @@ module AWSDriver
201
211
  # Machine methods
202
212
  def allocate_machine(action_handler, machine_spec, machine_options)
203
213
  actual_instance = instance_for(machine_spec)
204
- if actual_instance == nil || !actual_instance.exists?
214
+ if actual_instance == nil || !actual_instance.exists? || actual_instance.status == :terminated
205
215
  image_id = machine_options[:image_id] || default_ami_for_region(@region)
206
216
  bootstrap_options = machine_options[:bootstrap_options] || {}
207
217
  bootstrap_options[:image_id] = image_id
@@ -252,14 +262,14 @@ module AWSDriver
252
262
 
253
263
  def destroy_machine(action_handler, machine_spec, machine_options)
254
264
  instance = instance_for(machine_spec)
255
- if instance
265
+ if instance && instance.exists?
256
266
  # TODO do we need to wait_until(action_handler, machine_spec, instance) { instance.status != :shutting_down } ?
257
267
  action_handler.perform_action "Terminate #{machine_spec.name} (#{machine_spec.location['instance_id']}) in #{@region} ..." do
258
268
  instance.terminate
259
269
  machine_spec.location = nil
260
270
  end
261
271
  else
262
- Chef::Log.warn "Unable to find and destroy instance for #{machine_spec.inspect}"
272
+ Chef::Log.warn "Instance #{machine_spec.location['instance_id']} doesn't exist for #{machine_spec.name}"
263
273
  end
264
274
 
265
275
  strategy = convergence_strategy_for(machine_spec, machine_options)
@@ -365,6 +375,8 @@ module AWSDriver
365
375
  'ami-996706a3'
366
376
  when 'eu-west-1'
367
377
  'ami-4ab46b3d'
378
+ when 'eu-central-1'
379
+ 'ami-7c3c0a61'
368
380
  when 'sa-east-1'
369
381
  'ami-6770d87a'
370
382
  when 'us-east-1'
@@ -380,7 +392,7 @@ module AWSDriver
380
392
 
381
393
  def create_ssh_transport(machine_spec, machine_options, instance)
382
394
  ssh_options = ssh_options_for(machine_spec, machine_options, instance)
383
- username = machine_spec.location['ssh_username'] || default_ssh_username
395
+ username = machine_spec.location['ssh_username'] || machine_options[:ssh_username] || default_ssh_username
384
396
  if machine_options.has_key?(:ssh_username) && machine_options[:ssh_username] != machine_spec.location['ssh_username']
385
397
  Chef::Log.warn("Server #{machine_spec.name} was created with SSH username #{machine_spec.location['ssh_username']} and machine_options specifies username #{machine_options[:ssh_username]}. Using #{machine_spec.location['ssh_username']}. Please edit the node and change the chef_provisioning.location.ssh_username attribute if you want to change it.")
386
398
  end
@@ -444,6 +456,10 @@ module AWSDriver
444
456
  end
445
457
 
446
458
  def convergence_strategy_for(machine_spec, machine_options)
459
+ # Tell Ohai that this is an EC2 instance so that it runs the EC2 plugin
460
+ machine_options[:convergence_options] ||= {}
461
+ machine_options[:convergence_options][:ohai_hints] = { 'ec2' => ''}
462
+
447
463
  # Defaults
448
464
  if !machine_spec.location
449
465
  return Chef::Provisioning::ConvergenceStrategy::NoConverge.new(machine_options[:convergence_options], config)
@@ -1,4 +1,4 @@
1
- resources = %w(sqs_queue sns_topic ebs_volume s3_bucket auto_scaling_group launch_config vpc security_group)
1
+ resources = %w(sqs_queue sns_topic ebs_volume s3_bucket auto_scaling_group launch_config vpc security_group eip_address)
2
2
 
3
3
  resources.each do |r|
4
4
  Chef::Log.debug "AWS driver loading resource: #{r}"
@@ -1,7 +1,7 @@
1
1
  class Chef
2
2
  module Provisioning
3
3
  module AWSDriver
4
- VERSION = '0.1.2'
4
+ VERSION = '0.1.3'
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,29 @@
1
+ require 'chef/resource/aws_resource'
2
+ require 'chef/provisioning/aws_driver'
3
+ require 'chef/provisioning/machine_spec'
4
+
5
+ class Chef::Resource::AwsEipAddress < Chef::Resource::AwsResource
6
+ self.resource_name = 'aws_eip_address'
7
+ self.databag_name = 'eip_addresses'
8
+
9
+ actions :create, :delete, :nothing, :associate, :disassociate
10
+ default_action :associate
11
+
12
+ stored_attribute :public_ip
13
+ stored_attribute :domain
14
+
15
+ attribute :name, :kind_of => String, :name_attribute => true
16
+ attribute :associate_to_vpc, :kind_of => [TrueClass, FalseClass], :default => false
17
+ attribute :machine, :kind_of => String
18
+ attribute :instance_id, :kind_of => String
19
+
20
+ def initialize(*args)
21
+ super
22
+ end
23
+
24
+ def after_created
25
+ super
26
+ end
27
+
28
+
29
+ end
@@ -10,6 +10,8 @@ class Chef::Resource::AwsS3Bucket < Chef::Resource::AwsResource
10
10
 
11
11
  attribute :name, :kind_of => String, :name_attribute => true
12
12
  attribute :bucket_name, :kind_of => String
13
+ attribute :enable_website_hosting, :kind_of => [TrueClass, FalseClass], :default => false
14
+ attribute :website_options, :kind_of => Hash
13
15
 
14
16
  def initialize(*args)
15
17
  super
@@ -0,0 +1,11 @@
1
+ require 'chef/dsl/recipe'
2
+ require 'chef/provisioning'
3
+ require 'chef/provisioning/aws_driver'
4
+
5
+ RSpec.configure do |rspec|
6
+ rspec.run_all_when_everything_filtered = true
7
+ rspec.filter_run :focus
8
+ rspec.order = 'random'
9
+ rspec.expect_with(:rspec) { |c| c.syntax = :expect }
10
+ rspec.before { allow($stdout).to receive(:write) }
11
+ end
@@ -0,0 +1,109 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chef::Provisioning::AWSDriver::Credentials do
4
+ context 'loading config INI files' do
5
+ let(:personal_credentials) do
6
+ { region: 'us-west-2',
7
+ aws_access_key_id: 'AKIAPERSONALKEY',
8
+ aws_secret_access_key: 'personalsecretaccesskey',
9
+ name: 'personal'
10
+ }
11
+ end
12
+
13
+ let(:work_iam_credentials) do
14
+ { region: 'us-east-1',
15
+ aws_access_key_id: 'AKIAWORKIAMKEY',
16
+ aws_secret_access_key: 'workiamsecretaccesskey',
17
+ name: 'work_iam'
18
+ }
19
+ end
20
+
21
+ let(:config_ini_file) do
22
+ @config ||= begin
23
+ ini = Tempfile.new('config_ini')
24
+ ini.write(
25
+ ['[profile personal]',
26
+ 'region = us-west-2',
27
+ '[profile work_iam]',
28
+ 'region = us-east-1'
29
+ ].join("\n")
30
+ )
31
+ ini.rewind
32
+ ini
33
+ end
34
+ @config
35
+ end
36
+
37
+ let(:credential_ini_file) do
38
+ @creds ||= begin
39
+ ini = Tempfile.new('credential_ini')
40
+ ini.write(
41
+ ['[personal]',
42
+ 'aws_access_key_id = AKIAPERSONALKEY',
43
+ 'aws_secret_access_key = personalsecretaccesskey',
44
+ '[work_iam]',
45
+ 'aws_access_key_id = AKIAWORKIAMKEY',
46
+ 'aws_secret_access_key = workiamsecretaccesskey'
47
+ ].join("\n")
48
+ )
49
+ ini.rewind
50
+ ini
51
+ end
52
+ @creds
53
+ end
54
+
55
+ let(:unified_config_ini_file) do
56
+ @ini ||= begin
57
+ ini = Tempfile.new('unified_config_ini')
58
+ ini.write(
59
+ ['[profile personal]',
60
+ 'region = us-west-2',
61
+ 'aws_access_key_id = AKIAPERSONALKEY',
62
+ 'aws_secret_access_key = personalsecretaccesskey',
63
+ '[profile work_iam]',
64
+ 'region = us-east-1',
65
+ 'aws_access_key_id = AKIAWORKIAMKEY',
66
+ 'aws_secret_access_key = workiamsecretaccesskey'
67
+ ].join("\n")
68
+ )
69
+ ini.rewind
70
+ ini
71
+ end
72
+ @ini
73
+ end
74
+
75
+ context 'unified config ini file' do
76
+ %w(work_iam personal).each do |profile|
77
+ it "loads the '#{profile}' profile from a unified config file" do
78
+ ENV['AWS_DEFAULT_PROFILE'] = profile
79
+ ENV['AWS_CREDENTIAL_FILE'] = nil
80
+ ENV['AWS_CONFIG_FILE'] = unified_config_ini_file.path
81
+ allow(File)
82
+ .to receive(:file?)
83
+ .with(File.expand_path('~/.aws/credentials'))
84
+ .and_return(false)
85
+ allow(File)
86
+ .to receive(:file?)
87
+ .with(File.expand_path(unified_config_ini_file.path))
88
+ .and_return(true)
89
+
90
+ expect(described_class.new.default)
91
+ .to eq(send("#{profile}_credentials"))
92
+ end
93
+ end
94
+ end
95
+
96
+ context 'separate config and credential ini files' do
97
+ %w(work_iam personal).each do |profile|
98
+ it "loads the '#{profile}' profile from a separate config files" do
99
+ ENV['AWS_DEFAULT_PROFILE'] = profile
100
+ ENV['AWS_CREDENTIAL_FILE'] = credential_ini_file.path
101
+ ENV['AWS_CONFIG_FILE'] = config_ini_file.path
102
+
103
+ expect(described_class.new.default)
104
+ .to eq(send("#{profile}_credentials"))
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-provisioning-aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Ewart
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-24 00:00:00.000000000 Z
11
+ date: 2014-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 11.16.4
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 11.16.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: chef-provisioning
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -54,6 +54,20 @@ dependencies:
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - '>='
@@ -67,7 +81,7 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: rake
84
+ name: pry
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - '>='
@@ -93,6 +107,7 @@ files:
93
107
  - Rakefile
94
108
  - lib/chef/provider/aws_auto_scaling_group.rb
95
109
  - lib/chef/provider/aws_ebs_volume.rb
110
+ - lib/chef/provider/aws_eip_address.rb
96
111
  - lib/chef/provider/aws_key_pair.rb
97
112
  - lib/chef/provider/aws_launch_config.rb
98
113
  - lib/chef/provider/aws_provider.rb
@@ -112,6 +127,7 @@ files:
112
127
  - lib/chef/resource/aws_auto_scaling_group.rb
113
128
  - lib/chef/resource/aws_ebs_mount.rb
114
129
  - lib/chef/resource/aws_ebs_volume.rb
130
+ - lib/chef/resource/aws_eip_address.rb
115
131
  - lib/chef/resource/aws_key_pair.rb
116
132
  - lib/chef/resource/aws_launch_config.rb
117
133
  - lib/chef/resource/aws_resource.rb
@@ -120,6 +136,8 @@ files:
120
136
  - lib/chef/resource/aws_sns_topic.rb
121
137
  - lib/chef/resource/aws_sqs_queue.rb
122
138
  - lib/chef/resource/aws_vpc.rb
139
+ - spec/spec_helper.rb
140
+ - spec/unit/aws_driver/credentials_spec.rb
123
141
  homepage: https://github.com/opscode/chef-provisioning-aws
124
142
  licenses: []
125
143
  metadata: {}