Current section

Files

Jump to
azure lib storage container_lease.ex
Raw

lib/storage/container_lease.ex

defmodule Azure.Storage.ContainerLease do
@moduledoc """
ContainerLease
"""
import Azure.Storage.RequestBuilder
alias Azure.Storage.Container
# "x-ms-lease-action" acquire/renew/change/release/break
# "x-ms-lease-id" Required for renew/change/release
# "x-ms-lease-break-period" optional 0..60
# "x-ms-lease-duration" required for acquire. -1, 15..60
# "x-ms-proposed-lease-id" Optional for acquire, required for change
defp container_lease_handler(
%Container{storage_context: context, container_name: container_name},
expected_status_code,
fn_prepare_request,
fn_prepare_response
) do
# https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container
response =
context
|> new_azure_storage_request()
|> method(:put)
|> url("/#{container_name}")
|> add_param(:query, :comp, "lease")
|> add_param(:query, :restype, "container")
|> fn_prepare_request.()
|> sign_and_call(:blob_service)
case response do
%{status: status} when 400 <= status and status < 500 ->
{:error, response |> create_error_response()}
%{status: ^expected_status_code} ->
{:ok,
response
|> create_success_response()
|> fn_prepare_response.(response)}
end
end
defp pass_result_as_is(result, _response), do: result
# AcquireLease TimeSpan? leaseTime, string proposedLeaseId
def container_lease_acquire(
container = %Container{},
lease_duration,
proposed_lease_id \\ nil
)
when lease_duration |> is_integer() and (lease_duration == -1 or lease_duration in 15..60) do
# https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container
fn_prepare_request = fn request ->
request
|> add_header("x-ms-lease-action", "acquire")
|> add_header("x-ms-lease-duration", "#{lease_duration}")
|> add_header("x-ms-proposed-lease-id", "#{proposed_lease_id}")
end
container
|> container_lease_handler(
201,
fn_prepare_request,
&pass_result_as_is/2
)
end
# RenewLease
def container_lease_renew(
container = %Container{},
lease_id
) do
# https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container
fn_prepare_request = fn request ->
request
|> add_header("x-ms-lease-action", "renew")
|> add_header("x-ms-lease-id", "#{lease_id}")
end
container
|> container_lease_handler(
200,
fn_prepare_request,
&pass_result_as_is/2
)
end
# BreakLease TimeSpan? breakPeriod
def container_lease_break(
container = %Container{},
lease_id,
break_period \\ -1
)
when break_period |> is_integer() and break_period in -1..60 do
# https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container
fn_prepare_request = fn request ->
request
|> add_header("x-ms-lease-action", "break")
|> add_header("x-ms-lease-id", "#{lease_id}")
|> add_header("x-ms-lease-break-period", "#{break_period}")
end
fn_prepare_response = fn result, response ->
result
|> Map.put(:lease_time, response.headers["x-ms-lease-time"] |> Integer.parse() |> elem(0))
end
container
|> container_lease_handler(
202,
fn_prepare_request,
fn_prepare_response
)
end
# ReleaseLease
def container_lease_release(
container = %Container{},
lease_id
) do
# https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container#remarks
fn_prepare_request = fn request ->
request
|> add_header("x-ms-lease-action", "release")
|> add_header("x-ms-lease-id", "#{lease_id}")
end
container
|> container_lease_handler(
200,
fn_prepare_request,
&pass_result_as_is/2
)
end
# ChangeLease string proposedLeaseId,
def container_lease_change(
container = %Container{},
lease_id,
proposed_lease_id
) do
# https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container#remarks
fn_prepare_request = fn request ->
request
|> add_header("x-ms-lease-action", "release")
|> add_header("x-ms-lease-id", "#{lease_id}")
|> add_header("x-ms-proposed-lease-id", "#{proposed_lease_id}")
end
container
|> container_lease_handler(
200,
fn_prepare_request,
&pass_result_as_is/2
)
end
end