gitlab-fog-azure-rm 0.6.0 → 1.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4b58d858add0fa6eb3a7cd2e748232d32506f5d1c1c5ec91dc333137938804c8
4
- data.tar.gz: 6863876c31c86b6d8e7eae3a03fb0ced679678ffd515e508e5f854379b878019
3
+ metadata.gz: 177b1f767e814e126cce9905dc11bd5b4384daaafb7292ae379a9f05c435b4ea
4
+ data.tar.gz: 19d21cd53ffd3a246e195009c4f709df9e4e955ae5c2dace73e4436f82f5ac4d
5
5
  SHA512:
6
- metadata.gz: 47e8d612e9b2144f46badfc86f7df85a8b39fc35e6b95134a94a5b79cb43786286a0e565a5fbb52e9da9d2eec0510203fe1bb0e5b769b0d32bd74313991b4a6b
7
- data.tar.gz: ff4911539b4736ad2dc4d1cd3d541904cf75ac2695c65e2317077cd9200b1aedcac35a3b39e30a2d456d35e8c8b8b6b4d6c6d88d64c63ba9577c9297bd1f270f
6
+ metadata.gz: aa5d061efb46aee21a8c74d949f7ba5c1632019ccda79799cfe70775f40b6a3448d0f4c01fc12b0c82863419c74a673a68992ca9582317a1df45c42d3ffd5dad
7
+ data.tar.gz: 8d45eb802da36f53c8aa7a67a49f609de9e39be351af967237166da94c52bda5e474cbb7633200f18bc9386341591d8880df9cda8cd7e5a055beb6f0ad09e13c
@@ -43,7 +43,6 @@ Layout/EndOfLine:
43
43
  Layout/HashAlignment:
44
44
  Exclude:
45
45
  - 'lib/fog/azurerm/models/storage/file.rb'
46
- - 'lib/fog/azurerm/requests/storage/create_disk.rb'
47
46
  - 'test/test_helper.rb'
48
47
 
49
48
  # Offense count: 1
@@ -133,7 +132,6 @@ Naming/RescuedExceptionsVariableName:
133
132
  # SupportedStyles: separated, grouped
134
133
  Style/AccessorGrouping:
135
134
  Exclude:
136
- - 'lib/fog/azurerm/requests/storage/multipart_save_block_blob.rb'
137
135
  - 'lib/fog/azurerm/requests/storage/save_page_blob.rb'
138
136
  - 'test/test_helper.rb'
139
137
 
@@ -227,7 +225,6 @@ Style/RescueStandardError:
227
225
  Exclude:
228
226
  - 'lib/fog/azurerm/models/storage/files.rb'
229
227
  - 'lib/fog/azurerm/requests/storage/create_block_blob.rb'
230
- - 'lib/fog/azurerm/requests/storage/create_disk.rb'
231
228
  - 'lib/fog/azurerm/requests/storage/multipart_save_block_blob.rb'
232
229
  - 'lib/fog/azurerm/requests/storage/save_page_blob.rb'
233
230
  - 'lib/fog/azurerm/requests/storage/wait_blob_copy_operation_to_finish.rb'
@@ -1,3 +1,37 @@
1
+ ## Unreleased
2
+
3
+ ## 1.0.0
4
+
5
+ - Fix multipart uploads not working and drop multipart_save_block_blob !19
6
+
7
+ ## 0.9.0
8
+
9
+ - Fix TimeoutError deprecation !17
10
+ - Update Azure storage libraries !16
11
+
12
+ ## 0.8.1
13
+
14
+ - Fix `azure_storage_domain` not getting propagated properly !14
15
+
16
+ ## 0.8.0
17
+
18
+ - Add `azure_storage_domain` for specifying custom domain !11
19
+
20
+ ## 0.7.0
21
+
22
+ - Loosen mime-types version dependency !9
23
+ - Drop azure_mgmt_storage and other dependencies !8
24
+
25
+ ## 0.6.0
26
+
27
+ - Fix get_object_url !7
28
+ - Add get_object_url method !6
29
+ - Add support for copy_object !5
30
+ - Add support for DELETE blob !4
31
+ - Add support for PUT blobs !3
32
+ - Add and update Rubocop files !2
33
+ - Delete all code except blob storage-related functionality !1
34
+
1
35
  ## 0.5.2
