rivet 2.0.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +4 -4
  4. data/.travis.yml +5 -5
  5. data/CHANGELOG.md +7 -0
  6. data/Gemfile +4 -2
  7. data/Gemfile.lock +42 -26
  8. data/README.md +61 -10
  9. data/bin/rivet +14 -9
  10. data/example/ec2/defaults.rb +6 -0
  11. data/example/ec2/example.rb +8 -0
  12. data/example/ec2/user_data.erb +2 -0
  13. data/lib/rivet/{autoscale.rb → as/autoscale.rb} +33 -4
  14. data/lib/rivet/{config.rb → as/autoscale_config.rb} +3 -33
  15. data/lib/rivet/{launch_config.rb → as/launch_config.rb} +8 -11
  16. data/lib/rivet/{aws_utils.rb → common/aws_utils.rb} +27 -29
  17. data/lib/rivet/common/base_aws_attributes.rb +15 -0
  18. data/lib/rivet/common/base_config.rb +40 -0
  19. data/lib/rivet/{client.rb → common/client.rb} +11 -10
  20. data/lib/rivet/ec2/ec2.rb +163 -0
  21. data/lib/rivet/ec2/ec2_config.rb +19 -0
  22. data/lib/rivet/utils.rb +4 -3
  23. data/lib/rivet/version.rb +1 -1
  24. data/lib/rivet.rb +16 -11
  25. data/rivet.gemspec +6 -5
  26. data/spec/as/autoscale_config_spec.rb +65 -0
  27. data/spec/{aws_autoscale_wrapper_spec.rb → as/aws_autoscale_wrapper_spec.rb} +1 -1
  28. data/spec/aws_utils_spec.rb +44 -0
  29. data/spec/base_config_spec.rb +31 -0
  30. data/spec/bootstrap_spec.rb +1 -1
  31. data/spec/ec2/ec2_config_spec.rb +29 -0
  32. data/spec/launch_config_spec.rb +1 -1
  33. data/spec/shared_examples/a_config.rb +98 -0
  34. data/spec/shared_examples/a_config_util.rb +33 -0
  35. data/spec/spec_setup.rb +63 -39
  36. data/spec/util_spec.rb +16 -23
  37. metadata +63 -43
  38. data/lib/rivet/deep_merge.rb +0 -29
  39. data/spec/config_spec.rb +0 -168
  40. /data/lib/rivet/{aws_autoscale_wrapper.rb → as/aws_autoscale_wrapper.rb} +0 -0
  41. /data/lib/rivet/{bootstrap.rb → common/bootstrap.rb} +0 -0
  42. /data/lib/rivet/{config_proxy.rb → common/config_proxy.rb} +0 -0
  43. /data/lib/rivet/{logger.rb → common/logger.rb} +0 -0
  44. /data/lib/rivet/{open_state.rb → common/open_state.rb} +0 -0
@@ -21,37 +21,38 @@ module Rivet
21
21
  end
22
22
  end
23
23
 
24
- def self.config_parser
25
- if ENV['AWS_CONFIG_FILE']
26
-
27
- current_profile = nil
28
- profile_matcher = /^\[(profile+\s)?(\w+)\]/
29
- option_matcher = /(\w.*)=(\S.*)\s*/
30
- aws_config = {}
24
+ def self.parse_profile_text(text)
25
+ current_profile = nil
26
+ profile_matcher = /^\[(profile+\s)?(\w+)\]/
27
+ option_matcher = /(\w.*)\s*=\s*(\S.*)\s*/
28
+ aws_config = {}
29
+
30
+ text.each_line do |line|
31
+ if line =~ profile_matcher
32
+ current_profile = line.match(profile_matcher)[2]
33
+ aws_config[current_profile] = {} unless aws_config.has_key?(current_profile)
34
+ end
31
35
 
32
- File.open(ENV['AWS_CONFIG_FILE'], 'r').each_line do |line|
36
+ if line =~ option_matcher && !current_profile.nil?
37
+ results = line.match(option_matcher)
33
38
 
34
- if line =~ profile_matcher
35
- current_profile = line.match(profile_matcher)[2]
36
- aws_config[current_profile] = {} unless aws_config.has_key?(current_profile)
39
+ # Normalize the option name so it can be used with the AWS SDK
40
+ if results[1] =~ /^\S*aws_/
41
+ option = results[1].strip.gsub('aws_', '').to_sym
42
+ else
43
+ option = results[1].strip.to_sym
37
44
  end
38
45
 
39
- if line =~ option_matcher && !current_profile.nil?
40
- results = line.match(option_matcher)
41
-
42
- # Normalize the option name so it can be used with the AWS SDK
43
- if results[1] =~ /^\S*aws_/
44
- option = results[1].gsub('aws_', '').to_sym
45
- else
46
- option = results[1].to_sym
47
- end
48
-
49
- value = results[2]
50
- aws_config[current_profile].merge!({ option => value })
51
- end
46
+ value = results[2].strip
47
+ aws_config[current_profile].merge!({ option => value })
48
+ end
49
+ end
50
+ aws_config
51
+ end
52
52
 
53
- end
54
- aws_config
53
+ def self.config_parser
54
+ if ENV['AWS_CONFIG_FILE']
55
+ parse_profile_text(File.read(ENV['AWS_CONFIG_FILE']))
55
56
  end
56
57
  end
57
58
 
@@ -67,11 +68,8 @@ module Rivet
67
68
  end
68
69
  accum
69
70
  end
70
-
71
71
  AWS.config(aws_creds) if aws_creds
72
-
73
72
  end
74
73
  end
75
-
76
74
  end
77
75
  end
@@ -0,0 +1,15 @@
1
+ # encoding: UTF-8
2
+
3
+ module Rivet
4
+ BASE_AWS_ATTRIBUTES = [
5
+ :iam_instance_profile,
6
+ :block_device_mappings,
7
+ :image_id,
8
+ :key_name,
9
+ :security_groups,
10
+ :instance_type,
11
+ :kernel_id,
12
+ :ramdisk_id,
13
+ :associate_public_ip_address
14
+ ].each { |a| attr_reader a }
15
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: UTF-8
2
+
3
+ module Rivet
4
+ class BaseConfig < OpenState
5
+ attr_reader :name
6
+ attr_accessor :bootstrap
7
+
8
+ def self.from_file(dsl_file, load_path='.')
9
+ name = File.basename(dsl_file, '.rb')
10
+ data = Proc.new { eval(File.read(dsl_file)) }
11
+ new(name, load_path, &data)
12
+ end
13
+
14
+ def initialize(name, load_path='.', &block)
15
+ super()
16
+ @name = name
17
+ @path = load_path
18
+ @bootstrap = OpenState.new
19
+ instance_eval(&block) if block
20
+ end
21
+
22
+ def path(*args)
23
+ if args.size < 1
24
+ @path
25
+ else
26
+ File.join(@path, *args)
27
+ end
28
+ end
29
+
30
+ def normalize_security_groups
31
+ security_groups.sort
32
+ end
33
+
34
+ protected
35
+
36
+ def import(import_path)
37
+ lambda { eval(File.read(import_path)) }.call
38
+ end
39
+ end
40
+ end
@@ -2,37 +2,38 @@
2
2
 
3
3
  module Rivet
4
4
  class Client
5
- def run(options)
5
+ def run(client_type,options)
6
6
  AwsUtils.set_aws_credentials options.profile
7
7
  Rivet::Log.level options.log_level
8
8
 
9
- Rivet::Log.info "Using autoscale config path #{options.config_path}"
9
+ Rivet::Log.info "Using #{client_type} config path #{options.config_path}"
10
10
 
11
11
  unless Dir.exists?(options.config_path)
12
- Rivet::Utils.die 'The autoscale config path does not exist'
12
+ Rivet::Utils.die "The #{client_type} config path does not exist"
13
13
  end
14
14
 
15
- # Get config object for autoscaling group
16
15
  config = Rivet::Utils.get_config(
17
- options.group,
16
+ client_type,
17
+ options.name,
18
18
  options.config_path)
19
19
 
20
20
  unless config
21
21
  Rivet::Utils.list_groups(options.config_path)
22
- Rivet::Utils.die "The #{options.group} autoscale definition doesn't exist"
22
+ Rivet::Utils.die "The #{options.name} #{client_type} definition doesn't exist"
23
23
  end
24
24
 
25
25
  config.validate
26
26
 
27
27
  config = ConfigProxy.new(config)
28
28
 
29
- Rivet::Log.info "Checking #{options.group} autoscaling definition"
29
+ Rivet::Log.info "#{options.name} #{client_type} definition"
30
30
 
31
- autoscale_group = Rivet::Autoscale.new(config)
32
- autoscale_group.show_differences
31
+ asset = Rivet.const_get(client_type.capitalize).new(config)
32
+ asset.display
33
33
 
34
34
  if options.sync
