# GOV.UK Mini Environment Admin # Copyright © 2018 Christopher Baines # # 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 # . class GovukGuix::CreateDataSnapshotJob < Que::Job extend EnqueuedJobs include ::ShellUtils @retry_interval = 30 def run(options = {}) data_snapshot_fields = {} backend_type = options[:backend_type] backend_id = options[:backend_id] if backend_type backend = Backends.find_by_type_and_id(backend_type, backend_id) data_snapshot_fields[:backend] = backend remote_host = backend.build_remote_host 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 logger.info(self.class) do 'Creating new data snapshot' end if remote_host && Guix.available_locally? # TODO: This doesn't use the private key specified by the # backend, so it'll only work when the default SSH key has # access to the remote host. # Copy the revision to the remote host, to ensure it's available # there run_command( 'guix', 'copy', "--to=#{remote_host.user_at_address}", revision.store_path ) end output = run_command( "#{revision.store_path}/bin/govuk", 'data', 'build-snapshot', *hash_to_arguments( exclude_service: [ 'release', # As the data in this app isn't useful in the # mini environment 'signon' # As the configuration is handled by govuk-guix ] ), run_remotely_on_host: remote_host, environment_variables: { 'GOVUK_AWS_DONT_ASSUME_ROLE' => 'true', 'AWS_ACCESS_KEY_ID' => backend.aws_access_key_id, 'AWS_SECRET_ACCESS_KEY' => backend.aws_secret_access_key } ) 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 ) backend.add_in_use_store_path(build_output) GovukGuix::DataSnapshot.transaction do GovukGuix::DataSnapshot.create!(data_snapshot_fields) finish end end def self.job_title(_que_job) 'Create Data Snapshot' end end