eb_deployer 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ 0.4.1
2
+ =====
3
+ * Remove options for delete all environments ("-d --all"), because it is too destructive and not recoverable.
4
+ * Experimental support for multiple components deployment.
5
+
1
6
  0.4.0
2
7
  ====
3
8
  * revert back all changes from 0.3.8 to 0.3.9. Elasticbeanstalk haven't relex the real unique constain. The actually contrain is you can not have environment name cross different application
data/lib/eb_deployer.rb CHANGED
@@ -16,6 +16,8 @@ require 'eb_deployer/application'
16
16
  require 'eb_deployer/resource_stacks'
17
17
  require 'eb_deployer/eb_environment'
18
18
  require 'eb_deployer/environment'
19
+ require 'eb_deployer/default_component'
20
+ require 'eb_deployer/component'
19
21
  require 'eb_deployer/event_poller'
20
22
  require 'eb_deployer/package'
21
23
  require 'eb_deployer/config_loader'
@@ -25,15 +27,6 @@ require 'eb_deployer/version_cleaner'
25
27
 
26
28
  module EbDeployer
27
29
 
28
- TIERS = [
29
- {:name=>"Worker", :type=>"SQS/HTTP", :version=>"1.0"},
30
- {:name=>"WebServer", :type=>"Standard", :version=>"1.0"}
31
- ]
32
-
33
- def environment_tier(name)
34
- TIERS.find {|t| t[:name].downcase == name.downcase} || raise("No tier found with name #{name.inspect}")
35
- end
36
- module_function :environment_tier
37
30
  #
38
31
  # Query ouput value of the cloud formation stack
39
32
  #
@@ -83,7 +76,7 @@ module EbDeployer
83
76
  # :option_name => 'InstanceType',
84
77
  # :value => 'm1.small' }]
85
78
  #
86
- # When there are many, Using an external yaml file to hold those
79
+ # When there are many, using an external yaml file to hold those
87
80
  # configuration is recommended. Such as:
88
81
  #
89
82
  # YAML.load(File.read("my_settings_file.yml"))
@@ -187,7 +180,7 @@ module EbDeployer
187
180
  version_prefix = opts[:version_prefix].to_s.strip
188
181
  version_label = "#{version_prefix}#{opts[:version_label].to_s.strip}"
189
182
  cname = opts[:cname]
190
- env_settings = opts[:option_settings] || opts[:settings] || []
183
+ eb_settings = opts[:option_settings] || opts[:settings] || []
191
184
  strategy_name = opts[:strategy] || :blue_green
192
185
  cname_prefix = opts[:cname_prefix]
193
186
  smoke_test = opts[:smoke_test] || Proc.new {}
@@ -195,22 +188,24 @@ module EbDeployer
195
188
  bucket = opts[:package_bucket] || app
196
189
  skip_resource = opts[:skip_resource_stack_update]
197
190
  keep_latest = opts[:keep_latest].to_i || 0
198
- app_tier = self.environment_tier(opts[:tier] || 'WebServer')
191
+ app_tier = opts[:tier] || 'WebServer'
199
192
 
200
193
  resource_stacks = ResourceStacks.new(opts[:resources], cf, skip_resource)
201
194
  application = Application.new(app, bs, s3, bucket)
202
- environment = Environment.new(application,
203
- env_name,
204
- resource_stacks,
205
- env_settings,
206
- {
207
- :solution_stack => stack_name,
208
- :cname_prefix => cname_prefix,
209
- :smoke_test => smoke_test,
210
- :phoenix_mode => phoenix_mode,
211
- :tier => app_tier
212
- },
213
- bs)
195
+ environment = Environment.new(application, env_name, bs) do |env|
196
+ env.resource_stacks = resource_stacks
197
+ env.settings = eb_settings
198
+ env.creation_opts = {
199
+ :solution_stack => stack_name,
200
+ :cname_prefix => cname_prefix,
201
+ :smoke_test => smoke_test,
202
+ :phoenix_mode => phoenix_mode,
203
+ :tier => app_tier
204
+ }
205
+
206
+ env.components = opts[:components]
207
+ env.component_under_deploy = opts[:component]
208
+ end
214
209
 
215
210
  application.create_version(version_label, opts[:package])
216
211
  environment.deploy(version_label, strategy_name)
@@ -241,8 +236,6 @@ module EbDeployer
241
236
  parser.parse!
