==========================
Getting Started With Azure
==========================

.. versionadded:: 2014.1.0

Azure is a cloud service by Microsoft providing virtual machines, SQL services,
media services, and more. This document describes how to use Salt Cloud to
create a virtual machine on Azure, with Salt installed.

More information about Azure is located at `http://www.windowsazure.com/
<http://www.windowsazure.com/>`_.


Dependencies
============
* `Microsoft Azure SDK for Python <https://pypi.python.org/pypi/azure/1.0.2>`_ >= 1.0.2
* The python-requests library, for Python < 2.7.9.
* A Microsoft Azure account
* OpenSSL (to generate the certificates)
* `Salt <https://github.com/saltstack/salt>`_


.. note::

    The Azure driver is currently being updated to work with the new version of
    the Python Azure SDK, 1.0.0. However until that process is complete, this
    driver will not work with Azure 1.0.0. Please be sure you're running on a
    minimum version of 0.10.2 and less than version 1.0.0.

    See `Issue #27980`_ for more information.

.. _Issue #27980: https://github.com/saltstack/salt/issues/27980


Configuration
=============

Set up the provider config at ``/etc/salt/cloud.providers.d/azure.conf``:

.. code-block:: yaml

    # Note: This example is for /etc/salt/cloud.providers.d/azure.conf

    my-azure-config:
      driver: azure
      subscription_id: 3287abc8-f98a-c678-3bde-326766fd3617
      certificate_path: /etc/salt/azure.pem

      # Set up the location of the salt master
      #
      minion:
        master: saltmaster.example.com

      # Optional
      management_host: management.core.windows.net

The certificate used must be generated by the user. OpenSSL can be used to
create the management certificates. Two certificates are needed: a .cer file,
which is uploaded to Azure, and a .pem file, which is stored locally.

To create the .pem file, execute the following command:

.. code-block:: bash

    openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/salt/azure.pem -out /etc/salt/azure.pem

To create the .cer file, execute the following command:

.. code-block:: bash

    openssl x509 -inform pem -in /etc/salt/azure.pem -outform der -out /etc/salt/azure.cer

After creating these files, the .cer file will need to be uploaded to
Azure via the "Upload a Management Certificate" action of the "Management Certificates"
tab within the "Settings" section of the management portal.

Optionally, a ``management_host`` may be configured, if necessary for the region.

.. note::
    .. versionchanged:: 2015.8.0

    The ``provider`` parameter in cloud provider definitions was renamed to ``driver``. This
    change was made to avoid confusion with the ``provider`` parameter that is used in cloud profile
    definitions. Cloud provider definitions now use ``driver`` to refer to the Salt cloud module that
    provides the underlying functionality to connect to a cloud host, while cloud profiles continue
    to use ``provider`` to refer to provider configurations that you define.

Cloud Profiles
==============
Set up an initial profile at ``/etc/salt/cloud.profiles``:

.. code-block:: yaml

    azure-ubuntu:
      provider: my-azure-config
      image: 'b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-12_04_3-LTS-amd64-server-20131003-en-us-30GB'
      size: Small
      location: 'East US'
      ssh_username: azureuser
      ssh_password: verybadpass
      slot: production
      media_link: 'http://portalvhdabcdefghijklmn.blob.core.windows.net/vhds'
      virtual_network_name: azure-virtual-network
      subnet_name: azure-subnet

These options are described in more detail below. Once configured, the profile
can be realized with a salt command:

.. code-block:: bash

    salt-cloud -p azure-ubuntu newinstance

This will create an salt minion instance named ``newinstance`` in Azure. If
the command was executed on the salt-master, its Salt key will automatically
be signed on the master.

Once the instance has been created with salt-minion installed, connectivity to
it can be verified with Salt:

.. code-block:: bash

    salt newinstance test.ping


Profile Options
===============
The following options are currently available for Azure.

provider
--------
The name of the provider as configured in
`/etc/salt/cloud.providers.d/azure.conf`.

image
-----
The name of the image to use to create a VM. Available images can be viewed
using the following command:

.. code-block:: bash

    salt-cloud --list-images my-azure-config

size
----
The name of the size to use to create a VM. Available sizes can be viewed using
the following command:

.. code-block:: bash

    salt-cloud --list-sizes my-azure-config

location
--------
The name of the location to create a VM in. Available locations can be viewed
using the following command:

.. code-block:: bash

    salt-cloud --list-locations my-azure-config

