Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Azure Storage File Track2 #6106

Merged
merged 39 commits into from
Jul 3, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
b6b59c9
Files Skeleton (#5921)
Jun 18, 2019
66945f3
Generate storage files autorest layer (#5926)
Jun 18, 2019
6663e43
Rename files to file
rakshith91 Jun 18, 2019
ee7a6a2
[Storage Files] API skeleton with helper files (#5965)
Jun 19, 2019
f4d1a6d
Hookup File Service Client (#5977)
Jun 20, 2019
6033e96
Hookup share client (#6000)
Jun 20, 2019
f9a9d16
Directory client hookup + File client Hookup (#6040)
Jun 23, 2019
202e3a5
[storage-files]Started adding files tests (#6051)
annatisch Jun 24, 2019
57ecb91
share tests (#6084)
Jun 25, 2019
18bdba5
Updates for file client tests
annatisch Jun 25, 2019
7c2374b
Merged clients
annatisch Jun 25, 2019
e673f7a
Fixed tests
annatisch Jun 26, 2019
9218858
Recorded tests
annatisch Jun 26, 2019
7ca5520
Clean test pass
annatisch Jun 26, 2019
03e1867
Packaging update of azure-storage-file
AutorestCI Jun 26, 2019
5d025c9
Fixed acl test
annatisch Jun 26, 2019
d761fca
Fixed copy test
annatisch Jun 26, 2019
9aa6cdc
More recordings
annatisch Jun 26, 2019
3a434bd
Fixed copy recordings
annatisch Jun 26, 2019
c381b77
Fixed directory test
annatisch Jun 26, 2019
ea607e7
Added close handles
annatisch Jun 27, 2019
7a0d958
Merge branch 'azure-storage-file-track2' of https://github.com/Azure/…
annatisch Jun 27, 2019
c2f0f11
Updated packaging
annatisch Jun 27, 2019
2918ead
Updated user agent policy
annatisch Jun 28, 2019
4b8f7a1
Updated dependencies
annatisch Jun 28, 2019
7ac19a8
Fixed handles tests
annatisch Jun 28, 2019
17243ba
Fixed syntax
annatisch Jun 28, 2019
2d42f76
Files dependency conflict
annatisch Jun 28, 2019
d6e6bfe
docstrings for files (#6128)
kristapratico Jun 28, 2019
3622be4
Storage-File readme (#6156)
kristapratico Jun 28, 2019
fbc56c5
Removed Py3.4 tag
annatisch Jun 28, 2019
c4965bb
Merge remote-tracking branch 'origin/master' into azure-storage-file-…
annatisch Jun 28, 2019
b505b21
Clean pylint
annatisch Jun 28, 2019
a14ef5e
Fixed generated models
annatisch Jun 28, 2019
a583fd1
Code samples for files (#6159)
kristapratico Jun 29, 2019
139e1b5
Fix CI
annatisch Jun 29, 2019
e9341e0
[storage-file] Docs updates (#6189)
annatisch Jul 2, 2019
b658194
Merge branch 'master' into azure-storage-file-track2
annatisch Jul 2, 2019
bfcd0eb
[Storage File] pylint + mypy pass (#6202)
rakshith91 Jul 3, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ src/build
adlEnv/

code_reports

# Azure Storage test credentials
sdk/storage/azure-storage-blob/tests/settings_real.py
sdk/storage/azure-storage-queue/tests/settings_real.py
sdk/storage/azure-storage-file/tests/settings_real.py
51 changes: 51 additions & 0 deletions sdk/storage/azure-storage-blob/tests/blob_settings_fake.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# -------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# --------------------------------------------------------------------------

# NOTE: these keys are fake, but valid base-64 data, they were generated using:
# base64.b64encode(os.urandom(64))

STORAGE_ACCOUNT_NAME = "storagename"
STORAGE_ACCOUNT_KEY = "NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg=="
BLOB_STORAGE_ACCOUNT_NAME = "blobstoragename"
BLOB_STORAGE_ACCOUNT_KEY = "NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg=="
REMOTE_STORAGE_ACCOUNT_NAME = "storagename"
REMOTE_STORAGE_ACCOUNT_KEY = "NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg=="
PREMIUM_STORAGE_ACCOUNT_NAME = "premiumstoragename"
PREMIUM_STORAGE_ACCOUNT_KEY = "NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg=="
OAUTH_STORAGE_ACCOUNT_NAME = "oauthstoragename"
OAUTH_STORAGE_ACCOUNT_KEY = "XBB/YoZ41bDFBW1VcgCBNYmA1PDlc3NvQQaCk2rb/JtBoMBlekznQwAzDJHvZO1gJmCh8CUT12Gv3aCkWaDeGA=="

# Configurations related to Active Directory, which is used to obtain a token credential
ACTIVE_DIRECTORY_APPLICATION_ID = "68390a19-a897-236b-b453-488abf67b4fc"
ACTIVE_DIRECTORY_APPLICATION_SECRET = "3Ujhg7pzkOeE7flc6Z187ugf5/cJnszGPjAiXmcwhaY="
ACTIVE_DIRECTORY_TENANT_ID = "32f988bf-54f1-15af-36ab-2d7cd364db47"

# Use instead of STORAGE_ACCOUNT_NAME and STORAGE_ACCOUNT_KEY if custom settings are needed
CONNECTION_STRING = "DefaultEndpointsProtocol=https;AccountName=storagename;AccountKey=NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg==;EndpointSuffix=core.windows.net"
BLOB_CONNECTION_STRING = "DefaultEndpointsProtocol=https;AccountName=blobstoragename;AccountKey=NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg==;EndpointSuffix=core.windows.net"
PREMIUM_CONNECTION_STRING = "DefaultEndpointsProtocol=https;AccountName=premiumstoragename;AccountKey=NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg==;EndpointSuffix=core.windows.net"
# Use 'https' or 'http' protocol for sending requests, 'https' highly recommended
PROTOCOL = "https"

# Set to true if server side file encryption is enabled
IS_SERVER_SIDE_FILE_ENCRYPTION_ENABLED = True

# Decide which test mode to run against. Possible options:
# - Playback: run against stored recordings
# - Record: run tests against live storage and update recordings
# - RunLiveNoRecord: run tests against live storage without altering recordings
TEST_MODE = 'Playback'

# Set to true to enable logging for the tests
# logging is not enabled by default because it pollutes the CI logs
ENABLE_LOGGING = False

# Set up proxy support
USE_PROXY = False
PROXY_HOST = "192.168.15.116"
PROXY_PORT = "8118"
PROXY_USER = ""
PROXY_PASSWORD = ""
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
try:
import settings_real as settings
except ImportError:
import settings_fake as settings
import blob_settings_fake as settings

from testcase import (
StorageTestCase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
try:
import settings_real as settings
except ImportError:
import settings_fake as settings
import blob_settings_fake as settings

from testcase import (
StorageTestCase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
try:
import settings_real as settings
except ImportError:
import settings_fake as settings
import blob_settings_fake as settings

from testcase import (
StorageTestCase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
try:
import settings_real as settings
except ImportError:
import settings_fake as settings
import blob_settings_fake as settings

from testcase import (
StorageTestCase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
try:
import settings_real as settings
except ImportError:
import settings_fake as settings
import blob_settings_fake as settings

from testcase import (
StorageTestCase,
Expand Down
2 changes: 1 addition & 1 deletion sdk/storage/azure-storage-blob/tests/testcase.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import unittest
import sys
import random
import settings_fake as fake_settings
import logging

try:
Expand All @@ -31,6 +30,7 @@

from azure.core.credentials import AccessToken

import blob_settings_fake as fake_settings
try:
import settings_real as settings
except ImportError:
Expand Down
41 changes: 41 additions & 0 deletions sdk/storage/azure-storage-file/HISTORY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Change Log azure-storage-file

## Version 12.0.0b1:

For release notes and more information please visit
https://aka.ms/azure-sdk-preview1-python

## Version 2.0.1:
- Updated dependency on azure-storage-common.

## Version 2.0.0:
- Support for 2018-11-09 REST version. Please see our REST API documentation and blogs for information about the related added features.
- Added an option to get share stats in bytes.
- Added support for listing and closing file handles.

## Version 1.4.0:

- azure-storage-nspkg is not installed anymore on Python 3 (PEP420-based namespace package)

## Version 1.3.1:

- Fixed design flaw where get_file_to_* methods buffer entire file when max_connections is set to 1.

## Version 1.3.0:

- Support for 2018-03-28 REST version. Please see our REST API documentation and blog for information about the related added features.

## Version 1.2.0rc1:

- Support for 2017-11-09 REST version. Please see our REST API documentation and blog for information about the related added features.

## Version 1.1.0:

- Support for 2017-07-29 REST version. Please see our REST API documentation and blogs for information about the related added features.
- Error message now contains the ErrorCode from the x-ms-error-code header value.

## Version 1.0.0:

- The package has switched from Apache 2.0 to the MIT license.
- Fixed bug where get_file_to_* cannot get a single byte when start_range and end_range are both equal to 0.
- Metadata keys are now case-preserving when fetched from the service. Previously they were made lower-case by the library.
21 changes: 21 additions & 0 deletions sdk/storage/azure-storage-file/LICENSE.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
The MIT License (MIT)

Copyright (c) 2017 Microsoft

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
4 changes: 4 additions & 0 deletions sdk/storage/azure-storage-file/MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
include *.md
include azure/__init__.py
include azure/storage/__init__.py
include LICENSE.txt
181 changes: 181 additions & 0 deletions sdk/storage/azure-storage-file/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
# Azure Storage File client library for Python
Azure File offers fully managed file shares in the cloud that are accessible via the industry standard [Server Message Block (SMB) protocol](https://docs.microsoft.com/windows/desktop/FileIO/microsoft-smb-protocol-and-cifs-protocol-overview). Azure file shares can be mounted concurrently by cloud or on-premises deployments of Windows, Linux, and macOS. Additionally, Azure file shares can be cached on Windows Servers with Azure File Sync for fast access near where the data is being used.

Azure file shares can be used to:

* Replace or supplement on-premises file servers
* "Lift and shift" applications
* Simplify cloud development with shared application settings, diagnostic share, and Dev/Test/Debug tools

[Source code](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/azure/storage/file) | [Package (PyPi)](https://pypi.org/project/azure-storage-file/) | [API reference documentation](https://docs.microsoft.com/rest/api/storageservices/file-service-rest-api) | [Product documentation](https://docs.microsoft.com/azure/storage/) | [Samples](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/samples)

## Getting started

### Install the package
Install the Azure Storage File client library for Python with [pip](https://pypi.org/project/pip/):

```bash
pip install azure-storage-file
```

**Prerequisites**: You must have an [Azure subscription](https://azure.microsoft.com/free/), and a
[Storage Account](https://docs.microsoft.com/azure/storage/common/storage-account-overview) to use this package.

To create a Storage Account, you can use the [Azure Portal](https://docs.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-portal),
[Azure PowerShell](https://docs.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-powershell) or [Azure CLI](https://docs.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-cli):

```bash
az storage account create -n MyStorageAccountName -g MyResourceGroupName
```

Requires Python 2.7, 3.5 or later to use this package.

### Authenticate the client

Interaction with Storage File starts with an instance of the FileServiceClient class. You need an existing storage account, its URL, and a credential to instantiate the client object.

#### Get credentials

To authenticate the client you have a few options:
1. Use a SAS token string
2. Use an account shared access key

Alternatively, you can authenticate with a storage connection string using the `from_connection_string` method. See example: [Client creation with a connection string](#client-creation-with-a-connection-string).

You can omit the credential if your account URL already has a SAS token.

#### Create client

Once you have your account URL and credentials ready, you can create the FileServiceClient:

```python
from azure.storage.file import FileServiceClient

service = FileServiceClient(account_url="https://<my-storage-account-name>.file.core.windows.net/", credential=credential)
```

## Key concepts

File storage includes the following concepts:
* The storage account
* A file storage share
* An optional hierarchy of directories
* A file in the share which may be up to 1 TiB in size

#### Clients

The Storage File SDK provides four different clients to interact with the File Service:
1. **FileServiceClient** - this client interacts with the File Service at the account level.
It provides operations to retrieve and configure the service properties
as well as list, create, and delete shares within the storage account.
For operations relating to a specific share, a client for that entity
can also be retrieved using the `get_share_client` function.
2. **ShareClient** - this client represents interaction with a specific
file share, although that share need not exist yet. It provides operations to create, delete, or
configure shares and includes operations to list and create files or directories.
For operations relating to a specific directory or file, those clients can also be retrieved using
the `get_directory_client` or `get_file_client` functions.
3. **DirectoryClient** - this client represents interaction with a specific
directory, although that directory need not exist yet. It provides operations to create, delete, and list
directories and subdirectories, as well as create and delete files in the directory. For operations
relating to a specific subdirectory or file, a client for that entity can also be retrieved using
the `get_subdirectory_client` and `get_file_client` functions.
4. **FileClient** - this client represents interaction with a specific file, although the file need not
exist yet. It provides operations to create, upload, copy, and download files as well as more advanced
operations.

For details on path naming restrictions, see [Naming and Referencing Shares, Directories, Files, and Metadata](https://docs.microsoft.com/rest/api/storageservices/naming-and-referencing-shares--directories--files--and-metadata).

## Examples

The following sections provide several code snippets covering some of the most common Storage File tasks, including:

* [Client creation with a connection string](#client-creation-with-a-connection-string)
* [Create a file share](#create-a-file-share)
* [Upload a file](#upload-a-file)


### Client creation with a connection string
Create the FileServiceClient using the connection string to your Azure Storage account.

```python
from azure.storage.file import FileServiceClient

service = FileServiceClient.from_connection_string("my_connection_string")
```

### Create a file share
Create a file share to store your files.

```python
from azure.storage.file import ShareClient

share = ShareClient.from_connection_string("my_connection_string", share="myshare")
share.create_share()
```

### Upload a file
Upload a file to the share

```python
from azure.storage.file import FileClient

file = FileClient.from_connection_string("my_connection_string", share="share", file_path="myfile")

with open("./SampleSource.txt", "rb") as source_file:
file.upload_file(source_file)
```

## Troubleshooting
Storage File clients raise exceptions defined in [Azure Core](https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/core/azure-core/docs/exceptions.md).

All File service operations will throw a StorageErrorException on failure with helpful [error codes](https://docs.microsoft.com/rest/api/storageservices/file-service-error-codes).

## Next steps
### More sample code

Get started with our [File samples](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/samples).

Several Storage File Python SDK samples are available to you in the SDK's GitHub repository. These samples provide example code for additional scenarios commonly encountered while working with Storage File:

* [`test_file_samples_hello_world.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/test_file_samples_hello_world.py) - Examples found in this article:
* Client creation
* Create a file share
* Upload a file

* [`test_file_samples_authentication.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/test_file_samples_authentication.py) - Examples for authenticating and creating the client:
* From a connection string
* From a shared access key
* From a shared access signature token

* [`test_file_samples_service.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/test_file_samples_service.py) - Examples for interacting with the file service:
* Get and set service properties
* Create, list, and delete shares
* Get a share client

* [`test_file_samples_share.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/test_file_samples_share.py) - Examples for interacting with file shares:
* Create a share snapshot
* Set share quota and metadata
* List directories and files
* Get the directory or file client to interact with a specific entity

* [`test_file_samples_directory.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/test_file_samples_directory.py) - Examples for interacting with directories:
* Create a directory and add files
* Create and delete subdirectories
* Get the subdirectory client

* [`test_file_samples_file.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/test_file_samples_file.py) - Examples for interacting with files:
* Create, upload, download, and delete files
* Copy a file from a URL

### Additional documentation

For more extensive documentation on the Azure Storage File, see the [Azure Storage File documentation](https://docs.microsoft.com/azure/storage/) on docs.microsoft.com.


## Contributing
This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.microsoft.com.

When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA.

This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [[email protected]](mailto:[email protected]) with any additional questions or comments.
1 change: 1 addition & 0 deletions sdk/storage/azure-storage-file/azure/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__path__ = __import__('pkgutil').extend_path(__path__, __name__) # type: ignore
1 change: 1 addition & 0 deletions sdk/storage/azure-storage-file/azure/storage/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__path__ = __import__('pkgutil').extend_path(__path__, __name__) # type: ignore
Loading