2020-03-13 15:44:24 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module Groups
|
|
|
|
module ImportExport
|
|
|
|
class ImportService
|
|
|
|
attr_reader :current_user, :group, :params
|
|
|
|
|
|
|
|
def initialize(group:, user:)
|
|
|
|
@group = group
|
|
|
|
@current_user = user
|
|
|
|
@shared = Gitlab::ImportExport::Shared.new(@group)
|
2020-06-23 00:09:42 +05:30
|
|
|
@logger = Gitlab::Import::Logger.build
|
|
|
|
end
|
|
|
|
|
|
|
|
def async_execute
|
|
|
|
group_import_state = GroupImportState.safe_find_or_create_by!(group: group)
|
|
|
|
jid = GroupImportWorker.perform_async(current_user.id, group.id)
|
|
|
|
|
|
|
|
if jid.present?
|
|
|
|
group_import_state.update!(jid: jid)
|
|
|
|
else
|
|
|
|
group_import_state.fail_op('Failed to schedule import job')
|
|
|
|
|
|
|
|
false
|
|
|
|
end
|
2020-03-13 15:44:24 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
def execute
|
2020-04-08 14:13:33 +05:30
|
|
|
if valid_user_permissions? && import_file && restorer.restore
|
|
|
|
notify_success
|
2020-03-13 15:44:24 +05:30
|
|
|
|
|
|
|
@group
|
|
|
|
else
|
2020-04-08 14:13:33 +05:30
|
|
|
notify_error!
|
2020-03-13 15:44:24 +05:30
|
|
|
end
|
2020-04-08 14:13:33 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
ensure
|
2020-06-23 00:09:42 +05:30
|
|
|
remove_base_tmp_dir
|
2020-03-13 15:44:24 +05:30
|
|
|
remove_import_file
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def import_file
|
2020-05-24 23:13:21 +05:30
|
|
|
@import_file ||= Gitlab::ImportExport::FileImporter.import(
|
|
|
|
importable: @group,
|
|
|
|
archive_file: nil,
|
|
|
|
shared: @shared
|
|
|
|
)
|
2020-03-13 15:44:24 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
def restorer
|
2020-05-24 23:13:21 +05:30
|
|
|
@restorer ||=
|
|
|
|
if ndjson?
|
|
|
|
Gitlab::ImportExport::Group::TreeRestorer.new(
|
|
|
|
user: @current_user,
|
|
|
|
shared: @shared,
|
|
|
|
group: @group
|
|
|
|
)
|
|
|
|
else
|
|
|
|
Gitlab::ImportExport::Group::LegacyTreeRestorer.new(
|
|
|
|
user: @current_user,
|
|
|
|
shared: @shared,
|
|
|
|
group: @group,
|
|
|
|
group_hash: nil
|
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def ndjson?
|
|
|
|
::Feature.enabled?(:group_import_ndjson, @group&.parent, default_enabled: true) &&
|
|
|
|
File.exist?(File.join(@shared.export_path, 'tree/groups/_all.ndjson'))
|
2020-03-13 15:44:24 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
def remove_import_file
|
|
|
|
upload = @group.import_export_upload
|
|
|
|
|
|
|
|
return unless upload&.import_file&.file
|
|
|
|
|
|
|
|
upload.remove_import_file!
|
|
|
|
upload.save!
|
|
|
|
end
|
|
|
|
|
2020-04-08 14:13:33 +05:30
|
|
|
def valid_user_permissions?
|
|
|
|
if current_user.can?(:admin_group, group)
|
|
|
|
true
|
|
|
|
else
|
|
|
|
@shared.error(::Gitlab::ImportExport::Error.permission_error(current_user, group))
|
|
|
|
|
|
|
|
false
|
2020-03-13 15:44:24 +05:30
|
|
|
end
|
|
|
|
end
|
2020-04-08 14:13:33 +05:30
|
|
|
|
|
|
|
def notify_success
|
2020-06-23 00:09:42 +05:30
|
|
|
@logger.info(
|
2020-04-08 14:13:33 +05:30
|
|
|
group_id: @group.id,
|
|
|
|
group_name: @group.name,
|
|
|
|
message: 'Group Import/Export: Import succeeded'
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
def notify_error
|
2020-06-23 00:09:42 +05:30
|
|
|
@logger.error(
|
2020-04-08 14:13:33 +05:30
|
|
|
group_id: @group.id,
|
|
|
|
group_name: @group.name,
|
|
|
|
message: "Group Import/Export: Errors occurred, see '#{Gitlab::ErrorTracking::Logger.file_name}' for details"
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
def notify_error!
|
|
|
|
notify_error
|
|
|
|
|
|
|
|
raise Gitlab::ImportExport::Error.new(@shared.errors.to_sentence)
|
|
|
|
end
|
2020-06-23 00:09:42 +05:30
|
|
|
|
|
|
|
def remove_base_tmp_dir
|
|
|
|
FileUtils.rm_rf(@shared.base_path)
|
|
|
|
end
|
2020-03-13 15:44:24 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|