moonshot 2.0.0.beta6 → 3.0.4

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 (80) hide show
  1. checksums.yaml +5 -5
  2. data/bin/moonshot +4 -1
  3. data/lib/default/bin/build.sh +0 -0
  4. data/lib/moonshot/account_context.rb +2 -0
  5. data/lib/moonshot/always_use_default_source.rb +5 -4
  6. data/lib/moonshot/artifact_repository/s3_bucket.rb +11 -5
  7. data/lib/moonshot/artifact_repository/s3_bucket_via_github_releases.rb +7 -7
  8. data/lib/moonshot/ask_user_source.rb +2 -0
  9. data/lib/moonshot/build_mechanism/github_release.rb +9 -2
  10. data/lib/moonshot/build_mechanism/script.rb +8 -7
  11. data/lib/moonshot/build_mechanism/travis_deploy.rb +5 -5
  12. data/lib/moonshot/build_mechanism/version_proxy.rb +13 -0
  13. data/lib/moonshot/change_set.rb +24 -34
  14. data/lib/moonshot/command.rb +3 -1
  15. data/lib/moonshot/command_line.rb +12 -9
  16. data/lib/moonshot/command_line_dispatcher.rb +5 -7
  17. data/lib/moonshot/commands/build.rb +6 -0
  18. data/lib/moonshot/commands/console.rb +2 -0
  19. data/lib/moonshot/commands/create.rb +16 -2
  20. data/lib/moonshot/commands/delete.rb +9 -0
  21. data/lib/moonshot/commands/deploy.rb +4 -8
  22. data/lib/moonshot/commands/doctor.rb +2 -0
  23. data/lib/moonshot/commands/generate_template.rb +46 -0
  24. data/lib/moonshot/commands/interactive_command.rb +15 -0
  25. data/lib/moonshot/commands/list.rb +2 -0
  26. data/lib/moonshot/commands/new.rb +5 -2
  27. data/lib/moonshot/commands/parameter_arguments.rb +5 -4
  28. data/lib/moonshot/commands/parent_stack_option.rb +2 -0
  29. data/lib/moonshot/commands/push.rb +2 -0
  30. data/lib/moonshot/commands/show_all_events_option.rb +2 -0
  31. data/lib/moonshot/commands/ssh.rb +4 -0
  32. data/lib/moonshot/commands/status.rb +2 -0
  33. data/lib/moonshot/commands/tag_arguments.rb +20 -0
  34. data/lib/moonshot/commands/update.rb +8 -1
  35. data/lib/moonshot/commands/version.rb +2 -0
  36. data/lib/moonshot/controller.rb +28 -13
  37. data/lib/moonshot/controller_config.rb +13 -27
  38. data/lib/moonshot/creds_helper.rb +2 -0
  39. data/lib/moonshot/deployment_mechanism/code_deploy.rb +44 -37
  40. data/lib/moonshot/doctor_helper.rb +14 -15
  41. data/lib/moonshot/dynamic_template.rb +76 -0
  42. data/lib/moonshot/interactive_logger_proxy.rb +4 -4
  43. data/lib/moonshot/json_stack_template.rb +3 -0
  44. data/lib/moonshot/parameter_collection.rb +3 -0
  45. data/lib/moonshot/parent_stack_parameter_loader.rb +7 -3
  46. data/lib/moonshot/resources.rb +2 -0
  47. data/lib/moonshot/resources_helper.rb +5 -1
  48. data/lib/moonshot/shell.rb +8 -8
  49. data/lib/moonshot/ssh_command.rb +2 -0
  50. data/lib/moonshot/ssh_command_builder.rb +3 -1
  51. data/lib/moonshot/ssh_config.rb +3 -2
  52. data/lib/moonshot/ssh_fork_executor.rb +2 -0
  53. data/lib/moonshot/ssh_target_selector.rb +3 -1
  54. data/lib/moonshot/stack.rb +73 -55
  55. data/lib/moonshot/stack_asg_printer.rb +14 -12
  56. data/lib/moonshot/stack_config.rb +3 -2
  57. data/lib/moonshot/stack_events_poller.rb +3 -1
  58. data/lib/moonshot/stack_list_printer.rb +2 -0
  59. data/lib/moonshot/stack_lister.rb +6 -2
  60. data/lib/moonshot/stack_output_printer.rb +2 -0
  61. data/lib/moonshot/stack_parameter.rb +5 -9
  62. data/lib/moonshot/stack_parameter_printer.rb +3 -1
  63. data/lib/moonshot/stack_template.rb +2 -0
  64. data/lib/moonshot/task.rb +3 -0
  65. data/lib/moonshot/tools/asg_rollout/asg.rb +22 -21
  66. data/lib/moonshot/tools/asg_rollout/asg_instance.rb +2 -0
  67. data/lib/moonshot/tools/asg_rollout/hook_exec_environment.rb +2 -0
  68. data/lib/moonshot/tools/asg_rollout/instance_health.rb +2 -0
  69. data/lib/moonshot/tools/asg_rollout.rb +16 -14
  70. data/lib/moonshot/tools/asg_rollout_config.rb +2 -0
  71. data/lib/moonshot/unicode_table.rb +5 -3
  72. data/lib/moonshot/yaml_stack_template.rb +2 -0
  73. data/lib/moonshot.rb +13 -1
  74. data/lib/plugins/backup.rb +24 -30
  75. data/lib/plugins/code_deploy_setup.rb +4 -2
  76. data/lib/plugins/dynamic_template.rb +36 -0
  77. data/lib/plugins/encrypted_parameters/kms_key.rb +26 -5
  78. data/lib/plugins/encrypted_parameters/parameter_encrypter.rb +2 -0
  79. data/lib/plugins/encrypted_parameters.rb +6 -2
  80. metadata +189 -51
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Moonshot
4
+ module Commands
5
+ class GenerateTemplate < Moonshot::Command
6
+ self.usage = 'generate-template [options]'
7
+ self.description = 'Processes an ERB formatted CloudFormation template.'
8
+
9
+ def initialize(*)
10
+ super
11
+ @parameters = {}
12
+ end
13
+
14
+ def parser
15
+ parser = super
16
+
17
+ parser.on('--source SOURCE_FILE', 'The ERB template file.') do |v|
18
+ @source = v
19
+ end
20
+
21
+ parser.on('--parameter KEY=VALUE', '-PKEY=VALUE',
22
+ 'Specify Stack Parameter on the command line') do |v|
23
+ data = v.split('=', 2)
24
+ unless data.size == 2
25
+ raise "Invalid parameter format '#{v}',"\
26
+ 'expected KEY=VALUE (e.g. MyTemplateParameter=12)'
27
+ end
28
+
29
+ @parameters[data[0]] = data[1]
30
+ end
31
+
32
+ parser.on('--destination DESTINATION_FILE', 'Destionation file.') do |v|
33
+ @destination = v
34
+ end
35
+ end
36
+
37
+ def execute
38
+ ::Moonshot::DynamicTemplate.new(
39
+ source: @source,
40
+ parameters: @parameters,
41
+ destination: @destination
42
+ ).process
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Moonshot
4
+ module Commands
5
+ module InteractiveCommand
6
+ def parser
7
+ parser = super
8
+
9
+ parser.on('--[no-]interactive', TrueClass, 'Use interactive prompts.') do |v|
10
+ Moonshot.config.interactive = v
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  module Commands
3
5
  class List < Moonshot::Command
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  module Commands
3
5
  class New < Moonshot::Command
