aboutsummaryrefslogtreecommitdiff
path: root/app/jobs/govuk_guix
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2018-03-27 23:04:41 +0100
committerChristopher Baines <mail@cbaines.net>2018-04-03 21:58:55 +0100
commit94f9e2a768327479c8b2da99cd57ac717cf1589a (patch)
tree819c093f8fb7c37c6017ede36db4f01854a8bcc8 /app/jobs/govuk_guix
parentfa06e98228d8dd80a46622c9f393bb90e680d254 (diff)
downloadgovuk-mini-environment-admin-94f9e2a768327479c8b2da99cd57ac717cf1589a.tar
govuk-mini-environment-admin-94f9e2a768327479c8b2da99cd57ac717cf1589a.tar.gz
Add domains to backends, and rework build jobs
Add a domain to the libvirt and AWS Terraform backends. Along the way, improve the backend controllers and views, and rework the build jobs, simplifying them in to a single new class GovukGuix::BuildJob, which uses configuration from the respective backend.
Diffstat (limited to 'app/jobs/govuk_guix')
-rw-r--r--app/jobs/govuk_guix/build_job.rb55
-rw-r--r--app/jobs/govuk_guix/generate_start_command_job.rb36
-rw-r--r--app/jobs/govuk_guix/generate_vm_image_and_system_job.rb39
-rw-r--r--app/jobs/govuk_guix/job.rb22
4 files changed, 72 insertions, 80 deletions
diff --git a/app/jobs/govuk_guix/build_job.rb b/app/jobs/govuk_guix/build_job.rb
new file mode 100644
index 0000000..d09fc68
--- /dev/null
+++ b/app/jobs/govuk_guix/build_job.rb
@@ -0,0 +1,55 @@
+class GovukGuix::BuildJob < GovukGuix::Job
+ DEFAULT_ARGUMENTS = {
+ 'rails-environment' => 'production',
+ 'use-high-ports' => 'false',
+ 'fallback' => true
+ }.freeze
+
+ @retry_interval = 30
+
+ def run(mini_environment_id, services, arguments)
+ logger.info(self.class) do
+ "Building mini environment #{mini_environment_id}"
+ end
+
+ mini_environment = MiniEnvironment.find(mini_environment_id)
+
+ output = run_command(
+ "#{mini_environment.govuk_guix_revision.store_path}/bin/govuk",
+ 'system',
+ 'build',
+ *hash_to_arguments(
+ DEFAULT_ARGUMENTS.merge(arguments)
+ ),
+ *signon_user_arguments(mini_environment.signon_users),
+ *services
+ )
+
+ build_output = output.last.strip
+ logger.debug(self.class) { "build_output: #{build_output}" }
+
+ mini_environment.update(
+ backend_data: {
+ build_output: build_output
+ }
+ )
+ end
+
+ def signon_user_to_sexp(signon_user)
+ keys = %w(name email role)
+
+ sexp_contents = keys.zip(
+ signon_user.values_at(*keys)
+ ).map do |(key, value)|
+ "#:#{key} \"#{value}\""
+ end
+
+ "(#{sexp_contents.join(' ')})"
+ end
+
+ def signon_user_arguments(signon_users)
+ signon_users.map do |signon_user|
+ "--signon-user=#{signon_user_to_sexp(signon_user)}"
+ end
+ end
+end
diff --git a/app/jobs/govuk_guix/generate_start_command_job.rb b/app/jobs/govuk_guix/generate_start_command_job.rb
deleted file mode 100644
index 9820dcc..0000000
--- a/app/jobs/govuk_guix/generate_start_command_job.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-class GovukGuix::GenerateStartCommandJob < GovukGuix::Job
- @retry_interval = 30
-
- def run(mini_environment_id)
- logger.info "#{self.class}: Building mini environment #{mini_environment_id}"
-
- mini_environment = MiniEnvironment.find(mini_environment_id)
-
- slug = mini_environment.name.parameterize
-
- command = [
- "#{mini_environment.govuk_guix_revision.store_path}/bin/govuk",
- 'system',
- 'build',
- '--rails-environment=production',
- "--app-domain=#{slug}.aws.cbaines.net",
- "--web-domain=www.#{slug}.aws.cbaines.net",
- '--use-high-ports=false',
- '--use-https=certbot',
- '--fallback',
- 'whitehall',
- 'government-frontend'
- ]
-
- run_command(command) do |output|
- store_path = output.last.strip
- logger.debug("#{self.class}: start_command: #{store_path}")
-
- mini_environment.update(
- backend_data: {
- start_command: store_path
- }
- )
- end
- end
-end
diff --git a/app/jobs/govuk_guix/generate_vm_image_and_system_job.rb b/app/jobs/govuk_guix/generate_vm_image_and_system_job.rb
deleted file mode 100644
index 1c84577..0000000
--- a/app/jobs/govuk_guix/generate_vm_image_and_system_job.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-class GovukGuix::GenerateVmImageAndSystemJob < GovukGuix::Job
- @retry_interval = 30
-
- def run(mini_environment_id)
- logger.info(
- "#{self.class}: Building mini environment #{mini_environment_id}"
- )
-
- mini_environment = MiniEnvironment.find(mini_environment_id)
-
- slug = mini_environment.name.parameterize
-
- command = [
- "#{mini_environment.govuk_guix_revision.store_path}/bin/govuk",
- 'system',
- 'build',
- '--type=vm-image-and-system',
- '--rails-environment=production',
- "--app-domain=#{slug}.aws.cbaines.net",
- "--web-domain=www.#{slug}.aws.cbaines.net",
- '--use-high-ports=false',
- '--use-https=certbot',
- '--fallback',
- 'whitehall',
- 'government-frontend'
- ]
-
- run_command(command) do |output|
- store_path = output.last.strip
- logger.debug "#{self.class}: vm_image_and_system: #{store_path}"
-
- mini_environment.update(
- backend_data: {
- vm_image_and_system: store_path
- }
- )
- end
- end
-end
diff --git a/app/jobs/govuk_guix/job.rb b/app/jobs/govuk_guix/job.rb
index 295f77d..577ead9 100644
--- a/app/jobs/govuk_guix/job.rb
+++ b/app/jobs/govuk_guix/job.rb
@@ -1,7 +1,7 @@
require 'open3'
class GovukGuix::Job < Que::Job
- def run_command(command)
+ def run_command(*command)
logger.debug("#{self.class}: Running command #{command.join(' ')}")
Open3.popen2e(*command) do |_stdin, stdout_and_stderr, wait_thr|
@@ -9,18 +9,30 @@ class GovukGuix::Job < Que::Job
output = []
stdout_and_stderr.each_line do |line|
- logger.debug("#{self.class}: #{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}")
+ logger.error(self.class) { "failed, exit status #{exit_status}" }
- raise "#{output.join}\n"
+ raise "Running #{command.join(' ')} failed:\n\n#{output.join}\n"
end
- yield(output)
+ output
+ end
+ end
+
+ def hash_to_arguments(hash)
+ hash.map do |(key, value)|
+ transfomed_key = key.tr('_', '-')
+
+ if value == true
+ "--#{transfomed_key}"
+ else
+ "--#{transfomed_key}=#{value}"
+ end
end
end
end