eb_deployer 0.4.0 → 0.4.1

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.
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