@@ -25,6 +27,7 @@ module Moonshot
25
27
  def create_project_dir
26
28
  raise "Directory '#{@application_name}' already exists!" \
27
29
  if Dir.exist?(project_path)
30
+
28
31
  Dir.mkdir(project_path)
29
32
  end
30
33
 
@@ -49,7 +52,7 @@ Moonshot.config do |m|
49
52
  m.build_mechanism = Script.new('bin/build.sh')
50
53
  m.deployment_mechanism = CodeDeploy.new(asg: 'AutoScalingGroup')
51
54
  end
52
- EOF
55
+ EOF
53
56
  end
54
57
 
55
58
  def print_success_message
@@ -69,7 +72,7 @@ You will also need to ensure your Amazon account is configured for
69
72
  CodeDeploy by creating a role that allows deployments.
70
73
 
71
74
  See: http://moonshot.readthedocs.io/en/latest/mechanisms/deployment/
72
- EOF
75
+ EOF
73
76
  end
74
77
  end
75
78
  end
@@ -1,4 +1,6 @@
1
- # rubocop:disable LineLength
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Layout/LineLength
2
4
  module Moonshot
3
5
  module Commands
4
6
  module ParameterArguments
@@ -15,9 +17,7 @@ module Moonshot
15
17
 
16
18
  parser.on('--parameter KEY=VALUE', '-PKEY=VALUE', 'Specify Stack Parameter on the command line') do |v|