35
- autoscale_group.sync
35
+ Rivet::Log.debug "syncing asset #{options.name}"
36
+ asset.sync
36
37
  else
37
38
  Rivet::Log.info 'use the -s [--sync] flag to sync changes'
38
39
  end
@@ -0,0 +1,163 @@
1
+ # encoding: UTF-8
2
+
3
+ module Rivet
4
+ class Ec2
5
+ OPTIONS = [
6
+ :associate_public_ip_address,
7
+ :availability_zone,
8
+ :block_device_mappings,
9
+ :count,
10
+ :dedicated_tenancy,
11
+ :disable_api_termination,
12
+ :ebs_optimized,
13
+ :elastic_ips,
14
+ :iam_instance_profile,
15
+ :image_id,
16
+ :instance_initiated_shutdown_behavior,
17
+ :instance_type,
18
+ :kernel_id,
19
+ :key_name,
20
+ :key_pair,
21
+ :monitoring_enabled,
22
+ :network_interfaces,
23
+ :placement_group,
24
+ :private_ip_address,
25
+ :ramdisk_id,
26
+ :security_group_ids,
27
+ :security_groups,
28
+ :subnet,
29
+ :tags,
30
+ :user_data
31
+ ].each { |a| attr_reader a }
32
+
33
+ REQUIRED_OPTIONS = [
34
+ :image_id
35
+ ]
36
+
37
+ attr_reader :name
38
+
39
+ def initialize(config)
40
+ @ec2 = AWS::EC2.new
41
+ @name = config.name
42
+ @user_data = Bootstrap.new(config).user_data
43
+
44
+ OPTIONS.each do |o|
45
+ if config.respond_to?(o)
46
+ instance_variable_set("@#{o}", config.send(o))
47
+ end
48
+ end
49
+ end
50
+
51
+ def display(level = 'info')
52
+ options.each_pair do |attr, values|
53
+ Rivet::Log.write(level, " #{attr}: #{values}")
54
+ end
55
+ end
56
+
57
+ def options
58
+ options = {}
59
+
60
+ OPTIONS.each do |field|
61
+ local_value = self.send(field)
62
+ options[field] = local_value unless local_value.nil?
63
+ end
64
+
65
+ REQUIRED_OPTIONS.each do |field|
66
+ unless options.has_key? field
67
+ options[field] = self.send(field)
68
+ end
69
+ end
70
+ options
71
+ end
72
+
73
+ def sync
74
+ # The AWS ruby SDK forces you to apply tags AFTER creation
75
+ # This option must be removed so the create call doesn't blow up.
76
+ server_options = options
77
+ tags_to_add = server_options.delete :tags
78
+ eips_to_add = server_options.delete :elastic_ips
79
+ enis_to_add = server_options.delete :network_interfaces
80
+ instances = @ec2.instances.create server_options
81
+
82
+ # Since create returns either an instance object or an array let us
83
+ # just go ahead and make that more sane
84
+ instances = [instances] unless instances.respond_to? :each
85
+
86
+ add_tags(instances,tags_to_add)
87
+ ready_instances = wait_until_running instances
88
+ add_eips(ready_instances,eips_to_add) if eips_to_add
89
+ add_network_interfaces(ready_instances,enis_to_add) if enis_to_add
90
+ end
91
+
92
+ protected
93
+
94
+ def add_network_interfaces(instances,interfaces)
95
+ index_to_instances = 0
96
+ interfaces.each do |i|
97
+ unless index_to_instances > instances.size
98
+ attach_interface(instances[index_to_instances],i)
99
+ index_to_instances + 1
100
+ end
101
+ end
102
+ end
103
+
104
+ def attach_interface(instance,interface)
105
+ eni = AWS::EC2::NetworkInterface.new(interface)
106
+ if eni.exists?
107
+ Rivet::Log.info "Attaching #{eni.id} to #{instance.id}"
108
+ instance.attach_network_interface eni
109
+ end
110
+ end
111
+
112
+ def add_eips(instances,eips_to_add)
113
+ index_to_instances = 0
114
+ eips_to_add.each do |ip|
115
+ unless index_to_instances > instances.size
116
+ attach_ip(instances[index_to_instances],ip)
117
+ index_to_instances + 1
118
+ end
119
+ end
120
+ end
121
+
122
+ def attach_ip(instance,ip)
123
+ eip = AWS::EC2::ElasticIp.new(ip)
124
+ if eip.exists?
125
+ Rivet::Log.info "Attaching #{eip} to #{instance.id}"
126
+ instance.associate_elastic_ip eip
127
+ end
128
+ end
129
+
130
+ def tag_instance(instance,tags_to_add)
131
+ tags_to_add.each do |t|
132
+ @ec2.tags.create(instance, t[:key].to_s, :value => t[:value])
133
+ end
134
+ end
135
+
136
+ def add_tags(instances,tags_to_add)
137
+ instances.each do |i|
138
+ if tags_to_add
139
+ tag_instance(i,tags_to_add)
140
+ else
141
+ Rivet::Log.info "No tags in config, defaulting to Name: #{@name}"
142
+ tag_instance(i,[{ :key => 'Name', :value => @name }])
143
+ end
144
+ end
145
+ end
146
+
147
+ def wait_until_running(instances)
148
+ Rivet::Log.info "Waiting for instance to start. This could take a while..."
149
+ finished = []
150
+ until instances.size <= 0
151
+ instances.reject! do |i|
152
+ unless i.status == :pending
153
+ Rivet::Log.info "#{i.id} is in #{i.status} state."
154
+ finished << i
155
+ true
156
+ end
157
+ end
158
+ sleep 1
159
+ end
160
+ finished
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,19 @@
1
+ #encoding: UTF-8
2
+
3
+ module Rivet
4
+ class Ec2Config < BaseConfig
5
+
6
+ def initialize(name, load_path='.', &block)
7
+ @required_fields = {
8
+ :image_id => nil,
9
+ :region => 'us-east-1',
10
+ :availability_zone => 'a'
11
+ }
12
+ super(name,load_path, &block)
13
+ end
14
+
15
+ def normalize_availability_zone
16
+ region + availability_zone
17
+ end
18
+ end
19
+ end
data/lib/rivet/utils.rb CHANGED
@@ -4,7 +4,7 @@ module Rivet
4
4
  module Utils
5
5
  def self.die(level = 'fatal', message)
6
6
  Rivet::Log.write(level, message)
7
- exit
7
+ exit 1
8
8
  end
9
9
 
10
10
  def self.list_groups(directory)
@@ -15,9 +15,10 @@ module Rivet
15
15
  config_file_names.each { |n| Rivet::Log.info n }
16
16
  end
17
17
 
18
- def self.get_config(name, directory)
18
+ def self.get_config(client_type, name, directory)
19
19
  dsl_file = File.join(directory, "#{name}.rb")
20
- Rivet::Config.from_file(dsl_file, directory) if File.exists?(dsl_file)
20
+ klass = Rivet.const_get("#{client_type.capitalize}Config")
21
+ klass.from_file(dsl_file, directory) if File.exists?(dsl_file)
21
22
  end
22
23
  end
23
24
  end
data/lib/rivet/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  module Rivet
4
- VERSION = '2.0.0'
4
+ VERSION = '3.0.0'
5
5
  end
data/lib/rivet.rb CHANGED
@@ -9,16 +9,21 @@ require 'logger'
9
9
  require 'optparse'
10
10
  require 'ostruct'
11
11
  require 'singleton'
12
+ require 'diff/lcs'
12
13
 
13
- require_relative 'rivet/autoscale'
14
- require_relative 'rivet/aws_autoscale_wrapper'
15
- require_relative 'rivet/aws_utils'
16
- require_relative 'rivet/bootstrap'
17
- require_relative 'rivet/client'
18
- require_relative 'rivet/open_state'
19
- require_relative 'rivet/config'
20
- require_relative 'rivet/config_proxy'
21
- require_relative 'rivet/deep_merge'
22
- require_relative 'rivet/launch_config'
23
- require_relative 'rivet/logger'
14
+ require_relative 'rivet/common/base_aws_attributes'
15
+ require_relative 'rivet/as/autoscale'
16
+ require_relative 'rivet/as/aws_autoscale_wrapper'
17
+ require_relative 'rivet/common/client'
18
+ require_relative 'rivet/common/aws_utils'
19
+ require_relative 'rivet/common/bootstrap'
20
+ require_relative 'rivet/common/open_state'
21
+ require_relative 'rivet/common/base_config'
22
+ require_relative 'rivet/as/autoscale_config'
23
+ require_relative 'rivet/common/config_proxy'
24
+ require_relative 'rivet/as/launch_config'
25
+ require_relative 'rivet/common/logger'
26
+ require_relative 'rivet/ec2/ec2_config'
27
+ require_relative 'rivet/ec2/ec2'
24
28
  require_relative 'rivet/utils'
