This repository has been archived by the owner on May 11, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
cleanup_reset_service.rb
103 lines (90 loc) · 4.49 KB
/
cleanup_reset_service.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# frozen_string_literal: true
require 'pathname'
module Dor
# Remove all traces of the object's data files from the workspace and export areas
class CleanupResetService
# @param [String] druid The identifier for the object whose reset data is to be removed
# @return [void] remove copy of the reset data that was exported to preservation core
def self.cleanup_by_reset_druid(druid)
last_version = get_druid_last_version(druid)
cleanup_reset_workspace_content(druid, last_version, Config.cleanup.local_workspace_root)
cleanup_assembly_content(druid, Config.cleanup.local_assembly_root)
cleanup_reset_export(druid, last_version)
end
def self.get_druid_last_version(druid)
druid_obj = Dor.find(druid)
last_version = druid_obj.current_version.to_i
# if the current version is still open, avoid this versioned directory
last_version -= 1 if Dor::Config.workflow.client.lifecycle('dor', druid, 'accessioned').nil?
last_version
end
# @param [String] druid The identifier for the object whose reset data is to be removed
# @param [String] base The base directory to delete from
# @param [Integer] last_version The last version that the data should be removed until version 1
# @return [void] remove all the object's reset data files from the workspace area equal to less than the last_version
def self.cleanup_reset_workspace_content(druid, last_version, base)
base_druid = DruidTools::Druid.new(druid, base)
base_druid_tree = base_druid.pathname.to_s
# if it is truncated tree /aa/111/aaa/1111/content,
# we should follow the regular cleanup technique
reset_directories = get_reset_dir_list(last_version, base_druid_tree)
reset_directories.each do |path|
FileUtils.rm_rf(path)
end
base_druid.prune_ancestors(base_druid.pathname.parent)
end
# @param [String] base_druid_tree The base directory to delete from
# @param [Integer] last_version The last version that the data should be removed until version 1
# @return [void] prepares a list of reset directories that should be removed
def self.get_reset_dir_list(last_version, base_druid_tree)
reset_directories = []
(1..last_version).each do |i|
reset_path = "#{base_druid_tree}_v#{i}"
reset_directories.append(reset_path) if File.exist?(reset_path)
end
reset_directories
end
# @param [String] druid The identifier for the object whose reset bags data is to be removed
# @return [void] remove copy of the reset data that was exported to preservation core
def self.cleanup_reset_export(druid, last_version)
id = druid.split(':').last
base_bag_directory = File.join(Config.cleanup.local_export_home, id)
bag_dir_list = get_reset_bag_dir_list(last_version, base_bag_directory)
bag_dir_list.each do |bag_dir|
Pathname(bag_dir).rmtree
end
bag_tar_list = get_reset_bag_tar_list(last_version, base_bag_directory)
bag_tar_list.each do |bag_tar|
Pathname(bag_tar).rmtree
end
end
# @param [Integer] last_version The last version that the data should be removed until version 1
# @param [String] base_bag_directory The base bag directory including the export home and druid id
# @return [void] prepares a list of reset bag directories that should be removed
def self.get_reset_bag_dir_list(last_version, base_bag_directory)
reset_bags = []
(1..last_version).each do |i|
reset_path = "#{base_bag_directory}_v#{i}"
reset_bags.append(reset_path) if File.exist?(reset_path)
end
reset_bags
end
# @param [String] base_bag_directory The base bag directory including the export home and druid id
# @param [Integer] last_version The last version that the data should be removed until version 1
# @return [void] prepares a list of reset bag tars that should be removed
def self.get_reset_bag_tar_list(last_version, base_bag_directory)
reset_bags = []
(1..last_version).each do |i|
reset_path = "#{base_bag_directory}_v#{i}.tar"
reset_bags.append(reset_path) if File.exist?(reset_path)
end
reset_bags
end
# @param [String] druid The identifier for the object whose data is to be removed
# @param [String] base The base directory to delete from
# @return [void] remove the object's data files from the assembly area
def self.cleanup_assembly_content(druid, base)
DruidTools::Druid.new(druid, base).prune!
end
end
end