diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/backends/terraform_aws_using_ami_controller.rb | 118 | ||||
-rw-r--r-- | app/controllers/govuk_guix/revisions_controller.rb | 3 | ||||
-rw-r--r-- | app/jobs/backends/terraform_aws_using_ami_job.rb | 46 | ||||
-rw-r--r-- | app/models/backends.rb | 3 | ||||
-rw-r--r-- | app/models/backends/terraform_aws.rb | 4 | ||||
-rw-r--r-- | app/models/backends/terraform_aws_using_ami.rb | 90 | ||||
-rw-r--r-- | app/models/backends/terraform_aws_using_ami/backend_methods.rb | 146 | ||||
-rw-r--r-- | app/models/backends/terraform_aws_using_ami/mini_environment_methods.rb | 117 | ||||
-rw-r--r-- | app/services/govuk_guix/build_mini_environment.rb | 12 | ||||
-rw-r--r-- | app/views/backends/terraform_aws_using_ami/new.html.erb | 192 | ||||
-rw-r--r-- | app/views/backends/terraform_aws_using_ami/show.html.erb | 362 |
11 files changed, 1085 insertions, 8 deletions
diff --git a/app/controllers/backends/terraform_aws_using_ami_controller.rb b/app/controllers/backends/terraform_aws_using_ami_controller.rb new file mode 100644 index 0000000..9fbe115 --- /dev/null +++ b/app/controllers/backends/terraform_aws_using_ami_controller.rb @@ -0,0 +1,118 @@ +# 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/>. + +class Backends::TerraformAwsUsingAmiController < ApplicationController + def new + @backend = Backends::TerraformAws.new + end + + def create + backend = Backends::TerraformAwsUsingAmi.create(create_params) + + flash[:success] = "Backend #{backend.label} created" + + redirect_to terraform_aws_using_ami_backend_path(backend) + end + + def update + @backend = Backends::TerraformAwsUsingAmi.update( + params[:id], + update_params + ) + + flash[:success] = "Backend #{@backend.label} updated" + + render :show + end + + def show + @backend = Backends::TerraformAwsUsingAmi.find(params[:id]) + end + + def destroy + backend = Backends::TerraformAwsUsingAmi.find(params[:id]) + + if @backend.mini_environments.empty? + flash[:success] = "Backend #{backend.label} deleted" + backend.delete + else + flash[:error] = "Unable to delete backend, as mini environments using this backend still exist." + end + + redirect_to setup_path + end + + def perform_action + @backend = Backends::TerraformAwsUsingAmi.find(params['id']) + + action = params.require(:commit) + + case action + when 'Destroy' + Backends::TerraformAwsUsingAmiJob.enqueue(@backend.id, :destroy_backend) + + flash[:notice] = 'Destroying the backend' + when 'Stop' + Backends::TerraformAwsUsingAmiJob.enqueue(@backend.id, :stop_backend) + + flash[:notice] = 'Stopping the backend' + when 'Deploy' + Backends::TerraformAwsUsingAmiJob.enqueue(@backend.id, :deploy_backend) + + flash[:notice] = 'Deploying the backend' + when 'Refresh state' + Backends::TerraformAwsUsingAmiJob.enqueue(@backend.id, :refresh_backend_state) + + flash[:notice] = 'Refreshing the backend state information' + else + flash[:error] = "Unknown action #{action}" + end + + redirect_to terraform_aws_using_ami_backend_path(@backend) + end + + private + + def create_params + params + .require(:backends_terraform_aws) + .permit( + :label, + :domain, + :aws_region, + :vpc_id, + :route_53_zone_id, + :aws_access_key_id, + :aws_secret_access_key, + :ssh_public_key, + :ssh_private_key + ) + end + + def update_params + params + .require(:backends_terraform_aws) + .permit( + :label, + :aws_access_key_id, + :aws_secret_access_key + ) + end +end diff --git a/app/controllers/govuk_guix/revisions_controller.rb b/app/controllers/govuk_guix/revisions_controller.rb index e4e1b52..1544bc1 100644 --- a/app/controllers/govuk_guix/revisions_controller.rb +++ b/app/controllers/govuk_guix/revisions_controller.rb @@ -40,7 +40,8 @@ class GovukGuix::RevisionsController < ApplicationController options = {} else # Assume that the AWS backend is in use - backend = Backends::TerraformAws.first + backend = Backends::TerraformAwsUsingAmi.first || + Backends::TerraformAws.first options = { backend_type_and_id: backend.type_and_id diff --git a/app/jobs/backends/terraform_aws_using_ami_job.rb b/app/jobs/backends/terraform_aws_using_ami_job.rb new file mode 100644 index 0000000..1412e8c --- /dev/null +++ b/app/jobs/backends/terraform_aws_using_ami_job.rb @@ -0,0 +1,46 @@ +# 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/>. + +class Backends::TerraformAwsUsingAmiJob < Que::Job + def run(terraform_aws_using_ami_backend_id, action) + ActiveRecord::Base.transaction do + @backend = Backends::TerraformAwsUsingAmi.find( + terraform_aws_using_ami_backend_id + ) + + @backend.send(action) + + finish + end + end + + def self.job_title(que_job) + que_job.args.last.titleize + end + + def self.jobs(terraform_aws_using_ami_backend_id) + QueJob + .where( + job_class: name + ).where( + "args->>0 = '#{terraform_aws_using_ami_backend_id}'" + ) + end +end diff --git a/app/models/backends.rb b/app/models/backends.rb index 526ae76..2a3bceb 100644 --- a/app/models/backends.rb +++ b/app/models/backends.rb @@ -1,5 +1,5 @@ # GOV.UK Mini Environment Admin -# Copyright © 2018 Christopher Baines <mail@cbaines.net> +# Copyright © 2018, 2019 Christopher Baines <mail@cbaines.net> # # This file is part of the GOV.UK Mini Environment Admin. # @@ -26,6 +26,7 @@ module Backends def self.classes [ Backends::TerraformAws, + Backends::TerraformAwsUsingAmi, Backends::TerraformLibvirt ] end diff --git a/app/models/backends/terraform_aws.rb b/app/models/backends/terraform_aws.rb index d3d56d1..64d24ef 100644 --- a/app/models/backends/terraform_aws.rb +++ b/app/models/backends/terraform_aws.rb @@ -1,5 +1,5 @@ # GOV.UK Mini Environment Admin -# Copyright © 2018 Christopher Baines <mail@cbaines.net> +# Copyright © 2018, 2019 Christopher Baines <mail@cbaines.net> # # This file is part of the GOV.UK Mini Environment Admin. # @@ -47,7 +47,7 @@ class Backends::TerraformAws < ApplicationRecord self.table_name = 'terraform_aws_backends' def self.label - 'Amazon Web Services' + 'Amazon Web Services (using EFS)' end def self.available? diff --git a/app/models/backends/terraform_aws_using_ami.rb b/app/models/backends/terraform_aws_using_ami.rb new file mode 100644 index 0000000..bb9f90d --- /dev/null +++ b/app/models/backends/terraform_aws_using_ami.rb @@ -0,0 +1,90 @@ +# 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/>. + +# == Schema Information +# +# Table name: terraform_aws_backends +# +# id :integer not null, primary key +# label :string +# aws_region :string +# aws_access_key_id :string +# aws_secret_access_key :string +# created_at :datetime not null +# updated_at :datetime not null +# domain :string +# route_53_zone_id :string not null +# vpc_id :string not null +# ssh_public_key :string +# ssh_private_key :string +# + +require 'ruby_terraform' + +class Backends::TerraformAwsUsingAmi < ApplicationRecord + include MiniEnvironmentMethods + include BackendMethods + + has_many :mini_environments, as: :backend + + self.table_name = 'terraform_aws_using_ami_backends' + + def self.label + 'Amazon Web Services (using AMIs)' + end + + def self.available? + File.exist? "#{ENV['PATH'].split(':').first}/terraform-provider-aws" + end + + def type_and_id + "#{self.class.name}=#{id}" + end + + def common_terraform_variables + { + aws_access_key: aws_access_key_id, + aws_secret_key: aws_secret_access_key, + aws_region: aws_region, + ssh_private_key: ssh_private_key, + aws_route_53_zone_id: route_53_zone_id + } + end + + def build_remote_host + RemoteHost.new( + 'ubuntu', + backend_latest_terraform_state.output_value('guix_daemon_public_dns'), + ssh_private_key + ) + end + + def terraform_state_id + "backend/terraform_aws_using_ami/#{id}" + end + + def guix_public_key + "(entry #{File.read("/etc/guix/signing-key.pub")} (tag (guix import)))" + rescue Errno::ENOENT + # This is optional, as if it doesn't exist, it means that `guix + # copy` won't be used + '' + end +end diff --git a/app/models/backends/terraform_aws_using_ami/backend_methods.rb b/app/models/backends/terraform_aws_using_ami/backend_methods.rb new file mode 100644 index 0000000..10bf872 --- /dev/null +++ b/app/models/backends/terraform_aws_using_ami/backend_methods.rb @@ -0,0 +1,146 @@ +# 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::BackendMethods + def create_data_snapshot + GovukGuix::CreateDataSnapshotJob.enqueue( + backend_type: self.class.name, + backend_id: id + ) + end + + def backend_terraform_variables + public_ip_addresses = ENV[ + 'GOVUK_MINI_ENVIRONMENT_ADMIN_PUBLIC_IP_ADDRESSES' + ].split(',') + + raise 'missing public ip addresses' if public_ip_addresses.nil? + + egress_cidr_blocks = public_ip_addresses.map { |x| "#{x}/32" } + + 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_egress_cidr_blocks: egress_cidr_blocks + ) + end + + def deploy_backend + within_backend_terraform_working_directory do + RubyTerraform.apply( + vars: backend_terraform_variables, + auto_approve: true + ) + end + end + + def refresh_backend_state + within_backend_terraform_working_directory do + RubyTerraform.refresh( + vars: backend_terraform_variables + ) + end + end + + def destroy_backend + within_backend_terraform_working_directory do + RubyTerraform.destroy( + vars: backend_terraform_variables, + force: true + ) + end + end + + def stop_backend + within_backend_terraform_working_directory do + RubyTerraform.destroy( + vars: backend_terraform_variables, + target: 'aws_spot_instance_request.main', + force: true + ) + end + end + + def in_use_store_paths + [ + GovukGuix::Revision.where(archived: false).pluck(:store_path), + available_data_snapshots.pluck(:store_path), + mini_environments + .where(archived: false) + .pluck(:backend_data) + .map { |x| x&.dig('build_output') } + ].flatten.compact + end + + def update_guix_gcroots + GovukGuix::UpdateGcrootsDirectory.set_in_use_store_paths( + in_use_store_paths, + run_remotely_on_host: build_remote_host + ) + end + + def add_in_use_store_path(store_path) + GovukGuix::UpdateGcrootsDirectory.add_store_path( + store_path, + run_remotely_on_host: build_remote_host + ) + end + + def within_backend_terraform_working_directory(&block) + with_advisory_lock( + "terraform" + ) do + TerraformWorkingDirectory.new( + terraform_state_id, + 'terraform/aws_using_ami/backend' + ).within_working_directory(&block) + 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 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..839bc3b --- /dev/null +++ b/app/models/backends/terraform_aws_using_ami/mini_environment_methods.rb @@ -0,0 +1,117 @@ +# 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', + base_os: 'aws', + ami_name: "govuk-mini-environment-admin-#{slug}", + 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_using_ami/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 + + ami_id = mini_environment.backend_data['build_output'].split(' ')[1] + + common_terraform_variables.merge( + slug: mini_environment.name.parameterize, + ami_id: ami_id, + 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 diff --git a/app/services/govuk_guix/build_mini_environment.rb b/app/services/govuk_guix/build_mini_environment.rb index 9cada20..a87c4da 100644 --- a/app/services/govuk_guix/build_mini_environment.rb +++ b/app/services/govuk_guix/build_mini_environment.rb @@ -72,12 +72,16 @@ module GovukGuix::BuildMiniEnvironment run_remotely_on_host: remote_host ) - build_output = output.last.strip - - raise 'InvalidOutput' unless build_output.starts_with? '/gnu/store' - + last_non_empty_line = output.reverse.find do |line| + !line.strip.empty? + end + build_output = last_non_empty_line.strip logger.debug(self.class) { "build_output: #{build_output}" } + unless options[:arguments][:type] == 'aws-packer-ami' + raise 'InvalidOutput' unless build_output.starts_with? '/gnu/store' + end + mini_environment.update( backend_data: { build_output: build_output diff --git a/app/views/backends/terraform_aws_using_ami/new.html.erb b/app/views/backends/terraform_aws_using_ami/new.html.erb new file mode 100644 index 0000000..929d69f --- /dev/null +++ b/app/views/backends/terraform_aws_using_ami/new.html.erb @@ -0,0 +1,192 @@ +<%# + +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/>. + +%> + +<a href="<%= setup_path %>" class="btn btn-lg btn-default pull-right"> + Back to setup +</a> + +<h1>Create a new AWS backend</h1> + +<div class="row"> + <div class="col-md-10"> + <%= form_with(model: @backend, + url: { action: "create" }, + html: { class: "form-horizontal" }) do |f| + %> + + <div class="form-group form-group-lg"> + <%= f.label :label, class: 'col-sm-4 control-label' %> + <div class="col-sm-8"> + <%= f.text_field( + :label, + class: 'form-control', + placeholder: 'Label for this backend' + ) %> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label :domain, class: 'col-sm-4 control-label' %> + <div class="col-sm-8"> + <%= f.text_field( + :domain, + class: 'form-control', + placeholder: 'Domain within which to host mini environments' + ) %> + <span class="help-block"> + <p> + For example, if you entered <samp>example.com</samp> for + the backend domain, and then created a mini environment + called "Test" using this backend, then the application + domain for the mini environment would be + <samp>test.example.com</samp>. + </p> + <p> + A Route53 Hosted Zone will be created for this domain, + and records added for the mini environments. + </p> + </span> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label :aws_region, 'AWS Region', class: 'col-sm-4 control-label' %> + <div class="col-sm-8"> + <%= f.text_field( + :aws_region, + class: 'form-control', + placeholder: 'What region to use' + ) %> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label( + :vpc_id, + 'VPC ID', + class: 'col-sm-4 control-label' + ) %> + <div class="col-sm-8"> + <%= f.text_field( + :vpc_id, + class: 'form-control', + placeholder: 'The ID of the VPC (Virtual Private Cloud) to use' + ) %> + <span class="help-block"> + <p> + This VPC (Virtual Private Cloud) should be the one to + use for all resources. + </p> + </span> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label( + :route_53_zone_id, + 'Route 53 Zone ID', + class: 'col-sm-4 control-label' + ) %> + <div class="col-sm-8"> + <%= f.text_field( + :route_53_zone_id, + class: 'form-control', + placeholder: 'The ID of the Route 53 Zone to use' + ) %> + <span class="help-block"> + <p> + This zone should be authoritive for the domain this + backend is using. Entries in this zone will be created + for the mini environments. + </p> + </span> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label :aws_access_key_id, 'AWS Access Key ID', class: 'col-sm-4 control-label' %> + <div class="col-sm-8"> + <%= f.text_field( + :aws_access_key_id, + class: 'form-control', + ) %> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label :aws_secret_access_key, 'AWS Secret Access Key', class: 'col-sm-4 control-label' %> + <div class="col-sm-8"> + <%= f.password_field( + :aws_secret_access_key, + class: 'form-control', + ) %> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label( + :ssh_public_key, + 'SSH Key, public part', + class: 'col-sm-4 control-label' + ) %> + <div class="col-sm-8"> + <%= f.text_area( + :ssh_public_key, + class: 'form-control', + placeholder: 'The public part of the SSH key to use' + ) %> + <span class="help-block"> + <p> + </p> + </span> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label( + :ssh_private_key, + 'SSH Key, private part', + class: 'col-sm-4 control-label' + ) %> + <div class="col-sm-8"> + <%= f.text_area( + :ssh_private_key, + class: 'form-control', + placeholder: 'The private part of the SSH key to use' + ) %> + <span class="help-block"> + <p> + </p> + </span> + </div> + </div> + + <div class="form-group form-group-lg"> + <div class="col-sm-offset-4 col-sm-8"> + <%= f.submit "Create", class: 'btn btn-lg btn-success' %> + </div> + </div> + <% end %> + </div> +</div> diff --git a/app/views/backends/terraform_aws_using_ami/show.html.erb b/app/views/backends/terraform_aws_using_ami/show.html.erb new file mode 100644 index 0000000..14810d1 --- /dev/null +++ b/app/views/backends/terraform_aws_using_ami/show.html.erb @@ -0,0 +1,362 @@ +<%# + +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/>. + +%> + +<a href="<%= setup_path %>" class="btn btn-lg btn-default pull-right"> + Back to Setup +</a> + +<h1>Backend: <%= @backend.label %></h1> +<% status = @backend.status %> + +<br> + +<div class="row"> + <div class="col-md-3"> + + <div class="panel panel-default"> + <div class="panel-heading"> + Current Status<br> + <small>updated at <%= status[:updated_at] %></small> + </div> + <div class="panel-body"> + <% if status[:running] %> + <div class="alert alert-success text-center" + role="alert" + style="margin-bottom: 0px;"> + Backend available + </div> + <% else %> + <div class="alert alert-warning text-center" + role="alert" + style="margin-bottom: 0px;"> + Backend down + </div> + <% end %> + + <br> + <a href="<%= terraform_http_backend_show_history_path( + @backend.terraform_state_id + ) %>"> + View Terraform state information + </a> + </div> + </div> + + <%= form_with( + url: perform_action_terraform_aws_using_ami_backend_path(@backend), + local: true, + method: "post" + ) do %> + + <div class="panel panel-default"> + <div class="panel-heading">Actions</div> + + <ul class="list-group"> + <li class="list-group-item"> + <%= submit_tag('Deploy', + role: 'button', + style: 'margin-bottom: 5px;', + class: 'btn btn-lg btn-success btn-block') + %> + <p class="list-group-item-text"> + Run Terraform to deploy this backend, ensuring everything + is setup to create new mini environments. + </p> + </li> + <li class="list-group-item"> + <%= submit_tag("Stop", + role: 'button', + style: 'margin-bottom: 5px;', + class: 'btn btn-lg btn-warning btn-block') + %> + <p class="list-group-item-text"> + Run Terraform to stop this backend, terminating the + build machine used to build new mini + environments. Existing environments will continue to + run, but new environments cannot be created. + </p> + </li> + <li class="list-group-item"> + <%= submit_tag("Destroy", + role: 'button', + style: 'margin-bottom: 5px;', + class: 'btn btn-lg btn-danger btn-block') + %> + <p class="list-group-item-text"> + Run Terraform to destroy this backend, note that this will + remove all cached data and disrupt all mini environments + using this backend. + </p> + </li> + <li class="list-group-item"> + <%= submit_tag("Refresh state", + role: 'button', + style: 'margin-bottom: 5px;', + class: 'btn btn-lg btn-info btn-block') + %> + <p class="list-group-item-text"> + Run Terraform to refresh the state information for this + backend. + </p> + </li> + </ul> + </div> + <% end %> + </div> + <div class="col-md-9"> + <%= render( + partial: 'shared/jobs', + locals: { + jobs: Backends::TerraformAwsJob.jobs(@backend.id).order(id: :desc) + } + ) %> + </div> +</div> + +<div class="row"> + <div class="col-md-8"> + <h3>Update details</h3> + <br> + + <%= form_with(model: @backend, + url: { action: "update" }, + html: { class: "form-horizontal" }) do |f| + %> + + <div class="form-group form-group-lg"> + <%= f.label :label, class: 'col-sm-4 control-label' %> + <div class="col-sm-8"> + <%= f.text_field( + :label, + class: 'form-control', + placeholder: 'Label for this backend' + ) %> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label :domain, class: 'col-sm-4 control-label' %> + <div class="col-sm-8"> + <%= f.text_field( + :domain, + class: 'form-control', + placeholder: 'Domain within which to host mini environments', + readonly: true + ) %> + <span class="help-block"> + <p> + For example, if you entered <samp>example.com</samp> for + the backend domain, and then created a mini environment + called "Test" using this backend, then the application + domain for the mini environment would be + <samp>test.example.com</samp>. + </p> + <p> + A Route53 Hosted Zone will be created for this domain, + and records added for the mini environments. + </p> + </span> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label :aws_region, 'AWS Region', class: 'col-sm-4 control-label' %> + <div class="col-sm-8"> + <%= f.text_field( + :aws_region, + class: 'form-control', + placeholder: 'What region to use', + readonly: true, + ) %> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label( + :vpc_id, + 'VPC ID', + class: 'col-sm-4 control-label' + ) %> + <div class="col-sm-8"> + <%= f.text_field( + :vpc_id, + class: 'form-control', + placeholder: 'The ID of the VPC (Virtual Private Cloud) to use', + readonly: true + ) %> + <span class="help-block"> + <p> + This VPC (Virtual Private Cloud) should be the one to + use for all resources. + </p> + </span> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label( + :route_53_zone_id, + 'Route 53 Zone ID', + class: 'col-sm-4 control-label' + ) %> + <div class="col-sm-8"> + <%= f.text_field( + :route_53_zone_id, + class: 'form-control', + placeholder: 'The ID of the Route 53 Zone to use', + readonly: true + ) %> + <span class="help-block"> + <p> + This zone should be authoritive for the domain this + backend is using. Entries in this zone will be created + for the mini environments. + </p> + </span> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label :aws_access_key_id, 'AWS Access Key ID', class: 'col-sm-4 control-label' %> + <div class="col-sm-8"> + <%= f.text_field( + :aws_access_key_id, + class: 'form-control', + ) %> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label :aws_secret_access_key, 'AWS Secret Access Key', class: 'col-sm-4 control-label' %> + <div class="col-sm-8"> + <%= f.password_field( + :aws_secret_access_key, + class: 'form-control', + placeholder: 'Secret key hidden', + ) %> + <span id="helpBlock" class="help-block"> + The AWS Secret Access Key is not accessible once entered. + </span> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label( + :ssh_public_key, + 'SSH Key, public part', + class: 'col-sm-4 control-label' + ) %> + <div class="col-sm-8"> + <%= f.text_area( + :ssh_public_key, + class: 'form-control', + placeholder: 'The public part of the SSH key to use', + readonly: true + ) %> + <span class="help-block"> + <p> + </p> + </span> + </div> + </div> + + <div class="form-group form-group-lg"> + <%= f.label( + :ssh_private_key, + 'SSH Key, private part', + class: 'col-sm-4 control-label' + ) %> + <div class="col-sm-8"> + <%= text_area_tag( + :ssh_private_key, + 'Secret key hidden', + class: 'form-control', + disabled: true + ) %> + <span class="help-block"> + <p> + </p> + </span> + </div> + </div> + + <div class="form-group form-group-lg"> + <div class="col-sm-offset-2 col-sm-10"> + <%= f.submit "Save", class: 'btn btn-lg btn-success' %> + </div> + </div> + <% end %> + </div> + <div class="col-md-4"> + <h3>Delete backend</h3> + <br> + + <% unless @backend.mini_environments.empty? %> + <p> + Unable to delete backend, as mini environments using this + backend still exist. + </p> + + <p> + To delete this backend, first delete all the mini environments + using it. + </p> + <% end %> + + <%= form_with(model: @backend, + url: { action: "destroy" }, + html: { class: "form-horizontal", method: :delete }) do |f| + %> + <%= f.submit( + "Delete", + class: ( + 'btn btn-lg btn-danger' + + (@backend.mini_environments.empty? ? '' : ' disabled') + ) + ) %> + <% end %> + + </div> +</div> + +<h3>Mini environments</h3> + +<table class="table table-striped"> + <tr> + <th>Name</th> + <th></th> + </tr> + <% @backend.mini_environments.each do |mini_environment| %> + <tr> + <td><%= mini_environment.name %></td> + <td> + <a class="btn btn-default btn-lg pull-right" + role="button" + href="<%= mini_environment_path(mini_environment) %>"> + Show details + </a> + </td> + </tr> + <% end %> +</table> |