gitlab-fog-azure-rm 0.7.0 → 1.0.1

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 (30) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +0 -1
  3. data/CHANGELOG.md +38 -0
  4. data/gitlab-fog-azure-rm.gemspec +3 -2
  5. data/lib/fog/azurerm/models/storage/file.rb +1 -6
  6. data/lib/fog/azurerm/requests/storage/create_block_blob.rb +3 -31
  7. data/lib/fog/azurerm/requests/storage/delete_blob_https_url.rb +1 -1
  8. data/lib/fog/azurerm/requests/storage/get_blob_http_url.rb +1 -1
  9. data/lib/fog/azurerm/requests/storage/get_blob_https_url.rb +1 -1
  10. data/lib/fog/azurerm/requests/storage/get_blob_url.rb +1 -1
  11. data/lib/fog/azurerm/requests/storage/get_container_url.rb +1 -1
  12. data/lib/fog/azurerm/requests/storage/list_blobs.rb +1 -1
  13. data/lib/fog/azurerm/requests/storage/list_containers.rb +1 -1
  14. data/lib/fog/azurerm/requests/storage/put_blob_https_url.rb +1 -1
  15. data/lib/fog/azurerm/requests/storage/wait_blob_copy_operation_to_finish.rb +1 -1
  16. data/lib/fog/azurerm/storage.rb +21 -10
  17. data/lib/fog/azurerm/utilities/general.rb +5 -0
  18. data/lib/fog/azurerm/version.rb +1 -1
  19. data/rakefile +2 -0
  20. data/test/models/storage/test_file.rb +2 -4
  21. data/test/requests/storage/test_create_block_blob.rb +0 -9
  22. data/test/requests/storage/test_get_blob_https_url.rb +23 -1
  23. data/test/requests/storage/test_get_blob_url.rb +6 -1
  24. data/test/requests/storage/test_list_blobs.rb +2 -2
  25. data/test/requests/storage/test_list_containers.rb +2 -2
  26. data/test/requests/storage/test_wait_blob_copy_operation_to_finish.rb +1 -1
  27. data/test/test_helper.rb +8 -0
  28. metadata +22 -10
  29. data/lib/fog/azurerm/requests/storage/multipart_save_block_blob.rb +0 -110
  30. data/test/requests/storage/test_multipart_save_block_blob.rb +0 -105
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ff94ab3a5881a3709300b1a88ee3861f602a56aa675053e92a8b00f2fd9079a2
4
- data.tar.gz: e7dbd521f7c7b0d1984ec6aa33005b12b7653741aaa4e9c80f46c66083180713
3
+ metadata.gz: 6a0941da3e69509575eca6b720890940f33e8617e32bbb37121e19c9e1087e33
4
+ data.tar.gz: '09b4913d90bcbba439e9501df86dcc5e4d3d012a57941e2bc7033e4ac7d97806'
5
5
  SHA512:
6
- metadata.gz: c93fcf5a6bbaedceb13c75c3b19e75e1ce0f78c2d8909f6bb84ab9eedf08390520a69e0071667fdf0ac8c618b2476706b6e1a3231daa2f9671f5c0bb654125f7
7
- data.tar.gz: 94abb45649b7c9d88f2a916a1a39887ad44a991c3f890df84e9ad3fb4aa73af02c5ea0f968fc1947a64e2af671fc73d53ed7f88ae0fea2196f9810c61e8e88e7
6
+ metadata.gz: 6df48a1e91089a7c7af40addf64716b712daee65ea431edc4cffc98f1912c85538c5547eddced2bf512bdee1fbcca1cdd43eb2eb76022055a837f07bdad54d8c
7
+ data.tar.gz: b4696c93d25c11b5344410a09cd8142eae252350030000c3f6d041b85f69273f2196fa1715e1428ce9105471d150f1d3b036834140813d148b5ff54883481c24
data/.rubocop_todo.yml CHANGED
@@ -132,7 +132,6 @@ Naming/RescuedExceptionsVariableName:
132
132
  # SupportedStyles: separated, grouped
133
133
  Style/AccessorGrouping:
134
134
  Exclude:
135
- - 'lib/fog/azurerm/requests/storage/multipart_save_block_blob.rb'
136
135
  - 'lib/fog/azurerm/requests/storage/save_page_blob.rb'
137
136
  - 'test/test_helper.rb'
138
137
 
data/CHANGELOG.md CHANGED
@@ -1,3 +1,41 @@
1
+ ## Unreleased
2
+
3
+ ## 1.0.1
4
+
5
+ - Fix URL generation for files with UTF-8 characters !21
6
+
7
+ ## 1.0.0
8
+
9
+ - Fix multipart uploads not working and drop multipart_save_block_blob !19
10
+
11
+ ## 0.9.0
12
+
13
+ - Fix TimeoutError deprecation !17
14
+ - Update Azure storage libraries !16
15
+
16
+ ## 0.8.1
17
+
18
+ - Fix `azure_storage_domain` not getting propagated properly !14
19
+
20
+ ## 0.8.0
21
+
22
+ - Add `azure_storage_domain` for specifying custom domain !11
23
+
24
+ ## 0.7.0
25
+
26
+ - Loosen mime-types version dependency !9
27
+ - Drop azure_mgmt_storage and other dependencies !8
28
+
29
+ ## 0.6.0
30
+
31
+ - Fix get_object_url !7
32
+ - Add get_object_url method !6
33
+ - Add support for copy_object !5
34
+ - Add support for DELETE blob !4
35
+ - Add support for PUT blobs !3
36
+ - Add and update Rubocop files !2
37
+ - Delete all code except blob storage-related functionality !1
38
+
1
39
  ## 0.5.2
2
40
 
3
41
  **Added**
@@ -20,9 +20,10 @@ Gem::Specification.new do |spec|
20
20
  spec.add_development_dependency 'codeclimate-test-reporter' , '~> 1.0.0'
21
21
  spec.add_development_dependency 'minitest', '~> 5.8.4'
22
22
  spec.add_development_dependency 'rake', '~> 13.0'
23
- spec.add_development_dependency 'rubocop', '~> 0.89'
23
+ spec.add_development_dependency 'rubocop', '~> 0.89.1'
24
24
  spec.add_development_dependency 'simplecov'
25
- spec.add_dependency 'azure-storage', '~> 0.15.0.preview'
25
+ spec.add_dependency 'azure-storage-blob', '~> 2.0'
26
+ spec.add_dependency 'azure-storage-common', '~> 2.0'
26
27
  spec.add_dependency 'fog-core', '= 2.1.0'
27
28
  spec.add_dependency 'fog-json', '~> 1.2.0'
28
29
  spec.add_dependency 'mime-types'
@@ -248,12 +248,7 @@ module Fog
248
248
  # Upload blob
249
249
  def save_blob(options)
250
250
  if options[:blob_type].nil? || options[:blob_type] == 'BlockBlob'
251
- if Fog::Storage.get_body_size(body) <= SINGLE_BLOB_PUT_THRESHOLD
252
- service.create_block_blob(directory.key, key, body, options)
253
- else
254
- service.multipart_save_block_blob(directory.key, key, body, options)
255
- service.get_blob_properties(directory.key, key)
256
- end
251
+ service.create_block_blob(directory.key, key, body, options)
257
252
  else
258
253
  service.save_page_blob(directory.key, key, body, options)
259
254
  service.get_blob_properties(directory.key, key)
@@ -8,37 +8,9 @@ module Fog
8
8
  msg = "create_block_blob #{blob_name} to the container #{container_name}. options: #{options}"
9
9
  Fog::Logger.debug msg
10
10
 
11
- begin
12
- if body.nil?
13
- data = nil
14
- elsif body.respond_to?(:read)
15
- if body.respond_to?(:rewind)
16
- begin
17
- body.rewind
18
- rescue
19
- nil
20
- end
21
- end
22
- data = body.read
23
- else
24
- data = Fog::Storage.parse_data(body)
25
- options[:content_length] = data[:headers]['Content-Length']
26
- options[:content_type] = data[:headers]['Content-Type']
27
- data = data[:body]
28
- end
29
-
30
- raise ArgumentError.new('The maximum size for a block blob created via create_block_blob is 64 MB.') if !data.nil? && Fog::Storage.get_body_size(data) > 64 * 1024 * 1024
31
- blob = @blob_client.create_block_blob(container_name, blob_name, data, options)
32
- rescue Azure::Core::Http::HTTPError => ex
33
- raise_azure_exception(ex, msg)
34
- end
35
-
36
- if data.nil?
37
- Fog::Logger.debug "Create a block blob #{blob_name} successfully."
38
- else
39
- Fog::Logger.debug "Upload a block blob #{blob_name} successfully."
40
- end
41
- blob
11
+ @blob_client.create_block_blob(container_name, blob_name, body, options)
12
+ rescue Azure::Core::Http::HTTPError => ex
13
+ raise_azure_exception(ex, msg)
42
14
  end
43
15
  end
44
16
 
@@ -23,7 +23,7 @@ module Fog
23
23
  protocol: 'https'
24
24
  }
25
25
  token = @signature_client.generate_service_sas_token(relative_path, params)
26
- uri = @blob_client.generate_uri(relative_path)
26
+ uri = @blob_client.generate_uri(relative_path, {}, { encode: true })
27
27
  "#{uri}?#{token}"
