lono 8.0.0.pre.rc1 → 8.0.0.pre.rc4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (218) hide show
  1. checksums.yaml +4 -4
  2. data/.cody/acceptance/bin/build.sh +5 -5
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
  4. data/.github/ISSUE_TEMPLATE/documentation.md +12 -0
  5. data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
  6. data/.github/ISSUE_TEMPLATE/question.md +14 -0
  7. data/.github/ISSUE_TEMPLATE.md +7 -0
  8. data/.github/PULL_REQUEST_TEMPLATE.md +50 -0
  9. data/CHANGELOG.md +59 -2
  10. data/Gemfile +1 -3
  11. data/README.md +2 -7
  12. data/lib/lono/app/callable_option/concern.rb +12 -0
  13. data/lib/lono/app/callable_option.rb +56 -0
  14. data/lib/lono/app.rb +56 -20
  15. data/lib/lono/autoloader.rb +1 -0
  16. data/lib/lono/aws_services/helper.rb +0 -2
  17. data/lib/lono/blueprint.rb +1 -18
  18. data/lib/lono/builder/allow/base.rb +54 -0
  19. data/lib/lono/builder/allow/env.rb +17 -0
  20. data/lib/lono/builder/allow/region.rb +20 -0
  21. data/lib/lono/builder/allow.rb +8 -0
  22. data/lib/lono/builder/configset/combiner.rb +145 -0
  23. data/lib/lono/builder/configset/definition/base.rb +47 -0
  24. data/lib/lono/builder/configset/definition/context.rb +70 -0
  25. data/lib/lono/{configset/strategy/helpers/dsl → builder/configset/definition/dsl/syntax}/auth.rb +1 -1
  26. data/lib/lono/builder/configset/definition/dsl/syntax/content.rb +22 -0
  27. data/lib/lono/{configset/strategy/helpers/dsl/syntax.rb → builder/configset/definition/dsl/syntax/core.rb} +15 -9
  28. data/lib/lono/{configset/strategy/helpers/dsl → builder/configset/definition/dsl/syntax}/package.rb +1 -1
  29. data/lib/lono/builder/configset/definition/dsl/syntax.rb +5 -0
  30. data/lib/lono/{configset/strategy → builder/configset/definition}/dsl.rb +10 -14
  31. data/lib/lono/{configset/strategy → builder/configset/definition}/erb.rb +13 -16
  32. data/lib/lono/builder/configset/definition.rb +18 -0
  33. data/lib/lono/builder/configset/evaluator.rb +10 -0
  34. data/lib/lono/builder/configset/registration.rb +35 -0
  35. data/lib/lono/builder/context.rb +33 -18
  36. data/lib/lono/builder/dsl/evaluator.rb +45 -0
  37. data/lib/lono/builder/dsl/finalizer/base.rb +8 -0
  38. data/lib/lono/builder/dsl/finalizer/configsets.rb +20 -0
  39. data/lib/lono/builder/dsl/finalizer/files/base.rb +4 -0
  40. data/lib/lono/builder/dsl/finalizer/files/build.rb +50 -0
  41. data/lib/lono/builder/dsl/finalizer/files/replace.rb +36 -0
  42. data/lib/lono/builder/dsl/finalizer/files.rb +9 -0
  43. data/lib/lono/builder/{template/dsl → dsl}/finalizer/parameter_groups.rb +6 -5
  44. data/lib/lono/builder/dsl/finalizer.rb +15 -0
  45. data/lib/lono/builder/{template/dsl/evaluator/helpers/ec2_helper.rb → dsl/helpers/ec2.rb} +3 -3
  46. data/lib/lono/builder/dsl/helpers/files.rb +7 -0
  47. data/lib/lono/builder/{template/helpers.rb → dsl/helpers/partials.rb} +48 -57
  48. data/lib/lono/builder/dsl/helpers/s3.rb +14 -0
  49. data/lib/lono/builder/{context/ssm_fetcher.rb → dsl/helpers/ssm/fetcher.rb} +5 -3
  50. data/lib/lono/builder/{context/helpers.rb → dsl/helpers/ssm.rb} +3 -3
  51. data/lib/lono/builder/{template/dsl/evaluator/helpers/stack_helper.rb → dsl/helpers/stack.rb} +6 -6
  52. data/lib/lono/builder/{template/dsl/evaluator/helpers/tags_helper.rb → dsl/helpers/tags.rb} +2 -2
  53. data/lib/lono/builder/dsl/helpers/template_file.rb +66 -0
  54. data/lib/lono/builder/dsl/helpers.rb +5 -0
  55. data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/base.rb +4 -5
  56. data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/condition.rb +1 -1
  57. data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/mapping.rb +1 -1
  58. data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/output.rb +1 -1
  59. data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/parameter.rb +1 -1
  60. data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/resource/property_mover.rb +12 -2
  61. data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/resource.rb +1 -1
  62. data/lib/lono/builder/{template/dsl/evaluator/section → dsl/syntax/core}/section.rb +1 -1
  63. data/lib/lono/builder/dsl/syntax/core/squeezer.rb +40 -0
  64. data/lib/lono/builder/{template/dsl/evaluator/section/methods.rb → dsl/syntax/core.rb} +2 -2
  65. data/lib/lono/builder/{template/dsl/evaluator → dsl/syntax}/fn.rb +1 -3
  66. data/lib/lono/builder/{template/dsl/evaluator → dsl}/syntax/parameter_group.rb +1 -1
  67. data/lib/lono/builder/dsl/syntax.rb +9 -0
  68. data/lib/lono/builder/{template/dsl.rb → dsl.rb} +2 -2
  69. data/lib/lono/builder/param.rb +5 -2
  70. data/lib/lono/builder/template/upload.rb +2 -15
  71. data/lib/lono/builder/template.rb +1 -3
  72. data/lib/lono/builder/{template/dsl/evaluator → util}/stringify.rb +1 -1
  73. data/lib/lono/builder.rb +39 -0
  74. data/lib/lono/bundler/component/props/extension.rb +0 -1
  75. data/lib/lono/bundler/extract/tar.rb +0 -1
  76. data/lib/lono/bundler/util/git.rb +18 -16
  77. data/lib/lono/cfn/base.rb +2 -2
  78. data/lib/lono/cfn/cancel.rb +5 -5
  79. data/lib/lono/cfn/concerns/build.rb +1 -1
  80. data/lib/lono/cfn/delete.rb +5 -2
  81. data/lib/lono/cfn/deploy/iam.rb +1 -2
  82. data/lib/lono/cfn/deploy/rollback.rb +1 -3
  83. data/lib/lono/cfn/deploy.rb +46 -5
  84. data/lib/lono/cfn/download.rb +0 -1
  85. data/lib/lono/cfn/plan/changeset.rb +3 -3
  86. data/lib/lono/cfn/plan/diff/data.rb +11 -1
  87. data/lib/lono/cfn/plan/diff/file.rb +2 -1
  88. data/lib/lono/cfn/plan/param.rb +1 -1
  89. data/lib/lono/cfn/plan/template.rb +2 -2
  90. data/lib/lono/cfn/plan.rb +1 -0
  91. data/lib/lono/cli/abstract.rb +0 -6
  92. data/lib/lono/cli/base.rb +6 -3
  93. data/lib/lono/cli/clean.rb +3 -2
  94. data/lib/lono/cli/help/cfn/status.md +0 -1
  95. data/lib/lono/cli/help/new/helper.md +27 -0
  96. data/lib/lono/cli/help/new/hook.md +14 -0
  97. data/lib/lono/cli/help/new/project.md +3 -10
  98. data/lib/lono/cli/help/seed.md +22 -21
  99. data/lib/lono/cli/iam.rb +27 -0
  100. data/lib/lono/cli/list.rb +3 -6
  101. data/lib/lono/cli/new/blueprint.rb +3 -9
  102. data/lib/lono/cli/new/configset.rb +11 -44
  103. data/lib/lono/cli/new/helper.rb +19 -11
  104. data/lib/lono/cli/new/hook.rb +32 -0
  105. data/lib/lono/cli/new/sequence.rb +6 -1
  106. data/lib/lono/cli/new.rb +9 -9
  107. data/lib/lono/cli/s3.rb +3 -3
  108. data/lib/lono/cli/script/build.rb +0 -5
  109. data/lib/lono/cli/status.rb +18 -0
  110. data/lib/lono/{inspector → cli}/summary.rb +23 -33
  111. data/lib/lono/cli.rb +16 -16
  112. data/lib/lono/command.rb +28 -2
  113. data/lib/lono/component.rb +29 -0
  114. data/lib/lono/concerns/aws_info.rb +14 -0
  115. data/lib/lono/concerns/names.rb +9 -0
  116. data/lib/lono/configset.rb +17 -0
  117. data/lib/lono/core.rb +11 -1
  118. data/lib/lono/ext/bundler.rb +7 -0
  119. data/lib/lono/ext/core/module.rb +31 -0
  120. data/lib/lono/ext/core/object.rb +32 -0
  121. data/lib/lono/ext/core/string.rb +9 -0
  122. data/lib/lono/ext.rb +4 -0
  123. data/lib/lono/files/base.rb +12 -0
  124. data/lib/lono/{utils → files/builder/lambda_layer}/rsync.rb +3 -5
  125. data/lib/lono/{app_file/build → files/builder}/lambda_layer/ruby_packager.rb +104 -79
  126. data/lib/lono/files/builder/lambda_layer/ruby_version.rb +38 -0
  127. data/lib/lono/files/builder/lambda_layer.rb +17 -0
  128. data/lib/lono/files/builder.rb +37 -0
  129. data/lib/lono/files/compressor.rb +53 -0
  130. data/lib/lono/files/concerns/post_processing.rb +52 -0
  131. data/lib/lono/files/concerns/registration.rb +16 -0
  132. data/lib/lono/files/registry.rb +6 -0
  133. data/lib/lono/files.rb +41 -0
  134. data/lib/lono/hooks/builder.rb +50 -0
  135. data/lib/lono/hooks/concern.rb +9 -0
  136. data/lib/lono/hooks/dsl.rb +20 -0
  137. data/lib/lono/hooks/runner.rb +46 -0
  138. data/lib/lono/layering/layer.rb +64 -56
  139. data/lib/lono/logger.rb +2 -3
  140. data/lib/lono/names.rb +7 -10
  141. data/lib/lono/s3/bucket.rb +43 -37
  142. data/lib/lono/s3/rollback.rb +8 -0
  143. data/lib/lono/s3/uploader.rb +33 -28
  144. data/lib/lono/script/build.rb +0 -5
  145. data/lib/lono/seeder.rb +38 -29
  146. data/lib/lono/user_data.rb +3 -1
  147. data/lib/lono/utils/sh.rb +32 -0
  148. data/lib/lono/utils.rb +5 -0
  149. data/lib/lono/version.rb +1 -1
  150. data/lib/lono/yamler/validator.rb +7 -22
  151. data/lib/lono.rb +8 -0
  152. data/lib/templates/configset/configset.rb +2 -16
  153. data/lib/templates/examples/configset/configset.rb +16 -0
  154. data/lib/templates/helper/%underscore_name%_helper.rb.tt +1 -1
  155. data/lib/templates/hook/config/hooks.rb.tt +14 -0
  156. data/lono.gemspec +1 -1
  157. metadata +99 -93
  158. data/lib/lono/app_file/base.rb +0 -28
  159. data/lib/lono/app_file/build/lambda_layer.rb +0 -20
  160. data/lib/lono/app_file/build.rb +0 -79
  161. data/lib/lono/app_file/registry/item.rb +0 -24
  162. data/lib/lono/app_file/registry.rb +0 -16
  163. data/lib/lono/app_file/upload.rb +0 -12
  164. data/lib/lono/builder/context/loader/load_files.rb +0 -23
  165. data/lib/lono/builder/context/loader.rb +0 -35
  166. data/lib/lono/builder/context/params.rb +0 -7
  167. data/lib/lono/builder/template/configset_injector.rb +0 -52
  168. data/lib/lono/builder/template/dsl/evaluator/helpers/core_helper.rb +0 -14
  169. data/lib/lono/builder/template/dsl/evaluator/helpers/file_helper.rb +0 -44
  170. data/lib/lono/builder/template/dsl/evaluator/helpers/s3_helper.rb +0 -16
  171. data/lib/lono/builder/template/dsl/evaluator/helpers.rb +0 -16
  172. data/lib/lono/builder/template/dsl/evaluator/squeezer.rb +0 -24
  173. data/lib/lono/builder/template/dsl/evaluator/syntax/extend_with.rb +0 -9
  174. data/lib/lono/builder/template/dsl/evaluator/syntax.rb +0 -11
  175. data/lib/lono/builder/template/dsl/evaluator.rb +0 -45
  176. data/lib/lono/builder/template/dsl/finalizer.rb +0 -12
  177. data/lib/lono/builder/template/evaluate.rb +0 -52
  178. data/lib/lono/builder/template/post_processor.rb +0 -67
  179. data/lib/lono/cli/build.rb +0 -101
  180. data/lib/lono/cli/code.rb +0 -22
  181. data/lib/lono/cli/help/blueprint/new.md +0 -56
  182. data/lib/lono/cli/new/extension.rb +0 -57
  183. data/lib/lono/configset/builder.rb +0 -59
  184. data/lib/lono/configset/combiner.rb +0 -164
  185. data/lib/lono/configset/evaluate_file.rb +0 -8
  186. data/lib/lono/configset/meta/dsl.rb +0 -12
  187. data/lib/lono/configset/meta.rb +0 -19
  188. data/lib/lono/configset/s3_file/build.rb +0 -34
  189. data/lib/lono/configset/s3_file/item.rb +0 -38
  190. data/lib/lono/configset/s3_file/registry.rb +0 -12
  191. data/lib/lono/configset/s3_file/upload.rb +0 -12
  192. data/lib/lono/configset/strategy/base.rb +0 -83
  193. data/lib/lono/configset/strategy/helpers/dsl/core.rb +0 -18
  194. data/lib/lono/configset/strategy/helpers/dsl.rb +0 -8
  195. data/lib/lono/configset/strategy/helpers/erb.rb +0 -9
  196. data/lib/lono/extensions/dsl.rb +0 -8
  197. data/lib/lono/extensions/loader.rb +0 -19
  198. data/lib/lono/extensions.rb +0 -18
  199. data/lib/lono/importer/base.rb +0 -48
  200. data/lib/lono/importer/converter.rb +0 -19
  201. data/lib/lono/importer/download.rb +0 -46
  202. data/lib/lono/importer/dsl.rb +0 -36
  203. data/lib/lono/importer/params.rb +0 -56
  204. data/lib/lono/importer/service/coder.rb +0 -81
  205. data/lib/lono/inspector/base.rb +0 -32
  206. data/lib/lono/lookup.rb +0 -12
  207. data/lib/lono/seeder/service_role.rb +0 -11
  208. data/lib/lono/utils/context.rb +0 -15
  209. data/lib/lono/utils/item/file_methods.rb +0 -29
  210. data/lib/lono/utils/item/zip.rb +0 -42
  211. data/lib/templates/extension/lib/%extension_name%/autoloader.rb.tt +0 -23
  212. data/lib/templates/extension/lib/%extension_name%/helpers/mappings.rb.tt +0 -24
  213. data/lib/templates/extension/lib/%extension_name%/helpers/outputs.rb.tt +0 -7
  214. data/lib/templates/extension/lib/%extension_name%/helpers/parameters.rb.tt +0 -10
  215. data/lib/templates/extension/lib/%extension_name%/helpers/resources/resource.rb.tt +0 -4
  216. data/lib/templates/extension/lib/%extension_name%/helpers/variables.rb.tt +0 -6
  217. data/lib/templates/extension/lib/%extension_name%/version.rb.tt +0 -3
  218. data/lib/templates/extension/lib/%extension_name%.rb.tt +0 -8