17
19
  data = v.split('=', 2)
18
- unless data.size == 2
19
- raise "Invalid parameter format '#{v}', expected KEY=VALUE (e.g. MyStackParameter=12)"
20
- end
20
+ raise "Invalid parameter format '#{v}', expected KEY=VALUE (e.g. MyStackParameter=12)" unless data.size == 2
21
21
 
22
22
  Moonshot.config.parameter_overrides[data[0]] = data[1]
23
23
  end
@@ -25,3 +25,4 @@ module Moonshot
25
25
  end
26
26
  end
27
27
  end
28
+ # rubocop:enable Layout/LineLength
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  module Commands
3
5
  module ParentStackOption
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  module Commands
3
5
  class Push < Moonshot::Command
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  module Commands
3
5
  module ShowAllEventsOption
@@ -1,3 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../ssh_command'
4
+
1
5
  module Moonshot
2
6
  module Commands
3
7
  class Ssh < Moonshot::SSHCommand
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  module Commands
3
5
  class Status < Moonshot::Command
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Moonshot
4
+ module Commands
5
+ module TagArguments
6
+ def parser
7
+ parser = super
8
+
9
+ parser.on('--tag KEY=VALUE', '-TKEY=VALUE', 'Specify Stack Tag on the command line') do |v|
10
+ data = v.split('=', 2)
11
+ unless data.size == 2
12
+ raise "Invalid tag format '#{v}', expected KEY=VALUE (e.g. MyStackTag=12)"
13
+ end
14
+
15
+ Moonshot.config.extra_tags << { key: data[0], value: data[1] }
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  module Commands
3
5
  class Update < Moonshot::Command
4
6
  include ParameterArguments
7
+ include TagArguments
5
8
  include ShowAllEventsOption
6
9
  include ParentStackOption
7
10
 
@@ -11,7 +14,7 @@ module Moonshot
11
14
  def parser
12
15
  parser = super
13
16
 
14
- parser.on('--dry-run', TrueClass, 'Show the changes that would be applied, but do not execute them') do |v| # rubocop:disable LineLength
17
+ parser.on('--dry-run', TrueClass, 'Show the changes that would be applied, but do not execute them') do |v|
15
18
  @dry_run = v
16
19
  end
17
20
 
@@ -22,6 +25,10 @@ module Moonshot
22
25
  parser.on('--refresh-parameters', TrueClass, 'Update parameters from parent stacks') do |v|
23
26
  @refresh_parameters = v
24
27
  end
28
+
29
+ parser.on('--template-file=FILE', 'Override the path to the CloudFormation template.') do |v|
30
+ Moonshot.config.template_file = v
31
+ end
25
32
  end
26
33
 
27
34
  def execute
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  module Commands
3
5
  class Version < Moonshot::Command
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  # The Controller coordinates and performs all Moonshot actions.
3
- class Controller # rubocop:disable ClassLength
5
+ class Controller # rubocop:disable Metrics/ClassLength
4
6
  attr_accessor :config
