aboutsummaryrefslogtreecommitdiff
path: root/app/models/backends/terraform_libvirt.rb
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2018-03-16 08:51:54 +0000
committerChristopher Baines <mail@cbaines.net>2018-03-29 07:55:01 +0100
commit051c8bf612126fa79699c8bf45a661dde127f4a0 (patch)
tree849a3b05b4ab4b59a426761d7cf1da3cc7036349 /app/models/backends/terraform_libvirt.rb
parenta8c8f68971dd9e20dee01d9f65c64283e41fe4a3 (diff)
downloadgovuk-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.rb101
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