terraspace 2.2.8 → 2.2.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5477cf33cd5e864e5b7117cdc129d4aaa96a9f6ff9255093e9499180e67068f8
4
- data.tar.gz: 3dc0b9113b44f7e0d10019aeb22898b8045f8de0be3c60a756d9bda588847184
3
+ metadata.gz: 5ec502639ef9e51eaabc15f2446b607813740cde82fe190f1e5c011c6efe66af
4
+ data.tar.gz: 1a0190a3a0847b876a55e8db5bbeb16263977a06f20006fc5daccad4b3bd2ec4
5
5
  SHA512:
6
- metadata.gz: 15da8006c07825c64446444c58e2efa4c22baeeda85da0abcf5d2d54e16e35e9929c6a636885a969fc12a9918ff74df90b34f88147141f0bc53c170061be0964
7
- data.tar.gz: 499ebbabe6e904e6d3800c7d18b8b830c1130aee5faf07a317159d63e63eeeb96bf9483416efcf59a9d8753f5b0f09648b1595da56591751ce389d6d7710c3d7
6
+ metadata.gz: c2285bf67d8d46f3e022e4603cb1c5bfedbb9a2da845b7472d02e6497b987e4dfc8335412a4495bda1139ea9b2395d2a505438b33ff44087a9e50504fb216086
7
+ data.tar.gz: 51c7376367e60d407f550d364f8786b0609da2115bae4c828c7611bbcf0f35db9e04fd5327593f6e5f02b2b8c381769b6e226659ca17e949901b6c97a23d35a0
data/CHANGELOG.md CHANGED
@@ -3,6 +3,10 @@
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.9] - 2023-08-23
7
+ - [#323](https://github.com/boltops-tools/terraspace/pull/323) Restrict terraform version due to terraform BSL license change
8
+ - send terraform version to all terraspace cloud requests
9
+
6
10
  ## [2.2.8] - 2023-06-27
7
11
  - Fix exit status for fmt
8
12
 
@@ -23,7 +23,7 @@ module Terraspace
23
23
 
24
24
  def run
25
25
  return if @options[:build] == false
26
- Terraspace::CLI::Setup::Check.check!
26
+ Terraspace::Check.check!
27
27
  check_allow!
28
28
  @mod.root_module = true
29
29
  clean
@@ -0,0 +1,142 @@
1
+ module Terraspace
2
+ class Check
3
+ extend Memoist
4
+
5
+ attr_reader :min_terraform_version, :max_terraform_version
6
+ def initialize(options={})
7
+ @options = options
8
+ # Terraspace requires this terraform version or a fork
9
+ @min_terraform_version = "0.12"
10
+ @max_terraform_version = "1.5.5"
11
+ end
12
+
13
+ # Used for the CLI
14
+ def run
15
+ puts "terraspace version: #{Terraspace::VERSION}"
16
+ if terraform_bin
17
+ puts "#{terraform_bin_name} bin: #{terraform_bin}"
18
+ puts "#{terraform_bin_name} version: #{terraform_version}"
19
+ # check for allowed version of terraform
20
+ if allowed_terraform_version?
21
+ puts "You're all set!".color(:green)
22
+ else
23
+ puts "terraspace requires terraform between v#{@min_terraform_version}.x and #{@max_terraform_version}".color(:red)
24
+ puts <<~EOL
25
+ This is because newer versions of terraform has a BSL license
26
+ If your usage is allowed by the license, you can bypass this check with:
27
+
28
+ export TS_VERSION_CHECK=0
29
+
30
+ Note: If you're using Terraspace Cloud, you won't be able to bypass this check.
31
+ See: https://terraspace.cloud/docs/terraform/license/
32
+ EOL
33
+ exit 1
34
+ end
35
+ else
36
+ puts terraform_is_not_installed
37
+ exit 1
38
+ end
39
+ end
40
+ alias ok! run
41
+
42
+ # aliased with ok?
43
+ def allowed_terraform_version?
44
+ return true if ENV['TS_VERSION_CHECK'] == '0' && Terraspace.cloud?
45
+ return false unless terraform_bin
46
+ return true if !terraform_bin.include?("terraform") # IE: allow any version of terraform forks
47
+
48
+ major, minor, patch = terraform_version.split('.').map(&:to_i)
49
+ min_major, min_minor, _ = @min_terraform_version.split('.').map(&:to_i)
50
+ max_major, max_minor, max_patch = @max_terraform_version.split('.').map(&:to_i)
51
+
52
+ # must be between min and max
53
+ min_ok = major > min_major ||
54
+ (major == min_major && minor >= min_minor)
55
+ max_ok = major < max_major ||
56
+ (major == max_major && minor == max_minor && patch <= max_patch)
57
+
58
+ min_ok && max_ok
59
+ end
60
+ alias ok? allowed_terraform_version?
61
+
62
+ def terraform_is_not_installed
63
+ <<~EOL
64
+ Terraform not installed. Unable to detect a terraform command.
65
+ Please double check that an allowed version of terraform is installed.
66
+ See: https://terraspace.cloud/docs/install/terraform/
67
+ EOL
68
+ end
69
+
70
+ # Note opentf is not an official fork yet. Mocked it out for testing.
71
+ # Should be ready to swap out the official fork name when it is ready.
72
+ BINS = %w[opentf terraform]
73
+ @@terraform_bin = nil
74
+ def terraform_bin
75
+ return @@terraform_bin if @@terraform_bin.present?
76
+ BINS.each do |bin|
77
+ if Gem.win_platform?
78
+ out = "is #{bin}.exe".strip
79
+ else
80
+ out = `type #{bin} 2>&1`.strip
81
+ next unless $?.success?
82
+ end
83
+ md = out.match(/is (.*)/)
84
+ if md
85
+ @@terraform_bin = md[1]
86
+ break
87
+ end
88
+ end
89
+ @@terraform_bin
90
+ end
91
+ memoize :terraform_bin
92
+
93
+ def terraform_bin_name
94
+ terraform_bin ? File.basename(terraform_bin) : "terraform"
95
+ end
96
+
97
+ # Sometimes Terraform shows the version info on the first line and sometimes on the bottom line.
98
+ # Account for that by finding the line.
99
+ #
100
+ # $ terraform --version
101
+ # Terraform v0.12.24
102
+ #
103
+ # Your version of Terraform is out of date! The latest version
104
+ # is 0.12.26. You can update by downloading from https://www.terraform.io/downloads.html
105
+ #
106
+ # Another example
107
+ #
108
+ # $ opentf --version
109
+ # OpenTF v0.12.24
110
+ #
111
+ # Note: The -json option is only available in v0.13+
112
+ def terraform_version
113
+ out = `#{terraform_bin} --version`
114
+ regexp = /(\d+\.\d+\.\d+)/
115
+ line = out.split("\n").find { |l| l =~ regexp }
116
+ version = line.match(regexp)[1] if line
117
+ end
118
+ memoize :terraform_version
119
+
120
+ def terraspace_version
121
+ Terraspace::VERSION
122
+ end
123
+
124
+ def versions
125
+ {
126
+ terraspace_version: terraspace_version,
127
+ terraform_version: terraform_version,
128
+ terraform_command: terraform_bin_name,
129
+ }
130
+ end
131
+
132
+ class << self
133
+ # Used as library call
134
+ def check!
135
+ setup = new
136
+ return if setup.ok?
137
+ # run meth designed for CLI and will puts out informative messages about installed version and exit 1 when version is not ok
138
+ setup.run
139
+ end
140
+ end
141
+ end
142
+ end
@@ -32,7 +32,7 @@ class Terraspace::CLI::Fmt
32
32
  end
33
33
 
34
34
  def terraform_fmt
35
- sh "terraform fmt"
35
+ sh "#{Terraspace.terraform_bin} fmt"
36
36
  end
37
37
 
38
38
  def sh(command)
@@ -3,7 +3,7 @@ class Terraspace::CLI
3
3
  desc "check", "Check setup is ok"
4
4
  long_desc Help.text("setup/check")
5
5
  def check
6
- Check.new(options).run
6
+ Terraspace::Check.new(options).run
7
7
  end
8
8
  end
9
9
  end
@@ -75,7 +75,7 @@ module Terraspace
75
75
  terraspace setup check
76
76
 
77
77
  EOL
78
- Setup::Check.new(options).run
78
+ Check.new(options).run
79
79
  end
80
80
 
81
81
  desc "console STACK", "Run console in built terraform project."
@@ -7,6 +7,11 @@ class Terraspace::Cloud::Api
7
7
  def request(klass, path, data={})
8
8
  exit_on_error = data.delete(:exit_on_error) # for cani logic
9
9
  url = url(path)
10
+ unless check.ok?
11
+ puts "ERROR: terraspace cloud requires terraform between v#{check.min_terraform_version}.x and #{check.max_terraform_version}".color(:red)
12
+ exit 1
13
+ end
14
+ data = data.merge(versions: check.versions)
10
15
  req = build_request(klass, url, data)
11
16
  retries = 0
12
17
  begin
@@ -117,5 +122,10 @@ class Terraspace::Cloud::Api
117
122
  def delete(path, data={})
118
123
  request(Net::HTTP::Delete, path, data)
119
124
  end
125
+
126
+ def check
127
+ Terraspace::Check.new
128
+ end
129
+ memoize :check
120
130
  end
121
131
  end
@@ -1,5 +1,6 @@
1
1
  module Terraspace::Cloud
2
2
  class Api
3
+ extend Memoist
3
4
  include Context
4
5
  include HttpMethods
5
6
 
@@ -18,8 +18,6 @@ module Terraspace::Cloud
18
18
  attrs = {
19
19
  status: status,
20
20
  kind: @kind,
21
- terraspace_version: check.terraspace_version,
22
- terraform_version: check.terraform_version,
23
21
  }
24
22
  attrs.merge!(@vcs_vars)
25
23
  attrs
@@ -38,11 +36,6 @@ module Terraspace::Cloud
38
36
  end
39
37
  end
40
38
 
41
- def check
42
- Terraspace::CLI::Setup::Check.new
43
- end
44
- memoize :check
45
-
46
39
  def sh(command, exit_on_fail: true)
47
40
  logger.debug "=> #{command}"
48
41
  system command
@@ -26,8 +26,6 @@ module Terraspace::Cloud
26
26
  {
27
27
  provider: provider.name, # IE: infracost
28
28
  provider_version: provider.version,
29
- terraspace_version: check.terraspace_version,
30
- terraform_version: check.terraform_version,
31
29
  }
32
30
  end
33
31
 
@@ -53,7 +53,7 @@ module Terraspace::Cloud
53
53
  FileUtils.cp(out_option_root_path, plan_path)
54
54
 
55
55
  json = plan_path.sub('.binary','.json')
56
- sh "terraform show -json #{plan_path} > #{json}"
56
+ sh "#{Terraspace.terraform_bin} show -json #{plan_path} > #{json}"
57
57
  end
58
58
  end
59
59
 
@@ -24,8 +24,8 @@ module Terraspace::Cloud
24
24
  IO.write("#{cache2_path}/update.log", Terraspace::Logger.logs)
25
25
  return unless success
26
26
 
27
- sh "terraform state pull > #{cache2_path}/state.json"
28
- sh "terraform output -json > #{cache2_path}/output.json"
27
+ sh "#{Terraspace.terraform_bin} state pull > #{cache2_path}/state.json"
28
+ sh "#{Terraspace.terraform_bin} output -json > #{cache2_path}/output.json"
29
29
  end
30
30
  end
31
31
 
@@ -2,6 +2,11 @@ module Terraspace
2
2
  module Core
3
3
  extend Memoist
4
4
 
5
+ def terraform_bin
6
+ # basename so command shows up as a prettier short name in the output
7
+ File.basename(Terraspace::Check.new.terraform_bin)
8
+ end
9
+
5
10
  def app
6
11
  ENV['TS_APP'] unless ENV['TS_APP'].blank?
7
12
  end
@@ -45,7 +45,7 @@ module Terraspace::Terraform
45
45
  current_dir_message # only show once
46
46
 
47
47
  params = args.flatten.join(' ')
48
- command = "terraform #{name} #{params}".squish
48
+ command = "#{Terraspace.terraform_bin} #{name} #{params}".squish
49
49
  @shell_exception = nil
50
50
  run_hooks("terraform.rb", name) do
51
51
  Backend.new(@mod).create
@@ -1,3 +1,3 @@
1
1
  module Terraspace
2
- VERSION = "2.2.8"
2
+ VERSION = "2.2.9"
3
3
  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.2.8
4
+ version: 2.2.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-06-27 00:00:00.000000000 Z
11
+ date: 2023-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -528,6 +528,7 @@ files:
528
528
  - lib/terraspace/builder/allow/stack.rb
529
529
  - lib/terraspace/builder/children.rb
530
530
  - lib/terraspace/bundle.rb
531
+ - lib/terraspace/check.rb
531
532
  - lib/terraspace/cli.rb
532
533
  - lib/terraspace/cli/all.rb
533
534
  - lib/terraspace/cli/base.rb
@@ -636,7 +637,6 @@ files:
636
637
  - lib/terraspace/cli/plan.rb
637
638
  - lib/terraspace/cli/seed.rb
638
639
  - lib/terraspace/cli/setup.rb
639
- - lib/terraspace/cli/setup/check.rb
640
640
  - lib/terraspace/cli/state.rb
641
641
  - lib/terraspace/cli/summary.rb
642
642
  - lib/terraspace/cli/test.rb
@@ -965,7 +965,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
965
965
  - !ruby/object:Gem::Version
966
966
  version: '0'
967
967
  requirements: []
968
- rubygems_version: 3.4.10
968
+ rubygems_version: 3.4.17
969
969
  signing_key:
970
970
  specification_version: 4
971
971
  summary: 'Terraspace: The Terraspace Framework'
@@ -1,114 +0,0 @@
1
- class Terraspace::CLI::Setup
2
- class Check
3
- extend Memoist
4
-
5
- # Terraspace requires at least this version of terraform
6
- REQUIRED_TERRAFORM_VERSION = "0.12"
7
-
8
- def initialize(options={})
9
- @options = options
10
- end
11
-
12
- # Used for the CLI
13
- def run
14
- puts "Detected Terraspace version: #{Terraspace::VERSION}"
15
- if terraform_bin
16
- puts "Detected Terraform bin: #{terraform_bin}"
17
- puts "Detected #{terraform_version_message}"
18
- check_required_version!
19
- else
20
- puts terraform_is_not_installed
21
- exit 1
22
- end
23
- end
24
-
25
- def check_required_version!
26
- puts "Terraspace requires Terraform v#{REQUIRED_TERRAFORM_VERSION}.x and above"
27
- if ok?
28
- puts "You're all set!"
29
- else
30
- puts "The installed version of terraform may not work with terraspace."
31
- puts "Recommend using at least terraform v#{REQUIRED_TERRAFORM_VERSION}.x"
32
- puts "If you would like to bypass this check. Use TS_VERSION_CHECK=0" unless check_command?
33
- exit 1 unless ENV['TS_VERSION_CHECK'] == '0'
34
- end
35
- end
36
-
37
- def check_command?
38
- Terraspace.argv[0] == "check_setup"
39
- end
40
-
41
- def terraform_is_not_installed
42
- <<~EOL
43
- Terraform not installed. Unable to detect a terraform command. Please double check that terraform is installed.
44
- See: https://terraspace.cloud/docs/install/terraform/
45
- EOL
46
- end
47
-
48
- def ok?
49
- unless terraform_bin
50
- puts terraform_is_not_installed
51
- exit 1
52
- end
53
-
54
- version = terraform_version_message.sub(/.*v/,'') # => 0.12.24
55
- unless version.match(/\d+\.\d+\.\d+/) # just parse did not find the version number
56
- puts "WARN: Unable to get the terraform version".color(:yellow)
57
- return true
58
- end
59
- major, minor, _ = version.split('.')
60
- required_major, required_minor = REQUIRED_TERRAFORM_VERSION.split('.')
61
- return true if major.to_i > required_major.to_i
62
- x = major.to_i >= required_major.to_i
63
- y = minor.to_i >= required_minor.to_i
64
- x && y
65
- end
66
-
67
- def terraform_bin
68
- if Gem.win_platform?
69
- out = "is terraform.exe".strip
70
- else
71
- out = `type terraform 2>&1`.strip
72
- return unless $?.success?
73
- end
74
- md = out.match(/is (.*)/)
75
- md[1] if md
76
- end
77
- memoize :terraform_bin
78
-
79
- # Sometimes Terraform shows the version info on the first line and sometimes on the bottom line.
80
- # Account for that by finding the line.
81
- #
82
- # $ terraform --version
83
- # Terraform v0.12.24
84
- #
85
- # Your version of Terraform is out of date! The latest version
86
- # is 0.12.26. You can update by downloading from https://www.terraform.io/downloads.html
87
- #
88
- # Note: The -json option is only available in v0.13+
89
- def terraform_version_message
90
- out = `terraform --version`
91
- version = out.split("\n").find { |l| l =~ /^Terraform / }
92
- version.strip if version
93
- end
94
- memoize :terraform_version_message
95
-
96
- def terraform_version
97
- terraform_version_message.sub(/.*v/,'')
98
- end
99
-
100
- def terraspace_version
101
- Terraspace::VERSION
102
- end
103
-
104
- class << self
105
- # Used as library call
106
- def check!
107
- setup = new
108
- return if setup.ok?
109
- # run meth designed for CLI and will puts out informative messages about installed version and exit 1 when version is not ok
110
- setup.run
111
- end
112
- end
113
- end
114
- end