diff options
Diffstat (limited to 'app/models/backends/terraform_libvirt.rb')
-rw-r--r-- | app/models/backends/terraform_libvirt.rb | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/app/models/backends/terraform_libvirt.rb b/app/models/backends/terraform_libvirt.rb new file mode 100644 index 0000000..4cb63b7 --- /dev/null +++ b/app/models/backends/terraform_libvirt.rb @@ -0,0 +1,101 @@ +# == Schema Information +# +# Table name: terraform_libvirt_backends +# +# id :integer not null, primary key +# label :string +# uri :string +# created_at :datetime not null +# updated_at :datetime not null +# + +require 'fileutils' +require 'ruby_terraform' + +class Backends::TerraformLibvirt < ApplicationRecord + has_many :mini_environments, as: :backend + + self.table_name = "terraform_libvirt_backends" + + def self.label + "libvirt" + end + + def type_and_id + "#{self.class.name}=#{id}" + end + + def build(mini_environment) + GovukGuix::GenerateVmImageAndSystemJob.enqueue( + mini_environment.id + ) + end + + def start(mini_environment) + logger.info "Setting up #{mini_environment.name}" + + source = File.expand_path("terraform/libvirt") + FileUtils.mkdir_p working_directory(mini_environment) + + Dir.chdir(working_directory(mini_environment)) do + if Dir.empty?(".") + RubyTerraform.init( + backend: true, + from_module: source, + backend_config: { + address: terraform_backend_address(mini_environment) + }, + plugin_dir: plugin_dir + ) + end + + RubyTerraform.apply( + vars: terraform_variables(mini_environment), + auto_approve: true + ) + end + end + + def destroy(mini_environment) + Dir.chdir(working_directory(mini_environment)) do + RubyTerraform.destroy( + vars: terraform_variables(mini_environment), + force: true + ) + end + end + + def terraform_variables(mini_environment) + mini_environment.backend_data.merge( + uri: self.uri, + machine_name: mini_environment.name.parameterize, + ) + end + + def terraform_backend_address(mini_environment) + ( + 'http://localhost:3000' + + Rails + .application + .routes + .url_helpers + .mini_environment_terraform_http_backend_path( + mini_environment + ) + ) + end + + def working_directory(mini_environment) + "tmp/terraform-working-directories/#{mini_environment.name}" + end + + def plugin_dir + ENV['PATH'].split(':').first + end + + def ssh_public_key + File.open("#{ENV['HOME']}/.ssh/id_rsa.pub") do |file| + file.readline() + end + end +end |