plntr-fakes3 1.0.0.pre.9test9 → 1.0.0.pre.10
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/Makefile +32 -1
- data/lib/fakes3/file_store.rb +1 -15
- data/lib/fakes3/server.rb +51 -15
- data/lib/fakes3/version.rb +1 -1
- data/lib/fakes3/xml_adapter.rb +32 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6172bc1c1a9d1f643197e35dbfeb6e8b943a27a2c6e18cf6c53d1b48f6b7428d
|
4
|
+
data.tar.gz: cc4c2ee5640e9f2b4e0f1af47b6b46a7cddb441dd562e6a4c8f7ec2e8dfcedb8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac49b2d42151ee6105daf77b6e45d8a7113bce6bdb13f598411da3262bae7204d1ab950c89dedc0a16056781b6291ce4e08b86211ce4b8f8c42a6392ef0a4070
|
7
|
+
data.tar.gz: 51f4d295844bdb3a8ad81f4a0c7b1042bdc3746711ab0329fa54c7f7b83893de0adfa434220307b37cfef6bceb5bd057a1dff8e738282171a4e05988b95b4574
|
data/Makefile
CHANGED
@@ -1,4 +1,35 @@
|
|
1
|
-
.PHONY: test
|
1
|
+
.PHONY: build-run-docker test
|
2
|
+
|
3
|
+
build-run-docker:
|
4
|
+
gem build ./fakes3.gemspec | tee gem-build.txt
|
5
|
+
gem push $$(grep '^ File: ' gem-build.txt | sed 's@^ File: @@')
|
6
|
+
echo "Waiting for gem to appear in the repo" && \
|
7
|
+
v=$$(grep '^ File: ' gem-build.txt | sed -e 's@^ File: plntr-fakes3-@@' -e 's@\.gem$$@@') && \
|
8
|
+
until gem list plntr-fakes3 -r --prerelease | grep -q -w $${v}; do \
|
9
|
+
echo -n '.'; \
|
10
|
+
sleep 3; \
|
11
|
+
done && \
|
12
|
+
echo
|
13
|
+
v=$$(grep '^ File: ' gem-build.txt | sed -e 's@^ File: plntr-fakes3-@@' -e 's@\.gem$$@@') && \
|
14
|
+
sed -i "s/^PLNTR_FAKES3_VERSION=.*/PLNTR_FAKES3_VERSION=$${v}/" \
|
15
|
+
~/dev/docker-image-fakes3/Makefile
|
16
|
+
make -C ~/dev/docker-image-fakes3/ || make -C ~/dev/docker-image-fakes3/
|
17
|
+
docker rm -f fakes3 || true
|
18
|
+
docker run -ti --rm \
|
19
|
+
--name fakes3 \
|
20
|
+
-e HOSTNAME=b2d \
|
21
|
+
-p 4567:4567 \
|
22
|
+
-v /tmp/s3:/s3 \
|
23
|
+
planitar/fakes3
|
24
|
+
|
25
|
+
run-docker:
|
26
|
+
make -C ~/dev/docker-image-fakes3/
|
27
|
+
docker rm -f fakes3 || true
|
28
|
+
docker run -ti --rm \
|
29
|
+
-e HOSTNAME=b2d \
|
30
|
+
-p 4567:4567 \
|
31
|
+
-v /tmp/s3:/s3 \
|
32
|
+
planitar/fakes3
|
2
33
|
|
3
34
|
build-test-container:
|
4
35
|
docker build -t fake-s3 .
|
data/lib/fakes3/file_store.rb
CHANGED
@@ -79,13 +79,8 @@ module FakeS3
|
|
79
79
|
|
80
80
|
def get_object(bucket, object_name, request)
|
81
81
|
begin
|
82
|
-
warn "get_object:"
|
83
|
-
warn ". root: '#{@root}'"
|
84
|
-
warn ". bucket: '#{bucket}'"
|
85
|
-
warn ". path: '#{object_name}'"
|
86
82
|
real_obj = S3Object.new
|
87
83
|
obj_root = File.join(@root,bucket,object_name,FAKE_S3_METADATA_DIR)
|
88
|
-
warn ". metadata: '#{File.join(obj_root, "metadata")}'"
|
89
84
|
metadata = File.open(File.join(obj_root, "metadata")) { |file| YAML::load(file) }
|
90
85
|
real_obj.name = object_name
|
91
86
|
real_obj.md5 = metadata[:md5]
|
@@ -111,17 +106,8 @@ module FakeS3
|
|
111
106
|
|
112
107
|
def copy_object(src_bucket_name, src_name, dst_bucket_name, dst_name, request)
|
113
108
|
begin
|
114
|
-
warn "copy_object:"
|
115
|
-
warn ". root: '#{@root}'"
|
116
|
-
warn ". dst bucket: '#{dst_bucket_name}'"
|
117
|
-
warn ". dst path: '#{dst_name}'"
|
118
|
-
warn ". src bucket: '#{src_bucket_name}'"
|
119
|
-
warn ". src path: '#{src_name}'"
|
120
109
|
src_root = File.join(@root,src_bucket_name,src_name,FAKE_S3_METADATA_DIR)
|
121
110
|
src_metadata_filename = File.join(src_root, "metadata")
|
122
|
-
warn ". src metadata: '#{src_metadata_filename}'"
|
123
|
-
warn ""
|
124
|
-
# src_metadata = YAML.load(File.open(src_metadata_filename, 'rb').read)
|
125
111
|
src_metadata = File.open(src_metadata_filename) { |file| YAML::load(file) }
|
126
112
|
src_content_filename = File.join(src_root, "content")
|
127
113
|
|
@@ -266,7 +252,7 @@ module FakeS3
|
|
266
252
|
object
|
267
253
|
end
|
268
254
|
|
269
|
-
def delete_object(bucket,object_name
|
255
|
+
def delete_object(bucket,object_name)
|
270
256
|
begin
|
271
257
|
filename = File.join(@root,bucket.name,object_name)
|
272
258
|
FileUtils.rm_rf(filename)
|
data/lib/fakes3/server.rb
CHANGED
@@ -25,6 +25,7 @@ module FakeS3
|
|
25
25
|
SET_ACL = "SET_ACL"
|
26
26
|
MOVE = "MOVE"
|
27
27
|
DELETE_OBJECT = "DELETE_OBJECT"
|
28
|
+
DELETE_OBJECTS = "DELETE_OBJECTS"
|
28
29
|
DELETE_BUCKET = "DELETE_BUCKET"
|
29
30
|
|
30
31
|
attr_accessor :bucket, :object, :type, :src_bucket,
|
@@ -62,8 +63,6 @@ module FakeS3
|
|
62
63
|
end
|
63
64
|
|
64
65
|
def do_GET(request, response)
|
65
|
-
warn "= do_GET"
|
66
|
-
dump_request request
|
67
66
|
s_req = normalize_request(request)
|
68
67
|
|
69
68
|
case s_req.type
|
@@ -173,8 +172,6 @@ module FakeS3
|
|
173
172
|
end
|
174
173
|
|
175
174
|
def do_PUT(request, response)
|
176
|
-
warn "= do_PUT"
|
177
|
-
dump_request request
|
178
175
|
s_req = normalize_request(request)
|
179
176
|
query = CGI::parse(request.request_uri.query || "")
|
180
177
|
|
@@ -249,6 +246,10 @@ module FakeS3
|
|
249
246
|
end
|
250
247
|
|
251
248
|
def do_POST(request,response)
|
249
|
+
if request.request_line =~ /\?delete\b/
|
250
|
+
return do_DELETE(request, response)
|
251
|
+
end
|
252
|
+
|
252
253
|
s_req = normalize_request(request)
|
253
254
|
key = request.query['key']
|
254
255
|
query = CGI::parse(request.request_uri.query || "")
|
@@ -325,13 +326,32 @@ module FakeS3
|
|
325
326
|
case s_req.type
|
326
327
|
when Request::DELETE_OBJECT
|
327
328
|
bucket_obj = @store.get_bucket(s_req.bucket)
|
328
|
-
@store.delete_object(bucket_obj,s_req.object
|
329
|
+
@store.delete_object(bucket_obj,s_req.object)
|
330
|
+
response.status = 204
|
331
|
+
response.body = ""
|
329
332
|
when Request::DELETE_BUCKET
|
330
333
|
@store.delete_bucket(s_req.bucket)
|
334
|
+
response.status = 204
|
335
|
+
response.body = ""
|
336
|
+
when Request::DELETE_OBJECTS
|
337
|
+
objects = parse_delete_objects s_req.webrick_request
|
338
|
+
bucket_obj = @store.get_bucket(s_req.bucket)
|
339
|
+
results = objects.collect do |obj|
|
340
|
+
if not obj[:version_id].nil?
|
341
|
+
{
|
342
|
+
key: obj[:key],
|
343
|
+
code: 'XXX_Unimplmented_XXX',
|
344
|
+
message: 'Deletion of object verions is not implemented',
|
345
|
+
}
|
346
|
+
else
|
347
|
+
@store.delete_object(bucket_obj, obj[:key])
|
348
|
+
{ key: obj[:key] }
|
349
|
+
end
|
350
|
+
end
|
351
|
+
response.status = 200
|
352
|
+
response.body = XmlAdapter.delete_objects_result(results)
|
331
353
|
end
|
332
354
|
|
333
|
-
response.status = 204
|
334
|
-
response.body = ""
|
335
355
|
end
|
336
356
|
|
337
357
|
def do_OPTIONS(request, response)
|
@@ -476,6 +496,10 @@ module FakeS3
|
|
476
496
|
else
|
477
497
|
s_req.object = path[1..-1]
|
478
498
|
end
|
499
|
+
|
500
|
+
if webrick_req.request_line =~ /\?delete\b/
|
501
|
+
s_req.type = Request::DELETE_OBJECTS
|
502
|
+
end
|
479
503
|
end
|
480
504
|
|
481
505
|
# This method takes a webrick request and generates a normalized FakeS3 request
|
@@ -486,13 +510,10 @@ module FakeS3
|
|
486
510
|
s_req = Request.new
|
487
511
|
s_req.path = webrick_req.path
|
488
512
|
s_req.is_path_style = true
|
489
|
-
warn "normalize_request: host='#{host}' path='#{s_req.path}' is_path_style=T"
|
490
513
|
|
491
|
-
warn " : root-hostnames='#{@root_hostnames}'"
|
492
514
|
if !@root_hostnames.include?(host) && !(IPAddr.new(host) rescue nil)
|
493
515
|
s_req.bucket = host.split(".")[0]
|
494
516
|
s_req.is_path_style = false
|
495
|
-
warn " : bucket='#{s_req.bucket}' is_path_style=F"
|
496
517
|
end
|
497
518
|
|
498
519
|
s_req.http_verb = webrick_req.request_method
|
@@ -530,14 +551,29 @@ module FakeS3
|
|
530
551
|
end
|
531
552
|
end
|
532
553
|
|
554
|
+
def parse_delete_objects(request)
|
555
|
+
objects_xml = ""
|
556
|
+
request.body { |chunk| objects_xml << chunk }
|
557
|
+
|
558
|
+
# TODO: improve parsing xml
|
559
|
+
objects_xml = objects_xml.scan(/<Object>.*?<\/Object>/)
|
560
|
+
|
561
|
+
objects_xml.collect do |obj|
|
562
|
+
{
|
563
|
+
key: obj[/<Key>(.+)<\/Key>/, 1],
|
564
|
+
version_id: obj[/<VersionId>(.+)<\/VersionId>/, 1]
|
565
|
+
}
|
566
|
+
end
|
567
|
+
end
|
568
|
+
|
533
569
|
def dump_request(request)
|
534
|
-
|
535
|
-
|
536
|
-
|
570
|
+
puts "----------Dump Request-------------"
|
571
|
+
puts request.request_method
|
572
|
+
puts request.path
|
537
573
|
request.each do |k,v|
|
538
|
-
|
574
|
+
puts "#{k}:#{v}"
|
539
575
|
end
|
540
|
-
|
576
|
+
puts "----------End Dump -------------"
|
541
577
|
end
|
542
578
|
end
|
543
579
|
|
data/lib/fakes3/version.rb
CHANGED
data/lib/fakes3/xml_adapter.rb
CHANGED
@@ -218,5 +218,37 @@ module FakeS3
|
|
218
218
|
}
|
219
219
|
output
|
220
220
|
end
|
221
|
+
|
222
|
+
# <DeleteResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
|
223
|
+
# <Deleted>
|
224
|
+
# <Key>sample1.txt</Key>
|
225
|
+
# </Deleted>
|
226
|
+
# <Error>
|
227
|
+
# <Key>sample2.txt</Key>
|
228
|
+
# <Code>AccessDenied</Code>
|
229
|
+
# <Message>Access Denied</Message>
|
230
|
+
# </Error>
|
231
|
+
# </DeleteResult>
|
232
|
+
def self.delete_objects_result(result_objects)
|
233
|
+
output = ""
|
234
|
+
xml = Builder::XmlMarkup.new(:target => output)
|
235
|
+
xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
|
236
|
+
xml.DeleteResult(:xmlns => "http://s3.amazonaws.com/doc/2006-03-01/") { |result|
|
237
|
+
result_objects.each do |res|
|
238
|
+
if not res[:code].nil?
|
239
|
+
result.Error { |error|
|
240
|
+
error.Key(res[:key])
|
241
|
+
error.Code(res[:code])
|
242
|
+
error.Message(res[:message])
|
243
|
+
}
|
244
|
+
else
|
245
|
+
result.Deleted { |deleted|
|
246
|
+
deleted.Key(res[:key])
|
247
|
+
}
|
248
|
+
end
|
249
|
+
end
|
250
|
+
}
|
251
|
+
output
|
252
|
+
end
|
221
253
|
end
|
222
254
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plntr-fakes3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.pre.
|
4
|
+
version: 1.0.0.pre.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Curtis Spencer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-01-
|
11
|
+
date: 2020-01-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|