2
36
 
3
37
  **Added**
@@ -19,13 +19,13 @@ Gem::Specification.new do |spec|
19
19
  spec.post_install_message = 'Thanks for installing!'
20
20
  spec.add_development_dependency 'codeclimate-test-reporter' , '~> 1.0.0'
21
21
  spec.add_development_dependency 'minitest', '~> 5.8.4'
22
- spec.add_development_dependency 'rake', '~> 10.0'
23
- spec.add_development_dependency 'rubocop', '~> 0.89'
22
+ spec.add_development_dependency 'rake', '~> 13.0'
23
+ spec.add_development_dependency 'rubocop', '~> 0.89.1'
24
24
  spec.add_development_dependency 'simplecov'
25
- spec.add_dependency 'azure_mgmt_storage', '~> 0.21'
26
- 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'
27
27
  spec.add_dependency 'fog-core', '= 2.1.0'
28
28
  spec.add_dependency 'fog-json', '~> 1.2.0'
29
- spec.add_dependency 'mime-types', '~> 3.2.2'
30
- spec.add_dependency 'vhd', '0.0.4'
29
+ spec.add_dependency 'mime-types'
30
+ spec.add_dependency 'ms_rest_azure', '~> 0.12.0'
31
31
  end
@@ -12,32 +12,6 @@ require 'fog/azurerm'
12
12
 
13
13
  ## Create Connection
14
14
 
15
- Next, create a connection to the Storage Service:
16
-
17
- ```ruby
18
- fog_storage_service = Fog::Storage::AzureRM.new(
19
- tenant_id: '<Tenant Id>', # Tenant Id of Azure Active Directory Application
20
- client_id: '<Client Id>', # Client Id of Azure Active Directory Application
21
- client_secret: '<Client Secret>', # Client Secret of Azure Active Directory Application
22
- subscription_id: '<Subscription Id>', # Subscription Id of an Azure Account
23
- azure_storage_account_name: '<Storage Account Name>', # Name of an Azure Storage Account
24
- azure_storage_access_key: '<Storage Account Key>', # Key of an Azure Storage Account
25
- environment: '<AzureCloud/AzureChinaCloud/AzureUSGovernment/AzureGermanCloud>' # Azure cloud environment. Default is AzureCloud.
26
- )
27
- ```
28
-
29
- If you only want to manage the storage accounts, you can create the connection without the storage account information:
30
-
31
- ```ruby
32
- fog_storage_service = Fog::Storage::AzureRM.new(
33
- tenant_id: '<Tenant Id>', # Tenant Id of Azure Active Directory Application
34
- client_id: '<Client Id>', # Client Id of Azure Active Directory Application
35
- client_secret: '<Client Secret>', # Client Secret of Azure Active Directory Application
36
- subscription_id: '<Subscription Id>', # Subscription Id of an Azure Account
37
- environment: '<AzureCloud/AzureChinaCloud/AzureUSGovernment/AzureGermanCloud>' # Azure cloud environment. Default is AzureCloud.
38
- )
39
- ```
40
-
41
15
  If you only want to manage the storage data, you can create the connection without the Azure subscription information:
42
16
 
43
17
  ```ruby
@@ -48,127 +22,6 @@ fog_storage_service = Fog::Storage::AzureRM.new(
48
22
  )
49
23
  ```
50
24
 