242
237
  action = options.delete(:action)
243
238
 
244
- raise "--all is only valid with --destroy" if (options[:all_envs] && action != :destroy)
245
-
246
239
  if File.exists?(options[:config_file])
247
240
  puts "Found configuration at #{options[:config_file]}."
248
241
  else
@@ -278,16 +271,16 @@ module EbDeployer
278
271
  options[:config_file] = v
279
272
  end
280
273
 
281
- opts.on("-d", "--destroy", "Destroy specified environment") do |v|
274
+ opts.on("-d", "--destroy", "Destroy all Elasticbeanstalk environments under the application which have specified environment as name prefix") do |v|
282
275
  options[:action] = :destroy
283
276
  end
284
277
 
285
- opts.on("--all", "Operate on all environments, only valid with --destroy") do |v|
286
- options[:all_envs] = true
278
+ opts.on("--skip-resource-stack-update", "Skip cloud-formation stack update. (only for extreme situation like hitting a cloudformation bug)") do |v|
279
+ options[:skip_resource_stack_update] = true
287
280
  end
288
281
 
289
- opts.on("--skip-resource-stack-update", "skip cloud-formation stack update. (only for extreme situation like hitting a cloudformation bug)") do |v|
290
- options[:skip_resource_stack_update] = true
282
+ opts.on("--component [COMPONENT]", "Specify which component to deploy") do |v|
283
+ options[:component] = v
291
284
  end
292
285
 
293
286
  opts.on("-v", "--version", "Print current version") do |v|
@@ -34,24 +34,21 @@ module EbDeployer
34
34
  end
35
35
  end
36
36
 
37
- def delete(env_name=nil)
37
+ def delete(env_name_prefix)
38
38
  if @eb_driver.application_exists?(@name)
39
- available_envs = @eb_driver.environment_names_for_application(@name)
39
+ available_envs = @eb_driver.environment_names_for_application(@name).select do |name|
40
+ name =~ /^#{env_name_prefix}-/
41
+ end
40
42
 
41
- unless env_name.nil? || available_envs.include?(env_name)
42
- log("Environment #{env_name.inspect} does not exist in application #{@name.inspect}. Skipping delete.")
43
+ if available_envs.empty?
44
+ log("Environment #{env_name_prefix.inspect} does not exist in application #{@name.inspect}. Skipping delete.")
43
45
  return
44
46
  end
45
47
 
46
- available_envs.select { |e| env_name.nil? || e == env_name }.each do |env|
48
+ available_envs.each do |env|
47
49
  log("Terminating environment #{env}")
48
50
  @eb_driver.delete_environment(@name, env)
49
51
  end
50
-
51
- if env_name.nil?
52
- log("Deleting application")
53
- @eb_driver.delete_application(@name)
54
- end
55
52
  end
56
53
  end
57
54
 
@@ -25,7 +25,7 @@ module EbDeployer
25
25
  :environment_id => env_id,
26
26
  :version_label => version,
27
27
  :option_settings => settings,
28
- :tier => tier
28
+ :tier => environment_tier(tier)
29
29
  }
30
30
 
31
31
  @client.update_environment(request)
@@ -46,7 +46,7 @@ module EbDeployer
46
46
  :solution_stack_name => stack_name,
47
47
  :version_label => version,
48
48
  :option_settings => settings,
49
- :tier => tier,
49
+ :tier => environment_tier(tier),
50
50
  :cname_prefix => cname_prefix
51
51
  }
52
52
 
@@ -112,6 +112,15 @@ module EbDeployer
112
112
 
113
113
  private
114
114
 
115
+ TIERS = [
116
+ {:name=>"Worker", :type=>"SQS/HTTP", :version=>"1.0"},
117
+ {:name=>"WebServer", :type=>"Standard", :version=>"1.0"}
118
+ ]
119
+
120
+ def environment_tier(name)
121
+ TIERS.find {|t| t[:name].downcase == name.downcase} || raise("No tier found with name #{name.inspect}")
122
+ end
123
+
115
124
  def convert_env_name_to_id(app_name, env_names)
116
125
  envs = alive_envs(app_name, env_names)
117
126
  envs.map { |env| env[:environment_id] }