affinity_group
--------------
The name of the affinity group to create a VM in. Either a ``location`` or an
``affinity_group`` may be specified, but not both. See Affinity Groups below.

ssh_username
------------
The user to use to log into the newly-created VM to install Salt.

ssh_password
------------
The password to use to log into the newly-created VM to install Salt.

slot
----
The environment to which the hosted service is deployed. Valid values are
`staging` or `production`. When set to `production`, the resulting URL of the
new VM will be `<vm_name>.cloudapp.net`. When set to `staging`, the resulting
URL will contain a generated hash instead.

media_link
----------
This is the URL of the container that will store the disk that this VM uses.
Currently, this container must already exist. If a VM has previously been
created in the associated account, a container should already exist. In the web
interface, go into the Storage area and click one of the available storage
selections. Click the Containers link, and then copy the URL from the container
that will be used. It generally looks like:

.. code-block:: yaml

    http://portalvhdabcdefghijklmn.blob.core.windows.net/vhds

service_name
------------
The name of the service in which to create the VM. If this is not specified,
then a service will be created with the same name as the VM.

virtual_network_name
--------------------
Optional. The name of the virtual network for the VM to join. If this is not
specified, then no virtual network will be joined.

subnet_name
------------
Optional. The name of the subnet in the virtual network for the VM to join.
Requires that a ``virtual_network_name`` is specified.


Show Instance
=============
This action is a thin wrapper around ``--full-query``, which displays details on
a single instance only. In an environment with several machines, this will save
a user from having to sort through all instance data, just to examine a single
instance.

.. code-block:: bash

    salt-cloud -a show_instance myinstance


Destroying VMs
==============
There are certain options which can be specified in the global cloud
configuration file (usually ``/etc/salt/cloud``) which affect Salt Cloud's
behavior when a VM is destroyed.

cleanup_disks
-------------
.. versionadded:: 2015.8.0

Default is ``False``. When set to ``True``, Salt Cloud will wait for the VM to
be destroyed, then attempt to destroy the main disk that is associated with the
VM.

cleanup_vhds
------------
.. versionadded:: 2015.8.0

Default is ``False``. Requires ``cleanup_disks`` to be set to ``True``. When
also set to ``True``, Salt Cloud will ask Azure to delete the VHD associated
with the disk that is also destroyed.

cleanup_services
----------------
.. versionadded:: 2015.8.0

Default is ``False``. Requires ``cleanup_disks`` to be set to ``True``. When
also set to ``True``, Salt Cloud will wait for the disk to be destroyed, then
attempt to remove the service that is associated with the VM. Because the disk
belongs to the service, the disk must be destroyed before the service can be.


Managing Hosted Services
========================
.. versionadded:: 2015.8.0

An account can have one or more hosted services. A hosted service is required
in order to create a VM. However, as mentioned above, if a hosted service is not
specified when a VM is created, then one will automatically be created with the
name of the name. The following functions are also available.

create_service
--------------
Create a hosted service. The following options are available.

name
~~~~
Required. The name of the hosted service to create.

label
~~~~~
Required. A label to apply to the hosted service.

description
~~~~~~~~~~~
Optional. A longer description of the hosted service.

location
~~~~~~~~
Required, if ``affinity_group`` is not set. The location in which to create the
hosted service. Either the ``location`` or the ``affinity_group`` must be set,
but not both.

affinity_group
~~~~~~~~~~~~~~
Required, if ``location`` is not set. The affinity group in which to create the
hosted service. Either the ``location`` or the ``affinity_group`` must be set,
but not both.

extended_properties
~~~~~~~~~~~~~~~~~~~
Optional. Dictionary containing name/value pairs of hosted service properties.
You can have a maximum of 50 extended property name/value pairs. The maximum
length of the Name element is 64 characters, only alphanumeric characters and
underscores are valid in the Name, and the name must start with a letter.
The value has a maximum length of 255 characters.

CLI Example
~~~~~~~~~~~
The following example illustrates creating a hosted service.

.. code-block:: bash

    salt-cloud -f create_service my-azure name=my-service label=my-service location='West US'

show_service
------------
Return details about a specific hosted service. Can also be called with
``get_service``.

.. code-block:: bash

    salt-cloud -f show_storage my-azure name=my-service

list_services
-------------
List all hosted services associates with the subscription.

.. code-block:: bash

    salt-cloud -f list_services my-azure-config


delete_service
--------------
Delete a specific hosted service.

.. code-block:: bash

    salt-cloud -f delete_service my-azure name=my-service


