diff options
Diffstat (limited to 'app/models/backends/terraform_libvirt')
-rw-r--r-- | app/models/backends/terraform_libvirt/mini_environment_methods.rb | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/app/models/backends/terraform_libvirt/mini_environment_methods.rb b/app/models/backends/terraform_libvirt/mini_environment_methods.rb new file mode 100644 index 0000000..38e8809 --- /dev/null +++ b/app/models/backends/terraform_libvirt/mini_environment_methods.rb @@ -0,0 +1,95 @@ +# 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::TerraformLibvirt::MiniEnvironmentMethods + def build(mini_environment) + slug = mini_environment.name.parameterize + + GovukGuix::BuildJob.enqueue( + mini_environment.id, + services: mini_environment.services.map(&:build_argument_string), + arguments: { + type: 'vm-image-and-system', + app_domain: "#{slug}.#{domain}", + web_domain: "www.#{slug}.#{domain}", + # Assume that this is a local environment, and not externally + # accessible + use_https: 'development', + http_ports_mode: 'standard', + host_name: "#{slug}.#{domain}", + admin_environment_label: mini_environment.name, + signon_instance_name: slug, + use_error_pages: 'true', + origin_basic_auth: "#{slug}=#{slug}", + data_snapshot: mini_environment.data_snapshot.try(:store_path) + }.compact + ) + 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/libvirt/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) + slug = mini_environment.name.parameterize + + { + uri: uri, + machine_name: slug, + host_name: "#{slug}.#{domain}", + vm_image_and_system: 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 |