uricp 0.0.15 → 0.0.16

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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/Gemfile.lock +1 -8
  4. data/Jenkinsfile +27 -0
  5. data/Rakefile +19 -36
  6. data/bionic/Dockerfile +2 -2
  7. data/centos7/Dockerfile +2 -2
  8. data/features/step_definitions/orbit_steps.rb +11 -4
  9. data/lib/segment_upload.rb +20 -22
  10. data/lib/uricp.rb +3 -3
  11. data/lib/uricp/curl_primitives.rb +31 -33
  12. data/lib/uricp/orbit_auth.rb +23 -27
  13. data/lib/uricp/segmenter.rb +12 -16
  14. data/lib/uricp/strategy/cache_common.rb +11 -11
  15. data/lib/uricp/strategy/cached_get.rb +14 -20
  16. data/lib/uricp/strategy/cleaner.rb +2 -8
  17. data/lib/uricp/strategy/common.rb +25 -18
  18. data/lib/uricp/strategy/local_convert.rb +9 -16
  19. data/lib/uricp/strategy/local_link.rb +10 -8
  20. data/lib/uricp/strategy/piped_cache.rb +7 -13
  21. data/lib/uricp/strategy/piped_cache_convert.rb +14 -18
  22. data/lib/uricp/strategy/piped_compress.rb +3 -8
  23. data/lib/uricp/strategy/piped_decompress.rb +7 -11
  24. data/lib/uricp/strategy/piped_local_compress.rb +0 -4
  25. data/lib/uricp/strategy/piped_local_decompress.rb +10 -16
  26. data/lib/uricp/strategy/piped_local_get.rb +0 -5
  27. data/lib/uricp/strategy/piped_local_put.rb +3 -9
  28. data/lib/uricp/strategy/piped_rbd_get.rb +44 -0
  29. data/lib/uricp/strategy/piped_remote_get.rb +20 -20
  30. data/lib/uricp/strategy/rbd_remote_put.rb +36 -0
  31. data/lib/uricp/strategy/rbd_sweeper.rb +22 -0
  32. data/lib/uricp/strategy/remote_put.rb +11 -17
  33. data/lib/uricp/strategy/segmented_remote_put.rb +16 -28
  34. data/lib/uricp/strategy/sweeper.rb +2 -8
  35. data/lib/uricp/uri_strategy.rb +14 -13
  36. data/lib/uricp/version.rb +2 -2
  37. data/trusty/Dockerfile +2 -2
  38. data/uricp.gemspec +0 -1
  39. data/xenial/Dockerfile +2 -2
  40. metadata +7 -20
  41. data/spec/something_spec.rb +0 -5
@@ -1,30 +1,25 @@
1
1
  module Uricp::Strategy
2
-
3
2
  class PipedCompress
4
-
5
3
  include Uricp::Strategy::Common
6
4
 
7
-
8
5
  def appropriate?
9
6
  case from.scheme
10
7
  when 'pipe'
11
- return proposal if compression_required?
8
+ return proposal if compression_required?
12
9
  end
13
10
  debug "#{self.class.name}: not appropriate"
14
11
  false
15
12
  end
16
13
 
17
14
  def command
18
- "lz4 |"
15
+ 'lz4 |'
19
16
  end
20
17
 
21
18
  def proposal
22
19
  @proposed_options = options.dup
23
20
  @proposed_options.delete('compress')
24
- @proposed_options['encoding']='lz4'
21
+ @proposed_options['encoding'] = 'lz4'
25
22
  self
26
23
  end
27
-
28
24
  end
29
-
30
25
  end
@@ -1,35 +1,31 @@
1
1
  module Uricp::Strategy
2
-
3
2
  class PipedDecompress
4
-
5
3
  include Uricp::Strategy::Common
6
4
 
7
5
  def appropriate?
8
6
  case from.scheme
9
7
  when 'pipe'
10
- return proposal if lz4_source?
8
+ return proposal if lz4_source?
11
9
  end
12
10
  debug "#{self.class.name}: not appropriate"
13
11
  false
14
12
  end
15
13
 
16
14
  def command
17
- "lz4 -d |"
15
+ 'lz4 -d |'
18
16
  end
19
17
 
20
18
  def proposal
21
19
  @proposed_options = options.dup
22
20
  @proposed_options.delete('source-format')
23
21
  if @proposed_options['target-format']
24
- @proposed_options['source-format'] = :raw
25
- if @proposed_options['source-format'] == @proposed_options['target-format']
26
- @proposed_options.delete('source-format')
27
- @proposed_options.delete('target-format')
28
- end
22
+ @proposed_options['source-format'] = :raw
23
+ if @proposed_options['source-format'] == @proposed_options['target-format']
24
+ @proposed_options.delete('source-format')
25
+ @proposed_options.delete('target-format')
26
+ end
29
27
  end