@@ -0,0 +1,40 @@
1
+ module EbDeployer
2
+ class Component
3
+ attr_reader :name
4
+
5
+ def initialize(name, env, creation_opts, eb_settings, eb_driver)
6
+ @name = name
7
+ @env = env
8
+ @eb_driver = eb_driver
9
+ @creation_opts = creation_opts
10
+ @eb_settings = eb_settings
11
+ end
12
+
13
+ def cname_prefix
14
+ @creation_opts[:cname_prefix] || default_cname_prefix
15
+ end
16
+
17
+ def deploy(version_label, strategy_name, eb_settings)
18
+ strategy = create_strategy(strategy_name)
19
+ strategy.deploy(version_label, eb_settings + @eb_settings)
20
+ end
21
+
22
+ def new_eb_env(suffix=nil, cname_prefix_overriding=nil)
23
+ EbEnvironment.new(@env.app_name,
24
+ [@env.name, @name, suffix].compact.join('-'),
25
+ @eb_driver,
26
+ @creation_opts.merge(:cname_prefix => cname_prefix_overriding || cname_prefix))
27
+ end
28
+
29
+ private
30
+
31
+ def default_cname_prefix
32
+ [@env.app_name, @env.name, @name].join('-')
33
+ end
34
+
35
+ def create_strategy(strategy_name)
36
+ DeploymentStrategy.create(self, strategy_name)
37
+ end
38
+
39
+ end
40
+ end
@@ -24,24 +24,21 @@ module EbDeployer
24
24
  config_file = options.delete(:config_file)
25
25
  config_settings = load_config_settings(config_file, package_digest)
26
26
 
27
- common_settings = symbolize_keys(config_settings.delete(:common))
28
- common_settings[:version_label] ||= package_digest
27
+ app_name = config_settings[:application]
29
28
 
30
- envs = config_settings.delete(:environments)
31
- ret = options.merge(config_settings).merge(common_settings)
32
- unless ret.delete(:all_envs)
33
- env = ret[:environment]
34
- raise "Environment #{env} is not defined in #{config_file}" unless envs.has_key?(env)
35
- env_settings = symbolize_keys(envs[env] || {})
36
- env_option_settings = env_settings.delete(:option_settings) || []
29
+ common_settings = symbolize_keys(config_settings[:common])
30
+ common_settings[:version_label] ||= package_digest
37
31
 
38
- ret.merge!(env_settings)
32
+ envs = config_settings[:environments]
33
+ env = options[:environment]
34
+ raise "Environment #{env} is not defined in #{config_file}" unless envs.has_key?(env)
35
+ env_settings = symbolize_keys(envs[env] || {})
36
+ env_option_settings = env_settings.delete(:option_settings) || []
39
37
 
40
- ret[:option_settings] ||= []
41
- ret[:option_settings] += env_option_settings
42
- else
43
- ret.delete(:environment)
44
- end
38
+ ret = options.merge(common_settings).merge(env_settings)
39
+ ret[:application] = app_name
40
+ ret[:option_settings] ||= []
41
+ ret[:option_settings] += env_option_settings
45
42
  ret
46
43
  end
47
44
 
@@ -0,0 +1,37 @@
1
+ module EbDeployer
2
+ class DefaultComponent
3
+ def initialize(env, creation_opts, eb_driver)
4
+ @env = env
5
+ @eb_driver = eb_driver
6
+ @creation_opts = creation_opts
7
+ end
8
+
9
+ def cname_prefix
10
+ @creation_opts[:cname_prefix] || default_cname_prefix
11
+ end
12
+
13
+
14
+ def deploy(version_label, strategy_name, eb_settings)
15
+ strategy = create_strategy(strategy_name)
16
+ strategy.deploy(version_label, eb_settings)
17
+ end
18
+
19
+ def new_eb_env(suffix=nil, cname_prefix_overriding=nil)
20
+ EbEnvironment.new(@env.app_name,
21
+ [@env.name, suffix].compact.join('-'),
22
+ @eb_driver,
23
+ @creation_opts.merge(:cname_prefix => cname_prefix_overriding || cname_prefix))
24
+ end
25
+
26
+ private
27
+
28
+ def default_cname_prefix
29
+ [@env.app_name, @env.name].join('-')
30
+ end
31
+
32
+ def create_strategy(strategy_name)
33
+ DeploymentStrategy.create(self, strategy_name)
34
+ end
35
+
36
+ end
37
+ end
@@ -38,7 +38,7 @@ module EbDeployer
38
38
 