@@ -0,0 +1,50 @@
1
+ module Lono::Hooks
2
+ class Builder
3
+ extend Memoist
4
+ include Dsl
5
+ include DslEvaluator
6
+ include Lono::Utils
7
+
8
+ # IE: dsl_file: config/hooks.rb
9
+ attr_accessor :name
10
+ def initialize(blueprint, name)
11
+ @blueprint, @name = blueprint, name
12
+ @hooks = {before: {}, after: {}}
13
+ end
14
+
15
+ def build
16
+ evaluate_file("#{Lono.root}/config/hooks.rb")
17
+ evaluate_file("#{@blueprint.root}/config/hooks.rb")
18
+ @hooks.deep_stringify_keys!
19
+ end
20
+ memoize :build
21
+
22
+ def run_hooks
23
+ build
24
+ run_each_hook("before")
25
+ out = yield if block_given?
26
+ run_each_hook("after")
27
+ out
28
+ end
29
+
30
+ def run_each_hook(type)
31
+ hooks = @hooks.dig(type, @name) || []
32
+ hooks.each do |hook|
33
+ run_hook(type, hook)
34
+ end
35
+ end
36
+
37
+ def run_hook(type, hook)
38
+ return unless run?(hook)
39
+
40
+ id = "#{type} #{@name}"
41
+ label = " label: #{hook["label"]}" if hook["label"]
42
+ logger.info "Hook: Running #{id} hook#{label}".color(:cyan) if Lono.config.hooks.show
43
+ Runner.new(@blueprint, hook).run
44
+ end
45
+
46
+ def run?(hook)
47
+ !!hook["execute"]
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,9 @@
1
+ module Lono::Hooks
2
+ module Concern
3
+ def run_hooks(name, &block)
4
+ hooks = Builder.new(@blueprint, name)
5
+ hooks.build # build hooks
6
+ hooks.run_hooks(&block)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ module Lono::Hooks
2
+ module Dsl
3
+ def before(*commands, **props)
4
+ commands.each do |name|
5
+ each_hook(:before, name, props)
6
+ end
7
+ end
8
+
9
+ def after(*commands, **props)
10
+ commands.each do |name|
11
+ each_hook(:after, name, props)
12
+ end
13
+ end
14
+
15
+ def each_hook(type, name, props={})
16
+ @hooks[type][name] ||= []
17
+ @hooks[type][name] << props
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,46 @@
1
+ module Lono::Hooks
2
+ class Runner
3
+ include Lono::Utils
4
+
5
+ # exposing blueprint and hook so lono hooks have access to them via runner context. IE:
6
+ #
7
+ # class EnvExporter
8
+ # def call(runner)
9
+ # puts "runner.hook #{runner.hook}"
10
+ # end
11
+ # end
12
+ #
13
+ # Docs: http://lono.cloud/docs/config/hooks/ruby/#method-argument
14
+ #
15
+ attr_reader :blueprint, :hook
16
+ def initialize(blueprint, hook)
17
+ @blueprint, @hook = blueprint, hook
18
+ @execute = @hook["execute"]
19
+ end
20
+
21
+ def run
22
+ case @execute
23
+ when String
24
+ sh(@execute, exit_on_fail: @hook["exit_on_fail"])
25
+ when -> (e) { e.respond_to?(:public_instance_methods) && e.public_instance_methods.include?(:call) }
26
+ executor = @execute.new
27
+ when -> (e) { e.respond_to?(:call) }
28
+ executor = @execute
29
+ else
30
+ logger.warn "WARN: execute option not set for hook: #{@hook.inspect}"
31
+ end
32
+
33
+ return unless executor
34
+
35
+ meth = executor.method(:call)
36
+ case meth.arity
37
+ when 0
38
+ executor.call # backwards compatibility
39
+ when 1
40
+ executor.call(self)
41
+ else
42
+ raise "The #{executor} call method definition has been more than 1 arguments and is not supported"
43
+ end
44
+ end
45
+ end
46
+ end
@@ -14,10 +14,9 @@ module Lono::Layering
14
14
  include Lono::Layering
