TerraformDevKit 0.3.3 → 0.3.4

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/.appveyor.yml +0 -0
  3. data/.gitignore +0 -0
  4. data/.rspec +2 -2
  5. data/.travis.yml +8 -8
  6. data/Gemfile +4 -4
  7. data/LICENSE +0 -0
  8. data/README.md +226 -206
  9. data/Rakefile +6 -6
  10. data/TerraformDevKit.gemspec +36 -36
  11. data/bin/console +14 -14
  12. data/bin/setup +8 -8
  13. data/exe/wait_for_url +0 -0
  14. data/lib/TerraformDevKit.rb +21 -21
  15. data/lib/TerraformDevKit/aws/aws.rb +65 -65
  16. data/lib/TerraformDevKit/aws/cloudfront.rb +20 -20
  17. data/lib/TerraformDevKit/aws/dynamodb.rb +46 -46
  18. data/lib/TerraformDevKit/aws/s3.rb +44 -44
  19. data/lib/TerraformDevKit/aws/terraform_remote_state.rb +67 -67
  20. data/lib/TerraformDevKit/backup_state.rb +18 -18
  21. data/lib/TerraformDevKit/command.rb +0 -0
  22. data/lib/TerraformDevKit/config.rb +0 -0
  23. data/lib/TerraformDevKit/download.rb +0 -0
  24. data/lib/TerraformDevKit/environment.rb +1 -0
  25. data/lib/TerraformDevKit/extended_file_utils.rb +14 -14
  26. data/lib/TerraformDevKit/os.rb +0 -0
  27. data/lib/TerraformDevKit/request.rb +0 -0
  28. data/lib/TerraformDevKit/retry.rb +0 -0
  29. data/lib/TerraformDevKit/terraform_config_manager.rb +4 -24
  30. data/lib/TerraformDevKit/terraform_env_manager.rb +0 -0
  31. data/lib/TerraformDevKit/terraform_installer.rb +0 -0
  32. data/lib/TerraformDevKit/terraform_log_filter.rb +0 -0
  33. data/lib/TerraformDevKit/terraform_project_config.rb +10 -10
  34. data/lib/TerraformDevKit/terraform_template_config_file.rb +0 -0
  35. data/lib/TerraformDevKit/terraform_template_renderer.rb +41 -0
  36. data/lib/TerraformDevKit/url.rb +0 -0
  37. data/lib/TerraformDevKit/version.rb +3 -3
  38. data/lib/TerraformDevKit/zip_file_generator.rb +47 -47
  39. data/tasks/devkit.rake +194 -194
  40. metadata +4 -3