5
7
 
6
8
  def initialize(config)
@@ -11,7 +13,8 @@ module Moonshot
11
13
  Moonshot::StackLister.new(@config.app_name).list
12
14
  end
13
15
 
14
- def create # rubocop:disable AbcSize
16
+ def create # rubocop:disable Metrics/AbcSize
17
+ run_plugins(:setup_create)
15
18
  # Scan the template for all required parameters and configure
16
19
  # the ParameterCollection.
17
20
  @config.parameters = ParameterCollection.from_template(stack.template)
@@ -34,7 +37,7 @@ module Moonshot
34
37
 
35
38
  # Interview the user for missing parameters, using the
36
39
  # appropriate prompts.
37
- @config.parameters.values.each do |sp|
40
+ @config.parameters.hash.each_value do |sp|
38
41
  next if sp.set?
39
42
 
40
43
  parameter_source = @config.parameter_sources.fetch(sp.name,
@@ -50,12 +53,12 @@ module Moonshot
50
53
  # Fail if any parameters are still missing without defaults.
51
54
  missing_parameters = @config.parameters.missing_for_create
52
55
  unless missing_parameters.empty?
53
- raise "The following parameters were not provided: #{missing_parameters.map(&:name).join(', ')}" # rubocop:disable LineLength
56
+ raise "The following parameters were not provided: #{missing_parameters.map(&:name).join(', ')}"
54
57
  end
55
58
 
56
59
  run_hook(:deploy, :pre_create)
57
60
  stack_ok = stack.create
58
- if stack_ok # rubocop:disable GuardClause
61
+ if stack_ok # rubocop:disable Style/GuardClause
59
62
  run_hook(:deploy, :post_create)
60
63
  run_plugins(:post_create)
61
64
  else
@@ -63,7 +66,8 @@ module Moonshot
63
66
  end
64
67
  end
65
68
 
66
- def update(dry_run:, force:, refresh_parameters:) # rubocop:disable AbcSize
69
+ def update(dry_run:, force:, refresh_parameters:) # rubocop:disable Metrics/AbcSize
70
+ run_plugins(:setup_update)
67
71
  # Scan the template for all required parameters and configure
68
72
  # the ParameterCollection.
69
73
  @config.parameters = ParameterCollection.from_template(stack.template)
@@ -106,16 +110,17 @@ module Moonshot
106
110
  # Fail if any parameters are still missing without defaults.
107
111
  missing_parameters = @config.parameters.missing_for_update
108
112
  unless missing_parameters.empty?
109
- raise "The following parameters were not provided: #{missing_parameters.map(&:name).join(', ')}" # rubocop:disable LineLength
113
+ raise "The following parameters were not provided: #{missing_parameters.map(&:name).join(', ')}"
110
114
  end
111
115
 
112
116
  run_hook(:deploy, :pre_update)
113
- stack.update(dry_run: dry_run, force: force)
117
+ stack.update(dry_run:, force:)
114
118
  run_hook(:deploy, :post_update)
115
119
  run_plugins(:post_update)
116
120
  end
117
121
 
118
122
  def status
123
+ run_plugins(:setup_status)
119
124
  run_plugins(:pre_status)
120
125
  run_hook(:deploy, :status)
121
126
  stack.status
@@ -129,6 +134,7 @@ module Moonshot
129
134
  end
130
135
 
131
136
  def build_version(version_name)
137
+ run_plugins(:setup_build)
132
138
  run_plugins(:pre_build)
133
139
  run_hook(:build, :pre_build, version_name)
134
140
  run_hook(:build, :build, version_name)
@@ -138,12 +144,14 @@ module Moonshot
138
144
  end
139
145
 
140
146
  def deploy_version(version_name)
147
+ run_plugins(:setup_deploy)
141
148
  run_plugins(:pre_deploy)
142
149
  run_hook(:deploy, :deploy, @config.artifact_repository, version_name)
143
150
  run_plugins(:post_deploy)
144
151
  end
145
152
 
146
153
  def delete
154
+ run_plugins(:setup_delete)
147
155
  # Populate the current values of parameters, for use by plugins.
148
156
  @config.parameters = ParameterCollection.from_template(stack.template)
149
157
  stack.parameters.each do |key, value|
@@ -153,7 +161,7 @@ module Moonshot
153
161
  run_plugins(:pre_delete)
154
162
  run_hook(:deploy, :pre_delete)
155
163
  stack_ok = stack.delete
156
- if stack_ok # rubocop:disable GuardClause
164
+ if stack_ok # rubocop:disable Style/GuardClause
157
165
  run_hook(:deploy, :post_delete)
158
166
  run_plugins(:post_delete)
159
167
  else
@@ -176,7 +184,8 @@ module Moonshot
176
184
  def ssh
177
185
  run_plugins(:pre_ssh)
178
186
  @config.ssh_instance ||= SSHTargetSelector.new(
179
- stack, asg_name: @config.ssh_auto_scaling_group_name).choose!
187
+ stack, asg_name: @config.ssh_auto_scaling_group_name
188
+ ).choose!
180
189
  cb = SSHCommandBuilder.new(@config.ssh_config, @config.ssh_instance)