15
15
  include Lono::Utils::Logging
16
16
  include Lono::Utils::Pretty
17
+ include Lono::Concerns::AwsInfo
17
18
  extend Memoist
18
19
 
19
- delegate :region, to: :aws_data
20
-
21
20
  def initialize(blueprint, type)
22
21
  @blueprint, @type = blueprint, type
23
22
  end
@@ -32,30 +31,18 @@ module Lono::Layering
32
31
  paths
33
32
  end
34
33
 
35
- def full_layering
36
- # layers defined in Lono::Layering module
37
- all = layers.map { |layer| layer.sub(/\/$/,'') } # strip trailing slash
38
- all.inject([]) do |sum, layer|
39
- sum += layer_levels(layer) unless layer.nil?
40
- sum
34
+ def full_layers(dir)
35
+ layers = layer_levels("#{dir}/#{@type}") # root
36
+ if Lono.role
37
+ layers += layer_levels("#{dir}/#{@type}/#{Lono.role}")
41
38
  end
42
- end
43
-
44
- # interface method
45
- def main_layers
46
- [
47
- '',
48
- region,
49
- account,
50
- "#{account}/#{region}",
51
- ]
52
- end
53
-
54
- def account
55
- name = aws_data.account
56
- # friendly name mapping
57
- names = Lono.config.layering.names.stringify_keys
58
- names[name] || name
39
+ if Lono.app
40
+ layers += layer_levels("#{dir}/#{@type}/#{Lono.app}")
41
+ end
42
+ if Lono.app && Lono.role
43
+ layers += layer_levels("#{dir}/#{@type}/#{Lono.app}/#{Lono.role}")
44
+ end
45
+ layers
59
46
  end