30
28
  self
31
29
  end
32
-
33
30
  end
34
-
35
31
  end
@@ -1,7 +1,5 @@
1
1
  module Uricp::Strategy
2
-
3
2
  class PipedLocalCompress
4
-
5
3
  include Uricp::Strategy::Common
6
4
 
7
5
  def appropriate?
@@ -24,7 +22,5 @@ module Uricp::Strategy
24
22
  @proposed_options['from_uri'] = PIPE_URI
25
23
  self
26
24
  end
27
-
28
25
  end
29
-
30
26
  end
@@ -1,19 +1,15 @@
1
1
  module Uricp::Strategy
2
-
3
2
  class PipedLocalDecompress
4
-
5
3
  include Uricp::Strategy::Common
6
4
 
7
5
  def appropriate?
8
6
  case from.scheme
9
7
  when 'pipe'
10
- if raw_target? && lz4_source? && to.scheme == 'file'
11
- if always_write_sparse?
12
- return proposal
13
- else
14
- debug "#{self.class.name}: using safe sparse expansion via stream"
15
- end
16
- end
8
+ if raw_target? && lz4_source? && to.scheme == 'file'
9
+ return proposal if always_write_sparse?
10
+
11
+ debug "#{self.class.name}: using safe sparse expansion via stream"
12
+ end
17
13
  end
18
14
  debug "#{self.class.name}: not appropriate"
19
15
  false
@@ -27,16 +23,14 @@ module Uricp::Strategy
27
23
  @proposed_options = options.dup
28
24
  @proposed_options.delete('source-format')
29
25
  if @proposed_options['target-format']
30
- @proposed_options['source-format'] = :raw
31
- if @proposed_options['source-format'] == @proposed_options['target-format']
32
- @proposed_options.delete('source-format')
33
- @proposed_options.delete('target-format')
34
- end
26
+ @proposed_options['source-format'] = :raw
27
+ if @proposed_options['source-format'] == @proposed_options['target-format']
28
+ @proposed_options.delete('source-format')
29
+ @proposed_options.delete('target-format')
30
+ end
35
31
  end
36
32
  @proposed_options['from_uri'] = @proposed_options['to_uri']
37
33
  self
38
34
  end
39
-
40
35
  end
41
-
42
36
  end
@@ -1,7 +1,5 @@
1
1
  module Uricp::Strategy
2
-
3
2
  class PipedLocalGet
4
-
5
3
  include Uricp::Strategy::Common
6
4
 
7
5
  def appropriate?
@@ -22,8 +20,5 @@ module Uricp::Strategy
22
20
  @proposed_options['from_uri'] = PIPE_URI
23
21
  self
24
22
  end
25
-
26
23
  end
27
-
28
24
  end
29
-
@@ -1,14 +1,11 @@
1
1
  module Uricp::Strategy
2
-
3
2
  class PipedLocalPut
4
-
5
3
  include Uricp::Strategy::Common
6
4
 
7
5
  def appropriate?
8
- case from.scheme
9
- when 'pipe'
10
- return proposal if to.scheme == 'file'
11
- end
6
+ return proposal if to.scheme == 'file' &&
7
+ from.scheme == 'pipe'
8
+
12
9
  debug "#{self.class.name}: not appropriate"
13
10
  false
14
11
  end
@@ -22,8 +19,5 @@ module Uricp::Strategy
22
19
  @proposed_options['from_uri'] = @proposed_options['to_uri']
23
20
  self
24
21
  end
25
-
26
22
  end
27
-
28
23
  end
29
-
@@ -0,0 +1,44 @@
1
+ require 'json'
2
+ module Uricp::Strategy
3
+ class PipedRbdGet
4
+ include Uricp::Strategy::Common
5
+ include Methadone::SH
6
+
7
+ def appropriate?
8
+ case from.scheme
9
+ when 'rbd'
10
+ return proposal unless sequence_complete? || snap_in_progress?
11
+ end
12
+ debug "#{self.class.name}: not appropriate"
13
+ false
14
+ end
15
+
16
+ def command
17
+ "rbd snap create --id #{rbd_id} '#{rbd_snap_target(from)}' && " \
18
+ "rbd export --no-progress --id #{rbd_id} '#{rbd_snap_target(from)}' - |"
19
+ end
20
+
21
+ def proposal
22
+ @proposed_options = options.dup
23
+ @proposed_options['rbd_snapshot'] = rbd_snap_target(from)
24
+ @proposed_options['from_uri'] = PIPE_URI
25
+ @proposed_options.delete('cache')
26
+ @proposed_options.delete('cache_name')
27
+ self
28
+ end
29
+
30
+ RBD_SNAPSHOT = 'uricp_snap'.freeze
31
+
32
+ def rbd_snap_target(uri)
33
+ "#{rbd_target(uri)}@#{RBD_SNAPSHOT}"
34
+ end
35
+
36
+ def snap_in_progress?
37
+ return false if dry_run?
38
+
39
+ sh "rbd snap ls --id #{rbd_id} --format json #{rbd_target(from)}" do |stdout|
40
+ JSON.parse(stdout).any? { |x| x['name'] == RBD_SNAPSHOT }
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,8 +1,6 @@
1
1
  require 'open-uri'
