ceph_storage 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/.cluster.yml.example +19 -0
  3. data/.gitignore +1 -0
  4. data/.rspec +2 -0
  5. data/Gemfile +2 -0
  6. data/Gemfile.lock +110 -0
  7. data/Guardfile +20 -0
  8. data/README.md +108 -0
  9. data/Rakefile +7 -0
  10. data/ceph_storage.gemspec +36 -0
  11. data/lib/ceph_storage.rb +28 -0
  12. data/lib/ceph_storage/cluster.rb +93 -0
  13. data/lib/ceph_storage/cluster_factory.rb +24 -0
  14. data/lib/ceph_storage/cluster_wrapper.rb +16 -0
  15. data/lib/ceph_storage/pool.rb +126 -0
  16. data/lib/ceph_storage/pool_enumerator.rb +24 -0
  17. data/lib/ceph_storage/pool_factory.rb +15 -0
  18. data/lib/ceph_storage/pool_wrapper.rb +17 -0
  19. data/lib/ceph_storage/storage_object.rb +48 -0
  20. data/lib/ceph_storage/storage_object/file_storage_object.rb +28 -0
  21. data/lib/ceph_storage/storage_object/rados_storage_object.rb +41 -0
  22. data/lib/ceph_storage/storage_object/rados_storage_object_enumerator.rb +29 -0
  23. data/lib/ceph_storage/storage_object/rados_wrapper.rb +21 -0
  24. data/lib/ceph_storage/storage_object/url_storage_object.rb +34 -0
  25. data/lib/ceph_storage/storage_object/xattr.rb +18 -0
  26. data/lib/ceph_storage/storage_object/xattr_enumerator.rb +29 -0
  27. data/lib/ceph_storage/version.rb +3 -0
  28. data/spec/ceph_storage_cluster_factory_spec.rb +14 -0
  29. data/spec/ceph_storage_cluster_spec.rb +76 -0
  30. data/spec/ceph_storage_file_storage_object_spec.rb +31 -0
  31. data/spec/ceph_storage_pool_enumerator.rb +34 -0
  32. data/spec/ceph_storage_pool_factory_spec.rb +14 -0
  33. data/spec/ceph_storage_pool_spec.rb +167 -0
  34. data/spec/ceph_storage_rados_storage_object_enumerator_spec.rb +72 -0
  35. data/spec/ceph_storage_rados_storage_object_spec.rb +112 -0
  36. data/spec/ceph_storage_storage_object_spec.rb +98 -0
  37. data/spec/ceph_storage_xattr_enumerator_spec.rb +75 -0
  38. data/spec/ceph_storage_xattr_spec.rb +69 -0
  39. data/spec/spec_helper.rb +30 -0
  40. data/tasks/rspec.rake +4 -0
  41. data/tasks/rubocop.rake +13 -0
  42. metadata +281 -0
