gitlab-fog-azure-rm 1.3.0 → 1.5.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 +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.
|