28
28
  end
29
29
  end
@@ -22,7 +22,7 @@ module Fog
22
22
  expiry: expires.utc.iso8601
23
23
  }
24
24
  token = @signature_client.generate_service_sas_token(relative_path, params)
25
- uri = @blob_client.generate_uri(relative_path)
25
+ uri = @blob_client.generate_uri(relative_path, {}, { encode: true })
26
26
  url = "#{uri}?#{token}"
27
27
  url.gsub('https:', 'http:')
28
28
  end
@@ -23,7 +23,7 @@ module Fog
23
23
  protocol: 'https'
24
24
  }
25
25
  token = @signature_client.generate_service_sas_token(relative_path, params)
26
- uri = @blob_client.generate_uri(relative_path)
26
+ uri = @blob_client.generate_uri(relative_path, {}, { encode: true })
27
27
  "#{uri}?#{token}"
28
28
  end
29
29
  end
@@ -5,7 +5,7 @@ module Fog
5
5
  class Real
6
6
  # Get a public blob url from Azure blob storage
7
7
  def get_blob_url(container_name, blob_name, options = {})
8
- uri = @blob_client.generate_uri("#{container_name}/#{blob_name}")
8
+ uri = @blob_client.generate_uri("#{container_name}/#{blob_name}", {}, { encode: true })
9
9
 
10
10
  if options[:scheme] == 'http'
11
11
  uri.to_s.gsub('https:', 'http:')
@@ -11,7 +11,7 @@ module Fog
11
11
  #
12
12
  def get_container_url(container_name, options = {})
13
13
  query = { 'comp' => 'list', 'restype' => 'container' }
14
- uri = @blob_client.generate_uri(container_name, query)
14
+ uri = @blob_client.generate_uri(container_name, query, { encode: true })
15
15
 
16
16
  if options[:scheme] == 'http'
17
17
  uri.to_s.gsub('https:', 'http:')
@@ -21,7 +21,7 @@ module Fog
21
21
  Fog::Logger.debug msg
22
22
  temp = @blob_client.list_blobs(container_name, options)
23
23
  # Workaround for the issue https://github.com/Azure/azure-storage-ruby/issues/37
24
- raise temp unless temp.instance_of?(Azure::Service::EnumerationResults)
24
+ raise temp unless temp.instance_of?(Azure::Storage::Common::Service::EnumerationResults)
25
25
 
26
26
  blobs += temp unless temp.empty?
27
27
  break if temp.continuation_token.nil? || temp.continuation_token.empty?
@@ -16,7 +16,7 @@ module Fog
16
16
  Fog::Logger.debug msg
17
17
  temp = @blob_client.list_containers(options)
18
18
  # Workaround for the issue https://github.com/Azure/azure-storage-ruby/issues/37
19
- raise temp unless temp.instance_of?(Azure::Service::EnumerationResults)
19
+ raise temp unless temp.instance_of?(Azure::Storage::Common::Service::EnumerationResults)
20
20
 
21
21
  containers += temp unless temp.empty?
22
22
  break if temp.continuation_token.nil? || temp.continuation_token.empty?
@@ -23,7 +23,7 @@ module Fog
23
23
  protocol: 'https'
24
24
  }
25
25
  token = @signature_client.generate_service_sas_token(relative_path, params)
26
- uri = @blob_client.generate_uri(relative_path)
26
+ uri = @blob_client.generate_uri(relative_path, {}, { encode: true })
27
27
  "#{uri}?#{token}"
28
28
  end
29
29
  end
@@ -18,7 +18,7 @@ module Fog
18
18
  break if copy_status != COPY_STATUS[:PENDING]
19
19
 
20
20
  elapse_time = Time.new - start_time
21
- raise TimeoutError.new("The copy operation cannot be finished in #{timeout} seconds") if !timeout.nil? && elapse_time >= timeout
21
+ raise Timeout::Error.new("The copy operation cannot be finished in #{timeout} seconds") if !timeout.nil? && elapse_time >= timeout
22
22
 
23
23
  copied_bytes, total_bytes = blob_props[:copy_progress].split('/').map(&:to_i)
24
24
  interval = copied_bytes.zero? ? 5 : (total_bytes - copied_bytes).to_f / copied_bytes * elapse_time
@@ -12,6 +12,8 @@ module Fog
12
12
  # Recognizes when creating data client
13
13
  recognizes :azure_storage_account_name
14
14
  recognizes :azure_storage_access_key
15
+ recognizes :azure_storage_domain
16
+
15
17
  recognizes :debug
16
18
 
17
19
  request_path 'fog/azurerm/requests/storage'
@@ -55,7 +57,6 @@ module Fog
55
57
  request :put_blob_pages
56
58
  request :wait_blob_copy_operation_to_finish
57
59
  request :save_page_blob
58
- request :multipart_save_block_blob
59
60
 
60
61
  model_path 'fog/azurerm/models/storage'
61
62
  model :directory
@@ -67,7 +68,8 @@ module Fog
67
68
  class Mock
68
69
  def initialize(_options = {})
69
70
  begin
70
- require 'azure/storage'
71
+ require 'azure/storage/common'
72
+ require 'azure/storage/blob'
71
73
  rescue LoadError => e
72
74
  retry if require('rubygems')
73
75
  raise e.message
@@ -79,7 +81,8 @@ module Fog
79
81
  class Real
80
82
  def initialize(options)
81
83
  begin
82
- require 'azure/storage'
84
+ require 'azure/storage/common'
85
+ require 'azure/storage/blob'
83
86
  require 'securerandom'
84
87
  @debug = ENV['DEBUG'] || options[:debug]
85
88
  require 'azure/core/http/debug_filter' if @debug
@@ -104,15 +107,23 @@ module Fog
104
107
 
105
108
  @azure_storage_account_name = options[:azure_storage_account_name]
106
109
  @azure_storage_access_key = options[:azure_storage_access_key]
110
+ @azure_storage_domain = options[:azure_storage_domain]
111
+
112
+ domain =
113
+ if @azure_storage_domain.nil? || @azure_storage_domain.empty?
114
+ get_blob_endpoint(@azure_storage_account_name, true, @environment)
115
+ else
116
+ get_blob_endpoint_with_domain(@azure_storage_account_name, true, @azure_storage_domain)
117
+ end
107
118
 
108
- azure_client = Azure::Storage::Client.create(storage_account_name: @azure_storage_account_name,
109
- storage_access_key: @azure_storage_access_key)
110
- azure_client.storage_blob_host = get_blob_endpoint(@azure_storage_account_name, true, @environment)
111
- @blob_client = azure_client.blob_client
112
- @blob_client.with_filter(Azure::Storage::Core::Filter::ExponentialRetryPolicyFilter.new)
119
+ azure_client = Azure::Storage::Common::Client.create(storage_account_name: @azure_storage_account_name,
120
+ storage_access_key: @azure_storage_access_key,
121
+ storage_blob_host: domain)
122
+ @blob_client = Azure::Storage::Blob::BlobService.new(client: azure_client)
123
+ @blob_client.with_filter(Azure::Storage::Common::Core::Filter::ExponentialRetryPolicyFilter.new)
113
124
  @blob_client.with_filter(Azure::Core::Http::DebugFilter.new) if @debug
114
- @signature_client = Azure::Storage::Core::Auth::SharedAccessSignature.new(@azure_storage_account_name,
115
- @azure_storage_access_key)
125
+ @signature_client = Azure::Storage::Common::Core::Auth::SharedAccessSignature.new(@azure_storage_account_name,
126
+ @azure_storage_access_key)
116
127
  end
117
128
  end
118
129
  end
@@ -125,6 +125,11 @@ def get_blob_endpoint(storage_account_name, enable_https = false, environment =
125
125
  "#{protocol}://#{storage_account_name}.blob#{storage_endpoint_suffix(environment)}"
126
126
  end
127
127
 
128
+ def get_blob_endpoint_with_domain(storage_account_name, enable_https = false, domain = 'blob.core.windows.net')
129
+ protocol = enable_https ? 'https' : 'http'
130
+ "#{protocol}://#{storage_account_name}.#{domain}"
131
+ end
132
+
128
133
  def current_time
129
134
  time = Time.now.to_f.to_s
130
135
  time.split(/\W+/).join
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module AzureRM
3
- VERSION = '0.7.0'.freeze
3
+ VERSION = '1.0.1'.freeze
4
4
  end
5
5
  end
data/rakefile CHANGED
@@ -1,4 +1,6 @@
1
1
  require 'rake/testtask'
2
+ require 'bundler/gem_tasks'
3
+
2
4
  task default: :cc_coverage
3
5
  task :test do
4
6
  ENV['COVERAGE'] = nil
@@ -76,10 +76,8 @@ class TestFile < Minitest::Test
76
76
  def test_save_method_with_large_block_blob_success
77
77
  @file.body = 'd' * (32 * 1024 * 1024 + 1) # SINGLE_BLOB_PUT_THRESHOLD is 32 * 1024 * 1024
78
78
 
79
- @service.stub :multipart_save_block_blob, true do
80
- @service.stub :get_blob_properties, @raw_cloud_blob do
81
- assert @file.save
82
- end
79
+ @service.stub :create_block_blob, @raw_cloud_blob do
80
+ assert @file.save
83
81
  end
84
82
  end
85
83
 
@@ -52,15 +52,6 @@ class TestCreateBlockBlob < Minitest::Test
52
52
  end
53
53
  end
54
54
 
55
- def test_create_block_blob_exceed_max_body_size
56
- data = []
57
- data.stub :size, 64 * 1024 * 1024 + 1 do
58
- assert_raises(ArgumentError) do
59
- @service.create_block_blob('test_container', 'test_blob', data)
60
- end
61
- end
62
- end
63
-
64
55
  def test_create_block_blob_http_exception
65
56
  http_exception = ->(*) { raise Azure::Core::Http::HTTPError.new(@mocked_response) }
66
57
  @blob_client.stub :create_block_blob, http_exception do
@@ -17,7 +17,13 @@ class TestGetBlobHttpsUrl < Minitest::Test
17
17
  end
18
18
 
19
19
  def test_get_blob_https_url_success
20
- @blob_client.stub :generate_uri, @url do
20
+ mock_generate_uri = Minitest::Mock.new
21
+
22
+ 2.times do
23
+ mock_generate_uri.expect(:call, @url, ['test_container/test_blob', {}, { encode: true }])
24
+ end
25
+
26
+ @blob_client.stub :generate_uri, mock_generate_uri do
21
27
  @signature_client.stub :generate_service_sas_token, @token do
22
28
  assert_equal "#{@url}?#{@token}", @service.get_blob_https_url('test_container', 'test_blob', Time.now.utc + 3600)
23
29
  assert_equal "#{@url}?#{@token}", @service.get_object_url('test_container', 'test_blob', Time.now.utc + 3600)
@@ -25,6 +31,22 @@ class TestGetBlobHttpsUrl < Minitest::Test
25
31
  end
26
32
  end
27
33
 
34
+ def test_get_blob_https_url_with_domain_success
35
+ service = Fog::Storage::AzureRM.new(storage_account_credentials_with_domain)
36
+ blob_client = service.instance_variable_get(:@blob_client)
37
+ signature_client = service.instance_variable_get(:@signature_client)
38
+
39
+ url = 'https://mockaccount.test.example.com/test_container/test_blob'
40
+ token = ApiStub::Requests::Storage::File.blob_url_token
41
+
42
+ blob_client.stub :generate_uri, url do
43
+ signature_client.stub :generate_service_sas_token, token do
44
+ assert_equal "#{url}?#{token}", service.get_blob_https_url('test_container', 'test_blob', Time.now.utc + 3600)
45
+ assert_equal "#{url}?#{token}", service.get_object_url('test_container', 'test_blob', Time.now.utc + 3600)
46
+ end
47
+ end
48
+ end
49
+
28
50
  def test_get_blob_https_url_mock
29
51
  assert_equal "#{@url}?#{@token}", @mock_service.get_blob_https_url('test_container', 'test_blob', Time.now.utc + 3600)
30
52
  assert_equal "#{@url}?#{@token}", @mock_service.get_object_url('test_container', 'test_blob', Time.now.utc + 3600)
@@ -12,9 +12,14 @@ class TestGetBlobUrl < Minitest::Test
12
12
  def test_get_blob_url_success
13
13
  service = Fog::Storage::AzureRM.new(storage_account_credentials)
14
14
  blob_client = service.instance_variable_get(:@blob_client)
15
+
16
+ mock_generate_uri = Minitest::Mock.new
15
17
  url = ApiStub::Requests::Storage::File.blob_https_url
18
+ 2.times do
19
+ mock_generate_uri.expect(:call, url, ['test_container/test_blob', {}, { encode: true }])
20
+ end
16
21
 
17
- blob_client.stub :generate_uri, url do
22
+ blob_client.stub :generate_uri, mock_generate_uri do
18
23
  assert_equal url, service.get_blob_url('test_container', 'test_blob')
19
24
 
20
25
  options = { scheme: 'http' }
@@ -13,11 +13,11 @@ class TestListBlobs < Minitest::Test
13
13
  @blob_client = @service.instance_variable_get(:@blob_client)
14
14
 
15
15
  @blob_list = ApiStub::Requests::Storage::File.blob_list
16
- @blobs1 = Azure::Service::EnumerationResults.new
16
+ @blobs1 = Azure::Storage::Common::Service::EnumerationResults.new
17
17
  @blobs1.continuation_token = 'marker'
18
18
  @blobs1.push(@blob_list[0])
19
19
  @blobs1.push(@blob_list[1])
20
- @blobs2 = Azure::Service::EnumerationResults.new
20
+ @blobs2 = Azure::Storage::Common::Service::EnumerationResults.new
21
21
  @blobs2.push(@blob_list[2])
22
22
  @blobs2.push(@blob_list[3])
23
23
  end
@@ -13,11 +13,11 @@ class TestListContainers < Minitest::Test
13
13
  @blob_client = @service.instance_variable_get(:@blob_client)
14
14
 
15
15
  @containers = ApiStub::Requests::Storage::Directory.container_list
16
- @containers1 = Azure::Service::EnumerationResults.new
16
+ @containers1 = Azure::Storage::Common::Service::EnumerationResults.new
17
17
  @containers1.continuation_token = 'marker'
18
18
  @containers1.push(@containers[0])
19
19
  @containers1.push(@containers[1])
20
- @containers2 = Azure::Service::EnumerationResults.new
20
+ @containers2 = Azure::Storage::Common::Service::EnumerationResults.new
21
21
  @containers2.push(@containers[2])
22
22
  end
23
23
 
@@ -106,7 +106,7 @@ class TestWaitBlobCopyOperationToFinish < Minitest::Test
106
106
 
107
107
  @service.stub :get_blob_properties, multiple_values do
108
108
  @service.stub :delete_blob, true do
109
- assert_raises(TimeoutError) do
109
+ assert_raises(Timeout::Error) do
110
110
  @service.wait_blob_copy_operation_to_finish('test_container', 'test_blob', copy_id, copy_status, 2)
111
111
  end
112
112
  end
data/test/test_helper.rb CHANGED
@@ -36,6 +36,14 @@ def storage_account_credentials
36
36
  }
37
37
  end
38
38
 
39
+ def storage_account_credentials_with_domain
40
+ storage_account_credentials.merge(
41
+ {
42
+ azure_storage_domain: 'test.example.com'
43
+ }
44
+ )
45
+ end
46
+
39
47
  # Mock Class for Blob
40
48
  class MockBlob
41
49
  def initialize
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-fog-azure-rm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shaffan Chaudhry
@@ -18,7 +18,7 @@ authors:
18
18
  autorequire:
19
19
  bindir: bin
20
20
  cert_chain: []
21
- date: 2020-08-07 00:00:00.000000000 Z
21
+ date: 2021-02-22 00:00:00.000000000 Z
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
24
24
  name: codeclimate-test-reporter
@@ -68,14 +68,14 @@ dependencies:
68
68
  requirements:
69
69
  - - "~>"
70
70
  - !ruby/object:Gem::Version
71
- version: '0.89'
71
+ version: 0.89.1
72
72
  type: :development
73
73
  prerelease: false
74
74
  version_requirements: !ruby/object:Gem::Requirement
75
75
  requirements:
76
76
  - - "~>"
77
77
  - !ruby/object:Gem::Version
78
- version: '0.89'
78
+ version: 0.89.1
79
79
  - !ruby/object:Gem::Dependency
80
80
  name: simplecov
81
81
  requirement: !ruby/object:Gem::Requirement
@@ -91,19 +91,33 @@ dependencies:
91
91
  - !ruby/object:Gem::Version
92
92
  version: '0'
93
93
  - !ruby/object:Gem::Dependency
94
- name: azure-storage
94
+ name: azure-storage-blob
95
95
  requirement: !ruby/object:Gem::Requirement
96
96
  requirements:
97
97
  - - "~>"
98
98
  - !ruby/object:Gem::Version
99
- version: 0.15.0.preview
99
+ version: '2.0'
100
100
  type: :runtime
101
101
  prerelease: false
102
102
  version_requirements: !ruby/object:Gem::Requirement
103
103
  requirements:
104
104
  - - "~>"
105
105
  - !ruby/object:Gem::Version
106
- version: 0.15.0.preview
106
+ version: '2.0'
107
+ - !ruby/object:Gem::Dependency
108
+ name: azure-storage-common
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '2.0'
114
+ type: :runtime
115
+ prerelease: false
116
+ version_requirements: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: '2.0'
107
121
  - !ruby/object:Gem::Dependency
108
122
  name: fog-core
109
123
  requirement: !ruby/object:Gem::Requirement
@@ -235,7 +249,6 @@ files:
235
249
  - lib/fog/azurerm/requests/storage/get_object_url.rb
236
250
  - lib/fog/azurerm/requests/storage/list_blobs.rb
237
251
  - lib/fog/azurerm/requests/storage/list_containers.rb
238
- - lib/fog/azurerm/requests/storage/multipart_save_block_blob.rb
239
252
  - lib/fog/azurerm/requests/storage/put_blob_block.rb
240
253
  - lib/fog/azurerm/requests/storage/put_blob_https_url.rb
241
254
  - lib/fog/azurerm/requests/storage/put_blob_metadata.rb
@@ -291,7 +304,6 @@ files:
291
304
  - test/requests/storage/test_get_container_url.rb