60
47
 
61
48
  # adds prefix and to each layer pair that has base and Lono.env. IE:
@@ -63,64 +50,85 @@ module Lono::Layering
63
50
  # "#{prefix}/base"
64
51
  # "#{prefix}/#{Lono.env}"
65
52
  #
53
+ # Params Layers:
54
+ # config/blueprints/demo/params/txt
55
+ # config/blueprints/demo/params/base.txt
56
+ # config/blueprints/demo/params/dev.txt
66
57
  def layer_levels(prefix=nil)
67
- levels = ["base", Lono.env]
58
+ levels = ["", "base", Lono.env]
59
+ levels << "#{Lono.env}-#{Lono.extra}" if Lono.extra
68
60
  levels.map! do |i|
69
- # base layer has prefix of '', reject with blank so it doesnt produce '//'
70
61
  [prefix, i].reject(&:blank?).join('/')
71
62
  end
72
- levels.unshift(prefix) # unless prefix.blank? # IE: params/us-west-2.txt
63
+ levels.map! { |level| level.sub(/\/$/,'') } # strip trailing slash
64
+
65
+ # layers = pre_layers + main_layers + post_layers
66
+ levels = layers.inject([]) do |sum, layer|
67
+ layer_levels = levels.map do |level|
68
+ [level, layer].reject(&:blank?).join('/')
69
+ end
70
+ sum += layer_levels
71
+ sum
72
+ end
73
+
73
74
  levels