39
39
  def terminate
40
40
  if @bs.environment_exists?(@app, @name)
41
- with_polling_events(@name, /terminateEnvironment completed successfully/i) do
41
+ with_polling_events(/terminateEnvironment completed successfully/i) do
42
42
  @bs.delete_environment(@app, @name)
43
43
  end
44
44
  end
@@ -48,11 +48,11 @@ module EbDeployer
48
48
 
49
49
  def create_or_update_env(version_label, settings)
50
50
  if @bs.environment_exists?(@app, @name)
51
- with_polling_events(@name, /Environment update completed successfully/i) do
51
+ with_polling_events(/Environment update completed successfully/i) do
52
52
  @bs.update_environment(@app, @name, version_label, @creation_opts[:tier], settings)
53
53
  end
54
54
  else
55
- with_polling_events(@name, /Successfully launched environment/i) do
55
+ with_polling_events(/Successfully launched environment/i) do
56
56
  @bs.create_environment(@app, @name, @creation_opts[:solution_stack], @creation_opts[:cname_prefix], version_label, @creation_opts[:tier], settings)
57
57
  end
58
58
  end
@@ -63,10 +63,10 @@ module EbDeployer
63
63
  SmokeTest.new(@creation_opts[:smoke_test]).run(host_name, self)
64
64
  end
65
65
 
66
- def with_polling_events(env_name, terminate_pattern, &block)
66
+ def with_polling_events(terminate_pattern, &block)
67
67
  event_start_time = Time.now
68
68
  yield
69
- event_poller.poll(env_name, event_start_time) do |event|
69
+ event_poller.poll(event_start_time) do |event|
70
70
  if event[:message] =~ /Failed to deploy application/
71
71
  raise event[:message]
72
72
  end
@@ -95,7 +95,7 @@ module EbDeployer
95
95
  end
96
96
 
97
97
  def event_poller
98
- @event_poller || EventPoller.new(@app, @bs)
98
+ @event_poller || EventPoller.new(@app, @name, @bs)
99
99
  end
100
100
 
101
101
 
@@ -1,45 +1,62 @@
1
1
  module EbDeployer
2
2
  class Environment
3
+ attr_writer :resource_stacks, :settings, :creation_opts, :components, :component_under_deploy
4
+ attr_reader :name
3
5
 
4
- def initialize(app, name, resource_stacks, settings, creation_opts, bs_driver)
6
+ def initialize(app, name, eb_driver, &block)
5
7
  @app = app
6
8
  @name = name
7
- @resource_stacks = resource_stacks
8
- @settings = settings
9
- @creation_opts = creation_opts
10
- @bs_driver = bs_driver
9
+ @eb_driver = eb_driver
10
+ @creation_opts = {}
11
+ @settings = []
12
+ yield(self) if block_given?
13
+ unless @components
14
+ @components = [DefaultComponent.new(self, @creation_opts, @eb_driver)]
15
+ end
11
16
  end
12
17
 
13
- def cname_prefix
14
- @creation_opts[:cname_prefix] || default_cname_prefix
18
+ def app_name
19
+ @app.name
15
20
  end
16
21
 
17
22
  def deploy(version_label, strategy_name)
18
- strategy = create_strategy(strategy_name)
19
- strategy.deploy(version_label,
20
- @settings + @resource_stacks.provision(resource_stack_name))
23
+ resource_settings = @resource_stacks.provision(resource_stack_name)
24
+ components_to_deploy.each do |component|
25
+ component.deploy(version_label, strategy_name, @settings + resource_settings)
26
+ end
21
27
  end
22
28
 
23
- def new_eb_env(suffix=nil, cname_prefix_overriding=nil)
24
- EbEnvironment.new(@app.name,
25
- [@name, suffix].compact.join('-'),
26
- @bs_driver,
27
- @creation_opts.merge(:cname_prefix => cname_prefix_overriding || cname_prefix))
29
+ def components=(components_attrs)
30
+ return unless components_attrs
31
+ @components = components_attrs.map do |attrs|
32
+ attrs = symbolize_keys(attrs)
33
+ name = attrs.delete(:name)
34
+ eb_settings = attrs.delete(:option_settings) || []
35
+ Component.new(name, self, @creation_opts.merge(attrs), eb_settings, @eb_driver)
36
+ end
28
37
  end
29
38
 
30
39
  private
31
-
32
- def default_cname_prefix
33
- [@app.name, @name].join('-')
40
+ def components_to_deploy
41
+ if @component_under_deploy
42
+ component = component_named(@component_under_deploy)
43
+ raise "'#{@component_under_deploy}' is not in the configuration. Available components are #{@components.map(&:name) }" unless component
44
+ [component]
45
+ else
46
+ @components
47
+ end
34
48
  end
35
49
 
50
+ def component_named(name)
51
+ @components.detect { |c| c.name == name }
52
+ end
36
53
 
37
- def create_strategy(strategy_name)
38
- DeploymentStrategy.create(self, strategy_name)
54
+ def symbolize_keys(hash)
55
+ hash.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
39
56
  end
40
57
 
41
58
  def resource_stack_name
42
- "#{@app.name}-#{@name}"
59
+ "#{app_name}-#{@name}"
43
60
  end
44
61
  end
45
62
  end
@@ -1,13 +1,13 @@
1
1
  module EbDeployer
2
2
  class EventPoller
3
- def initialize(app, beanstalk)
4
- @app, @beanstalk = app, beanstalk
3
+ def initialize(app, env, beanstalk)
4
+ @app, @env, @beanstalk = app, env, beanstalk
5
5
  end
6
6
 
7
- def poll(eb_env_name, start_time = Time.now, &block)
7
+ def poll(start_time = Time.now, &block)
8
8
  handled = Set.new
9
9
  loop do
10
- fetch_events(eb_env_name, start_time) do |events|
10
+ fetch_events(start_time) do |events|
11
11
  new_events = events.reject { |e| handled.include?(digest(e)) }
12
12
  handle(new_events, &block)
13
13
  handled += new_events.map { |e| digest(e) }
@@ -27,14 +27,14 @@ module EbDeployer
27
27
  events.reverse.each(&block)
28
28
  end
29
29
 
30
- def fetch_events(eb_env_name, start_time, &block)
31
- events, next_token = @beanstalk.fetch_events(@app, eb_env_name, :start_time => start_time.iso8601)
30
+ def fetch_events(start_time, &block)
31
+ events, next_token = @beanstalk.fetch_events(@app, @env, :start_time => start_time.iso8601)
32
32
  yield(events)
33
- fetch_next(eb_env_name, next_token, &block) if next_token
33
+ fetch_next(next_token, &block) if next_token
34
34
  end
35
35
 
36
- def fetch_next(eb_env_name, next_token, &block)
37
- events, next_token = @beanstalk.fetch_events(@app, eb_env_name, :next_token => next_token)
36
+ def fetch_next(next_token, &block)
37
+ events, next_token = @beanstalk.fetch_events(@app, @env, :next_token => next_token)
38
38
  yield(events)
39
39
  fetch_next(next_token, &block) if next_token
40
40
  end
@@ -1,3 +1,3 @@
1
1
  module EbDeployer
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.1"
3
3
  end
@@ -102,5 +102,20 @@ class BlueGreenDeployTest < DeployTest
102
102
  assert_equal 'simple-production', @eb.environment_cname_prefix('simple', inactive_env)
103
103
  end
104
104
 
105
+ def test_destroy_should_clean_up_env
106
+ 2.times do
107
+ deploy(:application => 'simple',
108
+ :environment => "production",
109
+ :strategy => 'blue-green',
110
+ :version_label => 44,
111
+ :phoenix_mode => true)
112
+ end
113
+
114
+ destroy(:application => 'simple', :environment => 'production')
115
+ assert !@eb.environment_exists?('simple', t('production-a', 'simple'))
116
+ assert !@eb.environment_exists?('simple', t('production-b', 'simple'))
117
+ end
118
+
119
+
105
120
 
106
121
  end
@@ -18,13 +18,6 @@ class InplaceUpdateDeployTest < DeployTest
18
18
 
19
19
  end
20
20
 
21
- def test_destroy_should_clean_up_eb_application_and_env
22
- deploy(:application => 'simple', :environment => "production")
23
- destroy(:application => 'simple')
24
- assert !@eb.application_exists?('simple')
25
- assert !@eb.environment_exists?('simple', t('production', 'simple'))
26
- end
27
-
28
21
  def test_first_deployment_create_environment
29
22
  assert !@eb.environment_exists?('simple', t('production', 'simple'))
