# GOV.UK Mini Environment Admin # Copyright © 2018, 2019 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 # . module Backends::TerraformAwsUsingAmi::BackendMethods def create_data_snapshot GovukGuix::CreateDataSnapshotJob.enqueue( backend_type: self.class.name, backend_id: id ) end def backend_terraform_variables public_ip_addresses = ENV[ 'GOVUK_MINI_ENVIRONMENT_ADMIN_PUBLIC_IP_ADDRESSES' ].split(',') raise 'missing public ip addresses' if public_ip_addresses.nil? egress_cidr_blocks = public_ip_addresses.map { |x| "#{x}/32" } common_terraform_variables.merge( aws_vpc_id: vpc_id, ssh_public_key: ssh_public_key, backend_slug: label.parameterize, mini_environment_admin_guix_public_key: guix_public_key, mini_environment_admin_egress_cidr_blocks: egress_cidr_blocks ) end def deploy_backend within_backend_terraform_working_directory do RubyTerraform.apply( vars: backend_terraform_variables, auto_approve: true ) end end def refresh_backend_state within_backend_terraform_working_directory do RubyTerraform.refresh( vars: backend_terraform_variables ) end end def destroy_backend within_backend_terraform_working_directory do RubyTerraform.destroy( vars: backend_terraform_variables, force: true ) end end def stop_backend within_backend_terraform_working_directory do RubyTerraform.destroy( vars: backend_terraform_variables, target: 'aws_spot_instance_request.main', force: true ) end end def in_use_store_paths [ GovukGuix::Revision.where(archived: false).pluck(:store_path), available_data_snapshots.pluck(:store_path), mini_environments .where(archived: false) .pluck(:backend_data) .map { |x| x&.dig('build_output') } ].flatten.compact end def update_guix_gcroots GovukGuix::UpdateGcrootsDirectory.set_in_use_store_paths( in_use_store_paths, run_remotely_on_host: build_remote_host ) end def add_in_use_store_path(store_path) GovukGuix::UpdateGcrootsDirectory.add_store_path( store_path, run_remotely_on_host: build_remote_host ) end def within_backend_terraform_working_directory(&block) with_advisory_lock( "terraform" ) do TerraformWorkingDirectory.new( terraform_state_id, 'terraform/aws_using_ami/backend' ).within_working_directory(&block) end end def available_data_snapshots GovukGuix::DataSnapshot.where(backend: self) end def backend_terraform_states TerraformState.where( state_id: terraform_state_id ) end def backend_latest_terraform_state backend_terraform_states.order(:id).last end def status latest_terraform_state = backend_terraform_states.order(:id).last running = ( latest_terraform_state && (latest_terraform_state.output_value('backend_up') == 'true') ) { running: running, updated_at: latest_terraform_state.try(:created_at) } end end