aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2018-06-01 18:24:41 +0100
committerChristopher Baines <mail@cbaines.net>2018-06-01 18:47:09 +0100
commit086af5438ed7827cb6e1b2167cfae5c1e3a309b2 (patch)
tree1fd044d0c3fd86a01120202bd9b441935cf5bc1d
parent1135f97d58c9978e3da074c60ec073a42545289c (diff)
downloadgovuk-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.rb101
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