292
305
  - test/requests/storage/test_list_blobs.rb
293
306
  - test/requests/storage/test_list_containers.rb
294
- - test/requests/storage/test_multipart_save_block_blob.rb
295
307
  - test/requests/storage/test_put_blob_block.rb
296
308
  - test/requests/storage/test_put_blob_https_url.rb
297
309
  - test/requests/storage/test_put_blob_metadata.rb
@@ -326,7 +338,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
326
338
  - !ruby/object:Gem::Version
327
339
  version: '0'
328
340
  requirements: []
329
- rubygems_version: 3.0.3
341
+ rubygems_version: 3.1.4
330
342
  signing_key:
331
343
  specification_version: 4
332
344
  summary: Module for the 'fog' gem to support Azure Blob Storage with CarrierWave and
@@ -1,110 +0,0 @@
1
- module Fog
2
- module Storage
3
- class AzureRM
4
- # This class provides the actual implementation for service calls.
5
- class Real
6
- # This class is used to store chunk data for block blob before uploading.
7
- class BlockChunk
8
- attr_reader :id # For debug
9
- attr_reader :block_id
10
- attr_reader :data
11
-
12
- def initialize(id, block_id, data)
13
- @id = id
14
- @block_id = block_id
15
- @data = data
16
- end
17
- end
18
-
19
- # This class is a stream to read chunk data.
20
- class BlockFileStream
21
- attr_reader :blocks
22
-
23
- def initialize(body)
24
- if body.respond_to?(:read)
25
- if body.respond_to?(:rewind)
26
- begin
27
- body.rewind
28
- rescue => ex
29
- Fog::Logger.debug "multipart_save_block_blob - body responds to :rewind but throws an exception when calling :rewind: #{ex.inspect}"
30
- end
31
- end
32
- @stream = body
33
- else
34
- @stream = StringIO.new(body)
35
- end
36
- @mutex = Mutex.new
37
- @blocks = []
38
- end
39
-
40
- def read(size)
41
- block_id = Base64.strict_encode64(random_string(32))
42
- data = nil
43
- id = 0
44
- @mutex.synchronize do
45
- data = @stream.read(size)
46
- return nil if data.nil?
47
- @blocks << [block_id]
48
- id = @blocks.size
49
- end
50
- BlockChunk.new(id, block_id, data)
51
- end
52
- end
53
-
54
- def multipart_save_block_blob(container_name, blob_name, body, options)
55
- threads_num = options.delete(:worker_thread_num)
56
- threads_num = UPLOAD_BLOB_WORKER_THREAD_COUNT if threads_num.nil? || !threads_num.is_a?(Integer) || threads_num < 1
57
-
58
- begin
59
- # Initiate the upload
60
- Fog::Logger.debug "Creating the block blob #{container_name}/#{blob_name}. options: #{options}"
61
- content_md5 = options.delete(:content_md5)
62
- create_block_blob(container_name, blob_name, nil, options)
63
-
64
- # Uploading parts
65
- Fog::Logger.debug "Starting to upload parts for the block blob #{container_name}/#{blob_name}."
66
- iostream = BlockFileStream.new(body)
67
-
68
- threads = []
69
- threads_num.times do |id|
70
- thread = Thread.new do
71
- Fog::Logger.debug "Created upload thread #{id}."
72
- while (chunk = iostream.read(MAXIMUM_CHUNK_SIZE))
73
- Fog::Logger.debug "Upload thread #{id} is uploading #{chunk.id}, size: #{chunk.data.size}, options: #{options}."
74
- put_blob_block(container_name, blob_name, chunk.block_id, chunk.data, options)
75
- end
76
- Fog::Logger.debug "Upload thread #{id} finished."
77
- end
78
- thread.abort_on_exception = true
79
- threads << thread
80
- end
81
-
82
- threads.each(&:join)
83
- # Complete the upload
84
- options[:content_md5] = content_md5 unless content_md5.nil?
85
- Fog::Logger.debug "Commiting the block blob #{container_name}/#{blob_name}. options: #{options}"
86
- commit_blob_blocks(container_name, blob_name, iostream.blocks, options)
87
- rescue
88
- # Abort the upload & reraise
89
- begin
90
- delete_blob(container_name, blob_name)
91
- rescue => ex
92
- Fog::Logger.debug "Cannot delete the blob: #{container_name}/#{blob_name} after multipart_save_block_blob failed. #{ex.inspect}"
93
- end
94
- raise
95
- end
96
-
97
- Fog::Logger.debug "Successfully save the block blob: #{container_name}/#{blob_name}."
98
- true
99
- end
100
- end
101
-
102
- # This class provides the mock implementation for unit tests.
103
- class Mock
104
- def multipart_save_block_blob(*)
105
- true
106
- end
107
- end
108
- end
109
- end
110
- end
@@ -1,105 +0,0 @@
1
- require File.expand_path '../../test_helper', __dir__
2
-
3
- # Storage Blob Class
4
- class TestMultipartSaveBlockBlob < Minitest::Test
5
- # This class posesses the test cases for the requests of saving storage block blob with multiple parts.
6
- def setup
7
- Fog.mock!
8
- @mock_service = Fog::Storage::AzureRM.new(storage_account_credentials)
9
- Fog.unmock!
10
- @mocked_response = mocked_storage_http_error
11
-
12
- @service = Fog::Storage::AzureRM.new(storage_account_credentials)
13
- end
14
-
15
- def test_multipart_save_block_blob_success
16
- body = 'd' * 5 * 1024 * 1024 # MAXIMUM_CHUNK_SIZE is 4 * 1024 * 1024
17
-
18
- @service.stub :create_block_blob, true do
19
- @service.stub :put_blob_block, true do
20
- @service.stub :commit_blob_blocks, true do
21
- assert @service.multipart_save_block_blob('test_container', 'test_blob', body, worker_thread_num: 6, content_md5: 'oafL1+HS78x65+e39PGIIg==')
22
- end
23
- end
24
- end
25
- end
26
-
27
- def test_multipart_save_block_blob_with_file_handle_success
28
- i = 0
29
- multiple_values = lambda do |*|
30
- i += 1
31
- return 'd' * 4 * 1024 * 1024 if i == 1
32
- return 'd' * (1 * 1024 * 1024 + 1) if i == 2
33
- return nil
34
- end
35
- temp_file = '/dev/null'
36
- File.open(temp_file, 'r') do |file_handle|
37
- file_handle.stub :read, multiple_values do
38
- file_handle.stub :rewind, nil do
39
- @service.stub :create_block_blob, @raw_cloud_blob do
40
- @service.stub :put_blob_block, true do
41
- @service.stub :commit_blob_blocks, true do
42
- assert @service.multipart_save_block_blob('test_container', 'test_blob', file_handle, worker_thread_num: 0)
43
- end
44
- end
45
- end
46
- end
47
- end
48
- end
49
- end
50
-
51
- def test_multipart_save_block_blob_with_file_handle_do_not_support_rewind_success
52
- i = 0
53
- multiple_values = lambda do |*|
54
- i += 1
55
- return 'd' * 4 * 1024 * 1024 if i == 1
56
- return 'd' * (1 * 1024 * 1024 + 1) if i == 2
57
- return nil
58
- end
59
- temp_file = '/dev/null'
60
- exception = ->(*) { raise 'do not support rewind' }
61
- File.open(temp_file, 'r') do |file_handle|
62
- file_handle.stub :read, multiple_values do
63
- file_handle.stub :rewind, exception do
64
- @service.stub :create_block_blob, @raw_cloud_blob do
65
- @service.stub :put_blob_block, true do
66
- @service.stub :commit_blob_blocks, true do
67
- assert @service.multipart_save_block_blob('test_container', 'test_blob', file_handle, worker_thread_num: 'invalid')
68
- end
69
- end
70
- end
71
- end
72
- end
73
- end
74
- end
75
-
76
- def test_multipart_save_block_blob_http_exception
77
- body = 'd' * 5 * 1024 * 1024 # MAXIMUM_CHUNK_SIZE is 4 * 1024 * 1024
78
-
79
- http_exception = ->(*) { raise Azure::Core::Http::HTTPError.new(@mocked_response) }
80
- @service.stub :create_block_blob, http_exception do
81
- @service.stub :delete_blob, true do
82
- assert_raises(Azure::Core::Http::HTTPError) do
83
- @service.multipart_save_block_blob('test_container', 'test_blob', body, {})
84
- end
85
- end
86
- end
87
- end
88
-
89
- def test_multipart_save_block_blob_fail_when_delete_blob_http_exception
90
- body = 'd' * 5 * 1024 * 1024 # MAXIMUM_CHUNK_SIZE is 4 * 1024 * 1024
91
-
92
- http_exception = ->(*) { raise Azure::Core::Http::HTTPError.new(@mocked_response) }
93
- @service.stub :create_block_blob, http_exception do
94
- @service.stub :delete_blob, http_exception do
95
- assert_raises(Azure::Core::Http::HTTPError) do
96
- @service.multipart_save_block_blob('test_container', 'test_blob', body, {})
97
- end
98
- end
99
- end
100
- end
101
-
102
- def test_multipart_save_block_blob_mock
103
- assert @mock_service.multipart_save_block_blob('test_container', 'test_blob', 'content', {})
104
- end
105
- end