-
Notifications
You must be signed in to change notification settings - Fork 2.9k
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
[Storage][Test] Test multiple service versions #19039
Changes from 5 commits
19df257
a205f3e
5b52e48
db1a868
508e5dd
741b098
519ab4a
fa78e37
bbbb81f
7fec5e9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
from enum import Enum | ||
|
||
|
||
class ServiceVersion(str, Enum): | ||
|
||
V2019_02_02 = "2019-02-02" | ||
V2019_07_07 = "2019-07-07" | ||
V2019_10_10 = "2019-10-10" | ||
V2019_12_12 = "2019-12-12" | ||
V2020_02_10 = "2020-02-10" | ||
V2020_04_08 = "2020-04-08" | ||
V2020_06_12 = "2020-06-12" | ||
V2020_08_04 = "2020-08-04" | ||
|
||
|
||
LATEST_SERVICE_VERSION = ServiceVersion.V2020_08_04 | ||
LATEST_SERVICE_VERSION_PLUS_1 = ServiceVersion.V2020_06_12 |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,7 +17,7 @@ | |
import zlib | ||
import math | ||
import sys | ||
import string | ||
import os | ||
import random | ||
import re | ||
import logging | ||
|
@@ -34,6 +34,7 @@ | |
except ImportError: | ||
from io import StringIO | ||
|
||
from azure.core.pipeline.policies import SansIOHTTPPolicy | ||
from azure.core.exceptions import ResourceNotFoundError, HttpResponseError | ||
from azure.core.credentials import AccessToken | ||
from azure.storage.blob import generate_account_sas, AccountSasPermissions, ResourceTypes | ||
|
@@ -50,6 +51,8 @@ | |
except ImportError: | ||
from devtools_testutils import mgmt_settings_fake as settings | ||
|
||
from .service_versions import LATEST_SERVICE_VERSION, ServiceVersion, LATEST_SERVICE_VERSION_PLUS_1 | ||
|
||
import pytest | ||
|
||
|
||
|
@@ -310,6 +313,32 @@ def generate_sas_token(self): | |
def generate_fake_token(self): | ||
return FakeTokenCredential() | ||
|
||
def _get_service_version(self, **kwargs): | ||
env_version = os.environ.get("AZURE_LIVE_TEST_SERVICE_VERSION", LATEST_SERVICE_VERSION)# ServiceVersion.V2020_04_08) | ||
return kwargs.pop("service_version", env_version) | ||
|
||
def create_storage_client(self, client, *args, **kwargs): | ||
kwargs["api_version"] = self._get_service_version(**kwargs) | ||
kwargs["_additional_pipeline_policies"] = [ApiVersionAssertPolicy(kwargs["api_version"])] | ||
return client(*args, **kwargs) | ||
seankane-msft marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
def create_storage_client_from_conn_str(self, client, *args, **kwargs): | ||
kwargs["api_version"] = self._get_service_version(**kwargs) | ||
kwargs["_additional_pipeline_policies"] = [ApiVersionAssertPolicy(kwargs["api_version"])] | ||
return client.from_connection_string(*args, **kwargs) | ||
|
||
|
||
class ApiVersionAssertPolicy(SansIOHTTPPolicy): | ||
""" | ||
Assert the ApiVersion is set properly on the response | ||
""" | ||
|
||
def __init__(self, api_version): | ||
self.api_version = api_version | ||
|
||
def on_request(self, request): | ||
assert request.http_request.headers['x-ms-version'] == self.api_version | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. will this throw if env variable is empty? , we should either handle it here or not inject policy if there's no service version provided extrenally. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No, if the env variable is empty it will default to |
||
|
||
|
||
def not_for_emulator(test): | ||
def skip_test_if_targeting_emulator(self): | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
from enum import Enum | ||
|
||
|
||
class ServiceVersion(str, Enum): | ||
|
||
V2019_02_02 = "2019-02-02" | ||
V2019_07_07 = "2019-07-07" | ||
V2019_10_10 = "2019-10-10" | ||
V2019_12_12 = "2019-12-12" | ||
V2020_02_10 = "2020-02-10" | ||
V2020_04_08 = "2020-04-08" | ||
V2020_06_12 = "2020-06-12" | ||
V2020_08_04 = "2020-08-04" | ||
|
||
|
||
LATEST_SERVICE_VERSION = ServiceVersion.V2020_08_04 | ||
LATEST_SERVICE_VERSION_PLUS_1 = ServiceVersion.V2020_06_12 |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -34,6 +34,7 @@ | |
except ImportError: | ||
from io import StringIO | ||
|
||
from azure.core.pipeline.policies import SansIOHTTPPolicy | ||
from azure.core.exceptions import ResourceNotFoundError, HttpResponseError | ||
from azure.core.credentials import AccessToken | ||
from azure.storage.queue import generate_account_sas, AccountSasPermissions, ResourceTypes | ||
|
@@ -52,6 +53,8 @@ | |
|
||
import pytest | ||
|
||
from .service_versions import ServiceVersion, LATEST_SERVICE_VERSION | ||
|
||
|
||
LOGGING_FORMAT = '%(asctime)s %(name)-20s %(levelname)-5s %(message)s' | ||
os.environ['AZURE_STORAGE_ACCOUNT_NAME'] = STORAGE_ACCOUNT_NAME | ||
|
@@ -310,13 +313,39 @@ def generate_sas_token(self): | |
def generate_fake_token(self): | ||
return FakeTokenCredential() | ||
|
||
def _get_service_version(self, **kwargs): | ||
env_version = os.environ.get("AZURE_LIVE_TEST_SERVICE_VERSION", LATEST_SERVICE_VERSION) | ||
return kwargs.pop("service_version", env_version) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is there a way to not copy code between storage modules? "storage test shared" module would be great. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We can probably put this in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That'd be great. not a blocker here, but we should do something about all these clones in long term. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. After merging this, I can make changes for that |
||
|
||
def create_storage_client(self, client, *args, **kwargs): | ||
kwargs["api_version"] = self._get_service_version(**kwargs) | ||
kwargs["_additional_pipeline_policies"] = [ApiVersionAssertPolicy(kwargs["api_version"])] | ||
return client(*args, **kwargs) | ||
|
||
def create_storage_client_from_conn_str(self, client, *args, **kwargs): | ||
kwargs["api_version"] = self._get_service_version(**kwargs) | ||
kwargs["_additional_pipeline_policies"] = [ApiVersionAssertPolicy(kwargs["api_version"])] | ||
return client.from_connection_string(*args, **kwargs) | ||
|
||
|
||
def not_for_emulator(test): | ||
def skip_test_if_targeting_emulator(self): | ||
test(self) | ||
return skip_test_if_targeting_emulator | ||
|
||
|
||
class ApiVersionAssertPolicy(SansIOHTTPPolicy): | ||
""" | ||
Assert the ApiVersion is set properly on the response | ||
""" | ||
|
||
def __init__(self, api_version): | ||
self.api_version = api_version | ||
|
||
def on_request(self, request): | ||
assert request.http_request.headers['x-ms-version'] == self.api_version | ||
|
||
|
||
class RetryCounter(object): | ||
def __init__(self): | ||
self.count = 0 | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
{ | ||
"displayNames": { | ||
"--disablecov": "", | ||
"false": "", | ||
"true": "" | ||
}, | ||
"matrix": { | ||
"Agent": { | ||
"ubuntu-18.04": { "OSVmImage": "MMSUbuntu18.04", "Pool": "azsdk-pool-mms-ubuntu-1804-general" }, | ||
"windows-2019": { "OSVmImage": "MMS2019", "Pool": "azsdk-pool-mms-win-2019-general" }, | ||
"macOS-10.15": { "OSVmImage": "macOS-10.15", "Pool": "Azure Pipelines" } | ||
}, | ||
"PythonVersion": [ "pypy3", "2.7", "3.6", "3.7", "3.8", "3.9" ], | ||
"CoverageArg": "--disablecov", | ||
"TestSamples": "false", | ||
"AZURE_LIVE_TEST_SERVICE_VERSION": [ | ||
"V2019_02_02", | ||
"V2019_07_07", | ||
"V2019_12_12", | ||
"V2020_02_10", | ||
"V2020_04_08", | ||
"V2020_06_12", | ||
"V2020_08_04" | ||
] | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
in nightly pipeline we'd like clients to pick the default, i.e. env variable is empty.
does this code achieve this by leaving "api_version" kwarg empty or we need some "if" here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If the environment variable is empty, it will default to
LATEST_SERVICE_VERSION