# 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 # . module Backends::TerraformAws::BackendMethods def create_data_snapshot remote_host = backend_latest_terraform_state.output_value( 'guix_daemon_public_dns' ) GovukGuix::CreateDataSnapshotJob.enqueue( run_remotely_on_host: "ubuntu@#{remote_host}", backend_type: self.class.name, backend_id: id ) end def backend_terraform_variables public_ip_address = ENV[ 'GOVUK_MINI_ENVIRONMENT_ADMIN_PUBLIC_IP_ADDRESS' ] raise 'missing public ip address' if public_ip_address.nil? 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_public_ip_address: public_ip_address ) end def deploy_backend TerraformWorkingDirectory.new( terraform_state_id, 'terraform/aws/backend' ).within_working_directory do RubyTerraform.apply( vars: backend_terraform_variables, auto_approve: true ) end end def refresh_backend_state TerraformWorkingDirectory.new( terraform_state_id, 'terraform/aws/backend' ).within_working_directory do RubyTerraform.refresh( vars: backend_terraform_variables ) end end def destroy_backend TerraformWorkingDirectory.new( terraform_state_id, 'terraform/aws/backend' ).within_working_directory do RubyTerraform.destroy( vars: backend_terraform_variables, force: true ) end end def stop_backend TerraformWorkingDirectory.new( terraform_state_id, 'terraform/aws/backend' ).within_working_directory do RubyTerraform.destroy( vars: backend_terraform_variables, target: 'aws_spot_instance_request.main', force: true ) 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