Managing Storage Accounts
=========================
.. versionadded:: 2015.8.0

Salt Cloud can manage storage accounts associated with the account. The
following functions are available. Deprecated marked as deprecated are marked
as such as per the SDK documentation, but are still included for completeness
with the SDK.

create_storage
--------------
Create a storage account. The following options are supported.

name
~~~~
Required. The name of the storage account to create.

label
~~~~~
Required. A label to apply to the storage account.

description
~~~~~~~~~~~
Optional. A longer description of the storage account.

location
~~~~~~~~
Required, if ``affinity_group`` is not set. The location in which to create the
storage account. Either the ``location`` or the ``affinity_group`` must be set,
but not both.

affinity_group
~~~~~~~~~~~~~~
Required, if ``location`` is not set. The affinity group in which to create the
storage account. Either the ``location`` or the ``affinity_group`` must be set,
but not both.

extended_properties
~~~~~~~~~~~~~~~~~~~
Optional. Dictionary containing name/value pairs of storage account properties.
You can have a maximum of 50 extended property name/value pairs. The maximum
length of the Name element is 64 characters, only alphanumeric characters and
underscores are valid in the Name, and the name must start with a letter. The
value has a maximum length of 255 characters.

geo_replication_enabled
~~~~~~~~~~~~~~~~~~~~~~~
Deprecated. Replaced by the account_type parameter.

account_type
~~~~~~~~~~~~
Specifies whether the account supports locally-redundant storage, geo-redundant
storage, zone-redundant storage, or read access geo-redundant storage. Possible
values are:

- Standard_LRS
- Standard_ZRS
- Standard_GRS
- Standard_RAGRS

CLI Example
~~~~~~~~~~~
The following example illustrates creating a storage account.

.. code-block:: bash

    salt-cloud -f create_storage my-azure name=my-storage label=my-storage location='West US'

list_storage
------------
List all storage accounts associates with the subscription.

.. code-block:: bash

    salt-cloud -f list_storage my-azure-config

show_storage
------------
Return details about a specific storage account. Can also be called with
``get_storage``.

.. code-block:: bash

    salt-cloud -f show_storage my-azure name=my-storage

update_storage
--------------
Update details concerning a storage account. Any of the options available in
``create_storage`` can be used, but the name cannot be changed.

.. code-block:: bash

    salt-cloud -f update_storage my-azure name=my-storage label=my-storage

delete_storage
--------------
Delete a specific storage account.

.. code-block:: bash

    salt-cloud -f delete_storage my-azure name=my-storage

show_storage_keys
-----------------
Returns the primary and secondary access keys for the specified storage account.

.. code-block:: bash

    salt-cloud -f show_storage_keys my-azure name=my-storage

regenerate_storage_keys
-----------------------
Regenerate storage account keys. Requires a key_type ("primary" or "secondary")
to be specified.

.. code-block:: bash

    salt-cloud -f regenerate_storage_keys my-azure name=my-storage key_type=primary


Managing Disks
==============
.. versionadded:: 2015.8.0

When a VM is created, a disk will also be created for it. The following
functions are available for managing disks. Deprecated marked as deprecated are
marked as such as per the SDK documentation, but are still included for
completeness with the SDK.

show_disk
---------
Return details about a specific disk. Can also be called with ``get_disk``.

.. code-block:: bash

    salt-cloud -f show_disk my-azure name=my-disk

list_disks
----------
List all disks associates with the account.

.. code-block:: bash

    salt-cloud -f list_disks my-azure

update_disk
-----------
Update details for a disk. The following options are available.

name
~~~~
Required. The name of the disk to update.

has_operating_system
~~~~~~~~~~~~~~~~~~~~
Deprecated.

label
~~~~~
Required. The label for the disk.

media_link
~~~~~~~~~~
Deprecated. The location of the disk in the account, including the storage
container that it is in. This should not need to be changed.

new_name
~~~~~~~~
Deprecated. If renaming the disk, the new name.

os
~~~
Deprecated.

CLI Example
~~~~~~~~~~~
The following example illustrates updating a disk.

.. code-block:: bash

    salt-cloud -f update_disk my-azure name=my-disk label=my-disk

delete_disk
-----------
Delete a specific disk.

.. code-block:: bash

    salt-cloud -f delete_disk my-azure name=my-disk


Managing Service Certificates
=============================
.. versionadded:: 2015.8.0

Stored at the cloud service level, these certificates are used by your deployed
services. For more information on service certificates, see the following link:

