terraspace 2.1.5 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/lib/templates/base/project/config/app.rb +1 -1
- data/lib/terraspace/app.rb +3 -3
- data/lib/terraspace/compiler/erb/render.rb +7 -1
- data/lib/terraspace/compiler/erb/rewrite.rb +42 -0
- data/lib/terraspace/compiler/perform.rb +3 -0
- data/lib/terraspace/compiler/strategy/tfvar/layer.rb +4 -3
- data/lib/terraspace/core.rb +1 -1
- data/lib/terraspace/terraform/args/pass.rb +13 -2
- data/lib/terraspace/version.rb +1 -1
- data/spec/terraspace/compiler/erb/render_spec.rb +1 -1
- data/spec/terraspace/compiler/erb/rewrite_spec.rb +30 -0
- data/spec/terraspace/terraform/args/pass_spec.rb +13 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 672cf9e56e84babb2bc53f8e076a13cb51aa9741416fcd6128e66b3774d335fb
|
4
|
+
data.tar.gz: 10417698653e7ae38863e1c9d3a1fafebb2ea937693e8c5c0f65cb14e81b1f0b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fbb895751949a30c32caaadad94a7d24c711313ca3675bb849f8ec9ab04b21e00901051ba5914d2c6a9317cabd91345cf8efe2ed053b90f61bb56228117b2249
|
7
|
+
data.tar.gz: d2fcb5d16322d8a2c7bdf15be9d8108aefaee66505deb4c54acaad2339958d4a9cf4def684e4a08a44ff467f2ce9e7269a9d38924bf668634bdd93e3cd55d69d
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,21 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *loosely tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [2.2.0] - 2022-09-02
|
7
|
+
- [#261](https://github.com/boltops-tools/terraspace/pull/261) extra layer also process env-extra
|
8
|
+
- [#262](https://github.com/boltops-tools/terraspace/pull/262) improve graph dependency processing: replace tfvars so only output and depends_on are evaluated
|
9
|
+
- [#263](https://github.com/boltops-tools/terraspace/pull/263) layering small improvements
|
10
|
+
- layering small improvements: dont use layers that end with - only
|
11
|
+
- rename env var to TS_SHOW_ALL_LAYERS to TS_LAYERING_SHOW
|
12
|
+
|
13
|
+
## [2.1.7] - 2022-08-22
|
14
|
+
- [#259](https://github.com/boltops-tools/terraspace/pull/259) fix TS_PROJECT for ts cloud
|
15
|
+
- builder: skip examples
|
16
|
+
- improve generated config app.rb
|
17
|
+
|
18
|
+
## [2.1.6] - 2022-08-19
|
19
|
+
- [#258](https://github.com/boltops-tools/terraspace/pull/258) Fix terraform apply/destroy missing some passthrough options
|
20
|
+
|
6
21
|
## [2.1.5] - 2022-07-21
|
7
22
|
- [#255](https://github.com/boltops-tools/terraspace/pull/255) dont compute git info when not cloud not enabled and warn message improvement
|
8
23
|
- pin terraspace to major version in initially generated Gemfile
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# Docs: https://terraspace.cloud/docs/config/reference/
|
2
2
|
Terraspace.configure do |config|
|
3
|
-
config.logger.level = :info
|
3
|
+
# config.logger.level = :info
|
4
4
|
|
5
5
|
# To enable Terraspace Cloud set config.cloud.org
|
6
6
|
# config.cloud.org = "ORG" # required: replace with your org. only letters, numbers, underscore and dashes allowed
|
data/lib/terraspace/app.rb
CHANGED
@@ -47,7 +47,7 @@ module Terraspace
|
|
47
47
|
config.bundle.logger = ts_logger
|
48
48
|
|
49
49
|
config.cloud = ActiveSupport::OrderedOptions.new
|
50
|
-
config.cloud.project =
|
50
|
+
config.cloud.project = Terraspace.project
|
51
51
|
config.cloud.org = ENV['TS_ORG'] # required for Terraspace cloud
|
52
52
|
config.cloud.record = "changes" # IE: changes or all
|
53
53
|
config.cloud.stack = ":APP-:ROLE-:MOD_NAME-:ENV-:EXTRA-:REGION"
|
@@ -72,7 +72,7 @@ module Terraspace
|
|
72
72
|
config.layering.enable_names = ActiveSupport::OrderedOptions.new
|
73
73
|
config.layering.enable_names.expansion = true
|
74
74
|
config.layering.names = {}
|
75
|
-
config.layering.show =
|
75
|
+
config.layering.show = cast_boolean(ENV['TS_LAYERING_SHOW'])
|
76
76
|
config.layering.mode = ENV['TS_LAYERING_MODE'] || "simple" # simple, namespace, provider
|
77
77
|
|
78
78
|
config.summary = ActiveSupport::OrderedOptions.new
|
@@ -104,7 +104,7 @@ module Terraspace
|
|
104
104
|
# so dont have to add activemodel as a dependency just for this method
|
105
105
|
FALSE_VALUES = [nil, false, 0, "0", "f", "F", "false", "FALSE", "off", "OFF"].to_set
|
106
106
|
def cast_boolean(value)
|
107
|
-
if value == ""
|
107
|
+
if value.nil? || value == ""
|
108
108
|
nil
|
109
109
|
else
|
110
110
|
!FALSE_VALUES.include?(value)
|
@@ -6,7 +6,13 @@ module Terraspace::Compiler::Erb
|
|
6
6
|
|
7
7
|
def build
|
8
8
|
context = Context.new(@mod)
|
9
|
-
|
9
|
+
if @mod.resolved
|
10
|
+
RenderMePretty.result(@src_path, context: context)
|
11
|
+
else
|
12
|
+
# Replace contents so only the `output` and `depends_on` are evaluated
|
13
|
+
temp_path = Rewrite.new(@src_path).rewrite
|
14
|
+
RenderMePretty.result(temp_path, context: context)
|
15
|
+
end
|
10
16
|
end
|
11
17
|
end
|
12
18
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Terraspace::Compiler::Erb
|
2
|
+
class Rewrite
|
3
|
+
def initialize(src_path)
|
4
|
+
@src_path = src_path
|
5
|
+
end
|
6
|
+
|
7
|
+
def rewrite
|
8
|
+
input = IO.read(@src_path)
|
9
|
+
output = replace(input)
|
10
|
+
tfvar_path = @src_path.sub(Terraspace.root,'')
|
11
|
+
temp_path = "/tmp/terraspace/rewrite#{tfvar_path}"
|
12
|
+
FileUtils.mkdir_p(File.dirname(temp_path))
|
13
|
+
IO.write(temp_path, output)
|
14
|
+
temp_path
|
15
|
+
end
|
16
|
+
|
17
|
+
# Replace contents so only the `output` and `depends_on` are evaluated
|
18
|
+
def replace(input)
|
19
|
+
lines = input.split("\n").map {|l| l+"\n"} # mimic IO.readlines
|
20
|
+
new_lines = lines.map do |line|
|
21
|
+
new_line(line)
|
22
|
+
end
|
23
|
+
new_lines.join('')
|
24
|
+
end
|
25
|
+
|
26
|
+
def new_line(line)
|
27
|
+
md = line.match(/.*(<% |<%=)/) || line.match(/.*<%$/)
|
28
|
+
if md
|
29
|
+
words = %w[output depends_on] # TODO: consider allowing user customizations
|
30
|
+
# IE: <%= output or <% depends_on
|
31
|
+
regexp = Regexp.new(".*<%.*#{words.join('|')}.*")
|
32
|
+
if line.match(regexp)
|
33
|
+
line # passthrough
|
34
|
+
else
|
35
|
+
line.sub('<%', '<%#') # replace with ERB opening comment
|
36
|
+
end
|
37
|
+
else
|
38
|
+
line # passthrough
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -21,6 +21,9 @@ module Terraspace::Compiler
|
|
21
21
|
|
22
22
|
def compile_module
|
23
23
|
with_mod_file do |src_path|
|
24
|
+
# Skip examples. Dont want to process tfvars <%= output(...) %> which triggers dependency graph
|
25
|
+
# Also a speed improvement.
|
26
|
+
next if src_path.include?("#{@mod.root}/examples/")
|
24
27
|
compile_mod_file(src_path)
|
25
28
|
end
|
26
29
|
end
|
@@ -70,6 +70,7 @@ class Terraspace::Compiler::Strategy::Tfvar
|
|
70
70
|
sum += layer_levels(layer) unless layer.nil?
|
71
71
|
sum
|
72
72
|
end
|
73
|
+
all = all.reject { |layer| layer.ends_with?('-') }
|
73
74
|
all.map! do |layer|
|
74
75
|
layer = layer.blank? ? layer : "/#{layer}"
|
75
76
|
[
|
@@ -92,7 +93,7 @@ class Terraspace::Compiler::Strategy::Tfvar
|
|
92
93
|
logger.info "See: http://terraspace.test/docs/layering/instance-option/"
|
93
94
|
end
|
94
95
|
extra = Terraspace.extra || @mod.instance
|
95
|
-
levels = ["base", Terraspace.env, extra].reject(&:blank?) # layer levels. @mod.instance can be nil
|
96
|
+
levels = ["base", Terraspace.env, extra, "#{Terraspace.env}-#{extra}"].reject(&:blank?) # layer levels. @mod.instance can be nil
|
96
97
|
levels.map! do |i|
|
97
98
|
# base layer has prefix of '', reject with blank so it doesnt produce '//'
|
98
99
|
[prefix, i].reject(&:blank?).join('/')
|
@@ -158,11 +159,11 @@ class Terraspace::Compiler::Strategy::Tfvar
|
|
158
159
|
return unless @mod.resolved
|
159
160
|
return if @@shown_layers[@mod.name]
|
160
161
|
logger.debug "Layers for #{@mod.name}:"
|
161
|
-
show = Terraspace.config.layering.show || ENV['
|
162
|
+
show = Terraspace.config.layering.show || ENV['TS_LAYERING_SHOW_ALL']
|
162
163
|
paths.each do |path|
|
163
164
|
next if ARGV[0] == "all" # dont show layers with all command since fork happens after build
|
164
165
|
next unless path.include?('.tfvars')
|
165
|
-
if ENV['
|
166
|
+
if ENV['TS_LAYERING_SHOW_ALL']
|
166
167
|
message = " #{pretty_path(path)}"
|
167
168
|
message = "#{message} (found)".color(:yellow) if File.exist?(path)
|
168
169
|
logger.info message
|
data/lib/terraspace/core.rb
CHANGED
@@ -60,6 +60,17 @@ module Terraspace::Terraform::Args
|
|
60
60
|
result
|
61
61
|
end
|
62
62
|
|
63
|
+
def terraform_arg_types
|
64
|
+
arg_types = terraform_arg_types_for_command(@name)
|
65
|
+
# "terraspace apply/destroy" support the same options as "plan", but they don't document
|
66
|
+
# them directly in their "-help" option, so we need to add them.
|
67
|
+
if ["apply", "destroy"].include? @name
|
68
|
+
arg_types.merge! terraform_arg_types_for_command("plan")
|
69
|
+
end
|
70
|
+
|
71
|
+
arg_types
|
72
|
+
end
|
73
|
+
|
63
74
|
# Parses terraform COMMAND -help output for arg types.
|
64
75
|
# Return Example:
|
65
76
|
#
|
@@ -69,8 +80,8 @@ module Terraspace::Terraform::Args
|
|
69
80
|
# var: :hash,
|
70
81
|
# }
|
71
82
|
#
|
72
|
-
def
|
73
|
-
out = terraform_help(
|
83
|
+
def terraform_arg_types_for_command(name)
|
84
|
+
out = terraform_help(name)
|
74
85
|
lines = out.split("\n")
|
75
86
|
lines.select! do |line|
|
76
87
|
line =~ /^ -/
|
data/lib/terraspace/version.rb
CHANGED
@@ -13,7 +13,7 @@ describe Terraspace::Compiler::Erb::Render do
|
|
13
13
|
it "build" do
|
14
14
|
allow(Terraspace::Terraform::RemoteState::Marker::Output).to receive(:stack_names).and_return("b1")
|
15
15
|
result = render.build
|
16
|
-
expect(result).to eq "length = (unresolved)"
|
16
|
+
expect(result).to eq "length = (unresolved)\n"
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
describe Terraspace::Compiler::Erb::Rewrite do
|
2
|
+
let(:rewrite) { described_class.new(src_path) }
|
3
|
+
|
4
|
+
context "has output" do
|
5
|
+
let(:src_path) { fixture("rewrite/dev.tfvars") }
|
6
|
+
it "replace" do
|
7
|
+
input =<<~EOL
|
8
|
+
length = <%= output('b1.length') %>
|
9
|
+
foo = <%= foo %>
|
10
|
+
<% depends_on "b1" %>
|
11
|
+
<%
|
12
|
+
3.times do |i|
|
13
|
+
puts i
|
14
|
+
end
|
15
|
+
%>
|
16
|
+
EOL
|
17
|
+
text = rewrite.replace(input)
|
18
|
+
expect(text).to eq <<~EOL
|
19
|
+
length = <%= output('b1.length') %>
|
20
|
+
foo = <%#= foo %>
|
21
|
+
<% depends_on "b1" %>
|
22
|
+
<%#
|
23
|
+
3.times do |i|
|
24
|
+
puts i
|
25
|
+
end
|
26
|
+
%>
|
27
|
+
EOL
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -51,6 +51,19 @@ describe Terraspace::Terraform::Args::Pass do
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
+
context "indirectly documented args" do
|
55
|
+
# "terraform apply -help" doesn't document "-target" directly, but refers to
|
56
|
+
# "terraform plan -help" documentation.
|
57
|
+
context "-target=resource" do
|
58
|
+
let(:args) { ["-target=foo.bar"] }
|
59
|
+
let(:name) { "apply" }
|
60
|
+
it "pass through args" do
|
61
|
+
args = pass.args
|
62
|
+
expect(args).to eq ["-target=foo.bar"]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
54
67
|
context "hash arg" do
|
55
68
|
context "-var 'foo=bar'" do
|
56
69
|
let(:args) { ["-var 'foo=bar'"] }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: terraspace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -703,6 +703,7 @@ files:
|
|
703
703
|
- lib/terraspace/compiler/erb/context.rb
|
704
704
|
- lib/terraspace/compiler/erb/helpers.rb
|
705
705
|
- lib/terraspace/compiler/erb/render.rb
|
706
|
+
- lib/terraspace/compiler/erb/rewrite.rb
|
706
707
|
- lib/terraspace/compiler/expander.rb
|
707
708
|
- lib/terraspace/compiler/expander/backend.rb
|
708
709
|
- lib/terraspace/compiler/helper_extender.rb
|
@@ -926,6 +927,7 @@ files:
|
|
926
927
|
- spec/terraspace/compiler/dsl/terraform_spec.rb
|
927
928
|
- spec/terraspace/compiler/dsl/variable_spec.rb
|
928
929
|
- spec/terraspace/compiler/erb/render_spec.rb
|
930
|
+
- spec/terraspace/compiler/erb/rewrite_spec.rb
|
929
931
|
- spec/terraspace/dependency/graph_spec.rb
|
930
932
|
- spec/terraspace/dependency/helper/depends_on_spec.rb
|
931
933
|
- spec/terraspace/dependency/helper/output_spec.rb
|
@@ -961,7 +963,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
961
963
|
- !ruby/object:Gem::Version
|
962
964
|
version: '0'
|
963
965
|
requirements: []
|
964
|
-
rubygems_version: 3.3.
|
966
|
+
rubygems_version: 3.3.21
|
965
967
|
signing_key:
|
966
968
|
specification_version: 4
|
967
969
|
summary: 'Terraspace: The Terraspace Framework'
|
@@ -1083,6 +1085,7 @@ test_files:
|
|
1083
1085
|
- spec/terraspace/compiler/dsl/terraform_spec.rb
|
1084
1086
|
- spec/terraspace/compiler/dsl/variable_spec.rb
|
1085
1087
|
- spec/terraspace/compiler/erb/render_spec.rb
|
1088
|
+
- spec/terraspace/compiler/erb/rewrite_spec.rb
|
1086
1089
|
- spec/terraspace/dependency/graph_spec.rb
|
1087
1090
|
- spec/terraspace/dependency/helper/depends_on_spec.rb
|
1088
1091
|
- spec/terraspace/dependency/helper/output_spec.rb
|