storazzo 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +7 -4
- data/Makefile +20 -1
- data/README.md +23 -0
- data/Rakefile +35 -8
- data/VERSION +1 -1
- data/bin/hello-storazzo +5 -0
- data/bin/ricdisk-magic +50 -57
- data/bin/stats-with-md5 +268 -297
- data/lib/storazzo/colors.rb +43 -45
- data/lib/storazzo/common.rb +80 -17
- data/lib/storazzo/debug.rb +5 -8
- data/lib/storazzo/hashify.rb +44 -43
- data/lib/storazzo/main.rb +44 -40
- data/lib/storazzo/media/abstract_ric_disk.rb +163 -104
- data/lib/storazzo/media/gcs_bucket.rb +51 -15
- data/lib/storazzo/media/local_folder.rb +43 -46
- data/lib/storazzo/media/mount_point.rb +12 -2
- data/lib/storazzo/ric_disk.rb +223 -251
- data/lib/storazzo/ric_disk_config.rb +230 -193
- data/lib/storazzo/ric_disk_sample_config.rb +12 -16
- data/lib/storazzo/ric_disk_statsfile.rb +17 -16
- data/lib/storazzo/ric_disk_ugly.rb +35 -38
- data/lib/storazzo/version.rb +7 -7
- data/lib/storazzo.rb +34 -29
- data/storazzo.gemspec +22 -20
- data/test/media/test_abstract_ric_disk.rb +19 -0
- data/test/media/test_gcs_bucket.rb +58 -0
- data/test/media/test_local_folder.rb +145 -0
- data/test/media/test_mount_point.rb +25 -0
- data/test/test_ric_disk.rb +16 -0
- data/test/test_ric_disk_config.rb +20 -29
- data/test/test_ric_disk_stats_file.rb +13 -14
- data/test/test_storazzo.rb +26 -26
- data/var/dumps/file_stat.linux.yaml +15 -0
- data/var/dumps/file_stat.macosx.yaml +15 -0
- data/var/test/disks/disk02-full/Rakefile +13 -0
- data/var/test/disks/ricdisk_stats_v11.rds +11 -0
- metadata +38 -10
- data/test/test_gcs_bucket.rb +0 -70
- data/test/test_local_folder.rb +0 -121
@@ -1,106 +1,165 @@
|
|
1
1
|
module Storazzo::Media
|
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
|
-
|
104
|
-
|
2
|
+
class Storazzo::Media::AbstractRicDisk
|
3
|
+
# include Storazzo::Common
|
4
|
+
extend Storazzo::Common
|
5
|
+
|
6
|
+
# DefaultStatsFilename = Storazzo::RicDiskStatsFile.default_name
|
7
|
+
|
8
|
+
# looks like there's not Abstract Class in Ruby, but also SO says he best
|
9
|
+
# way to do this is this:
|
10
|
+
|
11
|
+
# attr_accessor :name, :description, :ricdisk_file, :local_mountpoint, :wr, :path, :ricdisk_file_empty, :size, :active_dirs
|
12
|
+
attr_accessor :description
|
13
|
+
|
14
|
+
########################
|
15
|
+
# Abstract methods START
|
16
|
+
########################
|
17
|
+
def initialize(local_mount)
|
18
|
+
deb "[AbstractRicDisk.init()] Some child of AbstractRicDisk (#{self}) called me! Yummie." # disable when you dont need me anymore..
|
19
|
+
@description ||= "Not provided"
|
20
|
+
# validate
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.list_all
|
24
|
+
raise "[AbstractRicDiskc::self.list_all] You should override this, says StackOverflow and Riccardo"
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.list_all_with_type
|
28
|
+
raise "[AbstractRicDiskc::self.list_all_with_type] You should override this, says StackOverflow and Riccardo"
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.super_duper_list_all_with_type
|
32
|
+
deb "Would be cool to be able to enumerate them all.."
|
33
|
+
GcsBucket.list_all_with_type +
|
34
|
+
MountPoint.list_all_with_type +
|
35
|
+
LocalFolder.list_all_with_type
|
36
|
+
end
|
37
|
+
|
38
|
+
def parse(opts = {})
|
39
|
+
raise "[AbstractRicDiskc::parse] You should override this, says StackOverflow and Riccardo"
|
40
|
+
end
|
41
|
+
|
42
|
+
def writeable?
|
43
|
+
raise "[AbstractRicDiskc::writeable] You should override this in #{self.class}, says StackOverflow and Riccardo"
|
44
|
+
end
|
45
|
+
|
46
|
+
def get_local_mountpoint
|
47
|
+
# raise "[AbstractRicDiskc::get_local_mountpoint] You should override this, says StackOverflow and Riccardo"
|
48
|
+
raise "You forgot to set local_mountpoint in the constructor for your class, you cheeky little one!" if local_mountpoint.nil?
|
49
|
+
|
50
|
+
local_mountpoint
|
51
|
+
end
|
52
|
+
|
53
|
+
def check_implemented_correctly
|
54
|
+
# raise "[AbstractRicDiskc] You should override this, says StackOverflow and Riccardo"
|
55
|
+
raise "no @local_mountpoint" unless exists?(@local_mountpoint)
|
56
|
+
end
|
57
|
+
########################
|
58
|
+
# Abstract methods END
|
59
|
+
########################
|
60
|
+
|
61
|
+
########################
|
62
|
+
# Automated methods now...
|
63
|
+
########################
|
64
|
+
def stats_file_smart_fullpath # stats_file_default_location()
|
65
|
+
# if its writeable... if not we'll think about it later.
|
66
|
+
if writeable?
|
67
|
+
return "#{get_local_mountpoint}/#{self.default_stats_filename}"
|
68
|
+
else
|
69
|
+
# if not writeable, I will:
|
70
|
+
# 1. create a dir based on its unique format.
|
71
|
+
# 2. create a file of same look and feel (alternative - used a DASH)
|
72
|
+
return "TODO FIXME {get_local_folder}/#{unique_id}::#{self.default_stats_filename}"
|
73
|
+
# "{get_local_folder}"/#{unique_id}/#{Storazzo::RicDiskStatsFile.default_name}"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# Needs to be some unique id based on its thingy, but might change in the future:
|
78
|
+
# Solutions:
|
79
|
+
# {PHILOSOPHY}::{ID}
|
80
|
+
def unique_id
|
81
|
+
# Expand path to make it as unique as possible...
|
82
|
+
hash = Digest::MD5.hexdigest(File.expand_path(get_local_mountpoint))
|
83
|
+
"MD5::v1::#{hash}"
|
84
|
+
end
|
85
|
+
|
86
|
+
def to_s(verbose = false)
|
87
|
+
return to_verbose_s() if verbose
|
88
|
+
|
89
|
+
readable_class = self.class.to_s.split('::').last # Storazzo::Media::LocalFolder => LocalFolder
|
90
|
+
my_keys = self.instance_variables # wow!
|
91
|
+
"S:M:#{readable_class}(path=#{path}, r/w=#{wr}, keys=#{my_keys})"
|
92
|
+
end
|
93
|
+
|
94
|
+
def to_verbose_s
|
95
|
+
h = {}
|
96
|
+
h[:class] = self.class
|
97
|
+
h[:unique_id] = self.unique_id
|
98
|
+
h[:inspect] = self.inspect
|
99
|
+
h[:to_s] = self.to_s
|
100
|
+
h[:local_mountpoint] = local_mountpoint
|
101
|
+
h[:writeable] = self.writeable?
|
102
|
+
h[:stats_file_smart_fullpath] = stats_file_smart_fullpath
|
103
|
+
return h
|
104
|
+
end
|
105
|
+
|
106
|
+
# # Todo check on instances these 3 methods exist
|
107
|
+
def self.abstract_class_mandatory_methods
|
108
|
+
%W{
|
109
|
+
self.list_all
|
110
|
+
self.list_all_with_type
|
111
|
+
local_mountpoint
|
112
|
+
parse
|
113
|
+
writeable?
|
114
|
+
}
|
115
|
+
end
|
116
|
+
|
117
|
+
# Putting here since its same code for MountPoint or generic folder.
|
118
|
+
def parse_block_storage_folder(opts = {})
|
119
|
+
# Storazzo::RicDiskUgly.calculate_stats_files(get_local_mountpoint)
|
120
|
+
rd = Storazzo::RicDisk.new(self)
|
121
|
+
# Storazzo::RicDisk
|
122
|
+
rd.compute_stats_files(opts)
|
123
|
+
# return "42"
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.default_stats_filename
|
127
|
+
raise "Unknown Storazzo::RicDiskStatsFile.default_name 1!!" if Storazzo::RicDiskStatsFile.default_name.nil?
|
128
|
+
|
129
|
+
Storazzo::RicDiskStatsFile.default_name
|
130
|
+
end
|
131
|
+
|
132
|
+
def stats_filename_default_fullpath # if not writeable we need to pick another from stats_file_smart_fullpath()
|
133
|
+
# REDUNDANT, should use stats_file_smart_fullpath instead except on the writeable? part since it would go recursive otherwise.
|
134
|
+
my_stats_filename = self.default_stats_filename
|
135
|
+
# raise "Unknown Storazzo::RicDiskStatsFile.default_name 2 !!" if Storazzo::RicDiskStatsFile.default_name.nil?
|
136
|
+
"#{local_mountpoint}/#{my_stats_filename}"
|
137
|
+
end
|
138
|
+
|
139
|
+
def validate(opts = {})
|
140
|
+
verbose = opts.fetch(:verbose, true)
|
141
|
+
puts "[VERBOSE] validate(): We're trying to see if your object is valid, across 3 possible sub-classes." if verbose
|
142
|
+
# 1. check for
|
143
|
+
raise "Unknown local mount " unless local_mount.is_a?(String)
|
144
|
+
|
145
|
+
# 2. check thaty writeable? is true or false
|
146
|
+
my_writeable = wr
|
147
|
+
raise "Writeable is not boolean" unless (my_writeable.is_a? TrueClass or my_writeable.is_a? FalseClass)
|
148
|
+
end
|
149
|
+
|
150
|
+
# TODO use a proper Factory pattern.
|
151
|
+
def self.DirFactory(path)
|
152
|
+
raise "I need a path/directory string: #{path}" unless path.is_a?(String)
|
153
|
+
|
154
|
+
deb "TODO: if coincides with MountPoint, instance THAT"
|
155
|
+
# if path in Storazzo::Media::MountPoint.list_all_mount_points
|
156
|
+
# then return ...
|
157
|
+
if path =~ /^gs:\/\//
|
158
|
+
deb "Smells like GCS"
|
159
|
+
return GcsBucket.new(path)
|
160
|
+
end
|
161
|
+
deb "Smells like LocalFolder :)"
|
162
|
+
return LocalFolder.new(path)
|
163
|
+
end
|
164
|
+
end
|
105
165
|
end
|
106
|
-
#puts "DEB lib/storazzo/media/abstract_ric_disk Media::ARD outside module"
|
@@ -1,22 +1,58 @@
|
|
1
1
|
module Storazzo::Media
|
2
|
+
class Storazzo::RicDisk::GcsBucket
|
3
|
+
extend Storazzo::Common
|
2
4
|
|
3
|
-
|
5
|
+
attr_accessor :project_id
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
# get lisrts from Config singletone
|
8
|
-
#puts " self.list_all: loading config "
|
9
|
-
config ||= Storazzo::RicDiskConfig.instance # # ).get_config
|
10
|
-
|
11
|
-
config.load # in case I need to load it for the first time
|
12
|
-
#puts config['Config']['AdditionalMountDirs']
|
13
|
-
#puts "TODO see config: #{config}"
|
14
|
-
#[42, 43]
|
15
|
-
#deb config.get_local_folders
|
16
|
-
config.get_bucket_paths
|
17
|
-
end
|
7
|
+
def initialize(local_mount, project_id = nil)
|
8
|
+
deb "[Storazzo::Media::GcsBucket] initialize"
|
18
9
|
|
10
|
+
@local_mountpoint = File.expand_path(local_mount)
|
11
|
+
@description = "MountPoint in '#{local_mount}' pointing at TODO with mount options = TODO"
|
12
|
+
@project_id = project_id
|
13
|
+
raise "Sorry local mount doesnt exist!" unless File.exist?(@local_mountpoint)
|
19
14
|
|
15
|
+
@wr = writeable? # File.writable?(stats_filename_default_fullpath) # .writeable? stats_file_smart_fullpath
|
16
|
+
super(local_mount) rescue "SUPER_ERROR(#{local_mount}): #{$!}"
|
20
17
|
end
|
21
18
|
|
22
|
-
|
19
|
+
def self.list_all(config = nil)
|
20
|
+
# get lisrts from Config singletone
|
21
|
+
# puts " self.list_all: loading config "
|
22
|
+
config ||= Storazzo::RicDiskConfig.instance # # ).get_config
|
23
|
+
|
24
|
+
config.load # in case I need to load it for the first time
|
25
|
+
# puts config['Config']['AdditionalMountDirs']
|
26
|
+
# puts "TODO see config: #{config}"
|
27
|
+
# [42, 43]
|
28
|
+
# deb config.get_local_folders
|
29
|
+
# TODO
|
30
|
+
pverbose true,
|
31
|
+
"TODO(ricc): also add gsutil ls. For that please use the new 'list_all_with_type' (Id refactor it but Im afraid of leaving bad code dangling so before a proper refactor lets implement both side by side"
|
32
|
+
config.get_bucket_paths
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.list_all_with_type(config = nil)
|
36
|
+
config ||= Storazzo::RicDiskConfig.instance
|
37
|
+
config.load # in case I need to load it for the first time
|
38
|
+
deb "TODO(ricc): also add gsutil ls"
|
39
|
+
# getFromConfig
|
40
|
+
deb "I'm now returning a 'complex' array to tell the caller what kind of element they're getting, eg: GCS from Config Yaml, vs GCS from gsutil ls "
|
41
|
+
list_from_config_with_type = config.get_bucket_paths.map { |path| [:config_gcs_bucket, path] }
|
42
|
+
if (config.project_id)
|
43
|
+
# so I concatenate Apples with Bananas with names
|
44
|
+
return list_from_config_with_type + list_available_buckets(config.project_id).map { |path|
|
45
|
+
[:gsutil_ls_gcs_bucket, path]
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
return list_from_config_with_type
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.list_available_buckets(project_id, opts = {})
|
53
|
+
list_of_buckets = `gsutil ls --project '#{project_id}'`.chomp.split("\n")
|
54
|
+
deb "list_of_buckets: #{list_of_buckets}"
|
55
|
+
list_of_buckets
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -1,51 +1,48 @@
|
|
1
|
-
#require "storazzo/ric_disk/abstract_ric_disk"
|
2
|
-
#require "abstract_ric_disk"
|
1
|
+
# require "storazzo/ric_disk/abstract_ric_disk"
|
2
|
+
# require "abstract_ric_disk"
|
3
3
|
|
4
4
|
module Storazzo::Media
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def initialize(local_mount)
|
10
|
-
puts "[Storazzo::Media::LocalFolder] initialize"
|
11
|
-
|
12
|
-
@local_mountpoint = File.expand_path(local_mount)
|
13
|
-
raise "Sorry local mount doesnt exist!" unless File.exist?(@local_mountpoint)
|
14
|
-
@wr = File.writable?(stats_filename_default_fullpath) # .writeable? stats_file_smart_fullpath
|
15
|
-
|
16
|
-
#super.initialize(local_mount) rescue "SUPER_ERROR: #{$!}"
|
17
|
-
super(local_mount) rescue "SUPER_ERROR: #{$!}"
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.list_all
|
21
|
-
# get lisrts from Config singletone
|
22
|
-
#puts " self.list_all: loading config "
|
23
|
-
config = Storazzo::RicDiskConfig.instance # # ).get_config
|
24
|
-
#puts config['Config']['AdditionalMountDirs']
|
25
|
-
#puts "TODO see config: #{config}"
|
26
|
-
#[42, 43]
|
27
|
-
#deb config.get_local_folders
|
28
|
-
config.get_local_folders
|
29
|
-
end
|
30
|
-
|
31
|
-
def parse(opts={})
|
32
|
-
puts "LF.parse(#{opts}): TODO Sbrodola inside the dir: #{local_mountpoint}"
|
33
|
-
parse_block_storage_folder()
|
34
|
-
end
|
35
|
-
|
36
|
-
def path
|
37
|
-
@local_mountpoint
|
38
|
-
end
|
39
|
-
|
40
|
-
def writeable?
|
41
|
-
File.writable?(@local_mountpoint)
|
42
|
-
end
|
43
|
-
|
44
|
-
def default_stats_filename
|
45
|
-
#'42'
|
46
|
-
Storazzo::RicDiskStatsFile.default_name
|
47
|
-
end
|
5
|
+
class Storazzo::Media::LocalFolder < Storazzo::Media::AbstractRicDisk
|
6
|
+
# extend Storazzo::Common
|
7
|
+
include Storazzo::Common
|
48
8
|
|
9
|
+
attr_accessor :local_mountpoint, :wr
|
10
|
+
|
11
|
+
def initialize(local_mount)
|
12
|
+
deb "[Storazzo::Media::LocalFolder] initialize"
|
13
|
+
|
14
|
+
@local_mountpoint = File.expand_path(local_mount)
|
15
|
+
@description = "Local Folder originally in '#{local_mount}'"
|
16
|
+
raise "Sorry local mount doesnt exist!" unless File.exist?(@local_mountpoint)
|
17
|
+
|
18
|
+
@wr = writeable? # File.writable?(stats_filename_default_fullpath) # .writeable? stats_file_smart_fullpath
|
19
|
+
# super.initialize(local_mount) rescue "SUPER_ERROR: #{$!}"
|
20
|
+
super(local_mount) rescue "SUPER_ERROR(#{local_mount}): #{$!}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.list_all(config = nil)
|
24
|
+
# get lists from Config singleton
|
25
|
+
config ||= Storazzo::RicDiskConfig.instance # # ).get_config
|
26
|
+
config.load
|
27
|
+
config.get_local_folders
|
28
|
+
end
|
29
|
+
|
30
|
+
def parse(opts = {})
|
31
|
+
puts "LF.parse(#{opts}): TODO Sbrodola inside the dir: #{local_mountpoint}"
|
32
|
+
parse_block_storage_folder()
|
33
|
+
end
|
34
|
+
|
35
|
+
def path
|
36
|
+
@local_mountpoint
|
49
37
|
end
|
50
38
|
|
51
|
-
|
39
|
+
def writeable?
|
40
|
+
File.writable?(@local_mountpoint)
|
41
|
+
end
|
42
|
+
|
43
|
+
def default_stats_filename
|
44
|
+
# '42'
|
45
|
+
Storazzo::RicDiskStatsFile.default_name
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -1,5 +1,15 @@
|
|
1
1
|
# TODO
|
2
|
+
module Storazzo::Media
|
3
|
+
class Storazzo::Media::MountPoint < Storazzo::Media::AbstractRicDisk
|
4
|
+
# puts "[REMOVEME] Storazzo::Media::MountPoint being read. REMOVEME when you see this :)"
|
5
|
+
|
6
|
+
def self.list_local_mount_points()
|
7
|
+
deb "Maybe its abuot time you refactor that method here :)"
|
8
|
+
RicDisk.interesting_mount_points()
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
2
12
|
|
3
13
|
# def writeable?
|
4
|
-
#File.writable?(@local_mountpoint)
|
5
|
-
#end
|
14
|
+
# File.writable?(@local_mountpoint)
|
15
|
+
# end
|