74
75
  end
75
76
 
77
+ # Interface method: layers = pre_layers + main_layers + post_layers
78
+ # Simple layering is default. Can set with:
79
+ #
80
+ # config.layering.mode = "simple" # simple of full
81
+ #
82
+ def main_layers
83
+ if Lono.config.layering.mode == "simple"
84
+ ['']
85
+ else # full
86
+ # includes region, account, and account/region layers
87
+ # More powerful but less used and more complex to understand
88
+ [
89
+ '',
90
+ region,
91
+ account,
92
+ "#{account}/#{region}",
93
+ ]
94
+ end
95
+ end
96
+
76
97
  def add_ext!(paths)
77
98
  exts = {
78
- params: "txt",
99
+ params: "env",
79
100
  vars: "rb",
80
101
  }
81
102
  ext = exts[@type.to_sym]
82
103
 
83
104
  paths.map! do |path|
84
- if path.include?("teams")
85
- puts "path: #{path}"
86
- end
87
-
88
- if path.ends_with?('/')
89
- "#{path.sub(/\/$/,'')}.#{ext}"
90
- else
91
- "#{path}.#{ext}"
92
- end
93
- end
94
- end
95
-
96
- def full_layers(dir)
97
- layers = full_layering.map do |layer|
98
- "#{dir}/#{@type}/#{layer}"
99
- end
100
- if Lono.app
101
- app_layers = full_layering.map do |layer|
102
- "#{dir}/#{@type}/#{Lono.app}/#{layer}"
103
- end
104
- layers += app_layers
105
+ path = path.sub(/\/$/,'') if path.ends_with?('/')
106
+ "#{path}.#{ext}"
105
107
  end
106
- layers
107
108
  end
108
109
 
109
110
  @@shown_layers = {}
110
111
  def show_layers(paths)
111
112
  return if @@shown_layers[@type]
112
113
  logger.debug "#{@type.capitalize} Layers:"
114
+ show = Lono.config.layering.show || ENV['LONO_LAYERS']
113
115
  paths.each do |path|
114
- logger.debug " #{pretty_path(path)}" if File.exist?(path) || ENV['LONO_SHOW_ALL_LAYERS']
116
+ # next if path.include?("app/blueprints/") # more useful to show only config layers
117
+ if ENV['LONO_LAYERS_ALL']
118
+ logger.info " #{pretty_path(path)}"
119
+ elsif show
120
+ logger.info " #{pretty_path(path)}" if File.exist?(path)
121
+ end
115
122
  end
116
123
  logger.debug ""
117
124
  @@shown_layers[@type] = true
118
125
  end
119
126
 
120
- private
121
- def aws_data
122
- AwsData.new
127
+ def account
128
+ name = aws_data.account
129
+ # friendly name mapping
130
+ names = Lono.config.layering.names.stringify_keys
131
+ names[name] || name
123
132
  end
124
- memoize :aws_data
125
133
  end
126
134
  end
data/lib/lono/logger.rb CHANGED
@@ -17,9 +17,7 @@ module Lono
17
17
  line =~ /\n$/ ? line : "#{line}\n"
18
18
  end
19
19
 
20
- # Used to allow terraform output to always go to stdout
21
- # Terraspace output goes to stderr by default
22
- # See: terraspace/shell.rb
20
+ # Used to allow output to always go to stdout
23
21
  def stdout(msg, newline: true)
24
22
  if newline
25
23
  puts msg
@@ -29,5 +27,6 @@ module Lono
29
27
  end
30
28
 
31
29
  public :print
30
+ public :printf
32
31
  end
33
32
  end
data/lib/lono/names.rb CHANGED
@@ -9,7 +9,7 @@ module Lono
9
9
  end
10
10
 
11
11
  def stack
12
- expansion(Lono.config.names.stack)
12
+ expansion(Lono.config.names.stack) # IE: :APP-:BLUEPRINT-:ENV
13
13
  end
14
14
  memoize :stack
15
15
 
@@ -21,30 +21,27 @@ module Lono
21
21
  vars.each do |var|
22
22
  string.gsub!(var, var_value(var))
23
23
  end
24
- strip(string)
24
+ cleanse(string)
25
25
  end
26
26
 
27
27
  def var_value(unexpanded)
28
28
  name = unexpanded.sub(':','').downcase
29
29
  if respond_to?(name)
30
- value = send(name).to_s
30
+ send(name).to_s # value
31
31
  else
32
32
  unexpanded
33
33
  end
34
34
  end
35
35
 
36
- def strip(string)
36
+ def cleanse(string)
37
37
  string.sub(/^-+/,'').sub(/-+$/,'') # remove leading and trailing -
38
38
  .gsub(%r{-+},'-') # remove double dashes are more. IE: -- => -
39
39
  .gsub('_','-') # underscores are not allowed in CloudFormation stack names
40
40
  end
41
41
 
42
- def app
43
- Lono.app
44
- end
45
-
46
- def env
47
- Lono.env
42
+ delegate :app, :role, :env, :extra, to: :lono
43
+ def lono
44
+ Lono
48
45
  end
49
46
  end
50
47
  end
@@ -1,41 +1,24 @@
1
1
  module Lono::S3
2
2
  class Bucket
3
- STACK_NAME = ENV['LONO_STACK_NAME'] || "lono"
4
- include Lono::AwsServices
5
- include Lono::Utils::Logging
6
3
  extend Lono::AwsServices
7
4
  extend Memoist
5
+ include Lono::AwsServices
6
+ include Lono::Cfn::Concerns
7
+ include Lono::Utils::Logging
8
+ include Lono::Utils::Sure
8
9
 
9
- class << self
10
- @@name = nil
11
- def name
12
- return @@name if @@name # only memoize once bucket has been created
13
-
14
- check_aws_setup!
15
-
16
- stack = new.find_stack
17
- return unless stack
18
-
19
- stack_resources = find_stack_resources(STACK_NAME)
20
- bucket = stack_resources.find { |r| r.logical_resource_id == "Bucket" }
21
- @@name = bucket.physical_resource_id # actual bucket name
22
- end
23
-
24
- def check_aws_setup!
25
- AwsSetup.new.check!
26
- end
27
- end
28
-
10
+ STACK_NAME = ENV['LONO_STACK_NAME'] || "lono"
29
11
  def initialize(options={})
