terraspace 2.1.6 → 2.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 449ffd121de77d38b64d44f30a56639714f27fd3b0a7c50b00c4f897157c9ef5
4
- data.tar.gz: 815fddcc7cfa9b01e335de6d160d941c6d1b4a025b6bab902a1aa4552752b9df
3
+ metadata.gz: 9173675976a0e7207ae8ce912195535f2dc43c7bba91c5a90808559ce543df2d
4
+ data.tar.gz: 6c7b089a9bd1d82873ac5148fc276a0ad3578236f6cf89a3742ea049ef461bbe
5
5
  SHA512:
6
- metadata.gz: dc167ec202e62e70dd129d4ac85dc30a4179576315b880303205569434d7e31a35e5d331df64b2e478efb0459fcb902764ec6c860af650ea7ec8dcbc7caefe47
7
- data.tar.gz: da40e6f0760f535a0e604aad16b31ddd708090521c070469739a0e13d0129542676951892e1859fd779b4bcbbda15a168e260cd43dc4e41964bbc0a0a28ffb48
6
+ metadata.gz: 72de399e443552b2981df770e22d2a710721f526aacabff3210ee28d85c4c870a2bdf61f02576b4cc1170789229beaa92feb89eba2269a0dbd7f07ccd6e7a152
7
+ data.tar.gz: eb40bc9c321f6f1fa9f2ba3a4f14f9f831b4aefc23af251655b65dccb58ac838c9493fff8dcde7ec1de007015689627e1ffb4d9049bdd04c871cfb9f4b363bde
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.1] - 2022-09-08
7
+ - [#265](https://github.com/boltops-tools/terraspace/pull/265) import command
8
+
9
+ ## [2.2.0] - 2022-09-02
10
+ - [#261](https://github.com/boltops-tools/terraspace/pull/261) extra layer also process env-extra
11
+ - [#262](https://github.com/boltops-tools/terraspace/pull/262) improve graph dependency processing: replace tfvars so only output and depends_on are evaluated
12
+ - [#263](https://github.com/boltops-tools/terraspace/pull/263) layering small improvements
13
+ - layering small improvements: dont use layers that end with - only
14
+ - rename env var to TS_SHOW_ALL_LAYERS to TS_LAYERING_SHOW
15
+
16
+ ## [2.1.7] - 2022-08-22
17
+ - [#259](https://github.com/boltops-tools/terraspace/pull/259) fix TS_PROJECT for ts cloud
18
+ - builder: skip examples
19
+ - improve generated config app.rb
20
+
6
21
  ## [2.1.6] - 2022-08-19
7
22
  - [#258](https://github.com/boltops-tools/terraspace/pull/258) Fix terraform apply/destroy missing some passthrough options
8
23
 
@@ -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
@@ -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 = "main"
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 = false
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)
@@ -0,0 +1,29 @@
1
+ ## Examples
2
+
3
+ terraspace import aws_instance.this i-088a0a47e2e852cc8
4
+ terraspace import module.vpc.aws_vpc.this vpc-000782e4951a734c7
5
+ terraspace import vpc module.vpc.aws_vpc.this vpc-000782e4951a734c7
6
+
7
+ A general workflow is to use terraspace plan, inspect what resources, are missing and and import resources based on that. The `state list` command is also useful.
8
+
9
+ terraspace plan vpc
10
+ terraspace import vpc module.vpc.aws_vpc.this vpc-000782e4951a734c7
11
+ terraspace plan vpc
12
+ terraspace import vpc module.vpc.aws_internet_gateway.this[0] igw-0fa4bec3b4b46948a
13
+ terraspace state list vpc
14
+
15
+ Example with output:
16
+
17
+ $ terraspace import vpc module.vpc.aws_internet_gateway.this[0] igw-0fa4bec3b4b46948a
18
+ Building .terraspace-cache/us-west-2/dev/stacks/vpc
19
+ Current directory: .terraspace-cache/us-west-2/dev/stacks/vpc
20
+ => terraform import module.vpc.aws_internet_gateway.this[0] igw-0fa4bec3b4b46948a
21
+ module.vpc.aws_internet_gateway.this[0]: Importing from ID "igw-0fa4bec3b4b46948a"...
22
+ module.vpc.aws_internet_gateway.this[0]: Import prepared!
23
+ Prepared aws_internet_gateway for import
24
+ module.vpc.aws_internet_gateway.this[0]: Refreshing state... [id=igw-0fa4bec3b4b46948a]
25
+
26
+ Import successful!
27
+
28
+ The resources that were imported are shown above. These resources are now in
29
+ your Terraform state and will henceforth be managed by Terraform.
@@ -0,0 +1,12 @@
1
+ class Terraspace::CLI
2
+ class Import < Base
3
+ def run
4
+ commander.run
5
+ end
6
+
7
+ def commander
8
+ Commander.new("import", @options)
9
+ end
10
+ memoize :commander
11
+ end
12
+ end
@@ -109,6 +109,12 @@ module Terraspace
109
109
  Fmt.new(options.merge(mod: mod)).run
110
110
  end
111
111
 
112
+ desc "import ADDR ID", "Import existing infrastructure into your Terraform state"
113
+ long_desc Help.text(:import)
114
+ def import(mod, addr, id)
115
+ Import.new(options.merge(mod: mod, addr: addr, id: id)).run
116
+ end
117
+
112
118
  desc "info STACK", "Get info about stack."
113
119
  long_desc Help.text(:info)
114
120
  instance_option.call
@@ -6,7 +6,13 @@ module Terraspace::Compiler::Erb
6
6
 
7
7
  def build
8
8
  context = Context.new(@mod)
9
- RenderMePretty.result(@src_path, context: context)
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['TS_SHOW_ALL_LAYERS']
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['TS_SHOW_ALL_LAYERS']
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
@@ -20,7 +20,7 @@ module Terraspace
20
20
 
21
21
  def project
22
22
  if ENV['TS_PROJECT'].blank?
23
- config.cloud.project
23
+ "main"
24
24
  else
25
25
  ENV['TS_PROJECT']
26
26
  end
@@ -117,6 +117,10 @@ module Terraspace::Terraform::Args
117
117
  auto_approve_arg
118
118
  end
119
119
 
120
+ def import_args
121
+ [@options[:addr], @options[:id]]
122
+ end
123
+
120
124
  def auto_approve_arg
121
125
  @options[:yes] || @options[:auto] ? ["-auto-approve"] : []
122
126
  end
@@ -1,3 +1,3 @@
1
1
  module Terraspace
2
- VERSION = "2.1.6"
2
+ VERSION = "2.2.1"
3
3
  end
@@ -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
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.1.6
4
+ version: 2.2.1
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-08-19 00:00:00.000000000 Z
11
+ date: 2022-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -571,6 +571,7 @@ files:
571
571
  - lib/terraspace/cli/help/down.md
572
572
  - lib/terraspace/cli/help/fmt.md
573
573
  - lib/terraspace/cli/help/force_unlock.md
574
+ - lib/terraspace/cli/help/import.md
574
575
  - lib/terraspace/cli/help/info.md
575
576
  - lib/terraspace/cli/help/init.md
576
577
  - lib/terraspace/cli/help/list.md
@@ -604,6 +605,7 @@ files:
604
605
  - lib/terraspace/cli/help/tfc/sync.md
605
606
  - lib/terraspace/cli/help/up.md
606
607
  - lib/terraspace/cli/help/validate.md
608
+ - lib/terraspace/cli/import.rb
607
609
  - lib/terraspace/cli/info.rb
608
610
  - lib/terraspace/cli/init.rb
609
611
  - lib/terraspace/cli/list.rb
@@ -703,6 +705,7 @@ files:
703
705
  - lib/terraspace/compiler/erb/context.rb
704
706
  - lib/terraspace/compiler/erb/helpers.rb
705
707
  - lib/terraspace/compiler/erb/render.rb
708
+ - lib/terraspace/compiler/erb/rewrite.rb
706
709
  - lib/terraspace/compiler/expander.rb
707
710
  - lib/terraspace/compiler/expander/backend.rb
708
711
  - lib/terraspace/compiler/helper_extender.rb
@@ -926,6 +929,7 @@ files:
926
929
  - spec/terraspace/compiler/dsl/terraform_spec.rb
927
930
  - spec/terraspace/compiler/dsl/variable_spec.rb
928
931
  - spec/terraspace/compiler/erb/render_spec.rb
932
+ - spec/terraspace/compiler/erb/rewrite_spec.rb
929
933
  - spec/terraspace/dependency/graph_spec.rb
930
934
  - spec/terraspace/dependency/helper/depends_on_spec.rb
931
935
  - spec/terraspace/dependency/helper/output_spec.rb
@@ -961,7 +965,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
961
965
  - !ruby/object:Gem::Version
962
966
  version: '0'
963
967
  requirements: []
964
- rubygems_version: 3.3.12
968
+ rubygems_version: 3.3.21
965
969
  signing_key:
966
970
  specification_version: 4
967
971
  summary: 'Terraspace: The Terraspace Framework'
@@ -1083,6 +1087,7 @@ test_files:
1083
1087
  - spec/terraspace/compiler/dsl/terraform_spec.rb
1084
1088
  - spec/terraspace/compiler/dsl/variable_spec.rb
1085
1089
  - spec/terraspace/compiler/erb/render_spec.rb
1090
+ - spec/terraspace/compiler/erb/rewrite_spec.rb
1086
1091
  - spec/terraspace/dependency/graph_spec.rb
1087
1092
  - spec/terraspace/dependency/helper/depends_on_spec.rb
1088
1093
  - spec/terraspace/dependency/helper/output_spec.rb