plntr-fakes3 1.0.0.pre.9test9 → 1.0.0.pre.10
Sign up to get free protection for your applications and to get access to all the features.
- 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
|