# GOV.UK Mini Environment Admin # Copyright © 2018 Christopher Baines # # This file is part of the GOV.UK Mini Environment Admin. # # The GOV.UK Mini Environment Admin is free software: you can # redistribute it and/or modify it under the terms of the GNU Affero # General Public License as published by the Free Software Foundation, # either version 3 of the License, or (at your option) any later # version. # # The GOV.UK Mini Environment Admin is distributed in the hope that it # will be useful, but WITHOUT ANY WARRANTY; without even the implied # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public # License along with the GOV.UK Mini Environment Admin. If not, see # . # == 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 # domain :string # 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) slug = mini_environment.name.parameterize GovukGuix::BuildJob.enqueue( mini_environment.id, services: mini_environment.services.map(&:build_argument_string), arguments: { type: 'vm-image-and-system', app_domain: "#{slug}.#{domain}", web_domain: "www.#{slug}.#{domain}", # Assume that this is a local environment, and not externally # accessible use_https: 'development', http_ports_mode: 'standard', host_name: "#{slug}.#{domain}", admin_environment_label: mini_environment.name, signon_instance_name: slug, use_error_pages: 'true', origin_basic_auth: "#{slug}=#{slug}", data_snapshot: mini_environment.data_snapshot.try(:store_path) }.compact ) end def start(mini_environment) logger.info "Setting up #{mini_environment.name}" within_terraform_working_directory(mini_environment) do RubyTerraform.apply( vars: terraform_variables(mini_environment), auto_approve: true ) end end def destroy(mini_environment) within_terraform_working_directory(mini_environment) do RubyTerraform.destroy( vars: terraform_variables(mini_environment), force: true ) end end def deploy_backend TerraformWorkingDirectory.new( terraform_state_id, 'terraform/libvirt/backend' ).within_working_directory do RubyTerraform.apply( vars: { uri: uri, domain: domain }, auto_approve: true ) end end def available_data_snapshots GovukGuix::DataSnapshot.where(backend: nil) end def terraform_state_id "backend/terraform_libvirt/#{id}" end def within_terraform_working_directory(mini_environment, &block) TerraformWorkingDirectory.new( "mini_environment/#{mini_environment.id}", 'terraform/libvirt/mini_environment' ).within_working_directory(&block) end def signon_url(mini_environment) "https://signon.#{mini_environment.name.parameterize}.#{domain}" end def terraform_variables(mini_environment) slug = mini_environment.name.parameterize { uri: uri, machine_name: slug, host_name: "#{slug}.#{domain}", vm_image_and_system: mini_environment.backend_data['build_output'], backend_remote_state_address: ( 'http://localhost:3000' + Rails .application .routes .url_helpers .terraform_http_backend_path(terraform_state_id) ) } end end