Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
50 changes: 0 additions & 50 deletions sdk/cosmos/.azure-pipelines/cosmos.test.nightly-emulator.yml

This file was deleted.

52 changes: 46 additions & 6 deletions sdk/cosmos/.azure-pipelines/cosmos.test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,51 @@ jobs:
vmImage: $(OSVmImage)

steps:
- task: PowerShell@1
displayName: 'Download Public Cosmos Emulator'
inputs:
scriptType: inlineScript
inlineScript: |
Write-Host "Downloading Cosmos Emulator - $(EmulatorMsiUrl)"
wget "$(EmulatorMsiUrl)" -outfile "$env:temp\azure-cosmosdb-emulator.msi"
Write-Host "Finished Downloading Cosmos Emulator - $env:temp\azure-cosmosdb-emulator.msi"
dir "$env:temp"

- task: CmdLine@2
displayName: 'Cleanup already installed Azure Cosmos DB Emulator'
inputs:
script: |
echo "Deleting Azure Cosmos DB Emulator directory"
dir "%ProgramFiles%\"
rmdir /Q /S "%ProgramFiles%\Azure Cosmos DB Emulator"
echo "Directory after deleting"
dir "%ProgramFiles%\"

- task: CmdLine@2
displayName: 'Install Public Cosmos DB Emulator'
inputs:
script: |
choco install lessmsi
choco upgrade lessmsi
echo "Checking directory"
dir "%ProgramFiles%"
mkdir "%TEMP%\Azure Cosmos DB Emulator"
lessmsi x "%TEMP%\azure-cosmosdb-emulator.msi" "%TEMP%\Azure Cosmos DB Emulator\"
dir "%TEMP%"
dir "%Temp%\Azure Cosmos DB Emulator\"

- task: PowerShell@1
displayName: 'Run Public Cosmos DB Emulator'
inputs:
scriptType: inlineScript
inlineScript: |
dir "$env:Temp\"
dir "$env:Temp\Azure Cosmos DB Emulator"
dir "$env:Temp\Azure Cosmos DB Emulator\SourceDir\"
dir "$env:Temp\Azure Cosmos DB Emulator\SourceDir\Azure Cosmos DB Emulator"
Write-Host "Starting Comsos DB Emulator"
Start-Process "$env:Temp\Azure Cosmos DB Emulator\SourceDir\Azure Cosmos DB Emulator\CosmosDB.Emulator.exe" "/NoExplorer /NoUI" -Verb RunAs

- task: UsePythonVersion@0
displayName: 'Use Python $(PythonVersion)'
inputs:
Expand All @@ -36,17 +81,12 @@ jobs:
python scripts/dev_setup.py --packageList azure-cosmos
displayName: 'Set up Environment'

- task: azure-cosmosdb.emulator-public-preview.run-cosmosdbemulatorcontainer.CosmosDbEmulator@2
displayName: "Run Azure Cosmos DB Emulator container"
inputs:
defaultPartitionCount: 25

- task: PowerShell@1
displayName: 'Run Python Tests'
inputs:
scriptType: inlineScript
inlineScript: |
$env:ACCOUNT_HOST="$(CosmosDBEmulator.Endpoint)"
$env:ACCOUNT_HOST="https://localhost:8081/"
cmd /c 'pytest --junitxml=sdk/cosmos/azure-cosmos/Test-junit.xml --verbose sdk/cosmos/azure-cosmos/test -k "not globaldb"'

condition: succeededOrFailed()
Expand Down
10 changes: 8 additions & 2 deletions sdk/cosmos/azure-cosmos/azure/cosmos/cosmos_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import azure.cosmos.routing.routing_map_provider as routing_map_provider
import azure.cosmos.session as session
import azure.cosmos.utils as utils
import os

class CosmosClient(object):
"""Represents a document client.
Expand Down Expand Up @@ -80,12 +81,15 @@ def __init__(self,
:param documents.ConsistencyLevel consistency_level:
The default consistency policy for client operations.

if url_connection and auth are not provided,
COSMOS_ENDPOINT and COSMOS_KEY environment variables will be used.
"""
self.url_connection = url_connection

self.url_connection = url_connection or os.environ.get('COSMOS_ENDPOINT')

self.master_key = None
self.resource_tokens = None
if auth != None:
if auth is not None:
self.master_key = auth.get('masterKey')
self.resource_tokens = auth.get('resourceTokens')

