aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/controllers/backends/terraform_aws_using_ami_controller.rb118
-rw-r--r--app/controllers/govuk_guix/revisions_controller.rb3
-rw-r--r--app/jobs/backends/terraform_aws_using_ami_job.rb46
-rw-r--r--app/models/backends.rb3
-rw-r--r--app/models/backends/terraform_aws.rb4
-rw-r--r--app/models/backends/terraform_aws_using_ami.rb90
-rw-r--r--app/models/backends/terraform_aws_using_ami/backend_methods.rb146
-rw-r--r--app/models/backends/terraform_aws_using_ami/mini_environment_methods.rb117
-rw-r--r--app/services/govuk_guix/build_mini_environment.rb12
-rw-r--r--app/views/backends/terraform_aws_using_ami/new.html.erb192
-rw-r--r--app/views/backends/terraform_aws_using_ami/show.html.erb362
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>