aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2018-06-22 07:34:07 +0100
committerChristopher Baines <mail@cbaines.net>2018-06-22 07:34:07 +0100
commit1fcb11bb31d0ffbf37de3ce704231bdcdaf787ca (patch)
treecd8f0c90a9e1f58455c27c3f60f0afc1c2387c1a /app
parent3f2561ef31851f43e9270679eb23304007aadd67 (diff)
downloadgovuk-mini-environment-admin-1fcb11bb31d0ffbf37de3ce704231bdcdaf787ca.tar
govuk-mini-environment-admin-1fcb11bb31d0ffbf37de3ce704231bdcdaf787ca.tar.gz
Replace the GovukGuix::BuildJob
With a service that performs the same function, and use the MiniEnvironmentJob instead.
Diffstat (limited to 'app')
-rw-r--r--app/controllers/mini_environments_controller.rb7
-rw-r--r--app/jobs/govuk_guix/create_data_snapshot_job.rb3
-rw-r--r--app/jobs/govuk_guix/fetch_revision_job.rb3
-rw-r--r--app/jobs/govuk_guix/job.rb96
-rw-r--r--app/models/backends/terraform_aws.rb2
-rw-r--r--app/models/backends/terraform_libvirt/mini_environment_methods.rb2
-rw-r--r--app/services/govuk_guix/build_mini_environment.rb (renamed from app/jobs/govuk_guix/build_job.rb)21
-rw-r--r--app/views/mini_environments/show.html.erb33
-rw-r--r--app/views/shared/_jobs.html.erb10
9 files changed, 24 insertions, 153 deletions
diff --git a/app/controllers/mini_environments_controller.rb b/app/controllers/mini_environments_controller.rb
index 9b8a16c..837a503 100644
--- a/app/controllers/mini_environments_controller.rb
+++ b/app/controllers/mini_environments_controller.rb
@@ -133,7 +133,7 @@ class MiniEnvironmentsController < ApplicationController
end
end
- @mini_environment.backend.build(@mini_environment)
+ MiniEnvironmentJob.enqueue(@mini_environment.id, :build)
redirect_to @mini_environment
end
end
@@ -160,10 +160,7 @@ class MiniEnvironmentsController < ApplicationController
end
def jobs
- [
- MiniEnvironmentJob.jobs(@mini_environment.id),
- GovukGuix::BuildJob.jobs(@mini_environment.id)
- ].flatten
+ MiniEnvironmentJob.jobs(@mini_environment.id)
end
helper_method :jobs
diff --git a/app/jobs/govuk_guix/create_data_snapshot_job.rb b/app/jobs/govuk_guix/create_data_snapshot_job.rb
index f2075c7..91f3904 100644
--- a/app/jobs/govuk_guix/create_data_snapshot_job.rb
+++ b/app/jobs/govuk_guix/create_data_snapshot_job.rb
@@ -18,8 +18,9 @@
# License along with the GOV.UK Mini Environment Admin. If not, see
# <http://www.gnu.org/licenses/>.
-class GovukGuix::CreateDataSnapshotJob < GovukGuix::Job
+class GovukGuix::CreateDataSnapshotJob < Que::Job
extend EnqueuedJobs
+ include ::ShellUtils
@retry_interval = 30
diff --git a/app/jobs/govuk_guix/fetch_revision_job.rb b/app/jobs/govuk_guix/fetch_revision_job.rb
index c747c13..2787156 100644
--- a/app/jobs/govuk_guix/fetch_revision_job.rb
+++ b/app/jobs/govuk_guix/fetch_revision_job.rb
@@ -20,8 +20,9 @@
require 'git'
-class GovukGuix::FetchRevisionJob < GovukGuix::Job
+class GovukGuix::FetchRevisionJob < Que::Job
extend EnqueuedJobs
+ include ::ShellUtils
REPOSITORY_DIRECTORY = 'tmp/cache/govuk-guix'.freeze
diff --git a/app/jobs/govuk_guix/job.rb b/app/jobs/govuk_guix/job.rb
deleted file mode 100644
index 5f95f4d..0000000
--- a/app/jobs/govuk_guix/job.rb
+++ /dev/null
@@ -1,96 +0,0 @@
-# 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/>.
-
-require 'open3'
-require 'shellwords'
-
-class GovukGuix::Job < Que::Job
- def run_command(*command, run_remotely_on_host: nil)
- if run_remotely_on_host
- command = command.map do |arg|
- Shellwords.escape(arg)
- end
-
- command = [
- 'ssh',
- run_remotely_on_host,
- *command
- ]
- end
-
- logger.debug("#{self.class}: Running command #{command.join(' ')}")
-
- Open3.popen2e(*command) do |_stdin, stdout_and_stderr, wait_thr|
- logger.info("#{self.class}: commmand running, pid #{wait_thr.pid}")
-
- output = []
- stdout_and_stderr.each_line do |line|
- logger.debug(self.class) { line.chomp }
- output << line
- end
-
- exit_status = wait_thr.value
- unless exit_status == 0
- logger.error(self.class) { "failed, exit status #{exit_status}" }
-
- raise "Running #{command.join(' ')} failed:\n\n#{output.join}\n"
- end
-
- output
- end
- end
-
- def read_json_file(filename, from_remote_host: nil)
- if from_remote_host
- command = [
- 'ssh',
- from_remote_host,
- 'cat',
- filename
- ]
-
- stdout_str, status = Open3.capture2(*command)
-
- unless status.exitstatus == 0
- logger.error(self.class) { "failed, exit status #{exit_status}" }
-
- raise "Running #{command.join(' ')} failed:\n\n#{output.join}\n"
- end
-
- JSON.parse(stdout_str)
- else
- JSON.parse(File.read(filename))
- end
- end
-
- def hash_to_arguments(hash)
- hash.flat_map do |(key, value)|
- transformed_key = key.to_s.tr('_', '-')
-
- if value == true
- ["--#{transformed_key}"]
- elsif value.kind_of?(Array)
- value.map { |x| "--#{transformed_key}=#{x}" }
- else
- ["--#{transformed_key}=#{value}"]
- end
- end
- end
-end
diff --git a/app/models/backends/terraform_aws.rb b/app/models/backends/terraform_aws.rb
index db8d6cd..1f16188 100644
--- a/app/models/backends/terraform_aws.rb
+++ b/app/models/backends/terraform_aws.rb
@@ -52,7 +52,7 @@ class Backends::TerraformAws < ApplicationRecord
def build(mini_environment)
slug = mini_environment.name.parameterize
- GovukGuix::BuildJob.enqueue(
+ GovukGuix::BuildMiniEnvironment.build(
mini_environment.id,
services: mini_environment.services.map(&:build_argument_string),
arguments: {
diff --git a/app/models/backends/terraform_libvirt/mini_environment_methods.rb b/app/models/backends/terraform_libvirt/mini_environment_methods.rb
index c931a5d..4ed8835 100644
--- a/app/models/backends/terraform_libvirt/mini_environment_methods.rb
+++ b/app/models/backends/terraform_libvirt/mini_environment_methods.rb
@@ -22,7 +22,7 @@ module Backends::TerraformLibvirt::MiniEnvironmentMethods
def build(mini_environment)
slug = mini_environment.name.parameterize
- GovukGuix::BuildJob.enqueue(
+ GovukGuix::BuildMiniEnvironment.build(
mini_environment.id,
services: mini_environment.services.map(&:build_argument_string),
arguments: {
diff --git a/app/jobs/govuk_guix/build_job.rb b/app/services/govuk_guix/build_mini_environment.rb
index 94acd70..5e5fd85 100644
--- a/app/jobs/govuk_guix/build_job.rb
+++ b/app/services/govuk_guix/build_mini_environment.rb
@@ -18,16 +18,16 @@
# License along with the GOV.UK Mini Environment Admin. If not, see
# <http://www.gnu.org/licenses/>.
-class GovukGuix::BuildJob < GovukGuix::Job
+module GovukGuix::BuildMiniEnvironment
+ extend ::ShellUtils
+
DEFAULT_ARGUMENTS = {
'rails-environment' => 'production',
'use-high-ports' => 'false',
'fallback' => true
}.freeze
- @retry_interval = 30
-
- def run(mini_environment_id, options)
+ def self.build(mini_environment_id, options)
logger.info(self.class) do
"Building mini environment #{mini_environment_id}"
end
@@ -69,7 +69,7 @@ class GovukGuix::BuildJob < GovukGuix::Job
)
end
- def signon_user_to_sexp(signon_user)
+ def self.signon_user_to_sexp(signon_user)
keys = %w(name email role passphrase)
sexp_contents = keys.zip(
@@ -81,18 +81,9 @@ class GovukGuix::BuildJob < GovukGuix::Job
"(#{sexp_contents.join(' ')})"
end
- def signon_user_arguments(signon_users)
+ def self.signon_user_arguments(signon_users)
signon_users.map do |signon_user|
"--signon-user=#{signon_user_to_sexp(signon_user)}"
end
end
-
- def self.jobs(mini_environment_id)
- QueJob
- .where(
- job_class: name
- ).where(
- "args->>0 = '#{mini_environment_id}'"
- ).to_a
- end
end
diff --git a/app/views/mini_environments/show.html.erb b/app/views/mini_environments/show.html.erb
index 7f3432a..a4d8588 100644
--- a/app/views/mini_environments/show.html.erb
+++ b/app/views/mini_environments/show.html.erb
@@ -60,39 +60,6 @@ License along with the GOV.UK Mini Environment Admin. If not, see
<% end %>
</div>
<div class="col-md-9">
- <% if @mini_environment.backend_data.present? %>
- <div class="panel panel-default">
- <div class="panel-heading" role="tab" id="backendDataHeading">
- <h4 class="panel-title">
- <a role="button"
- data-toggle="collapse"
- class="collapsed"
- href="#backendData"
- aria-expanded="true"
- aria-controls="backendData">
-
- Mini Environment built successfully
- <span class="caret"></span>
- </a>
- </h4>
- </div>
- <div id="backendData"
- class="panel-collapse collapse in"
- role="tabpanel"
- aria-labelledby="backendDataHeading"
- >
- <div class="panel-body">
- <dl class="dl-horizontal">
- <% @mini_environment.backend_data.each do |(key, value)| %>
- <dt><%= key %></dt>
- <dd><pre><%= value %></pre></dd>
- <% end %>
- </dl>
- </div>
- </div>
- </div>
- <% end %>
-
<%= render(
partial: 'shared/jobs',
locals: { jobs: jobs }
diff --git a/app/views/shared/_jobs.html.erb b/app/views/shared/_jobs.html.erb
index 5b559c1..417f8a0 100644
--- a/app/views/shared/_jobs.html.erb
+++ b/app/views/shared/_jobs.html.erb
@@ -61,6 +61,16 @@
<% elsif job.finished_at %>
<div class="col-md-12">
Finished after <%= job['error_count'] %> errors.
+
+ <% if job.args.last == 'build' %>
+ <%# TODO: Generalise this somehow %>
+ <dl class="dl-horizontal">
+ <% @mini_environment.backend_data.each do |(key, value)| %>
+ <dt><%= key %></dt>
+ <dd><pre><%= value %></pre></dd>
+ <% end %>
+ </dl>
+ <% end %>
</div>
<% else %>
<div class="col-md-10">