terraspace 0.1.0 → 0.2.2

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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -1
  3. data/README.md +6 -4
  4. data/lib/templates/base/git_hook/hook.sh +5 -0
  5. data/lib/templates/base/project/.gitignore +0 -1
  6. data/lib/templates/base/shim/terraspace +7 -0
  7. data/lib/templates/hcl/project/config/terraform/backend.tf.tt +3 -3
  8. data/lib/templates/plugin/lib/templates/hcl/project/config/terraform/backend.tf.tt +2 -2
  9. data/lib/terraspace/app.rb +7 -0
  10. data/lib/terraspace/builder.rb +2 -46
  11. data/lib/terraspace/cli.rb +35 -18
  12. data/lib/terraspace/cli/build/placeholder.rb +40 -0
  13. data/lib/terraspace/cli/cloud.rb +24 -0
  14. data/lib/terraspace/cli/commander.rb +8 -1
  15. data/lib/terraspace/cli/init.rb +67 -0
  16. data/lib/terraspace/cli/list.rb +13 -0
  17. data/lib/terraspace/cli/new.rb +8 -0
  18. data/lib/terraspace/cli/new/git_hook.rb +33 -0
  19. data/lib/terraspace/cli/new/sequence.rb +1 -1
  20. data/lib/terraspace/cli/new/shim.rb +58 -0
  21. data/lib/terraspace/cli/summary.rb +10 -13
  22. data/lib/terraspace/compiler/backend.rb +9 -37
  23. data/lib/terraspace/compiler/backend/parser.rb +42 -0
  24. data/lib/terraspace/compiler/builder.rb +6 -2
  25. data/lib/terraspace/compiler/cleaner.rb +19 -2
  26. data/lib/terraspace/compiler/cleaner/backend_change.rb +1 -1
  27. data/lib/terraspace/compiler/dsl/syntax/mod.rb +1 -0
  28. data/lib/terraspace/compiler/dsl/syntax/mod/backend.rb +16 -3
  29. data/lib/terraspace/compiler/expander.rb +28 -1
  30. data/lib/terraspace/compiler/writer.rb +1 -1
  31. data/lib/terraspace/core.rb +7 -1
  32. data/lib/terraspace/mod.rb +37 -12
  33. data/lib/terraspace/mod/remote.rb +1 -1
  34. data/lib/terraspace/plugin/expander/interface.rb +48 -5
  35. data/lib/terraspace/plugin/infer_provider.rb +15 -0
  36. data/lib/terraspace/plugin/layer/interface.rb +5 -0
  37. data/lib/terraspace/plugin/summary/interface.rb +5 -4
  38. data/lib/terraspace/seeder.rb +4 -4
  39. data/lib/terraspace/terraform/api.rb +58 -0
  40. data/lib/terraspace/terraform/api/client.rb +10 -0
  41. data/lib/terraspace/terraform/api/http.rb +106 -0
  42. data/lib/terraspace/terraform/api/var.rb +72 -0
  43. data/lib/terraspace/terraform/api/vars.rb +38 -0
  44. data/lib/terraspace/terraform/api/vars/base.rb +7 -0
  45. data/lib/terraspace/terraform/api/vars/json.rb +14 -0
  46. data/lib/terraspace/terraform/api/vars/rb.rb +21 -0
  47. data/lib/terraspace/terraform/args/custom.rb +1 -1
  48. data/lib/terraspace/terraform/args/default.rb +16 -2
  49. data/lib/terraspace/terraform/cloud.rb +25 -0
  50. data/lib/terraspace/terraform/cloud/workspace.rb +95 -0
  51. data/lib/terraspace/terraform/runner.rb +1 -1
  52. data/lib/terraspace/util/sh.rb +1 -1
  53. data/lib/terraspace/version.rb +1 -1
  54. data/spec/fixtures/{cache_build_dir → cache_dir}/variables.tf +0 -0
  55. data/spec/fixtures/projects/hcl/aws/config/backend.tf +1 -1
  56. data/spec/fixtures/projects/hcl/google/config/backend.tf +1 -1
  57. data/spec/terraspace/seeder_spec.rb +1 -1
  58. data/spec/terraspace/terraform/hooks/builder_spec.rb +1 -1
  59. data/terraspace.gemspec +5 -4
  60. metadata +47 -13
  61. data/lib/terraspace/cli/build.rb +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 070bb2bfae32308ff7f0f89386f22ed6c7db04782d0e8c112876d13ee4f68109
