rake_terraform 1.14.0.pre.1 → 1.16.0.pre.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.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/Gemfile.lock +94 -14
- data/Rakefile +89 -42
- data/bin/console +4 -3
- data/lib/rake_terraform.rb +33 -114
- data/lib/rake_terraform/task_sets.rb +4 -0
- data/lib/rake_terraform/task_sets/all.rb +50 -40
- data/lib/rake_terraform/task_sets/provider.rb +168 -0
- data/lib/rake_terraform/task_sets/terraform.rb +179 -0
- data/lib/rake_terraform/tasks.rb +2 -0
- data/lib/rake_terraform/tasks/destroy.rb +42 -30
- data/lib/rake_terraform/tasks/output.rb +34 -28
- data/lib/rake_terraform/tasks/plan.rb +40 -32
- data/lib/rake_terraform/tasks/provision.rb +42 -31
- data/lib/rake_terraform/tasks/validate.rb +33 -33
- data/lib/rake_terraform/version.rb +3 -1
- data/rake_terraform.gemspec +62 -0
- metadata +130 -47
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rake_factory'
|
2
4
|
|
3
5
|
require_relative '../tasks'
|
@@ -5,9 +7,9 @@ require_relative '../tasks'
|
|
5
7
|
module RakeTerraform
|
6
8
|
module TaskSets
|
7
9
|
class All < RakeFactory::TaskSet
|
8
|
-
parameter :configuration_name, :
|
9
|
-
parameter :source_directory, :
|
10
|
-
parameter :work_directory, :
|
10
|
+
parameter :configuration_name, required: true
|
11
|
+
parameter :source_directory, required: true
|
12
|
+
parameter :work_directory, required: true
|
11
13
|
|
12
14
|
parameter :backend_config
|
13
15
|
|
@@ -15,73 +17,81 @@ module RakeTerraform
|
|
15
17
|
parameter :var_file
|
16
18
|
parameter :state_file
|
17
19
|
|
18
|
-
parameter :debug, :
|
20
|
+
parameter :debug, default: false
|
21
|
+
|
22
|
+
parameter :input, default: false
|
19
23
|
|
20
|
-
parameter :no_color, :
|
21
|
-
parameter :no_backup, :
|
22
|
-
parameter :no_print_output, :
|
24
|
+
parameter :no_color, default: false
|
25
|
+
parameter :no_backup, default: false
|
26
|
+
parameter :no_print_output, default: false
|
23
27
|
|
24
28
|
parameter :backup_file
|
25
29
|
parameter :plan_file
|
26
30
|
|
27
31
|
parameter :argument_names
|
28
32
|
|
29
|
-
parameter :ensure_task_name, :
|
33
|
+
parameter :ensure_task_name, default: :'terraform:ensure'
|
30
34
|
|
31
|
-
parameter :validate_task_name, :
|
35
|
+
parameter :validate_task_name, default: :validate
|
32
36
|
parameter :validate_argument_names
|
33
37
|
|
34
|
-
parameter :plan_task_name, :
|
38
|
+
parameter :plan_task_name, default: :plan
|
35
39
|
parameter :plan_argument_names
|
36
40
|
|
37
|
-
parameter :provision_task_name, :
|
41
|
+
parameter :provision_task_name, default: :provision
|
38
42
|
parameter :provision_argument_names
|
39
43
|
|
40
|
-
parameter :destroy_task_name, :
|
44
|
+
parameter :destroy_task_name, default: :destroy
|
41
45
|
parameter :destroy_argument_names
|
42
46
|
|
43
|
-
parameter :output_task_name, :
|
47
|
+
parameter :output_task_name, default: :output
|
44
48
|
parameter :output_argument_names
|
45
49
|
|
46
|
-
task Tasks::Validate,
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
50
|
+
task Tasks::Validate, {
|
51
|
+
name: RakeFactory::DynamicValue.new do |ts|
|
52
|
+
ts.validate_task_name
|
53
|
+
end,
|
54
|
+
argument_names:
|
55
|
+
RakeFactory::DynamicValue.new do |ts|
|
51
56
|
ts.validate_argument_names || ts.argument_names || []
|
52
|
-
|
57
|
+
end
|
58
|
+
}
|
53
59
|
task Tasks::Plan, {
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
60
|
+
name: RakeFactory::DynamicValue.new do |ts|
|
61
|
+
ts.plan_task_name
|
62
|
+
end,
|
63
|
+
argument_names:
|
64
|
+
RakeFactory::DynamicValue.new do |ts|
|
58
65
|
ts.plan_argument_names || ts.argument_names || []
|
59
|
-
|
66
|
+
end
|
60
67
|
}
|
61
68
|
task Tasks::Provision, {
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
69
|
+
name: RakeFactory::DynamicValue.new do |ts|
|
70
|
+
ts.provision_task_name
|
71
|
+
end,
|
72
|
+
argument_names:
|
73
|
+
RakeFactory::DynamicValue.new do |ts|
|
66
74
|
ts.provision_argument_names || ts.argument_names || []
|
67
|
-
|
75
|
+
end
|
68
76
|
}
|
69
77
|
task Tasks::Destroy, {
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
78
|
+
name: RakeFactory::DynamicValue.new do |ts|
|
79
|
+
ts.destroy_task_name
|
80
|
+
end,
|
81
|
+
argument_names:
|
82
|
+
RakeFactory::DynamicValue.new do |ts|
|
74
83
|
ts.destroy_argument_names || ts.argument_names || []
|
75
|
-
|
84
|
+
end
|
76
85
|
}
|
77
86
|
task Tasks::Output, {
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
87
|
+
name: RakeFactory::DynamicValue.new do |ts|
|
88
|
+
ts.output_task_name
|
89
|
+
end,
|
90
|
+
argument_names:
|
91
|
+
RakeFactory::DynamicValue.new do |ts|
|
82
92
|
ts.output_argument_names || ts.argument_names || []
|
83
|
-
|
93
|
+
end
|
84
94
|
}
|
85
95
|
end
|
86
96
|
end
|
87
|
-
end
|
97
|
+
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rake'
|
4
|
+
|
5
|
+
module RakeTerraform
|
6
|
+
module TaskSets
|
7
|
+
# rubocop:disable Metrics/ClassLength
|
8
|
+
|
9
|
+
class Provider
|
10
|
+
def self.define(*args, &configuration_block)
|
11
|
+
new(*args, &configuration_block).define_on(Rake.application)
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :delegate
|
15
|
+
|
16
|
+
def initialize(*args, &configuration_block)
|
17
|
+
@opts = args[0]
|
18
|
+
@delegate = RakeDependencies::TaskSets::All.new(
|
19
|
+
task_set_opts, &configuration_block
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
def define_on(application)
|
24
|
+
Rake.application.in_namespace parent_namespace do
|
25
|
+
Rake.application.in_namespace :providers do
|
26
|
+
@delegate.define_on(application)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
# rubocop:disable Metrics/MethodLength
|
35
|
+
|
36
|
+
def task_set_opts
|
37
|
+
{
|
38
|
+
namespace: namespace,
|
39
|
+
dependency: dependency,
|
40
|
+
version: version,
|
41
|
+
path: path,
|
42
|
+
type: type,
|
43
|
+
|
44
|
+
os_ids: os_ids,
|
45
|
+
|
46
|
+
uri_template: uri_template,
|
47
|
+
file_name_template: file_name_template,
|
48
|
+
|
49
|
+
source_binary_name_template: source_binary_name_template,
|
50
|
+
target_binary_name_template: target_binary_name_template,
|
51
|
+
|
52
|
+
installation_directory: installation_directory,
|
53
|
+
|
54
|
+
needs_fetch: needs_fetch
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
# rubocop:enable Metrics/MethodLength
|
59
|
+
|
60
|
+
def logger
|
61
|
+
@logger ||=
|
62
|
+
@opts[:logger] ||
|
63
|
+
Logger.new($stderr,
|
64
|
+
level: Logger.const_get(ENV['TF_LOG'] || 'WARN'))
|
65
|
+
end
|
66
|
+
|
67
|
+
def name
|
68
|
+
@name ||= @opts[:name]
|
69
|
+
end
|
70
|
+
|
71
|
+
def repository
|
72
|
+
@repository ||= @opts[:repository]
|
73
|
+
end
|
74
|
+
|
75
|
+
def parent_namespace
|
76
|
+
@parent_namespace ||= @opts[:parent_namespace] || :terraform
|
77
|
+
end
|
78
|
+
|
79
|
+
def namespace
|
80
|
+
@namespace ||= @opts[:namespace] || name
|
81
|
+
end
|
82
|
+
|
83
|
+
def dependency
|
84
|
+
@dependency ||= "terraform-provider-#{name}"
|
85
|
+
end
|
86
|
+
|
87
|
+
def version
|
88
|
+
@version ||= @opts[:version]
|
89
|
+
end
|
90
|
+
|
91
|
+
def path
|
92
|
+
@path ||= @opts[:path] || File.join('vendor', dependency)
|
93
|
+
end
|
94
|
+
|
95
|
+
def binary_directory
|
96
|
+
@binary_directory ||= 'bin'
|
97
|
+
end
|
98
|
+
|
99
|
+
def binary_name
|
100
|
+
@binary_name ||= "#{dependency}_v#{version}"
|
101
|
+
end
|
102
|
+
|
103
|
+
def binary
|
104
|
+
@binary ||= File.join(path, binary_directory, binary_name)
|
105
|
+
end
|
106
|
+
|
107
|
+
def type
|
108
|
+
@type ||= :tar_gz
|
109
|
+
end
|
110
|
+
|
111
|
+
def os_ids
|
112
|
+
@os_ids ||= { mac: 'darwin', linux: 'linux' }
|
113
|
+
end
|
114
|
+
|
115
|
+
def uri_template
|
116
|
+
@uri_template ||=
|
117
|
+
"https://github.com/#{repository}/releases/" \
|
118
|
+
'download/<%= @version %>/' \
|
119
|
+
"#{dependency}_v<%= @version %>_<%= @os_id %>" \
|
120
|
+
'_amd64<%= @ext %>'
|
121
|
+
end
|
122
|
+
|
123
|
+
def file_name_template
|
124
|
+
@file_name_template ||=
|
125
|
+
"#{dependency}_v<%= @version %>_<%= @os_id %>_amd64<%= @ext %>"
|
126
|
+
end
|
127
|
+
|
128
|
+
def source_binary_name_template
|
129
|
+
@source_binary_name_template ||= dependency
|
130
|
+
end
|
131
|
+
|
132
|
+
def target_binary_name_template
|
133
|
+
@target_binary_name_template ||= "#{dependency}_v<%= @version %>"
|
134
|
+
end
|
135
|
+
|
136
|
+
def installation_directory
|
137
|
+
@installation_directory ||= "#{ENV['HOME']}/.terraform.d/plugins"
|
138
|
+
end
|
139
|
+
|
140
|
+
def needs_fetch
|
141
|
+
@needs_fetch ||= ->(_) { return !exist?(binary) }
|
142
|
+
end
|
143
|
+
|
144
|
+
def exist?(binary)
|
145
|
+
log_binary_location(binary)
|
146
|
+
|
147
|
+
result = File.exist?(binary)
|
148
|
+
|
149
|
+
log_check_outcome(result)
|
150
|
+
|
151
|
+
result
|
152
|
+
end
|
153
|
+
|
154
|
+
def log_binary_location(binary)
|
155
|
+
logger.info(
|
156
|
+
"Terraform provider binary for: #{name} " \
|
157
|
+
"should be at: #{binary}"
|
158
|
+
)
|
159
|
+
end
|
160
|
+
|
161
|
+
def log_check_outcome(result)
|
162
|
+
logger.debug("Provider file exists?: #{result}")
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
# rubocop:enable Metrics/ClassLength
|
167
|
+
end
|
168
|
+
end
|
@@ -0,0 +1,179 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rake'
|
4
|
+
|
5
|
+
module RakeTerraform
|
6
|
+
module TaskSets
|
7
|
+
# rubocop:disable Metrics/ClassLength
|
8
|
+
|
9
|
+
class Terraform
|
10
|
+
def self.define(*args, &configuration_block)
|
11
|
+
new(*args, &configuration_block).define_on(Rake.application)
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :delegate
|
15
|
+
|
16
|
+
def initialize(*args, &configuration_block)
|
17
|
+
@opts = args[0]
|
18
|
+
@delegate =
|
19
|
+
RakeDependencies::TaskSets::All.define(
|
20
|
+
task_set_opts, &configuration_block
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
def define_on(application)
|
25
|
+
@delegate.define_on(application)
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
def binary
|
30
|
+
@binary ||= File.join(path, binary_directory, binary_name)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
# rubocop:disable Metrics/MethodLength
|
36
|
+
|
37
|
+
def task_set_opts
|
38
|
+
{
|
39
|
+
namespace: namespace,
|
40
|
+
dependency: dependency,
|
41
|
+
version: version,
|
42
|
+
path: path,
|
43
|
+
type: type,
|
44
|
+
|
45
|
+
os_ids: os_ids,
|
46
|
+
|
47
|
+
uri_template: uri_template,
|
48
|
+
file_name_template: file_name_template,
|
49
|
+
|
50
|
+
binary_directory: binary_directory,
|
51
|
+
|
52
|
+
needs_fetch: needs_fetch
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
# rubocop:enable Metrics/MethodLength
|
57
|
+
|
58
|
+
def logger
|
59
|
+
@logger ||=
|
60
|
+
@opts[:logger] ||
|
61
|
+
Logger.new($stderr,
|
62
|
+
level: Logger.const_get(ENV['TF_LOG'] || 'WARN'))
|
63
|
+
end
|
64
|
+
|
65
|
+
def namespace
|
66
|
+
@namespace ||= @opts[:namespace] || :terraform
|
67
|
+
end
|
68
|
+
|
69
|
+
def dependency
|
70
|
+
@dependency ||= 'terraform'
|
71
|
+
end
|
72
|
+
|
73
|
+
def version
|
74
|
+
@version ||= @opts[:version] || '0.10.3'
|
75
|
+
end
|
76
|
+
|
77
|
+
def path
|
78
|
+
@path ||= @opts[:path] ||
|
79
|
+
File.join(Dir.pwd, 'vendor', 'terraform')
|
80
|
+
end
|
81
|
+
|
82
|
+
def binary_directory
|
83
|
+
@binary_directory ||= 'bin'
|
84
|
+
end
|
85
|
+
|
86
|
+
def binary_name
|
87
|
+
@binary_name ||= 'terraform'
|
88
|
+
end
|
89
|
+
|
90
|
+
def type
|
91
|
+
@type ||= :zip
|
92
|
+
end
|
93
|
+
|
94
|
+
def os_ids
|
95
|
+
@os_ids ||= { mac: 'darwin', linux: 'linux' }
|
96
|
+
end
|
97
|
+
|
98
|
+
def uri_template
|
99
|
+
@uri_template ||=
|
100
|
+
'https://releases.hashicorp.com/terraform/<%= @version %>/' \
|
101
|
+
'terraform_<%= @version %>_<%= @os_id %>_amd64<%= @ext %>'
|
102
|
+
end
|
103
|
+
|
104
|
+
def file_name_template
|
105
|
+
@file_name_template ||=
|
106
|
+
'terraform_<%= @version %>_<%= @os_id %>_amd64<%= @ext %>'
|
107
|
+
end
|
108
|
+
|
109
|
+
def needs_fetch
|
110
|
+
@needs_fetch ||= ->(_) { return !exists_with_correct_version?(binary) }
|
111
|
+
end
|
112
|
+
|
113
|
+
def exists_with_correct_version?(binary)
|
114
|
+
log_binary_location(binary)
|
115
|
+
|
116
|
+
exist?(binary) && correct_version?(binary)
|
117
|
+
end
|
118
|
+
|
119
|
+
def exist?(binary)
|
120
|
+
File.exist?(binary)
|
121
|
+
end
|
122
|
+
|
123
|
+
def correct_version?(binary)
|
124
|
+
result = StringIO.new
|
125
|
+
command = version_command(binary)
|
126
|
+
|
127
|
+
log_version_lookup(command)
|
128
|
+
|
129
|
+
command.execute(stdout: result)
|
130
|
+
|
131
|
+
log_version_information(result)
|
132
|
+
log_check_outcome(result)
|
133
|
+
|
134
|
+
contains_version_number?(result)
|
135
|
+
end
|
136
|
+
|
137
|
+
def version_command(binary)
|
138
|
+
Lino::CommandLineBuilder
|
139
|
+
.for_command(binary)
|
140
|
+
.with_flag('-version')
|
141
|
+
.build
|
142
|
+
end
|
143
|
+
|
144
|
+
def log_binary_location(binary)
|
145
|
+
logger.info("Terraform binary should be at: #{binary}")
|
146
|
+
end
|
147
|
+
|
148
|
+
def log_version_lookup(command)
|
149
|
+
logger.info(
|
150
|
+
'Fetching terraform version information using command: ' \
|
151
|
+
"#{command}"
|
152
|
+
)
|
153
|
+
end
|
154
|
+
|
155
|
+
def log_version_information(result)
|
156
|
+
logger.info(
|
157
|
+
"Terraform version information is: \n#{result}"
|
158
|
+
)
|
159
|
+
end
|
160
|
+
|
161
|
+
def log_check_outcome(result)
|
162
|
+
logger.debug(
|
163
|
+
"Version: '#{version}' is in version line: " \
|
164
|
+
"'#{version_line(result)}'?: #{contains_version_number?(result)}"
|
165
|
+
)
|
166
|
+
end
|
167
|
+
|
168
|
+
def version_line(result)
|
169
|
+
result.string.lines.first
|
170
|
+
end
|
171
|
+
|
172
|
+
def contains_version_number?(result)
|
173
|
+
version_line(result) =~ /#{version}/
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
# rubocop:enable Metrics/ClassLength
|
178
|
+
end
|
179
|
+
end
|