* `Manage Certificates`__

.. __: https://msdn.microsoft.com/en-us/library/azure/gg981929.aspx

The following functions are available.

list_service_certificates
-------------------------
List service certificates associated with the account.

.. code-block:: bash

    salt-cloud -f list_service_certificates my-azure

show_service_certificate
------------------------
Show the data for a specific service certificate associated with the account.
The ``name``, ``thumbprint``, and ``thumbalgorithm`` can be obtained from
``list_service_certificates``. Can also be called with
``get_service_certificate``.

.. code-block:: bash

    salt-cloud -f show_service_certificate my-azure name=my_service_certificate \
        thumbalgorithm=sha1 thumbprint=0123456789ABCDEF

add_service_certificate
-----------------------
Add a service certificate to the account. This requires that a certificate
already exists, which is then added to the account. For more information on
creating the certificate itself, see:

* `Create a Service Certificate for Azure`__

.. __: https://msdn.microsoft.com/en-us/library/azure/gg432987.aspx

The following options are available.

name
~~~~
Required. The name of the hosted service that the certificate will belong to.

data
~~~~
Required. The base-64 encoded form of the pfx file.

certificate_format
~~~~~~~~~~~~~~~~~~
Required. The service certificate format. The only supported value is pfx.

password
~~~~~~~~
The certificate password.

.. code-block:: bash

    salt-cloud -f add_service_certificate my-azure name=my-cert \
        data='...CERT_DATA...' certificate_format=pfx password=verybadpass

delete_service_certificate
--------------------------
Delete a service certificate from the account. The ``name``, ``thumbprint``,
and ``thumbalgorithm`` can be obtained from ``list_service_certificates``.

.. code-block:: bash

    salt-cloud -f delete_service_certificate my-azure \
        name=my_service_certificate \
        thumbalgorithm=sha1 thumbprint=0123456789ABCDEF


Managing Management Certificates
================================
.. versionadded:: 2015.8.0

A Azure management certificate is an X.509 v3 certificate used to authenticate
an agent, such as Visual Studio Tools for Windows Azure or a client application
that uses the Service Management API, acting on behalf of the subscription owner
to manage subscription resources. Azure management certificates are uploaded to
Azure and stored at the subscription level. The management certificate store can
hold up to 100 certificates per subscription. These certificates are used to
authenticate your Windows Azure deployment.

For more information on management certificates, see the following link.

* `Manage Certificates`__

.. __: https://msdn.microsoft.com/en-us/library/azure/gg981929.aspx

The following functions are available.

list_management_certificates
----------------------------
List management certificates associated with the account.

.. code-block:: bash

    salt-cloud -f list_management_certificates my-azure

show_management_certificate
---------------------------
Show the data for a specific management certificate associated with the account.
The ``name``, ``thumbprint``, and ``thumbalgorithm`` can be obtained from
``list_management_certificates``. Can also be called with
``get_management_certificate``.

.. code-block:: bash

    salt-cloud -f show_management_certificate my-azure name=my_management_certificate \
        thumbalgorithm=sha1 thumbprint=0123456789ABCDEF

add_management_certificate
--------------------------
Management certificates must have a key length of at least 2048 bits and should
reside in the Personal certificate store. When the certificate is installed on
the client, it should contain the private key of the certificate. To upload to
the certificate to the Microsoft Azure Management Portal, you must export it as
a .cer format file that does not contain the private key. For more information
on creating management certificates, see the following link:

* `Create and Upload a Management Certificate for Azure`__

.. __: https://msdn.microsoft.com/en-us/library/azure/gg551722.aspx

The following options are available.

public_key
~~~~~~~~~~
A base64 representation of the management certificate public key.

thumbprint
~~~~~~~~~~
The thumb print that uniquely identifies the management certificate.

data
~~~~
The certificate's raw data in base-64 encoded .cer format.

.. code-block:: bash

    salt-cloud -f add_management_certificate my-azure public_key='...PUBKEY...' \
        thumbprint=0123456789ABCDEF data='...CERT_DATA...'

delete_management_certificate
-----------------------------
Delete a management certificate from the account. The ``thumbprint`` can be
obtained from ``list_management_certificates``.

.. code-block:: bash

    salt-cloud -f delete_management_certificate my-azure thumbprint=0123456789ABCDEF


Virtual Network Management
==========================
.. versionadded:: 2015.8.0

The following are functions for managing virtual networks.