data/tasks/devkit.rake CHANGED
@@ -1,194 +1,194 @@
1
- require 'rainbow'
2
- require 'TerraformDevKit'
3
-
4
- TDK = TerraformDevKit
5
-
6
- raise 'ROOT_PATH is not defined' if defined?(ROOT_PATH).nil?
7
- BIN_PATH = File.join(ROOT_PATH, 'bin')
8
- CONFIG_FILE ||= File.join(ROOT_PATH, 'config', 'config-%s.yml')
9
-
10
- # Ensure terraform is in the PATH
11
- ENV['PATH'] = TDK::OS.join_env_path(
12
- TDK::OS.convert_to_local_path(BIN_PATH),
13
- ENV['PATH']
14
- )
15
-
16
- PLAN_FILE = 'plan.tfplan'.freeze
17
-
18
- def destroy_if_fails(env, task)
19
- yield
20
- rescue Exception => e
21
- puts "ERROR: #{e.message}"
22
- puts e.backtrace.join("\n")
23
- invoke('destroy', task, env.name) if env.local_backend?
24
- raise
25
- end
26
-
27
- def invoke(task_name, task_context, env, safe_invoke: false)
28
- task_in_context = task_in_current_namespace(task_name, task_context)
29
- should_invoke = !safe_invoke || Rake::Task.task_defined?(task_in_context)
30
- Rake::Task[task_in_context].invoke(env) if should_invoke
31
- end
32
-
33
- def task_in_current_namespace(task_name, current_task)
34
- namespace = current_task.scope.path.to_s
35
- if namespace.empty?
36
- return task_name
37
- end
38
-
39
- return "#{namespace}:#{task_name}"
40
- end
41
-
42
- def remote_state
43
- aws_config = TDK::Aws::AwsConfig.new(TDK::Configuration.get('aws'))
44
- dynamo_db = TDK::Aws::DynamoDB.new(
45
- aws_config.credentials,
46
- aws_config.region
47
- )
48
- s3 = TDK::Aws::S3.new(
49
- aws_config.credentials,
50
- aws_config.region
51
- )
52
- TDK::Aws::TerraformRemoteState.new(dynamo_db, s3)
53
- end
54
-
55
- desc 'Prepares the environment to create the infrastructure'
56
- task :prepare, [:env] do |_, args|
57
- puts "== Configuring environment #{args.env}"
58
- env = TDK::Environment.new(args.env)
59
-
60
- config_file = CONFIG_FILE % env.config
61
- puts "== Loading configuration from #{config_file}"
62
- TDK::Configuration.init(config_file)
63
-
64
- TDK::TerraformInstaller.install_local(
65
- TDK::Configuration.get('terraform-version'),
66
- directory: BIN_PATH
67
- )
68
-
69
- project_config = TDK::TerraformProjectConfig.new(
70
- TDK::Configuration.get('project-name'),
71
- TDK::Configuration.get('project-acronym')
72
- )
73
- TDK::TerraformConfigManager.setup(env, project_config)
74
-
75
- unless env.local_backend?
76
- puts '== Initializing remote state'
77
- remote_state.init(env, project_config)
78
- end
79
-
80
- invoke('custom_prepare', task, args.env, safe_invoke: true)
81
-
82
- if File.exist?(File.join(env.working_dir, '.terraform'))
83
- get_cmd = 'terraform get'
84
- get_cmd += ' -update=true' if TDK::TerraformConfigManager.update_modules?
85
- TDK::Command.run(get_cmd, directory: env.working_dir)
86
- else
87
- init_cmd = 'terraform init'
88
- init_cmd += ' -upgrade=false' unless TDK::TerraformConfigManager.update_modules?
89
-
90
- TDK::Command.run(init_cmd, directory: env.working_dir)
91
- end
92
- end
93
-
94
- desc 'Shows the plan to create the infrastructure'
95
- task :plan, [:env] => :prepare do |_, args|
96
- env = TDK::Environment.new(args.env)
97
- Dir.chdir(env.working_dir) do
98
- system("terraform plan -out=#{PLAN_FILE}")
99
- end
100
- end
101
-
102
- desc 'Creates the infrastructure'
103
- task :apply, [:env] => :prepare do |task, args|
104
- invoke('pre_apply', task, args.env, safe_invoke: true)
105
-
106
- env = TDK::Environment.new(args.env)
107
-
108
- invoke('plan', task, env.name)
109
-
110
- unless env.local_backend?
111
- puts Rainbow("Are you sure you want to apply the above plan?\n" \
112
- "Only 'yes' will be accepted.").green
113
- response = STDIN.gets.strip
114
- unless response == 'yes'
115
- raise "Apply cancelled because response was not 'yes'.\n" \
116
- "Response was: #{response}"
117
- end
118
- end
119
-
120
- destroy_if_fails(env, task) do
121
- Dir.chdir(env.working_dir) do
122
- system("terraform apply \"#{PLAN_FILE}\"")
123
- end
124
- end
125
-
126
- invoke('post_apply', task, args.env, safe_invoke: true)
127
- end
128
-
129
- desc 'Tests a local environment'
130
- task :test, [:env] do |task, args|
131
- env = TDK::Environment.new(args.env)
132
- env.local_backend? || (raise 'Testing is only allowed for local environments')
133
-
134
- invoke('apply', task, env.name)
135
-
136
- destroy_if_fails(env, task) do
137
- invoke('custom_test', task, args.env, safe_invoke: true)
138
- end
139
- end
140
-
141
- desc 'Creates the infrastructure and runs the tests'
142
- task :preflight, [:prefix, :teardown] do |task, args|
143
- args.with_defaults(teardown: 'true')
144
- args.with_defaults(prefix: TDK::Environment.temp_name)
145
- env = TDK::Environment.new(args.prefix)
146
-
147
- invoke('test', task, env.name)
148
- invoke('clean', task, env.name) if args.teardown == 'true'
149
- end
150
-
151
- desc 'Destroys the infrastructure'
152
- task :destroy, [:env] => :prepare do |task, args|
153
- invoke('pre_destroy', task, args.env, safe_invoke: true)
154
-
155
- env = TDK::Environment.new(args.env)
156
- cmd = 'terraform destroy'
157
-
158
- unless env.local_backend?
159
- puts Rainbow("\n\n!!!! WARNING !!!!\n\n" \
160
- "You are about to destroy #{env.name} and its remote state.\n" \
161
- "Are you sure you want to proceed?\n" \
162
- "Only 'yes' will be accepted.").red.bright
163
- response = STDIN.gets.strip
164
-
165
- unless response == 'yes'
166
- raise "Destroy cancelled because response was not 'yes'.\n" \
167
- "Response was: #{response}"
168
- end
169
- end
170
-
171
- cmd += ' -force'
172
-
173
- Dir.chdir(env.working_dir) do
174
- system(cmd)
175
- end
176
- invoke('pre_destroy', task, args.env, safe_invoke: true)
177
-
178
- unless env.local_backend?
179
- project_config = TDK::TerraformProjectConfig.new(
180
- TDK::Configuration.get('project-name'),
181
- TDK::Configuration.get('project-acronym')
182
- )
183
- remote_state.destroy(env, project_config)
184
- end
185
-
186
- invoke('post_destroy', task, args.env, safe_invoke: true)
187
- end
188
-
189
- desc 'Cleans an environment (infrastructure is destroyed too)'
190
- task :clean, [:env] => :destroy do |_, args|
191
- env = TDK::Environment.new(args.env)
192
- puts "Deleting environment #{env.name} in #{env.working_dir}"
193
- TDK::ExtendedFileUtils.rm_rf(env.working_dir, secure: true)
194
- end
1
+ require 'rainbow'
2
+ require 'TerraformDevKit'
3
+
4
+ TDK = TerraformDevKit
5
+
6
+ raise 'ROOT_PATH is not defined' if defined?(ROOT_PATH).nil?
7
+ BIN_PATH = File.join(ROOT_PATH, 'bin')
8
+ CONFIG_FILE ||= File.join(ROOT_PATH, 'config', 'config-%s.yml')
9
+
10
+ # Ensure terraform is in the PATH
11
+ ENV['PATH'] = TDK::OS.join_env_path(
12
+ TDK::OS.convert_to_local_path(BIN_PATH),
13
+ ENV['PATH']
14
+ )
15
+
16
+ PLAN_FILE = 'plan.tfplan'.freeze
17
+
18
+ def destroy_if_fails(env, task)
19
+ yield
20
+ rescue Exception => e
21
+ puts "ERROR: #{e.message}"
22
+ puts e.backtrace.join("\n")
23
+ invoke('destroy', task, env.name) if env.local_backend?
24
+ raise
25
+ end
26
+
27
+ def invoke(task_name, task_context, env, safe_invoke: false)
28
+ task_in_context = task_in_current_namespace(task_name, task_context)
29
+ should_invoke = !safe_invoke || Rake::Task.task_defined?(task_in_context)
30
+ Rake::Task[task_in_context].invoke(env) if should_invoke
31
+ end
32
+
33
+ def task_in_current_namespace(task_name, current_task)
34
+ namespace = current_task.scope.path.to_s
35
+ if namespace.empty?
36
+ return task_name
37
+ end
38
+
39
+ return "#{namespace}:#{task_name}"
40
+ end
41
+
42
+ def remote_state
43
+ aws_config = TDK::Aws::AwsConfig.new(TDK::Configuration.get('aws'))
44
+ dynamo_db = TDK::Aws::DynamoDB.new(
45
+ aws_config.credentials,
46
+ aws_config.region
47
+ )
48
+ s3 = TDK::Aws::S3.new(
49
+ aws_config.credentials,
50
+ aws_config.region
51
+ )
52
+ TDK::Aws::TerraformRemoteState.new(dynamo_db, s3)
53
+ end
54
+
55
+ desc 'Prepares the environment to create the infrastructure'
56
+ task :prepare, [:env] do |_, args|
57
+ puts "== Configuring environment #{args.env}"
58
+ env = TDK::Environment.new(args.env)
59
+
60
+ config_file = CONFIG_FILE % env.config
61
+ puts "== Loading configuration from #{config_file}"
62
+ TDK::Configuration.init(config_file)
63
+
64
+ TDK::TerraformInstaller.install_local(
65
+ TDK::Configuration.get('terraform-version'),
66
+ directory: BIN_PATH
67
+ )
68
+
69
+ project_config = TDK::TerraformProjectConfig.new(
70
+ TDK::Configuration.get('project-name'),
71
+ TDK::Configuration.get('project-acronym')
72
+ )
73
+ TDK::TerraformConfigManager.setup(env, project_config)
74
+
75
+ unless env.local_backend?
76
+ puts '== Initializing remote state'
77
+ remote_state.init(env, project_config)
78
+ end
79
+
80
+ invoke('custom_prepare', task, args.env, safe_invoke: true)
81
+
82
+ if File.exist?(File.join(env.working_dir, '.terraform'))
83
+ get_cmd = 'terraform get'
84
+ get_cmd += ' -update=true' if TDK::TerraformConfigManager.update_modules?
85
+ TDK::Command.run(get_cmd, directory: env.working_dir)
86
+ else
87
+ init_cmd = 'terraform init'
88
+ init_cmd += ' -upgrade=false' unless TDK::TerraformConfigManager.update_modules?
89
+
90
+ TDK::Command.run(init_cmd, directory: env.working_dir)
91
+ end
92
+ end
93
+
94
+ desc 'Shows the plan to create the infrastructure'
95
+ task :plan, [:env] => :prepare do |_, args|
96
+ env = TDK::Environment.new(args.env)
97
+ Dir.chdir(env.working_dir) do
98
+ system("terraform plan -out=#{PLAN_FILE}")
99
+ end
100
+ end
101
+
102
+ desc 'Creates the infrastructure'
103
+ task :apply, [:env] => :prepare do |task, args|
104
+ invoke('pre_apply', task, args.env, safe_invoke: true)
105
+
106
+ env = TDK::Environment.new(args.env)
107
+
108
+ invoke('plan', task, env.name)
109
+
110
+ unless env.local_backend?
111
+ puts Rainbow("Are you sure you want to apply the above plan?\n" \
112
+ "Only 'yes' will be accepted.").green
113
+ response = STDIN.gets.strip
114
+ unless response == 'yes'
115
+ raise "Apply cancelled because response was not 'yes'.\n" \
116
+ "Response was: #{response}"
117
+ end
118
+ end
119
+
120
+ destroy_if_fails(env, task) do
121
+ Dir.chdir(env.working_dir) do
122
+ system("terraform apply \"#{PLAN_FILE}\"")
123
+ end
124
+ end
125
+
126
+ invoke('post_apply', task, args.env, safe_invoke: true)
127
+ end
128
+
129
+ desc 'Tests a local environment'
130
+ task :test, [:env] do |task, args|
131
+ env = TDK::Environment.new(args.env)
132
+ env.local_backend? || (raise 'Testing is only allowed for local environments')
133
+
134
+ invoke('apply', task, env.name)
135
+
136
+ destroy_if_fails(env, task) do
137
+ invoke('custom_test', task, args.env, safe_invoke: true)
138
+ end
139
+ end
140
+
141
+ desc 'Creates the infrastructure and runs the tests'
142
+ task :preflight, [:prefix, :teardown] do |task, args|
143
+ args.with_defaults(teardown: 'true')
144
+ args.with_defaults(prefix: TDK::Environment.temp_name)
145
+ env = TDK::Environment.new(args.prefix)
146
+
147
+ invoke('test', task, env.name)
148
+ invoke('clean', task, env.name) if args.teardown == 'true'
149
+ end
150
+
151
+ desc 'Destroys the infrastructure'
152
+ task :destroy, [:env] => :prepare do |task, args|
153
+ invoke('pre_destroy', task, args.env, safe_invoke: true)
154
+
155
+ env = TDK::Environment.new(args.env)
156
+ cmd = 'terraform destroy'
157
+
158
+ unless env.local_backend?
159
+ puts Rainbow("\n\n!!!! WARNING !!!!\n\n" \
160
+ "You are about to destroy #{env.name} and its remote state.\n" \
161
+ "Are you sure you want to proceed?\n" \
162
+ "Only 'yes' will be accepted.").red.bright
163
+ response = STDIN.gets.strip
164
+
165
+ unless response == 'yes'
166
+ raise "Destroy cancelled because response was not 'yes'.\n" \
167
+ "Response was: #{response}"
168
+ end
169
+ end
170
+
171
+ cmd += ' -force'
172
+
173
+ Dir.chdir(env.working_dir) do
174
+ system(cmd)
175
+ end
176
+ invoke('pre_destroy', task, args.env, safe_invoke: true)
177
+
178
+ unless env.local_backend?
179
+ project_config = TDK::TerraformProjectConfig.new(
180
+ TDK::Configuration.get('project-name'),
181
+ TDK::Configuration.get('project-acronym')
182
+ )
183
+ remote_state.destroy(env, project_config)
184
+ end
185
+
186
+ invoke('post_destroy', task, args.env, safe_invoke: true)
187
+ end
188
+
189
+ desc 'Cleans an environment (infrastructure is destroyed too)'
190
+ task :clean, [:env] => :destroy do |_, args|
191
+ env = TDK::Environment.new(args.env)
192
+ puts "Deleting environment #{env.name} in #{env.working_dir}"
193
+ TDK::ExtendedFileUtils.rm_rf(env.working_dir, secure: true)
194
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: TerraformDevKit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Jimenez
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-02-01 00:00:00.000000000 Z
11
+ date: 2018-02-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -205,6 +205,7 @@ files:
205
205
  - lib/TerraformDevKit/terraform_log_filter.rb
206
206
  - lib/TerraformDevKit/terraform_project_config.rb
207
207
  - lib/TerraformDevKit/terraform_template_config_file.rb
208
+ - lib/TerraformDevKit/terraform_template_renderer.rb
208
209
  - lib/TerraformDevKit/url.rb
209
210
  - lib/TerraformDevKit/version.rb
210
211
  - lib/TerraformDevKit/zip_file_generator.rb
@@ -229,7 +230,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
229
230
  version: '0'
230
231
  requirements: []
231
232
  rubyforge_project:
232
- rubygems_version: 2.6.13
233
+ rubygems_version: 2.5.1
233
234
  signing_key:
234
235
  specification_version: 4
235
236
  summary: Set of scripts to ease development and testing with Terraform.