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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0d7d7534e1cb3a29382c746a57c385dcf4c2562398fc9f48ed3080ad1edcf09b
4
- data.tar.gz: a1a7eed1674f3b1bc8723ec12d03cc3571f92f0f878c8ab33255aa6bbedd6355
3
+ metadata.gz: 6172bc1c1a9d1f643197e35dbfeb6e8b943a27a2c6e18cf6c53d1b48f6b7428d
4
+ data.tar.gz: cc4c2ee5640e9f2b4e0f1af47b6b46a7cddb441dd562e6a4c8f7ec2e8dfcedb8
5
5
  SHA512:
6
- metadata.gz: f40ab027de1f168e10219a4abe8d0b7b2318236f4ea3374f96e85f69edc89ca9d002d6ff9c24caa156220ea8b509c91d59d729398ebeb2115908a9762e3c7b5e
7
- data.tar.gz: eb3f2a7b1ec661e48d00002a9a39b724833a0b589af75474676d6b3267c511d11126dc7c2ac2e3ad4a470d9f9703980ac7245a99c33d99582ea0183424707c12
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 .
@@ -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,request)
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,s_req.webrick_request)
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
- warn "----------Dump Request-------------"
535
- warn request.request_method
536
- warn request.path
570
+ puts "----------Dump Request-------------"
571
+ puts request.request_method
572
+ puts request.path
537
573
  request.each do |k,v|
538
- warn "#{k}:#{v}"
574
+ puts "#{k}:#{v}"
539
575
  end
540
- warn "----------End Dump -------------"
576
+ puts "----------End Dump -------------"
541
577
  end
542
578
  end
543
579
 
@@ -1,3 +1,3 @@
1
1
  module FakeS3
2
- VERSION = "1.0.0-9test9"
2
+ VERSION = "1.0.0-10"
3
3
  end
@@ -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.9test9
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-22 00:00:00.000000000 Z
11
+ date: 2020-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler