Module: SqlCmd::Azure::AttachedStorage

Defined in:
lib/sql_cmd/azure.rb

Class Method Summary collapse

Class Method Details

.container_name_from_url(storage_url, client: nil) ⇒ Object



63
64
65
66
67
68
69
70
71
# File 'lib/sql_cmd/azure.rb', line 63

def container_name_from_url(storage_url, client: nil)
  if client.nil?
    OptionalDepedencies.load_azure_blob_storage_dependencies

    # initialize ::Azure::Storage::Blob::BlobService client
    client = ::Azure::Storage::Blob::BlobService.create(storage_account_name: , storage_access_key: storage_access_key)
  end
  client.list_containers.map(&:name).select { |c| storage_url =~ %r{/#{Regexp.escape(c)}(/|$)} }.first
end

.download(filename, destination_path, storage_account_name, storage_access_key, container_name: nil, storage_url: nil) ⇒ Object

Download a file from blob storage Either container_name or storage_url is required



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/sql_cmd/azure.rb', line 25

def download(filename, destination_path, , storage_access_key, container_name: nil, storage_url: nil)
  raise 'Either :container_name or :storage_url must be specified for SqlCmd::Azure::AttachedStorage.download' if container_name.nil? && storage_url.nil?
  OptionalDepedencies.load_azure_blob_storage_dependencies

  # initialize ::Azure::Storage::Blob::BlobService client
  client = ::Azure::Storage::Blob::BlobService.create(storage_account_name: , storage_access_key: storage_access_key)
  container_name ||= container_name_from_url(storage_url, client: client) || ::File.basename(storage_url)
  relative_path = storage_url.nil? ? filename : storage_file_relative_path(storage_url, filename, container_name)

  # Add retry filter to the client
  client.with_filter(::Azure::Storage::Common::Core::Filter::ExponentialRetryPolicyFilter.new)

  FileUtils.mkdir_p(::File.dirname(destination_path))
  _blob, content = client.get_blob(container_name, relative_path)
  ::File.open(destination_path, 'wb') { |f| f.write(content) }
end

.list(storage_account_name, storage_access_key, container_name: nil, storage_url: nil, filename_prefix: nil) ⇒ Object

List files that in blob storage Either container_name or storage_url is required Returns hash of file URLs and their properties



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/sql_cmd/azure.rb', line 45

def list(, storage_access_key, container_name: nil, storage_url: nil, filename_prefix: nil)
  raise 'Either :container_name or :storage_url must be specified for SqlCmd::Azure::AttachedStorage.list' if container_name.nil? && storage_url.nil?
  OptionalDepedencies.load_azure_blob_storage_dependencies

  # initialize ::Azure::Storage::Blob::BlobService client
  client = ::Azure::Storage::Blob::BlobService.create(storage_account_name: , storage_access_key: storage_access_key)
  container_name ||= container_name_from_url(storage_url, client: client) || ::File.basename(storage_url)
  relative_path = storage_url.nil? ? filename_prefix : storage_file_relative_path(storage_url, filename_prefix, container_name)

  # Add retry filter to the client
  client.with_filter(::Azure::Storage::Common::Core::Filter::ExponentialRetryPolicyFilter.new)

  # Get list of files matching filename_prefix
  blob_list_options = filename_prefix.nil? ? {} : { prefix: relative_path }
  files = client.list_blobs(container_name, blob_list_options)
  files.nil? ? [] : files.map { |f| [f.name, f.properties] }.to_h
end

.storage_file_relative_path(storage_url, filename, container_name) ⇒ Object



73
74
75
76
77
# File 'lib/sql_cmd/azure.rb', line 73

def storage_file_relative_path(storage_url, filename, container_name)
  relative_path = storage_url.sub(/.+?#{Regexp.escape(container_name)}/i, '') + "/#{filename}"
  relative_path.gsub!('//', '/')
  relative_path.reverse.chomp('/').reverse
end

.upload(filename, content, storage_account_name, storage_access_key, container_name: nil, storage_url: nil) ⇒ Object

Upload a file to blob storage Either container_name or storage_url is required



8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/sql_cmd/azure.rb', line 8

def upload(filename, content, , storage_access_key, container_name: nil, storage_url: nil)
  raise 'Either :container_name or :storage_url must be specified for SqlCmd::Azure::AttachedStorage.upload' if container_name.nil? && storage_url.nil?
  OptionalDepedencies.load_azure_blob_storage_dependencies

  # initialize ::Azure::Storage::Blob::BlobService client
  client = ::Azure::Storage::Blob::BlobService.create(storage_account_name: , storage_access_key: storage_access_key)
  container_name ||= container_name_from_url(storage_url, client: client) || ::File.basename(storage_url)
  relative_path = storage_url.nil? ? filename : storage_file_relative_path(storage_url, filename, container_name)

  # Add retry filter to the client
  client.with_filter(::Azure::Storage::Common::Core::Filter::ExponentialRetryPolicyFilter.new)

  client.create_block_blob(container_name, relative_path, content)
end