diff options
author | Christopher Baines <mail@cbaines.net> | 2018-06-01 18:24:41 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2018-06-01 18:47:09 +0100 |
commit | 086af5438ed7827cb6e1b2167cfae5c1e3a309b2 (patch) | |
tree | 1fd044d0c3fd86a01120202bd9b441935cf5bc1d | |
parent | 1135f97d58c9978e3da074c60ec073a42545289c (diff) | |
download | govuk-mini-environment-admin-086af5438ed7827cb6e1b2167cfae5c1e3a309b2.tar govuk-mini-environment-admin-086af5438ed7827cb6e1b2167cfae5c1e3a309b2.tar.gz |
Add job to create data snapshots
-rw-r--r-- | app/jobs/govuk_guix/create_data_snapshot_job.rb | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/app/jobs/govuk_guix/create_data_snapshot_job.rb b/app/jobs/govuk_guix/create_data_snapshot_job.rb new file mode 100644 index 0000000..d2a757d --- /dev/null +++ b/app/jobs/govuk_guix/create_data_snapshot_job.rb @@ -0,0 +1,101 @@ +# 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/>. + +class GovukGuix::CreateDataSnapshotJob < GovukGuix::Job + extend EnqueuedJobs + + @retry_interval = 30 + + def enqueue(options = {}) + backend_type = options[:backend_type] + backend_id = options[:backend_id] + + remote_host = options[:run_remotely_on_host] + + if remote_host + raise 'backend_type missing' unless backend_type + raise 'backend_id missing' unless backend_id + end + + super(options) + end + + def run(options = {}) + data_snapshot_fields = {} + + backend_type = options[:backend_type] + backend_id = options[:backend_id] + if backend_type + backend = Backend.find_by_type_and_id(backend_type, backend_id) + data_snapshot_fields[:backend] = backend + end + + revision_id = options[:revision_id] + revision = if revision_id + GovukGuix::Revision.find(revision_id) + else + GovukGuix::Revision.order(:created_at).first + end + data_snapshot_fields[:govuk_guix_revision] = revision + + remote_host = options[:run_remotely_on_host] + + logger.info(self.class) do + 'Creating new data snapshot' + end + + if remote_host + ssh_command = ['ssh', remote_host] + + # Copy the revision to the remote host, to ensure it's available + # there + run_command( + 'guix', + 'copy', + "--to=#{remote_host}", + revision.store_path + ) + else + ssh_command = [] + end + + output = run_command( + *ssh_command, + "#{revision.store_path}/bin/govuk", + 'data', + 'build-snapshot', + # TODO: Just use a couple of small databases for initial testing + *%w(content-tagger contacts-admin) + ) + + build_output = output.last.strip + logger.debug(self.class) { "build_output: #{build_output}" } + data_snapshot_fields[:store_path] = build_output + + data_snapshot_fields[:manifest] = read_json_file( + "#{build_output}/manifest.json", + from_remote_host: remote_host + ) + + puts data_snapshot_fields.keys + + GovukGuix::DataSnapshot.create!(data_snapshot_fields) + end +end |