diff options
author | Christopher Baines <mail@cbaines.net> | 2018-03-16 08:51:54 +0000 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2018-03-29 07:55:01 +0100 |
commit | 051c8bf612126fa79699c8bf45a661dde127f4a0 (patch) | |
tree | 849a3b05b4ab4b59a426761d7cf1da3cc7036349 /app/models/backends/terraform_libvirt.rb | |
parent | a8c8f68971dd9e20dee01d9f65c64283e41fe4a3 (diff) | |
download | govuk-mini-environment-admin-051c8bf612126fa79699c8bf45a661dde127f4a0.tar govuk-mini-environment-admin-051c8bf612126fa79699c8bf45a661dde127f4a0.tar.gz |
Add backend controllers, models and views
Also annotate existing models.
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 |