# 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::TerraformLibvirt::MiniEnvironmentMethods def build(mini_environment) slug = mini_environment.name.parameterize store_path = GovukGuix::BuildMiniEnvironment.build( 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 ) add_in_use_store_path(store_path) 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/libvirt/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 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: ( 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