2
2
  module Uricp::Strategy
3
-
4
3
  class PipedRemoteGet
5
-
6
4
  include Uricp::Strategy::Common
7
5
 
8
6
  def appropriate?
@@ -10,33 +8,35 @@ module Uricp::Strategy
10
8
  when 'http', 'https'
11
9
  return proposal unless sequence_complete?
12
10
  else
13
- debug "#{self.class.name}: not appropriate"
14
- false
11
+ debug "#{self.class.name}: not appropriate"
12
+ false
15
13
  end
16
14
  end
17
15
 
18
- alias :command :curl_download_to_pipe
16
+ alias command curl_download_to_pipe
19
17
 
20
18
  def proposal
21
19
  @proposed_options = options.dup
22
20
  @proposed_options['from_uri'] = PIPE_URI
23
21
  if conversion_required?
24
22
  @proposed_options['source-format'] = format_peek
25
- if @proposed_options['source-format'] == @proposed_options['target-format']
26
- @proposed_options.delete('source-format')
27
- @proposed_options.delete('target-format')
28
- end
23
+ if @proposed_options['source-format'] == @proposed_options['target-format']
24
+ @proposed_options.delete('source-format')
25
+ @proposed_options.delete('target-format')
26
+ end
29
27
  end
30
28
  if options['max-cache'] &&
31
- size_peek.to_i > options['max-cache'].to_i
32
- @proposed_options.delete('cache')
33
- @proposed_options.delete('cache_name')
34
- @proposed_options.delete('max-cache')
29
+ size_peek.to_i > options['max-cache'].to_i
30
+ @proposed_options.delete('cache')
31
+ @proposed_options.delete('cache_name')
32
+ @proposed_options.delete('max-cache')
35
33
  end
36
34
  self
37
35
  end
38
36
 
39
37
  def format_peek
38
+ return options['target-format'] || 'raw' if dry_run?
39
+
40
40
  options['from_uri'].open(headers) do |u|
41
41
  encoding(u)
42
42
  end
@@ -48,14 +48,16 @@ module Uricp::Strategy
48
48
  raise
49
49
  end
50
50
  rescue SocketError => e
51
- raise SocketError, options['from_uri'].to_s+" inaccessible: "+e.message
51
+ raise SocketError, options['from_uri'].to_s + ' inaccessible: ' + e.message
52
52
  end
53
53
 
54
54
  def size_peek
55
- size_headers=headers
55
+ return options['max-cache'] if dry_run?
56
+
57
+ size_headers = headers
56
58
  size_headers['Range'] = 'bytes=0-0'
57
59
  options['from_uri'].open(headers) do |u|
58
- match = %r<bytes\s+(\d+)-(\d+)/(\d+|\*)>i.match(u.meta['content-range'])
60
+ match = %r{bytes\s+(\d+)-(\d+)/(\d+|\*)}i.match(u.meta['content-range'])
59
61
  match && match[3].to_i
60
62
  end
61
63
  rescue OpenURI::HTTPError => e
@@ -66,15 +68,13 @@ module Uricp::Strategy
66
68
  raise
67
69
  end
68
70
  rescue SocketError => e
69
- raise SocketError, options['from_uri'].to_s+" inaccessible: "+e.message
71
+ raise SocketError, options['from_uri'].to_s + ' inaccessible: ' + e.message
70
72
  end
71
73
 
72
74
  def headers
73
- headers={'Range' => 'bytes=0-7'}
75
+ headers = { 'Range' => 'bytes=0-7' }
74
76
  headers['X-Auth-Token'] = options['authenticator'].call if http_authentication?
75
77
  headers
76
78
  end
77
-
78
79
  end
79
-
80
80
  end