30
23
  deploy(:application => 'simple', :environment => "production")
@@ -79,4 +72,11 @@ class InplaceUpdateDeployTest < DeployTest
79
72
  assert @eb.environments_been_deleted('simple').include?(t('production', 'simple'))
80
73
  assert @eb.environment_exists?('simple', t('production', 'simple'))
81
74
  end
75
+
76
+ def test_destroy_should_clean_up_env
77
+ deploy(:application => 'simple', :environment => "production")
78
+ destroy(:application => 'simple', :environment => 'production')
79
+ assert !@eb.environment_exists?('simple', t('production', 'simple'))
80
+ end
81
+
82
82
  end
@@ -0,0 +1,93 @@
1
+ require 'deploy_test'
2
+
3
+ class MultiComponentsDeployTest < DeployTest
4
+ def test_deploy_with_components
5
+ do_deploy
6
+ assert @eb.environment_exists?('simple', t('prod-web', 'simple'))
7
+ assert @eb.environment_exists?('simple', t('prod-bg', 'simple'))
8
+ assert @eb.environment_exists?('simple', t('prod-api', 'simple'))
9
+ assert !@eb.environment_exists?('simple', t('prod', 'simple'))
10
+ end
11
+
12
+ def test_deploy_with_components_with_blue_green
13
+ do_bg_deploy
14
+ assert @eb.environment_exists?('simple', t('prod-web-a', 'simple'))
15
+ assert @eb.environment_exists?('simple', t('prod-bg-a', 'simple'))
16
+ assert @eb.environment_exists?('simple', t('prod-api-a', 'simple'))
17
+ do_bg_deploy
18
+ assert @eb.environment_exists?('simple', t('prod-web-b', 'simple'))
19
+ assert @eb.environment_exists?('simple', t('prod-bg-b', 'simple'))
20
+ assert @eb.environment_exists?('simple', t('prod-api-b', 'simple'))
21
+ end
22
+
23
+ def test_cname_include_component_name
24
+ do_deploy
25
+ assert_equal 'simple-prod-web', @eb.environment_cname_prefix('simple', t('prod-web', 'simple'))
26
+ assert_equal 'simple-prod-api', @eb.environment_cname_prefix('simple', t('prod-api', 'simple'))
27
+ end
28
+
29
+ def test_cname_include_component_name_in_blue_green
30
+ do_bg_deploy
31
+ assert_equal 'simple-prod-web', @eb.environment_cname_prefix('simple', t('prod-web-a', 'simple'))
32
+
33
+ do_bg_deploy
34
+ assert_equal 'simple-prod-web', @eb.environment_cname_prefix('simple', t('prod-web-b', 'simple'))
35
+ assert_equal 'simple-prod-web-inactive', @eb.environment_cname_prefix('simple', t('prod-web-a', 'simple'))
36
+ end
37
+
38
+ def test_components_inheritate_creation_options_from_environment
39
+ do_deploy
40
+ assert_equal 'WebServer', @eb.environment_tier('simple', t('prod-web', 'simple'))
41
+ end
42
+
43
+ def test_components_can_override_creation_opts
44
+ do_deploy(:tier => 'WebServer',
45
+ :components => [{'name' => 'web'}, {'name' => 'bg', 'tier' => "Worker"}])
46
+ assert_equal 'WebServer', @eb.environment_tier('simple', t('prod-web', 'simple'))
47
+ assert_equal 'Worker', @eb.environment_tier('simple', t('prod-bg', 'simple'))
48
+ end
49
+
50
+ def test_components_specific_eb_settings_will_override_env_eb_settings
51
+ minsize_3 = {:namespace => 'aws:autoscaling:launchconfiguration',
52
+ :option_name => 'MinSize',
53
+ :value => '3' }
54
+ minsize_2 = {:namespace => 'aws:autoscaling:launchconfiguration',
55
+ :option_name => 'MinSize',
56
+ :value => '2' }
57
+
58
+ do_deploy(:option_settings => [minsize_3],
59
+ :components => [{'name' => 'web'},
60
+ {'name' => 'api',
61
+ 'option_settings' => [minsize_2]}])
62
+ assert_equal [minsize_3], @eb.environment_settings('simple', t('prod-web', 'simple'))
63
+ assert_equal [minsize_3, minsize_2], @eb.environment_settings('simple', t('prod-api', 'simple'))
64
+ end
65
+
66
+ def test_can_deploy_single_component
67
+ do_deploy(:component => "bg")
68
+ assert !@eb.environment_exists?('simple', t('prod-web', 'simple'))
69
+ assert !@eb.environment_exists?('simple', t('prod-api', 'simple'))
70
+ assert @eb.environment_exists?('simple', t('prod-bg', 'simple'))
71
+ end
72
+
73
+ def test_should_raise_exception_when_try_to_deploy_a_none_exists_component
74
+ assert_raises(RuntimeError) do
75
+ do_deploy(:component => "foo")
76
+ end
77
+ end
78
+
79
+ private
80
+ def do_deploy(options={})
81
+ deploy({:application => 'simple',
82
+ :environment => 'prod',
83
+ :components => [{ 'name' => 'web' },
84
+ { 'name' => 'bg' },
85
+ { 'name' => 'api' }]
86
+ }.merge(options))
87
+ end
88
+
89
+ def do_bg_deploy
90
+ do_deploy(:strategy => 'blue-green')
91
+ end
92
+
93
+ end
@@ -3,17 +3,11 @@ require 'deploy_test'
3
3
  class TierSettingDeployTest < DeployTest