181
190
  result = cb.build(@config.ssh_command)
182
191
 
@@ -192,14 +201,14 @@ module Moonshot
192
201
 
193
202
  def resources
194
203
  @resources ||=
195
- Resources.new(stack: stack, ilog: @config.interactive_logger, controller: self)
204
+ Resources.new(stack:, ilog: @config.interactive_logger, controller: self)
196
205
  end
197
206
 
198
207
  def run_hook(type, name, *args)
199
208
  mech = get_mechanism(type)
200
209
  name = name.to_s << '_hook'
201
210
 
202
- return unless mech && mech.respond_to?(name)
211
+ return unless mech.respond_to?(name)
203
212
 
204
213
  mech.resources = resources
205
214
  mech.send(name, *args)
@@ -209,7 +218,13 @@ module Moonshot
209
218
  results = {}
210
219
  @config.plugins.each do |plugin|
211
220
  next unless plugin.respond_to?(type)
212
- results[plugin] = plugin.send(type, resources)
221
+
222
+ results[plugin] =
223
+ if type =~ /^setup_/
224
+ plugin.send(type)
225
+ else
226
+ plugin.send(type, resources)
227
+ end
213
228
  end
214
229
 
215
230
  results
@@ -1,32 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  # Holds configuration for Moonshot::Controller
3
5
  class ControllerConfig
4
6
  attr_reader :account_alias
5
7
 
6
- attr_accessor :additional_tag
7
- attr_accessor :answer_file
8
- attr_accessor :app_name
9
- attr_accessor :artifact_repository
10
- attr_accessor :build_mechanism
11
- attr_accessor :changeset_wait_time
12
- attr_accessor :deployment_mechanism
13
- attr_accessor :dev_build_name_proc
14
- attr_accessor :environment_name
15
- attr_accessor :interactive
16
- attr_accessor :interactive_logger
17
- attr_accessor :parameter_overrides
18
- attr_accessor :parameters
19
- attr_accessor :parent_stacks
20
- attr_accessor :default_parameter_source
21
- attr_accessor :parameter_sources
22
- attr_accessor :plugins
23
- attr_accessor :project_root
24
- attr_accessor :show_all_stack_events
25
- attr_accessor :ssh_auto_scaling_group_name
26
- attr_accessor :ssh_command
27
- attr_accessor :ssh_config
28
- attr_accessor :ssh_instance
29
- attr_accessor :template_s3_bucket
8
+ attr_accessor :additional_tag, :answer_file, :app_name, :artifact_repository, :build_mechanism,
9
+ :changeset_wait_time, :deployment_mechanism, :dev_build_name_proc, :environment_name,
10
+ :interactive, :interactive_logger, :parameter_overrides, :parameters, :parent_stacks,
11
+ :default_parameter_source, :parameter_sources, :plugins, :project_root,
12
+ :show_all_stack_events, :ssh_auto_scaling_group_name, :ssh_command, :ssh_config,
13
+ :ssh_instance, :template_file, :template_s3_bucket, :extra_tags
30
14
 