@@ -0,0 +1,112 @@
1
+ require 'spec_helper'
2
+ require 'logger'
3
+ describe CephStorage::StorageObject::RadosStorageObject do
4
+ let(:config) { cluster_config }
5
+ let(:spconfig) { spec_config }
6
+ let(:cluster) { CephStorage::ClusterFactory.build config }
7
+ let(:rule_id) { spconfig[:pool][:rule_id] }
8
+ let(:pool_name) { spconfig[:pool][:name] }
9
+ let(:pool) { cluster.pool(pool_name) }
10
+
11
+ describe 'pool creation' do
12
+ subject { pool }
13
+ it 'should be able to create pool' do
14
+ expect { subject.create(rule_id: rule_id) }.to_not raise_exception
15
+ end
16
+
17
+ it 'should be writable' do
18
+ expect { pool.stat }.not_to raise_exception
19
+ expect(pool.stat).to be_a Hash
20
+ end
21
+ end
22
+
23
+ let(:object_name) { spconfig[:pool][:object_name] }
24
+ let(:storage_object) { pool.storage_object(object_name) }
25
+ subject { storage_object }
26
+
27
+ it 'should be a RadosStorageObject' do
28
+ expect(subject).to be_a ::CephStorage::StorageObject::RadosStorageObject
29
+ end
30
+
31
+ it 'should be a CephRuby::RadosObject' do
32
+ expect(subject).to be_a ::CephRuby::RadosObject
33
+ end
34
+
35
+ it 'should be a StorageObject' do
36
+ expect(subject).to be_a ::CephStorage::StorageObject
37
+ end
38
+
39
+ it 'should respond to write_file' do
40
+ expect(subject).to respond_to :write_file
41
+ end
42
+
43
+ it 'should respond to read_file' do
44
+ expect(subject).to respond_to :read_file
45
+ end
46
+
47
+ it 'should respond to path' do
48
+ expect(subject).to respond_to :path
49
+ end
50
+
51
+ describe 'write_file' do
52
+ it 'should not raise exception' do
53
+ expect do
54
+ subject.write_file('content string to be written')
55
+ end.not_to raise_exception
56
+ end
57
+ end
58
+
59
+ describe 'read_file' do
60
+ it 'should call ::CephRuby::RadosObject.read_full' do
61
+ expect(subject).to receive(:read_full)
62
+ subject.read_file
63
+ end
64
+
65
+ it 'should return the file contents' do
66
+ expect(subject.read_file).to eq('content string to be written')
67
+ end
68
+ end
69
+
70
+ describe 'path' do
71
+ let(:cluster_name) { config[:cluster] }
72
+ it 'should have a specific format' do
73
+ expect(subject.path).to eq(
74
+ "ceph://#{cluster_name}/#{pool_name}/#{object_name}"
75
+ )
76
+ end
77
+ end
78
+
79
+ describe 'parent methods should run with wrapper' do
80
+ let(:new_content) { 'asdkljasdkjlasdjkladasjkdakjdassjkladsjkladsjkladsjk' }
81
+ describe 'exists?' do
82
+ it 'should return true' do
83
+ expect(subject.exists?).to eq(true)
84
+ end
85
+ end
86
+
87
+ # Skip stat as it is covered by size/exists?
88
+
89
+ describe 'read/write' do
90
+ it 'should write different content to the file' do
91
+ expect { subject.write(0, new_content) }.not_to raise_exception
92
+ end
93
+
94
+ it 'should be readable' do
95
+ expect(subject.read(0, new_content.length)).to eq(new_content)
96
+ end
97
+ end
98
+
99
+ describe 'size' do
100
+ it 'should equal size of new_content' do
101
+ expect(subject.size).to eq(new_content.length)
102
+ end
103
+ end
104
+ end
105
+
106
+ describe 'pool deletion' do
107
+ subject { pool }
108
+ it 'should be able to delete pool' do
109
+ expect { subject.destroy }.not_to raise_exception
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,98 @@
1
+ require 'spec_helper'
2
+ # Dummy storage_Object to represent a file
3
+
4
+ class DummyXattr
5
+ attr_accessor :name
6
+ attr_accessor :value
7
+ def initialize(name)
8
+ self.name = name
9
+ end
10
+ end
11
+
12
+ class DummyXattrEnumerator
13
+ include ::Enumerable
14
+
15
+ attr_accessor :xattrs
16
+ def initialize
17
+ self.xattrs = []
18
+ 10.times do |i|
19
+ xattr = DummyXattr.new("key#{i}")
20
+ xattr.value = i
21
+ xattrs << xattr
22
+ end
23
+ end
24
+
25
+ def each
26
+ return enum_for(:each) unless block_given?
27
+
28
+ xattrs.each do |x|
29
+ yield x
30
+ end
31
+ end
32
+ end
33
+
34
+ class DummyStorage
35
+ extend CephStorage::StorageObject
36
+ include CephStorage::StorageObject
37
+
38
+ attr_accessor :contents
39
+
40
+ def write_file(contents)
41
+ self.contents = contents
42
+ end
43
+
44
+ def read_file
45
+ contents
46
+ end
47
+
48
+ def xattr(name)
49
+ DummyXattr.new(name)
50
+ end
51
+
52
+ def xattr_enumerator
53
+ puts 'call xattr_enumerator'
54
+ DummyXattrEnumerator.new
55
+ end
56
+
57
+ def destroy
58
+ self.contents = nil
59
+ end
60
+ end
61
+ describe CephStorage::StorageObject do
62
+ before do
63
+ @storage_object1 = DummyStorage.new
64
+ @storage_object2 = DummyStorage.new
65
+ end
66
+ subject { @storage_object1 }
67
+
68
+ it 'should respond to move' do
69
+ expect(subject).to respond_to :move
70
+ end
71
+
72
+ it 'should respond to copy' do
73
+ expect(subject).to respond_to :copy
74
+ end
75
+
76
+ it 'should respond to copy_xattrs' do
77
+ expect(subject).to respond_to :copy_xattrs
78
+ end
79
+
80
+ describe 'copying file' do
81
+ it 'should read from storage_object1 and write to storage_object2' do
82
+ expect(@storage_object1).to receive(:read_file)
83
+ expect(@storage_object2).to receive(:write_file)
84
+ expect(@storage_object1).to receive(:copy_xattrs)
85
+ @storage_object1.copy(@storage_object2)
86
+ end
87
+ end
88
+
89
+ describe 'moving file' do
90
+ it 'should read from object1, write object2, delete object1' do
91
+ expect(@storage_object1).to receive(:read_file)
92
+ expect(@storage_object2).to receive(:write_file)
93
+ expect(@storage_object1).to receive(:copy_xattrs)
94
+ expect(@storage_object1).to receive(:destroy)
95
+ @storage_object1.move(@storage_object2)
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+ require 'logger'
3
+ describe CephStorage::StorageObject::XattrEnumerator do
4
+ let(:config) { cluster_config }
5
+ let(:spconfig) { spec_config }
6
+ let(:cluster) { CephStorage::ClusterFactory.build config }
7
+ let(:rule_id) { spconfig[:pool][:rule_id] }
8
+ let(:pool_name) { spconfig[:pool][:name] }
9
+ let(:pool) { cluster.pool(pool_name) }
10
+
11
+ describe 'pool creation' do
12
+ subject { pool }
13
+ it 'should be able to create pool' do
14
+ expect { subject.create(rule_id: rule_id) }.to_not raise_exception
15
+ end
16
+
17
+ it 'should be writable' do
18
+ expect { pool.stat }.not_to raise_exception
19
+ expect(pool.stat).to be_a Hash
20
+ end
21
+ end
22
+
23
+ let(:object_name) { spconfig[:pool][:object_name] }
24
+ let(:storage_object) { pool.storage_object(object_name) }
25
+
26
+ describe 'Storage Object' do
27
+ subject { storage_object }
28
+
29
+ it 'should be writeable' do
30
+ expect { subject.overwrite('some content') }.not_to raise_exception
31
+ end
32
+ end
33
+
34
+ describe 'XattrEnumerator' do
35
+ let(:xattr_name) { spconfig[:pool][:xattr_name] }
36
+ let(:xattr_value) { spconfig[:pool][:xattr_value] }
37
+ let(:xattr_enumerator) { storage_object.xattr_enumerator }
38
+ subject { xattr_enumerator }
39
+
40
+ it 'should be a CephRuby::XattrEnumerator' do
41
+ expect(subject).to be_a ::CephStorage::StorageObject::XattrEnumerator
42
+ end
43
+
44
+ it 'should be a CephRuby::XattrEnumerator' do
45
+ expect(subject).to be_a ::CephRuby::XattrEnumerator
46
+ end
47
+
48
+ it 'should have 0 xattrs' do
49
+ expect(subject.inject(0) { |a, _e| a + 1 }).to be 0
50
+ end
51
+
52
+ describe 'after populating' do
53
+ before do
54
+ 10.times do |i|
55
+ storage_object.xattr("#{xattr_name}.#{i}").value = xattr_value
56
+ end
57
+ end
58
+
59
+ it 'should have 10 xattrs' do
60
+ expect(subject.inject(0) { |a, _e| a + 1 }).to be 10
61
+ end
62
+
63
+ it 'should return CephStorage::Xattrs' do
64
+ expect(subject.first).to be_a CephStorage::StorageObject::Xattr
65
+ end
66
+ end
67
+ end
68
+
69
+ describe 'pool deletion' do
70
+ subject { pool }
71
+ it 'should be able to delete pool' do
72
+ expect { subject.destroy }.not_to raise_exception
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+ require 'logger'
3
+ describe CephStorage::StorageObject::Xattr do
4
+ let(:config) { cluster_config }
5
+ let(:spconfig) { spec_config }
6
+ let(:cluster) { CephStorage::ClusterFactory.build config }
7
+ let(:rule_id) { spconfig[:pool][:rule_id] }
8
+ let(:pool_name) { spconfig[:pool][:name] }
9
+ let(:pool) { cluster.pool(pool_name) }
10
+
11
+ describe 'pool creation' do
12
+ subject { pool }
13
+ it 'should be able to create pool' do
14
+ expect { subject.create(rule_id: rule_id) }.to_not raise_exception
15
+ end
16
+
17
+ it 'should be writable' do
18
+ expect { pool.stat }.not_to raise_exception
19
+ expect(pool.stat).to be_a Hash
20
+ end
21
+ end
22
+
23
+ let(:object_name) { spconfig[:pool][:object_name] }
24
+ let(:storage_object) { pool.storage_object(object_name) }
25
+
26
+ describe 'Storage Object' do
27
+ subject { storage_object }
28
+
29
+ it 'should be writeable' do
30
+ expect { subject.overwrite('some content') }.not_to raise_exception
31
+ end
32
+ end
33
+
34
+ describe 'xattr' do
35
+ let(:xattr_name) { spconfig[:pool][:xattr_name] }
36
+ let(:xattr_value) { spconfig[:pool][:xattr_value] }
37
+ let(:xattr) { storage_object.xattr(xattr_name) }
38
+ subject { xattr }
39
+
40
+ it 'should be a StorageObject::Xattr' do
41
+ expect(subject).to be_a ::CephStorage::StorageObject::Xattr
42
+ end
43
+
44
+ it 'should be a CephRuby::Xattr' do
45
+ expect(subject).to be_a ::CephRuby::Xattr
46
+ end
47
+
48
+ describe 'before creation' do
49
+ it 'should not throw an exception on read' do
50
+ expect { subject.value }.to raise_exception Errno::ENODATA
51
+ end
52
+
53
+ it 'should be writable' do
54
+ expect { subject.value = xattr_value }.not_to raise_exception
55
+ end
56
+
57
+ it 'should match the new value' do
58
+ expect(subject.value).to eq(xattr_value)
59
+ end
60
+ end
61
+ end
62
+
63
+ describe 'pool deletion' do
64
+ subject { pool }
65
+ it 'should be able to delete pool' do
66
+ expect { subject.destroy }.not_to raise_exception
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,30 @@
1
+ require 'ceph_storage'
2
+ require 'yaml'
3
+
4
+ def spec_config
5
+ YAML.load(File.read('.cluster.yml')) if File.exist? '.cluster.yml'
6
+ end
7
+
8
+ def cluster_config
9
+ sp_config = spec_config
10
+ hash = {}
11
+ hash[:config_dir] = sp_config[:config_dir]
12
+ hash[:user] = sp_config[:user]
13
+ hash[:cluster] = sp_config[:cluster]
14
+ hash[:flags] = sp_config[:flags]
15
+ hash
16
+ end
17
+
18
+ RSpec.configure do |c|
19
+ config = spec_config
20
+ c.fail_fast = true
21
+ c.filter_run_excluding(
22
+ requires_cluster_readable: true
23
+ ) unless config[:readable]
24
+ c.filter_run_excluding(
25
+ requires_create_delete: true
26
+ ) unless config[:pool][:create_delete]
27
+ c.filter_run_excluting(
28
+ requires_create_delete: true
29
+ ) unless config[:pool][:create_delete]
30
+ end
@@ -0,0 +1,4 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ desc 'rspec tasks for spec directory'
4
+ RSpec::Core::RakeTask.new(:spec)
@@ -0,0 +1,13 @@
1
+ require 'rubocop/rake_task'
2
+
3
+ desc 'Rub RoboCop on the lib and spec directory'
4
+ RuboCop::RakeTask.new(:rubocop_dev) do |task|
5
+ task.patterns = ['lib/**/*.rb', 'spec/**/*.rb']
6
+ task.fail_on_error = false
7
+ end
8
+
9
+ RuboCop::RakeTask.new(:rubocop_test) do |task|
10
+ task.patterns = ['lib/**/*.rb', 'spec/**/*.rb']
11
+ task.formatters = ['files']
12
+ task.fail_on_error = true
13
+ end
metadata ADDED
@@ -0,0 +1,281 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ceph_storage
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Livelink Technology LTD
8
+ - Stuart Harland
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-05-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ffi
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.9'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '1.9'
28
+ - !ruby/object:Gem::Dependency
29
+ name: ceph-ruby-livelink
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.5'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.5'
42
+ - !ruby/object:Gem::Dependency
43
+ name: activesupport
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '3.0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: facets
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '3.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '3.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: guard
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '2.13'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '2.13'
84
+ - !ruby/object:Gem::Dependency
85
+ name: listen
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '='
89
+ - !ruby/object:Gem::Version
90
+ version: 3.0.6
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - '='
96
+ - !ruby/object:Gem::Version
97
+ version: 3.0.6
98
+ - !ruby/object:Gem::Dependency
99
+ name: guard-rake
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '1.0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '1.0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: guard-rspec
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '4.6'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '4.6'
126
+ - !ruby/object:Gem::Dependency
127
+ name: guard-bundler
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: '2.1'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '2.1'
140
+ - !ruby/object:Gem::Dependency
141
+ name: rubocop
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '0.39'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: '0.39'
154
+ - !ruby/object:Gem::Dependency
155
+ name: rspec
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: '3.4'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: '3.4'
168
+ - !ruby/object:Gem::Dependency
169
+ name: rake
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "~>"
173
+ - !ruby/object:Gem::Version
174
+ version: '11.1'
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "~>"
180
+ - !ruby/object:Gem::Version
181
+ version: '11.1'
182
+ - !ruby/object:Gem::Dependency
183
+ name: bundler
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - "~>"
187
+ - !ruby/object:Gem::Version
188
+ version: '1.3'
189
+ type: :development
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - "~>"
194
+ - !ruby/object:Gem::Version
195
+ version: '1.3'
196
+ description: Easy access of Objects in ceph
197
+ email:
198
+ - infraops@livelinktechnology.net
199
+ executables: []
200
+ extensions: []
201
+ extra_rdoc_files: []
202
+ files:
203
+ - ".cluster.yml.example"
204
+ - ".gitignore"
205
+ - ".rspec"
206
+ - Gemfile
207
+ - Gemfile.lock
208
+ - Guardfile
209
+ - README.md
210
+ - Rakefile
211
+ - ceph_storage.gemspec
212
+ - lib/ceph_storage.rb
213
+ - lib/ceph_storage/cluster.rb
214
+ - lib/ceph_storage/cluster_factory.rb
215
+ - lib/ceph_storage/cluster_wrapper.rb
216
+ - lib/ceph_storage/pool.rb
217
+ - lib/ceph_storage/pool_enumerator.rb
218
+ - lib/ceph_storage/pool_factory.rb
219
+ - lib/ceph_storage/pool_wrapper.rb
220
+ - lib/ceph_storage/storage_object.rb
221
+ - lib/ceph_storage/storage_object/file_storage_object.rb
222
+ - lib/ceph_storage/storage_object/rados_storage_object.rb
223
+ - lib/ceph_storage/storage_object/rados_storage_object_enumerator.rb
224
+ - lib/ceph_storage/storage_object/rados_wrapper.rb
225
+ - lib/ceph_storage/storage_object/url_storage_object.rb
226
+ - lib/ceph_storage/storage_object/xattr.rb
227
+ - lib/ceph_storage/storage_object/xattr_enumerator.rb
228
+ - lib/ceph_storage/version.rb
229
+ - spec/ceph_storage_cluster_factory_spec.rb
230
+ - spec/ceph_storage_cluster_spec.rb
231
+ - spec/ceph_storage_file_storage_object_spec.rb
232
+ - spec/ceph_storage_pool_enumerator.rb
233
+ - spec/ceph_storage_pool_factory_spec.rb
234
+ - spec/ceph_storage_pool_spec.rb
235
+ - spec/ceph_storage_rados_storage_object_enumerator_spec.rb
236
+ - spec/ceph_storage_rados_storage_object_spec.rb
237
+ - spec/ceph_storage_storage_object_spec.rb
238
+ - spec/ceph_storage_xattr_enumerator_spec.rb
239
+ - spec/ceph_storage_xattr_spec.rb
240
+ - spec/spec_helper.rb
241
+ - tasks/rspec.rake
242
+ - tasks/rubocop.rake
243
+ homepage: https://github.com/livelink/ceph_storage
244
+ licenses:
245
+ - MIT
246
+ metadata: {}
247
+ post_install_message:
248
+ rdoc_options: []
249
+ require_paths:
250
+ - lib
251
+ required_ruby_version: !ruby/object:Gem::Requirement
252
+ requirements:
253
+ - - ">="
254
+ - !ruby/object:Gem::Version
255
+ version: '0'
256
+ required_rubygems_version: !ruby/object:Gem::Requirement
257
+ requirements:
258
+ - - ">="
259
+ - !ruby/object:Gem::Version
260
+ version: '0'
261
+ requirements: []
262
+ rubyforge_project:
263
+ rubygems_version: 2.6.2
264
+ signing_key:
265
+ specification_version: 4
266
+ summary: Ceph-ruby provides an API, however this gem provides consistent connection
267
+ to ceph pools and clusters using multiton objects
268
+ test_files:
269
+ - spec/ceph_storage_cluster_factory_spec.rb
270
+ - spec/ceph_storage_cluster_spec.rb
271
+ - spec/ceph_storage_file_storage_object_spec.rb
272
+ - spec/ceph_storage_pool_enumerator.rb
273
+ - spec/ceph_storage_pool_factory_spec.rb
274
+ - spec/ceph_storage_pool_spec.rb
275
+ - spec/ceph_storage_rados_storage_object_enumerator_spec.rb
276
+ - spec/ceph_storage_rados_storage_object_spec.rb
277
+ - spec/ceph_storage_storage_object_spec.rb
278
+ - spec/ceph_storage_xattr_enumerator_spec.rb
279
+ - spec/ceph_storage_xattr_spec.rb
280
+ - spec/spec_helper.rb
281
+ has_rdoc: