rake_terraform 1.13.0 → 1.16.0.pre.3
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 +112 -30
- 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 +132 -49
data/lib/rake_terraform.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'logger'
|
2
4
|
require 'rake_dependencies'
|
3
5
|
require 'ruby_terraform'
|
@@ -6,137 +8,54 @@ require 'rake_terraform/tasks'
|
|
6
8
|
require 'rake_terraform/task_sets'
|
7
9
|
|
8
10
|
module RakeTerraform
|
9
|
-
include RubyTerraform
|
10
|
-
|
11
11
|
def self.define_command_tasks(opts = {}, &block)
|
12
12
|
RakeTerraform::TaskSets::All.define(opts, &block)
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.define_installation_tasks(opts = {})
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
namespace = opts[:namespace] || :terraform
|
20
|
-
version = opts[:version] || '0.10.3'
|
21
|
-
path = opts[:path] || File.join(Dir.pwd, 'vendor', 'terraform')
|
22
|
-
providers = opts[:providers] || []
|
23
|
-
|
24
|
-
command_task_set_opts = {
|
25
|
-
namespace: namespace,
|
26
|
-
dependency: 'terraform',
|
27
|
-
version: version,
|
28
|
-
path: path,
|
29
|
-
type: :zip,
|
30
|
-
|
31
|
-
os_ids: {mac: 'darwin', linux: 'linux'},
|
32
|
-
|
33
|
-
uri_template:
|
34
|
-
'https://releases.hashicorp.com/terraform/<%= @version %>/' +
|
35
|
-
'terraform_<%= @version %>_<%= @os_id %>_amd64<%= @ext %>',
|
36
|
-
file_name_template:
|
37
|
-
'terraform_<%= @version %>_<%= @os_id %>_amd64<%= @ext %>',
|
38
|
-
|
39
|
-
needs_fetch: lambda { |params|
|
40
|
-
terraform_binary = File.join(
|
41
|
-
params.path, params.binary_directory, 'terraform')
|
42
|
-
version_string = StringIO.new
|
16
|
+
command_task_set = define_command_installation_tasks(opts)
|
17
|
+
provider_task_sets = define_providers_installation_tasks(opts)
|
43
18
|
|
44
|
-
|
19
|
+
configure_ruby_terraform(command_task_set.binary)
|
20
|
+
wire_provider_ensure_tasks(opts)
|
45
21
|
|
46
|
-
|
47
|
-
|
48
|
-
.for_command(terraform_binary)
|
49
|
-
.with_flag('-version')
|
50
|
-
.build
|
51
|
-
|
52
|
-
logger.info(
|
53
|
-
'Fetching terraform version information using command: ' +
|
54
|
-
"#{command_line}")
|
55
|
-
|
56
|
-
command_line.execute(stdout: version_string)
|
57
|
-
|
58
|
-
logger.info(
|
59
|
-
"Terraform version information is: \n#{version_string.string}")
|
60
|
-
|
61
|
-
version_line = version_string.string.lines.first
|
62
|
-
version_is_correct = version_line =~ /#{version}/
|
63
|
-
|
64
|
-
logger.debug(
|
65
|
-
"Version: '#{version}' is in version line: " +
|
66
|
-
"'#{version_line}'?: #{version_is_correct}")
|
67
|
-
|
68
|
-
return !version_is_correct
|
69
|
-
end
|
22
|
+
[command_task_set.delegate, provider_task_sets.map(&:delegate)]
|
23
|
+
end
|
70
24
|
|
71
|
-
|
72
|
-
|
73
|
-
}
|
25
|
+
class << self
|
26
|
+
private
|
74
27
|
|
75
|
-
|
76
|
-
|
28
|
+
def define_command_installation_tasks(opts = {})
|
29
|
+
RakeTerraform::TaskSets::Terraform.define(opts)
|
77
30
|
end
|
78
31
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
provider_task_sets = providers.map do |provider|
|
83
|
-
dependency = "terraform-provider-#{provider[:name]}"
|
84
|
-
provider_task_set_opts = {
|
85
|
-
namespace: provider[:name],
|
86
|
-
dependency: dependency,
|
87
|
-
version: provider[:version],
|
88
|
-
path: provider[:path] || File.join('vendor', dependency),
|
89
|
-
type: :tar_gz,
|
90
|
-
|
91
|
-
os_ids: {mac: 'darwin', linux: 'linux'},
|
92
|
-
|
93
|
-
uri_template:
|
94
|
-
"https://github.com/#{provider[:repository]}/releases/" +
|
95
|
-
"download/<%= @version %>/" +
|
96
|
-
"#{dependency}_v<%= @version %>_<%= @os_id %>" +
|
97
|
-
"_amd64<%= @ext %>",
|
98
|
-
file_name_template:
|
99
|
-
"#{dependency}_v<%= @version %>_<%= @os_id %>_amd64<%= @ext %>",
|
100
|
-
|
101
|
-
source_binary_name_template: dependency,
|
102
|
-
target_binary_name_template: "#{dependency}_v<%= @version %>",
|
103
|
-
|
104
|
-
installation_directory: "#{ENV['HOME']}/.terraform.d/plugins",
|
105
|
-
|
106
|
-
needs_fetch: lambda { |params|
|
107
|
-
provider_binary = File.join(
|
108
|
-
params.path,
|
109
|
-
params.binary_directory,
|
110
|
-
"#{dependency}_v#{params.version}")
|
111
|
-
|
112
|
-
logger.info(
|
113
|
-
"Terraform provider binary for: #{provider.name} " +
|
114
|
-
"should be at: #{provider_binary}")
|
115
|
-
|
116
|
-
binary_exists = File.exists?(provider_binary)
|
117
|
-
|
118
|
-
logger.debug("Provider file exists?: #{binary_exists}")
|
119
|
-
|
120
|
-
!binary_exists
|
121
|
-
}
|
122
|
-
}
|
32
|
+
def define_provider_installation_tasks(opts = {})
|
33
|
+
RakeTerraform::TaskSets::Provider.define(opts)
|
34
|
+
end
|
123
35
|
|
124
|
-
|
125
|
-
|
36
|
+
def define_providers_installation_tasks(opts = {})
|
37
|
+
namespace = opts[:namespace] || :terraform
|
38
|
+
providers = opts[:providers] || []
|
126
39
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
40
|
+
providers.map do |provider_opts|
|
41
|
+
define_provider_installation_tasks(
|
42
|
+
{ parent_namespace: namespace }.merge(provider_opts)
|
43
|
+
)
|
131
44
|
end
|
45
|
+
end
|
132
46
|
|
133
|
-
|
47
|
+
def configure_ruby_terraform(binary)
|
48
|
+
RubyTerraform.configure { |c| c.binary = binary }
|
134
49
|
end
|
135
50
|
|
136
|
-
|
137
|
-
|
138
|
-
|
51
|
+
def wire_provider_ensure_tasks(opts)
|
52
|
+
namespace = opts[:namespace] || :terraform
|
53
|
+
providers = opts[:providers] || []
|
139
54
|
|
140
|
-
|
55
|
+
Rake::Task["#{namespace}:ensure"]
|
56
|
+
.enhance(providers.map do |provider_opts|
|
57
|
+
"#{namespace}:providers:#{provider_opts[:name]}:ensure"
|
58
|
+
end)
|
59
|
+
end
|
141
60
|
end
|
142
61
|
end
|
@@ -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
|