# 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_aws_backends # # id :integer not null, primary key # label :string # aws_region :string # aws_access_key_id :string # aws_secret_access_key :string # created_at :datetime not null # updated_at :datetime not null # domain :string # require 'ruby_terraform' class Backends::TerraformAws < ApplicationRecord has_many :mini_environments, as: :backend self.table_name = 'terraform_aws_backends' def self.label 'Amazon Web Services' 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, %w(whitehall government-frontend), type: 'container-start-script', app_domain: "#{slug}.#{domain}", web_domain: "www.#{slug}.#{domain}", use_https: 'certbot' ) 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 within_terraform_working_directory(mini_environment, &block) TerraformWorkingDirectory.new( "mini_environment/#{mini_environment.id}", 'terraform/aws' ).within_working_directory(&block) end def signon_url(mini_environment) "https://signon.#{mini_environment.name.parameterize}.#{domain}" end def terraform_variables(mini_environment) { aws_access_key: aws_access_key_id, aws_secret_key: aws_secret_access_key, aws_region: aws_region, slug: mini_environment.name.parameterize, ssh_public_key: ssh_public_key, start_command: mini_environment.backend_data['build_output'] } end def ssh_public_key File.open("#{ENV['HOME']}/.ssh/id_rsa.pub", &:readline) end end