Expand All @@ -95,6 +99,8 @@ def __init__(self,
resource_parts = permission_feed['resource'].split('/')
id = resource_parts[-1]
self.resource_tokens[id] = permission_feed['_token']
else:
self.master_key = os.environ.get('COSMOS_KEY')

self.connection_policy = (connection_policy or
documents.ConnectionPolicy())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,8 @@ def __lt__(self, other):
return self._doc_producer_comp.compare(self, other) < 0

def _compare_helper(a, b):
if a is None and b is None:
return 0
return (a > b) - (a < b)

class _PartitionKeyRangeDocumentProduerComparator(object):
Expand Down
2 changes: 1 addition & 1 deletion sdk/cosmos/azure-cosmos/azure/cosmos/http_constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ class Versions:
"""
CurrentVersion = '2018-09-17'
SDKName = 'azure-cosmos'
SDKVersion = '3.0.3-SNAPSHOT'
SDKVersion = '3.1.0'


class Delimiters:
Expand Down
4 changes: 2 additions & 2 deletions sdk/cosmos/azure-cosmos/doc/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@
# built documents.
#
# The short X.Y version.
version = '3.0.3-SNAPSHOT'
version = '3.1.0'
# The full version, including alpha/beta/rc tags.
release = '3.0.3-SNAPSHOT'
release = '3.1.0'

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
Expand Down
29 changes: 28 additions & 1 deletion sdk/cosmos/azure-cosmos/samples/CollectionManagement/Program.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
# 2.2 - Create collection with custom IndexPolicy
# 2.3 - Create collection with offer throughput set
# 2.4 - Create collection with unique key
# 2.5 - Create Collection with partition key
# 2.6 - Create Collection with partition key V2
#
# 3. Manage Collection Offer Throughput
# 3.1 - Get Collection performance tier
Expand Down Expand Up @@ -165,12 +167,37 @@ def create_Container(client, id):

collection = client.CreateContainer(database_link, coll)
print('Collection with id \'{0}\' created'.format(collection['id']))
print('Partition Key - \'{0}\''.format(collection['partitionKey']))

except errors.CosmosError as e:
if e.status_code == 409:
print('A collection with id \'{0}\' already exists'.format(collection['id']))
else:
raise errors.HTTPFailure(e.status_code)
raise errors.HTTPFailure(e.status_code)

print("\n2.6 Create Collection - With Partition key V2")

try:
coll = {
"id": "collection_partition_key_v2",
"partitionKey": {
"paths": [
"/field1"
],
"kind": "Hash",
"version": 2
}
}

collection = client.CreateContainer(database_link, coll)
print('Collection with id \'{0}\' created'.format(collection['id']))
print('Partition Key - \'{0}\''.format(collection['partitionKey']))

except errors.CosmosError as e:
if e.status_code == 409:
print('A collection with id \'{0}\' already exists'.format(collection['id']))
else:
raise errors.HTTPFailure(e.status_code)

@staticmethod
def manage_offer_throughput(client, id):
Expand Down
99 changes: 99 additions & 0 deletions sdk/cosmos/azure-cosmos/samples/IndexManagement/Program.py
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,102 @@ def PerformIndexTransformations(client, database_id):
else:
raise

def PerformMultiOrderbyQuery(client, database_id):
try:
DeleteContainerIfExists(client, database_id, COLLECTION_ID)
database_link = GetDatabaseLink(database_id)

# Create a collection with composite indexes
indexingPolicy = {
"compositeIndexes": [
[
{
"path": "/numberField",
"order": "ascending"
},
{
"path": "/stringField",
"order": "descending"
}
],
[
{
"path": "/numberField",
"order": "descending"
},
{
"path": "/stringField",
"order": "ascending"
},
{
"path": "/numberField2",
"order": "descending"
},
{
"path": "/stringField2",
"order": "ascending"
}
]
]
}

container_definition = {
'id': COLLECTION_ID,
'indexingPolicy': indexingPolicy
}

created_container = client.CreateContainer(database_link, container_definition)

print(created_container)

print("\n" + "-" * 25 + "\n8. Collection created with index policy")
print_dictionary_items(created_container["indexingPolicy"])

# Insert some documents
collection_link = GetContainerLink(database_id, COLLECTION_ID)
doc1 = client.CreateItem(collection_link, {"id": "doc1", "numberField": 1, "stringField": "1", "numberField2": 1, "stringField2": "1"})
doc2 = client.CreateItem(collection_link, {"id": "doc2", "numberField": 1, "stringField": "1", "numberField2": 1, "stringField2": "2"})
doc3 = client.CreateItem(collection_link, {"id": "doc3", "numberField": 1, "stringField": "1", "numberField2": 2, "stringField2": "1"})
doc4 = client.CreateItem(collection_link, {"id": "doc4", "numberField": 1, "stringField": "1", "numberField2": 2, "stringField2": "2"})
doc5 = client.CreateItem(collection_link, {"id": "doc5", "numberField": 1, "stringField": "2", "numberField2": 1, "stringField2": "1"})
doc6 = client.CreateItem(collection_link, {"id": "doc6", "numberField": 1, "stringField": "2", "numberField2": 1, "stringField2": "2"})
doc7 = client.CreateItem(collection_link, {"id": "doc7", "numberField": 1, "stringField": "2", "numberField2": 2, "stringField2": "1"})
doc8 = client.CreateItem(collection_link, {"id": "doc8", "numberField": 1, "stringField": "2", "numberField2": 2, "stringField2": "2"})
doc9 = client.CreateItem(collection_link, {"id": "doc9", "numberField": 2, "stringField": "1", "numberField2": 1, "stringField2": "1"})
doc10 = client.CreateItem(collection_link, {"id": "doc10", "numberField": 2, "stringField": "1", "numberField2": 1, "stringField2": "2"})
doc11 = client.CreateItem(collection_link, {"id": "doc11", "numberField": 2, "stringField": "1", "numberField2": 2, "stringField2": "1"})
doc12 = client.CreateItem(collection_link, {"id": "doc12", "numberField": 2, "stringField": "1", "numberField2": 2, "stringField2": "2"})
doc13 = client.CreateItem(collection_link, {"id": "doc13", "numberField": 2, "stringField": "2", "numberField2": 1, "stringField2": "1"})
doc14 = client.CreateItem(collection_link, {"id": "doc14", "numberField": 2, "stringField": "2", "numberField2": 1, "stringField2": "2"})
doc15 = client.CreateItem(collection_link, {"id": "doc15", "numberField": 2, "stringField": "2", "numberField2": 2, "stringField2": "1"})
doc16 = client.CreateItem(collection_link, {"id": "doc16", "numberField": 2, "stringField": "2", "numberField2": 2, "stringField2": "2"})

print("Query documents and Order by 1st composite index: Ascending numberField and Descending stringField:")

query = {
"query": "SELECT * FROM r ORDER BY r.numberField ASC, r.stringField DESC",
}
QueryDocumentsWithCustomQuery(client, collection_link, query)

print("Query documents and Order by inverted 2nd composite index -")
print("Ascending numberField, Descending stringField, Ascending numberField2, Descending stringField2")

query = {
"query": "SELECT * FROM r ORDER BY r.numberField ASC, r.stringField DESC, r.numberField2 ASC, r.stringField2 DESC",
}
QueryDocumentsWithCustomQuery(client, collection_link, query)

# Cleanup
client.DeleteContainer(collection_link)
print("\n")
except errors.HTTPFailure as e:
if e.status_code == 409:
print("Entity already exists")
elif e.status_code == 404:
print("Entity doesn't exist")
else:
raise

def RunIndexDemo():
try:
client = ObtainClient()
Expand Down Expand Up @@ -592,6 +688,9 @@ def RunIndexDemo():
# 7. Perform an index transform
PerformIndexTransformations(client, DATABASE_ID)

# 8. Perform Multi Orderby queries using composite indexes
PerformMultiOrderbyQuery(client, DATABASE_ID)

except errors.CosmosError as e:
raise e

Expand Down
2 changes: 1 addition & 1 deletion sdk/cosmos/azure-cosmos/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import setuptools

setup(name='azure-cosmos',
version='3.0.3-SNAPSHOT',
version='3.1.0',
description='Azure Cosmos Python SDK',
author="Microsoft",
author_email="askdocdb@microsoft.com",
Expand Down
13 changes: 9 additions & 4 deletions sdk/cosmos/azure-cosmos/test/aggregate_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
import test_config
from azure.cosmos.errors import HTTPFailure

pytestmark = pytest.mark.cosmosEmulator

class _config:
host = test_config._test_config.host
master_key = test_config._test_config.masterKey
Expand Down Expand Up @@ -199,15 +201,18 @@ def _get_collection_link(database, document_collection, is_name_based=True):

_all_tests = []

_setup()
_generate_test_configs()
_run_all()

return type.__new__(mcs, name, bases, dict)


@pytest.mark.usefixtures("teardown")
class AggregationQueryTest(with_metaclass(AggregateQueryTestSequenceMeta, unittest.TestCase)):

@classmethod
def setUpClass(cls):
cls._setup()
cls._generate_test_configs()
cls._run_all()

def _execute_query_and_validate_results(self, client, collection_link, query, expected):
print('Running test with query: ' + query)

Expand Down
2 changes: 2 additions & 0 deletions sdk/cosmos/azure-cosmos/test/base_unit_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
import pytest
import azure.cosmos.base as base

pytestmark = pytest.mark.cosmosEmulator

@pytest.mark.usefixtures("teardown")
class BaseUnitTests(unittest.TestCase):
def test_is_name_based(self):
Expand Down
Loading