list_virtual_networks
---------------------
List input endpoints associated with the deployment.

.. code-block:: bash

    salt-cloud -f list_virtual_networks my-azure service=myservice deployment=mydeployment


Managing Input Endpoints
========================
.. versionadded:: 2015.8.0

Input endpoints are used to manage port access for roles. Because endpoints
cannot be managed by the Azure Python SDK, Salt Cloud uses the API directly.
With versions of Python before 2.7.9, the ``requests-python`` package needs to
be installed in order for this to work. Additionally, the following needs to be
set in the master's configuration file:

.. code-block:: bash

    backend: requests

The following functions are available.

list_input_endpoints
--------------------
List input endpoints associated with the deployment

.. code-block:: bash

    salt-cloud -f list_input_endpoints my-azure service=myservice deployment=mydeployment

show_input_endpoint
-------------------
Show an input endpoint associated with the deployment

.. code-block:: bash

    salt-cloud -f show_input_endpoint my-azure service=myservice \
        deployment=mydeployment name=SSH

add_input_endpoint
------------------
Add an input endpoint to the deployment. Please note that there may be a delay
before the changes show up. The following options are available.

service
~~~~~~~
Required. The name of the hosted service which the VM belongs to.

deployment
~~~~~~~~~~
Required. The name of the deployment that the VM belongs to. If the VM was
created with Salt Cloud, the deployment name probably matches the VM name.

role
~~~~
Required. The name of the role that the VM belongs to. If the VM was created
with Salt Cloud, the role name probably matches the VM name.

name
~~~~
Required. The name of the input endpoint. This typically matches the port that
the endpoint is set to. For instance, port 22 would be called SSH.

port
~~~~
Required. The public (Internet-facing) port that is used for the endpoint.

local_port
~~~~~~~~~~
Optional. The private port on the VM itself that will be matched with the port.
This is typically the same as the ``port``. If this value is not specified, it
will be copied from ``port``.

protocol
~~~~~~~~
Required. Either ``tcp`` or ``udp``.

enable_direct_server_return
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Optional. If an internal load balancer exists in the account, it can be used
with a direct server return. The default value is ``False``. Please see the
following article for an explanation of this option.

* `Load Balancing for Azure Infrastructure Services`__

.. __: http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-load-balance/

timeout_for_tcp_idle_connection
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Optional. The default value is ``4``. Please see the following article for an
explanation of this option.

* `Configurable Idle Timeout for Azure Load Balancer`__

.. __: http://azure.microsoft.com/blog/2014/08/14/new-configurable-idle-timeout-for-azure-load-balancer/

CLI Example
~~~~~~~~~~~
The following example illustrates adding an input endpoint.

.. code-block:: bash

    salt-cloud -f add_input_endpoint my-azure service=myservice \
        deployment=mydeployment role=myrole name=HTTP local_port=80 \
        port=80 protocol=tcp enable_direct_server_return=False \
        timeout_for_tcp_idle_connection=4

update_input_endpoint
---------------------
Updates the details for a specific input endpoint. All options from
``add_input_endpoint`` are supported.

.. code-block:: bash

    salt-cloud -f update_input_endpoint my-azure service=myservice \
        deployment=mydeployment role=myrole name=HTTP local_port=80 \
        port=80 protocol=tcp enable_direct_server_return=False \
        timeout_for_tcp_idle_connection=4

delete_input_endpoint
---------------------
Delete an input endpoint from the deployment. Please note that there may be a
delay before the changes show up.  The following items are required.

CLI Example
~~~~~~~~~~~
The following example illustrates deleting an input endpoint.

service
~~~~~~~
The name of the hosted service which the VM belongs to.

deployment
~~~~~~~~~~
The name of the deployment that the VM belongs to. If the VM was created with
Salt Cloud, the deployment name probably matches the VM name.

role
~~~~
The name of the role that the VM belongs to. If the VM was created with Salt
Cloud, the role name probably matches the VM name.

name
~~~~
The name of the input endpoint. This typically matches the port that the
endpoint is set to. For instance, port 22 would be called SSH.

.. code-block:: bash

    salt-cloud -f delete_input_endpoint my-azure service=myservice \
        deployment=mydeployment role=myrole name=HTTP


Managing Affinity Groups
========================
.. versionadded:: 2015.8.0

Affinity groups allow you to group your Azure services to optimize performance.
All services and VMs within an affinity group will be located in the same
region. For more information on Affinity groups, see the following link:

* `Create an Affinity Group in the Management Portal`__

