moonshot 0.7.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.
- checksums.yaml +7 -0
- data/lib/moonshot/artifact_repository/s3_bucket.rb +60 -0
- data/lib/moonshot/artifact_repository/s3_bucket_via_github_releases.rb +89 -0
- data/lib/moonshot/build_mechanism/github_release.rb +148 -0
- data/lib/moonshot/build_mechanism/script.rb +84 -0
- data/lib/moonshot/build_mechanism/travis_deploy.rb +70 -0
- data/lib/moonshot/build_mechanism/version_proxy.rb +55 -0
- data/lib/moonshot/cli.rb +146 -0
- data/lib/moonshot/controller.rb +151 -0
- data/lib/moonshot/controller_config.rb +25 -0
- data/lib/moonshot/creds_helper.rb +28 -0
- data/lib/moonshot/deployment_mechanism/code_deploy.rb +303 -0
- data/lib/moonshot/doctor_helper.rb +57 -0
- data/lib/moonshot/environment_parser.rb +32 -0
- data/lib/moonshot/interactive_logger_proxy.rb +49 -0
- data/lib/moonshot/resources.rb +13 -0
- data/lib/moonshot/resources_helper.rb +24 -0
- data/lib/moonshot/shell.rb +52 -0
- data/lib/moonshot/stack.rb +345 -0
- data/lib/moonshot/stack_asg_printer.rb +151 -0
- data/lib/moonshot/stack_config.rb +12 -0
- data/lib/moonshot/stack_events_poller.rb +56 -0
- data/lib/moonshot/stack_lister.rb +20 -0
- data/lib/moonshot/stack_output_printer.rb +16 -0
- data/lib/moonshot/stack_parameter_printer.rb +73 -0
- data/lib/moonshot/stack_template.rb +35 -0
- data/lib/moonshot/unicode_table.rb +63 -0
- data/lib/moonshot.rb +41 -0
- metadata +239 -0
@@ -0,0 +1,73 @@
|
|
1
|
+
module Moonshot
|
2
|
+
# Displays information about existing stack parameters to the user, with
|
3
|
+
# information on what a stack update would do.
|
4
|
+
class StackParameterPrinter
|
5
|
+
def initialize(stack, table)
|
6
|
+
@stack = stack
|
7
|
+
@table = table
|
8
|
+
end
|
9
|
+
|
10
|
+
def print
|
11
|
+
p_table = @table.add_leaf('Stack Parameters')
|
12
|
+
overrides = @stack.overrides
|
13
|
+
rows = @stack.parameters.sort.map do |key, value|
|
14
|
+
t_param = @stack.template.parameters.find do |p|
|
15
|
+
p.name == key
|
16
|
+
end
|
17
|
+
|
18
|
+
properties = determine_change(t_param ? t_param.default : nil,
|
19
|
+
overrides[key],
|
20
|
+
value)
|
21
|
+
|
22
|
+
[
|
23
|
+
"#{key}:",
|
24
|
+
format_value(value),
|
25
|
+
format_properties(properties)
|
26
|
+
]
|
27
|
+
end
|
28
|
+
|
29
|
+
p_table.add_table(rows)
|
30
|
+
end
|
31
|
+
|
32
|
+
def determine_change(default, override, current)
|
33
|
+
properties = []
|
34
|
+
|
35
|
+
# If there is a stack override, determine if it would change the current
|
36
|
+
# stack.
|
37
|
+
if override
|
38
|
+
properties << 'overridden'
|
39
|
+
if current == '****'
|
40
|
+
properties << 'may be updated, NoEcho set'
|
41
|
+
elsif override != current
|
42
|
+
properties << "would be updated to #{override}"
|
43
|
+
end
|
44
|
+
|
45
|
+
else
|
46
|
+
# Otherwise, compare the template default with the current value to
|
47
|
+
# determine outcome.
|
48
|
+
properties << 'default'
|
49
|
+
properties << "would be updated to #{default}" if default != current
|
50
|
+
end
|
51
|
+
|
52
|
+
properties
|
53
|
+
end
|
54
|
+
|
55
|
+
def format_properties(properties)
|
56
|
+
string = " (#{properties.join(', ')})"
|
57
|
+
|
58
|
+
if properties.any? { |p| p =~ /be updated/ }
|
59
|
+
string.yellow
|
60
|
+
else
|
61
|
+
string.green
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def format_value(value)
|
66
|
+
if value.size > 40
|
67
|
+
value[0..40] + '...'
|
68
|
+
else
|
69
|
+
value
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Moonshot
|
2
|
+
# A StackTemplate loads the JSON template from disk and stores information
|
3
|
+
# about it.
|
4
|
+
class StackTemplate
|
5
|
+
Parameter = Struct.new(:name, :default) do
|
6
|
+
def required?
|
7
|
+
default.nil?
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :body
|
12
|
+
|
13
|
+
def initialize(filename, log:)
|
14
|
+
@log = log
|
15
|
+
|
16
|
+
unless File.exist?(filename)
|
17
|
+
@log.error("Could not find CloudFormation template at #{filename}")
|
18
|
+
raise
|
19
|
+
end
|
20
|
+
|
21
|
+
@body = File.read(filename)
|
22
|
+
end
|
23
|
+
|
24
|
+
def parameters
|
25
|
+
JSON.parse(@body).fetch('Parameters', {}).map do |k, v|
|
26
|
+
Parameter.new(k, v['Default'])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Return a list of defined resource names in the template.
|
31
|
+
def resource_names
|
32
|
+
JSON.parse(@body).fetch('Resources', {}).keys
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'colorize'
|
4
|
+
|
5
|
+
module Moonshot
|
6
|
+
# A class for drawing hierarchical information using unicode lines.
|
7
|
+
class UnicodeTable
|
8
|
+
def initialize(name)
|
9
|
+
@name = name
|
10
|
+
@lines = []
|
11
|
+
@children = []
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_leaf(name)
|
15
|
+
new_leaf = UnicodeTable.new(name)
|
16
|
+
@children << new_leaf
|
17
|
+
new_leaf
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_line(line)
|
21
|
+
@lines << line
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_table(table)
|
26
|
+
# Calculate widths
|
27
|
+
widths = []
|
28
|
+
table.each do |line|
|
29
|
+
line.each_with_index do |col, i|
|
30
|
+
col = '?' unless col.respond_to?(:length)
|
31
|
+
widths[i] = [widths[i] || 0, col.length].max
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
format = widths.collect { |n| "%-#{n}s" }.join(' ') << "\n"
|
36
|
+
table.each { |line| add_line(format(format, *line)) }
|
37
|
+
end
|
38
|
+
|
39
|
+
def draw(depth = 1, first = true)
|
40
|
+
print first ? '┌' : '├'
|
41
|
+
print '─' * depth
|
42
|
+
puts ' ' << @name.light_black
|
43
|
+
@lines = [''] + @lines + ['']
|
44
|
+
@lines.each do |line|
|
45
|
+
puts '│' << (' ' * depth) << line
|
46
|
+
end
|
47
|
+
@children.each do |child|
|
48
|
+
child.draw(depth + 1, false)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Draw all children at the same level, for having multiple top-level
|
53
|
+
# peer leaves.
|
54
|
+
def draw_children
|
55
|
+
first = true
|
56
|
+
@children.each do |child|
|
57
|
+
child.draw(1, first)
|
58
|
+
first = false
|
59
|
+
end
|
60
|
+
puts '└──'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/moonshot.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'English'
|
2
|
+
require 'aws-sdk'
|
3
|
+
require 'logger'
|
4
|
+
require 'thor'
|
5
|
+
|
6
|
+
module Moonshot
|
7
|
+
module ArtifactRepository # rubocop:disable Documentation
|
8
|
+
end
|
9
|
+
module BuildMechanism # rubocop:disable Documentation
|
10
|
+
end
|
11
|
+
module DeploymentMechanism # rubocop:disable Documentation
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
[
|
16
|
+
# Helpers
|
17
|
+
'creds_helper',
|
18
|
+
'doctor_helper',
|
19
|
+
'resources',
|
20
|
+
'resources_helper',
|
21
|
+
'environment_parser',
|
22
|
+
|
23
|
+
# Core
|
24
|
+
'interactive_logger_proxy',
|
25
|
+
'controller',
|
26
|
+
'controller_config',
|
27
|
+
'cli',
|
28
|
+
'stack',
|
29
|
+
'stack_config',
|
30
|
+
'stack_lister',
|
31
|
+
'stack_events_poller',
|
32
|
+
|
33
|
+
# Built-in mechanisms
|
34
|
+
'artifact_repository/s3_bucket',
|
35
|
+
'artifact_repository/s3_bucket_via_github_releases',
|
36
|
+
'build_mechanism/script',
|
37
|
+
'build_mechanism/github_release',
|
38
|
+
'build_mechanism/travis_deploy',
|
39
|
+
'build_mechanism/version_proxy',
|
40
|
+
'deployment_mechanism/code_deploy'
|
41
|
+
].each { |f| require_relative "moonshot/#{f}" }
|
metadata
ADDED
@@ -0,0 +1,239 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: moonshot
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.7.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Cloud Engineering <engineering@acquia.com>
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: aws-sdk
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.2.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.2.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: colorize
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: highline
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.7.2
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.7.2
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: interactive-logger
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.1.1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.1.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rotp
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.1.1
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 2.1.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: ruby-duration
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 3.2.3
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 3.2.3
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: thor
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.19.1
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.19.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: semantic
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: vandamme
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rspec
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: simplecov
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: fakefs
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
description: A library for launching services into AWS.
|
182
|
+
email: engineering@acquia.com
|
183
|
+
executables: []
|
184
|
+
extensions: []
|
185
|
+
extra_rdoc_files: []
|
186
|
+
files:
|
187
|
+
- lib/moonshot.rb
|
188
|
+
- lib/moonshot/artifact_repository/s3_bucket.rb
|
189
|
+
- lib/moonshot/artifact_repository/s3_bucket_via_github_releases.rb
|
190
|
+
- lib/moonshot/build_mechanism/github_release.rb
|
191
|
+
- lib/moonshot/build_mechanism/script.rb
|
192
|
+
- lib/moonshot/build_mechanism/travis_deploy.rb
|
193
|
+
- lib/moonshot/build_mechanism/version_proxy.rb
|
194
|
+
- lib/moonshot/cli.rb
|
195
|
+
- lib/moonshot/controller.rb
|
196
|
+
- lib/moonshot/controller_config.rb
|
197
|
+
- lib/moonshot/creds_helper.rb
|
198
|
+
- lib/moonshot/deployment_mechanism/code_deploy.rb
|
199
|
+
- lib/moonshot/doctor_helper.rb
|
200
|
+
- lib/moonshot/environment_parser.rb
|
201
|
+
- lib/moonshot/interactive_logger_proxy.rb
|
202
|
+
- lib/moonshot/resources.rb
|
203
|
+
- lib/moonshot/resources_helper.rb
|
204
|
+
- lib/moonshot/shell.rb
|
205
|
+
- lib/moonshot/stack.rb
|
206
|
+
- lib/moonshot/stack_asg_printer.rb
|
207
|
+
- lib/moonshot/stack_config.rb
|
208
|
+
- lib/moonshot/stack_events_poller.rb
|
209
|
+
- lib/moonshot/stack_lister.rb
|
210
|
+
- lib/moonshot/stack_output_printer.rb
|
211
|
+
- lib/moonshot/stack_parameter_printer.rb
|
212
|
+
- lib/moonshot/stack_template.rb
|
213
|
+
- lib/moonshot/unicode_table.rb
|
214
|
+
homepage: https://github.com/acquia/moonshot
|
215
|
+
licenses:
|
216
|
+
- Apache-2.0
|
217
|
+
metadata: {}
|
218
|
+
post_install_message:
|
219
|
+
rdoc_options: []
|
220
|
+
require_paths:
|
221
|
+
- lib
|
222
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
223
|
+
requirements:
|
224
|
+
- - ">="
|
225
|
+
- !ruby/object:Gem::Version
|
226
|
+
version: '0'
|
227
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
228
|
+
requirements:
|
229
|
+
- - ">="
|
230
|
+
- !ruby/object:Gem::Version
|
231
|
+
version: '0'
|
232
|
+
requirements: []
|
233
|
+
rubyforge_project:
|
234
|
+
rubygems_version: 2.4.8
|
235
|
+
signing_key:
|
236
|
+
specification_version: 4
|
237
|
+
summary: A library for launching services into AWS
|
238
|
+
test_files: []
|
239
|
+
has_rdoc:
|