diff options
author | Christopher Baines <mail@cbaines.net> | 2018-06-23 11:23:04 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2018-06-23 12:58:05 +0100 |
commit | 76f7351c19777379d4d42a348a7f8da735a30649 (patch) | |
tree | 62a437f1218c4249589c509df16cad6cf917ad80 | |
parent | 05df9f91e9bdf39b190710ef5d80162d03dd52c5 (diff) | |
download | govuk-mini-environment-admin-76f7351c19777379d4d42a348a7f8da735a30649.tar govuk-mini-environment-admin-76f7351c19777379d4d42a348a7f8da735a30649.tar.gz |
Split out a couple of modules from the TerraformAws class
-rw-r--r-- | app/models/backends/terraform_aws.rb | 125 | ||||
-rw-r--r-- | app/models/backends/terraform_aws/backend_methods.rb | 73 | ||||
-rw-r--r-- | app/models/backends/terraform_aws/mini_environment_methods.rb | 94 |
3 files changed, 167 insertions, 125 deletions
diff --git a/app/models/backends/terraform_aws.rb b/app/models/backends/terraform_aws.rb index 026f1e4..4db7c51 100644 --- a/app/models/backends/terraform_aws.rb +++ b/app/models/backends/terraform_aws.rb @@ -51,116 +51,6 @@ class Backends::TerraformAws < ApplicationRecord "#{self.class.name}=#{id}" end - 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: 'container-start-script', - app_domain: "#{slug}.#{domain}", - web_domain: "www.#{slug}.#{domain}", - use_https: 'certbot', - http_ports_mode: 'alternative', - read_bundle_install_input_as_tar_archive: true, - signon_instance_name: slug, - admin_environment_label: mini_environment.name, - use_error_pages: 'true', - origin_basic_auth: "#{slug}=#{slug}", - share: [ - '/var/cache/govuk-mini-environment-admin=/var/cache', - '/var/lib/govuk-mini-environment-admin=/var/lib', - '/var/log/govuk-mini-environment-admin=/var/log' - ] - }, - run_remotely_on_host: "ubuntu@guix-daemon.#{domain}" - ) - end - - def create_data_snapshot - GovukGuix::CreateDataSnapshotJob.enqueue( - run_remotely_on_host: "ubuntu@guix-daemon.#{domain}", - backend_type: self.class.name, - backend_id: id - ) - 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 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 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 available_data_snapshots - GovukGuix::DataSnapshot.where(backend: self) - end - - def within_terraform_working_directory(mini_environment, &block) - TerraformWorkingDirectory.new( - "mini_environment/#{mini_environment.id}", - 'terraform/aws/mini_environment' - ).within_working_directory(&block) - end - - def signon_url(mini_environment) - "https://signon.#{mini_environment.name.parameterize}.#{domain}" - end - def common_terraform_variables { aws_access_key: aws_access_key_id, @@ -171,21 +61,6 @@ class Backends::TerraformAws < ApplicationRecord } end - def terraform_variables(mini_environment) - common_terraform_variables.merge( - slug: mini_environment.name.parameterize, - start_command: 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 - def terraform_state_id "backend/terraform_aws/#{id}" end diff --git a/app/models/backends/terraform_aws/backend_methods.rb b/app/models/backends/terraform_aws/backend_methods.rb new file mode 100644 index 0000000..726494c --- /dev/null +++ b/app/models/backends/terraform_aws/backend_methods.rb @@ -0,0 +1,73 @@ +# GOV.UK Mini Environment Admin +# Copyright © 2018 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::TerraformAws::BackendMethods + def create_data_snapshot + GovukGuix::CreateDataSnapshotJob.enqueue( + run_remotely_on_host: "ubuntu@guix-daemon.#{domain}", + 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 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 available_data_snapshots + GovukGuix::DataSnapshot.where(backend: self) + end +end diff --git a/app/models/backends/terraform_aws/mini_environment_methods.rb b/app/models/backends/terraform_aws/mini_environment_methods.rb new file mode 100644 index 0000000..31d7b19 --- /dev/null +++ b/app/models/backends/terraform_aws/mini_environment_methods.rb @@ -0,0 +1,94 @@ +# GOV.UK Mini Environment Admin +# Copyright © 2018 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::TerraformAws::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: 'container-start-script', + app_domain: "#{slug}.#{domain}", + web_domain: "www.#{slug}.#{domain}", + use_https: 'certbot', + http_ports_mode: 'alternative', + read_bundle_install_input_as_tar_archive: true, + signon_instance_name: slug, + admin_environment_label: mini_environment.name, + use_error_pages: 'true', + origin_basic_auth: "#{slug}=#{slug}", + share: [ + '/var/cache/govuk-mini-environment-admin=/var/cache', + '/var/lib/govuk-mini-environment-admin=/var/lib', + '/var/log/govuk-mini-environment-admin=/var/log' + ] + }, + run_remotely_on_host: "ubuntu@guix-daemon.#{domain}" + ) + 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/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) + common_terraform_variables.merge( + slug: mini_environment.name.parameterize, + start_command: 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 |