man_eb_deployer 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/release.yml +31 -0
  3. data/.github/workflows/test.yml +16 -0
  4. data/.gitignore +12 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/CHANGELOG.md +143 -0
  8. data/Gemfile +10 -0
  9. data/LICENSE +22 -0
  10. data/README.md +138 -0
  11. data/Rakefile +12 -0
  12. data/TODOS.md +11 -0
  13. data/bin/eb_deploy +13 -0
  14. data/eb_deployer.gemspec +22 -0
  15. data/lib/eb_deployer/application.rb +96 -0
  16. data/lib/eb_deployer/aws_driver/beanstalk.rb +158 -0
  17. data/lib/eb_deployer/aws_driver/cloud_formation_driver.rb +53 -0
  18. data/lib/eb_deployer/aws_driver/s3_driver.rb +35 -0
  19. data/lib/eb_deployer/aws_driver.rb +8 -0
  20. data/lib/eb_deployer/cf_event_source.rb +26 -0
  21. data/lib/eb_deployer/cloud_formation_provisioner.rb +120 -0
  22. data/lib/eb_deployer/component.rb +45 -0
  23. data/lib/eb_deployer/config_loader.rb +64 -0
  24. data/lib/eb_deployer/default_component.rb +32 -0
  25. data/lib/eb_deployer/default_config.rb +20 -0
  26. data/lib/eb_deployer/default_config.yml +159 -0
  27. data/lib/eb_deployer/deployment_strategy/blue_green.rb +79 -0
  28. data/lib/eb_deployer/deployment_strategy/blue_only.rb +45 -0
  29. data/lib/eb_deployer/deployment_strategy/inplace_update.rb +16 -0
  30. data/lib/eb_deployer/deployment_strategy.rb +20 -0
  31. data/lib/eb_deployer/eb_environment.rb +204 -0
  32. data/lib/eb_deployer/eb_event_source.rb +35 -0
  33. data/lib/eb_deployer/environment.rb +60 -0
  34. data/lib/eb_deployer/event_poller.rb +51 -0
  35. data/lib/eb_deployer/package.rb +39 -0
  36. data/lib/eb_deployer/resource_stacks.rb +20 -0
  37. data/lib/eb_deployer/smoke_test.rb +23 -0
  38. data/lib/eb_deployer/tasks.rb +45 -0
  39. data/lib/eb_deployer/throttling_handling.rb +17 -0
  40. data/lib/eb_deployer/utils.rb +33 -0
  41. data/lib/eb_deployer/version.rb +3 -0
  42. data/lib/eb_deployer/version_cleaner.rb +30 -0
  43. data/lib/eb_deployer.rb +339 -0
  44. data/lib/generators/eb_deployer/install/install_generator.rb +82 -0
  45. data/lib/generators/eb_deployer/install/templates/eb_deployer.rake +1 -0
  46. data/lib/generators/eb_deployer/install/templates/eb_deployer.yml.erb +181 -0
  47. data/lib/generators/eb_deployer/install/templates/ebextensions/01_postgres_packages.config +5 -0
  48. data/lib/generators/eb_deployer/install/templates/postgres_rds.json +88 -0
  49. data/test/aws_driver_stubs.rb +350 -0
  50. data/test/beanstalk_test.rb +23 -0
  51. data/test/blue_green_deploy_test.rb +114 -0
  52. data/test/blue_only_deploy_test.rb +78 -0
  53. data/test/cf_event_poller_test.rb +32 -0
  54. data/test/cloud_formation_provisioner_test.rb +47 -0
  55. data/test/config_loader_test.rb +205 -0
  56. data/test/deploy_test.rb +42 -0
  57. data/test/eb_environment_test.rb +120 -0
  58. data/test/eb_event_poller_test.rb +32 -0
  59. data/test/inplace_update_deploy_test.rb +110 -0
  60. data/test/multi_components_deploy_test.rb +164 -0
  61. data/test/rails_generators_test.rb +67 -0
  62. data/test/resources_deploy_test.rb +191 -0
  63. data/test/smoke_test_test.rb +23 -0
  64. data/test/template_deploy_test.rb +13 -0
  65. data/test/test_helper.rb +68 -0
  66. data/test/tier_setting_deploy_test.rb +24 -0
  67. data/test/versions_deploy_test.rb +120 -0
  68. metadata +176 -0