.. __: https://msdn.microsoft.com/en-us/library/azure/jj156209.aspx

The following functions are available.

list_affinity_groups
--------------------
List input endpoints associated with the account

.. code-block:: bash

    salt-cloud -f list_affinity_groups my-azure

show_affinity_group
-------------------
Show an affinity group associated with the account

.. code-block:: bash

    salt-cloud -f show_affinity_group my-azure service=myservice \
        deployment=mydeployment name=SSH

create_affinity_group
---------------------
Create a new affinity group. The following options are supported.

name
~~~~
Required. The name of the new affinity group.

location
~~~~~~~~
Required. The region in which the affinity group lives.

label
~~~~~
Required. A label describing the new affinity group.

description
~~~~~~~~~~~
Optional. A longer description of the affinity group.

.. code-block:: bash

    salt-cloud -f create_affinity_group my-azure name=my_affinity_group \
       label=my-affinity-group location='West US'

update_affinity_group
---------------------
Update an affinity group's properties

.. code-block:: bash

    salt-cloud -f update_affinity_group my-azure name=my_group label=my_group

delete_affinity_group
---------------------
Delete a specific affinity group associated with the account

.. code-block:: bash

    salt-cloud -f delete_affinity_group my-azure name=my_affinity_group


Managing Blob Storage
=====================
.. versionadded:: 2015.8.0

Azure storage containers and their contents can be managed with Salt Cloud. This
is not as elegant as using one of the other available clients in Windows, but it
benefits Linux and Unix users, as there are fewer options available on those
platforms.

Blob Storage Configuration
--------------------------
Blob storage must be configured differently than the standard Azure
configuration. Both a ``storage_account`` and a ``storage_key`` must be
specified either through the Azure provider configuration (in addition to the
other Azure configuration) or via the command line.

.. code-block:: yaml

    storage_account: mystorage
    storage_key: ffhj334fDSGFEGDFGFDewr34fwfsFSDFwe==

storage_account
~~~~~~~~~~~~~~~
This is one of the storage accounts that is available via the ``list_storage``
function.

storage_key
~~~~~~~~~~~
Both a primary and a secondary ``storage_key`` can be obtained by running the
``show_storage_keys`` function. Either key may be used.


Blob Functions
--------------
The following functions are made available through Salt Cloud for managing
blog storage.

make_blob_url
~~~~~~~~~~~~~
Creates the URL to access a blob

.. code-block:: bash

    salt-cloud -f make_blob_url my-azure container=mycontainer blob=myblob

container
`````````
Name of the container.

blob
````
Name of the blob.

account
```````
Name of the storage account. If not specified, derives the host base
from the provider configuration.

protocol
````````
Protocol to use: 'http' or 'https'. If not specified, derives the host
base from the provider configuration.

host_base
`````````
Live host base URL.  If not specified, derives the host base from the
provider configuration.


list_storage_containers
~~~~~~~~~~~~~~~~~~~~~~~
List containers associated with the storage account

.. code-block:: bash

    salt-cloud -f list_storage_containers my-azure


create_storage_container
~~~~~~~~~~~~~~~~~~~~~~~~
Create a storage container

.. code-block:: bash

    salt-cloud -f create_storage_container my-azure name=mycontainer

name
````
Name of container to create.

meta_name_values
````````````````
Optional. A dict with name_value pairs to associate with the
container as metadata. Example:{'Category':'test'}

blob_public_access
``````````````````
Optional. Possible values include: container, blob

fail_on_exist
`````````````
Specify whether to throw an exception when the container exists.


show_storage_container
~~~~~~~~~~~~~~~~~~~~~~
Show a container associated with the storage account

.. code-block:: bash

    salt-cloud -f show_storage_container my-azure name=myservice

name
````
Name of container to show.


show_storage_container_metadata
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Show a storage container's metadata

.. code-block:: bash

    salt-cloud -f show_storage_container_metadata my-azure name=myservice

name
````
Name of container to show.

lease_id
````````
If specified, show_storage_container_metadata only succeeds if the
container's lease is active and matches this ID.


set_storage_container_metadata
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Set a storage container's metadata

.. code-block:: bash

    salt-cloud -f set_storage_container my-azure name=mycontainer \
        x_ms_meta_name_values='{"my_name": "my_value"}'

name
````
Name of existing container.
meta_name_values
````````````````
A dict containing name, value for metadata.
Example: {'category':'test'}
lease_id
````````
If specified, set_storage_container_metadata only succeeds if the
container's lease is active and matches this ID.


