moonshot 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: