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.
- checksums.yaml +5 -5
- data/bin/moonshot +4 -1
- data/lib/default/bin/build.sh +0 -0
- data/lib/moonshot/account_context.rb +2 -0
- data/lib/moonshot/always_use_default_source.rb +5 -4
- data/lib/moonshot/artifact_repository/s3_bucket.rb +11 -5
- data/lib/moonshot/artifact_repository/s3_bucket_via_github_releases.rb +7 -7
- data/lib/moonshot/ask_user_source.rb +2 -0
- data/lib/moonshot/build_mechanism/github_release.rb +9 -2
- data/lib/moonshot/build_mechanism/script.rb +8 -7
- data/lib/moonshot/build_mechanism/travis_deploy.rb +5 -5
- data/lib/moonshot/build_mechanism/version_proxy.rb +13 -0
- data/lib/moonshot/change_set.rb +24 -34
- data/lib/moonshot/command.rb +3 -1
- data/lib/moonshot/command_line.rb +12 -9
- data/lib/moonshot/command_line_dispatcher.rb +5 -7
- data/lib/moonshot/commands/build.rb +6 -0
- data/lib/moonshot/commands/console.rb +2 -0
- data/lib/moonshot/commands/create.rb +16 -2
- data/lib/moonshot/commands/delete.rb +9 -0
- data/lib/moonshot/commands/deploy.rb +4 -8
- data/lib/moonshot/commands/doctor.rb +2 -0
- data/lib/moonshot/commands/generate_template.rb +46 -0
- data/lib/moonshot/commands/interactive_command.rb +15 -0
- data/lib/moonshot/commands/list.rb +2 -0
- data/lib/moonshot/commands/new.rb +5 -2
- data/lib/moonshot/commands/parameter_arguments.rb +5 -4
- data/lib/moonshot/commands/parent_stack_option.rb +2 -0
- data/lib/moonshot/commands/push.rb +2 -0
- data/lib/moonshot/commands/show_all_events_option.rb +2 -0
- data/lib/moonshot/commands/ssh.rb +4 -0
- data/lib/moonshot/commands/status.rb +2 -0
- data/lib/moonshot/commands/tag_arguments.rb +20 -0
- data/lib/moonshot/commands/update.rb +8 -1
- data/lib/moonshot/commands/version.rb +2 -0
- data/lib/moonshot/controller.rb +28 -13
- data/lib/moonshot/controller_config.rb +13 -27
- data/lib/moonshot/creds_helper.rb +2 -0
- data/lib/moonshot/deployment_mechanism/code_deploy.rb +44 -37
- data/lib/moonshot/doctor_helper.rb +14 -15
- data/lib/moonshot/dynamic_template.rb +76 -0
- data/lib/moonshot/interactive_logger_proxy.rb +4 -4
- data/lib/moonshot/json_stack_template.rb +3 -0
- data/lib/moonshot/parameter_collection.rb +3 -0
- data/lib/moonshot/parent_stack_parameter_loader.rb +7 -3
- data/lib/moonshot/resources.rb +2 -0
- data/lib/moonshot/resources_helper.rb +5 -1
- data/lib/moonshot/shell.rb +8 -8
- data/lib/moonshot/ssh_command.rb +2 -0
- data/lib/moonshot/ssh_command_builder.rb +3 -1
- data/lib/moonshot/ssh_config.rb +3 -2
- data/lib/moonshot/ssh_fork_executor.rb +2 -0
- data/lib/moonshot/ssh_target_selector.rb +3 -1
- data/lib/moonshot/stack.rb +73 -55
- data/lib/moonshot/stack_asg_printer.rb +14 -12
- data/lib/moonshot/stack_config.rb +3 -2
- data/lib/moonshot/stack_events_poller.rb +3 -1
- data/lib/moonshot/stack_list_printer.rb +2 -0
- data/lib/moonshot/stack_lister.rb +6 -2
- data/lib/moonshot/stack_output_printer.rb +2 -0
- data/lib/moonshot/stack_parameter.rb +5 -9
- data/lib/moonshot/stack_parameter_printer.rb +3 -1
- data/lib/moonshot/stack_template.rb +2 -0
- data/lib/moonshot/task.rb +3 -0
- data/lib/moonshot/tools/asg_rollout/asg.rb +22 -21
- data/lib/moonshot/tools/asg_rollout/asg_instance.rb +2 -0
- data/lib/moonshot/tools/asg_rollout/hook_exec_environment.rb +2 -0
- data/lib/moonshot/tools/asg_rollout/instance_health.rb +2 -0
- data/lib/moonshot/tools/asg_rollout.rb +16 -14
- data/lib/moonshot/tools/asg_rollout_config.rb +2 -0
- data/lib/moonshot/unicode_table.rb +5 -3
- data/lib/moonshot/yaml_stack_template.rb +2 -0
- data/lib/moonshot.rb +13 -1
- data/lib/plugins/backup.rb +24 -30
- data/lib/plugins/code_deploy_setup.rb +4 -2
- data/lib/plugins/dynamic_template.rb +36 -0
- data/lib/plugins/encrypted_parameters/kms_key.rb +26 -5
- data/lib/plugins/encrypted_parameters/parameter_encrypter.rb +2 -0
- data/lib/plugins/encrypted_parameters.rb +6 -2
- metadata +189 -51
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Moonshot
|
2
4
|
# The StackLister is world renoun for it's ability to list stacks.
|
3
5
|
class StackLister
|
@@ -13,7 +15,7 @@ module Moonshot
|
|
13
15
|
result = []
|
14
16
|
next_token = nil
|
15
17
|
loop do
|
16
|
-
resp = cf_client.describe_stacks(next_token:
|
18
|
+
resp = cf_client.describe_stacks(next_token:)
|
17
19
|
resp.stacks.each do |stack|
|
18
20
|
app_tag = stack.tags.find { |t| t.key == 'moonshot_application' }
|
19
21
|
env_tag = stack.tags.find { |t| t.key == 'moonshot_environment' }
|
@@ -22,15 +24,17 @@ module Moonshot
|
|
22
24
|
if app_tag && app_tag.value == Moonshot.config.app_name
|
23
25
|
result <<
|
24
26
|
EnvironmentDescription.new(env_tag.value, stack.creation_time, stack.stack_status)
|
25
|
-
elsif legacy_tag
|
27
|
+
elsif legacy_tag&.value&.start_with?(Moonshot.config.app_name)
|
26
28
|
result <<
|
27
29
|
EnvironmentDescription.new(legacy_tag.value, stack.creation_time, stack.stack_status)
|
28
30
|
end
|
29
31
|
end
|
30
32
|
break unless resp.next_token
|
33
|
+
|
31
34
|
next_token = resp.next_token
|
32
35
|
end
|
33
36
|
result.sort_by(&:name)
|
34
37
|
end
|
38
|
+
# rubocop:enable Metrics/AbcSize
|
35
39
|
end
|
36
40
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Moonshot
|
2
4
|
class StackParameter
|
3
|
-
attr_reader :name
|
4
|
-
attr_reader :default
|
5
|
-
attr_reader :description
|
5
|
+
attr_reader :name, :default, :description
|
6
6
|
|
7
7
|
def initialize(name, default: nil, use_previous: false, description: '')
|
8
8
|
@default = default
|
@@ -32,9 +32,7 @@ module Moonshot
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def use_previous!(value)
|
35
|
-
if @value
|
36
|
-
raise "Value already set for StackParameter #{@name}, cannot use previous value!"
|
37
|
-
end
|
35
|
+
raise "Value already set for StackParameter #{@name}, cannot use previous value!" if @value
|
38
36
|
|
39
37
|
# Make the current value available to plugins.
|
40
38
|
@value = value
|
@@ -42,9 +40,7 @@ module Moonshot
|
|
42
40
|
end
|
43
41
|
|
44
42
|
def value
|
45
|
-
unless @value || default?
|
46
|
-
raise "No value set and no default for StackParameter #{@name}!"
|
47
|
-
end
|
43
|
+
raise "No value set and no default for StackParameter #{@name}!" unless @value || default?
|
48
44
|
|
49
45
|
@value || default
|
50
46
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Moonshot
|
2
4
|
# Displays information about existing stack parameters to the user, with
|
3
5
|
# information on what a stack update would do.
|
@@ -18,7 +20,7 @@ module Moonshot
|
|
18
20
|
|
19
21
|
def format_value(value)
|
20
22
|
if value.size > 60
|
21
|
-
value[0..60]
|
23
|
+
"#{value[0..60]}..."
|
22
24
|
else
|
23
25
|
value
|
24
26
|
end
|
data/lib/moonshot/task.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'aws-sdk-elasticloadbalancing'
|
4
|
+
require 'aws-sdk-autoscaling'
|
5
|
+
|
1
6
|
module Moonshot
|
2
7
|
module Tools
|
3
8
|
class ASGRollout
|
@@ -20,14 +25,15 @@ module Moonshot
|
|
20
25
|
autoscaling.update_auto_scaling_group(
|
21
26
|
auto_scaling_group_name: @name,
|
22
27
|
max_size: max,
|
23
|
-
desired_capacity: desired
|
28
|
+
desired_capacity: desired
|
29
|
+
)
|
24
30
|
end
|
25
31
|
|
26
32
|
def non_conforming_instances
|
27
33
|
asg = load_asg
|
28
34
|
|
29
35
|
asg.instances
|
30
|
-
.
|
36
|
+
.reject { |i| i.launch_configuration_name == asg.launch_configuration_name }
|
31
37
|
.map(&:instance_id)
|
32
38
|
end
|
33
39
|
|
@@ -59,17 +65,17 @@ module Moonshot
|
|
59
65
|
resp = autoscaling.detach_instances(
|
60
66
|
auto_scaling_group_name: @name,
|
61
67
|
instance_ids: [id],
|
62
|
-
should_decrement_desired_capacity: decrement
|
68
|
+
should_decrement_desired_capacity: decrement
|
69
|
+
)
|
63
70
|
|
64
71
|
activity = resp.activities.first
|
65
|
-
unless activity
|
66
|
-
raise 'Did not receive Activity from DetachInstances call!'
|
67
|
-
end
|
72
|
+
raise 'Did not receive Activity from DetachInstances call!' unless activity
|
68
73
|
|
69
74
|
# Wait for the detach activity to complete:
|
70
75
|
loop do
|
71
76
|
resp = autoscaling.describe_scaling_activities(
|
72
|
-
auto_scaling_group_name: @name
|
77
|
+
auto_scaling_group_name: @name
|
78
|
+
)
|
73
79
|
|
74
80
|
current_status = resp.activities
|
75
81
|
.find { |a| a.activity_id == activity.activity_id }
|
@@ -97,7 +103,8 @@ module Moonshot
|
|
97
103
|
|
98
104
|
def asg_instance_state(id)
|
99
105
|
resp = autoscaling.describe_auto_scaling_instances(
|
100
|
-
instance_ids: [id]
|
106
|
+
instance_ids: [id]
|
107
|
+
)
|
101
108
|
|
102
109
|
instance_info = resp.auto_scaling_instances.first
|
103
110
|
return 'Missing' unless instance_info
|
@@ -108,14 +115,11 @@ module Moonshot
|
|
108
115
|
def elb_instance_state(id)
|
109
116
|
resp = loadbalancing.describe_instance_health(
|
110
117
|
load_balancer_name: elb_name,
|
111
|
-
instances: [
|
112
|
-
|
113
|
-
])
|
118
|
+
instances: [{ instance_id: id }]
|
119
|
+
)
|
114
120
|
|
115
121
|
instance_info = resp.instance_states.first
|
116
|
-
unless instance_info
|
117
|
-
raise "Failed to call DescribeInstanceHealth for #{id}!"
|
118
|
-
end
|
122
|
+
raise "Failed to call DescribeInstanceHealth for #{id}!" unless instance_info
|
119
123
|
|
120
124
|
instance_info.state
|
121
125
|
rescue Aws::ElasticLoadBalancing::Errors::InvalidInstance
|
@@ -133,11 +137,10 @@ module Moonshot
|
|
133
137
|
|
134
138
|
def load_asg
|
135
139
|
resp = autoscaling.describe_auto_scaling_groups(
|
136
|
-
auto_scaling_group_names: [@name]
|
140
|
+
auto_scaling_group_names: [@name]
|
141
|
+
)
|
137
142
|
|
138
|
-
if resp.auto_scaling_groups.empty?
|
139
|
-
raise "Failed to call DescribeAutoScalingGroups for #{@name}!"
|
140
|
-
end
|
143
|
+
raise "Failed to call DescribeAutoScalingGroups for #{@name}!" if resp.auto_scaling_groups.empty?
|
141
144
|
|
142
145
|
asg = resp.auto_scaling_groups.first
|
143
146
|
@last_seen_ids = asg.instances.map(&:instance_id)
|
@@ -149,9 +152,7 @@ module Moonshot
|
|
149
152
|
return @elb_name if @elb_name
|
150
153
|
|
151
154
|
asg = load_asg
|
152
|
-
if asg.load_balancer_names.size > 1
|
153
|
-
raise 'ASGRollout does not support configurations with multiple ELBs!'
|
154
|
-
end
|
155
|
+
raise 'ASGRollout does not support configurations with multiple ELBs!' if asg.load_balancer_names.size > 1
|
155
156
|
|
156
157
|
@elb_name ||= asg.load_balancer_names.first
|
157
158
|
end
|
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Moonshot
|
2
4
|
module Tools
|
3
|
-
class ASGRollout # rubocop:disable ClassLength
|
5
|
+
class ASGRollout # rubocop:disable Metrics/ClassLength
|
4
6
|
attr_accessor :config
|
5
7
|
|
6
8
|
def initialize(controller:, logical_id:)
|
@@ -16,7 +18,7 @@ module Moonshot
|
|
16
18
|
new_instance = wait_for_new_instance
|
17
19
|
begin
|
18
20
|
wait_for_in_service(new_instance)
|
19
|
-
rescue
|
21
|
+
rescue StandardError
|
20
22
|
next
|
21
23
|
end
|
22
24
|
break
|
@@ -74,6 +76,7 @@ module Moonshot
|
|
74
76
|
raise "Instance #{new_instance.blue} went OutOfService while waiting to join..."
|
75
77
|
end
|
76
78
|
break if instance_health.in_service?
|
79
|
+
|
77
80
|
s.continue "Instance #{new_instance.blue} is #{instance_health}..."
|
78
81
|
sleep @config.instance_health_delay
|
79
82
|
end
|
@@ -83,22 +86,22 @@ module Moonshot
|
|
83
86
|
end
|
84
87
|
|
85
88
|
def run_pre_detach(instance)
|
86
|
-
|
87
|
-
log.start_threaded "Running PreDetach hook on #{instance.blue}..." do |s|
|
88
|
-
he = HookExecEnvironment.new(@controller.config, instance)
|
89
|
-
if false == @config.pre_detach.call(he)
|
90
|
-
s.failure "PreDetach hook failed for #{instance.blue}!"
|
91
|
-
raise "PreDetach hook failed for #{instance.blue}!"
|
92
|
-
end
|
89
|
+
return unless @config.pre_detach
|
93
90
|
|
94
|
-
|
91
|
+
log.start_threaded "Running PreDetach hook on #{instance.blue}..." do |s|
|
92
|
+
he = HookExecEnvironment.new(@controller.config, instance)
|
93
|
+
if @config.pre_detach.call(he) == false
|
94
|
+
s.failure "PreDetach hook failed for #{instance.blue}!"
|
95
|
+
raise "PreDetach hook failed for #{instance.blue}!"
|
95
96
|
end
|
97
|
+
|
98
|
+
s.success "PreDetach hook complete for #{instance.blue}!"
|
96
99
|
end
|
97
100
|
end
|
98
101
|
|
99
102
|
def detach(instance, decrement:)
|
100
103
|
log.start_threaded "Detaching instance #{instance.blue}..." do |s|
|
101
|
-
asg.detach_instance(instance, decrement:
|
104
|
+
asg.detach_instance(instance, decrement:)
|
102
105
|
|
103
106
|
if decrement
|
104
107
|
s.success "Detached instance #{instance.blue}, and decremented DesiredCapacity."
|
@@ -115,6 +118,7 @@ module Moonshot
|
|
115
118
|
loop do
|
116
119
|
instance_health = asg.instance_health(instance)
|
117
120
|
break if instance_health.out_of_service?
|
121
|
+
|
118
122
|
s.continue "Instance #{instance.blue} is #{instance_health}..."
|
119
123
|
sleep @config.instance_health_delay
|
120
124
|
end
|
@@ -155,9 +159,7 @@ module Moonshot
|
|
155
159
|
return @asg if @asg
|
156
160
|
|
157
161
|
asg_name = @controller.stack.physical_id_for(@logical_id)
|
158
|
-
unless asg_name
|
159
|
-
raise "Could not find Auto Scaling Group #{@logical_id}!"
|
160
|
-
end
|
162
|
+
raise "Could not find Auto Scaling Group #{@logical_id}!" unless asg_name
|
161
163
|
|
162
164
|
@asg ||= ASGRollout::ASG.new(asg_name)
|
163
165
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'colorize'
|
4
4
|
|
@@ -37,12 +37,14 @@ module Moonshot
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def draw(depth = 1, first = true)
|
40
|
+
space = ' '
|
41
|
+
pipe = '|'
|
40
42
|
print first ? '┌' : '├'
|
41
43
|
print '─' * depth
|
42
|
-
puts
|
44
|
+
puts "#{space}" << @name.light_black # rubocop:disable Style/RedundantInterpolation
|
43
45
|
@lines = [''] + @lines + ['']
|
44
46
|
@lines.each do |line|
|
45
|
-
puts
|
47
|
+
puts "#{pipe}" << (' ' * depth) << line # rubocop:disable Style/RedundantInterpolation
|
46
48
|
end
|
47
49
|
@children.each do |child|
|
48
50
|
child.draw(depth + 1, false)
|
data/lib/moonshot.rb
CHANGED
@@ -1,5 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'English'
|
2
|
-
|
4
|
+
|
5
|
+
require 'aws-sdk-cloudformation'
|
6
|
+
require 'aws-sdk-codedeploy'
|
7
|
+
require 'aws-sdk-ec2'
|
8
|
+
require 'aws-sdk-iam'
|
9
|
+
require 'aws-sdk-autoscaling'
|
10
|
+
require 'aws-sdk-s3'
|
11
|
+
|
3
12
|
require 'logger'
|
4
13
|
require 'thor'
|
5
14
|
require 'interactive-logger'
|
@@ -16,10 +25,13 @@ module Moonshot
|
|
16
25
|
|
17
26
|
module ArtifactRepository
|
18
27
|
end
|
28
|
+
|
19
29
|
module BuildMechanism
|
20
30
|
end
|
31
|
+
|
21
32
|
module DeploymentMechanism
|
22
33
|
end
|
34
|
+
|
23
35
|
module Plugins
|
24
36
|
end
|
25
37
|
end
|
data/lib/plugins/backup.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rubygems/package'
|
2
4
|
require 'zlib'
|
3
5
|
require 'yaml'
|
@@ -20,7 +22,7 @@ module Moonshot
|
|
20
22
|
def initialize
|
21
23
|
yield self if block_given?
|
22
24
|
validate_configuration
|
23
|
-
@target_name ||= '
|
25
|
+
@target_name ||= '%<app_name>s_%<timestamp>s_%<user>s.tar.gz'
|
24
26
|
end
|
25
27
|
|
26
28
|
# Factory method to create preconfigured Backup plugins. Uploads current
|
@@ -29,11 +31,12 @@ module Moonshot
|
|
29
31
|
# @return [Backup] configured backup object
|
30
32
|
def self.to_bucket(bucket)
|
31
33
|
raise ArgumentError if bucket.nil? || bucket.empty?
|
34
|
+
|
32
35
|
Moonshot::Plugins::Backup.new do |b|
|
33
36
|
b.bucket = bucket
|
34
37
|
b.backup_parameters = true
|
35
38
|
b.backup_template = true
|
36
|
-
b.hooks = [
|
39
|
+
b.hooks = %i[post_create post_update]
|
37
40
|
end
|
38
41
|
end
|
39
42
|
|
@@ -53,18 +56,16 @@ module Moonshot
|
|
53
56
|
return if @target_bucket.nil?
|
54
57
|
|
55
58
|
resources.ilog.start("#{log_message} in progress.") do |s|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
zip_out.close unless zip_out.nil?
|
67
|
-
end
|
59
|
+
tar_out = tar(@files)
|
60
|
+
zip_out = zip(tar_out)
|
61
|
+
upload(zip_out)
|
62
|
+
|
63
|
+
s.success("#{log_message} succeeded.")
|
64
|
+
rescue StandardError => e
|
65
|
+
s.failure("#{log_message} failed: #{e}")
|
66
|
+
ensure
|
67
|
+
tar_out&.close
|
68
|
+
zip_out&.close
|
68
69
|
end
|
69
70
|
end
|
70
71
|
|
@@ -110,7 +111,7 @@ module Moonshot
|
|
110
111
|
|
111
112
|
# adding template file
|
112
113
|
if @backup_template
|
113
|
-
template_file_path = render('cloud_formation
|
114
|
+
template_file_path = render('cloud_formation/%<app_name>s.json')
|
114
115
|
add_file_to_tar(writer, template_file_path)
|
115
116
|
end
|
116
117
|
end
|
@@ -123,12 +124,10 @@ module Moonshot
|
|
123
124
|
# @param writer [TarWriter]
|
124
125
|
# @param file_name [String]
|
125
126
|
def add_file_to_tar(writer, file_name)
|
126
|
-
writer.add_file(File.basename(file_name),
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
warn "'#{file_name}' was not found."
|
131
|
-
end
|
127
|
+
writer.add_file(File.basename(file_name), 0o644) do |io|
|
128
|
+
File.open(file_name, 'r') { |f| io.write(f.read) }
|
129
|
+
rescue Errno::ENOENT
|
130
|
+
warn "'#{file_name}' was not found."
|
132
131
|
end
|
133
132
|
end
|
134
133
|
|
@@ -139,7 +138,7 @@ module Moonshot
|
|
139
138
|
# @param target_filename [String]
|
140
139
|
# @param content [String]
|
141
140
|
def add_str_to_tar(writer, target_filename, content)
|
142
|
-
writer.add_file(File.basename(target_filename),
|
141
|
+
writer.add_file(File.basename(target_filename), 0o644) do |io|
|
143
142
|
io.write(content.to_yaml)
|
144
143
|
end
|
145
144
|
end
|
@@ -196,17 +195,12 @@ module Moonshot
|
|
196
195
|
end
|
197
196
|
|
198
197
|
def define_bucket
|
199
|
-
case
|
200
198
|
# returning already calculated bucket name
|
201
|
-
|
202
|
-
@target_bucket
|
199
|
+
return @target_bucket if @target_bucket
|
203
200
|
# single bucket for all accounts
|
204
|
-
|
205
|
-
@bucket
|
201
|
+
return @bucket if @bucket
|
206
202
|
# calculating bucket based on account name
|
207
|
-
|
208
|
-
bucket_by_account(iam_account)
|
209
|
-
end
|
203
|
+
return bucket_by_account(iam_account) if @buckets # rubocop:disable Style/RedundantReturn
|
210
204
|
end
|
211
205
|
|
212
206
|
def bucket_by_account(account)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Moonshot
|
2
4
|
module Plugins
|
3
5
|
# Plugin to ensure CodeDeploy has all necessary S3 buckets created.
|
@@ -33,11 +35,11 @@ module Moonshot
|
|
33
35
|
# Create an S3 bucket in each supported region for CodeDeploy
|
34
36
|
def setup_code_deploy_s3_buckets
|
35
37
|
@regions.uniq.each do |region|
|
36
|
-
client = s3_client(region:
|
38
|
+
client = s3_client(region:)
|
37
39
|
name = bucket_name(region)
|
38
40
|
bucket = Aws::S3::Bucket.new(
|
39
41
|
name,
|
40
|
-
client:
|
42
|
+
client:
|
41
43
|
)
|
42
44
|
bucket.create unless bucket.exists?
|
43
45
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Moonshot
|
4
|
+
module Plugins
|
5
|
+
class DynamicTemplate
|
6
|
+
def initialize(source:, parameters:, destination:)
|
7
|
+
@dynamic_template = ::Moonshot::DynamicTemplate.new(
|
8
|
+
source:,
|
9
|
+
parameters:,
|
10
|
+
destination:
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
def run_hook
|
15
|
+
@dynamic_template.process
|
16
|
+
end
|
17
|
+
|
18
|
+
def cli_hook(parser)
|
19
|
+
parser.on('--template-file=FILE', 'Override the path to the CloudFormation template.') do |v|
|
20
|
+
@dynamic_template.destination = v
|
21
|
+
Moonshot.config.template_file = v
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Moonshot hooks to trigger this plugin.
|
26
|
+
alias setup_create run_hook
|
27
|
+
alias setup_update run_hook
|
28
|
+
alias setup_delete run_hook
|
29
|
+
|
30
|
+
# Moonshot hooks to add CLI options.
|
31
|
+
alias create_cli_hook cli_hook
|
32
|
+
alias delete_cli_hook cli_hook
|
33
|
+
alias update_cli_hook cli_hook
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,3 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../moonshot/stack'
|
4
|
+
|
1
5
|
module Moonshot
|
2
6
|
module Plugins
|
3
7
|
class EncryptedParameters
|
@@ -5,16 +9,33 @@ module Moonshot
|
|
5
9
|
class KmsKey
|
6
10
|
attr_reader :arn
|
7
11
|
|
12
|
+
class << self
|
13
|
+
def create
|
14
|
+
standard_tags = stack_tags
|
15
|
+
resp = Aws::KMS::Client.new.create_key({
|
16
|
+
tags: standard_tags # An array of tags.
|
17
|
+
})
|
18
|
+
arn = resp.key_metadata.arn
|
19
|
+
new(arn)
|
20
|
+
end
|
21
|
+
|
22
|
+
def stack_tags
|
23
|
+
tags = Moonshot::Stack.make_tags(Moonshot.config)
|
24
|
+
tags.map { |tag| { tag_key: tag[:key], tag_value: tag[:value] } }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
8
28
|
def initialize(arn)
|
9
29
|
@arn = arn
|
10
30
|
@kms_client = Aws::KMS::Client.new
|
11
31
|
end
|
12
32
|
|
13
|
-
def
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
33
|
+
def update
|
34
|
+
standard_tags = self.class.stack_tags
|
35
|
+
@kms_client.tag_resource({
|
36
|
+
key_id: @arn, # arn of the CMK being tagged
|
37
|
+
tags: standard_tags # An array of tags.
|
38
|
+
})
|
18
39
|
end
|
19
40
|
|
20
41
|
def delete
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# This plugin encrypts parameters of the stack using a KMS Key,
|
2
4
|
# storing and passing the key used to the stack as a parameter as
|
3
5
|
# well. The resources in the stack can then use that KMS Key to
|
@@ -96,13 +98,15 @@ module Moonshot
|
|
96
98
|
|
97
99
|
@ilog.start_threaded "Checking for KMS Key #{@kms_key_parameter_name}" do |s|
|
98
100
|
if Moonshot.config.parameters.key?(@kms_key_parameter_name)
|
99
|
-
if
|
101
|
+
if Moonshot.config.parameters[@kms_key_parameter_name].value == 'Auto'
|
100
102
|
s.continue "Auto-generating KMS Key for #{@kms_key_parameter_name.blue}... "
|
101
103
|
key_arn = KmsKey.create.arn
|
102
104
|
Moonshot.config.parameters[@kms_key_parameter_name].set(key_arn)
|
103
105
|
s.success "Created a new KMS Key for #{@kms_key_parameter_name.blue}!"
|
104
106
|
else
|
105
|
-
|
107
|
+
kms=KmsKey.new(Moonshot.config.parameters[@kms_key_parameter_name].value) # rubocop:disable Style/SpaceAroundOperators
|
108
|
+
key_arn = kms.arn
|
109
|
+
kms.update
|
106
110
|
s.success "Using existing KMS Key for #{@kms_key_parameter_name.blue}!"
|
107
111
|
end
|
108
112
|
end
|