@@ -0,0 +1,110 @@
1
+ require 'deploy_test'
2
+
3
+ class InplaceUpdateDeployTest < DeployTest
4
+ def test_first_deployment_create_eb_application
5
+ assert !@eb.application_exists?('simple')
6
+ deploy(:application => 'simple', :environment => "production")
7
+ assert @eb.application_exists?('simple')
8
+ end
9
+
10
+ def test_set_option_settings_on_deployment
11
+ redudant = [{:namespace => 'aws:autoscaling:launchconfiguration',
12
+ :option_name => 'MinSize',
13
+ :value => '2' }]
14
+ deploy(:application => 'simple', :environment => "production",
15
+ :option_settings => [redudant])
16
+
17
+ assert_equal [redudant], @eb.environment_settings('simple', t('production', 'simple'))
18
+
19
+ end
20
+
21
+ def test_first_deployment_create_environment
22
+ assert !@eb.environment_exists?('simple', t('production', 'simple'))
23
+ deploy(:application => 'simple', :environment => "production")
24
+ assert @eb.environment_exists?('simple', t('production', 'simple'))
25
+ end
26
+
27
+ def test_support_very_very_long_app_name
28
+ deploy(:application => 'ver-very-simple-application', :environment => "production")
29
+ assert @eb.environment_exists?('ver-very-simple-application', t('production', 'ver-very-simple-application'))
30
+ end
31
+
32
+ def test_should_raise_error_when_env_name_is_too_long
33
+ assert_raises(RuntimeError) { deploy(:application => 'simple', :environment => "p" * 24) }
34
+ end
35
+
36
+ def test_update_environment_with_new_version_should_change_version_that_deployed
37
+ deploy(:application => 'simple',
38
+ :environment => "production",
39
+ :version_label => 1)
40
+ assert_equal '1', @eb.environment_verion_label('simple', t('production', 'simple'))
41
+
42
+ deploy(:application => 'simple',
43
+ :environment => "production",
44
+ :version_label => 2)
45
+
46
+ assert_equal '2', @eb.environment_verion_label('simple', t('production', 'simple'))
47
+ end
48
+
49
+ def test_smoke_test_should_be_run_after_env_created_or_update
50
+ host_for_smoke_test = nil
51
+ deploy(:application => 'simple',
52
+ :environment => "production",
53
+ :cname_prefix => 'foobar',
54
+ :smoke_test => lambda { |host| host_for_smoke_test = host },
55
+ :version_label => 42)
56
+ assert_equal 'foobar.us-west-1.elasticbeanstalk.com', host_for_smoke_test
57
+
58
+ host_for_smoke_test = nil
59
+ deploy(:application => 'simple',
60
+ :environment => "production",
61
+ :cname_prefix => 'foobar',
62
+ :smoke_test => lambda { |host| host_for_smoke_test = host },
63
+ :version_label => 43)
64
+
65
+ assert_equal 'foobar.us-west-1.elasticbeanstalk.com', host_for_smoke_test
66
+ end
67
+
68
+ def test_should_terminate_old_environment_if_phoenix_mode_is_enabled
69
+ deploy(:application => 'simple', :environment => "production", :phoenix_mode => true)
70
+ assert @eb.environment_exists?('simple', t('production', 'simple'))
71
+ deploy(:application => 'simple', :environment => "production", :phoenix_mode => true)
72
+ assert @eb.environments_been_deleted('simple').include?(t('production', 'simple'))
73
+ assert @eb.environment_exists?('simple', t('production', 'simple'))
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
+ def test_deploy_should_raise_error_when_constantly_hitting_throttling_error
83
+ throttling_error = Aws::ElasticBeanstalk::Errors::Throttling.new(nil, "bang!")
84
+ @eb.set_error(:fetch_events, throttling_error)
85
+ assert_raises(Aws::ElasticBeanstalk::Errors::Throttling) do
86
+ deploy(:application => 'simple', :environment => "production")
87
+ end
88
+ end
89
+
90
+ def test_deploy_should_retry_on_temporary_throttling_error_from_fetch_events
91
+ throttling_error = Aws::ElasticBeanstalk::Errors::Throttling.new(nil, "bang!")
92
+ error_seq = [throttling_error] * 5
93
+ @eb.set_error_generator(:fetch_events) do
94
+ error_seq.pop
95
+ end
96
+ deploy(:application => 'simple', :environment => "production")
97
+ assert @eb.environment_exists?('simple', t('production', 'simple'))
98
+ end
99
+
100
+ def test_deploy_should_retry_on_temporary_throttling_error_from_create_env
101
+ throttling_error = Aws::ElasticBeanstalk::Errors::Throttling.new(nil, "bang!")
102
+ error_seq = [throttling_error] * 5
103
+ @eb.set_error_generator(:create_environment) do
104
+ error_seq.pop
105
+ end
106
+ deploy(:application => 'simple', :environment => "production")
107
+ assert @eb.environment_exists?('simple', t('production', 'simple'))
108
+ end
109
+
110
+ end
@@ -0,0 +1,164 @@
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_override_deployment_strategy
67
+ do_deploy(:components => [{'name' => 'web',
68
+ 'strategy' => 'blue-green' },
69
+ {'name' => 'bg',
70
+ 'strategy' => 'inplace-update'}])
71
+
72
+ assert @eb.environment_exists?('simple', t('prod-web-a', 'simple'))
73
+ assert @eb.environment_exists?('simple', t('prod-bg', 'simple'))
74
+ end
75
+
76
+ def test_can_deploy_single_component
77
+ do_deploy(:component => "bg")
78
+ assert !@eb.environment_exists?('simple', t('prod-web', 'simple'))
79
+ assert !@eb.environment_exists?('simple', t('prod-api', 'simple'))
80
+ assert @eb.environment_exists?('simple', t('prod-bg', 'simple'))
81
+ end
82
+
83
+ def test_should_raise_exception_when_try_to_deploy_a_none_exists_component
84
+ assert_raises(RuntimeError) do
85
+ do_deploy(:component => "foo")
86
+ end
87
+ end
88
+
89
+
90
+ def test_can_have_inactive_settings_which_will_be_applied_to_inactive_env
91
+ settings = {:inactive_settings =>
92
+ [{:namespace => 'aws:autoscaling:launchconfiguration',
93
+ :option_name => 'MinSize',
94
+ :value => 1}],
95
+ :components =>
96
+ [{:name => 'web',
97
+ :option_settings =>
98
+ [{:namespace => 'aws:autoscaling:launchconfiguration',
99
+ :option_name => 'MinSize',
100
+ :value => 10}]}]}
101
+
102
+ do_bg_deploy(settings)
103
+ assert_equal 10, @eb.environment_settings('simple', t('prod-web-a', 'simple')).last[:value]
104
+
105
+ do_bg_deploy(settings)
106
+ assert_equal 1, @eb.environment_settings('simple', t('prod-web-a', 'simple')).last[:value]
107
+ assert_equal 10, @eb.environment_settings('simple', t('prod-web-b', 'simple')).last[:value]
108
+
109
+ do_bg_deploy(settings)
110
+ assert_equal 10, @eb.environment_settings('simple', t('prod-web-a', 'simple')).last[:value]
111
+ assert_equal 1, @eb.environment_settings('simple', t('prod-web-b', 'simple')).last[:value]
112
+ end
113
+
114
+ def test_can_provide_inactive_settings_at_component_level
115
+ settings = {:option_settings =>
116
+ [{:namespace => 'aws:autoscaling:launchconfiguration',
117
+ :option_name => 'MinSize',
118
+ :value => 10}],
119
+ :components =>
120
+ [{:name => 'web',
121
+ :inactive_settings =>
122
+ [{:namespace => 'aws:autoscaling:launchconfiguration',
123
+ :option_name => 'MinSize',
124
+ :value => 2}]},
125
+ {:name => 'api',
126
+ :inactive_settings =>
127
+ [{:namespace => 'aws:autoscaling:launchconfiguration',
128
+ :option_name => 'MinSize',
129
+ :value => 1}]}]}
130
+
131
+ do_bg_deploy(settings)
132
+ assert_equal 10, @eb.environment_settings('simple', t('prod-web-a', 'simple')).last[:value]
133
+ assert_equal 10, @eb.environment_settings('simple', t('prod-api-a', 'simple')).last[:value]
134
+
135
+ do_bg_deploy(settings)
136
+ assert_equal 2, @eb.environment_settings('simple', t('prod-web-a', 'simple')).last[:value]
137
+ assert_equal 1, @eb.environment_settings('simple', t('prod-api-a', 'simple')).last[:value]
138
+ end
139
+
140
+ def test_should_raise_error_when_deploy_work_tier_component_with_blue_green
141
+ assert_raises(RuntimeError) do
142
+ deploy(:application => 'simple',
143
+ :environment => 'prod',
144
+ :strategy => 'blue-green',
145
+ :components => [{ 'name' => 'web' },
146
+ { 'name' => 'bg', 'tier' => 'worker' }])
147
+ end
148
+ end
149
+
150
+ private
151
+ def do_deploy(options={})
152
+ deploy({:application => 'simple',
153
+ :environment => 'prod',
154
+ :components => [{ 'name' => 'web' },
155
+ { 'name' => 'bg' },
156
+ { 'name' => 'api' }]
157
+ }.merge(options))
158
+ end
159
+
160
+ def do_bg_deploy(options={})
161
+ do_deploy(options.merge(:strategy => 'blue-green'))
162
+ end
163
+
164
+ end
@@ -0,0 +1,67 @@
1
+ require 'test_helper'
2
+ require 'rails'
3
+ require 'shellwords'
4
+ require 'generators/eb_deployer/install/install_generator'
5
+
6
+ class RailsGenratorsTest < Rails::Generators::TestCase
7
+ tests EbDeployer::Generators::InstallGenerator
8
+ destination File.expand_path('../../tmp', __FILE__)
9
+ setup :prepare_destination
10
+
11
+ setup do
12
+ mkdir_p path('config')
13
+ touch path('config/database.yml')
14
+ touch path('Gemfile')
15
+ end
16
+
17
+ test "install" do
18
+ run_generator
19
+
20
+ assert_file 'config/eb_deployer.yml'
21
+ assert_file 'lib/tasks/eb_deployer.rake'
22
+
23
+ assert_file 'config/rds.json'
24
+ assert_file '.ebextensions/01_postgres_packages.config'
25
+ assert_file 'config/database.yml', /database: <%= ENV\['DATABASE_NAME'\]/m, /host: <%= ENV\['DATABASE_HOST'\]/m
26
+ assert_file 'Gemfile', /gem "pg"/
27
+ end
28
+
29
+ test "should comment production configuration in database.yml" do
30
+ File.open(path('config/database.yml'), 'w') do |f|
31
+ f.write(<<-YAML)
32
+ development:
33
+ host: localhost
34
+
35
+ production:
36
+ host: localhost
37
+
38
+ test:
39
+ host: localhost
40
+ YAML
41
+ end
42
+ run_generator
43
+ assert_file 'config/database.yml', <<-YAML
44
+ development:
45
+ host: localhost
46
+
47
+ # production:
48
+ # host: localhost
49
+
50
+ test:
51
+ host: localhost
52
+
53
+ production:
54
+ adapter: postgresql
55
+ database: <%= ENV['DATABASE_NAME'] || 'tmp_production' %>
56
+ host: <%= ENV['DATABASE_HOST'] || 'localhost' %>
57
+ port: <%= ENV['DATABASE_PORT'] || 5432 %>
58
+ username: <%= ENV['DATABASE_USERNAME'] || #{ENV['USER'].inspect} %>
59
+ password: <%= ENV['DATABASE_PASSWORD'] %>
60
+ min_messages: ERROR
61
+ YAML
62
+ end
63
+
64
+ def path(*f)
65
+ File.join(destination_root, *f)
66
+ end
67
+ end
@@ -0,0 +1,191 @@
1
+ require 'deploy_test'
2
+
3
+ class ResourcesDeployTest < DeployTest
4
+
5
+ def test_deploy_with_resources_declared_will_create_a_cf_stack_for_env
6
+ cf_template = temp_file(JSON.dump({'Resources' => {'R1' => {}}}))
7
+ deploy(:application => 'simple', :environment => "production",
8
+ :resources => {
9
+ :template => cf_template
10
+ })
11
+ assert @cf_driver.stack_exists?('simple-production')
12
+ assert_equal({}, @cf_driver.stack_config('simple-production')[:parameters])
13
+ assert_equal([], @cf_driver.stack_config('simple-production')[:capabilities])
14
+ assert_nil(@cf_driver.stack_config('simple-production')[:stack_policy_body])
15
+ end
16
+
17
+ def test_deploy_with_resources_declared_will_create_a_cf_stack_for_env_with_policy
18
+ cf_template = temp_file(JSON.dump({'Resources' => {'R1' => {}}}))
19
+ cf_policy = sample_file("sample_policy.json", JSON.dump({'Policy' => {'P1' => {}}}))
20
+ deploy(:application => 'simple', :environment => "production",
21
+ :resources => {
22
+ :template => cf_template,
23
+ :policy => cf_policy
24
+ })
25
+ assert @cf_driver.stack_exists?('simple-production')
26
+ assert_equal({}, @cf_driver.stack_config('simple-production')[:parameters])
27
+ assert_equal([], @cf_driver.stack_config('simple-production')[:capabilities])
28
+ assert_equal("{\"Policy\":{\"P1\":{}}}", @cf_driver.stack_config('simple-production')[:stack_policy_body])
29
+ end
30
+
31
+ def test_deploy_with_resources_declared_will_update_a_cf_stack_for_env_with_policy
32
+ cf_template = temp_file(JSON.dump({'Resources' => {'R1' => {}}}))
33
+ cf_policy = sample_file("sample_policy.json", JSON.dump({'Policy' => {'P1' => {}}}))
34
+ deploy(:application => 'simple', :environment => "production",
35
+ :resources => {
36
+ :template => cf_template,
37
+ :policy => cf_policy
38
+ })
39
+ assert @cf_driver.stack_exists?('simple-production')
40
+ deploy(:application => 'simple', :environment => "production",
41
+ :resources => {
42
+ :template => cf_template,
43
+ :policy => cf_policy,
44
+ :override_policy => false
45
+ })
46
+ assert_equal({}, @cf_driver.stack_config('simple-production')[:parameters])
47
+ assert_equal([], @cf_driver.stack_config('simple-production')[:capabilities])
48
+ assert_equal("{\"Policy\":{\"P1\":{}}}", @cf_driver.stack_config('simple-production')[:stack_policy_body])
49
+ end
50
+
51
+ def test_deploy_with_resources_declared_will_update_a_cf_stack_for_env_with_temp_policy
52
+ cf_template = temp_file(JSON.dump({'Resources' => {'R1' => {}}}))
53
+ cf_policy = sample_file("sample_policy.json", JSON.dump({'Policy' => {'P1' => {}}}))
54
+ deploy(:application => 'simple', :environment => "production",
55
+ :resources => {
56
+ :template => cf_template,
57
+ :policy => cf_policy
58
+ })
59
+ assert @cf_driver.stack_exists?('simple-production')
60
+ deploy(:application => 'simple', :environment => "production",
61
+ :resources => {
62
+ :template => cf_template,
63
+ :policy => cf_policy,
64
+ :override_policy => true
65
+ })
66
+ assert_equal({}, @cf_driver.stack_config('simple-production')[:parameters])
67
+ assert_equal([], @cf_driver.stack_config('simple-production')[:capabilities])
68
+ assert_equal("{\"Policy\":{\"P1\":{}}}", @cf_driver.stack_config('simple-production')[:stack_policy_during_update_body])
69
+ end
70
+
71
+ def test_provision_resources_with_capacities
72
+ cf_template = temp_file(JSON.dump({'Resources' => {'R1' => {}}}))
73
+ deploy(:application => 'simple', :environment => "production",
74
+ :resources => {
75
+ :template => cf_template,
76
+ :capabilities => ['CAPABILITY_IAM']
77
+ })
78
+ assert_equal ['CAPABILITY_IAM'], @cf_driver.stack_config('simple-production')[:capabilities]
79
+ end
80
+
81
+ def test_provision_resources_with_parameters
82
+ cf_template = temp_file(JSON.dump({'Resources' => {'R1' => {}}}))
83
+ deploy(:application => 'simple', :environment => "production",
84
+ :resources => {
85
+ :template => cf_template,
86
+ :parameters => {'a' => 1}
87
+ })
88
+ assert_equal({'a' => 1 }, @cf_driver.stack_config('simple-production')[:parameters])
89
+ end
90
+
91
+ def test_skip_resource_update
92
+ cf_template = temp_file(JSON.dump({'Resources' => {'R1' => {}}}))
93
+ deploy(:application => 'simple', :environment => "production",
94
+ :resources => {
95
+ :template => cf_template,
96
+ :parameters => {'a' => 1 }
97
+ })
98
+ assert_equal(1, @cf_driver.stack_config('simple-production')[:parameters]['a'])
99
+ deploy(:application => 'simple', :environment => "production",
100
+ :resources => {
101
+ :template => cf_template,
102
+ :parameters => {'a' => 2 }
103
+ })
104
+ assert_equal(2, @cf_driver.stack_config('simple-production')[:parameters]['a'])
105
+ deploy(:application => 'simple',
106
+ :environment => "production",
107
+ :skip_resource_stack_update => true,
108
+ :resources => {
109
+ :template => cf_template,
110
+ :parameters => {'a' => 3 }
111
+ })
112
+ assert_equal(2, @cf_driver.stack_config('simple-production')[:parameters]['a'])
113
+ end
114
+
115
+ def test_should_still_query_output_to_set_eb_options_even_skip_resources_update_is_specified
116
+ cf_template = temp_file(JSON.dump({'Resources' => {'R1' => {}},
117
+ 'Outputs' => {'O1' => {}, 'O2' => {}}}))
118
+ deploy(:application => 'simple', :environment => "production",
119
+ :resources => {
120
+ :template => cf_template
121
+ })
122
+
123
+ deploy(:application => 'simple', :environment => "production",
124
+ :skip_resource_stack_update => true,
125
+ :resources => {
126
+ :template => cf_template,
127
+ :transforms => {
128
+ 'O2' => lambda { |v| {:namespace => 'aws.foo', :option_name => 'o2', :value => "transformed " + v} }
129
+ }
130
+ })
131
+
132
+ assert @eb.environment_settings('simple', t('production', 'simple')).
133
+ include?({:namespace => 'aws.foo', :option_name => 'o2', :value => 'transformed value of O2'})
134
+ end
135
+
136
+
137
+ def test_transforms_resource_provsion_output_to_elastic_beanstalk_settings
138
+ cf_template = temp_file(JSON.dump({
139
+ 'Resources' => {'R1' => {}},
140
+ 'Outputs' => {'O1' => {}, 'O2' => {}}
141
+ }))
142
+ deploy(:application => 'simple', :environment => "production",
143
+ :resources => {
144
+ :template => cf_template,
145
+ :transforms => {
146
+ 'O1' => lambda { |v| {:namespace => 'aws.foo', :option_name => 'o1', :value => v} }
147
+ }
148
+ })
149
+ assert @eb.environment_settings('simple', t('production', 'simple')).
150
+ include?({:namespace => 'aws.foo', :option_name => 'o1', :value => 'value of O1'})
151
+ end
152
+
153
+ def test_can_query_resource_stack_output_after_deploy
154
+ cf_template = temp_file(JSON.dump({
155
+ 'Resources' => {'R1' => {}},
156
+ 'Outputs' => {'O1' => {}, 'O2' => {}}
157
+ }))
158
+ deploy(:application => 'simple',
159
+ :environment => "production",
160
+ :resources => { :template => cf_template })
161
+ assert_equal 'value of O1', query_resource_output('O1',
162
+ :application => 'simple',
163
+ :environment => "production")
164
+ assert_equal 'value of O2', query_resource_output('O2',
165
+ :application => 'simple',
166
+ :environment => "production")
167
+
168
+ end
169
+
170
+ def test_should_raise_error_if_query_resources_that_have_not_been_provisioned_yet
171
+ assert_raises(EbDeployer::ResourceNotInReadyState) do
172
+ query_resource_output('O1',
173
+ :application => 'simple',
174
+ :environment => "production")
175
+ end
176
+ end
177
+
178
+ def test_custom_stack_name
179
+ cf_template = temp_file(JSON.dump({
180
+ 'Resources' => {'R1' => {}},
181
+ 'Outputs' => {'O1' => {}, 'O2' => {}}
182
+ }))
183
+ deploy(:application => 'simple',
184
+ :environment => "production",
185
+ :resources => { :template => cf_template },
186
+ :stack_name => 'my-lovely-stack')
187
+
188
+ assert !@cf_driver.stack_exists?('simple-production')
189
+ assert @cf_driver.stack_exists?('my-lovely-stack')
190
+ end
191
+ end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ class SmokeTestTest < Test::Unit::TestCase
4
+ def test_call_proc_type_smoke_tests
5
+ host_name_in_proc = nil
6
+ EbDeployer::SmokeTest.new(lambda {|v| host_name_in_proc = v }).run("foo")
7
+
8
+ assert_equal 'foo', host_name_in_proc
9
+ end
10
+
11
+ def test_eval_string_type_smoke_test
12
+ $host_name_in_proc = nil
13
+ EbDeployer::SmokeTest.new("$host_name_in_proc=host_name").run("foo")
14
+ assert_equal 'foo', $host_name_in_proc
15
+ end
16
+
17
+ def test_should_raise_if_test_body_raise
18
+ assert_raises(RuntimeError) do
19
+ EbDeployer::SmokeTest.new("raise host_name").run("foo")
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,13 @@
1
+ require 'deploy_test'
2
+
3
+ class TemplateDeployTest < DeployTest
4
+ def test_default_no_template
5
+ deploy(:application => 'simple', :environment => "production")
6
+ assert_equal nil, @eb.template_name('simple', t('production', 'simple'))
7
+ end
8
+
9
+ def test_can_set_a_template
10
+ deploy(:application => 'simple', :environment => "production", :template_name => 'SomeTemplate')
11
+ assert_equal 'SomeTemplate', @eb.template_name('simple', t('production', 'simple'))
12
+ end
13
+ end
@@ -0,0 +1,68 @@
1
+ $:.unshift(File.expand_path("../../lib", __FILE__))
2
+
3
+ require 'tempfile'
4
+ require 'eb_deployer'
5
+ require 'aws_driver_stubs'
6
+ require 'test/unit'
7
+
8
+ def silence_warnings(&block)
9
+ old_verbose, $VERBOSE = $VERBOSE, nil
10
+ yield
11
+ ensure
12
+ $VERBOSE = old_verbose
13
+ end
14
+
15
+ silence_warnings { EbDeployer::Utils::BACKOFF_INITIAL_SLEEP = 0 }
16
+ silence_warnings { EbDeployer::EventPoller::POLL_INTERVAL = 0 }
17
+
18
+ class ErrorRaisingWrapper < SimpleDelegator
19
+ def initialize(stub)
20
+ @errors = {}
21
+ super(stub)
22
+ end
23
+
24
+ def set_error(method, error)
25
+ set_error_generator(method) do
26
+ error
27
+ end
28
+ end
29
+
30
+ def set_error_generator(method, &error_gen)
31
+ define_delegate_method(method)
32
+ @errors[method] = Proc.new(&error_gen)
33
+ end
34
+
35
+ private
36
+ def define_delegate_method(method)
37
+ method = method.to_s
38
+ original_method_name = "__#{method}_without_error"
39
+ raise "method #{method} not defined" unless self.respond_to?(method)
40
+ return if self.respond_to?(original_method_name)
41
+
42
+ self.instance_eval <<-CODE
43
+ def #{original_method_name}(*args, &block)
44
+ self.__get_obj__.send(:#{method}, *args, &block)
45
+ end
46
+
47
+ def #{method}(*args, &block)
48
+ if error_gen = @errors[:#{method}]
49
+ error = error_gen.call
50
+ raise error if error
51
+ end
52
+ super
53
+ end
54
+ CODE
55
+ end
56
+ end
57
+
58
+ class Test::Unit::TestCase
59
+ def sample_file(file_name, content='s' * 100)
60
+ path = File.join('/tmp', file_name)
61
+ File.open(path, 'w') { |f| f << content }
62
+ path
63
+ end
64
+
65
+ def t(env, app_name)
66
+ EbDeployer::EbEnvironment.unique_ebenv_name(env, app_name)
67
+ end
68
+ end
@@ -0,0 +1,24 @@
1
+ require 'deploy_test'
2
+
3
+ class TierSettingDeployTest < DeployTest
4
+ def test_sets_default_tier_as_webserver
5
+ deploy(:application => 'simple', :environment => "production")
6
+ assert_equal 'WebServer', @eb.environment_tier('simple', t('production', 'simple'))
7
+ end
8
+
9
+ def test_can_change_tier
10
+ deploy(:application => 'simple', :environment => "production", :tier => 'Worker')
11
+ assert_equal 'Worker', @eb.environment_tier('simple', t('production', 'simple'))
12
+ end
13
+
14
+ def test_should_worker_tier_should_not_have_cname_prefix
15
+ deploy(:application => 'simple', :environment => "production", :tier => 'Worker')
16
+ assert_nil @eb.environment_cname_prefix('simple', t('production', 'simple'))
17
+ end
18
+
19
+ def test_should_raise_error_when_deploy_worker_tier_with_blue_green
20
+ assert_raises(RuntimeError) do
21
+ deploy(:application => 'simple', :environment => "production", :tier => 'Worker', :strategy => 'blue-green')
22
+ end
23
+ end
24
+ end