show_storage_container_acl
~~~~~~~~~~~~~~~~~~~~~~~~~~
Show a storage container's acl

.. code-block:: bash

    salt-cloud -f show_storage_container_acl my-azure name=myservice

name
````
Name of existing container.

lease_id
````````
If specified, show_storage_container_acl only succeeds if the
container's lease is active and matches this ID.


set_storage_container_acl
~~~~~~~~~~~~~~~~~~~~~~~~~
Set a storage container's acl

.. code-block:: bash

    salt-cloud -f set_storage_container my-azure name=mycontainer

name
````
Name of existing container.

signed_identifiers
``````````````````
SignedIdentifers instance

blob_public_access
``````````````````
Optional. Possible values include: container, blob

lease_id
````````
If specified, set_storage_container_acl only succeeds if the
container's lease is active and matches this ID.


delete_storage_container
~~~~~~~~~~~~~~~~~~~~~~~~
Delete a container associated with the storage account

.. code-block:: bash

    salt-cloud -f delete_storage_container my-azure name=mycontainer

name
````
Name of container to create.

fail_not_exist
``````````````
Specify whether to throw an exception when the container exists.

lease_id
````````
If specified, delete_storage_container only succeeds if the
container's lease is active and matches this ID.


lease_storage_container
~~~~~~~~~~~~~~~~~~~~~~~
Lease a container associated with the storage account

.. code-block:: bash

    salt-cloud -f lease_storage_container my-azure name=mycontainer

name
````
Name of container to create.

lease_action
````````````
Required. Possible values: acquire|renew|release|break|change

lease_id
````````
Required if the container has an active lease.

lease_duration
``````````````
Specifies the duration of the lease, in seconds, or negative one
(-1) for a lease that never expires. A non-infinite lease can be
between 15 and 60 seconds. A lease duration cannot be changed
using renew or change. For backwards compatibility, the default is
60, and the value is only used on an acquire operation.

lease_break_period
``````````````````
Optional. For a break operation, this is the proposed duration of
seconds that the lease should continue before it is broken, between
0 and 60 seconds. This break period is only used if it is shorter
than the time remaining on the lease. If longer, the time remaining
on the lease is used. A new lease will not be available before the
break period has expired, but the lease may be held for longer than
the break period. If this header does not appear with a break
operation, a fixed-duration lease breaks after the remaining lease
period elapses, and an infinite lease breaks immediately.

proposed_lease_id
`````````````````
Optional for acquire, required for change. Proposed lease ID, in a
GUID string format.


list_blobs
~~~~~~~~~~
List blobs associated with the container

.. code-block:: bash

    salt-cloud -f list_blobs my-azure container=mycontainer

container
`````````
The name of the storage container

prefix
``````
Optional. Filters the results to return only blobs whose names
begin with the specified prefix.

marker
``````
Optional. A string value that identifies the portion of the list
to be returned with the next list operation. The operation returns
a marker value within the response body if the list returned was
not complete. The marker value may then be used in a subsequent
call to request the next set of list items. The marker value is
opaque to the client.

maxresults
``````````
Optional. Specifies the maximum number of blobs to return,
including all BlobPrefix elements. If the request does not specify
maxresults or specifies a value greater than 5,000, the server will
return up to 5,000 items. Setting maxresults to a value less than
or equal to zero results in error response code 400 (Bad Request).

include
```````
Optional. Specifies one or more datasets to include in the
response. To specify more than one of these options on the URI,
you must separate each option with a comma. Valid values are::

    snapshots:
        Specifies that snapshots should be included in the
        enumeration. Snapshots are listed from oldest to newest in
        the response.
    metadata:
        Specifies that blob metadata be returned in the response.
    uncommittedblobs:
        Specifies that blobs for which blocks have been uploaded,
        but which have not been committed using Put Block List
        (REST API), be included in the response.
    copy:
        Version 2012-02-12 and newer. Specifies that metadata
        related to any current or previous Copy Blob operation
        should be included in the response.

delimiter
`````````
Optional. When the request includes this parameter, the operation
returns a BlobPrefix element in the response body that acts as a
placeholder for all blobs whose names begin with the same
substring up to the appearance of the delimiter character. The
delimiter may be a single character or a string.


show_blob_service_properties
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Show a blob's service properties

.. code-block:: bash

    salt-cloud -f show_blob_service_properties my-azure