4
4
  def test_sets_default_tier_as_webserver
5
5
  deploy(:application => 'simple', :environment => "production")
6
- assert_equal EbDeployer.environment_tier('WebServer'), @eb.environment_tier('simple', t('production', 'simple'))
6
+ assert_equal 'WebServer', @eb.environment_tier('simple', t('production', 'simple'))
7
7
  end
8
8
 
9
9
  def test_can_change_tier
10
10
  deploy(:application => 'simple', :environment => "production", :tier => 'Worker')
11
- assert_equal EbDeployer.environment_tier('Worker'), @eb.environment_tier('simple', t('production', 'simple'))
12
- end
13
-
14
- def test_should_raise_error_when_tier_setting_is_not_recognized
15
- assert_raises(RuntimeError) do
16
- deploy(:application => 'simple', :environment => "production", :tier => 'Gum')
17
- end
11
+ assert_equal 'Worker', @eb.environment_tier('simple', t('production', 'simple'))
18
12
  end
19
13
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eb_deployer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-03-27 00:00:00.000000000 Z
13
+ date: 2014-03-31 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: aws-sdk
@@ -55,7 +55,9 @@ files:
55
55
  - lib/eb_deployer/aws_driver/cloud_formation_driver.rb
56
56
  - lib/eb_deployer/aws_driver/s3_driver.rb
57
57
  - lib/eb_deployer/cloud_formation_provisioner.rb
58
+ - lib/eb_deployer/component.rb
58
59
  - lib/eb_deployer/config_loader.rb
60
+ - lib/eb_deployer/default_component.rb
59
61
  - lib/eb_deployer/default_config.rb
60
62
  - lib/eb_deployer/default_config.yml
61
63
  - lib/eb_deployer/deployment_strategy.rb
@@ -76,6 +78,7 @@ files:
76
78
  - test/deploy_test.rb
77
79
  - test/eb_environment_test.rb
78
80
  - test/inplace_update_deploy_test.rb
81
+ - test/multi_components_deploy_test.rb
79
82
  - test/resources_deploy_test.rb
80
83
  - test/smoke_test_test.rb
81
84
  - test/test_helper.rb
@@ -96,7 +99,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
96
99
  version: '0'
97
100
  segments:
98
101
  - 0
99
- hash: 177644489298089087
102
+ hash: -3040208226803688120
100
103
  required_rubygems_version: !ruby/object:Gem::Requirement
101
104
  none: false
102
105
  requirements:
@@ -105,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
108
  version: '0'
106
109
  segments:
107
110
  - 0
108
- hash: 177644489298089087
111
+ hash: -3040208226803688120
109
112
  requirements: []
110
113
  rubyforge_project:
111
114
  rubygems_version: 1.8.29
@@ -122,6 +125,7 @@ test_files:
122
125
  - test/deploy_test.rb
123
126
  - test/eb_environment_test.rb
124
127
  - test/inplace_update_deploy_test.rb
128
+ - test/multi_components_deploy_test.rb
125
129
  - test/resources_deploy_test.rb
126
130
  - test/smoke_test_test.rb
127
131
  - test/test_helper.rb