30
12
  @options = options
31
13
  end
32
14
 
33
15
  def deploy
16
+ stack = find_stack
34
17
  if rollback.complete?
35
18
  logger.info "Existing '#{STACK_NAME}' stack in ROLLBACK_COMPLETE state. Deleting stack before continuing."
19
+ disable_termination_protection
36
20
  cfn.delete_stack(stack_name: STACK_NAME)
37
21
  status.wait
38
- status.reset
39
22
  stack = nil
40
23
  end
41
24
 
@@ -71,7 +54,6 @@ module Lono::S3
71
54
  enable_termination_protection: true,
72
55
  )
73
56
  success = status.wait
74
- status.reset
75
57
  unless success
76
58
  logger.info "ERROR: Unable to create lono stack with managed s3 bucket".color(:red)
77
59
  exit 1
@@ -89,12 +71,12 @@ module Lono::S3
89
71
  are_you_sure?
90
72
 
91
73
  logger.info "Deleting #{STACK_NAME} stack with the s3 bucket"
92
- disable_termination_protect
74
+ disable_termination_protection
93
75
  empty_bucket!
94
76
  cfn.delete_stack(stack_name: STACK_NAME)
95
77
  end
96
78
 
97
- def disable_termination_protect
79
+ def disable_termination_protection
98
80
  cfn.update_termination_protection(
99
81
  stack_name: STACK_NAME,
100
82
  enable_termination_protection: false,
@@ -111,7 +93,6 @@ module Lono::S3
111
93
  def status
112
94
  CfnStatus.new(STACK_NAME)
113
95
  end
114
- memoize :status
115
96
 
116
97
  private
117
98
 
@@ -135,20 +116,12 @@ module Lono::S3
135
116
 
136
117
 
137
118
  def are_you_sure?
138
- return true if @options[:yes]
139
-
140
119
  if bucket_name.nil?
141
120
  logger.info "The lono stack and s3 bucket does not exist."
142
121
  exit
143
122
  end
144
123
 
145
- logger.info "Are you yes you want the lono bucket #{bucket_name.color(:green)} to be emptied and deleted? (y/N)"
146
- yes = $stdin.gets.strip
147
- confirmed = yes =~ /^Y/i
148
- unless confirmed
149
- logger.info "Phew that was close."
150
- exit
151
- end
124
+ sure?("Will empty and delete bucket #{bucket_name.color(:green)}. Are you sure?")
152
125
  end
153
126
 
154
127
  def template_body
@@ -165,7 +138,40 @@ module Lono::S3
165
138
  Tags:
166
139
  - Key: Name
167
140
  Value: lono
141
+ Outputs:
142
+ Bucket:
143
+ Value:
144
+ Ref: Bucket
168
145
  YAML
169
146
  end
147
+
148
+ def rollback
149
+ Rollback.new(STACK_NAME)
150
+ end
151
+
152
+ class << self
153
+ @@name = nil
154
+ def name
155
+ return @@name if @@name # only memoize once bucket has been created
156
+
157
+ AwsSetup.new.check!
158
+
159
+ stack = new.find_stack
160
+ return unless stack
161
+
162
+ stack_resources = find_stack_resources(STACK_NAME)
163
+ bucket = stack_resources.find { |r| r.logical_resource_id == "Bucket" }
164
+ @@name = bucket.physical_resource_id # actual bucket name
165
+ end
166
+
167
+ @@ensure_exist = false
168
+ def ensure_exist
169
+ return if @@ensure_exist
170
+ bucket = Lono::S3::Bucket.new
171
+ return if bucket.exist?
172
+ bucket.deploy
173
+ @@ensure_exist = true
174
+ end
175
+ end
170
176
  end
171
177
  end
@@ -0,0 +1,8 @@
1
+ module Lono::S3
2
+ class Rollback < Lono::Cfn::Deploy::Rollback
3
+ # override initialize
4
+ def initialize(stack)
5
+ @stack = stack
6
+ end
7
+ end
8
+ end
@@ -3,53 +3,50 @@ module Lono::S3
3
3
  extend Memoist
4
4
  include Lono::AwsServices
5
5
  include Lono::Utils::Logging
6
+ include Lono::Utils::Pretty
6
7
 
7
- attr_reader :path
8
- def initialize(path, options={})
9
- @path, @options = path, options
8
+ attr_reader :local_path
9
+ def initialize(local_path, options={})
10
+ @local_path, @options = local_path, options
10
11
  @checksums = {}
11
12
  end
12
13
 
13
14
  # Inputs:
14
15
  #
15
- # path: can be full path or relative path
16
+ # local_path: can be full path or relative path
16
17
  #
17
18
  def upload
18
- path = @path.gsub("#{Lono.root}/",'') # remove Lono.root
19
- key = "#{Lono.env}/#{path}"
19
+ logger.debug "May upload #{local_path}"
20
+ logger.debug "To #{s3_path}"
20
21
 
21
- pretty_path = path.sub(/^\.\//, '')
22
- s3_path = "s3://#{s3_bucket}/#{key}"
23
-
24
- local_checksum = Digest::MD5.hexdigest(IO.read(@path))
25
- remote_checksum = remote_checksum(key)
22
+ local_checksum = Digest::MD5.hexdigest(IO.read(local_path))
26
23
  if local_checksum == remote_checksum
27
- logger.debug "Not modified: #{pretty_path} to #{s3_path}"
24
+ logger.debug "Not modified #{s3_path}"
28
25
  return # do not upload unless the checksum has changed
29
26
  else
30
27
  # Example output:
31
- # Uploaded: app/files/docker.yml to s3://boltops-dev/s3_folder/templates/development/docker.yml
32
- # Uploaded: app/files/ecs/private.yml to s3://boltops-dev/s3_folder/templates/development/ecs/private.yml
33
- message = "Uploading #{pretty_path} to #{s3_path}"
34
- logger.debug message
28
+ # Uploaded: files/ecs/private.yml to s3://bucket/output/demo/files/ecs/private.yml
29
+ logger.debug "Uploading #{pretty_path(local_path)} to #{s3_path}"
35
30
  end
36
31
 
37
32
  s3.put_object(
38
- body: IO.read(@path),
33
+ body: IO.read(local_path),
39
34
  bucket: s3_bucket,
40
- key: key,
35
+ key: s3_key,
41
36
  )
42
37
  end
43
38
 
44
39
  # https://s3.amazonaws.com/mybucket/development/output/blueprint/templates/blueprint.yml
45
40
  def https_url
46
- key = "#{Lono.env}/#{@path}"
47
- "https://s3.amazonaws.com/#{s3_bucket}/#{key}"
41
+ "https://s3.amazonaws.com/#{s3_bucket}/#{s3_key}"
48
42
  end
49
43
 
50
44
  def presigned_url
51
- key = "#{Lono.env}/#{@path}"
52
- s3_presigner.presigned_url(:get_object, bucket: s3_bucket, key: key)
45
+ # Here because want to lazily create this bucket only after user has confirmed lono up
46
+ # This is the first time bucket needs to exists
47
+ # Called at Deploy::Opts#template_url which gets passed to cfn.create and calls template_url
48
+ Lono::S3::Bucket.ensure_exist
49
+ s3_presigner.presigned_url(:get_object, bucket: s3_bucket, key: s3_key)
53
50
  end
54
51
 
55
52
  # used for file_s3_key helper
@@ -62,7 +59,7 @@ module Lono::S3
62
59
  resp = s3.list_objects(bucket: s3_bucket, prefix: prefix)
63
60
  resp.contents.each do |object|
64
61
  # key does not include the bucket name
65
- # full path = s3://my-bucket/s3_folder/files/production/my-template.yml
62
+ # full path = s3://my-bucket/files/production/my-template.yml
66
63
  # key = s3_folder/files/production/my-template.yml
67
64
  # etag is the checksum as long as the file is not a multi-part file upload
68
65
  # it has extra double quotes wrapped around it.
@@ -74,17 +71,25 @@ module Lono::S3
74
71
  memoize :load_checksums!
75
72
 
76
73
  # key example: cloudformation/production/files/lifecycle-0719ab81.zip
77
- # s3 path: s3://boltops-dev/cloudformation/production/files/lifecycle-0719ab81.zip
78
- # s3_folder: s3://boltops-dev/cloudformation
79
- def remote_checksum(key)
80
- load_checksums!(key)
81
- @checksums[key]
74
+ # s3 path: s3://bucket/cloudformation/production/files/lifecycle-0719ab81.zip
75
+ # s3_folder: s3://bucket/cloudformation
76
+ def remote_checksum
77
+ load_checksums!(s3_key)
78
+ @checksums[s3_key]
82
79
  end
83
80
 
84
81
  def strip_surrounding_quotes(string)
85
82
  string.sub(/^"/,'').sub(/"$/,'')
86
83
  end
87
84
 
85
+ def s3_path
86
+ "s3://#{s3_bucket}/#{s3_key}"
87
+ end
88
+
89
+ def s3_key
90
+ "#{Lono.env}/#{pretty_path(local_path)}"
91
+ end
92
+
88
93
  def s3_bucket
89
94
  Lono::S3::Bucket.name
90
95
  end
@@ -63,10 +63,5 @@ module Lono::Script
63
63
  @md5sum ||= Digest::MD5.file("#{@blueprint.root}/scripts.tgz").to_s[0..7]
64
64
  end
65
65
 
66
- def sh(command)
67
- logger.info "=> #{command}"
68
- system command
69
- end
70
-
71
66
  end
72
67
  end