29
+ require_relative 'rivet/version'
data/rivet.gemspec CHANGED
@@ -21,10 +21,11 @@ Gem::Specification.new do |spec|
21
21
  spec.test_files = spec.files.grep(%r{^spec/})
22
22
 
23
23
  spec.executables = %w(rivet)
24
- spec.require_paths = ["lib"]
24
+ spec.require_paths = ['lib']
25
25
 
26
- spec.add_dependency "aws-sdk", ">= 1.11.1"
27
- spec.add_development_dependency "pry", "~> 0.9.12"
28
- spec.add_development_dependency "rake", ">= 10.1.0"
29
- spec.add_development_dependency "rspec", "~> 2.14.1"
26
+ spec.add_dependency 'aws-sdk', '>= 1.11.1'
27
+ spec.add_dependency 'diff-lcs', '>= 1.2.5'
28
+ spec.add_development_dependency 'pry', '~> 0.9.12'
29
+ spec.add_development_dependency 'rake', '>= 10.1.0'
30
+ spec.add_development_dependency 'rspec', '~> 2.14.1'
30
31
  end
@@ -0,0 +1,65 @@
1
+ # encoding: UTF-8
2
+ require_relative '../spec_setup'
3
+ require_relative '../shared_examples/a_config'
4
+
5
+ include SpecHelpers
6
+
7
+ describe 'rivet autoscale config' do
8
+ let(:dsl_values) { ASG_DSL_VALUES }
9
+ let(:default_config) { Rivet::AutoscaleConfig.new('default_unit_test_config') }
10
+ let(:config) { Rivet::AutoscaleConfig.new('unit_test_config') { eval(ASG_CONFIG_CONTENT) } }
11
+ let(:config_from_file) { Rivet::AutoscaleConfig.from_file(File.join('.', 'unit_test.rb')) }
12
+ let(:config_content) { ASG_CONFIG_CONTENT }
13
+
14
+ it_behaves_like "a config"
15
+
16
+ context 'without DSL content' do
17
+ describe '#normalize_availability_zones' do
18
+ before do
19
+ default_config.region 'us-west-2'
20
+ default_config.availability_zones %w(c a b)
21
+ end
22
+
23
+ it 'should return a sorted array of zones with the region prepended' do
24
+ default_config.normalize_availability_zones.should == %w(us-west-2a us-west-2b us-west-2c)
25
+ end
26
+ end
27
+
28
+ describe '#normalize_load_balancers' do
29
+ before do
30
+ default_config.load_balancers %w(balancer2 balancer1)
31
+ end
32
+
33
+ it 'should return a sorted array of load balancers' do
34
+ default_config.normalize_load_balancers.should == %w(balancer1 balancer2)
35
+ end
36
+ end
37
+
38
+ describe '#normalize_subnets' do
39
+ before do
40
+ default_config.subnets %w(192.168.1.2 192.168.1.3 192.168.1.1)
41
+ end
42
+
43
+ it 'should return a sorted array of subnets' do
44
+ default_config.normalize_subnets.should == %w(192.168.1.1 192.168.1.2 192.168.1.3)
45
+ end
46
+ end
47
+
48
+ describe '#normalize_tags' do
49
+ before do
50
+ default_config.tags [
51
+ { key: 'Other', value: 'sasquatch', propagate_at_launch: false },
52
+ { key: 'Name', value: 'unit test' }
53
+ ]
54
+ end
55
+
56
+ it 'should return a normalized array of hashes' do
57
+ expected_result = [
58
+ { propagate_at_launch: true, key: 'Name', value: 'unit test' },
59
+ { propagate_at_launch: false, key: 'Other', value: 'sasquatch' }
60
+ ]
61
+ default_config.normalize_tags.should == expected_result
62
+ end
63
+ end
64
+ end
65
+ end
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
- require_relative './spec_setup'
2
+ require_relative '../spec_setup'
3
3
 
4
4
  include SpecHelpers
5
5
 
@@ -0,0 +1,44 @@
1
+ # encoding: UTf-8
2
+ require_relative './spec_setup'
3
+
4
+ include SpecHelpers
5
+
6
+ describe 'rivet awsutils' do
7
+ describe 'parse_profile_text' do
8
+ let(:profile_hash) do
9
+ {
10
+ 'unit_test_profile1' => {
11
+ 'option1' => 'unit_test_option1',
12
+ 'option2' => 'unit_test_option2'
13
+ },
14
+ 'unit_test_profile2' => {
15
+ 'option1 ' => 'unit_test_option1',
16
+ 'option2' => 'unit_test_option2 '
17
+ }
18
+ }
19
+ end
20
+
21
+ let(:profile_text) do
22
+ p = String.new
23
+ profile_hash.each_pair do |profile,options|
24
+ p << "[profile #{profile}]\n"
25
+ options.each_pair { |name,value| p << "#{name.chomp} = #{value.chomp}\n" }
26
+ end
27
+ p
28
+ end
29
+
30
+ it 'should contain the profile as top level keys' do
31
+ result = Rivet::AwsUtils.parse_profile_text(profile_text)
32
+ profile_hash.each_pair { |profile,_| result.should have_key profile }
33
+ end
34
+
35
+ it 'should set all options properly inside the profile hash' do
36
+ result = Rivet::AwsUtils.parse_profile_text(profile_text)
37
+ profile_hash.each_pair do |profile,options|
38
+ options.each_pair do |name, value|
39
+ result[profile][name.strip.to_sym].should == value.strip
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: UTF-8
2
+ require_relative './spec_setup'
3
+ require_relative './shared_examples/a_config'
4
+
5
+ include SpecHelpers
6
+
7
+ describe 'rivet base config' do
8
+ let(:dsl_values) { COMMON_DSL_VALUES }
9
+ let(:default_config) { Rivet::BaseConfig.new('default_unit_test_config') }
10
+ let(:config) { Rivet::BaseConfig.new('unit_test_config') { eval(ASG_CONFIG_CONTENT) } }
11
+ let(:config_from_file) { Rivet::BaseConfig.from_file(File.join('.', 'unit_test.rb')) }
12
+ let(:config_content) { ASG_CONFIG_CONTENT }
13
+
14
+ it_behaves_like "a config"
15
+
16
+ context 'without DSL content' do
17
+ describe '#new' do
18
+ it 'returns a Rivet::BaseConfig object' do
19
+ default_config.should be_an_instance_of Rivet::BaseConfig
20
+ end
21
+ end
22
+ end
23
+
24
+ context 'with DSL content' do
25
+ describe '#new' do
26
+ it 'returns a Rivet::BaseConfig object' do
27
+ config.should be_an_instance_of Rivet::BaseConfig
28
+ end
29
+ end
30
+ end
31
+ end
@@ -4,7 +4,7 @@ require_relative './spec_setup'
4
4
  include SpecHelpers
5
5
 
6
6
  describe 'rivet bootstrap' do
7
- let(:config) { generate_config_mock(double('config_mock'), DSL_VALUES) }
7
+ let(:config) { generate_config_mock(double('config_mock'), ASG_DSL_VALUES) }
8
8
  let(:bootstrap) { Rivet::Bootstrap.new(config) }
9
9
  let(:blank_config) do
10
10
  blank_config_mock = double('blank_config_mock')
@@ -0,0 +1,29 @@
1
+ # encoding: UTF-8
2
+ require_relative '../spec_setup'
3
+ require_relative '../shared_examples/a_config'
4
+
5
+ include SpecHelpers
6
+
7
+ describe 'rivet ec2 config' do
8
+ let(:dsl_values) { EC2_DSL_VALUES }
9
+ let(:default_config) { Rivet::Ec2Config.new('default_unit_test_config') }
10
+ let(:config) { Rivet::Ec2Config.new('unit_test_config') { eval(EC2_CONFIG_CONTENT) } }
11
+ let(:config_from_file) { Rivet::Ec2Config.from_file(File.join('.', 'unit_test.rb')) }
12
+ let(:config_content) { EC2_CONFIG_CONTENT }
13
+
14
+ it_behaves_like "a config"
15
+
16
+ context 'without DSL content' do
17
+ describe '#normalize_availability_zone' do
18
+ before do
19
+ default_config.region 'us-west-2'
20
+ default_config.availability_zone 'a'
21
+ end
22
+
23
+ it 'should return a valid availability zone string' do
24
+ default_config.normalize_availability_zone.should == 'us-west-2a'
25
+ end
26
+ end
27
+ end
28
+ end
29
+
@@ -4,7 +4,7 @@ require_relative './spec_setup'
4
4
  include SpecHelpers
5
5
 
6
6
  describe 'rivet launch config' do
7
- let(:config) { generate_config_mock(double('config_mock'), DSL_VALUES) }
7
+ let(:config) { generate_config_mock(double('config_mock'), ASG_DSL_VALUES) }
8
8
  let(:launch_config) { Rivet::LaunchConfig.new(config) }
9
9
 
10
10
  context 'with a sane config' do