set_blob_service_properties
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sets the properties of a storage account's Blob service, including
Windows Azure Storage Analytics. You can also use this operation to
set the default request version for all incoming requests that do not
have a version specified.

.. code-block:: bash

    salt-cloud -f set_blob_service_properties my-azure

properties
``````````
a StorageServiceProperties object.

timeout
```````
Optional. The timeout parameter is expressed in seconds.


show_blob_properties
~~~~~~~~~~~~~~~~~~~~
Returns all user-defined metadata, standard HTTP properties, and
system properties for the blob.

.. code-block:: bash

    salt-cloud -f show_blob_properties my-azure container=mycontainer blob=myblob

container
`````````
Name of existing container.

blob
````
Name of existing blob.

lease_id
````````
Required if the blob has an active lease.


set_blob_properties
~~~~~~~~~~~~~~~~~~~
Set a blob's properties

.. code-block:: bash

    salt-cloud -f set_blob_properties my-azure

container
`````````
Name of existing container.

blob
````
Name of existing blob.

blob_cache_control
``````````````````
Optional. Modifies the cache control string for the blob.

blob_content_type
`````````````````
Optional. Sets the blob's content type.

blob_content_md5
````````````````
Optional. Sets the blob's MD5 hash.

blob_content_encoding
`````````````````````
Optional. Sets the blob's content encoding.

blob_content_language
`````````````````````
Optional. Sets the blob's content language.

lease_id
````````
Required if the blob has an active lease.

blob_content_disposition
````````````````````````
Optional. Sets the blob's Content-Disposition header.
The Content-Disposition response header field conveys additional
information about how to process the response payload, and also can
be used to attach additional metadata. For example, if set to
attachment, it indicates that the user-agent should not display the
response, but instead show a Save As dialog with a filename other
than the blob name specified.


put_blob
~~~~~~~~
Upload a blob

.. code-block:: bash

    salt-cloud -f put_blob my-azure container=base name=top.sls blob_path=/srv/salt/top.sls
    salt-cloud -f put_blob my-azure container=base name=content.txt blob_content='Some content'

container
`````````
Name of existing container.

name
````
Name of existing blob.

blob_path
`````````
The path on the local machine of the file to upload as a blob. Either
this or blob_content must be specified.

blob_content
````````````
The actual content to be uploaded as a blob. Either this or blob_path
must me specified.

cache_control
`````````````
Optional. The Blob service stores this value but does not use or
modify it.

content_language
````````````````
Optional. Specifies the natural languages used by this resource.

content_md5
```````````
Optional. An MD5 hash of the blob content. This hash is used to
verify the integrity of the blob during transport. When this header
is specified, the storage service checks the hash that has arrived
with the one that was sent. If the two hashes do not match, the
operation will fail with error code 400 (Bad Request).

blob_content_type
`````````````````
Optional. Set the blob's content type.

blob_content_encoding
`````````````````````
Optional. Set the blob's content encoding.

blob_content_language
`````````````````````
Optional. Set the blob's content language.

blob_content_md5
````````````````
Optional. Set the blob's MD5 hash.

blob_cache_control
``````````````````
Optional. Sets the blob's cache control.

meta_name_values
````````````````
A dict containing name, value for metadata.

lease_id
````````
Required if the blob has an active lease.


get_blob
~~~~~~~~
Download a blob

.. code-block:: bash

    salt-cloud -f get_blob my-azure container=base name=top.sls local_path=/srv/salt/top.sls
    salt-cloud -f get_blob my-azure container=base name=content.txt return_content=True

container
`````````
Name of existing container.

name
````
Name of existing blob.

local_path
``````````
The path on the local machine to download the blob to. Either this or
return_content must be specified.

return_content
``````````````
Whether or not to return the content directly from the blob. If
specified, must be True or False. Either this or the local_path must
be specified.

snapshot
````````
Optional. The snapshot parameter is an opaque DateTime value that,
when present, specifies the blob snapshot to retrieve.

lease_id
````````
Required if the blob has an active lease.

progress_callback
`````````````````
callback for progress with signature function(current, total) where
current is the number of bytes transferred so far, and total is the
size of the blob.

max_connections
```````````````
Maximum number of parallel connections to use when the blob size
exceeds 64MB.
Set to 1 to download the blob chunks sequentially.
Set to 2 or more to download the blob chunks in parallel. This uses
more system resources but will download faster.

max_retries
```````````
Number of times to retry download of blob chunk if an error occurs.

retry_wait
``````````
Sleep time in secs between retries.