31
15
  def initialize
32
16
  @default_parameter_source = AskUserSource.new
@@ -42,6 +26,7 @@ module Moonshot
42
26
  @project_root = Dir.pwd
43
27
  @show_all_stack_events = false
44
28
  @ssh_config = SSHConfig.new
29
+ @extra_tags = []
45
30
 
46
31
  @dev_build_name_proc = lambda do |c|
47
32
  ['dev', c.app_name, c.environment_name, Time.now.to_i].join('/')
@@ -60,9 +45,10 @@ module Moonshot
60
45
  def update_for_account!
61
46
  # Evaluated any account-specific configuration.
62
47
  @account_alias = Moonshot::AccountContext.get
63
- if @account_alias && @per_account_config.key?(account_alias)
64
- @per_account_config[@account_alias].call(self)
65
- end
48
+ return unless @account_alias
49
+ return unless @per_account_config.key?(@account_alias)
50
+
51
+ @per_account_config[@account_alias].call(self)
66
52
  end
67
53
  end
68
54
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Moonshot
2
4
  # Create convenience methods for various AWS client creation.
3
5
  module CredsHelper
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'colorize'
2
4
 
3
5
  # This mechanism is used to deploy software to an auto-scaling group within
@@ -8,12 +10,12 @@ require 'colorize'
8
10
  # self.artifact_repository = S3Bucket.new('foobucket')
9
11
  # self.deployment_mechanism = CodeDeploy.new(asg: 'AutoScalingGroup')
10
12
  # end
11
- class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
13
+ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable Metrics/ClassLength
12
14
  include Moonshot::ResourcesHelper
13
15
  include Moonshot::CredsHelper
14
16
  include Moonshot::DoctorHelper
15
17
 
16
- DEFAULT_ROLE_NAME = 'CodeDeployRole'.freeze
18
+ DEFAULT_ROLE_NAME = 'CodeDeployRole'
17
19
 
18
20
  # @param asg [Array, String]
19
21
  # The logical name of the AutoScalingGroup to create and manage a Deployment
@@ -37,12 +39,13 @@ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
37
39
  # CodeDeployDefault.OneAtATime.
38
40
  # rubocop:disable Metrics/ParameterLists
39
41
  def initialize(
40
- asg: [],
41
- optional_asg: [],
42
- role: DEFAULT_ROLE_NAME,
43
- app_name: nil,
44
- group_name: nil,
45
- config_name: 'CodeDeployDefault.OneAtATime')
42
+ asg: [],
43
+ optional_asg: [],
44
+ role: DEFAULT_ROLE_NAME,
45
+ app_name: nil,
46
+ group_name: nil,
47
+ config_name: 'CodeDeployDefault.OneAtATime'
48
+ )
46
49
  @asg_logical_ids = Array(asg)
47
50
  @optional_asg_logical_ids = Array(optional_asg)
48
51
  @app_name = app_name
@@ -51,6 +54,7 @@ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
51
54
  @codedeploy_config = config_name
52
55
  @ignore_app_stop_failures = false
53
56
  end
57
+ # rubocop:enable Metrics/ParameterLists
54
58
 
55
59
  def post_create_hook
56
60
  create_application_if_needed
@@ -62,7 +66,7 @@ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
62
66
  def post_update_hook
63
67
  post_create_hook
64
68
 
65
- unless deployment_group_ok? # rubocop:disable GuardClause
69
+ unless deployment_group_ok? # rubocop:disable Style/GuardClause
66
70
  delete_deployment_group
67
71
  create_deployment_group_if_needed
68
72
  end
@@ -101,7 +105,7 @@ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
101
105
  end
102
106
 
103
107
  def deploy_cli_hook(parser)
