diff options
author | Christopher Baines <mail@cbaines.net> | 2018-03-27 23:04:41 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2018-04-03 21:58:55 +0100 |
commit | 94f9e2a768327479c8b2da99cd57ac717cf1589a (patch) | |
tree | 819c093f8fb7c37c6017ede36db4f01854a8bcc8 /app/jobs/govuk_guix | |
parent | fa06e98228d8dd80a46622c9f393bb90e680d254 (diff) | |
download | govuk-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.rb | 55 | ||||
-rw-r--r-- | app/jobs/govuk_guix/generate_start_command_job.rb | 36 | ||||
-rw-r--r-- | app/jobs/govuk_guix/generate_vm_image_and_system_job.rb | 39 | ||||
-rw-r--r-- | app/jobs/govuk_guix/job.rb | 22 |
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 |