diff options
Diffstat (limited to 'app/models/backends/terraform_aws_using_ami/mini_environment_methods.rb')
-rw-r--r-- | app/models/backends/terraform_aws_using_ami/mini_environment_methods.rb | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/app/models/backends/terraform_aws_using_ami/mini_environment_methods.rb b/app/models/backends/terraform_aws_using_ami/mini_environment_methods.rb new file mode 100644 index 0000000..66a3cbc --- /dev/null +++ b/app/models/backends/terraform_aws_using_ami/mini_environment_methods.rb @@ -0,0 +1,113 @@ +# GOV.UK Mini Environment Admin +# Copyright © 2018, 2019 Christopher Baines <mail@cbaines.net> +# +# 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 +# <http://www.gnu.org/licenses/>. + +module Backends::TerraformAwsUsingAmi::MiniEnvironmentMethods + def build(mini_environment) + slug = mini_environment.name.parameterize + + GovukGuix::BuildMiniEnvironment.build( + mini_environment.id, + services: mini_environment.services.map(&:build_argument_string), + arguments: { + type: 'aws-packer-ami', + app_domain: "#{slug}.#{domain}", + web_domain: "www.#{slug}.#{domain}", + use_https: 'certbot', + signon_instance_name: slug, + admin_environment_label: mini_environment.name, + use_error_pages: 'true', + origin_basic_auth: "#{slug}=#{slug}", + }, + run_remotely_on_host: mini_environment.backend.build_remote_host + ) + 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 refresh(mini_environment) + within_terraform_working_directory(mini_environment) do + RubyTerraform.refresh( + vars: terraform_variables(mini_environment) + ) + end + end + + def terraform_states(mini_environment) + TerraformState.where( + state_id: mini_environment_state_id(mini_environment) + ) + end + + def within_terraform_working_directory(mini_environment, &block) + with_advisory_lock( + "terraform" + ) do + TerraformWorkingDirectory.new( + mini_environment_state_id(mini_environment), + 'terraform/aws/mini_environment' + ).within_working_directory(&block) + end + end + + def mini_environment_state_id(mini_environment) + "mini_environment/#{mini_environment.id}" + end + + def signon_url(mini_environment) + "https://signon.#{mini_environment.name.parameterize}.#{domain}" + end + + def terraform_variables(mini_environment) + credentials = TerraformHttpBackendController.credentials + + common_terraform_variables.merge( + slug: mini_environment.name.parameterize, + ami_id: mini_environment.backend_data['build_output'], + backend_remote_state_address: ( + Plek.new.external_url_for('mini-environment-admin') + + Rails + .application + .routes + .url_helpers + .terraform_http_backend_path(terraform_state_id) + ), + backend_remote_state_username: credentials[:name], + backend_remote_state_password: credentials[:password] + ) + end +end |