104
- parser.on('--ignore-app-stop-failures', TrueClass, 'Continue deployment on ApplicationStop failures') do |v| # rubocop:disable LineLength
108
+ parser.on('--ignore-app-stop-failures', TrueClass, 'Continue deployment on ApplicationStop failures') do |v|
105
109
  puts "ignore = #{v}"
106
110
  @ignore_app_stop_failures = v
107
111
  end
@@ -178,27 +182,24 @@ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
178
182
  autoscaling_groups = []
179
183
  @asg_logical_ids.each do |asg_logical_id|
180
184
  asg_name = stack.physical_id_for(asg_logical_id)
181
- unless asg_name
182
- raise "Could not find #{asg_logical_id} resource in Stack."
183
- end
185
+ raise "Could not find #{asg_logical_id} resource in Stack." unless asg_name
184
186
 
185
187
  groups = as_client.describe_auto_scaling_groups(
186
- auto_scaling_group_names: [asg_name])
187
- if groups.auto_scaling_groups.empty?
188
- raise "Could not find ASG #{asg_name}."
189
- end
188
+ auto_scaling_group_names: [asg_name]
189
+ )
190
+
191
+ raise "Could not find ASG #{asg_name}." if groups.auto_scaling_groups.empty?
190
192
 
191
193
  autoscaling_groups.push(groups.auto_scaling_groups.first)
192
194
  end
193
195
  @optional_asg_logical_ids.each do |asg_logical_id|
194
196
  asg_name = stack.physical_id_for(asg_logical_id)
195
197
  next unless asg_name
198
+
196
199
  groups = as_client.describe_auto_scaling_groups(
197
200
  auto_scaling_group_names: [asg_name]
198
201
  )
199
- unless groups.auto_scaling_groups.empty?
200
- autoscaling_groups.push(groups.auto_scaling_groups.first)
201
- end
202
+ autoscaling_groups.push(groups.auto_scaling_groups.first) unless groups.auto_scaling_groups.empty?
202
203
  end
203
204
  autoscaling_groups
204
205
  end
@@ -220,13 +221,16 @@ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
220
221
 
221
222
  def deployment_group
222
223
  cd_client.get_deployment_group(
223
- application_name: app_name, deployment_group_name: group_name)
224
- .deployment_group_info
224
+ application_name: app_name,
225
+ deployment_group_name: group_name
226
+ ).deployment_group_info
225
227
  end
226
228
 
227
229
  def deployment_group_exists?
228
230
  cd_client.get_deployment_group(
229
- application_name: app_name, deployment_group_name: group_name)
231
+ application_name: app_name,
232
+ deployment_group_name: group_name
233
+ )
230
234
  true
231
235
  rescue Aws::CodeDeploy::Errors::ApplicationDoesNotExistException,
232
236
  Aws::CodeDeploy::Errors::DeploymentGroupDoesNotExistException
@@ -235,13 +239,13 @@ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
235
239
 
236
240
  def deployment_group_ok?
237
241
  return false unless deployment_group_exists?
242
+
238
243
  asgs = deployment_group.auto_scaling_groups
239
244
  return false unless asgs
240
245
  return false unless asgs.count == auto_scaling_groups.count
246
+
241
247
  asgs.each do |asg|
242
- if (auto_scaling_groups.find_index { |a| a.auto_scaling_group_name == asg.name }).nil?
243
- return false
244
- end
248
+ return false if (auto_scaling_groups.find_index { |a| a.auto_scaling_group_name == asg.name }).nil?
245
249
  end
246
250
  true
247
251
  end
@@ -284,7 +288,8 @@ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
284
288
  ilog.start "Deleting #{pretty_deploy_group}." do |s|
285
289
  cd_client.delete_deployment_group(
286
290
  application_name: app_name,
287
- deployment_group_name: group_name)
291
+ deployment_group_name: group_name
292
+ )
288
293
  s.success
289
294
  end
290
295
  end
@@ -294,7 +299,8 @@ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
294
299
  application_name: app_name,
