cloudspin-stack 0.1.30 → 0.1.31
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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 678301e9078d489fdeb291e89c89b211d00331c49602667ff731ed8b4e890854
|
4
|
+
data.tar.gz: a08a9749c18e6a6ad20f12c4bbb229c32d2c6b6fab8453fd9f078377ccdab2cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76f814c40a4775c4018ea824c56ace5a39711c336fcd26cf04c9d992f320ea059c5f44cdd5f868fd13086bfe52168b15f4a2c728f48b5e8785f1be156252bd54
|
7
|
+
data.tar.gz: 3942f2712d44d275b154c2f234132e56e124e3cd0583b3693132669aefd9873eee9eed5d4b76a94b7b7ba9690e10f86c89318bb0ea556eb1f73f3ada80ff5965
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'ruby_terraform'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Cloudspin
|
5
|
+
module Stack
|
6
|
+
class BackendConfiguration
|
7
|
+
|
8
|
+
attr_reader :local_state_folder
|
9
|
+
attr_reader :local_statefile
|
10
|
+
|
11
|
+
def initialize(
|
12
|
+
terraform_backend_configuration_values:,
|
13
|
+
instance_identifier:,
|
14
|
+
stack_name:,
|
15
|
+
base_folder:
|
16
|
+
)
|
17
|
+
@terraform_backend_configuration_values = terraform_backend_configuration_values
|
18
|
+
@instance_identifier = instance_identifier
|
19
|
+
@stack_name = stack_name
|
20
|
+
@base_folder = base_folder
|
21
|
+
|
22
|
+
@has_remote_state = ! @terraform_backend_configuration_values['bucket'].nil?
|
23
|
+
|
24
|
+
if @has_remote_state
|
25
|
+
# puts "DEBUG: Using remote state"
|
26
|
+
@local_state_folder = nil
|
27
|
+
@local_statefile = nil
|
28
|
+
@terraform_backend_configuration_values['key'] = default_state_key
|
29
|
+
@migrate_state = initialize_migrate_flag
|
30
|
+
else
|
31
|
+
# puts "DEBUG: Not using remote state"
|
32
|
+
@migrate_state = false
|
33
|
+
end
|
34
|
+
|
35
|
+
if !@has_remote_state || @migrate_state
|
36
|
+
@local_state_folder = intialize_state_folder
|
37
|
+
@local_statefile = "#{@local_state_folder}/#{@instance_identifier}.tfstate"
|
38
|
+
# puts "DEBUG: Local statefile: #{@local_statefile}"
|
39
|
+
# puts "DEBUG: Migrating? #{@migrate_state}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def terraform_init_parameters
|
44
|
+
if remote_state?
|
45
|
+
{
|
46
|
+
backend: 'true',
|
47
|
+
force_copy: migrate_state?,
|
48
|
+
backend_config: @terraform_backend_configuration_values
|
49
|
+
}
|
50
|
+
else
|
51
|
+
{}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def terraform_command_parameters
|
56
|
+
if remote_state?
|
57
|
+
{}
|
58
|
+
else
|
59
|
+
{
|
60
|
+
:state => @local_statefile
|
61
|
+
}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def intialize_state_folder
|
66
|
+
# TODO: Prefer to not actually create the folder, but seemed necessary to build the full path string.
|
67
|
+
FileUtils.mkdir_p "#{@base_folder}/state"
|
68
|
+
Pathname.new("#{@base_folder}/state/#{@instance_identifier}").realdirpath.to_s
|
69
|
+
end
|
70
|
+
|
71
|
+
def initialize_migrate_flag
|
72
|
+
if @terraform_backend_configuration_values['migrate'].nil?
|
73
|
+
false
|
74
|
+
else
|
75
|
+
migrate_value = @terraform_backend_configuration_values.delete('migrate')
|
76
|
+
migrate_value.to_s.downcase == 'true'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def default_state_key
|
81
|
+
"#{@instance_identifier}.tfstate"
|
82
|
+
end
|
83
|
+
|
84
|
+
def migrate_state?
|
85
|
+
@migrate_state
|
86
|
+
end
|
87
|
+
|
88
|
+
def remote_state?
|
89
|
+
@has_remote_state
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
@@ -55,7 +55,10 @@ module Cloudspin
|
|
55
55
|
)
|
56
56
|
|
57
57
|
if instance_configuration.has_remote_state_configuration? && stack_definition.is_from_remote?
|
58
|
-
|
58
|
+
# puts "DEBUG: Stack instance is configured to use remote terraform state AND remote stack definition code"
|
59
|
+
add_backend_configuration_source(stack_definition.source_path)
|
60
|
+
# else
|
61
|
+
# puts "DEBUG: Stack instance is configured to use local terraform state AND/OR local stack definition code"
|
59
62
|
end
|
60
63
|
|
61
64
|
self.new(
|
@@ -71,7 +74,7 @@ module Cloudspin
|
|
71
74
|
Pathname.new(folder).realdirpath.to_s
|
72
75
|
end
|
73
76
|
|
74
|
-
def self.
|
77
|
+
def self.add_backend_configuration_source(terraform_source_folder)
|
75
78
|
# puts "DEBUG: Creating file #{terraform_source_folder}/_cloudspin_created_backend.tf"
|
76
79
|
File.open("#{terraform_source_folder}/_cloudspin_created_backend.tf", 'w') { |backend_file|
|
77
80
|
backend_file.write(<<~TF_BACKEND_SOURCE
|
@@ -97,6 +100,18 @@ module Cloudspin
|
|
97
100
|
configuration.resource_values
|
98
101
|
end
|
99
102
|
|
103
|
+
# def migrate
|
104
|
+
# RubyTerraform.clean(directory: working_folder)
|
105
|
+
# mkdir_p File.dirname(working_folder)
|
106
|
+
# cp_r @stack_definition.source_path, working_folder
|
107
|
+
# Dir.chdir(working_folder) do
|
108
|
+
# # cp configuration.backend_configuration.local_state_folder
|
109
|
+
# terraform_init
|
110
|
+
# # terraform_state_push()
|
111
|
+
# RubyTerraform.plan(terraform_command_parameters)
|
112
|
+
# end
|
113
|
+
# end
|
114
|
+
|
100
115
|
def plan(plan_destroy: false)
|
101
116
|
RubyTerraform.clean(directory: working_folder)
|
102
117
|
mkdir_p File.dirname(working_folder)
|
@@ -168,12 +183,22 @@ module Cloudspin
|
|
168
183
|
end
|
169
184
|
end
|
170
185
|
|
171
|
-
|
172
186
|
def terraform_init
|
187
|
+
if configuration.backend_configuration.migrate_state?
|
188
|
+
prepare_state_for_migration
|
189
|
+
end
|
173
190
|
RubyTerraform.init(terraform_init_params)
|
174
191
|
end
|
175
192
|
|
193
|
+
def prepare_state_for_migration
|
194
|
+
# puts "DEBUG: Preparing to migrate state from #{configuration.backend_configuration.local_statefile}"
|
195
|
+
cp configuration.backend_configuration.local_statefile, "#{working_folder}/terraform.tfstate"
|
196
|
+
end
|
197
|
+
|
176
198
|
def init_dry
|
199
|
+
if configuration.backend_configuration.migrate_state?
|
200
|
+
"cp #{configuration.backend_configuration.local_statefile} -> #{working_folder}/terraform.tfstate"
|
201
|
+
end
|
177
202
|
init_command = RubyTerraform::Commands::Init.new
|
178
203
|
command_line_builder = init_command.instantiate_builder
|
179
204
|
configured_command = init_command.configure_command(
|
@@ -185,26 +210,21 @@ module Cloudspin
|
|
185
210
|
end
|
186
211
|
|
187
212
|
def terraform_init_params
|
188
|
-
|
189
|
-
{
|
190
|
-
backend: 'true',
|
191
|
-
backend_config: backend_parameters
|
192
|
-
}
|
193
|
-
else
|
194
|
-
{}
|
195
|
-
end
|
213
|
+
configuration.backend_configuration.terraform_init_parameters
|
196
214
|
end
|
197
215
|
|
216
|
+
# TODO: Redundant? The folder is created in the BackendConfiguration class ...
|
198
217
|
def ensure_state_folder
|
199
218
|
if configuration.has_local_state_configuration?
|
200
|
-
Instance.ensure_folder(configuration.
|
219
|
+
Instance.ensure_folder(configuration.backend_configuration.local_state_folder)
|
201
220
|
end
|
202
221
|
end
|
203
222
|
|
204
223
|
def terraform_command_parameters(added_parameters = {})
|
205
224
|
{
|
206
225
|
vars: terraform_variables
|
207
|
-
}.merge(
|
226
|
+
}.merge(configuration.backend_configuration.terraform_command_parameters)
|
227
|
+
.merge(added_parameters)
|
208
228
|
end
|
209
229
|
|
210
230
|
def terraform_variables
|
@@ -213,22 +233,6 @@ module Cloudspin
|
|
213
233
|
}.merge({ 'instance_identifier' => id })
|
214
234
|
end
|
215
235
|
|
216
|
-
def local_state_parameters
|
217
|
-
if configuration.has_local_state_configuration?
|
218
|
-
{ state: configuration.local_statefile }
|
219
|
-
else
|
220
|
-
{}
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
def backend_parameters
|
225
|
-
if configuration.has_remote_state_configuration?
|
226
|
-
configuration.terraform_backend
|
227
|
-
else
|
228
|
-
{}
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
236
|
end
|
233
237
|
end
|
234
238
|
end
|
@@ -15,13 +15,17 @@ module Cloudspin
|
|
15
15
|
|
16
16
|
attr_reader :stack_name
|
17
17
|
attr_reader :instance_identifier
|
18
|
-
attr_reader :
|
18
|
+
attr_reader :backend_configuration
|
19
|
+
|
20
|
+
|
21
|
+
attr_reader :Xterraform_backend
|
19
22
|
|
20
23
|
def initialize(
|
21
24
|
configuration_values: {},
|
22
25
|
stack_definition:,
|
23
26
|
base_folder: '.'
|
24
27
|
)
|
28
|
+
# puts "DEBUG: InstanceConfiguration configuration_values: #{configuration_values}"
|
25
29
|
@stack_definition = stack_definition
|
26
30
|
@base_folder = base_folder
|
27
31
|
|
@@ -29,21 +33,23 @@ module Cloudspin
|
|
29
33
|
@instance_values = configuration_values['instance'] || {}
|
30
34
|
@parameter_values = configuration_values['parameters'] || {}
|
31
35
|
@resource_values = configuration_values['resources'] || {}
|
32
|
-
|
33
36
|
@stack_name = @stack_values['name'] || stack_definition.name
|
37
|
+
init_instance_identifier
|
38
|
+
@backend_configuration = BackendConfiguration.new(
|
39
|
+
terraform_backend_configuration_values: configuration_values['terraform_backend'] || {},
|
40
|
+
instance_identifier: instance_identifier,
|
41
|
+
stack_name: stack_name,
|
42
|
+
base_folder: base_folder
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
def init_instance_identifier
|
34
47
|
@instance_identifier = if @instance_values['identifier']
|
35
|
-
instance_values['identifier']
|
48
|
+
@instance_values['identifier']
|
36
49
|
elsif @instance_values['group']
|
37
|
-
stack_name + '-' + @instance_values['group']
|
50
|
+
@stack_name + '-' + @instance_values['group']
|
38
51
|
else
|
39
|
-
stack_name
|
40
|
-
end
|
41
|
-
|
42
|
-
@terraform_backend = configuration_values['terraform_backend'] || {}
|
43
|
-
if @terraform_backend.empty?
|
44
|
-
@terraform_backend['statefile_folder'] = default_state_folder
|
45
|
-
else
|
46
|
-
@terraform_backend['key'] = default_state_key
|
52
|
+
@stack_name
|
47
53
|
end
|
48
54
|
end
|
49
55
|
|
@@ -73,30 +79,17 @@ module Cloudspin
|
|
73
79
|
if File.exists?(yaml_file)
|
74
80
|
YAML.load_file(yaml_file) || {}
|
75
81
|
else
|
76
|
-
puts "No configuration file: #{yaml_file}"
|
82
|
+
puts "WARNING: No configuration file: #{yaml_file}"
|
77
83
|
{}
|
78
84
|
end
|
79
85
|
end
|
80
86
|
|
81
87
|
def has_local_state_configuration?
|
82
|
-
! @
|
83
|
-
end
|
84
|
-
|
85
|
-
def local_statefile
|
86
|
-
"#{@terraform_backend['statefile_folder']}/#{instance_identifier}.tfstate"
|
88
|
+
! @backend_configuration.remote_state?
|
87
89
|
end
|
88
90
|
|
89
91
|
def has_remote_state_configuration?
|
90
|
-
|
91
|
-
end
|
92
|
-
|
93
|
-
def default_state_folder
|
94
|
-
FileUtils.mkdir_p "#{base_folder}/state"
|
95
|
-
Pathname.new("#{base_folder}/state/#{instance_identifier}").realdirpath.to_s
|
96
|
-
end
|
97
|
-
|
98
|
-
def default_state_key
|
99
|
-
"#{instance_identifier}.tfstate"
|
92
|
+
@backend_configuration.remote_state?
|
100
93
|
end
|
101
94
|
|
102
95
|
def to_s
|
@@ -105,7 +98,7 @@ module Cloudspin
|
|
105
98
|
'instance' => instance_values,
|
106
99
|
'parameters' => parameter_values,
|
107
100
|
'resources' => resource_values,
|
108
|
-
'
|
101
|
+
'backend_configuration' => backend_configuration
|
109
102
|
}.to_s
|
110
103
|
end
|
111
104
|
|
data/lib/cloudspin/stack.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cloudspin-stack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.31
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 'kief '
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-terraform
|
@@ -131,6 +131,7 @@ files:
|
|
131
131
|
- exe/stack
|
132
132
|
- lib/cloudspin/cli.rb
|
133
133
|
- lib/cloudspin/stack.rb
|
134
|
+
- lib/cloudspin/stack/backend_configuration.rb
|
134
135
|
- lib/cloudspin/stack/definition.rb
|
135
136
|
- lib/cloudspin/stack/instance.rb
|
136
137
|
- lib/cloudspin/stack/instance_configuration.rb
|