4
- data.tar.gz: d799fa36b32bff54f9b3771a546b6bff064248d3a7043f83927b93931ba234ad
3
+ metadata.gz: bb1f738f3830420427da3a1ac7ba6b2bcf946da8cce8348d28ba67f7eb692cf3
4
+ data.tar.gz: c88c1ce153617f68acc92d89b8fc1d82e193fa2271d701b658737069511a0c2c
5
5
  SHA512:
6
- metadata.gz: e5a2df72ea02495f06c4a03062a97e9dc52d255d530330769af055422503a2930b259831ab956a7a16a372a64ed37487ed4dfe78b80bdda29392f1607b76374b
7
- data.tar.gz: 248a43fedde2e707743b9cc01bb8ca275d094768cc9e33cbd9ede32a47cd7ecf6c0795f36910b05ec4d46ef837170c5c94ec632b8711dd40679824f4235d07f0
6
+ metadata.gz: '097c4a70ac24ecfdf0e6a87b844688adf82bc6f41699a903877af054136a00bf9614ace775cb2c431dbbafc92b981218ece247e691b4db079191b080133032eb'
7
+ data.tar.gz: fb0e6162ebb0f48f3e46f441163d94cf93e0186a6a32917071f9cbf5b1f27cec679ac582c39f35a9e61000373ba1bbd074797d7fdf941a2887b6d36463dc2e5d
@@ -3,5 +3,38 @@
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
+ ## [0.2.2]
7
+ * #36 cloud.relative_root setting
8
+
9
+ ## [0.2.1]
10
+ * #35 fix summary bug when ran multiple times with different envs
11
+
12
+ ## [0.2.0]
13
+ * #34 Terraform Cloud and Terraform Enterprise support added.
14
+ * TFC Vars support: JSON and DSL. config.overwrite and config.overwrite_sensitive configs
15
+ * Build all stacks with config/terraform files. Designed to support the TFC VCS-driven workflow.
16
+ * Layer Interface module added. All latest provider plugins like terraspace\_plugin_aws make use of this module.
17
+ * Backend pattern expansion auto-detects the provider bakcend. The `expansion` method replaces the `backend_expand` method. `backend_expand` is deprecated.
18
+ * New expander variables: TYPE_INSTANCE, INSTANCE, CACHE_ROOT. Also added strip trailing - and / behavior.
19
+ * Timeout for terraform init. The default timeout is 10m and will then print out the terraform init log.
20
+ * Terraspace 0.2.x is compatible with terraspace\_plugin_aws 0.2.x, terraspace\_plugin_google 0.2.x, and terraspace\_plugin_azurerm 0.2.x
21
+ * New commands: terraspace list, terraspace cloud list, terraspace cloud setup, terraspace cloud destroy, terraspace new shim, terraspace new git_hook
22
+ * terraspace list: list of modules and stacks
23
+ * terraspace cloud list: shows list of TFC workspaces
24
+ * terraspace cloud setup: setups up TFC workspace for VCS-driven workflow. This automatically happens for the TFC CLI-driven workflow.
25
+ * terraspace cloud destroy: destroys the TFC workspace associated with the stack. Can also use the `terraspace down demo --destroy-workspace` option.
26
+ * terraspace new shim: An quick way to generate a terraspace shim.
27
+ * terraspace new git_hook: An quick way to set up a git pre-push hook for the TFC VCS-driven workflow.
28
+ * terraspace down: works even if there's no app/stacks folder. A fake stack is built.
29
+ * terraspace build: terraspace build placeholder concept.
30
+ * terraspace build: only builds now. auto bucket backend creation and terraform init is is still automatically called by terraform up, etc.
31
+ * terraspace up: --reconfigure option. This is useful if upgrading Terraform version.
32
+
33
+ ## [0.1.2]
34
+ * #33 rspec-terraspace dependency added
35
+
36
+ ## [0.1.1]
37
+ * #32 terraspace summary --short option
38
+
6
39
  ## [0.1.0]