@@ -0,0 +1,36 @@
1
+ module Uricp::Strategy
2
+ class RbdRemotePut
3
+ include Uricp::Strategy::Common
4
+
5
+ def appropriate?
6
+ if compression_required? || conversion_required?
7
+ debug "#{self.class.name}: not ready to upload"
8
+ return false
9
+ end
10
+ case from.scheme
11
+ when 'pipe', 'file'
12
+ return proposal if to.scheme == 'rbd'
13
+ end
14
+ debug "#{self.class.name}: not appropriate"
15
+ false
16
+ end
17
+
18
+ def command
19
+ "rbd import --no-progress --id #{rbd_id} #{data_source} '#{rbd_target(to)}';"
20
+ end
21
+
22
+ def proposal
23
+ @proposed_options = options.dup
24
+ @proposed_options['from_uri'] = to
25
+ self
26
+ end
27
+
28
+ def data_source
29
+ if from.scheme == 'pipe'
30
+ '-'
31
+ else
32
+ "'#{from.path}'"
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,22 @@
1
+ module Uricp::Strategy
2
+ class RbdSweeper
3
+ include Uricp::Strategy::Common
4
+
5
+ def appropriate?
6
+ return proposal if options['rbd_snapshot'] && sequence_complete?
7
+
8
+ debug "#{self.class.name}: not appropriate"
9
+ false
10
+ end
11
+
12
+ def command
13
+ "rbd snap rm --id #{rbd_id} '#{options['rbd_snapshot']}';"
14
+ end
15
+
16
+ def proposal
17
+ @proposed_options = options.dup
18
+ @proposed_options.delete('rbd_snapshot')
19
+ self
20
+ end
21
+ end
22
+ end
@@ -1,26 +1,22 @@
1
1
  module Uricp::Strategy
2
-
3
2
  class RemotePut
4
-
5
3
  include Uricp::Strategy::Common
6
4
 
7
5
  def appropriate?
8
6
  if compression_required? || conversion_required?
9
7
  debug "#{self.class.name}: not ready to upload"
10
- else
11
- case to.scheme
12
- when 'http', 'https'
13
- case from.scheme
14
- when 'file', 'pipe'
15
- if http_authentication?
16
- return proposal
17
- else
18
- unsupported_transfer
19
- end
20
- end
21
- end
22
- debug "#{self.class.name}: not appropriate"
8
+ return false
9
+ end
10
+ case to.scheme
11
+ when 'http', 'https'
12
+ case from.scheme
13
+ when 'file', 'pipe'
14
+ return proposal if http_authentication?
15
+
16
+ unsupported_transfer
17
+ end
23
18
  end
19
+ debug "#{self.class.name}: not appropriate"
24
20
  false
25
21
  end
26
22
 
@@ -41,7 +37,5 @@ module Uricp::Strategy
41
37
  from.path
42
38
  end
43
39
  end
44
-
45
40
  end
46
-
47
41
  end
@@ -1,35 +1,29 @@
1
1
  module Uricp::Strategy
2
-
3
2
  class SegmentedRemotePut
4
-
5
3
  include Uricp::Strategy::Common
6
4
 
7
5
  def appropriate?
8
- if segmented?
9
- if compression_required? || conversion_required?
10
- debug "#{self.class.name}: not ready to upload"
11
- else
12
- case to.scheme
13
- when 'http', 'https'
14
- case from.scheme
15
- when 'file', 'pipe'
16
- if http_authentication?
17
- return proposal
18
- else
19
- unsupported_transfer
20
- end
21
- end
22
- end
23
- debug "#{self.class.name}: not appropriate"
24
- end
25
- else
26
- debug "#{self.class.name}: no segmentation requested"
6
+ unless segmented?
7
+ debug "#{self.class.name}: not appropriate"
8
+ return false
9
+ end
10
+ if compression_required? || conversion_required?
11
+ debug "#{self.class.name}: not ready to upload"
12
+ return false
27
13
  end
14
+ case to.scheme
15
+ when 'http', 'https'
16
+ case from.scheme
17
+ when 'file', 'pipe'
18
+ return proposal if http_authentication?
19
+ end
20
+ end
21
+ unsupported_transfer
28
22
  false
29
23
  end
30
24
 
31
25
  def command
32
- "segment_upload --segment-size '#{options['segment-size']}' #{source_details} #{to.to_s};"
26
+ "segment_upload --segment-size '#{options['segment-size']}' #{source_details} #{to};"
33
27
  end
34
28
 
35
29
  def proposal
@@ -42,11 +36,5 @@ module Uricp::Strategy
42
36
  def source_details
43
37
  "--from #{from.path}" unless from.scheme == 'pipe'
44
38
  end
45
-
46
- def segmented?
47
- options['segment-size']
48
- end
49
-
50
39
  end
51
-
52
40
  end