gitlab-fog-azure-rm 1.3.0 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/lib/fog/azurerm/config.rb +5 -1
- data/lib/fog/azurerm/constants.rb +67 -63
- data/lib/fog/azurerm/models/storage/directories.rb +2 -0
- data/lib/fog/azurerm/models/storage/directory.rb +2 -0
- data/lib/fog/azurerm/models/storage/file.rb +2 -0
- data/lib/fog/azurerm/models/storage/files.rb +2 -0
- data/lib/fog/azurerm/requests/storage/delete_object.rb +20 -0
- data/lib/fog/azurerm/requests/storage/save_page_blob.rb +3 -3
- data/lib/fog/azurerm/requests/storage/wait_blob_copy_operation_to_finish.rb +3 -3
- data/lib/fog/azurerm/storage.rb +4 -1
- data/lib/fog/azurerm/utilities/general.rb +174 -165
- data/lib/fog/azurerm/version.rb +1 -1
- data/test/api_stub/requests/storage/file.rb +4 -4
- data/test/requests/storage/test_delete_object.rb +42 -0
- data/test/requests/storage/test_get_blob_url.rb +6 -6
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bce981ede9f77d01f6cfabd05f9b7bb77aff52a15ade7ac87ed441880178858f
|
4
|
+
data.tar.gz: e3b730ce6e3aa6ea507ab5352dbb0e3e56416abf5624fa763a4932e858efe649
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9d42e20bed0c4b5c53757098ac751555c126dec547b19c133b7e130bba1c20ca1ca2b3cf1d4976391b0a06a66daaa268dba9a0b38eeb7a6258a187c78aa66e2
|
7
|
+
data.tar.gz: 88480526e3e2f0565fc3c24009a09bf482c721c9f14dacd39a5d2ecfdbfe909498a798ebbff8f7745df348c3f251fc69c20a1bcddff0090cd5e9becbe2a15378
|
data/CHANGELOG.md
CHANGED
data/lib/fog/azurerm/config.rb
CHANGED
@@ -1,72 +1,76 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
1
|
+
module Fog
|
2
|
+
module AzureRM
|
3
|
+
AZURE_RESOURCE = 'https://management.azure.com'.freeze
|
4
|
+
DEFAULT_ADDRESS_PREFIXES = ['10.2.0.0/16'].freeze
|
5
|
+
SUBNET = 'Subnet'.freeze
|
6
|
+
PUBLIC_IP = 'Public-IP-Address'.freeze
|
7
|
+
NETWORK_SECURITY_GROUP = 'Network-Security-Group'.freeze
|
8
|
+
STANDARD_STORAGE = 'Standard'.freeze
|
9
|
+
PREMIUM_STORAGE = 'Premium'.freeze
|
10
|
+
ALLOWED_STANDARD_REPLICATION = %w[LRS ZRS GRS RAGRS].freeze
|
11
|
+
API_VERSION = '2016-06-01'.freeze
|
12
|
+
FAULT_DOMAIN_COUNT = 2
|
13
|
+
UPDATE_DOMAIN_COUNT = 5
|
14
|
+
WINDOWS = 'windows'.freeze
|
15
|
+
VPN = 'Vpn'.freeze
|
16
|
+
MICROSOFT_PEERING = 'MicrosoftPeering'.freeze
|
17
|
+
RESOURCE_GROUP_NAME = 4
|
18
|
+
RESOURCE_PROVIDER_NAMESPACE = 6
|
19
|
+
RESOURCE_TYPE = 7
|
20
|
+
RESOURCE_NAME = 8
|
21
|
+
ENDPOINT_PREFIX = 'Microsoft.Network/trafficManagerProfiles'.freeze
|
22
|
+
DISK_PREFIX = 'Microsoft.Compute/disks'.freeze
|
23
|
+
SNAPSHOT_PREFIX = 'Microsoft.Compute/snapshots'.freeze
|
24
|
+
AZURE_ENDPOINTS = 'azureEndpoints'.freeze
|
25
|
+
EXTERNAL_ENDPOINTS = 'externalEndpoints'.freeze
|
26
|
+
NESTED_ENDPOINTS = 'nestedEndpoints'.freeze
|
27
|
+
GLOBAL = 'global'.freeze
|
28
|
+
UPLOAD_BLOB_WORKER_THREAD_COUNT = 8
|
29
|
+
VM_NAME_POSITION = 8
|
30
|
+
PRIMARY_NIC_INDEX = 0
|
29
31
|
|
30
|
-
ENVIRONMENT_AZURE_CLOUD = 'AzureCloud'.freeze
|
31
|
-
ENVIRONMENT_AZURE_CHINA_CLOUD = 'AzureChinaCloud'.freeze
|
32
|
-
ENVIRONMENT_AZURE_US_GOVERNMENT = 'AzureUSGovernment'.freeze
|
33
|
-
ENVIRONMENT_AZURE_GERMAN_CLOUD = 'AzureGermanCloud'.freeze
|
32
|
+
ENVIRONMENT_AZURE_CLOUD = 'AzureCloud'.freeze
|
33
|
+
ENVIRONMENT_AZURE_CHINA_CLOUD = 'AzureChinaCloud'.freeze
|
34
|
+
ENVIRONMENT_AZURE_US_GOVERNMENT = 'AzureUSGovernment'.freeze
|
35
|
+
ENVIRONMENT_AZURE_GERMAN_CLOUD = 'AzureGermanCloud'.freeze
|
34
36
|
|
35
|
-
# MsRestAzure::AzureOperationError class Error Codes
|
36
|
-
ERROR_CODE_RESOURCE_NOT_FOUND = 'ResourceNotFound'.freeze
|
37
|
-
ERROR_CODE_NOT_FOUND = 'NotFound'.freeze
|
38
|
-
ERROR_CODE_RESOURCE_GROUP_NOT_FOUND = 'ResourceGroupNotFound'.freeze
|
39
|
-
ERROR_CODE_PARENT_RESOURCE_NOT_FOUND = 'ParentResourceNotFound'.freeze
|
37
|
+
# MsRestAzure::AzureOperationError class Error Codes
|
38
|
+
ERROR_CODE_RESOURCE_NOT_FOUND = 'ResourceNotFound'.freeze
|
39
|
+
ERROR_CODE_NOT_FOUND = 'NotFound'.freeze
|
40
|
+
ERROR_CODE_RESOURCE_GROUP_NOT_FOUND = 'ResourceGroupNotFound'.freeze
|
41
|
+
ERROR_CODE_PARENT_RESOURCE_NOT_FOUND = 'ParentResourceNotFound'.freeze
|
40
42
|
|
41
|
-
PLATFORM_LINUX = 'linux'.freeze
|
43
|
+
PLATFORM_LINUX = 'linux'.freeze
|
42
44
|
|
43
|
-
# State of the copy operation
|
44
|
-
COPY_STATUS =
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
45
|
+
# State of the copy operation
|
46
|
+
COPY_STATUS =
|
47
|
+
{
|
48
|
+
# The copy completed successfully.
|
49
|
+
SUCCESS: 'success',
|
50
|
+
# The copy is in progress
|
51
|
+
PENDING: 'pending'
|
52
|
+
}.freeze
|
51
53
|
|
52
|
-
# https://msdn.microsoft.com/en-us/library/azure/dd179451.aspx
|
53
|
-
# The maximum size for a block blob created via Put Blob is 64 MB. But for better performance, this size should be 32 MB.
|
54
|
-
# If your blob is larger than 32 MB, you must upload it as a set of blocks.
|
55
|
-
SINGLE_BLOB_PUT_THRESHOLD = 32 * 1024 * 1024
|
54
|
+
# https://msdn.microsoft.com/en-us/library/azure/dd179451.aspx
|
55
|
+
# The maximum size for a block blob created via Put Blob is 64 MB. But for better performance, this size should be 32 MB.
|
56
|
+
# If your blob is larger than 32 MB, you must upload it as a set of blocks.
|
57
|
+
SINGLE_BLOB_PUT_THRESHOLD = 32 * 1024 * 1024
|
56
58
|
|
57
|
-
# Block blob: https://msdn.microsoft.com/en-us/library/azure/dd135726.aspx
|
58
|
-
# Page blob: https://msdn.microsoft.com/en-us/library/azure/ee691975.aspx
|
59
|
-
# Each block/page can be a different size, up to a maximum of 4 MB
|
60
|
-
MAXIMUM_CHUNK_SIZE = 4 * 1024 * 1024
|
59
|
+
# Block blob: https://msdn.microsoft.com/en-us/library/azure/dd135726.aspx
|
60
|
+
# Page blob: https://msdn.microsoft.com/en-us/library/azure/ee691975.aspx
|
61
|
+
# Each block/page can be a different size, up to a maximum of 4 MB
|
62
|
+
MAXIMUM_CHUNK_SIZE = 4 * 1024 * 1024
|
61
63
|
|
62
|
-
# The hash value of 4MB empty content
|
63
|
-
HASH_OF_4MB_EMPTY_CONTENT = 'b5cfa9d6c8febd618f91ac2843d50a1c'.freeze
|
64
|
-
REST_CLIENT_API_VERSION = %w[2014-04-01-preview 2016-05-01].freeze
|
65
|
-
AS_SKU_CLASSIC = 'Classic'.freeze
|
66
|
-
AS_SKU_ALIGNED = 'Aligned'.freeze
|
64
|
+
# The hash value of 4MB empty content
|
65
|
+
HASH_OF_4MB_EMPTY_CONTENT = 'b5cfa9d6c8febd618f91ac2843d50a1c'.freeze
|
66
|
+
REST_CLIENT_API_VERSION = %w[2014-04-01-preview 2016-05-01].freeze
|
67
|
+
AS_SKU_CLASSIC = 'Classic'.freeze
|
68
|
+
AS_SKU_ALIGNED = 'Aligned'.freeze
|
67
69
|
|
68
|
-
# The tag key and tag value for creating a temporary storage account for generalized image
|
69
|
-
TEMPORARY_STORAGE_ACCOUNT_TAG_KEY = 'generalized_image'.freeze
|
70
|
-
TEMPORARY_STORAGE_ACCOUNT_TAG_VALUE = 'delete'.freeze
|
70
|
+
# The tag key and tag value for creating a temporary storage account for generalized image
|
71
|
+
TEMPORARY_STORAGE_ACCOUNT_TAG_KEY = 'generalized_image'.freeze
|
72
|
+
TEMPORARY_STORAGE_ACCOUNT_TAG_VALUE = 'delete'.freeze
|
71
73
|
|
72
|
-
HTTP_NOT_FOUND = 404
|
74
|
+
HTTP_NOT_FOUND = 404
|
75
|
+
end
|
76
|
+
end
|
@@ -3,6 +3,8 @@ module Fog
|
|
3
3
|
class AzureRM
|
4
4
|
# This class is giving implementation of listing containers.
|
5
5
|
class Directories < Fog::Collection
|
6
|
+
include Fog::AzureRM::Utilities::General
|
7
|
+
|
6
8
|
model Fog::Storage::AzureRM::Directory
|
7
9
|
|
8
10
|
# List all directories(containers) in the storage account.
|
@@ -3,6 +3,8 @@ module Fog
|
|
3
3
|
class AzureRM
|
4
4
|
# This class is giving implementation of listing blobs.
|
5
5
|
class Files < Fog::Collection
|
6
|
+
include Fog::AzureRM::Utilities::General
|
7
|
+
|
6
8
|
attribute :directory
|
7
9
|
attribute :delimiter, aliases: 'Delimiter'
|
8
10
|
attribute :marker, aliases: 'Marker'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Fog
|
2
|
+
module Storage
|
3
|
+
class AzureRM
|
4
|
+
# This class provides the actual implementation for service calls.
|
5
|
+
class Real
|
6
|
+
def delete_object(container_name, blob_name)
|
7
|
+
delete_blob(container_name, blob_name)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# This class provides the mock implementation for unit tests.
|
12
|
+
class Mock
|
13
|
+
def delete_object(*)
|
14
|
+
Fog::Logger.debug 'Blob deleted successfully.'
|
15
|
+
true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -56,7 +56,7 @@ module Fog
|
|
56
56
|
|
57
57
|
def save_page_blob(container_name, blob_name, body, options)
|
58
58
|
threads_num = options.delete(:worker_thread_num)
|
59
|
-
threads_num = UPLOAD_BLOB_WORKER_THREAD_COUNT if threads_num.nil? || !threads_num.is_a?(Integer) || threads_num < 1
|
59
|
+
threads_num = Fog::AzureRM::UPLOAD_BLOB_WORKER_THREAD_COUNT if threads_num.nil? || !threads_num.is_a?(Integer) || threads_num < 1
|
60
60
|
|
61
61
|
begin
|
62
62
|
blob_size = Fog::Storage.get_body_size(body)
|
@@ -74,9 +74,9 @@ module Fog
|
|
74
74
|
threads_num.times do |id|
|
75
75
|
thread = Thread.new do
|
76
76
|
Fog::Logger.debug "Created upload thread #{id}."
|
77
|
-
while (chunk = iostream.read(MAXIMUM_CHUNK_SIZE))
|
77
|
+
while (chunk = iostream.read(Fog::AzureRM::MAXIMUM_CHUNK_SIZE))
|
78
78
|
Fog::Logger.debug "Upload thread #{id} is uploading #{chunk.id}, start_range: #{chunk.start_range}, size: #{chunk.data.size}."
|
79
|
-
put_blob_pages(container_name, blob_name, chunk.start_range, chunk.end_range, chunk.data, options) if Digest::MD5.hexdigest(chunk.data) != HASH_OF_4MB_EMPTY_CONTENT
|
79
|
+
put_blob_pages(container_name, blob_name, chunk.start_range, chunk.end_range, chunk.data, options) if Digest::MD5.hexdigest(chunk.data) != Fog::AzureRM::HASH_OF_4MB_EMPTY_CONTENT
|
80
80
|
end
|
81
81
|
Fog::Logger.debug "Upload thread #{id} finished."
|
82
82
|
end
|
@@ -6,7 +6,7 @@ module Fog
|
|
6
6
|
def wait_blob_copy_operation_to_finish(container_name, blob_name, copy_id, copy_status, timeout = nil)
|
7
7
|
begin
|
8
8
|
start_time = Time.new
|
9
|
-
while copy_status == COPY_STATUS[:PENDING]
|
9
|
+
while copy_status == Fog::AzureRM::COPY_STATUS[:PENDING]
|
10
10
|
blob = get_blob_properties(container_name, blob_name)
|
11
11
|
blob_props = blob.properties
|
12
12
|
if !copy_id.nil? && blob_props[:copy_id] != copy_id
|
@@ -15,7 +15,7 @@ module Fog
|
|
15
15
|
|
16
16
|
copy_status_description = blob_props[:copy_status_description]
|
17
17
|
copy_status = blob_props[:copy_status]
|
18
|
-
break if copy_status != COPY_STATUS[:PENDING]
|
18
|
+
break if copy_status != Fog::AzureRM::COPY_STATUS[:PENDING]
|
19
19
|
|
20
20
|
elapse_time = Time.new - start_time
|
21
21
|
raise Timeout::Error.new("The copy operation cannot be finished in #{timeout} seconds") if !timeout.nil? && elapse_time >= timeout
|
@@ -27,7 +27,7 @@ module Fog
|
|
27
27
|
sleep(interval)
|
28
28
|
end
|
29
29
|
|
30
|
-
if copy_status != COPY_STATUS[:SUCCESS]
|
30
|
+
if copy_status != Fog::AzureRM::COPY_STATUS[:SUCCESS]
|
31
31
|
raise "Failed to copy to #{container_name}/#{blob_name}: \n\tcopy status: #{copy_status}\n\tcopy description: #{copy_status_description}"
|
32
32
|
end
|
33
33
|
rescue
|
data/lib/fog/azurerm/storage.rb
CHANGED
@@ -40,7 +40,6 @@ module Fog
|
|
40
40
|
request :compare_container_blobs
|
41
41
|
request :acquire_blob_lease
|
42
42
|
request :release_blob_lease
|
43
|
-
request :delete_blob
|
44
43
|
request :get_blob
|
45
44
|
request :get_blob_url
|
46
45
|
request :get_object_url
|
@@ -50,8 +49,10 @@ module Fog
|
|
50
49
|
request :put_blob_block
|
51
50
|
request :put_blob_https_url
|
52
51
|
request :put_object_url
|
52
|
+
request :delete_blob
|
53
53
|
request :delete_blob_https_url
|
54
54
|
request :delete_object_url
|
55
|
+
request :delete_object
|
55
56
|
request :commit_blob_blocks
|
56
57
|
request :create_page_blob
|
57
58
|
request :put_blob_pages
|
@@ -79,6 +80,8 @@ module Fog
|
|
79
80
|
|
80
81
|
# This class provides the actual implementation for service calls.
|
81
82
|
class Real
|
83
|
+
include Fog::AzureRM::Utilities::General
|
84
|
+
|
82
85
|
def initialize(options)
|
83
86
|
begin
|
84
87
|
require 'azure/storage/common'
|
@@ -1,195 +1,204 @@
|
|
1
1
|
require File.expand_path('../../custom_fog_errors.rb', __FILE__)
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
# Pick
|
9
|
-
def
|
10
|
-
|
11
|
-
end
|
3
|
+
module Fog
|
4
|
+
module AzureRM
|
5
|
+
module Utilities
|
6
|
+
# General utilities mixin.
|
7
|
+
module General # rubocop:disable Metrics/ModuleLength
|
8
|
+
# Pick Resource Group name from Azure Resource Id(String)
|
9
|
+
def get_resource_group_from_id(id)
|
10
|
+
id.split('/')[4]
|
11
|
+
end
|
12
12
|
|
13
|
-
# Pick Virtual
|
14
|
-
def
|
15
|
-
|
16
|
-
end
|
13
|
+
# Pick Virtual Network name from Subnet Resource Id(String)
|
14
|
+
def get_virtual_network_from_id(subnet_id)
|
15
|
+
subnet_id.split('/')[8]
|
16
|
+
end
|
17
17
|
|
18
|
-
#
|
19
|
-
def
|
20
|
-
|
21
|
-
end
|
18
|
+
# Pick Virtual Machine name from Virtual Machine Extension Id(String)
|
19
|
+
def get_virtual_machine_from_id(vme_id)
|
20
|
+
vme_id.split('/')[VM_NAME_POSITION]
|
21
|
+
end
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
# Extract Endpoint type from (String)
|
24
|
+
def get_end_point_type(endpoint_type)
|
25
|
+
endpoint_type.split('/')[2]
|
26
|
+
end
|
26
27
|
|
27
|
-
def
|
28
|
-
|
29
|
-
end
|
28
|
+
def get_record_set_from_id(id)
|
29
|
+
id.split('/')[8]
|
30
|
+
end
|
30
31
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
hash
|
35
|
-
end
|
32
|
+
def get_type_from_recordset_type(type)
|
33
|
+
type.split('/')[2]
|
34
|
+
end
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
36
|
+
def get_hash_from_object(object)
|
37
|
+
hash = {}
|
38
|
+
object.instance_variables.each { |attr| hash[attr.to_s.delete('@')] = object.instance_variable_get(attr) }
|
39
|
+
hash
|
40
|
+
end
|
41
41
|
|
42
|
-
#
|
43
|
-
def
|
44
|
-
|
45
|
-
end
|
42
|
+
# Extract Traffic Manager Profile Name from Endpoint id(String)
|
43
|
+
def get_traffic_manager_profile_name_from_endpoint_id(endpoint_id)
|
44
|
+
endpoint_id.split('/')[8]
|
45
|
+
end
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
# Pick Express Route Circuit name from Id(String)
|
48
|
+
def get_circuit_name_from_id(circuit_id)
|
49
|
+
circuit_id.split('/')[8]
|
50
|
+
end
|
50
51
|
|
51
|
-
def
|
52
|
-
|
53
|
-
|
52
|
+
def get_record_type(type)
|
53
|
+
type.split('/').last
|
54
|
+
end
|
54
55
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end
|
56
|
+
def raise_azure_exception(exception, msg)
|
57
|
+
raise Fog::AzureRM::CustomAzureCoreHttpError.new(exception) if exception.is_a?(Azure::Core::Http::HTTPError)
|
58
|
+
raise exception unless exception.is_a?(MsRestAzure::AzureOperationError)
|
59
59
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end
|
60
|
+
azure_operation_error = Fog::AzureRM::CustomAzureOperationError.new(msg, exception)
|
61
|
+
azure_operation_error.print_subscription_limits_information if !azure_operation_error.request.nil? && !azure_operation_error.response.nil?
|
62
|
+
raise azure_operation_error
|
63
|
+
end
|
65
64
|
|
66
|
-
|
67
|
-
|
65
|
+
# Make sure if input_params(Hash) contains all keys present in required_params(Array)
|
66
|
+
def validate_params(required_params, input_params)
|
67
|
+
missing_params = required_params.select { |param| param unless input_params.key?(param) }
|
68
|
+
raise(ArgumentError, "Missing Parameters: #{missing_params.join(', ')} required for this operation") if missing_params.any?
|
69
|
+
end
|
68
70
|
|
69
|
-
|
71
|
+
def get_resource_from_resource_id(resource_id, position)
|
72
|
+
data = resource_id.split('/') unless resource_id.nil?
|
70
73
|
|
71
|
-
|
72
|
-
end
|
74
|
+
raise 'Invalid Resource ID' if data.count < 9 && data.count != 5
|
73
75
|
|
74
|
-
|
75
|
-
|
76
|
-
end
|
76
|
+
data[position]
|
77
|
+
end
|
77
78
|
|
78
|
-
def
|
79
|
-
|
80
|
-
|
81
|
-
MsRestAzure::ActiveDirectoryServiceSettings.get_azure_china_settings
|
82
|
-
when ENVIRONMENT_AZURE_US_GOVERNMENT
|
83
|
-
MsRestAzure::ActiveDirectoryServiceSettings.get_azure_us_government_settings
|
84
|
-
when ENVIRONMENT_AZURE_GERMAN_CLOUD
|
85
|
-
MsRestAzure::ActiveDirectoryServiceSettings.get_azure_german_settings
|
86
|
-
else
|
87
|
-
MsRestAzure::ActiveDirectoryServiceSettings.get_azure_settings
|
88
|
-
end
|
89
|
-
end
|
79
|
+
def random_string(length)
|
80
|
+
(0...length).map { ('a'..'z').to_a[rand(26)] }.join
|
81
|
+
end
|
90
82
|
|
91
|
-
def
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
end
|
83
|
+
def active_directory_service_settings(environment = ENVIRONMENT_AZURE_CLOUD)
|
84
|
+
case environment
|
85
|
+
when ENVIRONMENT_AZURE_CHINA_CLOUD
|
86
|
+
MsRestAzure::ActiveDirectoryServiceSettings.get_azure_china_settings
|
87
|
+
when ENVIRONMENT_AZURE_US_GOVERNMENT
|
88
|
+
MsRestAzure::ActiveDirectoryServiceSettings.get_azure_us_government_settings
|
89
|
+
when ENVIRONMENT_AZURE_GERMAN_CLOUD
|
90
|
+
MsRestAzure::ActiveDirectoryServiceSettings.get_azure_german_settings
|
91
|
+
else
|
92
|
+
MsRestAzure::ActiveDirectoryServiceSettings.get_azure_settings
|
93
|
+
end
|
94
|
+
end
|
103
95
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
'.core.cloudapi.de'
|
117
|
-
else
|
118
|
-
# MsRestAzure::AzureEnvironments::Azure.storage_endpoint_suffix
|
119
|
-
'.core.windows.net'
|
120
|
-
end
|
121
|
-
end
|
96
|
+
def resource_manager_endpoint_url(environment = ENVIRONMENT_AZURE_CLOUD)
|
97
|
+
case environment
|
98
|
+
when ENVIRONMENT_AZURE_CHINA_CLOUD
|
99
|
+
MsRestAzure::AzureEnvironments::ChinaCloud.resource_manager_endpoint_url
|
100
|
+
when ENVIRONMENT_AZURE_US_GOVERNMENT
|
101
|
+
MsRestAzure::AzureEnvironments::USGovernment.resource_manager_endpoint_url
|
102
|
+
when ENVIRONMENT_AZURE_GERMAN_CLOUD
|
103
|
+
MsRestAzure::AzureEnvironments::GermanCloud.resource_manager_endpoint_url
|
104
|
+
else
|
105
|
+
MsRestAzure::AzureEnvironments::AzureCloud.resource_manager_endpoint_url
|
106
|
+
end
|
107
|
+
end
|
122
108
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
109
|
+
# storage_endpoint_suffix is nil in ms_rest_azure 0.6.2
|
110
|
+
# Reference the issue: https://github.com/Azure/azure-sdk-for-ruby/issues/603
|
111
|
+
def storage_endpoint_suffix(environment = ENVIRONMENT_AZURE_CLOUD)
|
112
|
+
case environment
|
113
|
+
when ENVIRONMENT_AZURE_CHINA_CLOUD
|
114
|
+
# MsRestAzure::AzureEnvironments::AzureChina.storage_endpoint_suffix
|
115
|
+
'.core.chinacloudapi.cn'
|
116
|
+
when ENVIRONMENT_AZURE_US_GOVERNMENT
|
117
|
+
# MsRestAzure::AzureEnvironments::AzureUSGovernment.storage_endpoint_suffix
|
118
|
+
'.core.usgovcloudapi.net'
|
119
|
+
when ENVIRONMENT_AZURE_GERMAN_CLOUD
|
120
|
+
# MsRestAzure::AzureEnvironments::AzureGermanCloud.storage_endpoint_suffix
|
121
|
+
'.core.cloudapi.de'
|
122
|
+
else
|
123
|
+
# MsRestAzure::AzureEnvironments::Azure.storage_endpoint_suffix
|
124
|
+
'.core.windows.net'
|
125
|
+
end
|
126
|
+
end
|
127
127
|
|
128
|
-
def
|
129
|
-
|
130
|
-
|
131
|
-
end
|
128
|
+
def get_blob_endpoint(storage_account_name, enable_https = false, environment = ENVIRONMENT_AZURE_CLOUD)
|
129
|
+
protocol = enable_https ? 'https' : 'http'
|
130
|
+
"#{protocol}://#{storage_account_name}.blob#{storage_endpoint_suffix(environment)}"
|
131
|
+
end
|
132
132
|
|
133
|
-
def
|
134
|
-
|
135
|
-
|
136
|
-
end
|
133
|
+
def get_blob_endpoint_with_domain(storage_account_name, enable_https = false, domain = 'blob.core.windows.net')
|
134
|
+
protocol = enable_https ? 'https' : 'http'
|
135
|
+
"#{protocol}://#{storage_account_name}.#{domain}"
|
136
|
+
end
|
137
137
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
object.each do |k, v|
|
143
|
-
if k == 'properties'
|
144
|
-
v.each do |j, l|
|
145
|
-
data[j] = l
|
146
|
-
end
|
147
|
-
else
|
148
|
-
data[k] = v
|
149
|
-
end
|
150
|
-
end
|
151
|
-
else
|
152
|
-
object.instance_variables.each do |p|
|
153
|
-
kname = p.to_s.delete('@')
|
154
|
-
if kname == 'properties'
|
155
|
-
properties = object.instance_variable_get(p)
|
156
|
-
properties.each do |k, v|
|
157
|
-
data[k.to_s] = v
|
158
|
-
end
|
159
|
-
else
|
160
|
-
data[kname] = object.instance_variable_get(p)
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
138
|
+
def current_time
|
139
|
+
time = Time.now.to_f.to_s
|
140
|
+
time.split(/\W+/).join
|
141
|
+
end
|
164
142
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
143
|
+
# Parse storage blob/container to a hash
|
144
|
+
def parse_storage_object(object)
|
145
|
+
data = {}
|
146
|
+
if object.is_a? Hash
|
147
|
+
object.each do |k, v|
|
148
|
+
if k == 'properties'
|
149
|
+
v.each do |j, l|
|
150
|
+
data[j] = l
|
151
|
+
end
|
152
|
+
else
|
153
|
+
data[k] = v
|
154
|
+
end
|
155
|
+
end
|
156
|
+
else
|
157
|
+
object.instance_variables.each do |p|
|
158
|
+
kname = p.to_s.delete('@')
|
159
|
+
if kname == 'properties'
|
160
|
+
properties = object.instance_variable_get(p)
|
161
|
+
properties.each do |k, v|
|
162
|
+
data[k.to_s] = v
|
163
|
+
end
|
164
|
+
else
|
165
|
+
data[kname] = object.instance_variable_get(p)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
data['last_modified'] = Time.parse(data['last_modified'])
|
171
|
+
data['etag'].delete!('"')
|
172
|
+
data
|
173
|
+
end
|
169
174
|
|
170
|
-
def resource_not_found?(azure_operation_error)
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
end
|
175
|
+
def resource_not_found?(azure_operation_error)
|
176
|
+
is_found = false
|
177
|
+
if azure_operation_error.response.status == HTTP_NOT_FOUND
|
178
|
+
if azure_operation_error.body['code']
|
179
|
+
is_found = azure_operation_error.body['code'] == ERROR_CODE_NOT_FOUND
|
180
|
+
elsif azure_operation_error.body['error']
|
181
|
+
is_found = azure_operation_error.body['error']['code'] == ERROR_CODE_NOT_FOUND ||
|
182
|
+
azure_operation_error.body['error']['code'] == ERROR_CODE_RESOURCE_GROUP_NOT_FOUND ||
|
183
|
+
azure_operation_error.body['error']['code'] == ERROR_CODE_RESOURCE_NOT_FOUND ||
|
184
|
+
azure_operation_error.body['error']['code'] == ERROR_CODE_PARENT_RESOURCE_NOT_FOUND
|
185
|
+
end
|
186
|
+
end
|
187
|
+
is_found
|
188
|
+
end
|
184
189
|
|
185
|
-
def get_image_name(id)
|
186
|
-
|
187
|
-
end
|
190
|
+
def get_image_name(id)
|
191
|
+
id.split('/').last
|
192
|
+
end
|
188
193
|
|
189
|
-
def get_subscription_id(id)
|
190
|
-
|
191
|
-
end
|
194
|
+
def get_subscription_id(id)
|
195
|
+
id.split('/')[2]
|
196
|
+
end
|
192
197
|
|
193
|
-
def remove_trailing_periods_from_path_segments(path)
|
194
|
-
|
198
|
+
def remove_trailing_periods_from_path_segments(path)
|
199
|
+
path.split('/').map { |segment| segment.gsub(/\.*$/, '') }.join('/')
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
195
204
|
end
|
data/lib/fog/azurerm/version.rb
CHANGED
@@ -43,13 +43,13 @@ module ApiStub
|
|
43
43
|
}
|
44
44
|
end
|
45
45
|
|
46
|
-
def self.blob_https_url(environment = ENVIRONMENT_AZURE_CLOUD)
|
46
|
+
def self.blob_https_url(environment = Fog::AzureRM::ENVIRONMENT_AZURE_CLOUD)
|
47
47
|
case environment
|
48
|
-
when ENVIRONMENT_AZURE_CHINA_CLOUD
|
48
|
+
when Fog::AzureRM::ENVIRONMENT_AZURE_CHINA_CLOUD
|
49
49
|
'https://sa.blob.core.chinacloudapi.cn/test_container/test_blob'
|
50
|
-
when ENVIRONMENT_AZURE_US_GOVERNMENT
|
50
|
+
when Fog::AzureRM::ENVIRONMENT_AZURE_US_GOVERNMENT
|
51
51
|
'https://sa.blob.core.usgovcloudapi.net/test_container/test_blob'
|
52
|
-
when ENVIRONMENT_AZURE_GERMAN_CLOUD
|
52
|
+
when Fog::AzureRM::ENVIRONMENT_AZURE_GERMAN_CLOUD
|
53
53
|
'https://sa.blob.core.cloudapi.de/test_container/test_blob'
|
54
54
|
else
|
55
55
|
'https://sa.blob.core.windows.net/test_container/test_blob'
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.expand_path '../../test_helper', __dir__
|
2
|
+
|
3
|
+
# Storage Blob Class
|
4
|
+
class TestDeleteObject < Minitest::Test
|
5
|
+
# This class posesses the test cases for the requests of deleting storage blobs.
|
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
|
+
@mocked_not_found_response = mocked_storage_http_not_found_error
|
12
|
+
|
13
|
+
@service = Fog::Storage::AzureRM.new(storage_account_credentials)
|
14
|
+
@blob_client = @service.instance_variable_get(:@blob_client)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_delete_object_success
|
18
|
+
@blob_client.stub :delete_blob, true do
|
19
|
+
assert @service.delete_object('test_container', 'test_blob')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_delete_object_with_not_found_success
|
24
|
+
http_exception = ->(*) { raise Azure::Core::Http::HTTPError.new(@mocked_not_found_response) }
|
25
|
+
@blob_client.stub :delete_blob, http_exception do
|
26
|
+
assert @service.delete_object('test_container', 'test_blob')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_delete_object_http_exception
|
31
|
+
http_exception = ->(*) { raise Azure::Core::Http::HTTPError.new(@mocked_response) }
|
32
|
+
@blob_client.stub :delete_blob, http_exception do
|
33
|
+
assert_raises(Azure::Core::Http::HTTPError) do
|
34
|
+
@service.delete_object('test_container', 'test_blob')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_delete_object_mock
|
40
|
+
assert @mock_service.delete_blob('test_container', 'test_blob')
|
41
|
+
end
|
42
|
+
end
|
@@ -28,10 +28,10 @@ class TestGetBlobUrl < Minitest::Test
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def test_get_blob_url_for_china_success
|
31
|
-
china_storage_account_credentials = storage_account_credentials.merge(environment: ENVIRONMENT_AZURE_CHINA_CLOUD)
|
31
|
+
china_storage_account_credentials = storage_account_credentials.merge(environment: Fog::AzureRM::ENVIRONMENT_AZURE_CHINA_CLOUD)
|
32
32
|
service = Fog::Storage::AzureRM.new(china_storage_account_credentials)
|
33
33
|
blob_client = service.instance_variable_get(:@blob_client)
|
34
|
-
url = ApiStub::Requests::Storage::File.blob_https_url(ENVIRONMENT_AZURE_CHINA_CLOUD)
|
34
|
+
url = ApiStub::Requests::Storage::File.blob_https_url(Fog::AzureRM::ENVIRONMENT_AZURE_CHINA_CLOUD)
|
35
35
|
|
36
36
|
blob_client.stub :generate_uri, url do
|
37
37
|
assert_equal url, service.get_blob_url('test_container', 'test_blob')
|
@@ -42,10 +42,10 @@ class TestGetBlobUrl < Minitest::Test
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def test_get_blob_url_for_us_success
|
45
|
-
us_storage_account_credentials = storage_account_credentials.merge(environment: ENVIRONMENT_AZURE_US_GOVERNMENT)
|
45
|
+
us_storage_account_credentials = storage_account_credentials.merge(environment: Fog::AzureRM::ENVIRONMENT_AZURE_US_GOVERNMENT)
|
46
46
|
service = Fog::Storage::AzureRM.new(us_storage_account_credentials)
|
47
47
|
blob_client = service.instance_variable_get(:@blob_client)
|
48
|
-
url = ApiStub::Requests::Storage::File.blob_https_url(ENVIRONMENT_AZURE_US_GOVERNMENT)
|
48
|
+
url = ApiStub::Requests::Storage::File.blob_https_url(Fog::AzureRM::ENVIRONMENT_AZURE_US_GOVERNMENT)
|
49
49
|
|
50
50
|
blob_client.stub :generate_uri, url do
|
51
51
|
assert_equal url, service.get_blob_url('test_container', 'test_blob')
|
@@ -56,10 +56,10 @@ class TestGetBlobUrl < Minitest::Test
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def test_get_blob_url_for_german_success
|
59
|
-
german_storage_account_credentials = storage_account_credentials.merge(environment: ENVIRONMENT_AZURE_GERMAN_CLOUD)
|
59
|
+
german_storage_account_credentials = storage_account_credentials.merge(environment: Fog::AzureRM::ENVIRONMENT_AZURE_GERMAN_CLOUD)
|
60
60
|
service = Fog::Storage::AzureRM.new(german_storage_account_credentials)
|
61
61
|
blob_client = service.instance_variable_get(:@blob_client)
|
62
|
-
url = ApiStub::Requests::Storage::File.blob_https_url(ENVIRONMENT_AZURE_GERMAN_CLOUD)
|
62
|
+
url = ApiStub::Requests::Storage::File.blob_https_url(Fog::AzureRM::ENVIRONMENT_AZURE_GERMAN_CLOUD)
|
63
63
|
|
64
64
|
blob_client.stub :generate_uri, url do
|
65
65
|
assert_equal url, service.get_blob_url('test_container', 'test_blob')
|
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: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shaffan Chaudhry
|
@@ -15,10 +15,10 @@ authors:
|
|
15
15
|
- Azeem Sajid
|
16
16
|
- Maham Nazir
|
17
17
|
- Abbas Sheikh
|
18
|
-
autorequire:
|
18
|
+
autorequire:
|
19
19
|
bindir: bin
|
20
20
|
cert_chain: []
|
21
|
-
date:
|
21
|
+
date: 2023-02-27 00:00:00.000000000 Z
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
24
24
|
name: codeclimate-test-reporter
|
@@ -176,7 +176,7 @@ dependencies:
|
|
176
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
|
-
email:
|
179
|
+
email:
|
180
180
|
executables: []
|
181
181
|
extensions: []
|
182
182
|
extra_rdoc_files:
|
@@ -237,6 +237,7 @@ files:
|
|
237
237
|
- lib/fog/azurerm/requests/storage/delete_blob.rb
|
238
238
|
- lib/fog/azurerm/requests/storage/delete_blob_https_url.rb
|
239
239
|
- lib/fog/azurerm/requests/storage/delete_container.rb
|
240
|
+
- lib/fog/azurerm/requests/storage/delete_object.rb
|
240
241
|
- lib/fog/azurerm/requests/storage/delete_object_url.rb
|
241
242
|
- lib/fog/azurerm/requests/storage/get_blob.rb
|
242
243
|
- lib/fog/azurerm/requests/storage/get_blob_http_url.rb
|
@@ -294,6 +295,7 @@ files:
|
|
294
295
|
- test/requests/storage/test_delete_blob.rb
|
295
296
|
- test/requests/storage/test_delete_blob_https_url.rb
|
296
297
|
- test/requests/storage/test_delete_container.rb
|
298
|
+
- test/requests/storage/test_delete_object.rb
|
297
299
|
- test/requests/storage/test_get_blob.rb
|
298
300
|
- test/requests/storage/test_get_blob_http_url.rb
|
299
301
|
- test/requests/storage/test_get_blob_https_url.rb
|
@@ -338,8 +340,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
338
340
|
- !ruby/object:Gem::Version
|
339
341
|
version: '0'
|
340
342
|
requirements: []
|
341
|
-
rubygems_version: 3.
|
342
|
-
signing_key:
|
343
|
+
rubygems_version: 3.4.7
|
344
|
+
signing_key:
|
343
345
|
specification_version: 4
|
344
346
|
summary: Module for the 'fog' gem to support Azure Blob Storage with CarrierWave and
|
345
347
|
Fog.
|