7
- - Initial release
40
+ * Initial release
data/README.md CHANGED
@@ -10,14 +10,16 @@ Official Docs Site: [terraspace.cloud](https://terraspace.cloud)
10
10
 
11
11
  ## Quick Start
12
12
 
13
- The commands creates s3 bucket:
13
+ Here are commands to get started:
14
14
 
15
15
  terraspace new project infra --plugin aws --examples
16
16
  cd infra
17
17
  terraspace up demo
18
18
  terraspace down demo
19
19
 
20
- The last `down` command cleans up and deletes the bucket.
20
+ * The `new` command generates a starter project.
21
+ * The `up` command creates an s3 bucket.
22
+ * The `down` command cleans up and deletes the bucket.
21
23
 
22
24
  The default plugin is aws. Other plugins also supported are: google and azurerm.
23
25
 
@@ -26,7 +28,7 @@ The default plugin is aws. Other plugins also supported are: google and azurerm.
26
28
  Create infrastructure:
27
29
 
28
30
  $ terraspace up demo -y
29
- Materializing .terraspace-cache/dev/stacks/demo
31
+ Building .terraspace-cache/dev/stacks/demo
30
32
  Current directory: .terraspace-cache/dev/stacks/demo
31
33
  => terraform init -get > /dev/null
32
34
  Built in .terraspace-cache/dev/stacks/demo
@@ -46,7 +48,7 @@ Create infrastructure:
46
48
  Destroy infrastructure:
47
49
 
48
50
  $ terraspace down demo -y
49
- Materializing .terraspace-cache/dev/stacks/demo
51
+ Building .terraspace-cache/dev/stacks/demo
50
52
  Current directory: .terraspace-cache/dev/stacks/demo
51
53
  => terraform init -get > /dev/null
52
54
  Built in .terraspace-cache/dev/stacks/demo
@@ -0,0 +1,5 @@
1
+ #!/bin/bash -ex
2
+ echo "Running: terraspace build placeholder"
3
+ <%= terraspace_build_commands %>
4
+ git add .terraspace-cache
5
+ git commit -m 'update .terraspace-cache' || true
@@ -14,7 +14,6 @@ terraform.tfvars
14
14
  *.gem
15
15
  *.rbc
16
16
  .idea
17
- .terraspace-cache
18
17
  /.bundle
19
18
  /.config
20
19
  /.yardoc
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ <%= switch_ruby_version_line %>
3
+ if [ -f config/app.rb ]; then
4
+ exec bundle exec terraspace "$@"
5
+ else
6
+ exec terraspace "$@"
7
+ fi
@@ -3,8 +3,8 @@
3
3
  # terraform {
4
4
  # backend "s3" {
5
5
  # bucket = "<%= options[:bucket] || "terraform-state-:ACCOUNT-:REGION-:ENV" %>"
6
- # key = "<%%= "s3", ":REGION/:ENV/:BUILD_DIR/terraform.tfstate" %> # IE: us-west-2/dev/ec2/modules/vpc/terraform.tfstate
7
- # region = "<%%= "s3", ":REGION" %>"
6
+ # key = "<%%= expansion(":REGION/:ENV/:BUILD_DIR/terraform.tfstate") %> # IE: us-west-2/dev/ec2/modules/vpc/terraform.tfstate
7
+ # region = "<%%= expansion(":REGION") %>"
8
8
  # encrypt = true
9
9
  # dynamodb_table = "terraform_locks"
10
10
  # }
@@ -13,6 +13,6 @@
13
13
  # terraform {
14
14
  # backend "gcs" {
15
15
  # bucket = "<%= options[:bucket] || "terraform-state-:PROJECT-:REGION-:ENV" %>"
16
- # prefix = "<%%= backend_expand("gcs", ":REGION/:ENV/:BUILD_DIR") %>" # IE: us-central1/dev/modules/vm
16
+ # prefix = "<%%= expansion(":REGION/:ENV/:BUILD_DIR") %>" # IE: us-central1/dev/modules/vm
17
17
  # }
18
18
  # }
@@ -1,6 +1,6 @@
1
1
  terraform {
2
2
  backend "PROVIDER_BACKEND" {
3
- bucket = "<%%= backend_expand("PROVIDER_BACKEND", "terraform-state-REPLACE_ME-REPLACE_ME-:ENV") %>" # expanded by terraspace
4
- prefix = "<%%= backend_expand("PROVIDER_BACKEND", "REPLACE_ME/:ENV/:BUILD_DIR") %>" # expanded by terraspace
3
+ bucket = "<%%= expansion("terraform-state-REPLACE_ME-REPLACE_ME-:ENV") %>" # expanded by terraspace
4
+ prefix = "<%%= expansion("REPLACE_ME/:ENV/:BUILD_DIR") %>" # expanded by terraspace
5
5
  }
6
6
  }
@@ -14,6 +14,13 @@ module Terraspace
14
14
  config.logger = Logger.new($stdout)
15
15
  config.logger.level = :info
16
16
  config.hooks = Hooks.new
17
+ config.cloud = ActiveSupport::OrderedOptions.new
18
+ config.cloud.overwrite = true
19
+ config.cloud.overwrite_sensitive = true
20
+ config.cloud.relative_root = nil
21
+ config.build = ActiveSupport::OrderedOptions.new
22
+ config.build.cache_root = nil # defaults to /full/path/to/.terraspace-cache
23
+ config.build.cache_dir = ":CACHE_ROOT/:REGION/:ENV/:BUILD_DIR"
17
24
  config
18
25
  end
19
26
 
@@ -4,24 +4,15 @@ module Terraspace
4
4
  Terraspace::CLI::CheckSetup.check!
5
5
  @mod.root_module = true
6
6
  Compiler::Cleaner.new(@mod, @options).clean
7
- build_dir = Util.pretty_path(@mod.cache_build_dir)
7
+ build_dir = Util.pretty_path(@mod.cache_dir)
8
8
  logger.info "Building #{build_dir}"
9
9
 
10
10
  build_all("modules") # build all modules and stacks as dependencies
11
11
  build_all("stacks")
12
- build_root_module # build root module at the end
13
-
14
- auto_create_backend
15
- Terraform::Runner.new("init", @options).run if !auto? && @options[:init] != false # will run on @options[:init].nil?
16
- build_remote_dependencies # runs after terraform init, which downloads remote modules
12
+ build_root_module
17
13
  logger.info "Built in #{build_dir}"
18
14
  end
19
15
 
20
- def auto?
21
- # command is only passed from CLI in the update specifically for this check
22
- @options[:auto] && @options[:command] == "update"
23
- end
24
-
25
16
  def build_root_module
26
17
  Compiler::Builder.new(@mod).build
27
18
  end
@@ -35,22 +26,12 @@ module Terraspace
35
26
 
36
27
  consider_stacks = type_dir == "stacks"
37
28
  mod = Mod.new(mod_name, consider_stacks: consider_stacks)
38
- next if root?(mod) # will build root module at the end
39
29
 
40
30
  Compiler::Builder.new(mod).build
41
31
  built << mod_name
42
32
  end
43
33
  end
44
34
 
45
- def root?(mod)
46
- mod.name == @mod.name && mod.type == @mod.type
47
- end
48
-
49
- def auto_create_backend
50
- return unless @options[:command] == "update"
51
- Compiler::Backend.new(@mod).create
52
- end
53
-
54
35
  def local_paths(type_dir)
55
36
  dirs("app/#{type_dir}/*") + dirs("vendor/#{type_dir}/*")
56
37
  end
@@ -58,30 +39,5 @@ module Terraspace
58
39
  def dirs(path)
59
40
  Dir.glob("#{Terraspace.root}/#{path}")
60
41
  end
61
-
62
- # Currently only handles remote modules only one-level deep.
63
- def build_remote_dependencies
64
- modules_json_path = "#{@mod.cache_build_dir}/.terraform/modules/modules.json"
65
- return unless File.exist?(modules_json_path)
66
-
67
- initialized_modules = JSON.load(IO.read(modules_json_path))
68
- # For example of structure see spec/fixtures/initialized/modules.json
69
- initialized_modules["Modules"].each do |meta|
70
- build_remote_mod(meta)
71
- end
72
- end
73
-
74
- def build_remote_mod(meta)
75
- return if local_source?(meta["Source"])
76
- return if meta['Dir'] == '.' # root is already built
77
-
78
- remote_mod = Mod::Remote.new(meta, @mod)
79
- Compiler::Builder.new(remote_mod).build
80
- end
81
-
82
- private
83
- def local_source?(s)
84
- s =~ %r{^\.} || s =~ %r{^/}
85
- end
86
42
  end
87
43
  end
@@ -24,20 +24,25 @@ module Terraspace
24
24
  init_option = Proc.new {
25
25
  option :init, type: :boolean, default: true, desc: "Instance of stack"
26
26
  }
27
+ reconfigure_option = Proc.new {
28
+ option :reconfigure, type: :boolean, desc: "Add terraform -reconfigure option"
29
+ }
27
30
 
28
31
  desc "new SUBCOMMAND", "new subcommands"
29
32
  long_desc Help.text(:new)
30
33
  subcommand "new", New
31
34
 
32
- desc "build MODULE", "build"
35
+ desc "cloud SUBCOMMAND", "cloud subcommands"
36
+ long_desc Help.text(:cloud)
37
+ subcommand "cloud", Cloud
38
+
39
+ desc "build STACK", "build"
33
40
  long_desc Help.text(:build)
34
41
  option :quiet, type: :boolean, default: true, desc: "quiet output"
35
- auto_option.call
36
- init_option.call
37
- input_option.call
38
42
  instance_option.call
43
+ yes_option.call
39
44
  def build(mod)
40
- Build.new(options.merge(mod: mod)).run
45
+ Terraspace::Builder.new(@options.merge(mod: mod)).run
41
46
  end
42
47
 
43
48
  desc "bundle", "bundle"
@@ -58,22 +63,25 @@ module Terraspace
58
63
  Clean.new(options).run
59
64
  end
60
65
 
61
- desc "console", "console .terraspace-cache dir"
66
+ desc "console STACK", "console .terraspace-cache dir"
62
67
  long_desc Help.text(:console)
63
68
  instance_option.call
64
69
  def console(mod)
65
70
  Commander.new("console", options.merge(mod: mod)).run
66
71
  end
67
72
 
68
- desc "down MODULE", "down"
73
+ desc "down STACK", "down"
69
74
  long_desc Help.text(:down)
70
75
  instance_option.call
71
76
  yes_option.call
77
+ reconfigure_option.call
78
+ option :destroy_workspace, type: :boolean, desc: "Also destroy the Cloud workspace. Only applies when using Terraform Cloud remote backend."
72
79
  def down(mod)
73
- Commander.new("destroy", options.merge(mod: mod)).run
80
+ Commander.new("destroy", options.merge(mod: mod, command: "down")).run
81
+ Terraspace::Terraform::Cloud::Workspace.new(options.merge(mod: mod)).destroy if @options[:destroy_workspace]
74
82
  end
75
83
 
76
- desc "info MODULE", "info"
84
+ desc "info STACK", "info"
77
85
  long_desc Help.text(:info)
78
86
  format_option.call
79
87
  instance_option.call
@@ -81,31 +89,38 @@ module Terraspace
81
89
  Info.new(options.merge(mod: mod)).run
82
90
  end
83
91
 
84
- desc "plan MODULE", "plan module"
92
+ desc "list", "list stacks and modules"
93
+ long_desc Help.text(:list)
94
+ def list
95
+ List.new(options).run
96
+ end
97
+
98
+ desc "plan STACK", "plan stack"
85
99
  long_desc Help.text(:plan)
86
100
  auto_option.call
87
101
  input_option.call
88
102
  instance_option.call
89
103
  out_option.call
104
+ reconfigure_option.call
90
105
  def plan(mod)
91
106
  Commander.new("plan", options.merge(mod: mod)).run
92
107
  end
93
108
 
94
- desc "providers MODULE", "providers"
109
+ desc "providers STACK", "providers"
95
110
  long_desc Help.text(:providers)
96
111
  instance_option.call
97
112
  def providers(mod)
98
113
  Commander.new("providers", options.merge(mod: mod)).run
99
114
  end
100
115
 
101
- desc "refresh", "refresh"
116
+ desc "refresh STACK", "refresh"
102
117
  long_desc Help.text(:refresh)
103
118
  instance_option.call
104
119
  def refresh(mod)
105
120
  Commander.new("refresh", options.merge(mod: mod)).run
106
121
  end
107
122
 
108
- desc "seed MODULE", "seed"
123
+ desc "seed STACK", "seed"
109
124
  long_desc Help.text(:seed)
110
125
  option :yes, aliases: :y, type: :boolean, desc: "bypass prompts and force overwrite files"
111
126
  option :where, desc: "where to create file. either under app or seed folder structure. values: app or stack"
@@ -119,11 +134,12 @@ module Terraspace
119
134
  long_desc Help.text(:clean)
120
135
  option :mod, desc: "Module to build to generate a backend file for discovery. By default the last module is used. Usually, it wont matter."
121
136
  init_option.call
137
+ option :short, aliases: %w[s], type: :boolean, desc: "Only show statefiles"
122
138
  def summary
123
139
  Summary.new(options).run
124
140
  end
125
141
 
126
- desc "show MODULE", "show"
142
+ desc "show STACK", "show"
127
143
  long_desc Help.text(:show)
128
144
  instance_option.call
129
145
  def show(mod)
@@ -136,7 +152,7 @@ module Terraspace
136
152
  Test.new(options).run
137
153
  end
138
154
 
139
- desc "output MODULE", "output"
155
+ desc "output STACK", "output"
140
156
  long_desc Help.text(:output)
141
157
  format_option.call
142
158
  instance_option.call
@@ -145,20 +161,21 @@ module Terraspace
145
161
  Commander.new("output", options.merge(mod: mod)).run
146
162
  end
147
163
 
148
- desc "update MODULE", "Update infrasturcture. IE: apply plan"
164
+ desc "update STACK", "Update infrasturcture. IE: apply plan"
149
165
  long_desc Help.text(:update)
150
166
  auto_option.call
151
167
  init_option.call
152
168
  input_option.call
153
169
  instance_option.call
154
170
  yes_option.call
171
+ reconfigure_option.call
155
172
  option :plan, desc: "Execution plan that can be used to only execute a pre-determined set of actions."
156
173
  option :var_files, type: :array, desc: "list of var files"
157
174
  def update(mod)
158
- Commander.new("apply", options.merge(mod: mod, command: "update")).run
175
+ Commander.new("apply", options.merge(mod: mod)).run
159
176
  end
160
177
 
161
- desc "validate MODULE", "validate"
178
+ desc "validate STACK", "validate"
162
179
  long_desc Help.text(:validate)
163
180
  instance_option.call
164
181
  def validate(mod)
@@ -0,0 +1,40 @@
1
+ # The placeholder stack is a special stack that is useful in case there are no app/stacks.
2
+ # We build a placeholder back just so we have backend.tf to be used to grab info.
3
+ # It's useful for the summary command.
4
+ module Terraspace::CLI::Build
5
+ class Placeholder
6
+ include Terraspace::Util::Logging
7
+
8
+ def initialize(options={})
9
+ @options = options
10
+ end
11
+
12
+ # Grab the last module and build that.
13
+ # Assume the backend key has the same prefix
14
+ # Note: Tried building a empty "null" stack but with TFC a null space workspace is created, which is undesired.
15
+ def build
16
+ return if ENV['TS_SUMMARY_BUILD'] == '0'
17
+
18
+ mod = @options[:mod]
19
+ if !mod or mod == "placeholder"
20
+ logger.info "Building one of the modules to get backend.tf info"
21
+ mod = find_mod
22
+ end
23
+ Terraspace::Builder.new(@options.merge(mod: mod, init: false)).run # generate and init
24
+ Terraspace::Mod.new(mod, @options) # mod metadata
25
+ end
26
+
27
+ # Used by: terraspace build placeholder
28
+ def find_mod
29
+ mod_path = Dir.glob("{app,vendor}/{modules,stacks}/*").last
30
+ unless mod_path
31
+ logger.info <<~EOL
32
+ No modules or stacks found.
33
+ Unable to determine the backend state path without at least one module.
34
+ EOL
35
+ exit 0
36
+ end
37
+ File.basename(mod_path) # mod name
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,24 @@
1
+ class Terraspace::CLI
2
+ class Cloud < Terraspace::Command
3
+ Workspace = Terraspace::Terraform::Cloud::Workspace
4
+
5
+ desc "list", "List workspaces"
6
+ long_desc Help.text("cloud:list")
7
+ def list
8
+ Workspace.new(options).list
9
+ end
10
+
11
+ desc "destroy", "Destroy workspace"
12
+ long_desc Help.text("cloud:destroy")
13
+ option :yes, aliases: :y, type: :boolean, desc: "bypass are you sure prompt"
14
+ def destroy(mod)
15
+ Workspace.new(options.merge(mod: mod)).destroy
16
+ end
17
+
18
+ desc "setup", "Setup workspace"
19
+ long_desc Help.text("cloud:setup")
20
+ def setup(mod)
21
+ Workspace.new(options.merge(mod: mod)).setup
22
+ end
23
+ end
24
+ end