51
- ## Check Name Availability
52
-
53
- This operation checks that account name is valid and is not already in use. _Storage Account Type_ is an optional parameter
54
-
55
- ```ruby
56
- fog_storage_service.storage_accounts.check_name_availability('<Storage Account Name>', '<Storage Account Type>')
57
- ```
58
-
59
- ## Check Storage Account Existence
60
-
61
- ```ruby
62
- fog_storage_service.storage_accounts.check_storage_account_exists('<Resource Group Name>', '<Storage Account Name>')
63
- ```
64
-
65
- ## Create Storage Account
66
-
67
- Create a new storage account. Replication attribute for Standard and Premium account types are as follows
68
-
69
- ##### Standard
70
-
71
- 1. LRS (Standard Locally-redundant storage)
72
- 2. ZRS (Standard Zone-redundant storage)
73
- 3. GRS (Standard Geo-redundant storage)
74
- 4. RAGRS (Standard Read access geo-redundant storage)
75
-
76
- ##### Premium
77
- 1. LRS (Premium Locally-redundant storage)
78
-
79
- ```ruby
80
- fog_storage_service.storage_accounts.create(
81
- name: '<Storage Account name>',
82
- location: '<Location>',
83
- resource_group: '<Resource Group Name>',
84
- account_type: '<Standard/Premium>', # [Optional] Default value 'Standard'. Allowed values can only be Standard or Premium
85
- replication: '<Replication Type>', # [Optional] Default value 'LRS'
86
- encryption: <True/False>, # [Optional] Enables encryption. Default is false.
87
- tags: { key1: 'value1', key2: 'value2', keyN: 'valueN' } # [Optional]
88
- )
89
- ```
90
- Premium Storage account store data on solid state drives (SSDs). For more details on standard and premium storage accounts, see [Introduction to Microsoft Azure Storage](https://azure.microsoft.com/en-us/documentation/articles/storage-introduction/) and [Premium Storage: High-Performance Storage for Azure Virtual Machine Workloads](https://azure.microsoft.com/en-us/documentation/articles/storage-premium-storage/).
91
-
92
- ## List storage accounts
93
-
94
- ##### List storage accounts in a subscription
95
-
96
- ```ruby
97
- fog_storage_service.storage_accounts.each do |storage_acc|
98
- puts "#{storage_acc.name}"
99
- puts "#{storage_acc.location}"
100
- end
101
- ```
102
- ##### List storage accounts in a resource group
103
-
104
- ```ruby
105
- storage_accounts = fog_storage_service.storage_accounts(resource_group: '<Resource Group Name>')
106
- storage_accounts.each do |storage_acc|
107
- puts "#{storage_acc.name}"
108
- puts "#{storage_acc.location}"
109
- end
110
- ```
111
-
112
- ## Retrieve a single Storage Account
113
-
114
- Get a single record of Storage Account
115
-
116
- ```ruby
117
- storage_acc = fog_storage_service
118
- .storage_accounts
119
- .get('<Resource Group Name>', '<Storage Account Name>')
120
- puts "#{storage_acc.name}"
121
- ```
122
-
123
- ## Enable encryption on Storage Account
124
-
125
- Get a single record of Storage Account and enable encryption on that Storage Account
126
-
127
- ```ruby
128
- storage_acc = fog_storage_service
129
- .storage_accounts
130
- .get('<Resource Group Name>', '<Storage Account Name>')
131
-
132
- storage_acc.update(encryption: true)
133
- ```
134
-
135
- ## Get Access Keys
136
-
137
- Get access keys of a storage account
138
-
139
- ```ruby
140
- keys_hash = storage_acc.get_access_keys
141
- keys_hash.each do |keys|
142
- puts "#{keys.key_name}: #{keys.value}"
143
- end
144
- ```
145
-
146
- ## Destroy a single Storage Account
147
-
148
- Get storage account object from the get method and then destroy that storage account.
149
-
150
- ```ruby
151
- storage_acc.destroy
152
- ```
153
-
154
- ## Create a Disk
155
-
156
- Create a Disk in storage account. _disk_size_in_gb_ must be an integer and the range is [1, 1023].
157
- By default the disk will be created in the container 'vhds'. You can specify other container by set options[:container_name].
158
-
159
- ```ruby
160
- fog_storage_service.create_disk('<Data Disk Name>', disk_size_in_gb, options = {})
161
- ```
162
-
163
- ## Delete a Disk
164
-
165
- Delete a Disk from a storage account. Disk must be in unlocked state i.e detached from server (virtual machine) to successfully perform this action.
166
- By default the disk will be deleted from the container 'vhds'. You can specify other container by set options[:container_name].
167
-
168
- ```ruby
169
- fog_storage_service.delete_disk('<Data Disk Name>', options = {})
170
- ```
171
-
172
25
  ## Check Storage Container Existence
173
26
 
174
27
  ```ruby
@@ -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
 
@@ -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?
@@ -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,12 +12,11 @@ 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'
18
- # Azure Storage Disk requests
19
- request :delete_disk
20
- request :create_disk
21
20
  # Azure Storage Container requests
22
21
  request :create_container
23
22
  request :release_container_lease
@@ -58,7 +57,6 @@ module Fog
58
57
  request :put_blob_pages
59
58
  request :wait_blob_copy_operation_to_finish
60
59
  request :save_page_blob
61
- request :multipart_save_block_blob
62
60
 
63
61
  model_path 'fog/azurerm/models/storage'
64
62
  model :directory
@@ -70,8 +68,8 @@ module Fog
70
68
  class Mock
71
69
  def initialize(_options = {})
72
70
  begin
73
- require 'azure_mgmt_storage'
74
- require 'azure/storage'
71
+ require 'azure/storage/common'
72
+ require 'azure/storage/blob'
75
73
  rescue LoadError => e
76
74
  retry if require('rubygems')
77
75
  raise e.message
@@ -83,10 +81,9 @@ module Fog
83
81
  class Real
84
82
  def initialize(options)
85
83
  begin
86
- require 'azure_mgmt_storage'
87
- require 'azure/storage'
84
+ require 'azure/storage/common'
85
+ require 'azure/storage/blob'
88
86
  require 'securerandom'
89
- require 'vhd'
90
87
  @debug = ENV['DEBUG'] || options[:debug]
91
88
  require 'azure/core/http/debug_filter' if @debug
92
89
  rescue LoadError => e
@@ -110,15 +107,23 @@ module Fog
110
107
 
111
108
  @azure_storage_account_name = options[:azure_storage_account_name]
112
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
113
118
 
114
- azure_client = Azure::Storage::Client.create(storage_account_name: @azure_storage_account_name,
115
- storage_access_key: @azure_storage_access_key)
116
- azure_client.storage_blob_host = get_blob_endpoint(@azure_storage_account_name, true, @environment)
117
- @blob_client = azure_client.blob_client
118
- @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)
119
124
  @blob_client.with_filter(Azure::Core::Http::DebugFilter.new) if @debug
120
- @signature_client = Azure::Storage::Core::Auth::SharedAccessSignature.new(@azure_storage_account_name,
121
- @azure_storage_access_key)
125
+ @signature_client = Azure::Storage::Common::Core::Auth::SharedAccessSignature.new(@azure_storage_account_name,
126
+ @azure_storage_access_key)
122
127
  end
123
128
  end
124
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.6.0'.freeze
3
+ VERSION = '1.0.0'.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
@@ -25,6 +25,22 @@ class TestGetBlobHttpsUrl < Minitest::Test
25
25
  end
26
26
  end
27
27
 
28
+ def test_get_blob_https_url_with_domain_success
29
+ service = Fog::Storage::AzureRM.new(storage_account_credentials_with_domain)
30
+ blob_client = service.instance_variable_get(:@blob_client)
31
+ signature_client = service.instance_variable_get(:@signature_client)
32
+
33
+ url = 'https://mockaccount.test.example.com/test_container/test_blob'
34
+ token = ApiStub::Requests::Storage::File.blob_url_token
35
+
36
+ blob_client.stub :generate_uri, url do
37
+ signature_client.stub :generate_service_sas_token, token do
38
+ assert_equal "#{url}?#{token}", service.get_blob_https_url('test_container', 'test_blob', Time.now.utc + 3600)
39
+ assert_equal "#{url}?#{token}", service.get_object_url('test_container', 'test_blob', Time.now.utc + 3600)
40
+ end
41
+ end
42
+ end
43
+
28
44
  def test_get_blob_https_url_mock
29
45
  assert_equal "#{@url}?#{@token}", @mock_service.get_blob_https_url('test_container', 'test_blob', Time.now.utc + 3600)
30
46
  assert_equal "#{@url}?#{@token}", @mock_service.get_object_url('test_container', 'test_blob', Time.now.utc + 3600)
@@ -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
@@ -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.6.0
4
+ version: 1.0.0
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: 2020-10-04 00:00:00.000000000 Z
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
24
24
  name: codeclimate-test-reporter
@@ -54,28 +54,28 @@ dependencies:
54
54
  requirements:
55
55
  - - "~>"
56
56
  - !ruby/object:Gem::Version
57
- version: '10.0'
57
+ version: '13.0'
58
58
  type: :development
59
59
  prerelease: false
60
60
  version_requirements: !ruby/object:Gem::Requirement
61
61
  requirements:
62
62
  - - "~>"
63
63
  - !ruby/object:Gem::Version
64
- version: '10.0'
64
+ version: '13.0'
65
65
  - !ruby/object:Gem::Dependency
66
66
  name: rubocop
67
67
  requirement: !ruby/object:Gem::Requirement
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,33 +91,33 @@ dependencies:
91
91
  - !ruby/object:Gem::Version
92
92
  version: '0'
93
93
  - !ruby/object:Gem::Dependency
94
- name: azure_mgmt_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.21'
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.21'
106
+ version: '2.0'
107
107
  - !ruby/object:Gem::Dependency
108
- name: azure-storage
108
+ name: azure-storage-common
109
109
  requirement: !ruby/object:Gem::Requirement
110
110
  requirements:
111
111
  - - "~>"
112
112
  - !ruby/object:Gem::Version
113
- version: 0.15.0.preview
113
+ version: '2.0'
114
114
  type: :runtime
115
115
  prerelease: false
116
116
  version_requirements: !ruby/object:Gem::Requirement
117
117
  requirements:
118
118
  - - "~>"
119
119
  - !ruby/object:Gem::Version
120
- version: 0.15.0.preview
120
+ version: '2.0'
121
121
  - !ruby/object:Gem::Dependency
122
122
  name: fog-core
123
123
  requirement: !ruby/object:Gem::Requirement
@@ -150,30 +150,30 @@ dependencies:
150
150
  name: mime-types
151
151
  requirement: !ruby/object:Gem::Requirement
152
152
  requirements:
153
- - - "~>"
153
+ - - ">="
154
154
  - !ruby/object:Gem::Version
155
- version: 3.2.2
155
+ version: '0'
156
156
  type: :runtime
157
157
  prerelease: false
158
158
  version_requirements: !ruby/object:Gem::Requirement
159
159
  requirements:
160
- - - "~>"
160
+ - - ">="
161
161
  - !ruby/object:Gem::Version
162
- version: 3.2.2
162
+ version: '0'
163
163
  - !ruby/object:Gem::Dependency
164
- name: vhd
164
+ name: ms_rest_azure
165
165
  requirement: !ruby/object:Gem::Requirement
166
166
  requirements:
167
- - - '='
167
+ - - "~>"
168
168
  - !ruby/object:Gem::Version
169
- version: 0.0.4
169
+ version: 0.12.0
170
170
  type: :runtime
171
171
  prerelease: false
172
172
  version_requirements: !ruby/object:Gem::Requirement
173
173
  requirements:
174
- - - '='
174
+ - - "~>"
175
175
  - !ruby/object:Gem::Version
176
- version: 0.0.4
176
+ version: 0.12.0
177
177
  description: This is a stripped-down fork of fog-azure-rm that enables Azure Blob
178
178
  Storage to be used with CarrierWave and Fog.
179
179
  email:
@@ -233,12 +233,10 @@ files:
233
233
  - lib/fog/azurerm/requests/storage/copy_object.rb
234
234
  - lib/fog/azurerm/requests/storage/create_block_blob.rb
235
235
  - lib/fog/azurerm/requests/storage/create_container.rb
236
- - lib/fog/azurerm/requests/storage/create_disk.rb
237
236
  - lib/fog/azurerm/requests/storage/create_page_blob.rb
238
237
  - lib/fog/azurerm/requests/storage/delete_blob.rb
239
238
  - lib/fog/azurerm/requests/storage/delete_blob_https_url.rb
240
239
  - lib/fog/azurerm/requests/storage/delete_container.rb
241
- - lib/fog/azurerm/requests/storage/delete_disk.rb
242
240
  - lib/fog/azurerm/requests/storage/delete_object_url.rb
243
241
  - lib/fog/azurerm/requests/storage/get_blob.rb
244
242
  - lib/fog/azurerm/requests/storage/get_blob_http_url.rb
@@ -251,7 +249,6 @@ files:
251
249
  - lib/fog/azurerm/requests/storage/get_object_url.rb
252
250
  - lib/fog/azurerm/requests/storage/list_blobs.rb
253
251
  - lib/fog/azurerm/requests/storage/list_containers.rb
254
- - lib/fog/azurerm/requests/storage/multipart_save_block_blob.rb
255
252
  - lib/fog/azurerm/requests/storage/put_blob_block.rb
256
253
  - lib/fog/azurerm/requests/storage/put_blob_https_url.rb
257
254
  - lib/fog/azurerm/requests/storage/put_blob_metadata.rb
@@ -293,12 +290,10 @@ files:
293
290
  - test/requests/storage/test_copy_blob_from_uri.rb
294
291
  - test/requests/storage/test_create_block_blob.rb
295
292
  - test/requests/storage/test_create_container.rb
296
- - test/requests/storage/test_create_disk.rb
297
293
  - test/requests/storage/test_create_page_blob.rb
298
294
  - test/requests/storage/test_delete_blob.rb
299
295
  - test/requests/storage/test_delete_blob_https_url.rb
300
296
  - test/requests/storage/test_delete_container.rb
301
- - test/requests/storage/test_delete_disk.rb
302
297
  - test/requests/storage/test_get_blob.rb
303
298
  - test/requests/storage/test_get_blob_http_url.rb
304
299
  - test/requests/storage/test_get_blob_https_url.rb
@@ -309,7 +304,6 @@ files:
309
304
  - test/requests/storage/test_get_container_url.rb
310
305
  - test/requests/storage/test_list_blobs.rb
311
306
  - test/requests/storage/test_list_containers.rb
312
- - test/requests/storage/test_multipart_save_block_blob.rb
313
307
  - test/requests/storage/test_put_blob_block.rb
314
308
  - test/requests/storage/test_put_blob_https_url.rb
315
309
  - test/requests/storage/test_put_blob_metadata.rb
@@ -1,62 +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
- # Create a disk in Azure storage.
7
- #
8
- # @param disk_name [String] Name of disk
9
- # @param disk_size_in_gb [Integer] Disk size in GiB. Value range: [1, 1023]
10
- # @param options [Hash]
11
- # @option options [String] container_name Sets name of the container which contains the disk. Default is 'vhds'.
12
- #
13
- # @return [Boolean]
14
- #
15
- def create_disk(disk_name, disk_size_in_gb, options = {})
16
- msg = "Creating disk(#{disk_name}, #{disk_size_in_gb}). options: #{options}"
17
- Fog::Logger.debug msg
18
-
19
- raise ArgumentError, "disk_size_in_gb #{disk_size_in_gb} must be an integer" unless disk_size_in_gb.is_a?(Integer)
20
- raise ArgumentError, "Azure minimum disk size is 1 GiB: #{disk_size_in_gb}" if disk_size_in_gb < 1
21
- raise ArgumentError, "Azure maximum disk size is 1023 GiB: #{disk_size_in_gb}" if disk_size_in_gb > 1023
22
-
23
- container_name = options.delete(:container_name)
24
- container_name = 'vhds' if container_name.nil?
25
- blob_name = "#{disk_name}.vhd"
26
- vhd_size = disk_size_in_gb * 1024 * 1024 * 1024
27
- blob_size = vhd_size + 512
28
-
29
- opts = {
30
- type: :fixed,
31
- name: '/tmp/footer.vhd', # Only used to initialize vhd, no local file is generated.
32
- size: disk_size_in_gb
33
- }
34
- vhd_footer = Vhd::Library.new(opts).footer.values.join
35
-
36
- begin
37
- create_page_blob(container_name, blob_name, blob_size, options)
38
- put_blob_pages(container_name, blob_name, vhd_size, blob_size - 1, vhd_footer, options)
39
- rescue
40
- begin
41
- delete_blob(container_name, blob_name)
42
- rescue => ex
43
- Fog::Logger.debug "Cannot delete the blob: #{container_name}/#{blob_name} after create_disk failed. #{ex.inspect}"
44
- end
45
- raise
46
- end
47
-
48
- Fog::Logger.debug "Created a disk #{disk_name} successfully."
49
- true
50
- end
51
- end
52
-
53
- # This class provides the mock implementation for unit tests.
54
- class Mock
55
- def create_disk(*)
56
- Fog::Logger.debug 'Disk created successfully.'
57
- true
58
- end
59
- end
60
- end
61
- end
62
- end
@@ -1,36 +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
- # Delete a disk in Azure storage.
7
- #
8
- # @param disk_name [String] Name of disk
9
- # @param options [Hash]
10
- # @option options [String] container_name Sets name of the container which contains the disk. Default is 'vhds'.
11
- #
12
- # @return [Boolean]
13
- #
14
- def delete_disk(disk_name, options = {})
15
- msg = "Deleting disk(#{disk_name}). options: #{options}"
16
- Fog::Logger.debug msg
17
-
18
- container_name = options.delete(:container_name)
19
- container_name = 'vhds' if container_name.nil?
20
- delete_blob(container_name, "#{disk_name}.vhd")
21
-
22
- Fog::Logger.debug "Successfully deleted Disk: #{disk_name}."
23
- true
24
- end
25
- end
26
-
27
- # This class provides the mock implementation for unit tests.
28
- class Mock
29
- def delete_disk(*)
30
- Fog::Logger.debug 'Successfully deleted Disk'
31
- true
32
- end
33
- end
34
- end
35
- end
36
- end
@@ -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,70 +0,0 @@
1
- require File.expand_path '../../test_helper', __dir__
2
-
3
- # Storage Data Disk Class
4
- class TestCreateDisk < Minitest::Test
5
- # This class posesses the test cases for the request of create disk.
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_create_disk_success
16
- @service.stub :create_page_blob, true do
17
- @service.stub :put_blob_pages, true do
18
- assert @service.create_disk('test_disk', 10)
19
- end
20
- end
21
- end
22
-
23
- def test_create_disk_in_another_container_success
24
- @service.stub :create_page_blob, true do
25
- @service.stub :put_blob_pages, true do
26
- assert @service.create_disk('test_disk', 10, container_name: 'test_container')
27
- end
28
- end
29
- end
30
-
31
- def test_create_disk_with_invalid_size_exception
32
- assert_raises(ArgumentError) do
33
- @service.create_disk('test_disk', 'invalid_size')
34
- end
35
-
36
- assert_raises(ArgumentError) do
37
- @service.create_disk('test_disk', 0)
38
- end
39
-
40
- assert_raises(ArgumentError) do
41
- @service.create_disk('test_disk', 1024)
42
- end
43
- end
44
-
45
- def test_create_disk_http_exception
46
- http_exception = ->(*) { raise Azure::Core::Http::HTTPError.new(@mocked_response) }
47
- @service.stub :create_page_blob, http_exception do
48
- @service.stub :delete_blob, true do
49
- assert_raises(Azure::Core::Http::HTTPError) do
50
- @service.create_disk('test_disk', 10, container_name: 'test_container')
51
- end
52
- end
53
- end
54
- end
55
-
56
- def test_create_disk_fail_when_delete_blob_http_exception
57
- http_exception = ->(*) { raise Azure::Core::Http::HTTPError.new(@mocked_response) }
58
- @service.stub :create_page_blob, http_exception do
59
- @service.stub :delete_blob, http_exception do
60
- assert_raises(Azure::Core::Http::HTTPError) do
61
- @service.create_disk('test_disk', 10, container_name: 'test_container')
62
- end
63
- end
64
- end
65
- end
66
-
67
- def test_create_disk_mock
68
- assert @mock_service.create_disk('test_disk')
69
- end
70
- end
@@ -1,30 +0,0 @@
1
- require File.expand_path '../../test_helper', __dir__
2
-
3
- # Storage Data Disk Class
4
- class TestDeleteDisk < Minitest::Test
5
- # This class posesses the test cases for the requests of deleting data disks.
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_delete_disk_success
16
- @service.stub :delete_blob, true do
17
- assert @service.delete_disk('test_disk')
18
- end
19
- end
20
-
21
- def test_delete_disk_in_another_container_success
22
- @service.stub :delete_blob, true do
23
- assert @service.delete_disk('test_disk', container_name: 'test_container')
24
- end
25
- end
26
-
27
- def test_delete_disk_mock
28
- assert @mock_service.delete_disk('test_disk')
29
- end
30
- 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