295
300
  deployment_group_name: group_name,
296
301
  service_role_arn: role.arn,
297
- auto_scaling_groups: asg_names)
302
+ auto_scaling_groups: asg_names
303
+ )
298
304
  end
299
305
 
300
306
  def wait_for_asg_capacity
@@ -306,10 +312,11 @@ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
306
312
  count = asg.instances.count { |i| i.lifecycle_state == 'InService' }
307
313
  if asg.desired_capacity == count
308
314
  asgs_at_capacity += 1
309
- s.continue "#{asg.auto_scaling_group_name} DesiredCapacity is #{asg.desired_capacity}, currently #{count} instance(s) are InService." # rubocop:disable LineLength
315
+ s.continue "#{asg.auto_scaling_group_name} DesiredCapacity is #{asg.desired_capacity}, currently #{count} instance(s) are InService." # rubocop:disable Layout/LineLength
310
316
  end
311
317
  end
312
318
  break if asgs.count == asgs_at_capacity
319
+
313
320
  sleep 5
314
321
  end
315
322
 
@@ -327,7 +334,7 @@ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
327
334
 
328
335
  case status
329
336
  when 'Created', 'Queued', 'InProgress'
330
- step.continue "Waiting for Deployment #{id.blue} to complete, current status is '#{status}'." # rubocop:disable LineLength
337
+ step.continue "Waiting for Deployment #{id.blue} to complete, current status is '#{status}'."
331
338
  when 'Succeeded'
332
339
  step.success "Deployment #{id.blue} completed successfully!"
333
340
  break
@@ -342,10 +349,10 @@ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
342
349
  end
343
350
 
344
351
  def handle_deployment_failure(deployment_id)
345
- instances = cd_client.list_deployment_instances(deployment_id: deployment_id)
352
+ instances = cd_client.list_deployment_instances(deployment_id:)
346
353
  .instances_list.map do |instance_id|
347
- cd_client.get_deployment_instance(deployment_id: deployment_id,
348
- instance_id: instance_id)
354
+ cd_client.get_deployment_instance(deployment_id:,
355
+ instance_id:)
349
356
  end
350
357
 
351
358
  instances.map(&:instance_summary).each do |inst_summary|
@@ -373,7 +380,7 @@ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
373
380
  when Moonshot::ArtifactRepository::S3Bucket
374
381
  s3_revision_for(artifact_repo, version_name)
375
382
  when NilClass
376
- raise 'Must specify an ArtifactRepository with CodeDeploy. Take a look at the S3Bucket example.' # rubocop:disable LineLength
383
+ raise 'Must specify an ArtifactRepository with CodeDeploy. Take a look at the S3Bucket example.'
377
384
  else
378
385
  raise "Cannot use #{artifact_repo.class} to deploy with CodeDeploy."
379
386
  end
@@ -404,7 +411,7 @@ class Moonshot::DeploymentMechanism::CodeDeploy # rubocop:disable ClassLength
404
411
  def doctor_check_code_deploy_role
405
412
  role
406
413
  success("#{@codedeploy_role} exists.")
407
- rescue => e
414
+ rescue StandardError => e
408
415
  help = <<-EOF
409
416
  Error: #{e.message}
410
417
 
@@ -417,9 +424,9 @@ http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-service-rol
417
424
  def doctor_check_auto_scaling_resource_defined
418
425
  @asg_logical_ids.each do |asg_logical_id|
419
426
  if stack.template.resource_names.include?(asg_logical_id)
420
- success("Resource '#{asg_logical_id}' exists in the CloudFormation template.") # rubocop:disable LineLength
427
+ success("Resource '#{asg_logical_id}' exists in the CloudFormation template.")
421
428
  else
422
- critical("Resource '#{asg_logical_id}' does not exist in the CloudFormation template!") # rubocop:disable LineLength
429
+ critical("Resource '#{asg_logical_id}' does not exist in the CloudFormation template!")
423
430
  end
424
431
  end
425
432
  end