Class: Cloudspin::Stack::Instance
- Inherits:
-
Object
- Object
- Cloudspin::Stack::Instance
- Includes:
- FileUtils
- Defined in:
- lib/cloudspin/stack/instance.rb
Instance Attribute Summary collapse
-
#configuration ⇒ Object
readonly
Returns the value of attribute configuration.
-
#id ⇒ Object
readonly
Returns the value of attribute id.
-
#working_folder ⇒ Object
readonly
Returns the value of attribute working_folder.
Class Method Summary collapse
- .add_backend_configuration_source(terraform_source_folder) ⇒ Object
- .ensure_folder(folder) ⇒ Object
- .from_files(*instance_configuration_files, stack_definition:, base_folder: '.', base_working_folder:) ⇒ Object
- .from_folder(*instance_configuration_files, definition_location:, base_folder: '.', base_working_folder:) ⇒ Object
Instance Method Summary collapse
- #down ⇒ Object
- #down_dry ⇒ Object
-
#ensure_state_folder ⇒ Object
TODO: Redundant? The folder is created in the BackendConfiguration class …
- #init_dry ⇒ Object
-
#initialize(id:, stack_definition:, working_folder:, configuration:) ⇒ Instance
constructor
A new instance of Instance.
- #parameter_values ⇒ Object
-
#plan(plan_destroy: false) ⇒ Object
def migrate RubyTerraform.clean(directory: working_folder) mkdir_p File.dirname(working_folder) cp_r @stack_definition.source_path, working_folder Dir.chdir(working_folder) do # cp configuration.backend_configuration.local_state_folder terraform_init # terraform_state_push() RubyTerraform.plan(terraform_command_parameters) end end.
- #plan_dry(plan_destroy: false) ⇒ Object
- #prepare_state_for_migration ⇒ Object
- #refresh ⇒ Object
- #resource_values ⇒ Object
- #terraform_command_parameters(added_parameters = {}) ⇒ Object
- #terraform_init ⇒ Object
- #terraform_init_params ⇒ Object
- #terraform_variables ⇒ Object
- #up ⇒ Object
- #up_dry ⇒ Object
- #validate_id(raw_id) ⇒ Object
Constructor Details
#initialize(id:, stack_definition:, working_folder:, configuration:) ⇒ Instance
Returns a new instance of Instance.
14 15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/cloudspin/stack/instance.rb', line 14 def initialize( id:, stack_definition:, working_folder:, configuration: ) validate_id(id) @id = id @stack_definition = stack_definition @working_folder = working_folder @configuration = configuration end |
Instance Attribute Details
#configuration ⇒ Object (readonly)
Returns the value of attribute configuration.
10 11 12 |
# File 'lib/cloudspin/stack/instance.rb', line 10 def configuration @configuration end |
#id ⇒ Object (readonly)
Returns the value of attribute id.
10 11 12 |
# File 'lib/cloudspin/stack/instance.rb', line 10 def id @id end |
#working_folder ⇒ Object (readonly)
Returns the value of attribute working_folder.
10 11 12 |
# File 'lib/cloudspin/stack/instance.rb', line 10 def working_folder @working_folder end |
Class Method Details
.add_backend_configuration_source(terraform_source_folder) ⇒ Object
77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/cloudspin/stack/instance.rb', line 77 def self.add_backend_configuration_source(terraform_source_folder) # puts "DEBUG: Creating file #{terraform_source_folder}/_cloudspin_created_backend.tf" File.open("#{terraform_source_folder}/_cloudspin_created_backend.tf", 'w') { |backend_file| backend_file.write(<<~TF_BACKEND_SOURCE terraform { backend "s3" {} } TF_BACKEND_SOURCE ) } end |
.ensure_folder(folder) ⇒ Object
72 73 74 75 |
# File 'lib/cloudspin/stack/instance.rb', line 72 def self.ensure_folder(folder) FileUtils.mkdir_p folder Pathname.new(folder).realdirpath.to_s end |
.from_files(*instance_configuration_files, stack_definition:, base_folder: '.', base_working_folder:) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/cloudspin/stack/instance.rb', line 45 def self.from_files( *instance_configuration_files, stack_definition:, base_folder: '.', base_working_folder: ) instance_configuration = InstanceConfiguration.from_files( instance_configuration_files, stack_definition: stack_definition, base_folder: base_folder ) if instance_configuration.has_remote_state_configuration? && stack_definition.is_from_remote? # puts "DEBUG: Stack instance is configured to use remote terraform state AND remote stack definition code" add_backend_configuration_source(stack_definition.source_path) # else # puts "DEBUG: Stack instance is configured to use local terraform state AND/OR local stack definition code" end self.new( id: instance_configuration.instance_identifier, stack_definition: stack_definition, working_folder: ensure_folder("#{base_working_folder}/#{instance_configuration.instance_identifier}"), configuration: instance_configuration ) end |
.from_folder(*instance_configuration_files, definition_location:, base_folder: '.', base_working_folder:) ⇒ Object
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/cloudspin/stack/instance.rb', line 27 def self.from_folder( *instance_configuration_files, definition_location:, base_folder: '.', base_working_folder: ) self.from_files( instance_configuration_files, stack_definition: Definition.from_location( definition_location, definition_cache_folder: "#{base_folder}/.cloudspin/definitions", stack_configuration: InstanceConfiguration.load_configuration_values(instance_configuration_files)['stack'] ), base_folder: base_folder, base_working_folder: base_working_folder ) end |
Instance Method Details
#down ⇒ Object
156 157 158 159 160 161 162 163 164 165 |
# File 'lib/cloudspin/stack/instance.rb', line 156 def down RubyTerraform.clean(directory: working_folder) mkdir_p File.dirname(working_folder) cp_r @stack_definition.source_path, working_folder ensure_state_folder Dir.chdir(working_folder) do terraform_init RubyTerraform.destroy(terraform_command_parameters(force: true)) end end |
#down_dry ⇒ Object
167 168 169 170 171 172 173 |
# File 'lib/cloudspin/stack/instance.rb', line 167 def down_dry down_command = RubyTerraform::Commands::Destroy.new command_line_builder = down_command.instantiate_builder configured_command = down_command.configure_command(command_line_builder, terraform_command_parameters) built_command = configured_command.build "cd #{working_folder} && #{built_command.to_s}" end |
#ensure_state_folder ⇒ Object
TODO: Redundant? The folder is created in the BackendConfiguration class …
217 218 219 220 221 |
# File 'lib/cloudspin/stack/instance.rb', line 217 def ensure_state_folder if configuration.has_local_state_configuration? Instance.ensure_folder(configuration.backend_configuration.local_state_folder) end end |
#init_dry ⇒ Object
198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'lib/cloudspin/stack/instance.rb', line 198 def init_dry if configuration.backend_configuration.migrate_state? "cp #{configuration.backend_configuration.local_statefile} -> #{working_folder}/terraform.tfstate" end init_command = RubyTerraform::Commands::Init.new command_line_builder = init_command.instantiate_builder configured_command = init_command.configure_command( command_line_builder, terraform_init_params ) built_command = configured_command.build "cd #{working_folder} && #{built_command.to_s}" end |
#parameter_values ⇒ Object
95 96 97 |
# File 'lib/cloudspin/stack/instance.rb', line 95 def parameter_values configuration.parameter_values end |
#plan(plan_destroy: false) ⇒ Object
def migrate
RubyTerraform.clean(directory: working_folder)
mkdir_p File.dirname(working_folder)
cp_r @stack_definition.source_path, working_folder
Dir.chdir(working_folder) do
# cp configuration.backend_configuration.local_state_folder
terraform_init
# terraform_state_push()
RubyTerraform.plan(terraform_command_parameters)
end
end
115 116 117 118 119 120 121 122 123 124 |
# File 'lib/cloudspin/stack/instance.rb', line 115 def plan(plan_destroy: false) RubyTerraform.clean(directory: working_folder) mkdir_p File.dirname(working_folder) cp_r @stack_definition.source_path, working_folder ensure_state_folder Dir.chdir(working_folder) do terraform_init RubyTerraform.plan(terraform_command_parameters(destroy: plan_destroy)) end end |
#plan_dry(plan_destroy: false) ⇒ Object
126 127 128 129 130 131 132 133 134 135 |
# File 'lib/cloudspin/stack/instance.rb', line 126 def plan_dry(plan_destroy: false) plan_command = RubyTerraform::Commands::Plan.new command_line_builder = plan_command.instantiate_builder configured_command = plan_command.configure_command( command_line_builder, terraform_command_parameters(:destroy => plan_destroy) ) built_command = configured_command.build "cd #{working_folder} && #{built_command.to_s}" end |
#prepare_state_for_migration ⇒ Object
193 194 195 196 |
# File 'lib/cloudspin/stack/instance.rb', line 193 def prepare_state_for_migration # puts "DEBUG: Preparing to migrate state from #{configuration.backend_configuration.local_statefile}" cp configuration.backend_configuration.local_statefile, "#{working_folder}/terraform.tfstate" end |
#refresh ⇒ Object
175 176 177 178 179 180 181 182 183 184 |
# File 'lib/cloudspin/stack/instance.rb', line 175 def refresh RubyTerraform.clean(directory: working_folder) mkdir_p File.dirname(working_folder) cp_r @stack_definition.source_path, working_folder ensure_state_folder Dir.chdir(working_folder) do terraform_init RubyTerraform.refresh(terraform_command_parameters(force: true)) end end |
#resource_values ⇒ Object
99 100 101 |
# File 'lib/cloudspin/stack/instance.rb', line 99 def resource_values configuration.resource_values end |
#terraform_command_parameters(added_parameters = {}) ⇒ Object
223 224 225 226 227 228 |
# File 'lib/cloudspin/stack/instance.rb', line 223 def terraform_command_parameters(added_parameters = {}) { vars: terraform_variables }.merge(configuration.backend_configuration.terraform_command_parameters) .merge(added_parameters) end |
#terraform_init ⇒ Object
186 187 188 189 190 191 |
# File 'lib/cloudspin/stack/instance.rb', line 186 def terraform_init if configuration.backend_configuration.migrate_state? prepare_state_for_migration end RubyTerraform.init(terraform_init_params) end |
#terraform_init_params ⇒ Object
212 213 214 |
# File 'lib/cloudspin/stack/instance.rb', line 212 def terraform_init_params configuration.backend_configuration.terraform_init_parameters end |
#terraform_variables ⇒ Object
230 231 232 233 234 |
# File 'lib/cloudspin/stack/instance.rb', line 230 def terraform_variables parameter_values.merge(resource_values) { |key, oldval, newval| raise "Duplicate values for terraform variable '#{key}' ('#{oldval}' and '#{newval}')" }.merge({ 'instance_identifier' => id }) end |
#up ⇒ Object
137 138 139 140 141 142 143 144 145 146 |
# File 'lib/cloudspin/stack/instance.rb', line 137 def up RubyTerraform.clean(directory: working_folder) mkdir_p File.dirname(working_folder) cp_r @stack_definition.source_path, working_folder ensure_state_folder Dir.chdir(working_folder) do terraform_init RubyTerraform.apply(terraform_command_parameters(auto_approve: true)) end end |
#up_dry ⇒ Object
148 149 150 151 152 153 154 |
# File 'lib/cloudspin/stack/instance.rb', line 148 def up_dry up_command = RubyTerraform::Commands::Apply.new command_line_builder = up_command.instantiate_builder configured_command = up_command.configure_command(command_line_builder, terraform_command_parameters) built_command = configured_command.build "cd #{working_folder} && #{built_command.to_s}" end |
#validate_id(raw_id) ⇒ Object
89 90 91 92 93 |
# File 'lib/cloudspin/stack/instance.rb', line 89 def validate_id(raw_id) raise "Stack instance ID '#{raw_id}' won't work. It needs to work as a filename." if /[^0-9A-Za-z.\-\_]/ =~ raw_id raise "Stack instance ID '#{raw_id}' won't work. No double dots allowed." if /\.\./ =~ raw_id raise "Stack instance ID '#{raw_id}' won't work. First character should be a letter." if /^[^A-Za-z]/ =~ raw_id end |