Skip to content
Closed
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
4 changes: 4 additions & 0 deletions src/aem/HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

Release History
===============
1.0.1
+++++
* Remove DATA_COSMOS_TABLE and DATA_STORAGE references

1.0.0
+++++
* Remove msrestazure dependency
Expand Down
30 changes: 17 additions & 13 deletions src/aem/azext_aem/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ def _verify_old(self, skip_storage_check, wait_time_in_minutes, aem_ext):
else:
logger.warning("\t\tStorage Metrics configuration check for '%s'...", storage_account_name)
storage_client = self._get_storage_client(storage_account_name, disk['key'])
service_properties = storage_client.get_blob_service_properties()
service_properties = storage_client.get_service_properties()
storage_cfg_ok = EnhancedMonitoring._check_storage_analytics(service_properties)
if storage_cfg_ok:
logger.warning('\t\tStorage Metrics configuration check: %s', succ_word)
Expand Down Expand Up @@ -731,44 +731,48 @@ def _get_disk_info(self):
return disks_info

def _get_blob_size(self, storage_account_name, container, blob, key):
storage_client = self._get_storage_client(storage_account_name, key)
blob_service_client = self._get_storage_client(storage_account_name, key)
blob_client = blob_service_client.get_blob_client(container, blob)
# convert to GB
return int(storage_client.get_blob_properties(container, blob).properties.content_length / (1 << 30))
return int(blob_client.properties.size / (1 << 30))

def _get_storage_client(self, storage_account_name, key):
BlockBlobService = get_sdk(self._cmd.cli_ctx, ResourceType.DATA_STORAGE,
'blob.blockblobservice#BlockBlobService')
BlobServiceClient = get_sdk(self._cmd.cli_ctx, ResourceType.DATA_STORAGE_BLOB,
'_blob_service_client#BlobServiceClient')
return get_data_service_client(
self._cmd.cli_ctx,
BlockBlobService,
BlobServiceClient,
storage_account_name,
key,
endpoint_suffix=self._cmd.cli_ctx.cloud.suffixes.storage_endpoint) # pylint: disable=no-member

def _enable_storage_analytics(self, storage_account_name, key):
storage_client = self._get_storage_client(storage_account_name, key)
service_properties = storage_client.get_blob_service_properties()
service_properties = storage_client.get_service_properties()
if not EnhancedMonitoring._check_storage_analytics(service_properties):
t_logging, t_retention_policy, t_metrics = get_sdk(self._cmd.cli_ctx, ResourceType.DATA_STORAGE, 'Logging',
'RetentionPolicy', 'Metrics', mod='common.models')
t_logging, t_retention_policy, t_metrics = get_sdk(self._cmd.cli_ctx, ResourceType.DATA_STORAGE_BLOB,
'BlobAnalyticsLogging', 'RetentionPolicy', 'Metrics',
mod='_models')

retention_policy = t_retention_policy(enabled=True, days=13)
logging = t_logging(delete=True, read=True, write=True, retention_policy=retention_policy)
minute_metrics = t_metrics(enabled=True, include_apis=True, retention_policy=retention_policy)
if getattr(service_properties, 'hour_metrics', None):
service_properties.hour_metrics.retention_policy.days = 13
storage_client.set_blob_service_properties(logging, minute_metrics=minute_metrics,
hour_metrics=service_properties.hour_metrics)
storage_client.set_service_properties(analytics_logging=logging, minute_metrics=minute_metrics,
hour_metrics=service_properties.hour_metrics)

@staticmethod
def _check_storage_analytics(service_properties):
return (service_properties and service_properties.logging and
return (service_properties and service_properties.analytics_logging and
service_properties.minute_metrics and service_properties.minute_metrics.include_apis and
service_properties.minute_metrics.retention_policy.days)

def _check_table_and_content(self, storage_account_name, key, table_name,
filter_string, timeout_in_minutes):
sleep_period = 15
TableService = get_sdk(self._cmd.cli_ctx, ResourceType.DATA_COSMOS_TABLE, 'table#TableService')
TableService = get_sdk(self._cmd.cli_ctx, ResourceType.DATA_STORAGE_TABLE,
'_table_service_client#TableServiceClient')
table_client = get_data_service_client(
self._cmd.cli_ctx,
TableService,
Expand Down
2 changes: 1 addition & 1 deletion src/aem/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from codecs import open
from setuptools import setup, find_packages

VERSION = "1.0.0"
VERSION = "1.0.1"

CLASSIFIERS = [
'Development Status :: 4 - Beta',
Expand Down
4 changes: 4 additions & 0 deletions src/aks-preview/HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ To release a new version, please select a new version number (usually plus 1 to
Pending
+++++++

18.0.0b16
+++++++
* Remove DATA_COSMOS_TABLE and DATA_STORAGE references

18.0.0b15
+++++++
* Fixed NPE issue for `--acns-transit-encryption-type`.
Expand Down
44 changes: 15 additions & 29 deletions src/aks-preview/azext_aks_preview/aks_diagnostics.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
get_mgmt_service_client,
get_subscription_id,
)
from azure.cli.core.profiles import ResourceType, get_sdk
from azure.core.exceptions import HttpResponseError
from azure.mgmt.core.tools import is_valid_resource_id, parse_resource_id, resource_id
from knack.log import get_logger
Expand Down Expand Up @@ -98,24 +99,20 @@ def aks_kollect_cmd(cmd, # pylint: disable=too-many-statements,too-many-local
cmd.cli_ctx, parsed_storage_account['subscription'])
storage_account_keys = storage_client.storage_accounts.list_keys(parsed_storage_account['resource_group'],
storage_account_name)
kwargs = {
'account_name': storage_account_name,
'account_key': storage_account_keys.keys[0].value
}
cloud_storage_client = _cloud_storage_account_service_factory(
cmd.cli_ctx, kwargs)

sas_token = cloud_storage_client.generate_shared_access_signature(
'b',
'sco',
'rwdlacup',
datetime.datetime.utcnow() + datetime.timedelta(days=1))

readonly_sas_token = cloud_storage_client.generate_shared_access_signature(
'b',
'sco',
'rl',
datetime.datetime.utcnow() + datetime.timedelta(days=1))

t_generate_blob_service_sas = get_sdk(cmd.cli_ctx, ResourceType.DATA_STORAGE_BLOB, '#generate_account_sas')

sas_token = t_generate_blob_service_sas(storage_account_name,
storage_account_keys.keys[0].value,
resource_types='sco',
permission='rwdlacup',
expiry=datetime.datetime.utcnow() + datetime.timedelta(days=1))

readonly_sas_token = t_generate_blob_service_sas(storage_account_name,
storage_account_keys.keys[0].value,
resource_types='sco',
permission='rl',
expiry=datetime.datetime.utcnow() + datetime.timedelta(days=1))

readonly_sas_token = readonly_sas_token.strip('?')

Expand Down Expand Up @@ -483,17 +480,6 @@ def _display_diagnostics_report(temp_kubeconfig_path): # pylint: disable=too-m
"Please run 'az aks kanalyze' command later to get the analysis results.")


def _cloud_storage_account_service_factory(cli_ctx, kwargs):
from azure.cli.core.profiles import ResourceType, get_sdk
t_cloud_storage_account = get_sdk(
cli_ctx, ResourceType.DATA_STORAGE, 'common#CloudStorageAccount')
account_name = kwargs.pop('account_name', None)
account_key = kwargs.pop('account_key', None)
sas_token = kwargs.pop('sas_token', None)
kwargs.pop('connection_string', None)
return t_cloud_storage_account(account_name, account_key, sas_token)


def _format_hyperlink(the_link):
return f'\033[1m{colorama.Style.BRIGHT}{colorama.Fore.BLUE}{the_link}{colorama.Style.RESET_ALL}'

Expand Down
2 changes: 1 addition & 1 deletion src/aks-preview/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

from setuptools import setup, find_packages

VERSION = "18.0.0b15"
VERSION = "18.0.0b16"

CLASSIFIERS = [
"Development Status :: 4 - Beta",
Expand Down
4 changes: 4 additions & 0 deletions src/spring/HISTORY.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
Release History
===============
1.28.2
---
* Remove DATA_COSMOS_TABLE and DATA_STORAGE references

1.28.1
---
* Fix clean up config file patterns of Application Configuration Service.
Expand Down
2 changes: 1 addition & 1 deletion src/spring/azext_spring/_breaking_change.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@
from azure.cli.core.breaking_change import register_command_group_deprecate

# https://aka.ms/asaretirement
register_command_group_deprecate('spring', target_version='Mar 2028', hide=True)
register_command_group_deprecate('spring', target_version='Mar 2028', hide=True)
2 changes: 1 addition & 1 deletion src/spring/azext_spring/_deployment_deployable_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ def get_logs_loop():
sleep(10)

logger.warning("Trying to fetch build logs")
stream_logs(client.deployments, resource_group, service,
stream_logs(self.cmd, client.deployments, resource_group, service,
app, deployment, logger_level_func=print)
old_log_url = get_log_url()
timer = Timer(3, get_logs_loop)
Expand Down
8 changes: 5 additions & 3 deletions src/spring/azext_spring/_deployment_uploadable_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ def __init__(self, upload_url, cli_ctx):
self.relative_name = relative_name
self.sas_token = sas_token
self.cli_ctx = cli_ctx
self.upload_url = upload_url

def upload_and_build(self, artifact_path, **_):
if not artifact_path:
Expand All @@ -41,9 +42,10 @@ def upload_and_build(self, artifact_path, **_):
raise InvalidArgumentValueError('Unexpected artifact file type, must be one of .zip, .tar.gz, .tar, .jar, .war.')

def _upload(self, artifact_path):
FileService = get_sdk(self.cli_ctx, ResourceType.DATA_STORAGE, 'file#FileService')
file_service = FileService(self.account_name, sas_token=self.sas_token, endpoint_suffix=self.endpoint_suffix)
file_service.create_file_from_path(self.share_name, None, self.relative_name, artifact_path)
ShareFileClient = get_sdk(self.cli_ctx, ResourceType.DATA_STORAGE_FILESHARE, '_file_client#ShareFileClient')
file_client = ShareFileClient.from_file_url(self.upload_url)
with open(artifact_path, 'rb') as stream:
file_client.upload_file(data=stream)


class FolderUpload(FileUpload):
Expand Down
39 changes: 12 additions & 27 deletions src/spring/azext_spring/_stream_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@
from knack.util import CLIError
from knack.log import get_logger
from azure.core.exceptions import HttpResponseError
from azure.multiapi.storage.v2018_11_09.blob import AppendBlobService
from azure.cli.core.profiles import (ResourceType, get_sdk)
from azure.common import AzureHttpError
from ._utils import get_blob_info

logger = get_logger(__name__)

DEFAULT_CHUNK_SIZE = 1024 * 4
DEFAULT_LOG_TIMEOUT_IN_SEC = 60 * 30 # 30 minutes


def stream_logs(client,
def stream_logs(cmd,
client,
resource_group,
service,
app,
Expand All @@ -47,18 +47,13 @@ def stream_logs(client,
logger.warning("%s Empty SAS URL.", error_msg)
raise CLIError(error_msg)

account_name, endpoint_suffix, container_name, blob_name, sas_token = get_blob_info(
log_file_sas)
BlobClient = get_sdk(cmd.cli_ctx, ResourceType.DATA_STORAGE_BLOB, '_blob_client#BlobClient')
blob_client = BlobClient.from_blob_url(log_file_sas)

_stream_logs(no_format,
DEFAULT_CHUNK_SIZE,
DEFAULT_LOG_TIMEOUT_IN_SEC,
AppendBlobService(
account_name=account_name,
sas_token=sas_token,
endpoint_suffix=endpoint_suffix),
container_name,
blob_name,
blob_client,
raise_error_on_failure,
logger_level_func)

Expand All @@ -67,8 +62,6 @@ def _stream_logs(no_format, # pylint: disable=too-many-locals, too-many-stateme
byte_size,
timeout_in_seconds,
blob_service,
container_name,
blob_name,
raise_error_on_failure,
logger_level_func):

Expand All @@ -78,7 +71,6 @@ def _stream_logs(no_format, # pylint: disable=too-many-locals, too-many-stateme
stream = BytesIO()
metadata = {}
start = 0
end = byte_size - 1
available = 0
sleep_time = 1
max_sleep_time = 15
Expand All @@ -97,11 +89,9 @@ def safe_get_blob_properties():
'''
nonlocal blob_exists
if not blob_exists:
blob_exists = blob_service.exists(
container_name=container_name, blob_name=blob_name)
blob_exists = blob_service.exists()
if blob_exists:
return blob_service.get_blob_properties(
container_name=container_name, blob_name=blob_name)
return blob_service.get_blob_properties()
return None

# Try to get the initial properties so there's no waiting.
Expand All @@ -110,7 +100,7 @@ def safe_get_blob_properties():
props = safe_get_blob_properties()
if props:
metadata = props.metadata
available = props.properties.content_length
available = props.size
except (AttributeError, AzureHttpError):
pass

Expand All @@ -123,18 +113,13 @@ def safe_get_blob_properties():

try:
old_byte_size = len(stream.getvalue())
blob_service.get_blob_to_stream(
container_name=container_name,
blob_name=blob_name,
start_range=start,
end_range=end,
stream=stream)
downloader = blob_service.download_blob(offset=start, length=byte_size, max_concurrency=1)
downloader.readinto(stream)

curr_bytes = stream.getvalue()
new_byte_size = len(curr_bytes)
amount_read = new_byte_size - old_byte_size
start += amount_read
end = start + byte_size - 1

# Only scan what's newly read. If nothing is read, default to 0.
min_scan_range = max(new_byte_size - amount_read - 1, 0)
Expand Down Expand Up @@ -165,7 +150,7 @@ def safe_get_blob_properties():
props = safe_get_blob_properties()
if props:
metadata = props.metadata
available = props.properties.content_length
available = props.size
except AzureHttpError as ae:
if ae.status_code != 404:
raise CLIError(ae)
Expand Down
2 changes: 1 addition & 1 deletion src/spring/azext_spring/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -528,7 +528,7 @@ def parse_auth_flags(auth_list):
def app_get_build_log(cmd, client, resource_group, service, name, deployment=None):
if deployment.properties.source.type != "Source":
raise CLIError("{} deployment has no build logs.".format(deployment.properties.source.type))
return stream_logs(client.deployments, resource_group, service, name, deployment.name)
return stream_logs(cmd, client.deployments, resource_group, service, name, deployment.name)


def app_tail_log(cmd, client, resource_group, service, name,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ interactions:
User-Agent:
- AZURECLI/2.68.0 azsdk-python-core/1.31.0 Python/3.10.11 (Windows-10-10.0.26100-SP0)
method: POST
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001/exportTemplate?api-version=2022-09-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/clitest.rg000001/exportTemplate?api-version=2024-11-01
response:
body:
string: ''
Expand Down
2 changes: 1 addition & 1 deletion src/spring/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

# TODO: Confirm this is the right version number you want and it matches your
# HISTORY.rst entry.
VERSION = '1.28.1'
VERSION = '1.28.2'

# The full list of classifiers is available at
# https://pypi.python.org/pypi?%3Aaction=list_classifiers
Expand Down
4 changes: 4 additions & 0 deletions src/storage-blob-preview/HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
Release History
===============

1.0.0b2
++++++
* Remove DATA_COSMOS_TABLE and DATA_STORAGE references

1.0.0b1
++++++
* Remove ADAL dependencies
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

from azure.cli.core.commands.validators import validate_tags
from azure.cli.core.commands.parameters import (get_enum_type, get_three_state_flag)
from azure.cli.core.profiles import ResourceType

from ._validators import (validate_metadata, get_permission_validator, get_permission_help_string,
as_user_validator, blob_tier_validator)
Expand All @@ -16,12 +17,12 @@
def load_arguments(self, _): # pylint: disable=too-many-locals, too-many-statements, too-many-lines
from knack.arguments import CLIArgumentType

from .sdkutil import get_table_data_type
from .completers import get_storage_name_completion_list

t_base_blob_service = self.get_sdk('blob.baseblobservice#BaseBlobService')
t_file_service = self.get_sdk('file#FileService')
t_table_service = get_table_data_type(self.cli_ctx, 'table', 'TableService')
t_table_service = self.get_sdk('_table_service_client#TableServiceClient',
resource_type=ResourceType.DATA_STORAGE_TABLE)
t_blob_tier = self.get_sdk('_generated.models._azure_blob_storage_enums#AccessTierOptional',
resource_type=CUSTOM_DATA_STORAGE_BLOB)
t_rehydrate_priority = self.get_sdk('_generated.models._azure_blob_storage_enums#RehydratePriority',
Expand Down
Loading
Loading