From 37f27eaccfa62d4c903e723942d15693180ecc83 Mon Sep 17 00:00:00 2001 From: frantran Date: Tue, 3 Mar 2026 13:29:09 -0800 Subject: [PATCH 1/5] remove parent level files which are not needed, consolidate api versions --- .../azext_fleet/vendored_sdks/__init__.py | 19 +- .../vendored_sdks/_configuration.py | 66 - .../_container_service_fleet_mgmt_client.py | 474 ---- .../vendored_sdks/_serialization.py | 2025 ----------------- .../azext_fleet/vendored_sdks/_version.py | 9 - src/fleet/azext_fleet/vendored_sdks/models.py | 7 - src/fleet/azext_fleet/vendored_sdks/py.typed | 1 - 7 files changed, 8 insertions(+), 2593 deletions(-) delete mode 100644 src/fleet/azext_fleet/vendored_sdks/_configuration.py delete mode 100644 src/fleet/azext_fleet/vendored_sdks/_container_service_fleet_mgmt_client.py delete mode 100644 src/fleet/azext_fleet/vendored_sdks/_serialization.py delete mode 100644 src/fleet/azext_fleet/vendored_sdks/_version.py delete mode 100644 src/fleet/azext_fleet/vendored_sdks/models.py delete mode 100644 src/fleet/azext_fleet/vendored_sdks/py.typed diff --git a/src/fleet/azext_fleet/vendored_sdks/__init__.py b/src/fleet/azext_fleet/vendored_sdks/__init__.py index b7d7040aff5..1479200c773 100644 --- a/src/fleet/azext_fleet/vendored_sdks/__init__.py +++ b/src/fleet/azext_fleet/vendored_sdks/__init__.py @@ -2,19 +2,16 @@ # -------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. -# Code generated by Microsoft (R) AutoRest Code Generator. -# Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- -from ._container_service_fleet_mgmt_client import ContainerServiceFleetMgmtClient -__all__ = ['ContainerServiceFleetMgmtClient'] +import sys -try: - from ._patch import patch_sdk # type: ignore - patch_sdk() -except ImportError: - pass +from .v2026_02_01_preview import ContainerServiceFleetMgmtClient +from .v2026_02_01_preview import operations as _operations -from ._version import VERSION +# Register the versioned operations package under the short alias so that +# import paths like "azext_fleet.vendored_sdks.operations._fleets_operations" +# resolve without embedding the API version string everywhere. +sys.modules[__name__ + ".operations"] = _operations -__version__ = VERSION +__all__ = ["ContainerServiceFleetMgmtClient"] diff --git a/src/fleet/azext_fleet/vendored_sdks/_configuration.py b/src/fleet/azext_fleet/vendored_sdks/_configuration.py deleted file mode 100644 index c56e7af656c..00000000000 --- a/src/fleet/azext_fleet/vendored_sdks/_configuration.py +++ /dev/null @@ -1,66 +0,0 @@ -# coding=utf-8 -# -------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for -# license information. -# -# Code generated by Microsoft (R) AutoRest Code Generator. -# Changes may cause incorrect behavior and will be lost if the code is -# regenerated. -# -------------------------------------------------------------------------- -from typing import Any, TYPE_CHECKING - -from azure.core.pipeline import policies -from azure.mgmt.core.policies import ARMChallengeAuthenticationPolicy, ARMHttpLoggingPolicy - -from ._version import VERSION - -if TYPE_CHECKING: - # pylint: disable=unused-import,ungrouped-imports - from azure.core.credentials import TokenCredential - -class ContainerServiceFleetMgmtClientConfiguration: - """Configuration for ContainerServiceFleetMgmtClient. - - Note that all parameters used to create this instance are saved as instance - attributes. - - :param credential: Credential needed for the client to connect to Azure. Required. - :type credential: ~azure.core.credentials.TokenCredential - :param subscription_id: The ID of the target subscription. The value must be an UUID. Required. - :type subscription_id: str - """ - - def __init__( - self, - credential: "TokenCredential", - subscription_id: str, - **kwargs: Any - ): - if credential is None: - raise ValueError("Parameter 'credential' must not be None.") - if subscription_id is None: - raise ValueError("Parameter 'subscription_id' must not be None.") - - self.credential = credential - self.subscription_id = subscription_id - self.credential_scopes = kwargs.pop('credential_scopes', ['https://management.azure.com/.default']) - kwargs.setdefault('sdk_moniker', 'azure-mgmt-containerservicefleet/{}'.format(VERSION)) - self.polling_interval = kwargs.get("polling_interval", 30) - self._configure(**kwargs) - - def _configure( - self, - **kwargs: Any - ): - self.user_agent_policy = kwargs.get('user_agent_policy') or policies.UserAgentPolicy(**kwargs) - self.headers_policy = kwargs.get('headers_policy') or policies.HeadersPolicy(**kwargs) - self.proxy_policy = kwargs.get('proxy_policy') or policies.ProxyPolicy(**kwargs) - self.logging_policy = kwargs.get('logging_policy') or policies.NetworkTraceLoggingPolicy(**kwargs) - self.http_logging_policy = kwargs.get('http_logging_policy') or ARMHttpLoggingPolicy(**kwargs) - self.retry_policy = kwargs.get('retry_policy') or policies.RetryPolicy(**kwargs) - self.custom_hook_policy = kwargs.get('custom_hook_policy') or policies.CustomHookPolicy(**kwargs) - self.redirect_policy = kwargs.get('redirect_policy') or policies.RedirectPolicy(**kwargs) - self.authentication_policy = kwargs.get('authentication_policy') - if self.credential and not self.authentication_policy: - self.authentication_policy = ARMChallengeAuthenticationPolicy(self.credential, *self.credential_scopes, **kwargs) diff --git a/src/fleet/azext_fleet/vendored_sdks/_container_service_fleet_mgmt_client.py b/src/fleet/azext_fleet/vendored_sdks/_container_service_fleet_mgmt_client.py deleted file mode 100644 index a4e35de0627..00000000000 --- a/src/fleet/azext_fleet/vendored_sdks/_container_service_fleet_mgmt_client.py +++ /dev/null @@ -1,474 +0,0 @@ -# coding=utf-8 -# -------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for -# license information. -# -# Code generated by Microsoft (R) AutoRest Code Generator. -# Changes may cause incorrect behavior and will be lost if the code is -# regenerated. -# -------------------------------------------------------------------------- - -from typing import Any, Optional, TYPE_CHECKING, cast -from typing_extensions import Self - -from azure.core.pipeline import policies -from azure.core.settings import settings -from azure.mgmt.core import ARMPipelineClient -from azure.mgmt.core.policies import ARMAutoResourceProviderRegistrationPolicy -from azure.mgmt.core.tools import get_arm_endpoints -from azure.profiles import KnownProfiles, ProfileDefinition -from azure.profiles.multiapiclient import MultiApiClientMixin - -from ._configuration import ContainerServiceFleetMgmtClientConfiguration -from ._serialization import Deserializer, Serializer - -if TYPE_CHECKING: - # pylint: disable=unused-import,ungrouped-imports - from azure.core.credentials import TokenCredential - -class _SDKClient(object): - def __init__(self, *args, **kwargs): - """This is a fake class to support current implementation of MultiApiClientMixin." - Will be removed in final version of multiapi azure-core based client - """ - pass - -class ContainerServiceFleetMgmtClient(MultiApiClientMixin, _SDKClient): - """Azure Kubernetes Fleet Manager api client. - - This ready contains multiple API versions, to help you deal with all of the Azure clouds - (Azure Stack, Azure Government, Azure China, etc.). - By default, it uses the latest API version available on public Azure. - For production, you should stick to a particular api-version and/or profile. - The profile sets a mapping between an operation group and its API version. - The api-version parameter sets the default API version if the operation - group is not described in the profile. - - :param credential: Credential needed for the client to connect to Azure. Required. - :type credential: ~azure.core.credentials.TokenCredential - :param subscription_id: The ID of the target subscription. The value must be an UUID. Required. - :type subscription_id: str - :param api_version: API version to use if no profile is provided, or if missing in profile. - :type api_version: str - :param base_url: Service URL - :type base_url: str - :param profile: A profile definition, from KnownProfiles to dict. - :type profile: azure.profiles.KnownProfiles - :keyword int polling_interval: Default waiting time between two polls for LRO operations if no Retry-After header is present. - """ - - DEFAULT_API_VERSION = '2026-02-01-preview' - _PROFILE_TAG = "azure.mgmt.containerservicefleet.ContainerServiceFleetMgmtClient" - LATEST_PROFILE = ProfileDefinition({ - _PROFILE_TAG: { - None: DEFAULT_API_VERSION, - }}, - _PROFILE_TAG + " latest" - ) - - def __init__( - self, - credential: "TokenCredential", - subscription_id: str, - api_version: Optional[str]=None, - base_url: Optional[str] = None, - profile: KnownProfiles=KnownProfiles.default, - **kwargs: Any - ): - if api_version: - kwargs.setdefault('api_version', api_version) - _cloud = kwargs.pop("cloud_setting", None) or settings.current.azure_cloud # type: ignore - _endpoints = get_arm_endpoints(_cloud) - if not base_url: - base_url = _endpoints["resource_manager"] - credential_scopes = kwargs.pop("credential_scopes", _endpoints["credential_scopes"]) - self._config = ContainerServiceFleetMgmtClientConfiguration(credential, subscription_id, credential_scopes=credential_scopes, **kwargs) - _policies = kwargs.pop("policies", None) - if _policies is None: - _policies = [ - policies.RequestIdPolicy(**kwargs), - self._config.headers_policy, - self._config.user_agent_policy, - self._config.proxy_policy, - policies.ContentDecodePolicy(**kwargs), - ARMAutoResourceProviderRegistrationPolicy(), - self._config.redirect_policy, - self._config.retry_policy, - self._config.authentication_policy, - self._config.custom_hook_policy, - self._config.logging_policy, - policies.DistributedTracingPolicy(**kwargs), - policies.SensitiveHeaderCleanupPolicy(**kwargs) if self._config.redirect_policy else None, - self._config.http_logging_policy, - ] - self._client: ARMPipelineClient = ARMPipelineClient(base_url=cast(str, base_url), policies=_policies, **kwargs) - super(ContainerServiceFleetMgmtClient, self).__init__( - api_version=api_version, - profile=profile - ) - - @classmethod - def _models_dict(cls, api_version): - return {k: v for k, v in cls.models(api_version).__dict__.items() if isinstance(v, type)} - - @classmethod - def models(cls, api_version=DEFAULT_API_VERSION): - """Module depends on the API version: - - * 2022-06-02-preview: :mod:`v2022_06_preview.models` - * 2022-07-02-preview: :mod:`v2022_07_preview.models` - * 2022-09-02-preview: :mod:`v2022_09_preview.models` - * 2023-03-15-preview: :mod:`v2023_03_preview.models` - * 2023-06-15-preview: :mod:`v2023_06_preview.models` - * 2023-08-15-preview: :mod:`v2023_08_preview.models` - * 2023-10-15: :mod:`v2023_10_01.models` - * 2024-02-02-preview: :mod:`v2024_02_preview.models` - * 2025-03-01: :mod:`v2025_03_01.models` - * 2025-04-01-preview: :mod:`v2025_04_01_preview.models` - * 2025-08-01-preview: :mod:`v2025_08_01_preview.models` - * 2026-02-01-preview: :mod:`v2026_02_01_preview.models` - """ - if api_version == '2022-06-02-preview': - from .v2022_06_preview import models - return models - elif api_version == '2022-07-02-preview': - from .v2022_07_preview import models - return models - elif api_version == '2022-09-02-preview': - from .v2022_09_preview import models - return models - elif api_version == '2023-03-15-preview': - from .v2023_03_preview import models - return models - elif api_version == '2023-06-15-preview': - from .v2023_06_preview import models - return models - elif api_version == '2023-08-15-preview': - from .v2023_08_preview import models - return models - elif api_version == '2023-10-15': - from .v2023_10_01 import models - return models - elif api_version == '2024-02-02-preview': - from .v2024_02_preview import models - return models - elif api_version == '2025-03-01': - from .v2025_03_01 import models - return models - elif api_version == '2025-04-01-preview': - from .v2025_04_01_preview import models - return models - elif api_version == '2025-08-01-preview': - from .v2025_08_01_preview import models - return models - elif api_version == '2026-02-01-preview': - from .v2026_02_01_preview import models - return models - raise ValueError("API version {} is not available".format(api_version)) - - @property - def auto_upgrade_profile_operations(self): - """Instance depends on the API version: - - * 2025-03-01: :class:`AutoUpgradeProfileOperationsOperations` - * 2025-04-01-preview: :class:`AutoUpgradeProfileOperationsOperations` - * 2025-08-01-preview: :class:`AutoUpgradeProfileOperationsOperations` - * 2026-02-01-preview: :class:`AutoUpgradeProfileOperationsOperations` - - """ - api_version = self._get_api_version('auto_upgrade_profile_operations') - if api_version == '2025-03-01': - from .v2025_03_01.operations import AutoUpgradeProfileOperationsOperations as OperationClass - elif api_version == '2025-04-01-preview': - from .v2025_04_01_preview.operations import AutoUpgradeProfileOperationsOperations as OperationClass - elif api_version == '2025-08-01-preview': - from .v2025_08_01_preview.operations import AutoUpgradeProfileOperationsOperations as OperationClass - elif api_version == '2026-02-01-preview': - from .v2026_02_01_preview.operations import AutoUpgradeProfileOperationsOperations as OperationClass - else: - raise ValueError("API version {} does not have operation group 'auto_upgrade_profile_operations'".format(api_version)) - self._config.api_version = api_version - return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)), api_version) - - @property - def auto_upgrade_profiles(self): - """Instance depends on the API version: - - * 2025-03-01: :class:`AutoUpgradeProfilesOperations` - * 2025-04-01-preview: :class:`AutoUpgradeProfilesOperations` - * 2025-08-01-preview: :class:`AutoUpgradeProfilesOperations` - * 2026-02-01-preview: :class:`AutoUpgradeProfilesOperations` - - """ - api_version = self._get_api_version('auto_upgrade_profiles') - if api_version == '2025-03-01': - from .v2025_03_01.operations import AutoUpgradeProfilesOperations as OperationClass - elif api_version == '2025-04-01-preview': - from .v2025_04_01_preview.operations import AutoUpgradeProfilesOperations as OperationClass - elif api_version == '2025-08-01-preview': - from .v2025_08_01_preview.operations import AutoUpgradeProfilesOperations as OperationClass - elif api_version == '2026-02-01-preview': - from .v2026_02_01_preview.operations import AutoUpgradeProfilesOperations as OperationClass - else: - raise ValueError("API version {} does not have operation group 'auto_upgrade_profiles'".format(api_version)) - self._config.api_version = api_version - return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)), api_version) - - @property - def fleet_managed_namespaces(self): - """Instance depends on the API version: - - * 2025-08-01-preview: :class:`FleetManagedNamespacesOperations` - * 2026-02-01-preview: :class:`FleetManagedNamespacesOperations` - - """ - api_version = self._get_api_version('fleet_managed_namespaces') - if api_version == '2025-08-01-preview': - from .v2025_08_01_preview.operations import FleetManagedNamespacesOperations as OperationClass - elif api_version == '2026-02-01-preview': - from .v2026_02_01_preview.operations import FleetManagedNamespacesOperations as OperationClass - else: - raise ValueError("API version {} does not have operation group 'fleet_managed_namespaces'".format(api_version)) - self._config.api_version = api_version - return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)), api_version) - - @property - def fleet_members(self): - """Instance depends on the API version: - - * 2022-06-02-preview: :class:`FleetMembersOperations` - * 2022-07-02-preview: :class:`FleetMembersOperations` - * 2022-09-02-preview: :class:`FleetMembersOperations` - * 2023-03-15-preview: :class:`FleetMembersOperations` - * 2023-06-15-preview: :class:`FleetMembersOperations` - * 2023-08-15-preview: :class:`FleetMembersOperations` - * 2023-10-15: :class:`FleetMembersOperations` - * 2024-02-02-preview: :class:`FleetMembersOperations` - * 2025-03-01: :class:`FleetMembersOperations` - * 2025-04-01-preview: :class:`FleetMembersOperations` - * 2025-08-01-preview: :class:`FleetMembersOperations` - * 2026-02-01-preview: :class:`FleetMembersOperations` - - """ - api_version = self._get_api_version('fleet_members') - if api_version == '2022-06-02-preview': - from .v2022_06_preview.operations import FleetMembersOperations as OperationClass - elif api_version == '2022-07-02-preview': - from .v2022_07_preview.operations import FleetMembersOperations as OperationClass - elif api_version == '2022-09-02-preview': - from .v2022_09_preview.operations import FleetMembersOperations as OperationClass - elif api_version == '2023-03-15-preview': - from .v2023_03_preview.operations import FleetMembersOperations as OperationClass - elif api_version == '2023-06-15-preview': - from .v2023_06_preview.operations import FleetMembersOperations as OperationClass - elif api_version == '2023-08-15-preview': - from .v2023_08_preview.operations import FleetMembersOperations as OperationClass - elif api_version == '2023-10-15': - from .v2023_10_01.operations import FleetMembersOperations as OperationClass - elif api_version == '2024-02-02-preview': - from .v2024_02_preview.operations import FleetMembersOperations as OperationClass - elif api_version == '2025-03-01': - from .v2025_03_01.operations import FleetMembersOperations as OperationClass - elif api_version == '2025-04-01-preview': - from .v2025_04_01_preview.operations import FleetMembersOperations as OperationClass - elif api_version == '2025-08-01-preview': - from .v2025_08_01_preview.operations import FleetMembersOperations as OperationClass - elif api_version == '2026-02-01-preview': - from .v2026_02_01_preview.operations import FleetMembersOperations as OperationClass - else: - raise ValueError("API version {} does not have operation group 'fleet_members'".format(api_version)) - self._config.api_version = api_version - return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)), api_version) - - @property - def fleet_update_strategies(self): - """Instance depends on the API version: - - * 2023-08-15-preview: :class:`FleetUpdateStrategiesOperations` - * 2023-10-15: :class:`FleetUpdateStrategiesOperations` - * 2024-02-02-preview: :class:`FleetUpdateStrategiesOperations` - * 2025-03-01: :class:`FleetUpdateStrategiesOperations` - * 2025-04-01-preview: :class:`FleetUpdateStrategiesOperations` - * 2025-08-01-preview: :class:`FleetUpdateStrategiesOperations` - * 2026-02-01-preview: :class:`FleetUpdateStrategiesOperations` - - """ - api_version = self._get_api_version('fleet_update_strategies') - if api_version == '2023-08-15-preview': - from .v2023_08_preview.operations import FleetUpdateStrategiesOperations as OperationClass - elif api_version == '2023-10-15': - from .v2023_10_01.operations import FleetUpdateStrategiesOperations as OperationClass - elif api_version == '2024-02-02-preview': - from .v2024_02_preview.operations import FleetUpdateStrategiesOperations as OperationClass - elif api_version == '2025-03-01': - from .v2025_03_01.operations import FleetUpdateStrategiesOperations as OperationClass - elif api_version == '2025-04-01-preview': - from .v2025_04_01_preview.operations import FleetUpdateStrategiesOperations as OperationClass - elif api_version == '2025-08-01-preview': - from .v2025_08_01_preview.operations import FleetUpdateStrategiesOperations as OperationClass - elif api_version == '2026-02-01-preview': - from .v2026_02_01_preview.operations import FleetUpdateStrategiesOperations as OperationClass - else: - raise ValueError("API version {} does not have operation group 'fleet_update_strategies'".format(api_version)) - self._config.api_version = api_version - return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)), api_version) - - @property - def fleets(self): - """Instance depends on the API version: - - * 2022-06-02-preview: :class:`FleetsOperations` - * 2022-07-02-preview: :class:`FleetsOperations` - * 2022-09-02-preview: :class:`FleetsOperations` - * 2023-03-15-preview: :class:`FleetsOperations` - * 2023-06-15-preview: :class:`FleetsOperations` - * 2023-08-15-preview: :class:`FleetsOperations` - * 2023-10-15: :class:`FleetsOperations` - * 2024-02-02-preview: :class:`FleetsOperations` - * 2025-03-01: :class:`FleetsOperations` - * 2025-04-01-preview: :class:`FleetsOperations` - * 2025-08-01-preview: :class:`FleetsOperations` - * 2026-02-01-preview: :class:`FleetsOperations` - - """ - api_version = self._get_api_version('fleets') - if api_version == '2022-06-02-preview': - from .v2022_06_preview.operations import FleetsOperations as OperationClass - elif api_version == '2022-07-02-preview': - from .v2022_07_preview.operations import FleetsOperations as OperationClass - elif api_version == '2022-09-02-preview': - from .v2022_09_preview.operations import FleetsOperations as OperationClass - elif api_version == '2023-03-15-preview': - from .v2023_03_preview.operations import FleetsOperations as OperationClass - elif api_version == '2023-06-15-preview': - from .v2023_06_preview.operations import FleetsOperations as OperationClass - elif api_version == '2023-08-15-preview': - from .v2023_08_preview.operations import FleetsOperations as OperationClass - elif api_version == '2023-10-15': - from .v2023_10_01.operations import FleetsOperations as OperationClass - elif api_version == '2024-02-02-preview': - from .v2024_02_preview.operations import FleetsOperations as OperationClass - elif api_version == '2025-03-01': - from .v2025_03_01.operations import FleetsOperations as OperationClass - elif api_version == '2025-04-01-preview': - from .v2025_04_01_preview.operations import FleetsOperations as OperationClass - elif api_version == '2025-08-01-preview': - from .v2025_08_01_preview.operations import FleetsOperations as OperationClass - elif api_version == '2026-02-01-preview': - from .v2026_02_01_preview.operations import FleetsOperations as OperationClass - else: - raise ValueError("API version {} does not have operation group 'fleets'".format(api_version)) - self._config.api_version = api_version - return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)), api_version) - - @property - def gates(self): - """Instance depends on the API version: - - * 2025-04-01-preview: :class:`GatesOperations` - * 2025-08-01-preview: :class:`GatesOperations` - * 2026-02-01-preview: :class:`GatesOperations` - - - """ - api_version = self._get_api_version('gates') - if api_version == '2025-04-01-preview': - from .v2025_04_01_preview.operations import GatesOperations as OperationClass - elif api_version == '2025-08-01-preview': - from .v2025_08_01_preview.operations import GatesOperations as OperationClass - elif api_version == '2026-02-01-preview': - from .v2026_02_01_preview.operations import GatesOperations as OperationClass - else: - raise ValueError("API version {} does not have operation group 'gates'".format(api_version)) - self._config.api_version = api_version - return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)), api_version) - - @property - def operations(self): - """Instance depends on the API version: - - * 2022-09-02-preview: :class:`Operations` - * 2023-03-15-preview: :class:`Operations` - * 2023-06-15-preview: :class:`Operations` - * 2023-08-15-preview: :class:`Operations` - * 2023-10-15: :class:`Operations` - * 2024-02-02-preview: :class:`Operations` - * 2025-03-01: :class:`Operations` - * 2025-04-01-preview: :class:`Operations` - * 2025-08-01-preview: :class:`Operations` - * 2026-02-01-preview: :class:`Operations` - - """ - api_version = self._get_api_version('operations') - if api_version == '2022-09-02-preview': - from .v2022_09_preview.operations import Operations as OperationClass - elif api_version == '2023-03-15-preview': - from .v2023_03_preview.operations import Operations as OperationClass - elif api_version == '2023-06-15-preview': - from .v2023_06_preview.operations import Operations as OperationClass - elif api_version == '2023-08-15-preview': - from .v2023_08_preview.operations import Operations as OperationClass - elif api_version == '2023-10-15': - from .v2023_10_01.operations import Operations as OperationClass - elif api_version == '2024-02-02-preview': - from .v2024_02_preview.operations import Operations as OperationClass - elif api_version == '2025-03-01': - from .v2025_03_01.operations import Operations as OperationClass - elif api_version == '2025-04-01-preview': - from .v2025_04_01_preview.operations import Operations as OperationClass - elif api_version == '2025-08-01-preview': - from .v2025_08_01_preview.operations import Operations as OperationClass - elif api_version == '2026-02-01-preview': - from .v2026_02_01_preview.operations import Operations as OperationClass - else: - raise ValueError("API version {} does not have operation group 'operations'".format(api_version)) - self._config.api_version = api_version - return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)), api_version) - - @property - def update_runs(self): - """Instance depends on the API version: - - * 2023-03-15-preview: :class:`UpdateRunsOperations` - * 2023-06-15-preview: :class:`UpdateRunsOperations` - * 2023-08-15-preview: :class:`UpdateRunsOperations` - * 2023-10-15: :class:`UpdateRunsOperations` - * 2024-02-02-preview: :class:`UpdateRunsOperations` - * 2025-03-01: :class:`UpdateRunsOperations` - * 2025-04-01-preview: :class:`UpdateRunsOperations` - * 2025-08-01-preview: :class:`UpdateRunsOperations` - * 2026-02-01-preview: :class:`UpdateRunsOperations` - - """ - api_version = self._get_api_version('update_runs') - if api_version == '2023-03-15-preview': - from .v2023_03_preview.operations import UpdateRunsOperations as OperationClass - elif api_version == '2023-06-15-preview': - from .v2023_06_preview.operations import UpdateRunsOperations as OperationClass - elif api_version == '2023-08-15-preview': - from .v2023_08_preview.operations import UpdateRunsOperations as OperationClass - elif api_version == '2023-10-15': - from .v2023_10_01.operations import UpdateRunsOperations as OperationClass - elif api_version == '2024-02-02-preview': - from .v2024_02_preview.operations import UpdateRunsOperations as OperationClass - elif api_version == '2025-03-01': - from .v2025_03_01.operations import UpdateRunsOperations as OperationClass - elif api_version == '2025-04-01-preview': - from .v2025_04_01_preview.operations import UpdateRunsOperations as OperationClass - elif api_version == '2025-08-01-preview': - from .v2025_08_01_preview.operations import UpdateRunsOperations as OperationClass - elif api_version == '2026-02-01-preview': - from .v2026_02_01_preview.operations import UpdateRunsOperations as OperationClass - else: - raise ValueError("API version {} does not have operation group 'update_runs'".format(api_version)) - self._config.api_version = api_version - return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)), api_version) - - def close(self): - self._client.close() - def __enter__(self): - self._client.__enter__() - return self - def __exit__(self, *exc_details): - self._client.__exit__(*exc_details) diff --git a/src/fleet/azext_fleet/vendored_sdks/_serialization.py b/src/fleet/azext_fleet/vendored_sdks/_serialization.py deleted file mode 100644 index 05bcd7d403a..00000000000 --- a/src/fleet/azext_fleet/vendored_sdks/_serialization.py +++ /dev/null @@ -1,2025 +0,0 @@ -# coding=utf-8 - -# pyright: reportUnnecessaryTypeIgnoreComment=false - -from base64 import b64decode, b64encode -import calendar -import datetime -import decimal -import email -from enum import Enum -import json -import logging -import re -import sys -import codecs -from typing import ( - Dict, - Any, - cast, - Optional, - Union, - AnyStr, - IO, - Mapping, - Callable, - MutableMapping, - List, -) - -try: - from urllib import quote # type: ignore -except ImportError: - from urllib.parse import quote -import xml.etree.ElementTree as ET - -import isodate # type: ignore -from typing_extensions import Self - -from azure.core.exceptions import DeserializationError, SerializationError -from azure.core.serialization import NULL as CoreNull - -_BOM = codecs.BOM_UTF8.decode(encoding="utf-8") - -JSON = MutableMapping[str, Any] - - -class RawDeserializer: - - # Accept "text" because we're open minded people... - JSON_REGEXP = re.compile(r"^(application|text)/([a-z+.]+\+)?json$") - - # Name used in context - CONTEXT_NAME = "deserialized_data" - - @classmethod - def deserialize_from_text(cls, data: Optional[Union[AnyStr, IO]], content_type: Optional[str] = None) -> Any: - """Decode data according to content-type. - - Accept a stream of data as well, but will be load at once in memory for now. - - If no content-type, will return the string version (not bytes, not stream) - - :param data: Input, could be bytes or stream (will be decoded with UTF8) or text - :type data: str or bytes or IO - :param str content_type: The content type. - :return: The deserialized data. - :rtype: object - """ - if hasattr(data, "read"): - # Assume a stream - data = cast(IO, data).read() - - if isinstance(data, bytes): - data_as_str = data.decode(encoding="utf-8-sig") - else: - # Explain to mypy the correct type. - data_as_str = cast(str, data) - - # Remove Byte Order Mark if present in string - data_as_str = data_as_str.lstrip(_BOM) - - if content_type is None: - return data - - if cls.JSON_REGEXP.match(content_type): - try: - return json.loads(data_as_str) - except ValueError as err: - raise DeserializationError("JSON is invalid: {}".format(err), err) from err - elif "xml" in (content_type or []): - try: - - try: - if isinstance(data, unicode): # type: ignore - # If I'm Python 2.7 and unicode XML will scream if I try a "fromstring" on unicode string - data_as_str = data_as_str.encode(encoding="utf-8") # type: ignore - except NameError: - pass - - return ET.fromstring(data_as_str) # nosec - except ET.ParseError as err: - # It might be because the server has an issue, and returned JSON with - # content-type XML.... - # So let's try a JSON load, and if it's still broken - # let's flow the initial exception - def _json_attemp(data): - try: - return True, json.loads(data) - except ValueError: - return False, None # Don't care about this one - - success, json_result = _json_attemp(data) - if success: - return json_result - # If i'm here, it's not JSON, it's not XML, let's scream - # and raise the last context in this block (the XML exception) - # The function hack is because Py2.7 messes up with exception - # context otherwise. - _LOGGER.critical("Wasn't XML not JSON, failing") - raise DeserializationError("XML is invalid") from err - elif content_type.startswith("text/"): - return data_as_str - raise DeserializationError("Cannot deserialize content-type: {}".format(content_type)) - - @classmethod - def deserialize_from_http_generics(cls, body_bytes: Optional[Union[AnyStr, IO]], headers: Mapping) -> Any: - """Deserialize from HTTP response. - - Use bytes and headers to NOT use any requests/aiohttp or whatever - specific implementation. - Headers will tested for "content-type" - - :param bytes body_bytes: The body of the response. - :param dict headers: The headers of the response. - :returns: The deserialized data. - :rtype: object - """ - # Try to use content-type from headers if available - content_type = None - if "content-type" in headers: - content_type = headers["content-type"].split(";")[0].strip().lower() - # Ouch, this server did not declare what it sent... - # Let's guess it's JSON... - # Also, since Autorest was considering that an empty body was a valid JSON, - # need that test as well.... - else: - content_type = "application/json" - - if body_bytes: - return cls.deserialize_from_text(body_bytes, content_type) - return None - - -_LOGGER = logging.getLogger(__name__) - -try: - _long_type = long # type: ignore -except NameError: - _long_type = int - -TZ_UTC = datetime.timezone.utc - -_FLATTEN = re.compile(r"(? None: - self.additional_properties: Optional[Dict[str, Any]] = {} - for k in kwargs: # pylint: disable=consider-using-dict-items - if k not in self._attribute_map: - _LOGGER.warning("%s is not a known attribute of class %s and will be ignored", k, self.__class__) - elif k in self._validation and self._validation[k].get("readonly", False): - _LOGGER.warning("Readonly attribute %s will be ignored in class %s", k, self.__class__) - else: - setattr(self, k, kwargs[k]) - - def __eq__(self, other: Any) -> bool: - """Compare objects by comparing all attributes. - - :param object other: The object to compare - :returns: True if objects are equal - :rtype: bool - """ - if isinstance(other, self.__class__): - return self.__dict__ == other.__dict__ - return False - - def __ne__(self, other: Any) -> bool: - """Compare objects by comparing all attributes. - - :param object other: The object to compare - :returns: True if objects are not equal - :rtype: bool - """ - return not self.__eq__(other) - - def __str__(self) -> str: - return str(self.__dict__) - - @classmethod - def enable_additional_properties_sending(cls) -> None: - cls._attribute_map["additional_properties"] = {"key": "", "type": "{object}"} - - @classmethod - def is_xml_model(cls) -> bool: - try: - cls._xml_map # type: ignore - except AttributeError: - return False - return True - - @classmethod - def _create_xml_node(cls): - """Create XML node. - - :returns: The XML node - :rtype: xml.etree.ElementTree.Element - """ - try: - xml_map = cls._xml_map # type: ignore - except AttributeError: - xml_map = {} - - return _create_xml_node(xml_map.get("name", cls.__name__), xml_map.get("prefix", None), xml_map.get("ns", None)) - - def serialize(self, keep_readonly: bool = False, **kwargs: Any) -> JSON: - """Return the JSON that would be sent to server from this model. - - This is an alias to `as_dict(full_restapi_key_transformer, keep_readonly=False)`. - - If you want XML serialization, you can pass the kwargs is_xml=True. - - :param bool keep_readonly: If you want to serialize the readonly attributes - :returns: A dict JSON compatible object - :rtype: dict - """ - serializer = Serializer(self._infer_class_models()) - return serializer._serialize( # type: ignore # pylint: disable=protected-access - self, keep_readonly=keep_readonly, **kwargs - ) - - def as_dict( - self, - keep_readonly: bool = True, - key_transformer: Callable[[str, Dict[str, Any], Any], Any] = attribute_transformer, - **kwargs: Any - ) -> JSON: - """Return a dict that can be serialized using json.dump. - - Advanced usage might optionally use a callback as parameter: - - .. code::python - - def my_key_transformer(key, attr_desc, value): - return key - - Key is the attribute name used in Python. Attr_desc - is a dict of metadata. Currently contains 'type' with the - msrest type and 'key' with the RestAPI encoded key. - Value is the current value in this object. - - The string returned will be used to serialize the key. - If the return type is a list, this is considered hierarchical - result dict. - - See the three examples in this file: - - - attribute_transformer - - full_restapi_key_transformer - - last_restapi_key_transformer - - If you want XML serialization, you can pass the kwargs is_xml=True. - - :param bool keep_readonly: If you want to serialize the readonly attributes - :param function key_transformer: A key transformer function. - :returns: A dict JSON compatible object - :rtype: dict - """ - serializer = Serializer(self._infer_class_models()) - return serializer._serialize( # type: ignore # pylint: disable=protected-access - self, key_transformer=key_transformer, keep_readonly=keep_readonly, **kwargs - ) - - @classmethod - def _infer_class_models(cls): - try: - str_models = cls.__module__.rsplit(".", 1)[0] - models = sys.modules[str_models] - client_models = {k: v for k, v in models.__dict__.items() if isinstance(v, type)} - if cls.__name__ not in client_models: - raise ValueError("Not Autorest generated code") - except Exception: # pylint: disable=broad-exception-caught - # Assume it's not Autorest generated (tests?). Add ourselves as dependencies. - client_models = {cls.__name__: cls} - return client_models - - @classmethod - def deserialize(cls, data: Any, content_type: Optional[str] = None) -> Self: - """Parse a str using the RestAPI syntax and return a model. - - :param str data: A str using RestAPI structure. JSON by default. - :param str content_type: JSON by default, set application/xml if XML. - :returns: An instance of this model - :raises DeserializationError: if something went wrong - :rtype: Self - """ - deserializer = Deserializer(cls._infer_class_models()) - return deserializer(cls.__name__, data, content_type=content_type) # type: ignore - - @classmethod - def from_dict( - cls, - data: Any, - key_extractors: Optional[Callable[[str, Dict[str, Any], Any], Any]] = None, - content_type: Optional[str] = None, - ) -> Self: - """Parse a dict using given key extractor return a model. - - By default consider key - extractors (rest_key_case_insensitive_extractor, attribute_key_case_insensitive_extractor - and last_rest_key_case_insensitive_extractor) - - :param dict data: A dict using RestAPI structure - :param function key_extractors: A key extractor function. - :param str content_type: JSON by default, set application/xml if XML. - :returns: An instance of this model - :raises DeserializationError: if something went wrong - :rtype: Self - """ - deserializer = Deserializer(cls._infer_class_models()) - deserializer.key_extractors = ( # type: ignore - [ # type: ignore - attribute_key_case_insensitive_extractor, - rest_key_case_insensitive_extractor, - last_rest_key_case_insensitive_extractor, - ] - if key_extractors is None - else key_extractors - ) - return deserializer(cls.__name__, data, content_type=content_type) # type: ignore - - @classmethod - def _flatten_subtype(cls, key, objects): - if "_subtype_map" not in cls.__dict__: - return {} - result = dict(cls._subtype_map[key]) - for valuetype in cls._subtype_map[key].values(): - result.update(objects[valuetype]._flatten_subtype(key, objects)) # pylint: disable=protected-access - return result - - @classmethod - def _classify(cls, response, objects): - """Check the class _subtype_map for any child classes. - We want to ignore any inherited _subtype_maps. - - :param dict response: The initial data - :param dict objects: The class objects - :returns: The class to be used - :rtype: class - """ - for subtype_key in cls.__dict__.get("_subtype_map", {}).keys(): - subtype_value = None - - if not isinstance(response, ET.Element): - rest_api_response_key = cls._get_rest_key_parts(subtype_key)[-1] - subtype_value = response.get(rest_api_response_key, None) or response.get(subtype_key, None) - else: - subtype_value = xml_key_extractor(subtype_key, cls._attribute_map[subtype_key], response) - if subtype_value: - # Try to match base class. Can be class name only - # (bug to fix in Autorest to support x-ms-discriminator-name) - if cls.__name__ == subtype_value: - return cls - flatten_mapping_type = cls._flatten_subtype(subtype_key, objects) - try: - return objects[flatten_mapping_type[subtype_value]] # type: ignore - except KeyError: - _LOGGER.warning( - "Subtype value %s has no mapping, use base class %s.", - subtype_value, - cls.__name__, - ) - break - else: - _LOGGER.warning("Discriminator %s is absent or null, use base class %s.", subtype_key, cls.__name__) - break - return cls - - @classmethod - def _get_rest_key_parts(cls, attr_key): - """Get the RestAPI key of this attr, split it and decode part - :param str attr_key: Attribute key must be in attribute_map. - :returns: A list of RestAPI part - :rtype: list - """ - rest_split_key = _FLATTEN.split(cls._attribute_map[attr_key]["key"]) - return [_decode_attribute_map_key(key_part) for key_part in rest_split_key] - - -def _decode_attribute_map_key(key): - """This decode a key in an _attribute_map to the actual key we want to look at - inside the received data. - - :param str key: A key string from the generated code - :returns: The decoded key - :rtype: str - """ - return key.replace("\\.", ".") - - -class Serializer: # pylint: disable=too-many-public-methods - """Request object model serializer.""" - - basic_types = {str: "str", int: "int", bool: "bool", float: "float"} - - _xml_basic_types_serializers = {"bool": lambda x: str(x).lower()} - days = {0: "Mon", 1: "Tue", 2: "Wed", 3: "Thu", 4: "Fri", 5: "Sat", 6: "Sun"} - months = { - 1: "Jan", - 2: "Feb", - 3: "Mar", - 4: "Apr", - 5: "May", - 6: "Jun", - 7: "Jul", - 8: "Aug", - 9: "Sep", - 10: "Oct", - 11: "Nov", - 12: "Dec", - } - validation = { - "min_length": lambda x, y: len(x) < y, - "max_length": lambda x, y: len(x) > y, - "minimum": lambda x, y: x < y, - "maximum": lambda x, y: x > y, - "minimum_ex": lambda x, y: x <= y, - "maximum_ex": lambda x, y: x >= y, - "min_items": lambda x, y: len(x) < y, - "max_items": lambda x, y: len(x) > y, - "pattern": lambda x, y: not re.match(y, x, re.UNICODE), - "unique": lambda x, y: len(x) != len(set(x)), - "multiple": lambda x, y: x % y != 0, - } - - def __init__(self, classes: Optional[Mapping[str, type]] = None) -> None: - self.serialize_type = { - "iso-8601": Serializer.serialize_iso, - "rfc-1123": Serializer.serialize_rfc, - "unix-time": Serializer.serialize_unix, - "duration": Serializer.serialize_duration, - "date": Serializer.serialize_date, - "time": Serializer.serialize_time, - "decimal": Serializer.serialize_decimal, - "long": Serializer.serialize_long, - "bytearray": Serializer.serialize_bytearray, - "base64": Serializer.serialize_base64, - "object": self.serialize_object, - "[]": self.serialize_iter, - "{}": self.serialize_dict, - } - self.dependencies: Dict[str, type] = dict(classes) if classes else {} - self.key_transformer = full_restapi_key_transformer - self.client_side_validation = True - - def _serialize( # pylint: disable=too-many-nested-blocks, too-many-branches, too-many-statements, too-many-locals - self, target_obj, data_type=None, **kwargs - ): - """Serialize data into a string according to type. - - :param object target_obj: The data to be serialized. - :param str data_type: The type to be serialized from. - :rtype: str, dict - :raises SerializationError: if serialization fails. - :returns: The serialized data. - """ - key_transformer = kwargs.get("key_transformer", self.key_transformer) - keep_readonly = kwargs.get("keep_readonly", False) - if target_obj is None: - return None - - attr_name = None - class_name = target_obj.__class__.__name__ - - if data_type: - return self.serialize_data(target_obj, data_type, **kwargs) - - if not hasattr(target_obj, "_attribute_map"): - data_type = type(target_obj).__name__ - if data_type in self.basic_types.values(): - return self.serialize_data(target_obj, data_type, **kwargs) - - # Force "is_xml" kwargs if we detect a XML model - try: - is_xml_model_serialization = kwargs["is_xml"] - except KeyError: - is_xml_model_serialization = kwargs.setdefault("is_xml", target_obj.is_xml_model()) - - serialized = {} - if is_xml_model_serialization: - serialized = target_obj._create_xml_node() # pylint: disable=protected-access - try: - attributes = target_obj._attribute_map # pylint: disable=protected-access - for attr, attr_desc in attributes.items(): - attr_name = attr - if not keep_readonly and target_obj._validation.get( # pylint: disable=protected-access - attr_name, {} - ).get("readonly", False): - continue - - if attr_name == "additional_properties" and attr_desc["key"] == "": - if target_obj.additional_properties is not None: - serialized.update(target_obj.additional_properties) - continue - try: - - orig_attr = getattr(target_obj, attr) - if is_xml_model_serialization: - pass # Don't provide "transformer" for XML for now. Keep "orig_attr" - else: # JSON - keys, orig_attr = key_transformer(attr, attr_desc.copy(), orig_attr) - keys = keys if isinstance(keys, list) else [keys] - - kwargs["serialization_ctxt"] = attr_desc - new_attr = self.serialize_data(orig_attr, attr_desc["type"], **kwargs) - - if is_xml_model_serialization: - xml_desc = attr_desc.get("xml", {}) - xml_name = xml_desc.get("name", attr_desc["key"]) - xml_prefix = xml_desc.get("prefix", None) - xml_ns = xml_desc.get("ns", None) - if xml_desc.get("attr", False): - if xml_ns: - ET.register_namespace(xml_prefix, xml_ns) - xml_name = "{{{}}}{}".format(xml_ns, xml_name) - serialized.set(xml_name, new_attr) # type: ignore - continue - if xml_desc.get("text", False): - serialized.text = new_attr # type: ignore - continue - if isinstance(new_attr, list): - serialized.extend(new_attr) # type: ignore - elif isinstance(new_attr, ET.Element): - # If the down XML has no XML/Name, - # we MUST replace the tag with the local tag. But keeping the namespaces. - if "name" not in getattr(orig_attr, "_xml_map", {}): - splitted_tag = new_attr.tag.split("}") - if len(splitted_tag) == 2: # Namespace - new_attr.tag = "}".join([splitted_tag[0], xml_name]) - else: - new_attr.tag = xml_name - serialized.append(new_attr) # type: ignore - else: # That's a basic type - # Integrate namespace if necessary - local_node = _create_xml_node(xml_name, xml_prefix, xml_ns) - local_node.text = str(new_attr) - serialized.append(local_node) # type: ignore - else: # JSON - for k in reversed(keys): # type: ignore - new_attr = {k: new_attr} - - _new_attr = new_attr - _serialized = serialized - for k in keys: # type: ignore - if k not in _serialized: - _serialized.update(_new_attr) # type: ignore - _new_attr = _new_attr[k] # type: ignore - _serialized = _serialized[k] - except ValueError as err: - if isinstance(err, SerializationError): - raise - - except (AttributeError, KeyError, TypeError) as err: - msg = "Attribute {} in object {} cannot be serialized.\n{}".format(attr_name, class_name, str(target_obj)) - raise SerializationError(msg) from err - return serialized - - def body(self, data, data_type, **kwargs): - """Serialize data intended for a request body. - - :param object data: The data to be serialized. - :param str data_type: The type to be serialized from. - :rtype: dict - :raises SerializationError: if serialization fails. - :raises ValueError: if data is None - :returns: The serialized request body - """ - - # Just in case this is a dict - internal_data_type_str = data_type.strip("[]{}") - internal_data_type = self.dependencies.get(internal_data_type_str, None) - try: - is_xml_model_serialization = kwargs["is_xml"] - except KeyError: - if internal_data_type and issubclass(internal_data_type, Model): - is_xml_model_serialization = kwargs.setdefault("is_xml", internal_data_type.is_xml_model()) - else: - is_xml_model_serialization = False - if internal_data_type and not isinstance(internal_data_type, Enum): - try: - deserializer = Deserializer(self.dependencies) - # Since it's on serialization, it's almost sure that format is not JSON REST - # We're not able to deal with additional properties for now. - deserializer.additional_properties_detection = False - if is_xml_model_serialization: - deserializer.key_extractors = [ # type: ignore - attribute_key_case_insensitive_extractor, - ] - else: - deserializer.key_extractors = [ - rest_key_case_insensitive_extractor, - attribute_key_case_insensitive_extractor, - last_rest_key_case_insensitive_extractor, - ] - data = deserializer._deserialize(data_type, data) # pylint: disable=protected-access - except DeserializationError as err: - raise SerializationError("Unable to build a model: " + str(err)) from err - - return self._serialize(data, data_type, **kwargs) - - def url(self, name, data, data_type, **kwargs): - """Serialize data intended for a URL path. - - :param str name: The name of the URL path parameter. - :param object data: The data to be serialized. - :param str data_type: The type to be serialized from. - :rtype: str - :returns: The serialized URL path - :raises TypeError: if serialization fails. - :raises ValueError: if data is None - """ - try: - output = self.serialize_data(data, data_type, **kwargs) - if data_type == "bool": - output = json.dumps(output) - - if kwargs.get("skip_quote") is True: - output = str(output) - output = output.replace("{", quote("{")).replace("}", quote("}")) - else: - output = quote(str(output), safe="") - except SerializationError as exc: - raise TypeError("{} must be type {}.".format(name, data_type)) from exc - return output - - def query(self, name, data, data_type, **kwargs): - """Serialize data intended for a URL query. - - :param str name: The name of the query parameter. - :param object data: The data to be serialized. - :param str data_type: The type to be serialized from. - :rtype: str, list - :raises TypeError: if serialization fails. - :raises ValueError: if data is None - :returns: The serialized query parameter - """ - try: - # Treat the list aside, since we don't want to encode the div separator - if data_type.startswith("["): - internal_data_type = data_type[1:-1] - do_quote = not kwargs.get("skip_quote", False) - return self.serialize_iter(data, internal_data_type, do_quote=do_quote, **kwargs) - - # Not a list, regular serialization - output = self.serialize_data(data, data_type, **kwargs) - if data_type == "bool": - output = json.dumps(output) - if kwargs.get("skip_quote") is True: - output = str(output) - else: - output = quote(str(output), safe="") - except SerializationError as exc: - raise TypeError("{} must be type {}.".format(name, data_type)) from exc - return str(output) - - def header(self, name, data, data_type, **kwargs): - """Serialize data intended for a request header. - - :param str name: The name of the header. - :param object data: The data to be serialized. - :param str data_type: The type to be serialized from. - :rtype: str - :raises TypeError: if serialization fails. - :raises ValueError: if data is None - :returns: The serialized header - """ - try: - if data_type in ["[str]"]: - data = ["" if d is None else d for d in data] - - output = self.serialize_data(data, data_type, **kwargs) - if data_type == "bool": - output = json.dumps(output) - except SerializationError as exc: - raise TypeError("{} must be type {}.".format(name, data_type)) from exc - return str(output) - - def serialize_data(self, data, data_type, **kwargs): - """Serialize generic data according to supplied data type. - - :param object data: The data to be serialized. - :param str data_type: The type to be serialized from. - :raises AttributeError: if required data is None. - :raises ValueError: if data is None - :raises SerializationError: if serialization fails. - :returns: The serialized data. - :rtype: str, int, float, bool, dict, list - """ - if data is None: - raise ValueError("No value for given attribute") - - try: - if data is CoreNull: - return None - if data_type in self.basic_types.values(): - return self.serialize_basic(data, data_type, **kwargs) - - if data_type in self.serialize_type: - return self.serialize_type[data_type](data, **kwargs) - - # If dependencies is empty, try with current data class - # It has to be a subclass of Enum anyway - enum_type = self.dependencies.get(data_type, data.__class__) - if issubclass(enum_type, Enum): - return Serializer.serialize_enum(data, enum_obj=enum_type) - - iter_type = data_type[0] + data_type[-1] - if iter_type in self.serialize_type: - return self.serialize_type[iter_type](data, data_type[1:-1], **kwargs) - - except (ValueError, TypeError) as err: - msg = "Unable to serialize value: {!r} as type: {!r}." - raise SerializationError(msg.format(data, data_type)) from err - return self._serialize(data, **kwargs) - - @classmethod - def _get_custom_serializers(cls, data_type, **kwargs): # pylint: disable=inconsistent-return-statements - custom_serializer = kwargs.get("basic_types_serializers", {}).get(data_type) - if custom_serializer: - return custom_serializer - if kwargs.get("is_xml", False): - return cls._xml_basic_types_serializers.get(data_type) - - @classmethod - def serialize_basic(cls, data, data_type, **kwargs): - """Serialize basic builting data type. - Serializes objects to str, int, float or bool. - - Possible kwargs: - - basic_types_serializers dict[str, callable] : If set, use the callable as serializer - - is_xml bool : If set, use xml_basic_types_serializers - - :param obj data: Object to be serialized. - :param str data_type: Type of object in the iterable. - :rtype: str, int, float, bool - :return: serialized object - """ - custom_serializer = cls._get_custom_serializers(data_type, **kwargs) - if custom_serializer: - return custom_serializer(data) - if data_type == "str": - return cls.serialize_unicode(data) - return eval(data_type)(data) # nosec # pylint: disable=eval-used - - @classmethod - def serialize_unicode(cls, data): - """Special handling for serializing unicode strings in Py2. - Encode to UTF-8 if unicode, otherwise handle as a str. - - :param str data: Object to be serialized. - :rtype: str - :return: serialized object - """ - try: # If I received an enum, return its value - return data.value - except AttributeError: - pass - - try: - if isinstance(data, unicode): # type: ignore - # Don't change it, JSON and XML ElementTree are totally able - # to serialize correctly u'' strings - return data - except NameError: - return str(data) - return str(data) - - def serialize_iter(self, data, iter_type, div=None, **kwargs): - """Serialize iterable. - - Supported kwargs: - - serialization_ctxt dict : The current entry of _attribute_map, or same format. - serialization_ctxt['type'] should be same as data_type. - - is_xml bool : If set, serialize as XML - - :param list data: Object to be serialized. - :param str iter_type: Type of object in the iterable. - :param str div: If set, this str will be used to combine the elements - in the iterable into a combined string. Default is 'None'. - Defaults to False. - :rtype: list, str - :return: serialized iterable - """ - if isinstance(data, str): - raise SerializationError("Refuse str type as a valid iter type.") - - serialization_ctxt = kwargs.get("serialization_ctxt", {}) - is_xml = kwargs.get("is_xml", False) - - serialized = [] - for d in data: - try: - serialized.append(self.serialize_data(d, iter_type, **kwargs)) - except ValueError as err: - if isinstance(err, SerializationError): - raise - serialized.append(None) - - if kwargs.get("do_quote", False): - serialized = ["" if s is None else quote(str(s), safe="") for s in serialized] - - if div: - serialized = ["" if s is None else str(s) for s in serialized] - serialized = div.join(serialized) - - if "xml" in serialization_ctxt or is_xml: - # XML serialization is more complicated - xml_desc = serialization_ctxt.get("xml", {}) - xml_name = xml_desc.get("name") - if not xml_name: - xml_name = serialization_ctxt["key"] - - # Create a wrap node if necessary (use the fact that Element and list have "append") - is_wrapped = xml_desc.get("wrapped", False) - node_name = xml_desc.get("itemsName", xml_name) - if is_wrapped: - final_result = _create_xml_node(xml_name, xml_desc.get("prefix", None), xml_desc.get("ns", None)) - else: - final_result = [] - # All list elements to "local_node" - for el in serialized: - if isinstance(el, ET.Element): - el_node = el - else: - el_node = _create_xml_node(node_name, xml_desc.get("prefix", None), xml_desc.get("ns", None)) - if el is not None: # Otherwise it writes "None" :-p - el_node.text = str(el) - final_result.append(el_node) - return final_result - return serialized - - def serialize_dict(self, attr, dict_type, **kwargs): - """Serialize a dictionary of objects. - - :param dict attr: Object to be serialized. - :param str dict_type: Type of object in the dictionary. - :rtype: dict - :return: serialized dictionary - """ - serialization_ctxt = kwargs.get("serialization_ctxt", {}) - serialized = {} - for key, value in attr.items(): - try: - serialized[self.serialize_unicode(key)] = self.serialize_data(value, dict_type, **kwargs) - except ValueError as err: - if isinstance(err, SerializationError): - raise - serialized[self.serialize_unicode(key)] = None - - if "xml" in serialization_ctxt: - # XML serialization is more complicated - xml_desc = serialization_ctxt["xml"] - xml_name = xml_desc["name"] - - final_result = _create_xml_node(xml_name, xml_desc.get("prefix", None), xml_desc.get("ns", None)) - for key, value in serialized.items(): - ET.SubElement(final_result, key).text = value - return final_result - - return serialized - - def serialize_object(self, attr, **kwargs): # pylint: disable=too-many-return-statements - """Serialize a generic object. - This will be handled as a dictionary. If object passed in is not - a basic type (str, int, float, dict, list) it will simply be - cast to str. - - :param dict attr: Object to be serialized. - :rtype: dict or str - :return: serialized object - """ - if attr is None: - return None - if isinstance(attr, ET.Element): - return attr - obj_type = type(attr) - if obj_type in self.basic_types: - return self.serialize_basic(attr, self.basic_types[obj_type], **kwargs) - if obj_type is _long_type: - return self.serialize_long(attr) - if obj_type is str: - return self.serialize_unicode(attr) - if obj_type is datetime.datetime: - return self.serialize_iso(attr) - if obj_type is datetime.date: - return self.serialize_date(attr) - if obj_type is datetime.time: - return self.serialize_time(attr) - if obj_type is datetime.timedelta: - return self.serialize_duration(attr) - if obj_type is decimal.Decimal: - return self.serialize_decimal(attr) - - # If it's a model or I know this dependency, serialize as a Model - if obj_type in self.dependencies.values() or isinstance(attr, Model): - return self._serialize(attr) - - if obj_type == dict: - serialized = {} - for key, value in attr.items(): - try: - serialized[self.serialize_unicode(key)] = self.serialize_object(value, **kwargs) - except ValueError: - serialized[self.serialize_unicode(key)] = None - return serialized - - if obj_type == list: - serialized = [] - for obj in attr: - try: - serialized.append(self.serialize_object(obj, **kwargs)) - except ValueError: - pass - return serialized - return str(attr) - - @staticmethod - def serialize_enum(attr, enum_obj=None): - try: - result = attr.value - except AttributeError: - result = attr - try: - enum_obj(result) # type: ignore - return result - except ValueError as exc: - for enum_value in enum_obj: # type: ignore - if enum_value.value.lower() == str(attr).lower(): - return enum_value.value - error = "{!r} is not valid value for enum {!r}" - raise SerializationError(error.format(attr, enum_obj)) from exc - - @staticmethod - def serialize_bytearray(attr, **kwargs): # pylint: disable=unused-argument - """Serialize bytearray into base-64 string. - - :param str attr: Object to be serialized. - :rtype: str - :return: serialized base64 - """ - return b64encode(attr).decode() - - @staticmethod - def serialize_base64(attr, **kwargs): # pylint: disable=unused-argument - """Serialize str into base-64 string. - - :param str attr: Object to be serialized. - :rtype: str - :return: serialized base64 - """ - encoded = b64encode(attr).decode("ascii") - return encoded.strip("=").replace("+", "-").replace("/", "_") - - @staticmethod - def serialize_decimal(attr, **kwargs): # pylint: disable=unused-argument - """Serialize Decimal object to float. - - :param decimal attr: Object to be serialized. - :rtype: float - :return: serialized decimal - """ - return float(attr) - - @staticmethod - def serialize_long(attr, **kwargs): # pylint: disable=unused-argument - """Serialize long (Py2) or int (Py3). - - :param int attr: Object to be serialized. - :rtype: int/long - :return: serialized long - """ - return _long_type(attr) - - @staticmethod - def serialize_date(attr, **kwargs): # pylint: disable=unused-argument - """Serialize Date object into ISO-8601 formatted string. - - :param Date attr: Object to be serialized. - :rtype: str - :return: serialized date - """ - if isinstance(attr, str): - attr = isodate.parse_date(attr) - t = "{:04}-{:02}-{:02}".format(attr.year, attr.month, attr.day) - return t - - @staticmethod - def serialize_time(attr, **kwargs): # pylint: disable=unused-argument - """Serialize Time object into ISO-8601 formatted string. - - :param datetime.time attr: Object to be serialized. - :rtype: str - :return: serialized time - """ - if isinstance(attr, str): - attr = isodate.parse_time(attr) - t = "{:02}:{:02}:{:02}".format(attr.hour, attr.minute, attr.second) - if attr.microsecond: - t += ".{:02}".format(attr.microsecond) - return t - - @staticmethod - def serialize_duration(attr, **kwargs): # pylint: disable=unused-argument - """Serialize TimeDelta object into ISO-8601 formatted string. - - :param TimeDelta attr: Object to be serialized. - :rtype: str - :return: serialized duration - """ - if isinstance(attr, str): - attr = isodate.parse_duration(attr) - return isodate.duration_isoformat(attr) - - @staticmethod - def serialize_rfc(attr, **kwargs): # pylint: disable=unused-argument - """Serialize Datetime object into RFC-1123 formatted string. - - :param Datetime attr: Object to be serialized. - :rtype: str - :raises TypeError: if format invalid. - :return: serialized rfc - """ - try: - if not attr.tzinfo: - _LOGGER.warning("Datetime with no tzinfo will be considered UTC.") - utc = attr.utctimetuple() - except AttributeError as exc: - raise TypeError("RFC1123 object must be valid Datetime object.") from exc - - return "{}, {:02} {} {:04} {:02}:{:02}:{:02} GMT".format( - Serializer.days[utc.tm_wday], - utc.tm_mday, - Serializer.months[utc.tm_mon], - utc.tm_year, - utc.tm_hour, - utc.tm_min, - utc.tm_sec, - ) - - @staticmethod - def serialize_iso(attr, **kwargs): # pylint: disable=unused-argument - """Serialize Datetime object into ISO-8601 formatted string. - - :param Datetime attr: Object to be serialized. - :rtype: str - :raises SerializationError: if format invalid. - :return: serialized iso - """ - if isinstance(attr, str): - attr = isodate.parse_datetime(attr) - try: - if not attr.tzinfo: - _LOGGER.warning("Datetime with no tzinfo will be considered UTC.") - utc = attr.utctimetuple() - if utc.tm_year > 9999 or utc.tm_year < 1: - raise OverflowError("Hit max or min date") - - microseconds = str(attr.microsecond).rjust(6, "0").rstrip("0").ljust(3, "0") - if microseconds: - microseconds = "." + microseconds - date = "{:04}-{:02}-{:02}T{:02}:{:02}:{:02}".format( - utc.tm_year, utc.tm_mon, utc.tm_mday, utc.tm_hour, utc.tm_min, utc.tm_sec - ) - return date + microseconds + "Z" - except (ValueError, OverflowError) as err: - msg = "Unable to serialize datetime object." - raise SerializationError(msg) from err - except AttributeError as err: - msg = "ISO-8601 object must be valid Datetime object." - raise TypeError(msg) from err - - @staticmethod - def serialize_unix(attr, **kwargs): # pylint: disable=unused-argument - """Serialize Datetime object into IntTime format. - This is represented as seconds. - - :param Datetime attr: Object to be serialized. - :rtype: int - :raises SerializationError: if format invalid - :return: serialied unix - """ - if isinstance(attr, int): - return attr - try: - if not attr.tzinfo: - _LOGGER.warning("Datetime with no tzinfo will be considered UTC.") - return int(calendar.timegm(attr.utctimetuple())) - except AttributeError as exc: - raise TypeError("Unix time object must be valid Datetime object.") from exc - - -def rest_key_extractor(attr, attr_desc, data): # pylint: disable=unused-argument - key = attr_desc["key"] - working_data = data - - while "." in key: - # Need the cast, as for some reasons "split" is typed as list[str | Any] - dict_keys = cast(List[str], _FLATTEN.split(key)) - if len(dict_keys) == 1: - key = _decode_attribute_map_key(dict_keys[0]) - break - working_key = _decode_attribute_map_key(dict_keys[0]) - working_data = working_data.get(working_key, data) - if working_data is None: - # If at any point while following flatten JSON path see None, it means - # that all properties under are None as well - return None - key = ".".join(dict_keys[1:]) - - return working_data.get(key) - - -def rest_key_case_insensitive_extractor( # pylint: disable=unused-argument, inconsistent-return-statements - attr, attr_desc, data -): - key = attr_desc["key"] - working_data = data - - while "." in key: - dict_keys = _FLATTEN.split(key) - if len(dict_keys) == 1: - key = _decode_attribute_map_key(dict_keys[0]) - break - working_key = _decode_attribute_map_key(dict_keys[0]) - working_data = attribute_key_case_insensitive_extractor(working_key, None, working_data) - if working_data is None: - # If at any point while following flatten JSON path see None, it means - # that all properties under are None as well - return None - key = ".".join(dict_keys[1:]) - - if working_data: - return attribute_key_case_insensitive_extractor(key, None, working_data) - - -def last_rest_key_extractor(attr, attr_desc, data): # pylint: disable=unused-argument - """Extract the attribute in "data" based on the last part of the JSON path key. - - :param str attr: The attribute to extract - :param dict attr_desc: The attribute description - :param dict data: The data to extract from - :rtype: object - :returns: The extracted attribute - """ - key = attr_desc["key"] - dict_keys = _FLATTEN.split(key) - return attribute_key_extractor(dict_keys[-1], None, data) - - -def last_rest_key_case_insensitive_extractor(attr, attr_desc, data): # pylint: disable=unused-argument - """Extract the attribute in "data" based on the last part of the JSON path key. - - This is the case insensitive version of "last_rest_key_extractor" - :param str attr: The attribute to extract - :param dict attr_desc: The attribute description - :param dict data: The data to extract from - :rtype: object - :returns: The extracted attribute - """ - key = attr_desc["key"] - dict_keys = _FLATTEN.split(key) - return attribute_key_case_insensitive_extractor(dict_keys[-1], None, data) - - -def attribute_key_extractor(attr, _, data): - return data.get(attr) - - -def attribute_key_case_insensitive_extractor(attr, _, data): - found_key = None - lower_attr = attr.lower() - for key in data: - if lower_attr == key.lower(): - found_key = key - break - - return data.get(found_key) - - -def _extract_name_from_internal_type(internal_type): - """Given an internal type XML description, extract correct XML name with namespace. - - :param dict internal_type: An model type - :rtype: tuple - :returns: A tuple XML name + namespace dict - """ - internal_type_xml_map = getattr(internal_type, "_xml_map", {}) - xml_name = internal_type_xml_map.get("name", internal_type.__name__) - xml_ns = internal_type_xml_map.get("ns", None) - if xml_ns: - xml_name = "{{{}}}{}".format(xml_ns, xml_name) - return xml_name - - -def xml_key_extractor(attr, attr_desc, data): # pylint: disable=unused-argument,too-many-return-statements - if isinstance(data, dict): - return None - - # Test if this model is XML ready first - if not isinstance(data, ET.Element): - return None - - xml_desc = attr_desc.get("xml", {}) - xml_name = xml_desc.get("name", attr_desc["key"]) - - # Look for a children - is_iter_type = attr_desc["type"].startswith("[") - is_wrapped = xml_desc.get("wrapped", False) - internal_type = attr_desc.get("internalType", None) - internal_type_xml_map = getattr(internal_type, "_xml_map", {}) - - # Integrate namespace if necessary - xml_ns = xml_desc.get("ns", internal_type_xml_map.get("ns", None)) - if xml_ns: - xml_name = "{{{}}}{}".format(xml_ns, xml_name) - - # If it's an attribute, that's simple - if xml_desc.get("attr", False): - return data.get(xml_name) - - # If it's x-ms-text, that's simple too - if xml_desc.get("text", False): - return data.text - - # Scenario where I take the local name: - # - Wrapped node - # - Internal type is an enum (considered basic types) - # - Internal type has no XML/Name node - if is_wrapped or (internal_type and (issubclass(internal_type, Enum) or "name" not in internal_type_xml_map)): - children = data.findall(xml_name) - # If internal type has a local name and it's not a list, I use that name - elif not is_iter_type and internal_type and "name" in internal_type_xml_map: - xml_name = _extract_name_from_internal_type(internal_type) - children = data.findall(xml_name) - # That's an array - else: - if internal_type: # Complex type, ignore itemsName and use the complex type name - items_name = _extract_name_from_internal_type(internal_type) - else: - items_name = xml_desc.get("itemsName", xml_name) - children = data.findall(items_name) - - if len(children) == 0: - if is_iter_type: - if is_wrapped: - return None # is_wrapped no node, we want None - return [] # not wrapped, assume empty list - return None # Assume it's not there, maybe an optional node. - - # If is_iter_type and not wrapped, return all found children - if is_iter_type: - if not is_wrapped: - return children - # Iter and wrapped, should have found one node only (the wrap one) - if len(children) != 1: - raise DeserializationError( - "Tried to deserialize an array not wrapped, and found several nodes '{}'. Maybe you should declare this array as wrapped?".format( - xml_name - ) - ) - return list(children[0]) # Might be empty list and that's ok. - - # Here it's not a itertype, we should have found one element only or empty - if len(children) > 1: - raise DeserializationError("Find several XML '{}' where it was not expected".format(xml_name)) - return children[0] - - -class Deserializer: - """Response object model deserializer. - - :param dict classes: Class type dictionary for deserializing complex types. - :ivar list key_extractors: Ordered list of extractors to be used by this deserializer. - """ - - basic_types = {str: "str", int: "int", bool: "bool", float: "float"} - - valid_date = re.compile(r"\d{4}[-]\d{2}[-]\d{2}T\d{2}:\d{2}:\d{2}\.?\d*Z?[-+]?[\d{2}]?:?[\d{2}]?") - - def __init__(self, classes: Optional[Mapping[str, type]] = None) -> None: - self.deserialize_type = { - "iso-8601": Deserializer.deserialize_iso, - "rfc-1123": Deserializer.deserialize_rfc, - "unix-time": Deserializer.deserialize_unix, - "duration": Deserializer.deserialize_duration, - "date": Deserializer.deserialize_date, - "time": Deserializer.deserialize_time, - "decimal": Deserializer.deserialize_decimal, - "long": Deserializer.deserialize_long, - "bytearray": Deserializer.deserialize_bytearray, - "base64": Deserializer.deserialize_base64, - "object": self.deserialize_object, - "[]": self.deserialize_iter, - "{}": self.deserialize_dict, - } - self.deserialize_expected_types = { - "duration": (isodate.Duration, datetime.timedelta), - "iso-8601": (datetime.datetime), - } - self.dependencies: Dict[str, type] = dict(classes) if classes else {} - self.key_extractors = [rest_key_extractor, xml_key_extractor] - # Additional properties only works if the "rest_key_extractor" is used to - # extract the keys. Making it to work whatever the key extractor is too much - # complicated, with no real scenario for now. - # So adding a flag to disable additional properties detection. This flag should be - # used if your expect the deserialization to NOT come from a JSON REST syntax. - # Otherwise, result are unexpected - self.additional_properties_detection = True - - def __call__(self, target_obj, response_data, content_type=None): - """Call the deserializer to process a REST response. - - :param str target_obj: Target data type to deserialize to. - :param requests.Response response_data: REST response object. - :param str content_type: Swagger "produces" if available. - :raises DeserializationError: if deserialization fails. - :return: Deserialized object. - :rtype: object - """ - data = self._unpack_content(response_data, content_type) - return self._deserialize(target_obj, data) - - def _deserialize(self, target_obj, data): # pylint: disable=inconsistent-return-statements - """Call the deserializer on a model. - - Data needs to be already deserialized as JSON or XML ElementTree - - :param str target_obj: Target data type to deserialize to. - :param object data: Object to deserialize. - :raises DeserializationError: if deserialization fails. - :return: Deserialized object. - :rtype: object - """ - # This is already a model, go recursive just in case - if hasattr(data, "_attribute_map"): - constants = [name for name, config in getattr(data, "_validation", {}).items() if config.get("constant")] - try: - for attr, mapconfig in data._attribute_map.items(): # pylint: disable=protected-access - if attr in constants: - continue - value = getattr(data, attr) - if value is None: - continue - local_type = mapconfig["type"] - internal_data_type = local_type.strip("[]{}") - if internal_data_type not in self.dependencies or isinstance(internal_data_type, Enum): - continue - setattr(data, attr, self._deserialize(local_type, value)) - return data - except AttributeError: - return - - response, class_name = self._classify_target(target_obj, data) - - if isinstance(response, str): - return self.deserialize_data(data, response) - if isinstance(response, type) and issubclass(response, Enum): - return self.deserialize_enum(data, response) - - if data is None or data is CoreNull: - return data - try: - attributes = response._attribute_map # type: ignore # pylint: disable=protected-access - d_attrs = {} - for attr, attr_desc in attributes.items(): - # Check empty string. If it's not empty, someone has a real "additionalProperties"... - if attr == "additional_properties" and attr_desc["key"] == "": - continue - raw_value = None - # Enhance attr_desc with some dynamic data - attr_desc = attr_desc.copy() # Do a copy, do not change the real one - internal_data_type = attr_desc["type"].strip("[]{}") - if internal_data_type in self.dependencies: - attr_desc["internalType"] = self.dependencies[internal_data_type] - - for key_extractor in self.key_extractors: - found_value = key_extractor(attr, attr_desc, data) - if found_value is not None: - if raw_value is not None and raw_value != found_value: - msg = ( - "Ignoring extracted value '%s' from %s for key '%s'" - " (duplicate extraction, follow extractors order)" - ) - _LOGGER.warning(msg, found_value, key_extractor, attr) - continue - raw_value = found_value - - value = self.deserialize_data(raw_value, attr_desc["type"]) - d_attrs[attr] = value - except (AttributeError, TypeError, KeyError) as err: - msg = "Unable to deserialize to object: " + class_name # type: ignore - raise DeserializationError(msg) from err - additional_properties = self._build_additional_properties(attributes, data) - return self._instantiate_model(response, d_attrs, additional_properties) - - def _build_additional_properties(self, attribute_map, data): - if not self.additional_properties_detection: - return None - if "additional_properties" in attribute_map and attribute_map.get("additional_properties", {}).get("key") != "": - # Check empty string. If it's not empty, someone has a real "additionalProperties" - return None - if isinstance(data, ET.Element): - data = {el.tag: el.text for el in data} - - known_keys = { - _decode_attribute_map_key(_FLATTEN.split(desc["key"])[0]) - for desc in attribute_map.values() - if desc["key"] != "" - } - present_keys = set(data.keys()) - missing_keys = present_keys - known_keys - return {key: data[key] for key in missing_keys} - - def _classify_target(self, target, data): - """Check to see whether the deserialization target object can - be classified into a subclass. - Once classification has been determined, initialize object. - - :param str target: The target object type to deserialize to. - :param str/dict data: The response data to deserialize. - :return: The classified target object and its class name. - :rtype: tuple - """ - if target is None: - return None, None - - if isinstance(target, str): - try: - target = self.dependencies[target] - except KeyError: - return target, target - - try: - target = target._classify(data, self.dependencies) # type: ignore # pylint: disable=protected-access - except AttributeError: - pass # Target is not a Model, no classify - return target, target.__class__.__name__ # type: ignore - - def failsafe_deserialize(self, target_obj, data, content_type=None): - """Ignores any errors encountered in deserialization, - and falls back to not deserializing the object. Recommended - for use in error deserialization, as we want to return the - HttpResponseError to users, and not have them deal with - a deserialization error. - - :param str target_obj: The target object type to deserialize to. - :param str/dict data: The response data to deserialize. - :param str content_type: Swagger "produces" if available. - :return: Deserialized object. - :rtype: object - """ - try: - return self(target_obj, data, content_type=content_type) - except: # pylint: disable=bare-except - _LOGGER.debug( - "Ran into a deserialization error. Ignoring since this is failsafe deserialization", exc_info=True - ) - return None - - @staticmethod - def _unpack_content(raw_data, content_type=None): - """Extract the correct structure for deserialization. - - If raw_data is a PipelineResponse, try to extract the result of RawDeserializer. - if we can't, raise. Your Pipeline should have a RawDeserializer. - - If not a pipeline response and raw_data is bytes or string, use content-type - to decode it. If no content-type, try JSON. - - If raw_data is something else, bypass all logic and return it directly. - - :param obj raw_data: Data to be processed. - :param str content_type: How to parse if raw_data is a string/bytes. - :raises JSONDecodeError: If JSON is requested and parsing is impossible. - :raises UnicodeDecodeError: If bytes is not UTF8 - :rtype: object - :return: Unpacked content. - """ - # Assume this is enough to detect a Pipeline Response without importing it - context = getattr(raw_data, "context", {}) - if context: - if RawDeserializer.CONTEXT_NAME in context: - return context[RawDeserializer.CONTEXT_NAME] - raise ValueError("This pipeline didn't have the RawDeserializer policy; can't deserialize") - - # Assume this is enough to recognize universal_http.ClientResponse without importing it - if hasattr(raw_data, "body"): - return RawDeserializer.deserialize_from_http_generics(raw_data.text(), raw_data.headers) - - # Assume this enough to recognize requests.Response without importing it. - if hasattr(raw_data, "_content_consumed"): - return RawDeserializer.deserialize_from_http_generics(raw_data.text, raw_data.headers) - - if isinstance(raw_data, (str, bytes)) or hasattr(raw_data, "read"): - return RawDeserializer.deserialize_from_text(raw_data, content_type) # type: ignore - return raw_data - - def _instantiate_model(self, response, attrs, additional_properties=None): - """Instantiate a response model passing in deserialized args. - - :param Response response: The response model class. - :param dict attrs: The deserialized response attributes. - :param dict additional_properties: Additional properties to be set. - :rtype: Response - :return: The instantiated response model. - """ - if callable(response): - subtype = getattr(response, "_subtype_map", {}) - try: - readonly = [ - k - for k, v in response._validation.items() # pylint: disable=protected-access # type: ignore - if v.get("readonly") - ] - const = [ - k - for k, v in response._validation.items() # pylint: disable=protected-access # type: ignore - if v.get("constant") - ] - kwargs = {k: v for k, v in attrs.items() if k not in subtype and k not in readonly + const} - response_obj = response(**kwargs) - for attr in readonly: - setattr(response_obj, attr, attrs.get(attr)) - if additional_properties: - response_obj.additional_properties = additional_properties # type: ignore - return response_obj - except TypeError as err: - msg = "Unable to deserialize {} into model {}. ".format(kwargs, response) # type: ignore - raise DeserializationError(msg + str(err)) from err - else: - try: - for attr, value in attrs.items(): - setattr(response, attr, value) - return response - except Exception as exp: - msg = "Unable to populate response model. " - msg += "Type: {}, Error: {}".format(type(response), exp) - raise DeserializationError(msg) from exp - - def deserialize_data(self, data, data_type): # pylint: disable=too-many-return-statements - """Process data for deserialization according to data type. - - :param str data: The response string to be deserialized. - :param str data_type: The type to deserialize to. - :raises DeserializationError: if deserialization fails. - :return: Deserialized object. - :rtype: object - """ - if data is None: - return data - - try: - if not data_type: - return data - if data_type in self.basic_types.values(): - return self.deserialize_basic(data, data_type) - if data_type in self.deserialize_type: - if isinstance(data, self.deserialize_expected_types.get(data_type, tuple())): - return data - - is_a_text_parsing_type = lambda x: x not in [ # pylint: disable=unnecessary-lambda-assignment - "object", - "[]", - r"{}", - ] - if isinstance(data, ET.Element) and is_a_text_parsing_type(data_type) and not data.text: - return None - data_val = self.deserialize_type[data_type](data) - return data_val - - iter_type = data_type[0] + data_type[-1] - if iter_type in self.deserialize_type: - return self.deserialize_type[iter_type](data, data_type[1:-1]) - - obj_type = self.dependencies[data_type] - if issubclass(obj_type, Enum): - if isinstance(data, ET.Element): - data = data.text - return self.deserialize_enum(data, obj_type) - - except (ValueError, TypeError, AttributeError) as err: - msg = "Unable to deserialize response data." - msg += " Data: {}, {}".format(data, data_type) - raise DeserializationError(msg) from err - return self._deserialize(obj_type, data) - - def deserialize_iter(self, attr, iter_type): - """Deserialize an iterable. - - :param list attr: Iterable to be deserialized. - :param str iter_type: The type of object in the iterable. - :return: Deserialized iterable. - :rtype: list - """ - if attr is None: - return None - if isinstance(attr, ET.Element): # If I receive an element here, get the children - attr = list(attr) - if not isinstance(attr, (list, set)): - raise DeserializationError("Cannot deserialize as [{}] an object of type {}".format(iter_type, type(attr))) - return [self.deserialize_data(a, iter_type) for a in attr] - - def deserialize_dict(self, attr, dict_type): - """Deserialize a dictionary. - - :param dict/list attr: Dictionary to be deserialized. Also accepts - a list of key, value pairs. - :param str dict_type: The object type of the items in the dictionary. - :return: Deserialized dictionary. - :rtype: dict - """ - if isinstance(attr, list): - return {x["key"]: self.deserialize_data(x["value"], dict_type) for x in attr} - - if isinstance(attr, ET.Element): - # Transform value into {"Key": "value"} - attr = {el.tag: el.text for el in attr} - return {k: self.deserialize_data(v, dict_type) for k, v in attr.items()} - - def deserialize_object(self, attr, **kwargs): # pylint: disable=too-many-return-statements - """Deserialize a generic object. - This will be handled as a dictionary. - - :param dict attr: Dictionary to be deserialized. - :return: Deserialized object. - :rtype: dict - :raises TypeError: if non-builtin datatype encountered. - """ - if attr is None: - return None - if isinstance(attr, ET.Element): - # Do no recurse on XML, just return the tree as-is - return attr - if isinstance(attr, str): - return self.deserialize_basic(attr, "str") - obj_type = type(attr) - if obj_type in self.basic_types: - return self.deserialize_basic(attr, self.basic_types[obj_type]) - if obj_type is _long_type: - return self.deserialize_long(attr) - - if obj_type == dict: - deserialized = {} - for key, value in attr.items(): - try: - deserialized[key] = self.deserialize_object(value, **kwargs) - except ValueError: - deserialized[key] = None - return deserialized - - if obj_type == list: - deserialized = [] - for obj in attr: - try: - deserialized.append(self.deserialize_object(obj, **kwargs)) - except ValueError: - pass - return deserialized - - error = "Cannot deserialize generic object with type: " - raise TypeError(error + str(obj_type)) - - def deserialize_basic(self, attr, data_type): # pylint: disable=too-many-return-statements - """Deserialize basic builtin data type from string. - Will attempt to convert to str, int, float and bool. - This function will also accept '1', '0', 'true' and 'false' as - valid bool values. - - :param str attr: response string to be deserialized. - :param str data_type: deserialization data type. - :return: Deserialized basic type. - :rtype: str, int, float or bool - :raises TypeError: if string format is not valid. - """ - # If we're here, data is supposed to be a basic type. - # If it's still an XML node, take the text - if isinstance(attr, ET.Element): - attr = attr.text - if not attr: - if data_type == "str": - # None or '', node is empty string. - return "" - # None or '', node with a strong type is None. - # Don't try to model "empty bool" or "empty int" - return None - - if data_type == "bool": - if attr in [True, False, 1, 0]: - return bool(attr) - if isinstance(attr, str): - if attr.lower() in ["true", "1"]: - return True - if attr.lower() in ["false", "0"]: - return False - raise TypeError("Invalid boolean value: {}".format(attr)) - - if data_type == "str": - return self.deserialize_unicode(attr) - return eval(data_type)(attr) # nosec # pylint: disable=eval-used - - @staticmethod - def deserialize_unicode(data): - """Preserve unicode objects in Python 2, otherwise return data - as a string. - - :param str data: response string to be deserialized. - :return: Deserialized string. - :rtype: str or unicode - """ - # We might be here because we have an enum modeled as string, - # and we try to deserialize a partial dict with enum inside - if isinstance(data, Enum): - return data - - # Consider this is real string - try: - if isinstance(data, unicode): # type: ignore - return data - except NameError: - return str(data) - return str(data) - - @staticmethod - def deserialize_enum(data, enum_obj): - """Deserialize string into enum object. - - If the string is not a valid enum value it will be returned as-is - and a warning will be logged. - - :param str data: Response string to be deserialized. If this value is - None or invalid it will be returned as-is. - :param Enum enum_obj: Enum object to deserialize to. - :return: Deserialized enum object. - :rtype: Enum - """ - if isinstance(data, enum_obj) or data is None: - return data - if isinstance(data, Enum): - data = data.value - if isinstance(data, int): - # Workaround. We might consider remove it in the future. - try: - return list(enum_obj.__members__.values())[data] - except IndexError as exc: - error = "{!r} is not a valid index for enum {!r}" - raise DeserializationError(error.format(data, enum_obj)) from exc - try: - return enum_obj(str(data)) - except ValueError: - for enum_value in enum_obj: - if enum_value.value.lower() == str(data).lower(): - return enum_value - # We don't fail anymore for unknown value, we deserialize as a string - _LOGGER.warning("Deserializer is not able to find %s as valid enum in %s", data, enum_obj) - return Deserializer.deserialize_unicode(data) - - @staticmethod - def deserialize_bytearray(attr): - """Deserialize string into bytearray. - - :param str attr: response string to be deserialized. - :return: Deserialized bytearray - :rtype: bytearray - :raises TypeError: if string format invalid. - """ - if isinstance(attr, ET.Element): - attr = attr.text - return bytearray(b64decode(attr)) # type: ignore - - @staticmethod - def deserialize_base64(attr): - """Deserialize base64 encoded string into string. - - :param str attr: response string to be deserialized. - :return: Deserialized base64 string - :rtype: bytearray - :raises TypeError: if string format invalid. - """ - if isinstance(attr, ET.Element): - attr = attr.text - padding = "=" * (3 - (len(attr) + 3) % 4) # type: ignore - attr = attr + padding # type: ignore - encoded = attr.replace("-", "+").replace("_", "/") - return b64decode(encoded) - - @staticmethod - def deserialize_decimal(attr): - """Deserialize string into Decimal object. - - :param str attr: response string to be deserialized. - :return: Deserialized decimal - :raises DeserializationError: if string format invalid. - :rtype: decimal - """ - if isinstance(attr, ET.Element): - attr = attr.text - try: - return decimal.Decimal(str(attr)) # type: ignore - except decimal.DecimalException as err: - msg = "Invalid decimal {}".format(attr) - raise DeserializationError(msg) from err - - @staticmethod - def deserialize_long(attr): - """Deserialize string into long (Py2) or int (Py3). - - :param str attr: response string to be deserialized. - :return: Deserialized int - :rtype: long or int - :raises ValueError: if string format invalid. - """ - if isinstance(attr, ET.Element): - attr = attr.text - return _long_type(attr) # type: ignore - - @staticmethod - def deserialize_duration(attr): - """Deserialize ISO-8601 formatted string into TimeDelta object. - - :param str attr: response string to be deserialized. - :return: Deserialized duration - :rtype: TimeDelta - :raises DeserializationError: if string format invalid. - """ - if isinstance(attr, ET.Element): - attr = attr.text - try: - duration = isodate.parse_duration(attr) - except (ValueError, OverflowError, AttributeError) as err: - msg = "Cannot deserialize duration object." - raise DeserializationError(msg) from err - return duration - - @staticmethod - def deserialize_date(attr): - """Deserialize ISO-8601 formatted string into Date object. - - :param str attr: response string to be deserialized. - :return: Deserialized date - :rtype: Date - :raises DeserializationError: if string format invalid. - """ - if isinstance(attr, ET.Element): - attr = attr.text - if re.search(r"[^\W\d_]", attr, re.I + re.U): # type: ignore - raise DeserializationError("Date must have only digits and -. Received: %s" % attr) - # This must NOT use defaultmonth/defaultday. Using None ensure this raises an exception. - return isodate.parse_date(attr, defaultmonth=0, defaultday=0) - - @staticmethod - def deserialize_time(attr): - """Deserialize ISO-8601 formatted string into time object. - - :param str attr: response string to be deserialized. - :return: Deserialized time - :rtype: datetime.time - :raises DeserializationError: if string format invalid. - """ - if isinstance(attr, ET.Element): - attr = attr.text - if re.search(r"[^\W\d_]", attr, re.I + re.U): # type: ignore - raise DeserializationError("Date must have only digits and -. Received: %s" % attr) - return isodate.parse_time(attr) - - @staticmethod - def deserialize_rfc(attr): - """Deserialize RFC-1123 formatted string into Datetime object. - - :param str attr: response string to be deserialized. - :return: Deserialized RFC datetime - :rtype: Datetime - :raises DeserializationError: if string format invalid. - """ - if isinstance(attr, ET.Element): - attr = attr.text - try: - parsed_date = email.utils.parsedate_tz(attr) # type: ignore - date_obj = datetime.datetime( - *parsed_date[:6], tzinfo=datetime.timezone(datetime.timedelta(minutes=(parsed_date[9] or 0) / 60)) - ) - if not date_obj.tzinfo: - date_obj = date_obj.astimezone(tz=TZ_UTC) - except ValueError as err: - msg = "Cannot deserialize to rfc datetime object." - raise DeserializationError(msg) from err - return date_obj - - @staticmethod - def deserialize_iso(attr): - """Deserialize ISO-8601 formatted string into Datetime object. - - :param str attr: response string to be deserialized. - :return: Deserialized ISO datetime - :rtype: Datetime - :raises DeserializationError: if string format invalid. - """ - if isinstance(attr, ET.Element): - attr = attr.text - try: - attr = attr.upper() # type: ignore - match = Deserializer.valid_date.match(attr) - if not match: - raise ValueError("Invalid datetime string: " + attr) - - check_decimal = attr.split(".") - if len(check_decimal) > 1: - decimal_str = "" - for digit in check_decimal[1]: - if digit.isdigit(): - decimal_str += digit - else: - break - if len(decimal_str) > 6: - attr = attr.replace(decimal_str, decimal_str[0:6]) - - date_obj = isodate.parse_datetime(attr) - test_utc = date_obj.utctimetuple() - if test_utc.tm_year > 9999 or test_utc.tm_year < 1: - raise OverflowError("Hit max or min date") - except (ValueError, OverflowError, AttributeError) as err: - msg = "Cannot deserialize datetime object." - raise DeserializationError(msg) from err - return date_obj - - @staticmethod - def deserialize_unix(attr): - """Serialize Datetime object into IntTime format. - This is represented as seconds. - - :param int attr: Object to be serialized. - :return: Deserialized datetime - :rtype: Datetime - :raises DeserializationError: if format invalid - """ - if isinstance(attr, ET.Element): - attr = int(attr.text) # type: ignore - try: - attr = int(attr) - date_obj = datetime.datetime.fromtimestamp(attr, TZ_UTC) - except ValueError as err: - msg = "Cannot deserialize to unix datetime object." - raise DeserializationError(msg) from err - return date_obj diff --git a/src/fleet/azext_fleet/vendored_sdks/_version.py b/src/fleet/azext_fleet/vendored_sdks/_version.py deleted file mode 100644 index a78dee7e23c..00000000000 --- a/src/fleet/azext_fleet/vendored_sdks/_version.py +++ /dev/null @@ -1,9 +0,0 @@ -# coding=utf-8 -# -------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for license information. -# Code generated by Microsoft (R) AutoRest Code Generator. -# Changes may cause incorrect behavior and will be lost if the code is regenerated. -# -------------------------------------------------------------------------- - -VERSION = "3.3.0" diff --git a/src/fleet/azext_fleet/vendored_sdks/models.py b/src/fleet/azext_fleet/vendored_sdks/models.py deleted file mode 100644 index 950282c330a..00000000000 --- a/src/fleet/azext_fleet/vendored_sdks/models.py +++ /dev/null @@ -1,7 +0,0 @@ -# coding=utf-8 -# -------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See License.txt in the project root for -# license information. -# -------------------------------------------------------------------------- -from .v2026_02_01_preview.models import * diff --git a/src/fleet/azext_fleet/vendored_sdks/py.typed b/src/fleet/azext_fleet/vendored_sdks/py.typed deleted file mode 100644 index e5aff4f83af..00000000000 --- a/src/fleet/azext_fleet/vendored_sdks/py.typed +++ /dev/null @@ -1 +0,0 @@ -# Marker file for PEP 561. \ No newline at end of file From a8b13a6a391fabf6bff9d83ced6fb161f06fd466 Mon Sep 17 00:00:00 2001 From: frantran Date: Tue, 3 Mar 2026 14:22:05 -0800 Subject: [PATCH 2/5] copy over 2026-03-02-preview files, replace --- .../v2026_02_01_preview/_configuration.py | 19 +- .../_container_service_fleet_mgmt_client.py | 39 +- .../v2026_02_01_preview/_patch.py | 4 +- .../v2026_02_01_preview/_serialization.py | 2032 +++++++++++++++++ .../v2026_02_01_preview/aio/_configuration.py | 19 +- .../_container_service_fleet_mgmt_client.py | 41 +- .../v2026_02_01_preview/aio/_patch.py | 4 +- .../aio/operations/__init__.py | 2 + ...o_upgrade_profile_operations_operations.py | 12 +- .../_auto_upgrade_profiles_operations.py | 29 +- .../_cluster_mesh_profiles_operations.py | 729 ++++++ .../_fleet_managed_namespaces_operations.py | 34 +- .../operations/_fleet_members_operations.py | 34 +- .../_fleet_update_strategies_operations.py | 29 +- .../aio/operations/_fleets_operations.py | 46 +- .../aio/operations/_gates_operations.py | 24 +- .../aio/operations/_operations.py | 14 +- .../aio/operations/_patch.py | 4 +- .../aio/operations/_update_runs_operations.py | 44 +- .../v2026_02_01_preview/models/__init__.py | 22 + ...ntainer_service_fleet_mgmt_client_enums.py | 39 + .../v2026_02_01_preview/models/_models_py3.py | 414 +++- .../v2026_02_01_preview/models/_patch.py | 4 +- .../operations/__init__.py | 2 + ...o_upgrade_profile_operations_operations.py | 16 +- .../_auto_upgrade_profiles_operations.py | 39 +- .../_cluster_mesh_profiles_operations.py | 961 ++++++++ .../_fleet_managed_namespaces_operations.py | 46 +- .../operations/_fleet_members_operations.py | 46 +- .../_fleet_update_strategies_operations.py | 39 +- .../operations/_fleets_operations.py | 62 +- .../operations/_gates_operations.py | 32 +- .../operations/_operations.py | 18 +- .../v2026_02_01_preview/operations/_patch.py | 4 +- .../operations/_update_runs_operations.py | 60 +- 35 files changed, 4389 insertions(+), 574 deletions(-) create mode 100644 src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_serialization.py create mode 100644 src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_cluster_mesh_profiles_operations.py create mode 100644 src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_cluster_mesh_profiles_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_configuration.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_configuration.py index 5060446f3df..5b8c65814cf 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_configuration.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_configuration.py @@ -6,7 +6,7 @@ # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- -from typing import Any, Optional, TYPE_CHECKING +from typing import Any, TYPE_CHECKING from azure.core.pipeline import policies from azure.mgmt.core.policies import ARMChallengeAuthenticationPolicy, ARMHttpLoggingPolicy @@ -14,7 +14,6 @@ from ._version import VERSION if TYPE_CHECKING: - from azure.core import AzureClouds from azure.core.credentials import TokenCredential @@ -28,22 +27,13 @@ class ContainerServiceFleetMgmtClientConfiguration: # pylint: disable=too-many- :type credential: ~azure.core.credentials.TokenCredential :param subscription_id: The ID of the target subscription. The value must be an UUID. Required. :type subscription_id: str - :param cloud_setting: The cloud setting for which to get the ARM endpoint. Default value is - None. - :type cloud_setting: ~azure.core.AzureClouds - :keyword api_version: Api Version. Default value is "2026-02-01-preview". Note that overriding + :keyword api_version: Api Version. Default value is "2026-03-02-preview". Note that overriding this default value may result in unsupported behavior. :paramtype api_version: str """ - def __init__( - self, - credential: "TokenCredential", - subscription_id: str, - cloud_setting: Optional["AzureClouds"] = None, - **kwargs: Any - ) -> None: - api_version: str = kwargs.pop("api_version", "2026-02-01-preview") + def __init__(self, credential: "TokenCredential", subscription_id: str, **kwargs: Any) -> None: + api_version: str = kwargs.pop("api_version", "2026-03-02-preview") if credential is None: raise ValueError("Parameter 'credential' must not be None.") @@ -52,7 +42,6 @@ def __init__( self.credential = credential self.subscription_id = subscription_id - self.cloud_setting = cloud_setting self.api_version = api_version self.credential_scopes = kwargs.pop("credential_scopes", ["https://management.azure.com/.default"]) kwargs.setdefault("sdk_moniker", "mgmt-containerservicefleet/{}".format(VERSION)) diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_container_service_fleet_mgmt_client.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_container_service_fleet_mgmt_client.py index 1b53b07cce0..1095546e90e 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_container_service_fleet_mgmt_client.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_container_service_fleet_mgmt_client.py @@ -7,22 +7,21 @@ # -------------------------------------------------------------------------- from copy import deepcopy -from typing import Any, Optional, TYPE_CHECKING, cast +from typing import Any, TYPE_CHECKING from typing_extensions import Self from azure.core.pipeline import policies from azure.core.rest import HttpRequest, HttpResponse -from azure.core.settings import settings from azure.mgmt.core import ARMPipelineClient from azure.mgmt.core.policies import ARMAutoResourceProviderRegistrationPolicy -from azure.mgmt.core.tools import get_arm_endpoints from . import models as _models from ._configuration import ContainerServiceFleetMgmtClientConfiguration -from ._utils.serialization import Deserializer, Serializer +from ._serialization import Deserializer, Serializer from .operations import ( AutoUpgradeProfileOperationsOperations, AutoUpgradeProfilesOperations, + ClusterMeshProfilesOperations, FleetManagedNamespacesOperations, FleetMembersOperations, FleetUpdateStrategiesOperations, @@ -33,7 +32,6 @@ ) if TYPE_CHECKING: - from azure.core import AzureClouds from azure.core.credentials import TokenCredential @@ -50,6 +48,9 @@ class ContainerServiceFleetMgmtClient: # pylint: disable=too-many-instance-attr :ivar auto_upgrade_profile_operations: AutoUpgradeProfileOperationsOperations operations :vartype auto_upgrade_profile_operations: azure.mgmt.containerservicefleet.operations.AutoUpgradeProfileOperationsOperations + :ivar cluster_mesh_profiles: ClusterMeshProfilesOperations operations + :vartype cluster_mesh_profiles: + azure.mgmt.containerservicefleet.operations.ClusterMeshProfilesOperations :ivar gates: GatesOperations operations :vartype gates: azure.mgmt.containerservicefleet.operations.GatesOperations :ivar fleet_managed_namespaces: FleetManagedNamespacesOperations operations @@ -66,12 +67,9 @@ class ContainerServiceFleetMgmtClient: # pylint: disable=too-many-instance-attr :type credential: ~azure.core.credentials.TokenCredential :param subscription_id: The ID of the target subscription. The value must be an UUID. Required. :type subscription_id: str - :param base_url: Service URL. Default value is None. + :param base_url: Service URL. Default value is "https://management.azure.com". :type base_url: str - :keyword cloud_setting: The cloud setting for which to get the ARM endpoint. Default value is - None. - :paramtype cloud_setting: ~azure.core.AzureClouds - :keyword api_version: Api Version. Default value is "2026-02-01-preview". Note that overriding + :keyword api_version: Api Version. Default value is "2026-03-02-preview". Note that overriding this default value may result in unsupported behavior. :paramtype api_version: str :keyword int polling_interval: Default waiting time between two polls for LRO operations if no @@ -82,24 +80,12 @@ def __init__( self, credential: "TokenCredential", subscription_id: str, - base_url: Optional[str] = None, - *, - cloud_setting: Optional["AzureClouds"] = None, + base_url: str = "https://management.azure.com", **kwargs: Any ) -> None: - _cloud = cloud_setting or settings.current.azure_cloud # type: ignore - _endpoints = get_arm_endpoints(_cloud) - if not base_url: - base_url = _endpoints["resource_manager"] - credential_scopes = kwargs.pop("credential_scopes", _endpoints["credential_scopes"]) self._config = ContainerServiceFleetMgmtClientConfiguration( - credential=credential, - subscription_id=subscription_id, - cloud_setting=cloud_setting, - credential_scopes=credential_scopes, - **kwargs + credential=credential, subscription_id=subscription_id, **kwargs ) - _policies = kwargs.pop("policies", None) if _policies is None: _policies = [ @@ -118,7 +104,7 @@ def __init__( policies.SensitiveHeaderCleanupPolicy(**kwargs) if self._config.redirect_policy else None, self._config.http_logging_policy, ] - self._client: ARMPipelineClient = ARMPipelineClient(base_url=cast(str, base_url), policies=_policies, **kwargs) + self._client: ARMPipelineClient = ARMPipelineClient(base_url=base_url, policies=_policies, **kwargs) client_models = {k: v for k, v in _models.__dict__.items() if isinstance(v, type)} self._serialize = Serializer(client_models) @@ -132,6 +118,9 @@ def __init__( self.auto_upgrade_profile_operations = AutoUpgradeProfileOperationsOperations( self._client, self._config, self._serialize, self._deserialize ) + self.cluster_mesh_profiles = ClusterMeshProfilesOperations( + self._client, self._config, self._serialize, self._deserialize + ) self.gates = GatesOperations(self._client, self._config, self._serialize, self._deserialize) self.fleet_managed_namespaces = FleetManagedNamespacesOperations( self._client, self._config, self._serialize, self._deserialize diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_patch.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_patch.py index 87676c65a8f..8bcb627aa47 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_patch.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_patch.py @@ -7,9 +7,9 @@ Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python/customize """ +from typing import List - -__all__: list[str] = [] # Add all objects you want publicly available to users at this package level +__all__: List[str] = [] # Add all objects you want publicly available to users at this package level def patch_sdk(): diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_serialization.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_serialization.py new file mode 100644 index 00000000000..f5187701d7b --- /dev/null +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_serialization.py @@ -0,0 +1,2032 @@ +# pylint: disable=line-too-long,useless-suppression,too-many-lines +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- + +# pyright: reportUnnecessaryTypeIgnoreComment=false + +from base64 import b64decode, b64encode +import calendar +import datetime +import decimal +import email +from enum import Enum +import json +import logging +import re +import sys +import codecs +from typing import ( + Dict, + Any, + cast, + Optional, + Union, + AnyStr, + IO, + Mapping, + Callable, + MutableMapping, + List, +) + +try: + from urllib import quote # type: ignore +except ImportError: + from urllib.parse import quote +import xml.etree.ElementTree as ET + +import isodate # type: ignore +from typing_extensions import Self + +from azure.core.exceptions import DeserializationError, SerializationError +from azure.core.serialization import NULL as CoreNull + +_BOM = codecs.BOM_UTF8.decode(encoding="utf-8") + +JSON = MutableMapping[str, Any] + + +class RawDeserializer: + + # Accept "text" because we're open minded people... + JSON_REGEXP = re.compile(r"^(application|text)/([a-z+.]+\+)?json$") + + # Name used in context + CONTEXT_NAME = "deserialized_data" + + @classmethod + def deserialize_from_text(cls, data: Optional[Union[AnyStr, IO]], content_type: Optional[str] = None) -> Any: + """Decode data according to content-type. + + Accept a stream of data as well, but will be load at once in memory for now. + + If no content-type, will return the string version (not bytes, not stream) + + :param data: Input, could be bytes or stream (will be decoded with UTF8) or text + :type data: str or bytes or IO + :param str content_type: The content type. + :return: The deserialized data. + :rtype: object + """ + if hasattr(data, "read"): + # Assume a stream + data = cast(IO, data).read() + + if isinstance(data, bytes): + data_as_str = data.decode(encoding="utf-8-sig") + else: + # Explain to mypy the correct type. + data_as_str = cast(str, data) + + # Remove Byte Order Mark if present in string + data_as_str = data_as_str.lstrip(_BOM) + + if content_type is None: + return data + + if cls.JSON_REGEXP.match(content_type): + try: + return json.loads(data_as_str) + except ValueError as err: + raise DeserializationError("JSON is invalid: {}".format(err), err) from err + elif "xml" in (content_type or []): + try: + + try: + if isinstance(data, unicode): # type: ignore + # If I'm Python 2.7 and unicode XML will scream if I try a "fromstring" on unicode string + data_as_str = data_as_str.encode(encoding="utf-8") # type: ignore + except NameError: + pass + + return ET.fromstring(data_as_str) # nosec + except ET.ParseError as err: + # It might be because the server has an issue, and returned JSON with + # content-type XML.... + # So let's try a JSON load, and if it's still broken + # let's flow the initial exception + def _json_attemp(data): + try: + return True, json.loads(data) + except ValueError: + return False, None # Don't care about this one + + success, json_result = _json_attemp(data) + if success: + return json_result + # If i'm here, it's not JSON, it's not XML, let's scream + # and raise the last context in this block (the XML exception) + # The function hack is because Py2.7 messes up with exception + # context otherwise. + _LOGGER.critical("Wasn't XML not JSON, failing") + raise DeserializationError("XML is invalid") from err + elif content_type.startswith("text/"): + return data_as_str + raise DeserializationError("Cannot deserialize content-type: {}".format(content_type)) + + @classmethod + def deserialize_from_http_generics(cls, body_bytes: Optional[Union[AnyStr, IO]], headers: Mapping) -> Any: + """Deserialize from HTTP response. + + Use bytes and headers to NOT use any requests/aiohttp or whatever + specific implementation. + Headers will tested for "content-type" + + :param bytes body_bytes: The body of the response. + :param dict headers: The headers of the response. + :returns: The deserialized data. + :rtype: object + """ + # Try to use content-type from headers if available + content_type = None + if "content-type" in headers: + content_type = headers["content-type"].split(";")[0].strip().lower() + # Ouch, this server did not declare what it sent... + # Let's guess it's JSON... + # Also, since Autorest was considering that an empty body was a valid JSON, + # need that test as well.... + else: + content_type = "application/json" + + if body_bytes: + return cls.deserialize_from_text(body_bytes, content_type) + return None + + +_LOGGER = logging.getLogger(__name__) + +try: + _long_type = long # type: ignore +except NameError: + _long_type = int + +TZ_UTC = datetime.timezone.utc + +_FLATTEN = re.compile(r"(? None: + self.additional_properties: Optional[Dict[str, Any]] = {} + for k in kwargs: # pylint: disable=consider-using-dict-items + if k not in self._attribute_map: + _LOGGER.warning("%s is not a known attribute of class %s and will be ignored", k, self.__class__) + elif k in self._validation and self._validation[k].get("readonly", False): + _LOGGER.warning("Readonly attribute %s will be ignored in class %s", k, self.__class__) + else: + setattr(self, k, kwargs[k]) + + def __eq__(self, other: Any) -> bool: + """Compare objects by comparing all attributes. + + :param object other: The object to compare + :returns: True if objects are equal + :rtype: bool + """ + if isinstance(other, self.__class__): + return self.__dict__ == other.__dict__ + return False + + def __ne__(self, other: Any) -> bool: + """Compare objects by comparing all attributes. + + :param object other: The object to compare + :returns: True if objects are not equal + :rtype: bool + """ + return not self.__eq__(other) + + def __str__(self) -> str: + return str(self.__dict__) + + @classmethod + def enable_additional_properties_sending(cls) -> None: + cls._attribute_map["additional_properties"] = {"key": "", "type": "{object}"} + + @classmethod + def is_xml_model(cls) -> bool: + try: + cls._xml_map # type: ignore + except AttributeError: + return False + return True + + @classmethod + def _create_xml_node(cls): + """Create XML node. + + :returns: The XML node + :rtype: xml.etree.ElementTree.Element + """ + try: + xml_map = cls._xml_map # type: ignore + except AttributeError: + xml_map = {} + + return _create_xml_node(xml_map.get("name", cls.__name__), xml_map.get("prefix", None), xml_map.get("ns", None)) + + def serialize(self, keep_readonly: bool = False, **kwargs: Any) -> JSON: + """Return the JSON that would be sent to server from this model. + + This is an alias to `as_dict(full_restapi_key_transformer, keep_readonly=False)`. + + If you want XML serialization, you can pass the kwargs is_xml=True. + + :param bool keep_readonly: If you want to serialize the readonly attributes + :returns: A dict JSON compatible object + :rtype: dict + """ + serializer = Serializer(self._infer_class_models()) + return serializer._serialize( # type: ignore # pylint: disable=protected-access + self, keep_readonly=keep_readonly, **kwargs + ) + + def as_dict( + self, + keep_readonly: bool = True, + key_transformer: Callable[[str, Dict[str, Any], Any], Any] = attribute_transformer, + **kwargs: Any + ) -> JSON: + """Return a dict that can be serialized using json.dump. + + Advanced usage might optionally use a callback as parameter: + + .. code::python + + def my_key_transformer(key, attr_desc, value): + return key + + Key is the attribute name used in Python. Attr_desc + is a dict of metadata. Currently contains 'type' with the + msrest type and 'key' with the RestAPI encoded key. + Value is the current value in this object. + + The string returned will be used to serialize the key. + If the return type is a list, this is considered hierarchical + result dict. + + See the three examples in this file: + + - attribute_transformer + - full_restapi_key_transformer + - last_restapi_key_transformer + + If you want XML serialization, you can pass the kwargs is_xml=True. + + :param bool keep_readonly: If you want to serialize the readonly attributes + :param function key_transformer: A key transformer function. + :returns: A dict JSON compatible object + :rtype: dict + """ + serializer = Serializer(self._infer_class_models()) + return serializer._serialize( # type: ignore # pylint: disable=protected-access + self, key_transformer=key_transformer, keep_readonly=keep_readonly, **kwargs + ) + + @classmethod + def _infer_class_models(cls): + try: + str_models = cls.__module__.rsplit(".", 1)[0] + models = sys.modules[str_models] + client_models = {k: v for k, v in models.__dict__.items() if isinstance(v, type)} + if cls.__name__ not in client_models: + raise ValueError("Not Autorest generated code") + except Exception: # pylint: disable=broad-exception-caught + # Assume it's not Autorest generated (tests?). Add ourselves as dependencies. + client_models = {cls.__name__: cls} + return client_models + + @classmethod + def deserialize(cls, data: Any, content_type: Optional[str] = None) -> Self: + """Parse a str using the RestAPI syntax and return a model. + + :param str data: A str using RestAPI structure. JSON by default. + :param str content_type: JSON by default, set application/xml if XML. + :returns: An instance of this model + :raises DeserializationError: if something went wrong + :rtype: Self + """ + deserializer = Deserializer(cls._infer_class_models()) + return deserializer(cls.__name__, data, content_type=content_type) # type: ignore + + @classmethod + def from_dict( + cls, + data: Any, + key_extractors: Optional[Callable[[str, Dict[str, Any], Any], Any]] = None, + content_type: Optional[str] = None, + ) -> Self: + """Parse a dict using given key extractor return a model. + + By default consider key + extractors (rest_key_case_insensitive_extractor, attribute_key_case_insensitive_extractor + and last_rest_key_case_insensitive_extractor) + + :param dict data: A dict using RestAPI structure + :param function key_extractors: A key extractor function. + :param str content_type: JSON by default, set application/xml if XML. + :returns: An instance of this model + :raises DeserializationError: if something went wrong + :rtype: Self + """ + deserializer = Deserializer(cls._infer_class_models()) + deserializer.key_extractors = ( # type: ignore + [ # type: ignore + attribute_key_case_insensitive_extractor, + rest_key_case_insensitive_extractor, + last_rest_key_case_insensitive_extractor, + ] + if key_extractors is None + else key_extractors + ) + return deserializer(cls.__name__, data, content_type=content_type) # type: ignore + + @classmethod + def _flatten_subtype(cls, key, objects): + if "_subtype_map" not in cls.__dict__: + return {} + result = dict(cls._subtype_map[key]) + for valuetype in cls._subtype_map[key].values(): + result.update(objects[valuetype]._flatten_subtype(key, objects)) # pylint: disable=protected-access + return result + + @classmethod + def _classify(cls, response, objects): + """Check the class _subtype_map for any child classes. + We want to ignore any inherited _subtype_maps. + + :param dict response: The initial data + :param dict objects: The class objects + :returns: The class to be used + :rtype: class + """ + for subtype_key in cls.__dict__.get("_subtype_map", {}).keys(): + subtype_value = None + + if not isinstance(response, ET.Element): + rest_api_response_key = cls._get_rest_key_parts(subtype_key)[-1] + subtype_value = response.get(rest_api_response_key, None) or response.get(subtype_key, None) + else: + subtype_value = xml_key_extractor(subtype_key, cls._attribute_map[subtype_key], response) + if subtype_value: + # Try to match base class. Can be class name only + # (bug to fix in Autorest to support x-ms-discriminator-name) + if cls.__name__ == subtype_value: + return cls + flatten_mapping_type = cls._flatten_subtype(subtype_key, objects) + try: + return objects[flatten_mapping_type[subtype_value]] # type: ignore + except KeyError: + _LOGGER.warning( + "Subtype value %s has no mapping, use base class %s.", + subtype_value, + cls.__name__, + ) + break + else: + _LOGGER.warning("Discriminator %s is absent or null, use base class %s.", subtype_key, cls.__name__) + break + return cls + + @classmethod + def _get_rest_key_parts(cls, attr_key): + """Get the RestAPI key of this attr, split it and decode part + :param str attr_key: Attribute key must be in attribute_map. + :returns: A list of RestAPI part + :rtype: list + """ + rest_split_key = _FLATTEN.split(cls._attribute_map[attr_key]["key"]) + return [_decode_attribute_map_key(key_part) for key_part in rest_split_key] + + +def _decode_attribute_map_key(key): + """This decode a key in an _attribute_map to the actual key we want to look at + inside the received data. + + :param str key: A key string from the generated code + :returns: The decoded key + :rtype: str + """ + return key.replace("\\.", ".") + + +class Serializer: # pylint: disable=too-many-public-methods + """Request object model serializer.""" + + basic_types = {str: "str", int: "int", bool: "bool", float: "float"} + + _xml_basic_types_serializers = {"bool": lambda x: str(x).lower()} + days = {0: "Mon", 1: "Tue", 2: "Wed", 3: "Thu", 4: "Fri", 5: "Sat", 6: "Sun"} + months = { + 1: "Jan", + 2: "Feb", + 3: "Mar", + 4: "Apr", + 5: "May", + 6: "Jun", + 7: "Jul", + 8: "Aug", + 9: "Sep", + 10: "Oct", + 11: "Nov", + 12: "Dec", + } + validation = { + "min_length": lambda x, y: len(x) < y, + "max_length": lambda x, y: len(x) > y, + "minimum": lambda x, y: x < y, + "maximum": lambda x, y: x > y, + "minimum_ex": lambda x, y: x <= y, + "maximum_ex": lambda x, y: x >= y, + "min_items": lambda x, y: len(x) < y, + "max_items": lambda x, y: len(x) > y, + "pattern": lambda x, y: not re.match(y, x, re.UNICODE), + "unique": lambda x, y: len(x) != len(set(x)), + "multiple": lambda x, y: x % y != 0, + } + + def __init__(self, classes: Optional[Mapping[str, type]] = None) -> None: + self.serialize_type = { + "iso-8601": Serializer.serialize_iso, + "rfc-1123": Serializer.serialize_rfc, + "unix-time": Serializer.serialize_unix, + "duration": Serializer.serialize_duration, + "date": Serializer.serialize_date, + "time": Serializer.serialize_time, + "decimal": Serializer.serialize_decimal, + "long": Serializer.serialize_long, + "bytearray": Serializer.serialize_bytearray, + "base64": Serializer.serialize_base64, + "object": self.serialize_object, + "[]": self.serialize_iter, + "{}": self.serialize_dict, + } + self.dependencies: Dict[str, type] = dict(classes) if classes else {} + self.key_transformer = full_restapi_key_transformer + self.client_side_validation = True + + def _serialize( # pylint: disable=too-many-nested-blocks, too-many-branches, too-many-statements, too-many-locals + self, target_obj, data_type=None, **kwargs + ): + """Serialize data into a string according to type. + + :param object target_obj: The data to be serialized. + :param str data_type: The type to be serialized from. + :rtype: str, dict + :raises SerializationError: if serialization fails. + :returns: The serialized data. + """ + key_transformer = kwargs.get("key_transformer", self.key_transformer) + keep_readonly = kwargs.get("keep_readonly", False) + if target_obj is None: + return None + + attr_name = None + class_name = target_obj.__class__.__name__ + + if data_type: + return self.serialize_data(target_obj, data_type, **kwargs) + + if not hasattr(target_obj, "_attribute_map"): + data_type = type(target_obj).__name__ + if data_type in self.basic_types.values(): + return self.serialize_data(target_obj, data_type, **kwargs) + + # Force "is_xml" kwargs if we detect a XML model + try: + is_xml_model_serialization = kwargs["is_xml"] + except KeyError: + is_xml_model_serialization = kwargs.setdefault("is_xml", target_obj.is_xml_model()) + + serialized = {} + if is_xml_model_serialization: + serialized = target_obj._create_xml_node() # pylint: disable=protected-access + try: + attributes = target_obj._attribute_map # pylint: disable=protected-access + for attr, attr_desc in attributes.items(): + attr_name = attr + if not keep_readonly and target_obj._validation.get( # pylint: disable=protected-access + attr_name, {} + ).get("readonly", False): + continue + + if attr_name == "additional_properties" and attr_desc["key"] == "": + if target_obj.additional_properties is not None: + serialized.update(target_obj.additional_properties) + continue + try: + + orig_attr = getattr(target_obj, attr) + if is_xml_model_serialization: + pass # Don't provide "transformer" for XML for now. Keep "orig_attr" + else: # JSON + keys, orig_attr = key_transformer(attr, attr_desc.copy(), orig_attr) + keys = keys if isinstance(keys, list) else [keys] + + kwargs["serialization_ctxt"] = attr_desc + new_attr = self.serialize_data(orig_attr, attr_desc["type"], **kwargs) + + if is_xml_model_serialization: + xml_desc = attr_desc.get("xml", {}) + xml_name = xml_desc.get("name", attr_desc["key"]) + xml_prefix = xml_desc.get("prefix", None) + xml_ns = xml_desc.get("ns", None) + if xml_desc.get("attr", False): + if xml_ns: + ET.register_namespace(xml_prefix, xml_ns) + xml_name = "{{{}}}{}".format(xml_ns, xml_name) + serialized.set(xml_name, new_attr) # type: ignore + continue + if xml_desc.get("text", False): + serialized.text = new_attr # type: ignore + continue + if isinstance(new_attr, list): + serialized.extend(new_attr) # type: ignore + elif isinstance(new_attr, ET.Element): + # If the down XML has no XML/Name, + # we MUST replace the tag with the local tag. But keeping the namespaces. + if "name" not in getattr(orig_attr, "_xml_map", {}): + splitted_tag = new_attr.tag.split("}") + if len(splitted_tag) == 2: # Namespace + new_attr.tag = "}".join([splitted_tag[0], xml_name]) + else: + new_attr.tag = xml_name + serialized.append(new_attr) # type: ignore + else: # That's a basic type + # Integrate namespace if necessary + local_node = _create_xml_node(xml_name, xml_prefix, xml_ns) + local_node.text = str(new_attr) + serialized.append(local_node) # type: ignore + else: # JSON + for k in reversed(keys): # type: ignore + new_attr = {k: new_attr} + + _new_attr = new_attr + _serialized = serialized + for k in keys: # type: ignore + if k not in _serialized: + _serialized.update(_new_attr) # type: ignore + _new_attr = _new_attr[k] # type: ignore + _serialized = _serialized[k] + except ValueError as err: + if isinstance(err, SerializationError): + raise + + except (AttributeError, KeyError, TypeError) as err: + msg = "Attribute {} in object {} cannot be serialized.\n{}".format(attr_name, class_name, str(target_obj)) + raise SerializationError(msg) from err + return serialized + + def body(self, data, data_type, **kwargs): + """Serialize data intended for a request body. + + :param object data: The data to be serialized. + :param str data_type: The type to be serialized from. + :rtype: dict + :raises SerializationError: if serialization fails. + :raises ValueError: if data is None + :returns: The serialized request body + """ + + # Just in case this is a dict + internal_data_type_str = data_type.strip("[]{}") + internal_data_type = self.dependencies.get(internal_data_type_str, None) + try: + is_xml_model_serialization = kwargs["is_xml"] + except KeyError: + if internal_data_type and issubclass(internal_data_type, Model): + is_xml_model_serialization = kwargs.setdefault("is_xml", internal_data_type.is_xml_model()) + else: + is_xml_model_serialization = False + if internal_data_type and not isinstance(internal_data_type, Enum): + try: + deserializer = Deserializer(self.dependencies) + # Since it's on serialization, it's almost sure that format is not JSON REST + # We're not able to deal with additional properties for now. + deserializer.additional_properties_detection = False + if is_xml_model_serialization: + deserializer.key_extractors = [ # type: ignore + attribute_key_case_insensitive_extractor, + ] + else: + deserializer.key_extractors = [ + rest_key_case_insensitive_extractor, + attribute_key_case_insensitive_extractor, + last_rest_key_case_insensitive_extractor, + ] + data = deserializer._deserialize(data_type, data) # pylint: disable=protected-access + except DeserializationError as err: + raise SerializationError("Unable to build a model: " + str(err)) from err + + return self._serialize(data, data_type, **kwargs) + + def url(self, name, data, data_type, **kwargs): + """Serialize data intended for a URL path. + + :param str name: The name of the URL path parameter. + :param object data: The data to be serialized. + :param str data_type: The type to be serialized from. + :rtype: str + :returns: The serialized URL path + :raises TypeError: if serialization fails. + :raises ValueError: if data is None + """ + try: + output = self.serialize_data(data, data_type, **kwargs) + if data_type == "bool": + output = json.dumps(output) + + if kwargs.get("skip_quote") is True: + output = str(output) + output = output.replace("{", quote("{")).replace("}", quote("}")) + else: + output = quote(str(output), safe="") + except SerializationError as exc: + raise TypeError("{} must be type {}.".format(name, data_type)) from exc + return output + + def query(self, name, data, data_type, **kwargs): + """Serialize data intended for a URL query. + + :param str name: The name of the query parameter. + :param object data: The data to be serialized. + :param str data_type: The type to be serialized from. + :rtype: str, list + :raises TypeError: if serialization fails. + :raises ValueError: if data is None + :returns: The serialized query parameter + """ + try: + # Treat the list aside, since we don't want to encode the div separator + if data_type.startswith("["): + internal_data_type = data_type[1:-1] + do_quote = not kwargs.get("skip_quote", False) + return self.serialize_iter(data, internal_data_type, do_quote=do_quote, **kwargs) + + # Not a list, regular serialization + output = self.serialize_data(data, data_type, **kwargs) + if data_type == "bool": + output = json.dumps(output) + if kwargs.get("skip_quote") is True: + output = str(output) + else: + output = quote(str(output), safe="") + except SerializationError as exc: + raise TypeError("{} must be type {}.".format(name, data_type)) from exc + return str(output) + + def header(self, name, data, data_type, **kwargs): + """Serialize data intended for a request header. + + :param str name: The name of the header. + :param object data: The data to be serialized. + :param str data_type: The type to be serialized from. + :rtype: str + :raises TypeError: if serialization fails. + :raises ValueError: if data is None + :returns: The serialized header + """ + try: + if data_type in ["[str]"]: + data = ["" if d is None else d for d in data] + + output = self.serialize_data(data, data_type, **kwargs) + if data_type == "bool": + output = json.dumps(output) + except SerializationError as exc: + raise TypeError("{} must be type {}.".format(name, data_type)) from exc + return str(output) + + def serialize_data(self, data, data_type, **kwargs): + """Serialize generic data according to supplied data type. + + :param object data: The data to be serialized. + :param str data_type: The type to be serialized from. + :raises AttributeError: if required data is None. + :raises ValueError: if data is None + :raises SerializationError: if serialization fails. + :returns: The serialized data. + :rtype: str, int, float, bool, dict, list + """ + if data is None: + raise ValueError("No value for given attribute") + + try: + if data is CoreNull: + return None + if data_type in self.basic_types.values(): + return self.serialize_basic(data, data_type, **kwargs) + + if data_type in self.serialize_type: + return self.serialize_type[data_type](data, **kwargs) + + # If dependencies is empty, try with current data class + # It has to be a subclass of Enum anyway + enum_type = self.dependencies.get(data_type, data.__class__) + if issubclass(enum_type, Enum): + return Serializer.serialize_enum(data, enum_obj=enum_type) + + iter_type = data_type[0] + data_type[-1] + if iter_type in self.serialize_type: + return self.serialize_type[iter_type](data, data_type[1:-1], **kwargs) + + except (ValueError, TypeError) as err: + msg = "Unable to serialize value: {!r} as type: {!r}." + raise SerializationError(msg.format(data, data_type)) from err + return self._serialize(data, **kwargs) + + @classmethod + def _get_custom_serializers(cls, data_type, **kwargs): # pylint: disable=inconsistent-return-statements + custom_serializer = kwargs.get("basic_types_serializers", {}).get(data_type) + if custom_serializer: + return custom_serializer + if kwargs.get("is_xml", False): + return cls._xml_basic_types_serializers.get(data_type) + + @classmethod + def serialize_basic(cls, data, data_type, **kwargs): + """Serialize basic builting data type. + Serializes objects to str, int, float or bool. + + Possible kwargs: + - basic_types_serializers dict[str, callable] : If set, use the callable as serializer + - is_xml bool : If set, use xml_basic_types_serializers + + :param obj data: Object to be serialized. + :param str data_type: Type of object in the iterable. + :rtype: str, int, float, bool + :return: serialized object + """ + custom_serializer = cls._get_custom_serializers(data_type, **kwargs) + if custom_serializer: + return custom_serializer(data) + if data_type == "str": + return cls.serialize_unicode(data) + return eval(data_type)(data) # nosec # pylint: disable=eval-used + + @classmethod + def serialize_unicode(cls, data): + """Special handling for serializing unicode strings in Py2. + Encode to UTF-8 if unicode, otherwise handle as a str. + + :param str data: Object to be serialized. + :rtype: str + :return: serialized object + """ + try: # If I received an enum, return its value + return data.value + except AttributeError: + pass + + try: + if isinstance(data, unicode): # type: ignore + # Don't change it, JSON and XML ElementTree are totally able + # to serialize correctly u'' strings + return data + except NameError: + return str(data) + return str(data) + + def serialize_iter(self, data, iter_type, div=None, **kwargs): + """Serialize iterable. + + Supported kwargs: + - serialization_ctxt dict : The current entry of _attribute_map, or same format. + serialization_ctxt['type'] should be same as data_type. + - is_xml bool : If set, serialize as XML + + :param list data: Object to be serialized. + :param str iter_type: Type of object in the iterable. + :param str div: If set, this str will be used to combine the elements + in the iterable into a combined string. Default is 'None'. + Defaults to False. + :rtype: list, str + :return: serialized iterable + """ + if isinstance(data, str): + raise SerializationError("Refuse str type as a valid iter type.") + + serialization_ctxt = kwargs.get("serialization_ctxt", {}) + is_xml = kwargs.get("is_xml", False) + + serialized = [] + for d in data: + try: + serialized.append(self.serialize_data(d, iter_type, **kwargs)) + except ValueError as err: + if isinstance(err, SerializationError): + raise + serialized.append(None) + + if kwargs.get("do_quote", False): + serialized = ["" if s is None else quote(str(s), safe="") for s in serialized] + + if div: + serialized = ["" if s is None else str(s) for s in serialized] + serialized = div.join(serialized) + + if "xml" in serialization_ctxt or is_xml: + # XML serialization is more complicated + xml_desc = serialization_ctxt.get("xml", {}) + xml_name = xml_desc.get("name") + if not xml_name: + xml_name = serialization_ctxt["key"] + + # Create a wrap node if necessary (use the fact that Element and list have "append") + is_wrapped = xml_desc.get("wrapped", False) + node_name = xml_desc.get("itemsName", xml_name) + if is_wrapped: + final_result = _create_xml_node(xml_name, xml_desc.get("prefix", None), xml_desc.get("ns", None)) + else: + final_result = [] + # All list elements to "local_node" + for el in serialized: + if isinstance(el, ET.Element): + el_node = el + else: + el_node = _create_xml_node(node_name, xml_desc.get("prefix", None), xml_desc.get("ns", None)) + if el is not None: # Otherwise it writes "None" :-p + el_node.text = str(el) + final_result.append(el_node) + return final_result + return serialized + + def serialize_dict(self, attr, dict_type, **kwargs): + """Serialize a dictionary of objects. + + :param dict attr: Object to be serialized. + :param str dict_type: Type of object in the dictionary. + :rtype: dict + :return: serialized dictionary + """ + serialization_ctxt = kwargs.get("serialization_ctxt", {}) + serialized = {} + for key, value in attr.items(): + try: + serialized[self.serialize_unicode(key)] = self.serialize_data(value, dict_type, **kwargs) + except ValueError as err: + if isinstance(err, SerializationError): + raise + serialized[self.serialize_unicode(key)] = None + + if "xml" in serialization_ctxt: + # XML serialization is more complicated + xml_desc = serialization_ctxt["xml"] + xml_name = xml_desc["name"] + + final_result = _create_xml_node(xml_name, xml_desc.get("prefix", None), xml_desc.get("ns", None)) + for key, value in serialized.items(): + ET.SubElement(final_result, key).text = value + return final_result + + return serialized + + def serialize_object(self, attr, **kwargs): # pylint: disable=too-many-return-statements + """Serialize a generic object. + This will be handled as a dictionary. If object passed in is not + a basic type (str, int, float, dict, list) it will simply be + cast to str. + + :param dict attr: Object to be serialized. + :rtype: dict or str + :return: serialized object + """ + if attr is None: + return None + if isinstance(attr, ET.Element): + return attr + obj_type = type(attr) + if obj_type in self.basic_types: + return self.serialize_basic(attr, self.basic_types[obj_type], **kwargs) + if obj_type is _long_type: + return self.serialize_long(attr) + if obj_type is str: + return self.serialize_unicode(attr) + if obj_type is datetime.datetime: + return self.serialize_iso(attr) + if obj_type is datetime.date: + return self.serialize_date(attr) + if obj_type is datetime.time: + return self.serialize_time(attr) + if obj_type is datetime.timedelta: + return self.serialize_duration(attr) + if obj_type is decimal.Decimal: + return self.serialize_decimal(attr) + + # If it's a model or I know this dependency, serialize as a Model + if obj_type in self.dependencies.values() or isinstance(attr, Model): + return self._serialize(attr) + + if obj_type == dict: + serialized = {} + for key, value in attr.items(): + try: + serialized[self.serialize_unicode(key)] = self.serialize_object(value, **kwargs) + except ValueError: + serialized[self.serialize_unicode(key)] = None + return serialized + + if obj_type == list: + serialized = [] + for obj in attr: + try: + serialized.append(self.serialize_object(obj, **kwargs)) + except ValueError: + pass + return serialized + return str(attr) + + @staticmethod + def serialize_enum(attr, enum_obj=None): + try: + result = attr.value + except AttributeError: + result = attr + try: + enum_obj(result) # type: ignore + return result + except ValueError as exc: + for enum_value in enum_obj: # type: ignore + if enum_value.value.lower() == str(attr).lower(): + return enum_value.value + error = "{!r} is not valid value for enum {!r}" + raise SerializationError(error.format(attr, enum_obj)) from exc + + @staticmethod + def serialize_bytearray(attr, **kwargs): # pylint: disable=unused-argument + """Serialize bytearray into base-64 string. + + :param str attr: Object to be serialized. + :rtype: str + :return: serialized base64 + """ + return b64encode(attr).decode() + + @staticmethod + def serialize_base64(attr, **kwargs): # pylint: disable=unused-argument + """Serialize str into base-64 string. + + :param str attr: Object to be serialized. + :rtype: str + :return: serialized base64 + """ + encoded = b64encode(attr).decode("ascii") + return encoded.strip("=").replace("+", "-").replace("/", "_") + + @staticmethod + def serialize_decimal(attr, **kwargs): # pylint: disable=unused-argument + """Serialize Decimal object to float. + + :param decimal attr: Object to be serialized. + :rtype: float + :return: serialized decimal + """ + return float(attr) + + @staticmethod + def serialize_long(attr, **kwargs): # pylint: disable=unused-argument + """Serialize long (Py2) or int (Py3). + + :param int attr: Object to be serialized. + :rtype: int/long + :return: serialized long + """ + return _long_type(attr) + + @staticmethod + def serialize_date(attr, **kwargs): # pylint: disable=unused-argument + """Serialize Date object into ISO-8601 formatted string. + + :param Date attr: Object to be serialized. + :rtype: str + :return: serialized date + """ + if isinstance(attr, str): + attr = isodate.parse_date(attr) + t = "{:04}-{:02}-{:02}".format(attr.year, attr.month, attr.day) + return t + + @staticmethod + def serialize_time(attr, **kwargs): # pylint: disable=unused-argument + """Serialize Time object into ISO-8601 formatted string. + + :param datetime.time attr: Object to be serialized. + :rtype: str + :return: serialized time + """ + if isinstance(attr, str): + attr = isodate.parse_time(attr) + t = "{:02}:{:02}:{:02}".format(attr.hour, attr.minute, attr.second) + if attr.microsecond: + t += ".{:02}".format(attr.microsecond) + return t + + @staticmethod + def serialize_duration(attr, **kwargs): # pylint: disable=unused-argument + """Serialize TimeDelta object into ISO-8601 formatted string. + + :param TimeDelta attr: Object to be serialized. + :rtype: str + :return: serialized duration + """ + if isinstance(attr, str): + attr = isodate.parse_duration(attr) + return isodate.duration_isoformat(attr) + + @staticmethod + def serialize_rfc(attr, **kwargs): # pylint: disable=unused-argument + """Serialize Datetime object into RFC-1123 formatted string. + + :param Datetime attr: Object to be serialized. + :rtype: str + :raises TypeError: if format invalid. + :return: serialized rfc + """ + try: + if not attr.tzinfo: + _LOGGER.warning("Datetime with no tzinfo will be considered UTC.") + utc = attr.utctimetuple() + except AttributeError as exc: + raise TypeError("RFC1123 object must be valid Datetime object.") from exc + + return "{}, {:02} {} {:04} {:02}:{:02}:{:02} GMT".format( + Serializer.days[utc.tm_wday], + utc.tm_mday, + Serializer.months[utc.tm_mon], + utc.tm_year, + utc.tm_hour, + utc.tm_min, + utc.tm_sec, + ) + + @staticmethod + def serialize_iso(attr, **kwargs): # pylint: disable=unused-argument + """Serialize Datetime object into ISO-8601 formatted string. + + :param Datetime attr: Object to be serialized. + :rtype: str + :raises SerializationError: if format invalid. + :return: serialized iso + """ + if isinstance(attr, str): + attr = isodate.parse_datetime(attr) + try: + if not attr.tzinfo: + _LOGGER.warning("Datetime with no tzinfo will be considered UTC.") + utc = attr.utctimetuple() + if utc.tm_year > 9999 or utc.tm_year < 1: + raise OverflowError("Hit max or min date") + + microseconds = str(attr.microsecond).rjust(6, "0").rstrip("0").ljust(3, "0") + if microseconds: + microseconds = "." + microseconds + date = "{:04}-{:02}-{:02}T{:02}:{:02}:{:02}".format( + utc.tm_year, utc.tm_mon, utc.tm_mday, utc.tm_hour, utc.tm_min, utc.tm_sec + ) + return date + microseconds + "Z" + except (ValueError, OverflowError) as err: + msg = "Unable to serialize datetime object." + raise SerializationError(msg) from err + except AttributeError as err: + msg = "ISO-8601 object must be valid Datetime object." + raise TypeError(msg) from err + + @staticmethod + def serialize_unix(attr, **kwargs): # pylint: disable=unused-argument + """Serialize Datetime object into IntTime format. + This is represented as seconds. + + :param Datetime attr: Object to be serialized. + :rtype: int + :raises SerializationError: if format invalid + :return: serialied unix + """ + if isinstance(attr, int): + return attr + try: + if not attr.tzinfo: + _LOGGER.warning("Datetime with no tzinfo will be considered UTC.") + return int(calendar.timegm(attr.utctimetuple())) + except AttributeError as exc: + raise TypeError("Unix time object must be valid Datetime object.") from exc + + +def rest_key_extractor(attr, attr_desc, data): # pylint: disable=unused-argument + key = attr_desc["key"] + working_data = data + + while "." in key: + # Need the cast, as for some reasons "split" is typed as list[str | Any] + dict_keys = cast(List[str], _FLATTEN.split(key)) + if len(dict_keys) == 1: + key = _decode_attribute_map_key(dict_keys[0]) + break + working_key = _decode_attribute_map_key(dict_keys[0]) + working_data = working_data.get(working_key, data) + if working_data is None: + # If at any point while following flatten JSON path see None, it means + # that all properties under are None as well + return None + key = ".".join(dict_keys[1:]) + + return working_data.get(key) + + +def rest_key_case_insensitive_extractor( # pylint: disable=unused-argument, inconsistent-return-statements + attr, attr_desc, data +): + key = attr_desc["key"] + working_data = data + + while "." in key: + dict_keys = _FLATTEN.split(key) + if len(dict_keys) == 1: + key = _decode_attribute_map_key(dict_keys[0]) + break + working_key = _decode_attribute_map_key(dict_keys[0]) + working_data = attribute_key_case_insensitive_extractor(working_key, None, working_data) + if working_data is None: + # If at any point while following flatten JSON path see None, it means + # that all properties under are None as well + return None + key = ".".join(dict_keys[1:]) + + if working_data: + return attribute_key_case_insensitive_extractor(key, None, working_data) + + +def last_rest_key_extractor(attr, attr_desc, data): # pylint: disable=unused-argument + """Extract the attribute in "data" based on the last part of the JSON path key. + + :param str attr: The attribute to extract + :param dict attr_desc: The attribute description + :param dict data: The data to extract from + :rtype: object + :returns: The extracted attribute + """ + key = attr_desc["key"] + dict_keys = _FLATTEN.split(key) + return attribute_key_extractor(dict_keys[-1], None, data) + + +def last_rest_key_case_insensitive_extractor(attr, attr_desc, data): # pylint: disable=unused-argument + """Extract the attribute in "data" based on the last part of the JSON path key. + + This is the case insensitive version of "last_rest_key_extractor" + :param str attr: The attribute to extract + :param dict attr_desc: The attribute description + :param dict data: The data to extract from + :rtype: object + :returns: The extracted attribute + """ + key = attr_desc["key"] + dict_keys = _FLATTEN.split(key) + return attribute_key_case_insensitive_extractor(dict_keys[-1], None, data) + + +def attribute_key_extractor(attr, _, data): + return data.get(attr) + + +def attribute_key_case_insensitive_extractor(attr, _, data): + found_key = None + lower_attr = attr.lower() + for key in data: + if lower_attr == key.lower(): + found_key = key + break + + return data.get(found_key) + + +def _extract_name_from_internal_type(internal_type): + """Given an internal type XML description, extract correct XML name with namespace. + + :param dict internal_type: An model type + :rtype: tuple + :returns: A tuple XML name + namespace dict + """ + internal_type_xml_map = getattr(internal_type, "_xml_map", {}) + xml_name = internal_type_xml_map.get("name", internal_type.__name__) + xml_ns = internal_type_xml_map.get("ns", None) + if xml_ns: + xml_name = "{{{}}}{}".format(xml_ns, xml_name) + return xml_name + + +def xml_key_extractor(attr, attr_desc, data): # pylint: disable=unused-argument,too-many-return-statements + if isinstance(data, dict): + return None + + # Test if this model is XML ready first + if not isinstance(data, ET.Element): + return None + + xml_desc = attr_desc.get("xml", {}) + xml_name = xml_desc.get("name", attr_desc["key"]) + + # Look for a children + is_iter_type = attr_desc["type"].startswith("[") + is_wrapped = xml_desc.get("wrapped", False) + internal_type = attr_desc.get("internalType", None) + internal_type_xml_map = getattr(internal_type, "_xml_map", {}) + + # Integrate namespace if necessary + xml_ns = xml_desc.get("ns", internal_type_xml_map.get("ns", None)) + if xml_ns: + xml_name = "{{{}}}{}".format(xml_ns, xml_name) + + # If it's an attribute, that's simple + if xml_desc.get("attr", False): + return data.get(xml_name) + + # If it's x-ms-text, that's simple too + if xml_desc.get("text", False): + return data.text + + # Scenario where I take the local name: + # - Wrapped node + # - Internal type is an enum (considered basic types) + # - Internal type has no XML/Name node + if is_wrapped or (internal_type and (issubclass(internal_type, Enum) or "name" not in internal_type_xml_map)): + children = data.findall(xml_name) + # If internal type has a local name and it's not a list, I use that name + elif not is_iter_type and internal_type and "name" in internal_type_xml_map: + xml_name = _extract_name_from_internal_type(internal_type) + children = data.findall(xml_name) + # That's an array + else: + if internal_type: # Complex type, ignore itemsName and use the complex type name + items_name = _extract_name_from_internal_type(internal_type) + else: + items_name = xml_desc.get("itemsName", xml_name) + children = data.findall(items_name) + + if len(children) == 0: + if is_iter_type: + if is_wrapped: + return None # is_wrapped no node, we want None + return [] # not wrapped, assume empty list + return None # Assume it's not there, maybe an optional node. + + # If is_iter_type and not wrapped, return all found children + if is_iter_type: + if not is_wrapped: + return children + # Iter and wrapped, should have found one node only (the wrap one) + if len(children) != 1: + raise DeserializationError( + "Tried to deserialize an array not wrapped, and found several nodes '{}'. Maybe you should declare this array as wrapped?".format( + xml_name + ) + ) + return list(children[0]) # Might be empty list and that's ok. + + # Here it's not a itertype, we should have found one element only or empty + if len(children) > 1: + raise DeserializationError("Find several XML '{}' where it was not expected".format(xml_name)) + return children[0] + + +class Deserializer: + """Response object model deserializer. + + :param dict classes: Class type dictionary for deserializing complex types. + :ivar list key_extractors: Ordered list of extractors to be used by this deserializer. + """ + + basic_types = {str: "str", int: "int", bool: "bool", float: "float"} + + valid_date = re.compile(r"\d{4}[-]\d{2}[-]\d{2}T\d{2}:\d{2}:\d{2}\.?\d*Z?[-+]?[\d{2}]?:?[\d{2}]?") + + def __init__(self, classes: Optional[Mapping[str, type]] = None) -> None: + self.deserialize_type = { + "iso-8601": Deserializer.deserialize_iso, + "rfc-1123": Deserializer.deserialize_rfc, + "unix-time": Deserializer.deserialize_unix, + "duration": Deserializer.deserialize_duration, + "date": Deserializer.deserialize_date, + "time": Deserializer.deserialize_time, + "decimal": Deserializer.deserialize_decimal, + "long": Deserializer.deserialize_long, + "bytearray": Deserializer.deserialize_bytearray, + "base64": Deserializer.deserialize_base64, + "object": self.deserialize_object, + "[]": self.deserialize_iter, + "{}": self.deserialize_dict, + } + self.deserialize_expected_types = { + "duration": (isodate.Duration, datetime.timedelta), + "iso-8601": (datetime.datetime), + } + self.dependencies: Dict[str, type] = dict(classes) if classes else {} + self.key_extractors = [rest_key_extractor, xml_key_extractor] + # Additional properties only works if the "rest_key_extractor" is used to + # extract the keys. Making it to work whatever the key extractor is too much + # complicated, with no real scenario for now. + # So adding a flag to disable additional properties detection. This flag should be + # used if your expect the deserialization to NOT come from a JSON REST syntax. + # Otherwise, result are unexpected + self.additional_properties_detection = True + + def __call__(self, target_obj, response_data, content_type=None): + """Call the deserializer to process a REST response. + + :param str target_obj: Target data type to deserialize to. + :param requests.Response response_data: REST response object. + :param str content_type: Swagger "produces" if available. + :raises DeserializationError: if deserialization fails. + :return: Deserialized object. + :rtype: object + """ + data = self._unpack_content(response_data, content_type) + return self._deserialize(target_obj, data) + + def _deserialize(self, target_obj, data): # pylint: disable=inconsistent-return-statements + """Call the deserializer on a model. + + Data needs to be already deserialized as JSON or XML ElementTree + + :param str target_obj: Target data type to deserialize to. + :param object data: Object to deserialize. + :raises DeserializationError: if deserialization fails. + :return: Deserialized object. + :rtype: object + """ + # This is already a model, go recursive just in case + if hasattr(data, "_attribute_map"): + constants = [name for name, config in getattr(data, "_validation", {}).items() if config.get("constant")] + try: + for attr, mapconfig in data._attribute_map.items(): # pylint: disable=protected-access + if attr in constants: + continue + value = getattr(data, attr) + if value is None: + continue + local_type = mapconfig["type"] + internal_data_type = local_type.strip("[]{}") + if internal_data_type not in self.dependencies or isinstance(internal_data_type, Enum): + continue + setattr(data, attr, self._deserialize(local_type, value)) + return data + except AttributeError: + return + + response, class_name = self._classify_target(target_obj, data) + + if isinstance(response, str): + return self.deserialize_data(data, response) + if isinstance(response, type) and issubclass(response, Enum): + return self.deserialize_enum(data, response) + + if data is None or data is CoreNull: + return data + try: + attributes = response._attribute_map # type: ignore # pylint: disable=protected-access + d_attrs = {} + for attr, attr_desc in attributes.items(): + # Check empty string. If it's not empty, someone has a real "additionalProperties"... + if attr == "additional_properties" and attr_desc["key"] == "": + continue + raw_value = None + # Enhance attr_desc with some dynamic data + attr_desc = attr_desc.copy() # Do a copy, do not change the real one + internal_data_type = attr_desc["type"].strip("[]{}") + if internal_data_type in self.dependencies: + attr_desc["internalType"] = self.dependencies[internal_data_type] + + for key_extractor in self.key_extractors: + found_value = key_extractor(attr, attr_desc, data) + if found_value is not None: + if raw_value is not None and raw_value != found_value: + msg = ( + "Ignoring extracted value '%s' from %s for key '%s'" + " (duplicate extraction, follow extractors order)" + ) + _LOGGER.warning(msg, found_value, key_extractor, attr) + continue + raw_value = found_value + + value = self.deserialize_data(raw_value, attr_desc["type"]) + d_attrs[attr] = value + except (AttributeError, TypeError, KeyError) as err: + msg = "Unable to deserialize to object: " + class_name # type: ignore + raise DeserializationError(msg) from err + additional_properties = self._build_additional_properties(attributes, data) + return self._instantiate_model(response, d_attrs, additional_properties) + + def _build_additional_properties(self, attribute_map, data): + if not self.additional_properties_detection: + return None + if "additional_properties" in attribute_map and attribute_map.get("additional_properties", {}).get("key") != "": + # Check empty string. If it's not empty, someone has a real "additionalProperties" + return None + if isinstance(data, ET.Element): + data = {el.tag: el.text for el in data} + + known_keys = { + _decode_attribute_map_key(_FLATTEN.split(desc["key"])[0]) + for desc in attribute_map.values() + if desc["key"] != "" + } + present_keys = set(data.keys()) + missing_keys = present_keys - known_keys + return {key: data[key] for key in missing_keys} + + def _classify_target(self, target, data): + """Check to see whether the deserialization target object can + be classified into a subclass. + Once classification has been determined, initialize object. + + :param str target: The target object type to deserialize to. + :param str/dict data: The response data to deserialize. + :return: The classified target object and its class name. + :rtype: tuple + """ + if target is None: + return None, None + + if isinstance(target, str): + try: + target = self.dependencies[target] + except KeyError: + return target, target + + try: + target = target._classify(data, self.dependencies) # type: ignore # pylint: disable=protected-access + except AttributeError: + pass # Target is not a Model, no classify + return target, target.__class__.__name__ # type: ignore + + def failsafe_deserialize(self, target_obj, data, content_type=None): + """Ignores any errors encountered in deserialization, + and falls back to not deserializing the object. Recommended + for use in error deserialization, as we want to return the + HttpResponseError to users, and not have them deal with + a deserialization error. + + :param str target_obj: The target object type to deserialize to. + :param str/dict data: The response data to deserialize. + :param str content_type: Swagger "produces" if available. + :return: Deserialized object. + :rtype: object + """ + try: + return self(target_obj, data, content_type=content_type) + except: # pylint: disable=bare-except + _LOGGER.debug( + "Ran into a deserialization error. Ignoring since this is failsafe deserialization", exc_info=True + ) + return None + + @staticmethod + def _unpack_content(raw_data, content_type=None): + """Extract the correct structure for deserialization. + + If raw_data is a PipelineResponse, try to extract the result of RawDeserializer. + if we can't, raise. Your Pipeline should have a RawDeserializer. + + If not a pipeline response and raw_data is bytes or string, use content-type + to decode it. If no content-type, try JSON. + + If raw_data is something else, bypass all logic and return it directly. + + :param obj raw_data: Data to be processed. + :param str content_type: How to parse if raw_data is a string/bytes. + :raises JSONDecodeError: If JSON is requested and parsing is impossible. + :raises UnicodeDecodeError: If bytes is not UTF8 + :rtype: object + :return: Unpacked content. + """ + # Assume this is enough to detect a Pipeline Response without importing it + context = getattr(raw_data, "context", {}) + if context: + if RawDeserializer.CONTEXT_NAME in context: + return context[RawDeserializer.CONTEXT_NAME] + raise ValueError("This pipeline didn't have the RawDeserializer policy; can't deserialize") + + # Assume this is enough to recognize universal_http.ClientResponse without importing it + if hasattr(raw_data, "body"): + return RawDeserializer.deserialize_from_http_generics(raw_data.text(), raw_data.headers) + + # Assume this enough to recognize requests.Response without importing it. + if hasattr(raw_data, "_content_consumed"): + return RawDeserializer.deserialize_from_http_generics(raw_data.text, raw_data.headers) + + if isinstance(raw_data, (str, bytes)) or hasattr(raw_data, "read"): + return RawDeserializer.deserialize_from_text(raw_data, content_type) # type: ignore + return raw_data + + def _instantiate_model(self, response, attrs, additional_properties=None): + """Instantiate a response model passing in deserialized args. + + :param Response response: The response model class. + :param dict attrs: The deserialized response attributes. + :param dict additional_properties: Additional properties to be set. + :rtype: Response + :return: The instantiated response model. + """ + if callable(response): + subtype = getattr(response, "_subtype_map", {}) + try: + readonly = [ + k + for k, v in response._validation.items() # pylint: disable=protected-access # type: ignore + if v.get("readonly") + ] + const = [ + k + for k, v in response._validation.items() # pylint: disable=protected-access # type: ignore + if v.get("constant") + ] + kwargs = {k: v for k, v in attrs.items() if k not in subtype and k not in readonly + const} + response_obj = response(**kwargs) + for attr in readonly: + setattr(response_obj, attr, attrs.get(attr)) + if additional_properties: + response_obj.additional_properties = additional_properties # type: ignore + return response_obj + except TypeError as err: + msg = "Unable to deserialize {} into model {}. ".format(kwargs, response) # type: ignore + raise DeserializationError(msg + str(err)) from err + else: + try: + for attr, value in attrs.items(): + setattr(response, attr, value) + return response + except Exception as exp: + msg = "Unable to populate response model. " + msg += "Type: {}, Error: {}".format(type(response), exp) + raise DeserializationError(msg) from exp + + def deserialize_data(self, data, data_type): # pylint: disable=too-many-return-statements + """Process data for deserialization according to data type. + + :param str data: The response string to be deserialized. + :param str data_type: The type to deserialize to. + :raises DeserializationError: if deserialization fails. + :return: Deserialized object. + :rtype: object + """ + if data is None: + return data + + try: + if not data_type: + return data + if data_type in self.basic_types.values(): + return self.deserialize_basic(data, data_type) + if data_type in self.deserialize_type: + if isinstance(data, self.deserialize_expected_types.get(data_type, tuple())): + return data + + is_a_text_parsing_type = lambda x: x not in [ # pylint: disable=unnecessary-lambda-assignment + "object", + "[]", + r"{}", + ] + if isinstance(data, ET.Element) and is_a_text_parsing_type(data_type) and not data.text: + return None + data_val = self.deserialize_type[data_type](data) + return data_val + + iter_type = data_type[0] + data_type[-1] + if iter_type in self.deserialize_type: + return self.deserialize_type[iter_type](data, data_type[1:-1]) + + obj_type = self.dependencies[data_type] + if issubclass(obj_type, Enum): + if isinstance(data, ET.Element): + data = data.text + return self.deserialize_enum(data, obj_type) + + except (ValueError, TypeError, AttributeError) as err: + msg = "Unable to deserialize response data." + msg += " Data: {}, {}".format(data, data_type) + raise DeserializationError(msg) from err + return self._deserialize(obj_type, data) + + def deserialize_iter(self, attr, iter_type): + """Deserialize an iterable. + + :param list attr: Iterable to be deserialized. + :param str iter_type: The type of object in the iterable. + :return: Deserialized iterable. + :rtype: list + """ + if attr is None: + return None + if isinstance(attr, ET.Element): # If I receive an element here, get the children + attr = list(attr) + if not isinstance(attr, (list, set)): + raise DeserializationError("Cannot deserialize as [{}] an object of type {}".format(iter_type, type(attr))) + return [self.deserialize_data(a, iter_type) for a in attr] + + def deserialize_dict(self, attr, dict_type): + """Deserialize a dictionary. + + :param dict/list attr: Dictionary to be deserialized. Also accepts + a list of key, value pairs. + :param str dict_type: The object type of the items in the dictionary. + :return: Deserialized dictionary. + :rtype: dict + """ + if isinstance(attr, list): + return {x["key"]: self.deserialize_data(x["value"], dict_type) for x in attr} + + if isinstance(attr, ET.Element): + # Transform value into {"Key": "value"} + attr = {el.tag: el.text for el in attr} + return {k: self.deserialize_data(v, dict_type) for k, v in attr.items()} + + def deserialize_object(self, attr, **kwargs): # pylint: disable=too-many-return-statements + """Deserialize a generic object. + This will be handled as a dictionary. + + :param dict attr: Dictionary to be deserialized. + :return: Deserialized object. + :rtype: dict + :raises TypeError: if non-builtin datatype encountered. + """ + if attr is None: + return None + if isinstance(attr, ET.Element): + # Do no recurse on XML, just return the tree as-is + return attr + if isinstance(attr, str): + return self.deserialize_basic(attr, "str") + obj_type = type(attr) + if obj_type in self.basic_types: + return self.deserialize_basic(attr, self.basic_types[obj_type]) + if obj_type is _long_type: + return self.deserialize_long(attr) + + if obj_type == dict: + deserialized = {} + for key, value in attr.items(): + try: + deserialized[key] = self.deserialize_object(value, **kwargs) + except ValueError: + deserialized[key] = None + return deserialized + + if obj_type == list: + deserialized = [] + for obj in attr: + try: + deserialized.append(self.deserialize_object(obj, **kwargs)) + except ValueError: + pass + return deserialized + + error = "Cannot deserialize generic object with type: " + raise TypeError(error + str(obj_type)) + + def deserialize_basic(self, attr, data_type): # pylint: disable=too-many-return-statements + """Deserialize basic builtin data type from string. + Will attempt to convert to str, int, float and bool. + This function will also accept '1', '0', 'true' and 'false' as + valid bool values. + + :param str attr: response string to be deserialized. + :param str data_type: deserialization data type. + :return: Deserialized basic type. + :rtype: str, int, float or bool + :raises TypeError: if string format is not valid. + """ + # If we're here, data is supposed to be a basic type. + # If it's still an XML node, take the text + if isinstance(attr, ET.Element): + attr = attr.text + if not attr: + if data_type == "str": + # None or '', node is empty string. + return "" + # None or '', node with a strong type is None. + # Don't try to model "empty bool" or "empty int" + return None + + if data_type == "bool": + if attr in [True, False, 1, 0]: + return bool(attr) + if isinstance(attr, str): + if attr.lower() in ["true", "1"]: + return True + if attr.lower() in ["false", "0"]: + return False + raise TypeError("Invalid boolean value: {}".format(attr)) + + if data_type == "str": + return self.deserialize_unicode(attr) + return eval(data_type)(attr) # nosec # pylint: disable=eval-used + + @staticmethod + def deserialize_unicode(data): + """Preserve unicode objects in Python 2, otherwise return data + as a string. + + :param str data: response string to be deserialized. + :return: Deserialized string. + :rtype: str or unicode + """ + # We might be here because we have an enum modeled as string, + # and we try to deserialize a partial dict with enum inside + if isinstance(data, Enum): + return data + + # Consider this is real string + try: + if isinstance(data, unicode): # type: ignore + return data + except NameError: + return str(data) + return str(data) + + @staticmethod + def deserialize_enum(data, enum_obj): + """Deserialize string into enum object. + + If the string is not a valid enum value it will be returned as-is + and a warning will be logged. + + :param str data: Response string to be deserialized. If this value is + None or invalid it will be returned as-is. + :param Enum enum_obj: Enum object to deserialize to. + :return: Deserialized enum object. + :rtype: Enum + """ + if isinstance(data, enum_obj) or data is None: + return data + if isinstance(data, Enum): + data = data.value + if isinstance(data, int): + # Workaround. We might consider remove it in the future. + try: + return list(enum_obj.__members__.values())[data] + except IndexError as exc: + error = "{!r} is not a valid index for enum {!r}" + raise DeserializationError(error.format(data, enum_obj)) from exc + try: + return enum_obj(str(data)) + except ValueError: + for enum_value in enum_obj: + if enum_value.value.lower() == str(data).lower(): + return enum_value + # We don't fail anymore for unknown value, we deserialize as a string + _LOGGER.warning("Deserializer is not able to find %s as valid enum in %s", data, enum_obj) + return Deserializer.deserialize_unicode(data) + + @staticmethod + def deserialize_bytearray(attr): + """Deserialize string into bytearray. + + :param str attr: response string to be deserialized. + :return: Deserialized bytearray + :rtype: bytearray + :raises TypeError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + return bytearray(b64decode(attr)) # type: ignore + + @staticmethod + def deserialize_base64(attr): + """Deserialize base64 encoded string into string. + + :param str attr: response string to be deserialized. + :return: Deserialized base64 string + :rtype: bytearray + :raises TypeError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + padding = "=" * (3 - (len(attr) + 3) % 4) # type: ignore + attr = attr + padding # type: ignore + encoded = attr.replace("-", "+").replace("_", "/") + return b64decode(encoded) + + @staticmethod + def deserialize_decimal(attr): + """Deserialize string into Decimal object. + + :param str attr: response string to be deserialized. + :return: Deserialized decimal + :raises DeserializationError: if string format invalid. + :rtype: decimal + """ + if isinstance(attr, ET.Element): + attr = attr.text + try: + return decimal.Decimal(str(attr)) # type: ignore + except decimal.DecimalException as err: + msg = "Invalid decimal {}".format(attr) + raise DeserializationError(msg) from err + + @staticmethod + def deserialize_long(attr): + """Deserialize string into long (Py2) or int (Py3). + + :param str attr: response string to be deserialized. + :return: Deserialized int + :rtype: long or int + :raises ValueError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + return _long_type(attr) # type: ignore + + @staticmethod + def deserialize_duration(attr): + """Deserialize ISO-8601 formatted string into TimeDelta object. + + :param str attr: response string to be deserialized. + :return: Deserialized duration + :rtype: TimeDelta + :raises DeserializationError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + try: + duration = isodate.parse_duration(attr) + except (ValueError, OverflowError, AttributeError) as err: + msg = "Cannot deserialize duration object." + raise DeserializationError(msg) from err + return duration + + @staticmethod + def deserialize_date(attr): + """Deserialize ISO-8601 formatted string into Date object. + + :param str attr: response string to be deserialized. + :return: Deserialized date + :rtype: Date + :raises DeserializationError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + if re.search(r"[^\W\d_]", attr, re.I + re.U): # type: ignore + raise DeserializationError("Date must have only digits and -. Received: %s" % attr) + # This must NOT use defaultmonth/defaultday. Using None ensure this raises an exception. + return isodate.parse_date(attr, defaultmonth=0, defaultday=0) + + @staticmethod + def deserialize_time(attr): + """Deserialize ISO-8601 formatted string into time object. + + :param str attr: response string to be deserialized. + :return: Deserialized time + :rtype: datetime.time + :raises DeserializationError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + if re.search(r"[^\W\d_]", attr, re.I + re.U): # type: ignore + raise DeserializationError("Date must have only digits and -. Received: %s" % attr) + return isodate.parse_time(attr) + + @staticmethod + def deserialize_rfc(attr): + """Deserialize RFC-1123 formatted string into Datetime object. + + :param str attr: response string to be deserialized. + :return: Deserialized RFC datetime + :rtype: Datetime + :raises DeserializationError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + try: + parsed_date = email.utils.parsedate_tz(attr) # type: ignore + date_obj = datetime.datetime( + *parsed_date[:6], tzinfo=datetime.timezone(datetime.timedelta(minutes=(parsed_date[9] or 0) / 60)) + ) + if not date_obj.tzinfo: + date_obj = date_obj.astimezone(tz=TZ_UTC) + except ValueError as err: + msg = "Cannot deserialize to rfc datetime object." + raise DeserializationError(msg) from err + return date_obj + + @staticmethod + def deserialize_iso(attr): + """Deserialize ISO-8601 formatted string into Datetime object. + + :param str attr: response string to be deserialized. + :return: Deserialized ISO datetime + :rtype: Datetime + :raises DeserializationError: if string format invalid. + """ + if isinstance(attr, ET.Element): + attr = attr.text + try: + attr = attr.upper() # type: ignore + match = Deserializer.valid_date.match(attr) + if not match: + raise ValueError("Invalid datetime string: " + attr) + + check_decimal = attr.split(".") + if len(check_decimal) > 1: + decimal_str = "" + for digit in check_decimal[1]: + if digit.isdigit(): + decimal_str += digit + else: + break + if len(decimal_str) > 6: + attr = attr.replace(decimal_str, decimal_str[0:6]) + + date_obj = isodate.parse_datetime(attr) + test_utc = date_obj.utctimetuple() + if test_utc.tm_year > 9999 or test_utc.tm_year < 1: + raise OverflowError("Hit max or min date") + except (ValueError, OverflowError, AttributeError) as err: + msg = "Cannot deserialize datetime object." + raise DeserializationError(msg) from err + return date_obj + + @staticmethod + def deserialize_unix(attr): + """Serialize Datetime object into IntTime format. + This is represented as seconds. + + :param int attr: Object to be serialized. + :return: Deserialized datetime + :rtype: Datetime + :raises DeserializationError: if format invalid + """ + if isinstance(attr, ET.Element): + attr = int(attr.text) # type: ignore + try: + attr = int(attr) + date_obj = datetime.datetime.fromtimestamp(attr, TZ_UTC) + except ValueError as err: + msg = "Cannot deserialize to unix datetime object." + raise DeserializationError(msg) from err + return date_obj diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_configuration.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_configuration.py index e30ca21d340..897d5b1f13a 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_configuration.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_configuration.py @@ -6,7 +6,7 @@ # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- -from typing import Any, Optional, TYPE_CHECKING +from typing import Any, TYPE_CHECKING from azure.core.pipeline import policies from azure.mgmt.core.policies import ARMHttpLoggingPolicy, AsyncARMChallengeAuthenticationPolicy @@ -14,7 +14,6 @@ from .._version import VERSION if TYPE_CHECKING: - from azure.core import AzureClouds from azure.core.credentials_async import AsyncTokenCredential @@ -28,22 +27,13 @@ class ContainerServiceFleetMgmtClientConfiguration: # pylint: disable=too-many- :type credential: ~azure.core.credentials_async.AsyncTokenCredential :param subscription_id: The ID of the target subscription. The value must be an UUID. Required. :type subscription_id: str - :param cloud_setting: The cloud setting for which to get the ARM endpoint. Default value is - None. - :type cloud_setting: ~azure.core.AzureClouds - :keyword api_version: Api Version. Default value is "2026-02-01-preview". Note that overriding + :keyword api_version: Api Version. Default value is "2026-03-02-preview". Note that overriding this default value may result in unsupported behavior. :paramtype api_version: str """ - def __init__( - self, - credential: "AsyncTokenCredential", - subscription_id: str, - cloud_setting: Optional["AzureClouds"] = None, - **kwargs: Any - ) -> None: - api_version: str = kwargs.pop("api_version", "2026-02-01-preview") + def __init__(self, credential: "AsyncTokenCredential", subscription_id: str, **kwargs: Any) -> None: + api_version: str = kwargs.pop("api_version", "2026-03-02-preview") if credential is None: raise ValueError("Parameter 'credential' must not be None.") @@ -52,7 +42,6 @@ def __init__( self.credential = credential self.subscription_id = subscription_id - self.cloud_setting = cloud_setting self.api_version = api_version self.credential_scopes = kwargs.pop("credential_scopes", ["https://management.azure.com/.default"]) kwargs.setdefault("sdk_moniker", "mgmt-containerservicefleet/{}".format(VERSION)) diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_container_service_fleet_mgmt_client.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_container_service_fleet_mgmt_client.py index 4129b046d3f..63e8099310c 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_container_service_fleet_mgmt_client.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_container_service_fleet_mgmt_client.py @@ -7,22 +7,21 @@ # -------------------------------------------------------------------------- from copy import deepcopy -from typing import Any, Awaitable, Optional, TYPE_CHECKING, cast +from typing import Any, Awaitable, TYPE_CHECKING from typing_extensions import Self from azure.core.pipeline import policies from azure.core.rest import AsyncHttpResponse, HttpRequest -from azure.core.settings import settings from azure.mgmt.core import AsyncARMPipelineClient from azure.mgmt.core.policies import AsyncARMAutoResourceProviderRegistrationPolicy -from azure.mgmt.core.tools import get_arm_endpoints from .. import models as _models -from .._utils.serialization import Deserializer, Serializer +from .._serialization import Deserializer, Serializer from ._configuration import ContainerServiceFleetMgmtClientConfiguration from .operations import ( AutoUpgradeProfileOperationsOperations, AutoUpgradeProfilesOperations, + ClusterMeshProfilesOperations, FleetManagedNamespacesOperations, FleetMembersOperations, FleetUpdateStrategiesOperations, @@ -33,7 +32,6 @@ ) if TYPE_CHECKING: - from azure.core import AzureClouds from azure.core.credentials_async import AsyncTokenCredential @@ -50,6 +48,9 @@ class ContainerServiceFleetMgmtClient: # pylint: disable=too-many-instance-attr :ivar auto_upgrade_profile_operations: AutoUpgradeProfileOperationsOperations operations :vartype auto_upgrade_profile_operations: azure.mgmt.containerservicefleet.aio.operations.AutoUpgradeProfileOperationsOperations + :ivar cluster_mesh_profiles: ClusterMeshProfilesOperations operations + :vartype cluster_mesh_profiles: + azure.mgmt.containerservicefleet.aio.operations.ClusterMeshProfilesOperations :ivar gates: GatesOperations operations :vartype gates: azure.mgmt.containerservicefleet.aio.operations.GatesOperations :ivar fleet_managed_namespaces: FleetManagedNamespacesOperations operations @@ -66,12 +67,9 @@ class ContainerServiceFleetMgmtClient: # pylint: disable=too-many-instance-attr :type credential: ~azure.core.credentials_async.AsyncTokenCredential :param subscription_id: The ID of the target subscription. The value must be an UUID. Required. :type subscription_id: str - :param base_url: Service URL. Default value is None. + :param base_url: Service URL. Default value is "https://management.azure.com". :type base_url: str - :keyword cloud_setting: The cloud setting for which to get the ARM endpoint. Default value is - None. - :paramtype cloud_setting: ~azure.core.AzureClouds - :keyword api_version: Api Version. Default value is "2026-02-01-preview". Note that overriding + :keyword api_version: Api Version. Default value is "2026-03-02-preview". Note that overriding this default value may result in unsupported behavior. :paramtype api_version: str :keyword int polling_interval: Default waiting time between two polls for LRO operations if no @@ -82,24 +80,12 @@ def __init__( self, credential: "AsyncTokenCredential", subscription_id: str, - base_url: Optional[str] = None, - *, - cloud_setting: Optional["AzureClouds"] = None, + base_url: str = "https://management.azure.com", **kwargs: Any ) -> None: - _cloud = cloud_setting or settings.current.azure_cloud # type: ignore - _endpoints = get_arm_endpoints(_cloud) - if not base_url: - base_url = _endpoints["resource_manager"] - credential_scopes = kwargs.pop("credential_scopes", _endpoints["credential_scopes"]) self._config = ContainerServiceFleetMgmtClientConfiguration( - credential=credential, - subscription_id=subscription_id, - cloud_setting=cloud_setting, - credential_scopes=credential_scopes, - **kwargs + credential=credential, subscription_id=subscription_id, **kwargs ) - _policies = kwargs.pop("policies", None) if _policies is None: _policies = [ @@ -118,9 +104,7 @@ def __init__( policies.SensitiveHeaderCleanupPolicy(**kwargs) if self._config.redirect_policy else None, self._config.http_logging_policy, ] - self._client: AsyncARMPipelineClient = AsyncARMPipelineClient( - base_url=cast(str, base_url), policies=_policies, **kwargs - ) + self._client: AsyncARMPipelineClient = AsyncARMPipelineClient(base_url=base_url, policies=_policies, **kwargs) client_models = {k: v for k, v in _models.__dict__.items() if isinstance(v, type)} self._serialize = Serializer(client_models) @@ -134,6 +118,9 @@ def __init__( self.auto_upgrade_profile_operations = AutoUpgradeProfileOperationsOperations( self._client, self._config, self._serialize, self._deserialize ) + self.cluster_mesh_profiles = ClusterMeshProfilesOperations( + self._client, self._config, self._serialize, self._deserialize + ) self.gates = GatesOperations(self._client, self._config, self._serialize, self._deserialize) self.fleet_managed_namespaces = FleetManagedNamespacesOperations( self._client, self._config, self._serialize, self._deserialize diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_patch.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_patch.py index 87676c65a8f..8bcb627aa47 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_patch.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_patch.py @@ -7,9 +7,9 @@ Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python/customize """ +from typing import List - -__all__: list[str] = [] # Add all objects you want publicly available to users at this package level +__all__: List[str] = [] # Add all objects you want publicly available to users at this package level def patch_sdk(): diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/__init__.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/__init__.py index 8b7809a8595..557bb51eb14 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/__init__.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/__init__.py @@ -16,6 +16,7 @@ from ._fleets_operations import FleetsOperations # type: ignore from ._auto_upgrade_profiles_operations import AutoUpgradeProfilesOperations # type: ignore from ._auto_upgrade_profile_operations_operations import AutoUpgradeProfileOperationsOperations # type: ignore +from ._cluster_mesh_profiles_operations import ClusterMeshProfilesOperations # type: ignore from ._gates_operations import GatesOperations # type: ignore from ._fleet_managed_namespaces_operations import FleetManagedNamespacesOperations # type: ignore from ._fleet_members_operations import FleetMembersOperations # type: ignore @@ -31,6 +32,7 @@ "FleetsOperations", "AutoUpgradeProfilesOperations", "AutoUpgradeProfileOperationsOperations", + "ClusterMeshProfilesOperations", "GatesOperations", "FleetManagedNamespacesOperations", "FleetMembersOperations", diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_auto_upgrade_profile_operations_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_auto_upgrade_profile_operations_operations.py index 4605deb6cb7..4cabf499a85 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_auto_upgrade_profile_operations_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_auto_upgrade_profile_operations_operations.py @@ -6,7 +6,7 @@ # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- from collections.abc import MutableMapping -from typing import Any, AsyncIterator, Callable, Optional, TypeVar, Union, cast +from typing import Any, AsyncIterator, Callable, Dict, Optional, TypeVar, Union, cast from azure.core import AsyncPipelineClient from azure.core.exceptions import ( @@ -28,13 +28,12 @@ from azure.mgmt.core.polling.async_arm_polling import AsyncARMPolling from ... import models as _models -from ..._utils.serialization import Deserializer, Serializer +from ..._serialization import Deserializer, Serializer from ...operations._auto_upgrade_profile_operations_operations import build_generate_update_run_request from .._configuration import ContainerServiceFleetMgmtClientConfiguration T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, Dict[str, Any]], Any]] class AutoUpgradeProfileOperationsOperations: @@ -100,10 +99,7 @@ async def _generate_update_run_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_auto_upgrade_profiles_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_auto_upgrade_profiles_operations.py index 036ade0533b..c9ad54d0492 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_auto_upgrade_profiles_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_auto_upgrade_profiles_operations.py @@ -7,7 +7,7 @@ # -------------------------------------------------------------------------- from collections.abc import MutableMapping from io import IOBase -from typing import Any, AsyncIterator, Callable, IO, Optional, TypeVar, Union, cast, overload +from typing import Any, AsyncIterable, AsyncIterator, Callable, Dict, IO, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import AsyncPipelineClient @@ -32,7 +32,7 @@ from azure.mgmt.core.polling.async_arm_polling import AsyncARMPolling from ... import models as _models -from ..._utils.serialization import Deserializer, Serializer +from ..._serialization import Deserializer, Serializer from ...operations._auto_upgrade_profiles_operations import ( build_create_or_update_request, build_delete_request, @@ -42,8 +42,7 @@ from .._configuration import ContainerServiceFleetMgmtClientConfiguration T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, Dict[str, Any]], Any]] class AutoUpgradeProfilesOperations: @@ -75,7 +74,7 @@ def list_by_fleet( top: Optional[int] = None, skip_token: Optional[str] = None, **kwargs: Any - ) -> AsyncItemPaged["_models.AutoUpgradeProfile"]: + ) -> AsyncIterable["_models.AutoUpgradeProfile"]: """List AutoUpgradeProfile resources by Fleet. :param resource_group_name: The name of the resource group. The name is case insensitive. @@ -157,10 +156,7 @@ async def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -218,10 +214,7 @@ async def get( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("AutoUpgradeProfile", pipeline_response.http_response) @@ -294,10 +287,7 @@ async def _create_or_update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -530,10 +520,7 @@ async def _delete_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_cluster_mesh_profiles_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_cluster_mesh_profiles_operations.py new file mode 100644 index 00000000000..4a518b33d86 --- /dev/null +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_cluster_mesh_profiles_operations.py @@ -0,0 +1,729 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +from collections.abc import MutableMapping +from io import IOBase +from typing import Any, AsyncIterable, AsyncIterator, Callable, Dict, IO, Optional, TypeVar, Union, cast, overload +import urllib.parse + +from azure.core import AsyncPipelineClient +from azure.core.async_paging import AsyncItemPaged, AsyncList +from azure.core.exceptions import ( + ClientAuthenticationError, + HttpResponseError, + ResourceExistsError, + ResourceNotFoundError, + ResourceNotModifiedError, + StreamClosedError, + StreamConsumedError, + map_error, +) +from azure.core.pipeline import PipelineResponse +from azure.core.polling import AsyncLROPoller, AsyncNoPolling, AsyncPollingMethod +from azure.core.rest import AsyncHttpResponse, HttpRequest +from azure.core.tracing.decorator import distributed_trace +from azure.core.tracing.decorator_async import distributed_trace_async +from azure.core.utils import case_insensitive_dict +from azure.mgmt.core.exceptions import ARMErrorFormat +from azure.mgmt.core.polling.async_arm_polling import AsyncARMPolling + +from ... import models as _models +from ..._serialization import Deserializer, Serializer +from ...operations._cluster_mesh_profiles_operations import ( + build_apply_request, + build_create_or_update_request, + build_delete_request, + build_get_request, + build_list_by_fleet_request, +) +from .._configuration import ContainerServiceFleetMgmtClientConfiguration + +T = TypeVar("T") +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, Dict[str, Any]], Any]] + + +class ClusterMeshProfilesOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.mgmt.containerservicefleet.aio.ContainerServiceFleetMgmtClient`'s + :attr:`cluster_mesh_profiles` attribute. + """ + + models = _models + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: ContainerServiceFleetMgmtClientConfiguration = ( + input_args.pop(0) if input_args else kwargs.pop("config") + ) + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def list_by_fleet( + self, resource_group_name: str, fleet_name: str, **kwargs: Any + ) -> AsyncIterable["_models.ClusterMeshProfile"]: + """List ClusterMeshProfile resources by Fleet. + + :param resource_group_name: The name of the resource group. The name is case insensitive. + Required. + :type resource_group_name: str + :param fleet_name: The name of the Fleet resource. Required. + :type fleet_name: str + :return: An iterator like instance of either ClusterMeshProfile or the result of cls(response) + :rtype: + ~azure.core.async_paging.AsyncItemPaged[~azure.mgmt.containerservicefleet.models.ClusterMeshProfile] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + cls: ClsType[_models.ClusterMeshProfileListResult] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_list_by_fleet_request( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + subscription_id=self._config.subscription_id, + api_version=api_version, + headers=_headers, + params=_params, + ) + _request.url = self._client.format_url(_request.url) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + _request.url = self._client.format_url(_request.url) + _request.method = "GET" + return _request + + async def extract_data(pipeline_response): + deserialized = self._deserialize("ClusterMeshProfileListResult", pipeline_response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.next_link or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) + raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + @distributed_trace_async + async def get( + self, resource_group_name: str, fleet_name: str, cluster_mesh_profile_name: str, **kwargs: Any + ) -> _models.ClusterMeshProfile: + """Get a ClusterMeshProfile. + + :param resource_group_name: The name of the resource group. The name is case insensitive. + Required. + :type resource_group_name: str + :param fleet_name: The name of the Fleet resource. Required. + :type fleet_name: str + :param cluster_mesh_profile_name: The name of the ClusterMeshProfile resource. Required. + :type cluster_mesh_profile_name: str + :return: ClusterMeshProfile or the result of cls(response) + :rtype: ~azure.mgmt.containerservicefleet.models.ClusterMeshProfile + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + cls: ClsType[_models.ClusterMeshProfile] = kwargs.pop("cls", None) + + _request = build_get_request( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + cluster_mesh_profile_name=cluster_mesh_profile_name, + subscription_id=self._config.subscription_id, + api_version=api_version, + headers=_headers, + params=_params, + ) + _request.url = self._client.format_url(_request.url) + + _stream = False + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) + raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) + + deserialized = self._deserialize("ClusterMeshProfile", pipeline_response.http_response) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + async def _create_or_update_initial( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + resource: Union[_models.ClusterMeshProfile, IO[bytes]], + if_match: Optional[str] = None, + if_none_match: Optional[str] = None, + **kwargs: Any + ) -> AsyncIterator[bytes]: + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[AsyncIterator[bytes]] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _json = None + _content = None + if isinstance(resource, (IOBase, bytes)): + _content = resource + else: + _json = self._serialize.body(resource, "ClusterMeshProfile") + + _request = build_create_or_update_request( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + cluster_mesh_profile_name=cluster_mesh_profile_name, + subscription_id=self._config.subscription_id, + if_match=if_match, + if_none_match=if_none_match, + api_version=api_version, + content_type=content_type, + json=_json, + content=_content, + headers=_headers, + params=_params, + ) + _request.url = self._client.format_url(_request.url) + + _decompress = kwargs.pop("decompress", True) + _stream = True + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200, 201]: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) + raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) + + response_headers = {} + if response.status_code == 201: + response_headers["Retry-After"] = self._deserialize("int", response.headers.get("Retry-After")) + + deserialized = response.stream_download(self._client._pipeline, decompress=_decompress) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @overload + async def begin_create_or_update( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + resource: _models.ClusterMeshProfile, + if_match: Optional[str] = None, + if_none_match: Optional[str] = None, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> AsyncLROPoller[_models.ClusterMeshProfile]: + """Create a ClusterMeshProfile. + + :param resource_group_name: The name of the resource group. The name is case insensitive. + Required. + :type resource_group_name: str + :param fleet_name: The name of the Fleet resource. Required. + :type fleet_name: str + :param cluster_mesh_profile_name: The name of the ClusterMeshProfile resource. Required. + :type cluster_mesh_profile_name: str + :param resource: Resource create parameters. Required. + :type resource: ~azure.mgmt.containerservicefleet.models.ClusterMeshProfile + :param if_match: The request should only proceed if an entity matches this string. Default + value is None. + :type if_match: str + :param if_none_match: The request should only proceed if no entity matches this string. Default + value is None. + :type if_none_match: str + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: An instance of AsyncLROPoller that returns either ClusterMeshProfile or the result of + cls(response) + :rtype: + ~azure.core.polling.AsyncLROPoller[~azure.mgmt.containerservicefleet.models.ClusterMeshProfile] + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + async def begin_create_or_update( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + resource: IO[bytes], + if_match: Optional[str] = None, + if_none_match: Optional[str] = None, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> AsyncLROPoller[_models.ClusterMeshProfile]: + """Create a ClusterMeshProfile. + + :param resource_group_name: The name of the resource group. The name is case insensitive. + Required. + :type resource_group_name: str + :param fleet_name: The name of the Fleet resource. Required. + :type fleet_name: str + :param cluster_mesh_profile_name: The name of the ClusterMeshProfile resource. Required. + :type cluster_mesh_profile_name: str + :param resource: Resource create parameters. Required. + :type resource: IO[bytes] + :param if_match: The request should only proceed if an entity matches this string. Default + value is None. + :type if_match: str + :param if_none_match: The request should only proceed if no entity matches this string. Default + value is None. + :type if_none_match: str + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: An instance of AsyncLROPoller that returns either ClusterMeshProfile or the result of + cls(response) + :rtype: + ~azure.core.polling.AsyncLROPoller[~azure.mgmt.containerservicefleet.models.ClusterMeshProfile] + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace_async + async def begin_create_or_update( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + resource: Union[_models.ClusterMeshProfile, IO[bytes]], + if_match: Optional[str] = None, + if_none_match: Optional[str] = None, + **kwargs: Any + ) -> AsyncLROPoller[_models.ClusterMeshProfile]: + """Create a ClusterMeshProfile. + + :param resource_group_name: The name of the resource group. The name is case insensitive. + Required. + :type resource_group_name: str + :param fleet_name: The name of the Fleet resource. Required. + :type fleet_name: str + :param cluster_mesh_profile_name: The name of the ClusterMeshProfile resource. Required. + :type cluster_mesh_profile_name: str + :param resource: Resource create parameters. Is either a ClusterMeshProfile type or a IO[bytes] + type. Required. + :type resource: ~azure.mgmt.containerservicefleet.models.ClusterMeshProfile or IO[bytes] + :param if_match: The request should only proceed if an entity matches this string. Default + value is None. + :type if_match: str + :param if_none_match: The request should only proceed if no entity matches this string. Default + value is None. + :type if_none_match: str + :return: An instance of AsyncLROPoller that returns either ClusterMeshProfile or the result of + cls(response) + :rtype: + ~azure.core.polling.AsyncLROPoller[~azure.mgmt.containerservicefleet.models.ClusterMeshProfile] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.ClusterMeshProfile] = kwargs.pop("cls", None) + polling: Union[bool, AsyncPollingMethod] = kwargs.pop("polling", True) + lro_delay = kwargs.pop("polling_interval", self._config.polling_interval) + cont_token: Optional[str] = kwargs.pop("continuation_token", None) + if cont_token is None: + raw_result = await self._create_or_update_initial( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + cluster_mesh_profile_name=cluster_mesh_profile_name, + resource=resource, + if_match=if_match, + if_none_match=if_none_match, + api_version=api_version, + content_type=content_type, + cls=lambda x, y, z: x, + headers=_headers, + params=_params, + **kwargs + ) + await raw_result.http_response.read() # type: ignore + kwargs.pop("error_map", None) + + def get_long_running_output(pipeline_response): + deserialized = self._deserialize("ClusterMeshProfile", pipeline_response.http_response) + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + return deserialized + + if polling is True: + polling_method: AsyncPollingMethod = cast( + AsyncPollingMethod, + AsyncARMPolling(lro_delay, lro_options={"final-state-via": "original-uri"}, **kwargs), + ) + elif polling is False: + polling_method = cast(AsyncPollingMethod, AsyncNoPolling()) + else: + polling_method = polling + if cont_token: + return AsyncLROPoller[_models.ClusterMeshProfile].from_continuation_token( + polling_method=polling_method, + continuation_token=cont_token, + client=self._client, + deserialization_callback=get_long_running_output, + ) + return AsyncLROPoller[_models.ClusterMeshProfile]( + self._client, raw_result, get_long_running_output, polling_method # type: ignore + ) + + async def _delete_initial( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + if_match: Optional[str] = None, + **kwargs: Any + ) -> AsyncIterator[bytes]: + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + cls: ClsType[AsyncIterator[bytes]] = kwargs.pop("cls", None) + + _request = build_delete_request( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + cluster_mesh_profile_name=cluster_mesh_profile_name, + subscription_id=self._config.subscription_id, + if_match=if_match, + api_version=api_version, + headers=_headers, + params=_params, + ) + _request.url = self._client.format_url(_request.url) + + _decompress = kwargs.pop("decompress", True) + _stream = True + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202, 204]: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) + raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) + + response_headers = {} + if response.status_code == 202: + response_headers["Location"] = self._deserialize("str", response.headers.get("Location")) + response_headers["Retry-After"] = self._deserialize("int", response.headers.get("Retry-After")) + + deserialized = response.stream_download(self._client._pipeline, decompress=_decompress) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + async def begin_delete( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + if_match: Optional[str] = None, + **kwargs: Any + ) -> AsyncLROPoller[None]: + """Delete a ClusterMeshProfile. + + :param resource_group_name: The name of the resource group. The name is case insensitive. + Required. + :type resource_group_name: str + :param fleet_name: The name of the Fleet resource. Required. + :type fleet_name: str + :param cluster_mesh_profile_name: The name of the ClusterMeshProfile resource. Required. + :type cluster_mesh_profile_name: str + :param if_match: The request should only proceed if an entity matches this string. Default + value is None. + :type if_match: str + :return: An instance of AsyncLROPoller that returns either None or the result of cls(response) + :rtype: ~azure.core.polling.AsyncLROPoller[None] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + cls: ClsType[None] = kwargs.pop("cls", None) + polling: Union[bool, AsyncPollingMethod] = kwargs.pop("polling", True) + lro_delay = kwargs.pop("polling_interval", self._config.polling_interval) + cont_token: Optional[str] = kwargs.pop("continuation_token", None) + if cont_token is None: + raw_result = await self._delete_initial( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + cluster_mesh_profile_name=cluster_mesh_profile_name, + if_match=if_match, + api_version=api_version, + cls=lambda x, y, z: x, + headers=_headers, + params=_params, + **kwargs + ) + await raw_result.http_response.read() # type: ignore + kwargs.pop("error_map", None) + + def get_long_running_output(pipeline_response): # pylint: disable=inconsistent-return-statements + if cls: + return cls(pipeline_response, None, {}) # type: ignore + + if polling is True: + polling_method: AsyncPollingMethod = cast( + AsyncPollingMethod, AsyncARMPolling(lro_delay, lro_options={"final-state-via": "location"}, **kwargs) + ) + elif polling is False: + polling_method = cast(AsyncPollingMethod, AsyncNoPolling()) + else: + polling_method = polling + if cont_token: + return AsyncLROPoller[None].from_continuation_token( + polling_method=polling_method, + continuation_token=cont_token, + client=self._client, + deserialization_callback=get_long_running_output, + ) + return AsyncLROPoller[None](self._client, raw_result, get_long_running_output, polling_method) # type: ignore + + async def _apply_initial( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + if_match: Optional[str] = None, + **kwargs: Any + ) -> AsyncIterator[bytes]: + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + cls: ClsType[AsyncIterator[bytes]] = kwargs.pop("cls", None) + + _request = build_apply_request( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + cluster_mesh_profile_name=cluster_mesh_profile_name, + subscription_id=self._config.subscription_id, + if_match=if_match, + api_version=api_version, + headers=_headers, + params=_params, + ) + _request.url = self._client.format_url(_request.url) + + _decompress = kwargs.pop("decompress", True) + _stream = True + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200, 202]: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) + raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) + + response_headers = {} + if response.status_code == 202: + response_headers["Location"] = self._deserialize("str", response.headers.get("Location")) + response_headers["Retry-After"] = self._deserialize("int", response.headers.get("Retry-After")) + + deserialized = response.stream_download(self._client._pipeline, decompress=_decompress) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace_async + async def begin_apply( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + if_match: Optional[str] = None, + **kwargs: Any + ) -> AsyncLROPoller[_models.ClusterMeshProfile]: + """Applies the cluster mesh profile to selected fleet members. + + :param resource_group_name: The name of the resource group. The name is case insensitive. + Required. + :type resource_group_name: str + :param fleet_name: The name of the Fleet resource. Required. + :type fleet_name: str + :param cluster_mesh_profile_name: The name of the ClusterMeshProfile resource. Required. + :type cluster_mesh_profile_name: str + :param if_match: The request should only proceed if an entity matches this string. Default + value is None. + :type if_match: str + :return: An instance of AsyncLROPoller that returns either ClusterMeshProfile or the result of + cls(response) + :rtype: + ~azure.core.polling.AsyncLROPoller[~azure.mgmt.containerservicefleet.models.ClusterMeshProfile] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + cls: ClsType[_models.ClusterMeshProfile] = kwargs.pop("cls", None) + polling: Union[bool, AsyncPollingMethod] = kwargs.pop("polling", True) + lro_delay = kwargs.pop("polling_interval", self._config.polling_interval) + cont_token: Optional[str] = kwargs.pop("continuation_token", None) + if cont_token is None: + raw_result = await self._apply_initial( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + cluster_mesh_profile_name=cluster_mesh_profile_name, + if_match=if_match, + api_version=api_version, + cls=lambda x, y, z: x, + headers=_headers, + params=_params, + **kwargs + ) + await raw_result.http_response.read() # type: ignore + kwargs.pop("error_map", None) + + def get_long_running_output(pipeline_response): + deserialized = self._deserialize("ClusterMeshProfile", pipeline_response.http_response) + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + return deserialized + + if polling is True: + polling_method: AsyncPollingMethod = cast( + AsyncPollingMethod, AsyncARMPolling(lro_delay, lro_options={"final-state-via": "location"}, **kwargs) + ) + elif polling is False: + polling_method = cast(AsyncPollingMethod, AsyncNoPolling()) + else: + polling_method = polling + if cont_token: + return AsyncLROPoller[_models.ClusterMeshProfile].from_continuation_token( + polling_method=polling_method, + continuation_token=cont_token, + client=self._client, + deserialization_callback=get_long_running_output, + ) + return AsyncLROPoller[_models.ClusterMeshProfile]( + self._client, raw_result, get_long_running_output, polling_method # type: ignore + ) diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_managed_namespaces_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_managed_namespaces_operations.py index f90f3f820d4..a7c03ae7743 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_managed_namespaces_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_managed_namespaces_operations.py @@ -7,7 +7,7 @@ # -------------------------------------------------------------------------- from collections.abc import MutableMapping from io import IOBase -from typing import Any, AsyncIterator, Callable, IO, Optional, TypeVar, Union, cast, overload +from typing import Any, AsyncIterable, AsyncIterator, Callable, Dict, IO, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import AsyncPipelineClient @@ -32,7 +32,7 @@ from azure.mgmt.core.polling.async_arm_polling import AsyncARMPolling from ... import models as _models -from ..._utils.serialization import Deserializer, Serializer +from ..._serialization import Deserializer, Serializer from ...operations._fleet_managed_namespaces_operations import ( build_create_or_update_request, build_delete_request, @@ -43,8 +43,7 @@ from .._configuration import ContainerServiceFleetMgmtClientConfiguration T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, Dict[str, Any]], Any]] class FleetManagedNamespacesOperations: @@ -71,7 +70,7 @@ def __init__(self, *args, **kwargs) -> None: @distributed_trace def list_by_fleet( self, resource_group_name: str, fleet_name: str, **kwargs: Any - ) -> AsyncItemPaged["_models.FleetManagedNamespace"]: + ) -> AsyncIterable["_models.FleetManagedNamespace"]: """List FleetManagedNamespace resources by Fleet. :param resource_group_name: The name of the resource group. The name is case insensitive. @@ -147,10 +146,7 @@ async def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -208,10 +204,7 @@ async def get( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("FleetManagedNamespace", pipeline_response.http_response) @@ -284,10 +277,7 @@ async def _create_or_update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -533,10 +523,7 @@ async def _update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -754,10 +741,7 @@ async def _delete_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_members_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_members_operations.py index 8ff9023527c..fc08578b0d3 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_members_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_members_operations.py @@ -7,7 +7,7 @@ # -------------------------------------------------------------------------- from collections.abc import MutableMapping from io import IOBase -from typing import Any, AsyncIterator, Callable, IO, Optional, TypeVar, Union, cast, overload +from typing import Any, AsyncIterable, AsyncIterator, Callable, Dict, IO, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import AsyncPipelineClient @@ -32,7 +32,7 @@ from azure.mgmt.core.polling.async_arm_polling import AsyncARMPolling from ... import models as _models -from ..._utils.serialization import Deserializer, Serializer +from ..._serialization import Deserializer, Serializer from ...operations._fleet_members_operations import ( build_create_request, build_delete_request, @@ -43,8 +43,7 @@ from .._configuration import ContainerServiceFleetMgmtClientConfiguration T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, Dict[str, Any]], Any]] class FleetMembersOperations: @@ -77,7 +76,7 @@ def list_by_fleet( skip_token: Optional[str] = None, filter: Optional[str] = None, **kwargs: Any - ) -> AsyncItemPaged["_models.FleetMember"]: + ) -> AsyncIterable["_models.FleetMember"]: """List FleetMember resources by Fleet. :param resource_group_name: The name of the resource group. The name is case insensitive. @@ -162,10 +161,7 @@ async def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -223,10 +219,7 @@ async def get( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("FleetMember", pipeline_response.http_response) @@ -299,10 +292,7 @@ async def _create_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -545,10 +535,7 @@ async def _update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -766,10 +753,7 @@ async def _delete_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_update_strategies_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_update_strategies_operations.py index 7eed19c3ea1..4c79a047221 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_update_strategies_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_update_strategies_operations.py @@ -7,7 +7,7 @@ # -------------------------------------------------------------------------- from collections.abc import MutableMapping from io import IOBase -from typing import Any, AsyncIterator, Callable, IO, Optional, TypeVar, Union, cast, overload +from typing import Any, AsyncIterable, AsyncIterator, Callable, Dict, IO, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import AsyncPipelineClient @@ -32,7 +32,7 @@ from azure.mgmt.core.polling.async_arm_polling import AsyncARMPolling from ... import models as _models -from ..._utils.serialization import Deserializer, Serializer +from ..._serialization import Deserializer, Serializer from ...operations._fleet_update_strategies_operations import ( build_create_or_update_request, build_delete_request, @@ -42,8 +42,7 @@ from .._configuration import ContainerServiceFleetMgmtClientConfiguration T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, Dict[str, Any]], Any]] class FleetUpdateStrategiesOperations: @@ -75,7 +74,7 @@ def list_by_fleet( top: Optional[int] = None, skip_token: Optional[str] = None, **kwargs: Any - ) -> AsyncItemPaged["_models.FleetUpdateStrategy"]: + ) -> AsyncIterable["_models.FleetUpdateStrategy"]: """List FleetUpdateStrategy resources by Fleet. :param resource_group_name: The name of the resource group. The name is case insensitive. @@ -157,10 +156,7 @@ async def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -218,10 +214,7 @@ async def get( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("FleetUpdateStrategy", pipeline_response.http_response) @@ -294,10 +287,7 @@ async def _create_or_update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -527,10 +517,7 @@ async def _delete_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleets_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleets_operations.py index a2b205de776..38135d7d58a 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleets_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleets_operations.py @@ -7,7 +7,7 @@ # -------------------------------------------------------------------------- from collections.abc import MutableMapping from io import IOBase -from typing import Any, AsyncIterator, Callable, IO, Optional, TypeVar, Union, cast, overload +from typing import Any, AsyncIterable, AsyncIterator, Callable, Dict, IO, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import AsyncPipelineClient @@ -32,7 +32,7 @@ from azure.mgmt.core.polling.async_arm_polling import AsyncARMPolling from ... import models as _models -from ..._utils.serialization import Deserializer, Serializer +from ..._serialization import Deserializer, Serializer from ...operations._fleets_operations import ( build_create_or_update_request, build_delete_request, @@ -45,8 +45,7 @@ from .._configuration import ContainerServiceFleetMgmtClientConfiguration T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, Dict[str, Any]], Any]] class FleetsOperations: @@ -73,7 +72,7 @@ def __init__(self, *args, **kwargs) -> None: @distributed_trace def list_by_subscription( self, top: Optional[int] = None, skip_token: Optional[str] = None, **kwargs: Any - ) -> AsyncItemPaged["_models.Fleet"]: + ) -> AsyncIterable["_models.Fleet"]: """Lists fleets in the specified subscription. :param top: The number of result items to return. Default value is None. @@ -147,10 +146,7 @@ async def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -158,7 +154,7 @@ async def get_next(next_link=None): return AsyncItemPaged(get_next, extract_data) @distributed_trace - def list_by_resource_group(self, resource_group_name: str, **kwargs: Any) -> AsyncItemPaged["_models.Fleet"]: + def list_by_resource_group(self, resource_group_name: str, **kwargs: Any) -> AsyncIterable["_models.Fleet"]: """Lists fleets in the specified subscription and resource group. :param resource_group_name: The name of the resource group. The name is case insensitive. @@ -229,10 +225,7 @@ async def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -285,10 +278,7 @@ async def get(self, resource_group_name: str, fleet_name: str, **kwargs: Any) -> if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("Fleet", pipeline_response.http_response) @@ -359,10 +349,7 @@ async def _create_or_update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -587,10 +574,7 @@ async def _update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -786,10 +770,7 @@ async def _delete_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -913,10 +894,7 @@ async def list_credentials( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("FleetCredentialResults", pipeline_response.http_response) diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_gates_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_gates_operations.py index c5c068e7bde..279309ed2a5 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_gates_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_gates_operations.py @@ -7,7 +7,7 @@ # -------------------------------------------------------------------------- from collections.abc import MutableMapping from io import IOBase -from typing import Any, AsyncIterator, Callable, IO, Optional, TypeVar, Union, cast, overload +from typing import Any, AsyncIterable, AsyncIterator, Callable, Dict, IO, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import AsyncPipelineClient @@ -32,13 +32,12 @@ from azure.mgmt.core.polling.async_arm_polling import AsyncARMPolling from ... import models as _models -from ..._utils.serialization import Deserializer, Serializer +from ..._serialization import Deserializer, Serializer from ...operations._gates_operations import build_get_request, build_list_by_fleet_request, build_update_request from .._configuration import ContainerServiceFleetMgmtClientConfiguration T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, Dict[str, Any]], Any]] class GatesOperations: @@ -71,7 +70,7 @@ def list_by_fleet( top: Optional[int] = None, skip_token: Optional[str] = None, **kwargs: Any - ) -> AsyncItemPaged["_models.Gate"]: + ) -> AsyncIterable["_models.Gate"]: """List Gate resources by Fleet. :param resource_group_name: The name of the resource group. The name is case insensitive. @@ -155,10 +154,7 @@ async def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -214,10 +210,7 @@ async def get(self, resource_group_name: str, fleet_name: str, gate_name: str, * if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("Gate", pipeline_response.http_response) @@ -290,10 +283,7 @@ async def _update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_operations.py index 7ae9124626a..a4352c4abf2 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_operations.py @@ -6,7 +6,7 @@ # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- from collections.abc import MutableMapping -from typing import Any, Callable, Optional, TypeVar +from typing import Any, AsyncIterable, Callable, Dict, Optional, TypeVar import urllib.parse from azure.core import AsyncPipelineClient @@ -26,13 +26,12 @@ from azure.mgmt.core.exceptions import ARMErrorFormat from ... import models as _models -from ..._utils.serialization import Deserializer, Serializer +from ..._serialization import Deserializer, Serializer from ...operations._operations import build_list_request from .._configuration import ContainerServiceFleetMgmtClientConfiguration T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, Dict[str, Any]], Any]] class Operations: @@ -57,7 +56,7 @@ def __init__(self, *args, **kwargs) -> None: self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") @distributed_trace - def list(self, **kwargs: Any) -> AsyncItemPaged["_models.Operation"]: + def list(self, **kwargs: Any) -> AsyncIterable["_models.Operation"]: """List the operations for the provider. :return: An iterator like instance of either Operation or the result of cls(response) @@ -124,10 +123,7 @@ async def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_patch.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_patch.py index 87676c65a8f..8bcb627aa47 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_patch.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_patch.py @@ -7,9 +7,9 @@ Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python/customize """ +from typing import List - -__all__: list[str] = [] # Add all objects you want publicly available to users at this package level +__all__: List[str] = [] # Add all objects you want publicly available to users at this package level def patch_sdk(): diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_update_runs_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_update_runs_operations.py index 1b65d1b5680..00b67fa2184 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_update_runs_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_update_runs_operations.py @@ -8,7 +8,7 @@ # -------------------------------------------------------------------------- from collections.abc import MutableMapping from io import IOBase -from typing import Any, AsyncIterator, Callable, IO, Optional, TypeVar, Union, cast, overload +from typing import Any, AsyncIterable, AsyncIterator, Callable, Dict, IO, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import AsyncPipelineClient @@ -33,7 +33,7 @@ from azure.mgmt.core.polling.async_arm_polling import AsyncARMPolling from ... import models as _models -from ..._utils.serialization import Deserializer, Serializer +from ..._serialization import Deserializer, Serializer from ...operations._update_runs_operations import ( build_create_or_update_request, build_delete_request, @@ -46,8 +46,7 @@ from .._configuration import ContainerServiceFleetMgmtClientConfiguration T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, AsyncHttpResponse], T, Dict[str, Any]], Any]] class UpdateRunsOperations: @@ -79,7 +78,7 @@ def list_by_fleet( top: Optional[int] = None, skip_token: Optional[str] = None, **kwargs: Any - ) -> AsyncItemPaged["_models.UpdateRun"]: + ) -> AsyncIterable["_models.UpdateRun"]: """List UpdateRun resources by Fleet. :param resource_group_name: The name of the resource group. The name is case insensitive. @@ -161,10 +160,7 @@ async def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -222,10 +218,7 @@ async def get( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("UpdateRun", pipeline_response.http_response) @@ -298,10 +291,7 @@ async def _create_or_update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -528,10 +518,7 @@ async def _delete_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -676,10 +663,7 @@ async def _skip_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -893,10 +877,7 @@ async def _start_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -1033,10 +1014,7 @@ async def _stop_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/__init__.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/__init__.py index bfc077404b2..33d28a2154f 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/__init__.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/__init__.py @@ -20,6 +20,11 @@ AutoUpgradeProfile, AutoUpgradeProfileListResult, AutoUpgradeProfileStatus, + CiliumProperties, + ClusterMeshProfile, + ClusterMeshProfileListResult, + ClusterMeshProfileProperties, + ClusterMeshProfileStatus, ErrorAdditionalInfo, ErrorDetail, ErrorResponse, @@ -52,7 +57,10 @@ ManagedClusterUpgradeSpec, ManagedNamespaceProperties, ManagedServiceIdentity, + MemberSelector, MemberUpdateStatus, + MeshMemberStatus, + MeshProperties, MetaV1LabelSelector, MetaV1LabelSelectorRequirement, NetworkPolicy, @@ -101,6 +109,8 @@ AutoUpgradeLastTriggerStatus, AutoUpgradeNodeImageSelectionType, AutoUpgradeProfileProvisioningState, + ClusterMeshProfileProvisioningState, + ClusterMeshState, CreatedByType, DeletePolicy, FleetManagedNamespaceProvisioningState, @@ -113,6 +123,7 @@ LabelSelectorOperator, ManagedClusterUpgradeType, ManagedServiceIdentityType, + MeshMemberState, NodeImageSelectionType, Origin, PlacementType, @@ -138,6 +149,11 @@ "AutoUpgradeProfile", "AutoUpgradeProfileListResult", "AutoUpgradeProfileStatus", + "CiliumProperties", + "ClusterMeshProfile", + "ClusterMeshProfileListResult", + "ClusterMeshProfileProperties", + "ClusterMeshProfileStatus", "ErrorAdditionalInfo", "ErrorDetail", "ErrorResponse", @@ -170,7 +186,10 @@ "ManagedClusterUpgradeSpec", "ManagedNamespaceProperties", "ManagedServiceIdentity", + "MemberSelector", "MemberUpdateStatus", + "MeshMemberStatus", + "MeshProperties", "MetaV1LabelSelector", "MetaV1LabelSelectorRequirement", "NetworkPolicy", @@ -216,6 +235,8 @@ "AutoUpgradeLastTriggerStatus", "AutoUpgradeNodeImageSelectionType", "AutoUpgradeProfileProvisioningState", + "ClusterMeshProfileProvisioningState", + "ClusterMeshState", "CreatedByType", "DeletePolicy", "FleetManagedNamespaceProvisioningState", @@ -228,6 +249,7 @@ "LabelSelectorOperator", "ManagedClusterUpgradeType", "ManagedServiceIdentityType", + "MeshMemberState", "NodeImageSelectionType", "Origin", "PlacementType", diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_container_service_fleet_mgmt_client_enums.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_container_service_fleet_mgmt_client_enums.py index c3f3fe7e907..a509cecb712 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_container_service_fleet_mgmt_client_enums.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_container_service_fleet_mgmt_client_enums.py @@ -68,6 +68,30 @@ class AutoUpgradeProfileProvisioningState(str, Enum, metaclass=CaseInsensitiveEn """Resource creation was canceled.""" +class ClusterMeshProfileProvisioningState(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The provisioning state of the cluster mesh profile resource.""" + + SUCCEEDED = "Succeeded" + """Resource has been created.""" + FAILED = "Failed" + """Resource creation failed.""" + CANCELED = "Canceled" + """Resource creation was canceled.""" + + +class ClusterMeshState(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Cluster mesh state.""" + + NOT_CONNECTED = "NotConnected" + """The mesh is not connected.""" + CONNECTING = "Connecting" + """The mesh is connecting.""" + CONNECTED = "Connected" + """The mesh is connected.""" + FAILED = "Failed" + """The mesh failed to connect.""" + + class CreatedByType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """The type of identity that created the resource.""" @@ -218,6 +242,21 @@ class ManagedServiceIdentityType(str, Enum, metaclass=CaseInsensitiveEnumMeta): SYSTEM_ASSIGNED_USER_ASSIGNED = "SystemAssigned, UserAssigned" +class MeshMemberState(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """Mesh member state.""" + + NOT_CONNECTED = "NotConnected" + """The member is not connected to the mesh.""" + CONNECTING = "Connecting" + """The member is connecting to the mesh.""" + CONNECTED = "Connected" + """The member is connected to the mesh.""" + DISCONNECTING = "Disconnecting" + """The member is disconnecting from the mesh.""" + FAILED = "Failed" + """The member failed to connect due to an error.""" + + class NodeImageSelectionType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """The node image upgrade type.""" diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_models_py3.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_models_py3.py index 07ed0fe1882..f52a5002999 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_models_py3.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_models_py3.py @@ -7,15 +7,13 @@ # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- -from collections.abc import MutableMapping import datetime -from typing import Any, Optional, TYPE_CHECKING, Union +from typing import Any, Dict, List, Optional, TYPE_CHECKING, Union -from .._utils import serialization as _serialization +from .. import _serialization if TYPE_CHECKING: from .. import models as _models -JSON = MutableMapping[str, Any] class AgentProfile(_serialization.Model): @@ -355,7 +353,7 @@ class AutoUpgradeProfileListResult(_serialization.Model): } def __init__( - self, *, value: list["_models.AutoUpgradeProfile"], next_link: Optional[str] = None, **kwargs: Any + self, *, value: List["_models.AutoUpgradeProfile"], next_link: Optional[str] = None, **kwargs: Any ) -> None: """ :keyword value: The AutoUpgradeProfile items on this page. Required. @@ -407,7 +405,212 @@ def __init__(self, **kwargs: Any) -> None: self.last_triggered_at: Optional[datetime.datetime] = None self.last_trigger_status: Optional[Union[str, "_models.AutoUpgradeLastTriggerStatus"]] = None self.last_trigger_error: Optional["_models.ErrorDetail"] = None - self.last_trigger_upgrade_versions: Optional[list[str]] = None + self.last_trigger_upgrade_versions: Optional[List[str]] = None + + +class CiliumProperties(_serialization.Model): + """The Cilium specific properties of the member cluster. + + Variables are only populated by the server, and will be ignored when sending a request. + + All required parameters must be populated in order to send to server. + + :ivar id: Cilium requires each cluster to be assigned a unique numeric cluster id from 1 - 255. + The id is managed by Fleet and cannot be set by the user. Required. + :vartype id: int + :ivar name: Cilium requires each cluster to be assigned a unique human-readable name. The name + is managed by Fleet, based on the Fleet Member name, and cannot be set by the user. Required. + :vartype name: str + """ + + _validation = { + "id": {"required": True, "readonly": True}, + "name": {"required": True, "readonly": True}, + } + + _attribute_map = { + "id": {"key": "id", "type": "int"}, + "name": {"key": "name", "type": "str"}, + } + + def __init__(self, **kwargs: Any) -> None: + """ """ + super().__init__(**kwargs) + self.id: Optional[int] = None + self.name: Optional[str] = None + + +class ClusterMeshProfile(ProxyResource): + """A cluster mesh profile stores the general information about the mesh. + + Variables are only populated by the server, and will be ignored when sending a request. + + :ivar id: Fully qualified resource ID for the resource. E.g. + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}". + :vartype id: str + :ivar name: The name of the resource. + :vartype name: str + :ivar type: The type of the resource. E.g. "Microsoft.Compute/virtualMachines" or + "Microsoft.Storage/storageAccounts". + :vartype type: str + :ivar system_data: Azure Resource Manager metadata containing createdBy and modifiedBy + information. + :vartype system_data: ~azure.mgmt.containerservicefleet.models.SystemData + :ivar properties: The resource-specific properties for this resource. + :vartype properties: ~azure.mgmt.containerservicefleet.models.ClusterMeshProfileProperties + :ivar e_tag: If eTag is provided in the response body, it may also be provided as a header per + the normal etag convention. Entity tags are used for comparing two or more entities from the + same requested resource. HTTP/1.1 uses entity tags in the etag (section 14.19), If-Match + (section 14.24), If-None-Match (section 14.26), and If-Range (section 14.27) header fields. + :vartype e_tag: str + """ + + _validation = { + "id": {"readonly": True}, + "name": {"readonly": True}, + "type": {"readonly": True}, + "system_data": {"readonly": True}, + "e_tag": {"readonly": True}, + } + + _attribute_map = { + "id": {"key": "id", "type": "str"}, + "name": {"key": "name", "type": "str"}, + "type": {"key": "type", "type": "str"}, + "system_data": {"key": "systemData", "type": "SystemData"}, + "properties": {"key": "properties", "type": "ClusterMeshProfileProperties"}, + "e_tag": {"key": "eTag", "type": "str"}, + } + + def __init__(self, *, properties: Optional["_models.ClusterMeshProfileProperties"] = None, **kwargs: Any) -> None: + """ + :keyword properties: The resource-specific properties for this resource. + :paramtype properties: ~azure.mgmt.containerservicefleet.models.ClusterMeshProfileProperties + """ + super().__init__(**kwargs) + self.properties = properties + self.e_tag: Optional[str] = None + + +class ClusterMeshProfileListResult(_serialization.Model): + """The response of a ClusterMeshProfile list operation. + + All required parameters must be populated in order to send to server. + + :ivar value: The ClusterMeshProfile items on this page. Required. + :vartype value: list[~azure.mgmt.containerservicefleet.models.ClusterMeshProfile] + :ivar next_link: The link to the next page of items. + :vartype next_link: str + """ + + _validation = { + "value": {"required": True}, + } + + _attribute_map = { + "value": {"key": "value", "type": "[ClusterMeshProfile]"}, + "next_link": {"key": "nextLink", "type": "str"}, + } + + def __init__( + self, *, value: List["_models.ClusterMeshProfile"], next_link: Optional[str] = None, **kwargs: Any + ) -> None: + """ + :keyword value: The ClusterMeshProfile items on this page. Required. + :paramtype value: list[~azure.mgmt.containerservicefleet.models.ClusterMeshProfile] + :keyword next_link: The link to the next page of items. + :paramtype next_link: str + """ + super().__init__(**kwargs) + self.value = value + self.next_link = next_link + + +class ClusterMeshProfileProperties(_serialization.Model): + """A cluster mesh profile stores the general information about the mesh. + + Variables are only populated by the server, and will be ignored when sending a request. + + :ivar provisioning_state: The provisioning state of the cluster mesh profile. Known values are: + "Succeeded", "Failed", and "Canceled". + :vartype provisioning_state: str or + ~azure.mgmt.containerservicefleet.models.ClusterMeshProfileProvisioningState + :ivar member_selector: Select the members of the mesh. + + + * Only key/value pairs with the ``=`` operator are accepted in the label selector. + * If empty or not specified, no Fleet members will be selected to join the mesh. + :vartype member_selector: ~azure.mgmt.containerservicefleet.models.MemberSelector + :ivar status: The cluster mesh profile status. + :vartype status: ~azure.mgmt.containerservicefleet.models.ClusterMeshProfileStatus + """ + + _validation = { + "provisioning_state": {"readonly": True}, + "status": {"readonly": True}, + } + + _attribute_map = { + "provisioning_state": {"key": "provisioningState", "type": "str"}, + "member_selector": {"key": "memberSelector", "type": "MemberSelector"}, + "status": {"key": "status", "type": "ClusterMeshProfileStatus"}, + } + + def __init__(self, *, member_selector: Optional["_models.MemberSelector"] = None, **kwargs: Any) -> None: + """ + :keyword member_selector: Select the members of the mesh. + + + * Only key/value pairs with the ``=`` operator are accepted in the label selector. + * If empty or not specified, no Fleet members will be selected to join the mesh. + :paramtype member_selector: ~azure.mgmt.containerservicefleet.models.MemberSelector + """ + super().__init__(**kwargs) + self.provisioning_state: Optional[Union[str, "_models.ClusterMeshProfileProvisioningState"]] = None + self.member_selector = member_selector + self.status: Optional["_models.ClusterMeshProfileStatus"] = None + + +class ClusterMeshProfileStatus(_serialization.Model): + """Status of the cluster mesh. + + Variables are only populated by the server, and will be ignored when sending a request. + + All required parameters must be populated in order to send to server. + + :ivar state: The state of the cluster mesh. Required. Known values are: "NotConnected", + "Connecting", "Connected", and "Failed". + :vartype state: str or ~azure.mgmt.containerservicefleet.models.ClusterMeshState + :ivar last_applied_member_label_selector: The last applied Kubernetes-style label selector + defining which Fleet members are in the mesh, e.g. ``env=production``. + :vartype last_applied_member_label_selector: str + :ivar last_operation_id: The last operation ID for the cluster mesh profile. + :vartype last_operation_id: str + :ivar last_operation_error: The last operation error of the cluster mesh profile. + :vartype last_operation_error: ~azure.mgmt.containerservicefleet.models.ErrorDetail + """ + + _validation = { + "state": {"required": True, "readonly": True}, + "last_applied_member_label_selector": {"readonly": True, "max_length": 512}, + "last_operation_id": {"readonly": True}, + "last_operation_error": {"readonly": True}, + } + + _attribute_map = { + "state": {"key": "state", "type": "str"}, + "last_applied_member_label_selector": {"key": "lastAppliedMemberLabelSelector", "type": "str"}, + "last_operation_id": {"key": "lastOperationId", "type": "str"}, + "last_operation_error": {"key": "lastOperationError", "type": "ErrorDetail"}, + } + + def __init__(self, **kwargs: Any) -> None: + """ """ + super().__init__(**kwargs) + self.state: Optional[Union[str, "_models.ClusterMeshState"]] = None + self.last_applied_member_label_selector: Optional[str] = None + self.last_operation_id: Optional[str] = None + self.last_operation_error: Optional["_models.ErrorDetail"] = None class ErrorAdditionalInfo(_serialization.Model): @@ -477,8 +680,8 @@ def __init__(self, **kwargs: Any) -> None: self.code: Optional[str] = None self.message: Optional[str] = None self.target: Optional[str] = None - self.details: Optional[list["_models.ErrorDetail"]] = None - self.additional_info: Optional[list["_models.ErrorAdditionalInfo"]] = None + self.details: Optional[List["_models.ErrorDetail"]] = None + self.additional_info: Optional[List["_models.ErrorAdditionalInfo"]] = None class ErrorResponse(_serialization.Model): @@ -544,7 +747,7 @@ class TrackedResource(Resource): "location": {"key": "location", "type": "str"}, } - def __init__(self, *, location: str, tags: Optional[dict[str, str]] = None, **kwargs: Any) -> None: + def __init__(self, *, location: str, tags: Optional[Dict[str, str]] = None, **kwargs: Any) -> None: """ :keyword tags: Resource tags. :paramtype tags: dict[str, str] @@ -624,7 +827,7 @@ def __init__( self, *, location: str, - tags: Optional[dict[str, str]] = None, + tags: Optional[Dict[str, str]] = None, identity: Optional["_models.ManagedServiceIdentity"] = None, hub_profile: Optional["_models.FleetHubProfile"] = None, **kwargs: Any @@ -695,7 +898,7 @@ class FleetCredentialResults(_serialization.Model): def __init__(self, **kwargs: Any) -> None: """ """ super().__init__(**kwargs) - self.kubeconfigs: Optional[list["_models.FleetCredentialResult"]] = None + self.kubeconfigs: Optional[List["_models.FleetCredentialResult"]] = None class FleetHubProfile(_serialization.Model): @@ -784,7 +987,7 @@ class FleetListResult(_serialization.Model): "next_link": {"key": "nextLink", "type": "str"}, } - def __init__(self, *, value: list["_models.Fleet"], next_link: Optional[str] = None, **kwargs: Any) -> None: + def __init__(self, *, value: List["_models.Fleet"], next_link: Optional[str] = None, **kwargs: Any) -> None: """ :keyword value: The Fleet items on this page. Required. :paramtype value: list[~azure.mgmt.containerservicefleet.models.Fleet] @@ -851,7 +1054,7 @@ def __init__( self, *, location: str, - tags: Optional[dict[str, str]] = None, + tags: Optional[Dict[str, str]] = None, properties: Optional["_models.FleetManagedNamespaceProperties"] = None, **kwargs: Any ) -> None: @@ -889,7 +1092,7 @@ class FleetManagedNamespaceListResult(_serialization.Model): } def __init__( - self, *, value: list["_models.FleetManagedNamespace"], next_link: Optional[str] = None, **kwargs: Any + self, *, value: List["_models.FleetManagedNamespace"], next_link: Optional[str] = None, **kwargs: Any ) -> None: """ :keyword value: The FleetManagedNamespace items on this page. Required. @@ -913,7 +1116,7 @@ class FleetManagedNamespacePatch(_serialization.Model): "tags": {"key": "tags", "type": "{str}"}, } - def __init__(self, *, tags: Optional[dict[str, str]] = None, **kwargs: Any) -> None: + def __init__(self, *, tags: Optional[Dict[str, str]] = None, **kwargs: Any) -> None: """ :keyword tags: Resource tags. :paramtype tags: dict[str, str] @@ -1064,6 +1267,8 @@ class FleetMember(ProxyResource): :vartype labels: dict[str, str] :ivar status: Status information of the last operation for fleet member. :vartype status: ~azure.mgmt.containerservicefleet.models.FleetMemberStatus + :ivar mesh_properties: The Mesh Member Properties associated with this Fleet Member. + :vartype mesh_properties: ~azure.mgmt.containerservicefleet.models.MeshProperties """ _validation = { @@ -1075,6 +1280,7 @@ class FleetMember(ProxyResource): "group": {"max_length": 50, "min_length": 1, "pattern": r"^[a-z0-9]([-a-z0-9]*[a-z0-9])?$"}, "provisioning_state": {"readonly": True}, "status": {"readonly": True}, + "mesh_properties": {"readonly": True}, } _attribute_map = { @@ -1088,6 +1294,7 @@ class FleetMember(ProxyResource): "provisioning_state": {"key": "properties.provisioningState", "type": "str"}, "labels": {"key": "properties.labels", "type": "{str}"}, "status": {"key": "properties.status", "type": "FleetMemberStatus"}, + "mesh_properties": {"key": "properties.meshProperties", "type": "MeshProperties"}, } def __init__( @@ -1095,7 +1302,7 @@ def __init__( *, cluster_resource_id: Optional[str] = None, group: Optional[str] = None, - labels: Optional[dict[str, str]] = None, + labels: Optional[Dict[str, str]] = None, **kwargs: Any ) -> None: """ @@ -1115,6 +1322,7 @@ def __init__( self.provisioning_state: Optional[Union[str, "_models.FleetMemberProvisioningState"]] = None self.labels = labels self.status: Optional["_models.FleetMemberStatus"] = None + self.mesh_properties: Optional["_models.MeshProperties"] = None class FleetMemberListResult(_serialization.Model): @@ -1137,7 +1345,7 @@ class FleetMemberListResult(_serialization.Model): "next_link": {"key": "nextLink", "type": "str"}, } - def __init__(self, *, value: list["_models.FleetMember"], next_link: Optional[str] = None, **kwargs: Any) -> None: + def __init__(self, *, value: List["_models.FleetMember"], next_link: Optional[str] = None, **kwargs: Any) -> None: """ :keyword value: The FleetMember items on this page. Required. :paramtype value: list[~azure.mgmt.containerservicefleet.models.FleetMember] @@ -1195,7 +1403,7 @@ class FleetMemberUpdate(_serialization.Model): "labels": {"key": "properties.labels", "type": "{str}"}, } - def __init__(self, *, group: Optional[str] = None, labels: Optional[dict[str, str]] = None, **kwargs: Any) -> None: + def __init__(self, *, group: Optional[str] = None, labels: Optional[Dict[str, str]] = None, **kwargs: Any) -> None: """ :keyword group: The group this member belongs to for multi-cluster update management. :paramtype group: str @@ -1224,7 +1432,7 @@ class FleetPatch(_serialization.Model): def __init__( self, *, - tags: Optional[dict[str, str]] = None, + tags: Optional[Dict[str, str]] = None, identity: Optional["_models.ManagedServiceIdentity"] = None, **kwargs: Any ) -> None: @@ -1347,7 +1555,7 @@ class FleetUpdateStrategyListResult(_serialization.Model): } def __init__( - self, *, value: list["_models.FleetUpdateStrategy"], next_link: Optional[str] = None, **kwargs: Any + self, *, value: List["_models.FleetUpdateStrategy"], next_link: Optional[str] = None, **kwargs: Any ) -> None: """ :keyword value: The FleetUpdateStrategy items on this page. Required. @@ -1501,7 +1709,7 @@ class GateListResult(_serialization.Model): "next_link": {"key": "nextLink", "type": "str"}, } - def __init__(self, *, value: list["_models.Gate"], next_link: Optional[str] = None, **kwargs: Any) -> None: + def __init__(self, *, value: List["_models.Gate"], next_link: Optional[str] = None, **kwargs: Any) -> None: """ :keyword value: The Gate items on this page. Required. :paramtype value: list[~azure.mgmt.containerservicefleet.models.Gate] @@ -1724,8 +1932,8 @@ class ManagedNamespaceProperties(_serialization.Model): def __init__( self, *, - labels: Optional[dict[str, str]] = None, - annotations: Optional[dict[str, str]] = None, + labels: Optional[Dict[str, str]] = None, + annotations: Optional[Dict[str, str]] = None, default_resource_quota: Optional["_models.ResourceQuota"] = None, default_network_policy: Optional["_models.NetworkPolicy"] = None, **kwargs: Any @@ -1789,7 +1997,7 @@ def __init__( self, *, type: Union[str, "_models.ManagedServiceIdentityType"], - user_assigned_identities: Optional[dict[str, "_models.UserAssignedIdentity"]] = None, + user_assigned_identities: Optional[Dict[str, "_models.UserAssignedIdentity"]] = None, **kwargs: Any ) -> None: """ @@ -1811,6 +2019,34 @@ def __init__( self.user_assigned_identities = user_assigned_identities +class MemberSelector(_serialization.Model): + """Select members of a fleet. + + All required parameters must be populated in order to send to server. + + :ivar by_label: Kubernetes-style label selector for selecting Fleet members, e.g. + ``env=production``. Required. + :vartype by_label: str + """ + + _validation = { + "by_label": {"required": True, "max_length": 512}, + } + + _attribute_map = { + "by_label": {"key": "byLabel", "type": "str"}, + } + + def __init__(self, *, by_label: str, **kwargs: Any) -> None: + """ + :keyword by_label: Kubernetes-style label selector for selecting Fleet members, e.g. + ``env=production``. Required. + :paramtype by_label: str + """ + super().__init__(**kwargs) + self.by_label = by_label + + class MemberUpdateStatus(_serialization.Model): """The status of a member update operation. @@ -1854,6 +2090,84 @@ def __init__(self, **kwargs: Any) -> None: self.message: Optional[str] = None +class MeshMemberStatus(_serialization.Model): + """Status of the mesh member. + + Variables are only populated by the server, and will be ignored when sending a request. + + All required parameters must be populated in order to send to server. + + :ivar state: The mesh member state. Required. Known values are: "NotConnected", "Connecting", + "Connected", "Disconnecting", and "Failed". + :vartype state: str or ~azure.mgmt.containerservicefleet.models.MeshMemberState + :ivar last_updated_at: When the status was last updated. + :vartype last_updated_at: ~datetime.datetime + :ivar last_operation_id: The last operation ID that affected the mesh properties of the fleet + member. + :vartype last_operation_id: str + :ivar error: The error affecting this member. + :vartype error: ~azure.mgmt.containerservicefleet.models.ErrorDetail + """ + + _validation = { + "state": {"required": True, "readonly": True}, + "last_updated_at": {"readonly": True}, + "last_operation_id": {"readonly": True}, + "error": {"readonly": True}, + } + + _attribute_map = { + "state": {"key": "state", "type": "str"}, + "last_updated_at": {"key": "lastUpdatedAt", "type": "iso-8601"}, + "last_operation_id": {"key": "lastOperationId", "type": "str"}, + "error": {"key": "error", "type": "ErrorDetail"}, + } + + def __init__(self, **kwargs: Any) -> None: + """ """ + super().__init__(**kwargs) + self.state: Optional[Union[str, "_models.MeshMemberState"]] = None + self.last_updated_at: Optional[datetime.datetime] = None + self.last_operation_id: Optional[str] = None + self.error: Optional["_models.ErrorDetail"] = None + + +class MeshProperties(_serialization.Model): + """The Mesh Member data for a Fleet Member resource. + + Variables are only populated by the server, and will be ignored when sending a request. + + All required parameters must be populated in order to send to server. + + :ivar cilium_properties: The Cilium cluster properties. Required. + :vartype cilium_properties: ~azure.mgmt.containerservicefleet.models.CiliumProperties + :ivar status: The status of the mesh member. Required. + :vartype status: ~azure.mgmt.containerservicefleet.models.MeshMemberStatus + :ivar cluster_mesh_profile_resource_id: Resource id of the cluster mesh profile associated with + this mesh member. Required. + :vartype cluster_mesh_profile_resource_id: str + """ + + _validation = { + "cilium_properties": {"required": True, "readonly": True}, + "status": {"required": True, "readonly": True}, + "cluster_mesh_profile_resource_id": {"required": True, "readonly": True}, + } + + _attribute_map = { + "cilium_properties": {"key": "ciliumProperties", "type": "CiliumProperties"}, + "status": {"key": "status", "type": "MeshMemberStatus"}, + "cluster_mesh_profile_resource_id": {"key": "clusterMeshProfileResourceId", "type": "str"}, + } + + def __init__(self, **kwargs: Any) -> None: + """ """ + super().__init__(**kwargs) + self.cilium_properties: Optional["_models.CiliumProperties"] = None + self.status: Optional["_models.MeshMemberStatus"] = None + self.cluster_mesh_profile_resource_id: Optional[str] = None + + class MetaV1LabelSelector(_serialization.Model): """A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector @@ -1877,8 +2191,8 @@ class MetaV1LabelSelector(_serialization.Model): def __init__( self, *, - match_labels: Optional[dict[str, str]] = None, - match_expressions: Optional[list["_models.MetaV1LabelSelectorRequirement"]] = None, + match_labels: Optional[Dict[str, str]] = None, + match_expressions: Optional[List["_models.MetaV1LabelSelectorRequirement"]] = None, **kwargs: Any ) -> None: """ @@ -1930,7 +2244,7 @@ def __init__( *, key: str, operator: Union[str, "_models.LabelSelectorOperator"], - values: Optional[list[str]] = None, + values: Optional[List[str]] = None, **kwargs: Any ) -> None: """ @@ -2018,7 +2332,7 @@ def __init__( self, *, type: Union[str, "_models.NodeImageSelectionType"], - custom_node_image_versions: Optional[list["_models.NodeImageVersion"]] = None, + custom_node_image_versions: Optional[List["_models.NodeImageVersion"]] = None, **kwargs: Any ) -> None: """ @@ -2060,7 +2374,7 @@ class NodeImageSelectionStatus(_serialization.Model): def __init__(self, **kwargs: Any) -> None: """ """ super().__init__(**kwargs) - self.selected_node_image_versions: Optional[list["_models.NodeImageVersion"]] = None + self.selected_node_image_versions: Optional[List["_models.NodeImageVersion"]] = None class NodeImageVersion(_serialization.Model): @@ -2204,7 +2518,7 @@ class OperationListResult(_serialization.Model): def __init__(self, **kwargs: Any) -> None: """ """ super().__init__(**kwargs) - self.value: Optional[list["_models.Operation"]] = None + self.value: Optional[List["_models.Operation"]] = None self.next_link: Optional[str] = None @@ -2345,7 +2659,7 @@ class PlacementV1ClusterSelector(_serialization.Model): } def __init__( - self, *, cluster_selector_terms: list["_models.PlacementV1ClusterSelectorTerm"], **kwargs: Any + self, *, cluster_selector_terms: List["_models.PlacementV1ClusterSelectorTerm"], **kwargs: Any ) -> None: """ :keyword cluster_selector_terms: ClusterSelectorTerms is a list of cluster selector terms. The @@ -2437,9 +2751,9 @@ def __init__( self, *, placement_type: Optional[Union[str, "_models.PlacementType"]] = None, - cluster_names: Optional[list[str]] = None, + cluster_names: Optional[List[str]] = None, affinity: Optional["_models.PlacementV1Affinity"] = None, - tolerations: Optional[list["_models.PlacementV1Toleration"]] = None, + tolerations: Optional[List["_models.PlacementV1Toleration"]] = None, **kwargs: Any ) -> None: """ @@ -2486,7 +2800,7 @@ class PlacementV1PropertySelector(_serialization.Model): } def __init__( - self, *, match_expressions: list["_models.PlacementV1PropertySelectorRequirement"], **kwargs: Any + self, *, match_expressions: List["_models.PlacementV1PropertySelectorRequirement"], **kwargs: Any ) -> None: """ :keyword match_expressions: MatchExpressions is an array of PropertySelectorRequirements. The @@ -2532,7 +2846,7 @@ class PlacementV1PropertySelectorRequirement(_serialization.Model): } def __init__( - self, *, name: str, operator: Union[str, "_models.PropertySelectorOperator"], values: list[str], **kwargs: Any + self, *, name: str, operator: Union[str, "_models.PropertySelectorOperator"], values: List[str], **kwargs: Any ) -> None: """ :keyword name: Name is the name of the property; it should be a Kubernetes label name. @@ -2726,7 +3040,7 @@ class SkipProperties(_serialization.Model): "targets": {"key": "targets", "type": "[SkipTarget]"}, } - def __init__(self, *, targets: list["_models.SkipTarget"], **kwargs: Any) -> None: + def __init__(self, *, targets: List["_models.SkipTarget"], **kwargs: Any) -> None: """ :keyword targets: The targets to skip. Required. :paramtype targets: list[~azure.mgmt.containerservicefleet.models.SkipTarget] @@ -2888,8 +3202,8 @@ def __init__( *, name: str, max_concurrency: Optional[str] = None, - before_gates: Optional[list["_models.GateConfiguration"]] = None, - after_gates: Optional[list["_models.GateConfiguration"]] = None, + before_gates: Optional[List["_models.GateConfiguration"]] = None, + after_gates: Optional[List["_models.GateConfiguration"]] = None, **kwargs: Any ) -> None: """ @@ -2972,9 +3286,9 @@ def __init__(self, **kwargs: Any) -> None: self.status: Optional["_models.UpdateStatus"] = None self.name: Optional[str] = None self.max_concurrency: Optional[int] = None - self.members: Optional[list["_models.MemberUpdateStatus"]] = None - self.before_gates: Optional[list["_models.UpdateRunGateStatus"]] = None - self.after_gates: Optional[list["_models.UpdateRunGateStatus"]] = None + self.members: Optional[List["_models.MemberUpdateStatus"]] = None + self.before_gates: Optional[List["_models.UpdateRunGateStatus"]] = None + self.after_gates: Optional[List["_models.UpdateRunGateStatus"]] = None class UpdateRun(ProxyResource): @@ -3211,7 +3525,7 @@ class UpdateRunListResult(_serialization.Model): "next_link": {"key": "nextLink", "type": "str"}, } - def __init__(self, *, value: list["_models.UpdateRun"], next_link: Optional[str] = None, **kwargs: Any) -> None: + def __init__(self, *, value: List["_models.UpdateRun"], next_link: Optional[str] = None, **kwargs: Any) -> None: """ :keyword value: The UpdateRun items on this page. Required. :paramtype value: list[~azure.mgmt.containerservicefleet.models.UpdateRun] @@ -3255,7 +3569,7 @@ def __init__(self, **kwargs: Any) -> None: """ """ super().__init__(**kwargs) self.status: Optional["_models.UpdateStatus"] = None - self.stages: Optional[list["_models.UpdateStageStatus"]] = None + self.stages: Optional[List["_models.UpdateStageStatus"]] = None self.node_image_selection: Optional["_models.NodeImageSelectionStatus"] = None @@ -3282,7 +3596,7 @@ class UpdateRunStrategy(_serialization.Model): "stages": {"key": "stages", "type": "[UpdateStage]"}, } - def __init__(self, *, stages: list["_models.UpdateStage"], **kwargs: Any) -> None: + def __init__(self, *, stages: List["_models.UpdateStage"], **kwargs: Any) -> None: """ :keyword stages: The list of stages that compose this update run. Min size: 1. Required. :paramtype stages: list[~azure.mgmt.containerservicefleet.models.UpdateStage] @@ -3346,11 +3660,11 @@ def __init__( self, *, name: str, - groups: Optional[list["_models.UpdateGroup"]] = None, + groups: Optional[List["_models.UpdateGroup"]] = None, after_stage_wait_in_seconds: Optional[int] = None, max_concurrency: Optional[str] = None, - before_gates: Optional[list["_models.GateConfiguration"]] = None, - after_gates: Optional[list["_models.GateConfiguration"]] = None, + before_gates: Optional[List["_models.GateConfiguration"]] = None, + after_gates: Optional[List["_models.GateConfiguration"]] = None, **kwargs: Any ) -> None: """ @@ -3441,9 +3755,9 @@ def __init__(self, **kwargs: Any) -> None: self.status: Optional["_models.UpdateStatus"] = None self.name: Optional[str] = None self.max_concurrency: Optional[int] = None - self.groups: Optional[list["_models.UpdateGroupStatus"]] = None - self.before_gates: Optional[list["_models.UpdateRunGateStatus"]] = None - self.after_gates: Optional[list["_models.UpdateRunGateStatus"]] = None + self.groups: Optional[List["_models.UpdateGroupStatus"]] = None + self.before_gates: Optional[List["_models.UpdateRunGateStatus"]] = None + self.after_gates: Optional[List["_models.UpdateRunGateStatus"]] = None self.after_stage_wait_status: Optional["_models.WaitStatus"] = None diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_patch.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_patch.py index 87676c65a8f..8bcb627aa47 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_patch.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_patch.py @@ -7,9 +7,9 @@ Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python/customize """ +from typing import List - -__all__: list[str] = [] # Add all objects you want publicly available to users at this package level +__all__: List[str] = [] # Add all objects you want publicly available to users at this package level def patch_sdk(): diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/__init__.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/__init__.py index 8b7809a8595..557bb51eb14 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/__init__.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/__init__.py @@ -16,6 +16,7 @@ from ._fleets_operations import FleetsOperations # type: ignore from ._auto_upgrade_profiles_operations import AutoUpgradeProfilesOperations # type: ignore from ._auto_upgrade_profile_operations_operations import AutoUpgradeProfileOperationsOperations # type: ignore +from ._cluster_mesh_profiles_operations import ClusterMeshProfilesOperations # type: ignore from ._gates_operations import GatesOperations # type: ignore from ._fleet_managed_namespaces_operations import FleetManagedNamespacesOperations # type: ignore from ._fleet_members_operations import FleetMembersOperations # type: ignore @@ -31,6 +32,7 @@ "FleetsOperations", "AutoUpgradeProfilesOperations", "AutoUpgradeProfileOperationsOperations", + "ClusterMeshProfilesOperations", "GatesOperations", "FleetManagedNamespacesOperations", "FleetMembersOperations", diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_auto_upgrade_profile_operations_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_auto_upgrade_profile_operations_operations.py index 376b0c7c5dd..ba766359afd 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_auto_upgrade_profile_operations_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_auto_upgrade_profile_operations_operations.py @@ -7,7 +7,7 @@ # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- from collections.abc import MutableMapping -from typing import Any, Callable, Iterator, Optional, TypeVar, Union, cast +from typing import Any, Callable, Dict, Iterator, Optional, TypeVar, Union, cast from azure.core import PipelineClient from azure.core.exceptions import ( @@ -30,11 +30,10 @@ from .. import models as _models from .._configuration import ContainerServiceFleetMgmtClientConfiguration -from .._utils.serialization import Deserializer, Serializer +from .._serialization import Deserializer, Serializer T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] _SERIALIZER = Serializer() _SERIALIZER.client_side_validation = False @@ -46,7 +45,7 @@ def build_generate_update_run_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -95,7 +94,7 @@ class AutoUpgradeProfileOperationsOperations: models = _models - def __init__(self, *args, **kwargs) -> None: + def __init__(self, *args, **kwargs): input_args = list(args) self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") self._config: ContainerServiceFleetMgmtClientConfiguration = ( @@ -146,10 +145,7 @@ def _generate_update_run_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_auto_upgrade_profiles_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_auto_upgrade_profiles_operations.py index d02a5f1ddce..286a531896e 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_auto_upgrade_profiles_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_auto_upgrade_profiles_operations.py @@ -8,7 +8,7 @@ # -------------------------------------------------------------------------- from collections.abc import MutableMapping from io import IOBase -from typing import Any, Callable, IO, Iterator, Optional, TypeVar, Union, cast, overload +from typing import Any, Callable, Dict, IO, Iterable, Iterator, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import PipelineClient @@ -33,11 +33,10 @@ from .. import models as _models from .._configuration import ContainerServiceFleetMgmtClientConfiguration -from .._utils.serialization import Deserializer, Serializer +from .._serialization import Deserializer, Serializer T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] _SERIALIZER = Serializer() _SERIALIZER.client_side_validation = False @@ -55,7 +54,7 @@ def build_list_by_fleet_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -94,7 +93,7 @@ def build_get_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -144,7 +143,7 @@ def build_create_or_update_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) accept = _headers.pop("Accept", "application/json") @@ -200,7 +199,7 @@ def build_delete_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -251,7 +250,7 @@ class AutoUpgradeProfilesOperations: models = _models - def __init__(self, *args, **kwargs) -> None: + def __init__(self, *args, **kwargs): input_args = list(args) self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") self._config: ContainerServiceFleetMgmtClientConfiguration = ( @@ -268,7 +267,7 @@ def list_by_fleet( top: Optional[int] = None, skip_token: Optional[str] = None, **kwargs: Any - ) -> ItemPaged["_models.AutoUpgradeProfile"]: + ) -> Iterable["_models.AutoUpgradeProfile"]: """List AutoUpgradeProfile resources by Fleet. :param resource_group_name: The name of the resource group. The name is case insensitive. @@ -350,10 +349,7 @@ def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -411,10 +407,7 @@ def get( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("AutoUpgradeProfile", pipeline_response.http_response) @@ -487,10 +480,7 @@ def _create_or_update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -722,10 +712,7 @@ def _delete_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_cluster_mesh_profiles_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_cluster_mesh_profiles_operations.py new file mode 100644 index 00000000000..7e9da95e545 --- /dev/null +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_cluster_mesh_profiles_operations.py @@ -0,0 +1,961 @@ +# pylint: disable=line-too-long,useless-suppression +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is regenerated. +# -------------------------------------------------------------------------- +from collections.abc import MutableMapping +from io import IOBase +from typing import Any, Callable, Dict, IO, Iterable, Iterator, Optional, TypeVar, Union, cast, overload +import urllib.parse + +from azure.core import PipelineClient +from azure.core.exceptions import ( + ClientAuthenticationError, + HttpResponseError, + ResourceExistsError, + ResourceNotFoundError, + ResourceNotModifiedError, + StreamClosedError, + StreamConsumedError, + map_error, +) +from azure.core.paging import ItemPaged +from azure.core.pipeline import PipelineResponse +from azure.core.polling import LROPoller, NoPolling, PollingMethod +from azure.core.rest import HttpRequest, HttpResponse +from azure.core.tracing.decorator import distributed_trace +from azure.core.utils import case_insensitive_dict +from azure.mgmt.core.exceptions import ARMErrorFormat +from azure.mgmt.core.polling.arm_polling import ARMPolling + +from .. import models as _models +from .._configuration import ContainerServiceFleetMgmtClientConfiguration +from .._serialization import Deserializer, Serializer + +T = TypeVar("T") +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] + +_SERIALIZER = Serializer() +_SERIALIZER.client_side_validation = False + + +def build_list_by_fleet_request( + resource_group_name: str, fleet_name: str, subscription_id: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = kwargs.pop( + "template_url", + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ContainerService/fleets/{fleetName}/clusterMeshProfiles", + ) + path_format_arguments = { + "subscriptionId": _SERIALIZER.url("subscription_id", subscription_id, "str"), + "resourceGroupName": _SERIALIZER.url( + "resource_group_name", resource_group_name, "str", max_length=90, min_length=1 + ), + "fleetName": _SERIALIZER.url( + "fleet_name", fleet_name, "str", max_length=63, min_length=1, pattern=r"^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" + ), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_get_request( + resource_group_name: str, fleet_name: str, cluster_mesh_profile_name: str, subscription_id: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = kwargs.pop( + "template_url", + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ContainerService/fleets/{fleetName}/clusterMeshProfiles/{clusterMeshProfileName}", + ) + path_format_arguments = { + "subscriptionId": _SERIALIZER.url("subscription_id", subscription_id, "str"), + "resourceGroupName": _SERIALIZER.url( + "resource_group_name", resource_group_name, "str", max_length=90, min_length=1 + ), + "fleetName": _SERIALIZER.url( + "fleet_name", fleet_name, "str", max_length=63, min_length=1, pattern=r"^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" + ), + "clusterMeshProfileName": _SERIALIZER.url( + "cluster_mesh_profile_name", + cluster_mesh_profile_name, + "str", + max_length=63, + min_length=1, + pattern=r"^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", + ), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_create_or_update_request( + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + subscription_id: str, + *, + if_match: Optional[str] = None, + if_none_match: Optional[str] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = kwargs.pop( + "template_url", + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ContainerService/fleets/{fleetName}/clusterMeshProfiles/{clusterMeshProfileName}", + ) + path_format_arguments = { + "subscriptionId": _SERIALIZER.url("subscription_id", subscription_id, "str"), + "resourceGroupName": _SERIALIZER.url( + "resource_group_name", resource_group_name, "str", max_length=90, min_length=1 + ), + "fleetName": _SERIALIZER.url( + "fleet_name", fleet_name, "str", max_length=63, min_length=1, pattern=r"^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" + ), + "clusterMeshProfileName": _SERIALIZER.url( + "cluster_mesh_profile_name", + cluster_mesh_profile_name, + "str", + max_length=63, + min_length=1, + pattern=r"^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", + ), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if if_match is not None: + _headers["If-Match"] = _SERIALIZER.header("if_match", if_match, "str") + if if_none_match is not None: + _headers["If-None-Match"] = _SERIALIZER.header("if_none_match", if_none_match, "str") + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="PUT", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_delete_request( + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + subscription_id: str, + *, + if_match: Optional[str] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = kwargs.pop( + "template_url", + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ContainerService/fleets/{fleetName}/clusterMeshProfiles/{clusterMeshProfileName}", + ) + path_format_arguments = { + "subscriptionId": _SERIALIZER.url("subscription_id", subscription_id, "str"), + "resourceGroupName": _SERIALIZER.url( + "resource_group_name", resource_group_name, "str", max_length=90, min_length=1 + ), + "fleetName": _SERIALIZER.url( + "fleet_name", fleet_name, "str", max_length=63, min_length=1, pattern=r"^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" + ), + "clusterMeshProfileName": _SERIALIZER.url( + "cluster_mesh_profile_name", + cluster_mesh_profile_name, + "str", + max_length=63, + min_length=1, + pattern=r"^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", + ), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if if_match is not None: + _headers["If-Match"] = _SERIALIZER.header("if_match", if_match, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) + + +def build_apply_request( + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + subscription_id: str, + *, + if_match: Optional[str] = None, + **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = kwargs.pop( + "template_url", + "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ContainerService/fleets/{fleetName}/clusterMeshProfiles/{clusterMeshProfileName}/apply", + ) + path_format_arguments = { + "subscriptionId": _SERIALIZER.url("subscription_id", subscription_id, "str"), + "resourceGroupName": _SERIALIZER.url( + "resource_group_name", resource_group_name, "str", max_length=90, min_length=1 + ), + "fleetName": _SERIALIZER.url( + "fleet_name", fleet_name, "str", max_length=63, min_length=1, pattern=r"^[a-z0-9]([-a-z0-9]*[a-z0-9])?$" + ), + "clusterMeshProfileName": _SERIALIZER.url( + "cluster_mesh_profile_name", + cluster_mesh_profile_name, + "str", + max_length=63, + min_length=1, + pattern=r"^[a-z0-9]([-a-z0-9]*[a-z0-9])?$", + ), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + if if_match is not None: + _headers["If-Match"] = _SERIALIZER.header("if_match", if_match, "str") + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + + +class ClusterMeshProfilesOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + + Instead, you should access the following operations through + :class:`~azure.mgmt.containerservicefleet.ContainerServiceFleetMgmtClient`'s + :attr:`cluster_mesh_profiles` attribute. + """ + + models = _models + + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: ContainerServiceFleetMgmtClientConfiguration = ( + input_args.pop(0) if input_args else kwargs.pop("config") + ) + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def list_by_fleet( + self, resource_group_name: str, fleet_name: str, **kwargs: Any + ) -> Iterable["_models.ClusterMeshProfile"]: + """List ClusterMeshProfile resources by Fleet. + + :param resource_group_name: The name of the resource group. The name is case insensitive. + Required. + :type resource_group_name: str + :param fleet_name: The name of the Fleet resource. Required. + :type fleet_name: str + :return: An iterator like instance of either ClusterMeshProfile or the result of cls(response) + :rtype: + ~azure.core.paging.ItemPaged[~azure.mgmt.containerservicefleet.models.ClusterMeshProfile] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + cls: ClsType[_models.ClusterMeshProfileListResult] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_list_by_fleet_request( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + subscription_id=self._config.subscription_id, + api_version=api_version, + headers=_headers, + params=_params, + ) + _request.url = self._client.format_url(_request.url) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + _request.url = self._client.format_url(_request.url) + _request.method = "GET" + return _request + + def extract_data(pipeline_response): + deserialized = self._deserialize("ClusterMeshProfileListResult", pipeline_response) + list_of_elem = deserialized.value + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.next_link or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) + raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + @distributed_trace + def get( + self, resource_group_name: str, fleet_name: str, cluster_mesh_profile_name: str, **kwargs: Any + ) -> _models.ClusterMeshProfile: + """Get a ClusterMeshProfile. + + :param resource_group_name: The name of the resource group. The name is case insensitive. + Required. + :type resource_group_name: str + :param fleet_name: The name of the Fleet resource. Required. + :type fleet_name: str + :param cluster_mesh_profile_name: The name of the ClusterMeshProfile resource. Required. + :type cluster_mesh_profile_name: str + :return: ClusterMeshProfile or the result of cls(response) + :rtype: ~azure.mgmt.containerservicefleet.models.ClusterMeshProfile + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + cls: ClsType[_models.ClusterMeshProfile] = kwargs.pop("cls", None) + + _request = build_get_request( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + cluster_mesh_profile_name=cluster_mesh_profile_name, + subscription_id=self._config.subscription_id, + api_version=api_version, + headers=_headers, + params=_params, + ) + _request.url = self._client.format_url(_request.url) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) + raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) + + deserialized = self._deserialize("ClusterMeshProfile", pipeline_response.http_response) + + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + + return deserialized # type: ignore + + def _create_or_update_initial( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + resource: Union[_models.ClusterMeshProfile, IO[bytes]], + if_match: Optional[str] = None, + if_none_match: Optional[str] = None, + **kwargs: Any + ) -> Iterator[bytes]: + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[Iterator[bytes]] = kwargs.pop("cls", None) + + content_type = content_type or "application/json" + _json = None + _content = None + if isinstance(resource, (IOBase, bytes)): + _content = resource + else: + _json = self._serialize.body(resource, "ClusterMeshProfile") + + _request = build_create_or_update_request( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + cluster_mesh_profile_name=cluster_mesh_profile_name, + subscription_id=self._config.subscription_id, + if_match=if_match, + if_none_match=if_none_match, + api_version=api_version, + content_type=content_type, + json=_json, + content=_content, + headers=_headers, + params=_params, + ) + _request.url = self._client.format_url(_request.url) + + _decompress = kwargs.pop("decompress", True) + _stream = True + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200, 201]: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) + raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) + + response_headers = {} + if response.status_code == 201: + response_headers["Retry-After"] = self._deserialize("int", response.headers.get("Retry-After")) + + deserialized = response.stream_download(self._client._pipeline, decompress=_decompress) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @overload + def begin_create_or_update( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + resource: _models.ClusterMeshProfile, + if_match: Optional[str] = None, + if_none_match: Optional[str] = None, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> LROPoller[_models.ClusterMeshProfile]: + """Create a ClusterMeshProfile. + + :param resource_group_name: The name of the resource group. The name is case insensitive. + Required. + :type resource_group_name: str + :param fleet_name: The name of the Fleet resource. Required. + :type fleet_name: str + :param cluster_mesh_profile_name: The name of the ClusterMeshProfile resource. Required. + :type cluster_mesh_profile_name: str + :param resource: Resource create parameters. Required. + :type resource: ~azure.mgmt.containerservicefleet.models.ClusterMeshProfile + :param if_match: The request should only proceed if an entity matches this string. Default + value is None. + :type if_match: str + :param if_none_match: The request should only proceed if no entity matches this string. Default + value is None. + :type if_none_match: str + :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. + Default value is "application/json". + :paramtype content_type: str + :return: An instance of LROPoller that returns either ClusterMeshProfile or the result of + cls(response) + :rtype: + ~azure.core.polling.LROPoller[~azure.mgmt.containerservicefleet.models.ClusterMeshProfile] + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @overload + def begin_create_or_update( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + resource: IO[bytes], + if_match: Optional[str] = None, + if_none_match: Optional[str] = None, + *, + content_type: str = "application/json", + **kwargs: Any + ) -> LROPoller[_models.ClusterMeshProfile]: + """Create a ClusterMeshProfile. + + :param resource_group_name: The name of the resource group. The name is case insensitive. + Required. + :type resource_group_name: str + :param fleet_name: The name of the Fleet resource. Required. + :type fleet_name: str + :param cluster_mesh_profile_name: The name of the ClusterMeshProfile resource. Required. + :type cluster_mesh_profile_name: str + :param resource: Resource create parameters. Required. + :type resource: IO[bytes] + :param if_match: The request should only proceed if an entity matches this string. Default + value is None. + :type if_match: str + :param if_none_match: The request should only proceed if no entity matches this string. Default + value is None. + :type if_none_match: str + :keyword content_type: Body Parameter content-type. Content type parameter for binary body. + Default value is "application/json". + :paramtype content_type: str + :return: An instance of LROPoller that returns either ClusterMeshProfile or the result of + cls(response) + :rtype: + ~azure.core.polling.LROPoller[~azure.mgmt.containerservicefleet.models.ClusterMeshProfile] + :raises ~azure.core.exceptions.HttpResponseError: + """ + + @distributed_trace + def begin_create_or_update( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + resource: Union[_models.ClusterMeshProfile, IO[bytes]], + if_match: Optional[str] = None, + if_none_match: Optional[str] = None, + **kwargs: Any + ) -> LROPoller[_models.ClusterMeshProfile]: + """Create a ClusterMeshProfile. + + :param resource_group_name: The name of the resource group. The name is case insensitive. + Required. + :type resource_group_name: str + :param fleet_name: The name of the Fleet resource. Required. + :type fleet_name: str + :param cluster_mesh_profile_name: The name of the ClusterMeshProfile resource. Required. + :type cluster_mesh_profile_name: str + :param resource: Resource create parameters. Is either a ClusterMeshProfile type or a IO[bytes] + type. Required. + :type resource: ~azure.mgmt.containerservicefleet.models.ClusterMeshProfile or IO[bytes] + :param if_match: The request should only proceed if an entity matches this string. Default + value is None. + :type if_match: str + :param if_none_match: The request should only proceed if no entity matches this string. Default + value is None. + :type if_none_match: str + :return: An instance of LROPoller that returns either ClusterMeshProfile or the result of + cls(response) + :rtype: + ~azure.core.polling.LROPoller[~azure.mgmt.containerservicefleet.models.ClusterMeshProfile] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.ClusterMeshProfile] = kwargs.pop("cls", None) + polling: Union[bool, PollingMethod] = kwargs.pop("polling", True) + lro_delay = kwargs.pop("polling_interval", self._config.polling_interval) + cont_token: Optional[str] = kwargs.pop("continuation_token", None) + if cont_token is None: + raw_result = self._create_or_update_initial( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + cluster_mesh_profile_name=cluster_mesh_profile_name, + resource=resource, + if_match=if_match, + if_none_match=if_none_match, + api_version=api_version, + content_type=content_type, + cls=lambda x, y, z: x, + headers=_headers, + params=_params, + **kwargs + ) + raw_result.http_response.read() # type: ignore + kwargs.pop("error_map", None) + + def get_long_running_output(pipeline_response): + deserialized = self._deserialize("ClusterMeshProfile", pipeline_response.http_response) + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + return deserialized + + if polling is True: + polling_method: PollingMethod = cast( + PollingMethod, ARMPolling(lro_delay, lro_options={"final-state-via": "original-uri"}, **kwargs) + ) + elif polling is False: + polling_method = cast(PollingMethod, NoPolling()) + else: + polling_method = polling + if cont_token: + return LROPoller[_models.ClusterMeshProfile].from_continuation_token( + polling_method=polling_method, + continuation_token=cont_token, + client=self._client, + deserialization_callback=get_long_running_output, + ) + return LROPoller[_models.ClusterMeshProfile]( + self._client, raw_result, get_long_running_output, polling_method # type: ignore + ) + + def _delete_initial( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + if_match: Optional[str] = None, + **kwargs: Any + ) -> Iterator[bytes]: + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + cls: ClsType[Iterator[bytes]] = kwargs.pop("cls", None) + + _request = build_delete_request( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + cluster_mesh_profile_name=cluster_mesh_profile_name, + subscription_id=self._config.subscription_id, + if_match=if_match, + api_version=api_version, + headers=_headers, + params=_params, + ) + _request.url = self._client.format_url(_request.url) + + _decompress = kwargs.pop("decompress", True) + _stream = True + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [202, 204]: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) + raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) + + response_headers = {} + if response.status_code == 202: + response_headers["Location"] = self._deserialize("str", response.headers.get("Location")) + response_headers["Retry-After"] = self._deserialize("int", response.headers.get("Retry-After")) + + deserialized = response.stream_download(self._client._pipeline, decompress=_decompress) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + def begin_delete( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + if_match: Optional[str] = None, + **kwargs: Any + ) -> LROPoller[None]: + """Delete a ClusterMeshProfile. + + :param resource_group_name: The name of the resource group. The name is case insensitive. + Required. + :type resource_group_name: str + :param fleet_name: The name of the Fleet resource. Required. + :type fleet_name: str + :param cluster_mesh_profile_name: The name of the ClusterMeshProfile resource. Required. + :type cluster_mesh_profile_name: str + :param if_match: The request should only proceed if an entity matches this string. Default + value is None. + :type if_match: str + :return: An instance of LROPoller that returns either None or the result of cls(response) + :rtype: ~azure.core.polling.LROPoller[None] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + cls: ClsType[None] = kwargs.pop("cls", None) + polling: Union[bool, PollingMethod] = kwargs.pop("polling", True) + lro_delay = kwargs.pop("polling_interval", self._config.polling_interval) + cont_token: Optional[str] = kwargs.pop("continuation_token", None) + if cont_token is None: + raw_result = self._delete_initial( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + cluster_mesh_profile_name=cluster_mesh_profile_name, + if_match=if_match, + api_version=api_version, + cls=lambda x, y, z: x, + headers=_headers, + params=_params, + **kwargs + ) + raw_result.http_response.read() # type: ignore + kwargs.pop("error_map", None) + + def get_long_running_output(pipeline_response): # pylint: disable=inconsistent-return-statements + if cls: + return cls(pipeline_response, None, {}) # type: ignore + + if polling is True: + polling_method: PollingMethod = cast( + PollingMethod, ARMPolling(lro_delay, lro_options={"final-state-via": "location"}, **kwargs) + ) + elif polling is False: + polling_method = cast(PollingMethod, NoPolling()) + else: + polling_method = polling + if cont_token: + return LROPoller[None].from_continuation_token( + polling_method=polling_method, + continuation_token=cont_token, + client=self._client, + deserialization_callback=get_long_running_output, + ) + return LROPoller[None](self._client, raw_result, get_long_running_output, polling_method) # type: ignore + + def _apply_initial( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + if_match: Optional[str] = None, + **kwargs: Any + ) -> Iterator[bytes]: + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + cls: ClsType[Iterator[bytes]] = kwargs.pop("cls", None) + + _request = build_apply_request( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + cluster_mesh_profile_name=cluster_mesh_profile_name, + subscription_id=self._config.subscription_id, + if_match=if_match, + api_version=api_version, + headers=_headers, + params=_params, + ) + _request.url = self._client.format_url(_request.url) + + _decompress = kwargs.pop("decompress", True) + _stream = True + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200, 202]: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) + raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) + + response_headers = {} + if response.status_code == 202: + response_headers["Location"] = self._deserialize("str", response.headers.get("Location")) + response_headers["Retry-After"] = self._deserialize("int", response.headers.get("Retry-After")) + + deserialized = response.stream_download(self._client._pipeline, decompress=_decompress) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + + @distributed_trace + def begin_apply( + self, + resource_group_name: str, + fleet_name: str, + cluster_mesh_profile_name: str, + if_match: Optional[str] = None, + **kwargs: Any + ) -> LROPoller[_models.ClusterMeshProfile]: + """Applies the cluster mesh profile to selected fleet members. + + :param resource_group_name: The name of the resource group. The name is case insensitive. + Required. + :type resource_group_name: str + :param fleet_name: The name of the Fleet resource. Required. + :type fleet_name: str + :param cluster_mesh_profile_name: The name of the ClusterMeshProfile resource. Required. + :type cluster_mesh_profile_name: str + :param if_match: The request should only proceed if an entity matches this string. Default + value is None. + :type if_match: str + :return: An instance of LROPoller that returns either ClusterMeshProfile or the result of + cls(response) + :rtype: + ~azure.core.polling.LROPoller[~azure.mgmt.containerservicefleet.models.ClusterMeshProfile] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._config.api_version)) + cls: ClsType[_models.ClusterMeshProfile] = kwargs.pop("cls", None) + polling: Union[bool, PollingMethod] = kwargs.pop("polling", True) + lro_delay = kwargs.pop("polling_interval", self._config.polling_interval) + cont_token: Optional[str] = kwargs.pop("continuation_token", None) + if cont_token is None: + raw_result = self._apply_initial( + resource_group_name=resource_group_name, + fleet_name=fleet_name, + cluster_mesh_profile_name=cluster_mesh_profile_name, + if_match=if_match, + api_version=api_version, + cls=lambda x, y, z: x, + headers=_headers, + params=_params, + **kwargs + ) + raw_result.http_response.read() # type: ignore + kwargs.pop("error_map", None) + + def get_long_running_output(pipeline_response): + deserialized = self._deserialize("ClusterMeshProfile", pipeline_response.http_response) + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore + return deserialized + + if polling is True: + polling_method: PollingMethod = cast( + PollingMethod, ARMPolling(lro_delay, lro_options={"final-state-via": "location"}, **kwargs) + ) + elif polling is False: + polling_method = cast(PollingMethod, NoPolling()) + else: + polling_method = polling + if cont_token: + return LROPoller[_models.ClusterMeshProfile].from_continuation_token( + polling_method=polling_method, + continuation_token=cont_token, + client=self._client, + deserialization_callback=get_long_running_output, + ) + return LROPoller[_models.ClusterMeshProfile]( + self._client, raw_result, get_long_running_output, polling_method # type: ignore + ) diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_managed_namespaces_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_managed_namespaces_operations.py index 383c5009117..b8070caed4c 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_managed_namespaces_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_managed_namespaces_operations.py @@ -8,7 +8,7 @@ # -------------------------------------------------------------------------- from collections.abc import MutableMapping from io import IOBase -from typing import Any, Callable, IO, Iterator, Optional, TypeVar, Union, cast, overload +from typing import Any, Callable, Dict, IO, Iterable, Iterator, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import PipelineClient @@ -33,11 +33,10 @@ from .. import models as _models from .._configuration import ContainerServiceFleetMgmtClientConfiguration -from .._utils.serialization import Deserializer, Serializer +from .._serialization import Deserializer, Serializer T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] _SERIALIZER = Serializer() _SERIALIZER.client_side_validation = False @@ -49,7 +48,7 @@ def build_list_by_fleet_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -84,7 +83,7 @@ def build_get_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -134,7 +133,7 @@ def build_create_or_update_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) accept = _headers.pop("Accept", "application/json") @@ -190,7 +189,7 @@ def build_update_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) accept = _headers.pop("Accept", "application/json") @@ -244,7 +243,7 @@ def build_delete_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -295,7 +294,7 @@ class FleetManagedNamespacesOperations: models = _models - def __init__(self, *args, **kwargs) -> None: + def __init__(self, *args, **kwargs): input_args = list(args) self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") self._config: ContainerServiceFleetMgmtClientConfiguration = ( @@ -307,7 +306,7 @@ def __init__(self, *args, **kwargs) -> None: @distributed_trace def list_by_fleet( self, resource_group_name: str, fleet_name: str, **kwargs: Any - ) -> ItemPaged["_models.FleetManagedNamespace"]: + ) -> Iterable["_models.FleetManagedNamespace"]: """List FleetManagedNamespace resources by Fleet. :param resource_group_name: The name of the resource group. The name is case insensitive. @@ -383,10 +382,7 @@ def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -444,10 +440,7 @@ def get( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("FleetManagedNamespace", pipeline_response.http_response) @@ -520,10 +513,7 @@ def _create_or_update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -768,10 +758,7 @@ def _update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -989,10 +976,7 @@ def _delete_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_members_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_members_operations.py index 5392ee5ecd1..19f39ec11e3 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_members_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_members_operations.py @@ -8,7 +8,7 @@ # -------------------------------------------------------------------------- from collections.abc import MutableMapping from io import IOBase -from typing import Any, Callable, IO, Iterator, Optional, TypeVar, Union, cast, overload +from typing import Any, Callable, Dict, IO, Iterable, Iterator, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import PipelineClient @@ -33,11 +33,10 @@ from .. import models as _models from .._configuration import ContainerServiceFleetMgmtClientConfiguration -from .._utils.serialization import Deserializer, Serializer +from .._serialization import Deserializer, Serializer T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] _SERIALIZER = Serializer() _SERIALIZER.client_side_validation = False @@ -56,7 +55,7 @@ def build_list_by_fleet_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -97,7 +96,7 @@ def build_get_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -147,7 +146,7 @@ def build_create_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) accept = _headers.pop("Accept", "application/json") @@ -203,7 +202,7 @@ def build_update_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) accept = _headers.pop("Accept", "application/json") @@ -257,7 +256,7 @@ def build_delete_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -308,7 +307,7 @@ class FleetMembersOperations: models = _models - def __init__(self, *args, **kwargs) -> None: + def __init__(self, *args, **kwargs): input_args = list(args) self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") self._config: ContainerServiceFleetMgmtClientConfiguration = ( @@ -326,7 +325,7 @@ def list_by_fleet( skip_token: Optional[str] = None, filter: Optional[str] = None, **kwargs: Any - ) -> ItemPaged["_models.FleetMember"]: + ) -> Iterable["_models.FleetMember"]: """List FleetMember resources by Fleet. :param resource_group_name: The name of the resource group. The name is case insensitive. @@ -410,10 +409,7 @@ def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -471,10 +467,7 @@ def get( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("FleetMember", pipeline_response.http_response) @@ -547,10 +540,7 @@ def _create_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -789,10 +779,7 @@ def _update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -1006,10 +993,7 @@ def _delete_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_update_strategies_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_update_strategies_operations.py index c74f050c43b..63fc471713d 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_update_strategies_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_update_strategies_operations.py @@ -8,7 +8,7 @@ # -------------------------------------------------------------------------- from collections.abc import MutableMapping from io import IOBase -from typing import Any, Callable, IO, Iterator, Optional, TypeVar, Union, cast, overload +from typing import Any, Callable, Dict, IO, Iterable, Iterator, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import PipelineClient @@ -33,11 +33,10 @@ from .. import models as _models from .._configuration import ContainerServiceFleetMgmtClientConfiguration -from .._utils.serialization import Deserializer, Serializer +from .._serialization import Deserializer, Serializer T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] _SERIALIZER = Serializer() _SERIALIZER.client_side_validation = False @@ -55,7 +54,7 @@ def build_list_by_fleet_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -94,7 +93,7 @@ def build_get_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -144,7 +143,7 @@ def build_create_or_update_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) accept = _headers.pop("Accept", "application/json") @@ -200,7 +199,7 @@ def build_delete_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -251,7 +250,7 @@ class FleetUpdateStrategiesOperations: models = _models - def __init__(self, *args, **kwargs) -> None: + def __init__(self, *args, **kwargs): input_args = list(args) self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") self._config: ContainerServiceFleetMgmtClientConfiguration = ( @@ -268,7 +267,7 @@ def list_by_fleet( top: Optional[int] = None, skip_token: Optional[str] = None, **kwargs: Any - ) -> ItemPaged["_models.FleetUpdateStrategy"]: + ) -> Iterable["_models.FleetUpdateStrategy"]: """List FleetUpdateStrategy resources by Fleet. :param resource_group_name: The name of the resource group. The name is case insensitive. @@ -350,10 +349,7 @@ def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -411,10 +407,7 @@ def get( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("FleetUpdateStrategy", pipeline_response.http_response) @@ -487,10 +480,7 @@ def _create_or_update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -719,10 +709,7 @@ def _delete_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleets_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleets_operations.py index 0dad4737d44..2c1c2597909 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleets_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleets_operations.py @@ -8,7 +8,7 @@ # -------------------------------------------------------------------------- from collections.abc import MutableMapping from io import IOBase -from typing import Any, Callable, IO, Iterator, Optional, TypeVar, Union, cast, overload +from typing import Any, Callable, Dict, IO, Iterable, Iterator, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import PipelineClient @@ -33,11 +33,10 @@ from .. import models as _models from .._configuration import ContainerServiceFleetMgmtClientConfiguration -from .._utils.serialization import Deserializer, Serializer +from .._serialization import Deserializer, Serializer T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] _SERIALIZER = Serializer() _SERIALIZER.client_side_validation = False @@ -49,7 +48,7 @@ def build_list_by_subscription_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -77,7 +76,7 @@ def build_list_by_resource_group_request(resource_group_name: str, subscription_ _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -107,7 +106,7 @@ def build_get_request(resource_group_name: str, fleet_name: str, subscription_id _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -148,7 +147,7 @@ def build_create_or_update_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) accept = _headers.pop("Accept", "application/json") @@ -190,7 +189,7 @@ def build_update_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) accept = _headers.pop("Accept", "application/json") @@ -230,7 +229,7 @@ def build_delete_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -267,7 +266,7 @@ def build_list_credentials_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -308,7 +307,7 @@ class FleetsOperations: models = _models - def __init__(self, *args, **kwargs) -> None: + def __init__(self, *args, **kwargs): input_args = list(args) self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") self._config: ContainerServiceFleetMgmtClientConfiguration = ( @@ -320,7 +319,7 @@ def __init__(self, *args, **kwargs) -> None: @distributed_trace def list_by_subscription( self, top: Optional[int] = None, skip_token: Optional[str] = None, **kwargs: Any - ) -> ItemPaged["_models.Fleet"]: + ) -> Iterable["_models.Fleet"]: """Lists fleets in the specified subscription. :param top: The number of result items to return. Default value is None. @@ -394,10 +393,7 @@ def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -405,7 +401,7 @@ def get_next(next_link=None): return ItemPaged(get_next, extract_data) @distributed_trace - def list_by_resource_group(self, resource_group_name: str, **kwargs: Any) -> ItemPaged["_models.Fleet"]: + def list_by_resource_group(self, resource_group_name: str, **kwargs: Any) -> Iterable["_models.Fleet"]: """Lists fleets in the specified subscription and resource group. :param resource_group_name: The name of the resource group. The name is case insensitive. @@ -476,10 +472,7 @@ def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -532,10 +525,7 @@ def get(self, resource_group_name: str, fleet_name: str, **kwargs: Any) -> _mode if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("Fleet", pipeline_response.http_response) @@ -606,10 +596,7 @@ def _create_or_update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -833,10 +820,7 @@ def _update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -1031,10 +1015,7 @@ def _delete_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -1158,10 +1139,7 @@ def list_credentials( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("FleetCredentialResults", pipeline_response.http_response) diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_gates_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_gates_operations.py index 067abb9f7c1..4cc3a669566 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_gates_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_gates_operations.py @@ -8,7 +8,7 @@ # -------------------------------------------------------------------------- from collections.abc import MutableMapping from io import IOBase -from typing import Any, Callable, IO, Iterator, Optional, TypeVar, Union, cast, overload +from typing import Any, Callable, Dict, IO, Iterable, Iterator, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import PipelineClient @@ -33,11 +33,10 @@ from .. import models as _models from .._configuration import ContainerServiceFleetMgmtClientConfiguration -from .._utils.serialization import Deserializer, Serializer +from .._serialization import Deserializer, Serializer T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] _SERIALIZER = Serializer() _SERIALIZER.client_side_validation = False @@ -56,7 +55,7 @@ def build_list_by_fleet_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -97,7 +96,7 @@ def build_get_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -147,7 +146,7 @@ def build_update_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) accept = _headers.pop("Accept", "application/json") @@ -203,7 +202,7 @@ class GatesOperations: models = _models - def __init__(self, *args, **kwargs) -> None: + def __init__(self, *args, **kwargs): input_args = list(args) self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") self._config: ContainerServiceFleetMgmtClientConfiguration = ( @@ -221,7 +220,7 @@ def list_by_fleet( top: Optional[int] = None, skip_token: Optional[str] = None, **kwargs: Any - ) -> ItemPaged["_models.Gate"]: + ) -> Iterable["_models.Gate"]: """List Gate resources by Fleet. :param resource_group_name: The name of the resource group. The name is case insensitive. @@ -305,10 +304,7 @@ def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -364,10 +360,7 @@ def get(self, resource_group_name: str, fleet_name: str, gate_name: str, **kwarg if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("Gate", pipeline_response.http_response) @@ -440,10 +433,7 @@ def _update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_operations.py index 106fe128d32..381dd424759 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_operations.py @@ -6,7 +6,7 @@ # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- from collections.abc import MutableMapping -from typing import Any, Callable, Optional, TypeVar +from typing import Any, Callable, Dict, Iterable, Optional, TypeVar import urllib.parse from azure.core import PipelineClient @@ -27,11 +27,10 @@ from .. import models as _models from .._configuration import ContainerServiceFleetMgmtClientConfiguration -from .._utils.serialization import Deserializer, Serializer +from .._serialization import Deserializer, Serializer T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] _SERIALIZER = Serializer() _SERIALIZER.client_side_validation = False @@ -41,7 +40,7 @@ def build_list_request(**kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -68,7 +67,7 @@ class Operations: models = _models - def __init__(self, *args, **kwargs) -> None: + def __init__(self, *args, **kwargs): input_args = list(args) self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") self._config: ContainerServiceFleetMgmtClientConfiguration = ( @@ -78,7 +77,7 @@ def __init__(self, *args, **kwargs) -> None: self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") @distributed_trace - def list(self, **kwargs: Any) -> ItemPaged["_models.Operation"]: + def list(self, **kwargs: Any) -> Iterable["_models.Operation"]: """List the operations for the provider. :return: An iterator like instance of either Operation or the result of cls(response) @@ -144,10 +143,7 @@ def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_patch.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_patch.py index 87676c65a8f..8bcb627aa47 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_patch.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_patch.py @@ -7,9 +7,9 @@ Follow our quickstart for examples: https://aka.ms/azsdk/python/dpcodegen/python/customize """ +from typing import List - -__all__: list[str] = [] # Add all objects you want publicly available to users at this package level +__all__: List[str] = [] # Add all objects you want publicly available to users at this package level def patch_sdk(): diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_update_runs_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_update_runs_operations.py index ac9db52c15d..f027a4bd1b0 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_update_runs_operations.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_update_runs_operations.py @@ -8,7 +8,7 @@ # -------------------------------------------------------------------------- from collections.abc import MutableMapping from io import IOBase -from typing import Any, Callable, IO, Iterator, Optional, TypeVar, Union, cast, overload +from typing import Any, Callable, Dict, IO, Iterable, Iterator, Optional, TypeVar, Union, cast, overload import urllib.parse from azure.core import PipelineClient @@ -33,11 +33,10 @@ from .. import models as _models from .._configuration import ContainerServiceFleetMgmtClientConfiguration -from .._utils.serialization import Deserializer, Serializer +from .._serialization import Deserializer, Serializer T = TypeVar("T") -ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, dict[str, Any]], Any]] -List = list +ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] _SERIALIZER = Serializer() _SERIALIZER.client_side_validation = False @@ -55,7 +54,7 @@ def build_list_by_fleet_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -94,7 +93,7 @@ def build_get_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -144,7 +143,7 @@ def build_create_or_update_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) accept = _headers.pop("Accept", "application/json") @@ -200,7 +199,7 @@ def build_delete_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -251,7 +250,7 @@ def build_skip_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) accept = _headers.pop("Accept", "application/json") @@ -305,7 +304,7 @@ def build_start_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -356,7 +355,7 @@ def build_stop_request( _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-02-01-preview")) + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2026-03-02-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL @@ -407,7 +406,7 @@ class UpdateRunsOperations: models = _models - def __init__(self, *args, **kwargs) -> None: + def __init__(self, *args, **kwargs): input_args = list(args) self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") self._config: ContainerServiceFleetMgmtClientConfiguration = ( @@ -424,7 +423,7 @@ def list_by_fleet( top: Optional[int] = None, skip_token: Optional[str] = None, **kwargs: Any - ) -> ItemPaged["_models.UpdateRun"]: + ) -> Iterable["_models.UpdateRun"]: """List UpdateRun resources by Fleet. :param resource_group_name: The name of the resource group. The name is case insensitive. @@ -505,10 +504,7 @@ def get_next(next_link=None): if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) return pipeline_response @@ -564,10 +560,7 @@ def get(self, resource_group_name: str, fleet_name: str, update_run_name: str, * if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) deserialized = self._deserialize("UpdateRun", pipeline_response.http_response) @@ -640,10 +633,7 @@ def _create_or_update_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -866,10 +856,7 @@ def _delete_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -1014,10 +1001,7 @@ def _skip_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -1228,10 +1212,7 @@ def _start_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} @@ -1367,10 +1348,7 @@ def _stop_initial( except (StreamConsumedError, StreamClosedError): pass map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize.failsafe_deserialize( - _models.ErrorResponse, - pipeline_response, - ) + error = self._deserialize.failsafe_deserialize(_models.ErrorResponse, pipeline_response) raise HttpResponseError(response=response, model=error, error_format=ARMErrorFormat) response_headers = {} From 26a86918642670c852ffc50f3411e1444265a0d8 Mon Sep 17 00:00:00 2001 From: frantran Date: Tue, 3 Mar 2026 14:22:51 -0800 Subject: [PATCH 3/5] rename folder to 2026-03-02-preview --- .../{v2026_02_01_preview => v2026_03_02_preview}/__init__.py | 0 .../_configuration.py | 0 .../_container_service_fleet_mgmt_client.py | 0 .../{v2026_02_01_preview => v2026_03_02_preview}/_patch.py | 0 .../_serialization.py | 0 .../_utils/__init__.py | 0 .../_utils/serialization.py | 0 .../{v2026_02_01_preview => v2026_03_02_preview}/_version.py | 0 .../{v2026_02_01_preview => v2026_03_02_preview}/aio/__init__.py | 0 .../aio/_configuration.py | 0 .../aio/_container_service_fleet_mgmt_client.py | 0 .../{v2026_02_01_preview => v2026_03_02_preview}/aio/_patch.py | 0 .../aio/operations/__init__.py | 0 .../aio/operations/_auto_upgrade_profile_operations_operations.py | 0 .../aio/operations/_auto_upgrade_profiles_operations.py | 0 .../aio/operations/_cluster_mesh_profiles_operations.py | 0 .../aio/operations/_fleet_managed_namespaces_operations.py | 0 .../aio/operations/_fleet_members_operations.py | 0 .../aio/operations/_fleet_update_strategies_operations.py | 0 .../aio/operations/_fleets_operations.py | 0 .../aio/operations/_gates_operations.py | 0 .../aio/operations/_operations.py | 0 .../aio/operations/_patch.py | 0 .../aio/operations/_update_runs_operations.py | 0 .../models/__init__.py | 0 .../models/_container_service_fleet_mgmt_client_enums.py | 0 .../models/_models_py3.py | 0 .../{v2026_02_01_preview => v2026_03_02_preview}/models/_patch.py | 0 .../operations/__init__.py | 0 .../operations/_auto_upgrade_profile_operations_operations.py | 0 .../operations/_auto_upgrade_profiles_operations.py | 0 .../operations/_cluster_mesh_profiles_operations.py | 0 .../operations/_fleet_managed_namespaces_operations.py | 0 .../operations/_fleet_members_operations.py | 0 .../operations/_fleet_update_strategies_operations.py | 0 .../operations/_fleets_operations.py | 0 .../operations/_gates_operations.py | 0 .../operations/_operations.py | 0 .../operations/_patch.py | 0 .../operations/_update_runs_operations.py | 0 .../{v2026_02_01_preview => v2026_03_02_preview}/py.typed | 0 41 files changed, 0 insertions(+), 0 deletions(-) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/__init__.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/_configuration.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/_container_service_fleet_mgmt_client.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/_patch.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/_serialization.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/_utils/__init__.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/_utils/serialization.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/_version.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/__init__.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/_configuration.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/_container_service_fleet_mgmt_client.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/_patch.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/operations/__init__.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/operations/_auto_upgrade_profile_operations_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/operations/_auto_upgrade_profiles_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/operations/_cluster_mesh_profiles_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/operations/_fleet_managed_namespaces_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/operations/_fleet_members_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/operations/_fleet_update_strategies_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/operations/_fleets_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/operations/_gates_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/operations/_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/operations/_patch.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/aio/operations/_update_runs_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/models/__init__.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/models/_container_service_fleet_mgmt_client_enums.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/models/_models_py3.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/models/_patch.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/operations/__init__.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/operations/_auto_upgrade_profile_operations_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/operations/_auto_upgrade_profiles_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/operations/_cluster_mesh_profiles_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/operations/_fleet_managed_namespaces_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/operations/_fleet_members_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/operations/_fleet_update_strategies_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/operations/_fleets_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/operations/_gates_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/operations/_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/operations/_patch.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/operations/_update_runs_operations.py (100%) rename src/fleet/azext_fleet/vendored_sdks/{v2026_02_01_preview => v2026_03_02_preview}/py.typed (100%) diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/__init__.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/__init__.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/__init__.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/__init__.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_configuration.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_configuration.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_configuration.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_configuration.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_container_service_fleet_mgmt_client.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_container_service_fleet_mgmt_client.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_container_service_fleet_mgmt_client.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_container_service_fleet_mgmt_client.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_patch.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_patch.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_patch.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_patch.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_serialization.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_serialization.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_serialization.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_serialization.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_utils/__init__.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_utils/__init__.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_utils/__init__.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_utils/__init__.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_utils/serialization.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_utils/serialization.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_utils/serialization.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_utils/serialization.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_version.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_version.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/_version.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_version.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/__init__.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/__init__.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/__init__.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/__init__.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_configuration.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/_configuration.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_configuration.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/_configuration.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_container_service_fleet_mgmt_client.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/_container_service_fleet_mgmt_client.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_container_service_fleet_mgmt_client.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/_container_service_fleet_mgmt_client.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_patch.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/_patch.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/_patch.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/_patch.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/__init__.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/__init__.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/__init__.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/__init__.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_auto_upgrade_profile_operations_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_auto_upgrade_profile_operations_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_auto_upgrade_profile_operations_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_auto_upgrade_profile_operations_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_auto_upgrade_profiles_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_auto_upgrade_profiles_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_auto_upgrade_profiles_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_auto_upgrade_profiles_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_cluster_mesh_profiles_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_cluster_mesh_profiles_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_cluster_mesh_profiles_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_cluster_mesh_profiles_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_managed_namespaces_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_fleet_managed_namespaces_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_managed_namespaces_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_fleet_managed_namespaces_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_members_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_fleet_members_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_members_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_fleet_members_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_update_strategies_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_fleet_update_strategies_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleet_update_strategies_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_fleet_update_strategies_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleets_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_fleets_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_fleets_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_fleets_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_gates_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_gates_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_gates_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_gates_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_patch.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_patch.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_patch.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_patch.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_update_runs_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_update_runs_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/aio/operations/_update_runs_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/operations/_update_runs_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/__init__.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/models/__init__.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/__init__.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/models/__init__.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_container_service_fleet_mgmt_client_enums.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/models/_container_service_fleet_mgmt_client_enums.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_container_service_fleet_mgmt_client_enums.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/models/_container_service_fleet_mgmt_client_enums.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_models_py3.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/models/_models_py3.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_models_py3.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/models/_models_py3.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_patch.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/models/_patch.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/models/_patch.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/models/_patch.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/__init__.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/__init__.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/__init__.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/__init__.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_auto_upgrade_profile_operations_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_auto_upgrade_profile_operations_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_auto_upgrade_profile_operations_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_auto_upgrade_profile_operations_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_auto_upgrade_profiles_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_auto_upgrade_profiles_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_auto_upgrade_profiles_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_auto_upgrade_profiles_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_cluster_mesh_profiles_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_cluster_mesh_profiles_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_cluster_mesh_profiles_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_cluster_mesh_profiles_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_managed_namespaces_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_fleet_managed_namespaces_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_managed_namespaces_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_fleet_managed_namespaces_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_members_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_fleet_members_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_members_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_fleet_members_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_update_strategies_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_fleet_update_strategies_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleet_update_strategies_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_fleet_update_strategies_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleets_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_fleets_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_fleets_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_fleets_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_gates_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_gates_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_gates_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_gates_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_patch.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_patch.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_patch.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_patch.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_update_runs_operations.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_update_runs_operations.py similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/operations/_update_runs_operations.py rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/operations/_update_runs_operations.py diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/py.typed b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/py.typed similarity index 100% rename from src/fleet/azext_fleet/vendored_sdks/v2026_02_01_preview/py.typed rename to src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/py.typed From bcdb32f7f442553c351677261e2332c7ffc8cbea Mon Sep 17 00:00:00 2001 From: frantran Date: Sun, 8 Mar 2026 16:01:17 -0700 Subject: [PATCH 4/5] add more cli changes/updates --- src/fleet/HISTORY.rst | 6 +- src/fleet/azext_fleet/__init__.py | 4 +- src/fleet/azext_fleet/_client_factory.py | 16 +- src/fleet/azext_fleet/_help.py | 68 ++++++++ src/fleet/azext_fleet/_params.py | 21 +++ src/fleet/azext_fleet/commands.py | 18 +- src/fleet/azext_fleet/custom.py | 162 +++++++++++++++++- .../tests/latest/test_stages_json.py | 2 +- .../azext_fleet/vendored_sdks/__init__.py | 11 +- .../v2026_03_02_preview/_configuration.py | 2 +- .../v2026_03_02_preview/aio/_configuration.py | 2 +- .../_container_service_fleet_mgmt_client.py | 2 +- src/fleet/setup.py | 2 +- 13 files changed, 298 insertions(+), 18 deletions(-) diff --git a/src/fleet/HISTORY.rst b/src/fleet/HISTORY.rst index fd354aa666f..d65a8922193 100644 --- a/src/fleet/HISTORY.rst +++ b/src/fleet/HISTORY.rst @@ -176,4 +176,8 @@ Release History 1.9.0 ++++++ -* Add 2026-02-01-preview API Version with UpdateRun MaxConcurrency support. Add fix for ControlPlaneOnly upgrade type requiring no node image selection. \ No newline at end of file +* Add 2026-02-01-preview API Version with UpdateRun MaxConcurrency support. Add fix for ControlPlaneOnly upgrade type requiring no node image selection. + +2.0.0 +++++++ +* Add 2026-03-02-preview API version with ClusterMesh support. \ No newline at end of file diff --git a/src/fleet/azext_fleet/__init__.py b/src/fleet/azext_fleet/__init__.py index 6426327310b..5e4830edcaa 100644 --- a/src/fleet/azext_fleet/__init__.py +++ b/src/fleet/azext_fleet/__init__.py @@ -4,7 +4,7 @@ # -------------------------------------------------------------------------------------------- from azure.cli.core import AzCommandsLoader -from azure.cli.core.profiles import register_resource_type, SDKProfile +from azure.cli.core.profiles import register_resource_type # pylint: disable=unused-import from azext_fleet._help import helps @@ -15,7 +15,7 @@ def register_fleet_resource_type(): register_resource_type( "latest", CUSTOM_MGMT_FLEET, - SDKProfile("2026-02-01-preview"), + None, ) diff --git a/src/fleet/azext_fleet/_client_factory.py b/src/fleet/azext_fleet/_client_factory.py index eac3ef71413..ff936226173 100644 --- a/src/fleet/azext_fleet/_client_factory.py +++ b/src/fleet/azext_fleet/_client_factory.py @@ -14,9 +14,19 @@ CUSTOM_MGMT_FLEET = CustomResourceType('azext_fleet.vendored_sdks', 'ContainerServiceFleetMgmtClient') +# TODO: Remove this override once the API version is rolled out to production ARM. +# During preview, this API version is only available in the centraluseuap environment. +FLEET_BASE_URL = "https://centraluseuap.management.azure.com" + + # container service clients def get_container_service_client(cli_ctx, subscription_id=None): - return get_mgmt_service_client(cli_ctx, CUSTOM_MGMT_FLEET, subscription_id=subscription_id) + return get_mgmt_service_client( + cli_ctx, CUSTOM_MGMT_FLEET, + subscription_id=subscription_id, + base_url_bound=False, + base_url=FLEET_BASE_URL + ) def cf_fleets(cli_ctx, *_): @@ -56,6 +66,10 @@ def cf_auto_upgrade_profile_operations(cli_ctx, *_): return get_container_service_client(cli_ctx).auto_upgrade_profile_operations +def cf_cluster_mesh_profiles(cli_ctx, *_): + return get_container_service_client(cli_ctx).cluster_mesh_profiles + + def get_provider_client(cli_ctx): return get_mgmt_service_client( cli_ctx, ResourceType.MGMT_RESOURCE_RESOURCES) diff --git a/src/fleet/azext_fleet/_help.py b/src/fleet/azext_fleet/_help.py index e4ae468f269..5038d4a6670 100644 --- a/src/fleet/azext_fleet/_help.py +++ b/src/fleet/azext_fleet/_help.py @@ -145,6 +145,8 @@ examples: - name: List all members for a given fleet. text: az fleet member list -g MyFleetResourceGroup -f MyFleetName + - name: List members filtered by a cluster mesh profile. + text: az fleet member list -g MyFleetResourceGroup -f MyFleetName --cluster-mesh-profile MyClusterMeshProfile """ helps['fleet member show'] = """ @@ -584,3 +586,69 @@ - name: Save kubeconfig to a specific file. text: az fleet namespace get-credentials -g MyFleetResourceGroup -f MyFleetName -n MyManagedNamespace --file ~/my-namespace-config """ + +helps['fleet clustermeshprofile'] = """ + type: group + short-summary: Commands to manage cluster mesh profiles. +""" + +helps['fleet clustermeshprofile create'] = """ + type: command + short-summary: Creates or updates a cluster mesh profile. + parameters: + - name: --member-selector --selector + type: string + short-summary: "Kubernetes-style label selector for selecting Fleet members, e.g. 'env=production'." + examples: + - name: Create a cluster mesh profile with a label selector. + text: az fleet clustermeshprofile create -g MyFleetResourceGroup -f MyFleetName -n MyClusterMeshProfile --selector "env=production" + - name: Create a cluster mesh profile without a selector (no members selected initially). + text: az fleet clustermeshprofile create -g MyFleetResourceGroup -f MyFleetName -n MyClusterMeshProfile +""" + +helps['fleet clustermeshprofile show'] = """ + type: command + short-summary: Gets a cluster mesh profile. + examples: + - name: Show the details of a cluster mesh profile. + text: az fleet clustermeshprofile show -g MyFleetResourceGroup -f MyFleetName -n MyClusterMeshProfile +""" + +helps['fleet clustermeshprofile list'] = """ + type: command + short-summary: Lists all cluster mesh profiles for a fleet. + examples: + - name: List all cluster mesh profiles for a given fleet. + text: az fleet clustermeshprofile list -g MyFleetResourceGroup -f MyFleetName +""" + +helps['fleet clustermeshprofile delete'] = """ + type: command + short-summary: Deletes a cluster mesh profile. + examples: + - name: Delete a specific cluster mesh profile. + text: az fleet clustermeshprofile delete -g MyFleetResourceGroup -f MyFleetName -n MyClusterMeshProfile +""" + +helps['fleet clustermeshprofile apply'] = """ + type: command + short-summary: Applies the cluster mesh profile to selected fleet members. + examples: + - name: Apply a cluster mesh profile. + text: az fleet clustermeshprofile apply -g MyFleetResourceGroup -f MyFleetName -n MyClusterMeshProfile + - name: Preview what changes would be made without actually applying. + text: az fleet clustermeshprofile apply -g MyFleetResourceGroup -f MyFleetName -n MyClusterMeshProfile --what-if --output table +""" + +helps['fleet clustermeshprofile list-members'] = """ + type: command + short-summary: Lists fleet members for a cluster mesh profile. + long-summary: | + Without --selector, lists members currently applied to the mesh profile. + With --selector, lists members that would match the profile's label selector (i.e. candidates for the next apply). + examples: + - name: List members currently applied to the mesh. + text: az fleet clustermeshprofile list-members -g MyFleetResourceGroup -f MyFleetName -n MyClusterMeshProfile + - name: List members that would match the profile's selector. + text: az fleet clustermeshprofile list-members -g MyFleetResourceGroup -f MyFleetName -n MyClusterMeshProfile --selector +""" diff --git a/src/fleet/azext_fleet/_params.py b/src/fleet/azext_fleet/_params.py index daa1ac25e35..a9eb87e2333 100644 --- a/src/fleet/azext_fleet/_params.py +++ b/src/fleet/azext_fleet/_params.py @@ -90,6 +90,10 @@ def load_arguments(self, _): help='Space-separated labels in key=value format. Example: env=production region=us-west team=devops' ) + with self.argument_context('fleet member list') as c: + c.argument('cluster_mesh_profile', options_list=['--cluster-mesh-profile'], + help='Filter members by cluster mesh profile name.') + with self.argument_context('fleet updaterun') as c: c.argument('name', options_list=['--name', '-n'], help='Specify name for the update run.') c.argument('fleet_name', options_list=['--fleet-name', '-f'], help='Specify the fleet name.') @@ -207,3 +211,20 @@ def load_arguments(self, _): c.argument('overwrite_existing', help='Overwrite any existing cluster entry with the same name.') c.argument('path', options_list=['--file'], type=file_type, completer=FilesCompleter(), default=os.path.join(os.path.expanduser('~'), '.kube', 'config')) + + with self.argument_context('fleet clustermeshprofile') as c: + c.argument('name', options_list=['--name', '-n'], help='Specify name for the cluster mesh profile.') + c.argument('fleet_name', options_list=['--fleet-name', '-f'], help='Specify the fleet name.') + + with self.argument_context('fleet clustermeshprofile create') as c: + c.argument('member_selector', options_list=['--member-selector', '--selector'], + help='Kubernetes-style label selector for selecting Fleet members, e.g. "env=production".') + + with self.argument_context('fleet clustermeshprofile apply') as c: + c.argument('what_if', action='store_true', options_list=['--what-if'], + help='Show what changes would be made by the apply operation without actually performing it.') + + with self.argument_context('fleet clustermeshprofile list-members') as c: + c.argument('selector', action='store_true', options_list=['--selector'], + help='Filter by the profile\'s label selector (members that would match after apply) ' + 'instead of currently applied members.') diff --git a/src/fleet/azext_fleet/commands.py b/src/fleet/azext_fleet/commands.py index 8ef6ba34a1c..73cb14ccbc7 100644 --- a/src/fleet/azext_fleet/commands.py +++ b/src/fleet/azext_fleet/commands.py @@ -13,7 +13,8 @@ cf_auto_upgrade_profiles, cf_auto_upgrade_profile_operations, cf_gates, - cf_fleet_managed_namespaces + cf_fleet_managed_namespaces, + cf_cluster_mesh_profiles ) @@ -67,6 +68,12 @@ def load_command_table(self, _): client_factory=cf_gates ) + cluster_mesh_profiles_sdk = CliCommandType( + operations_tmpl="azext_fleet.vendored_sdks.operations._cluster_mesh_profiles_operations#ClusterMeshProfilesOperations.{}", + operation_group="cluster_mesh_profiles", + client_factory=cf_cluster_mesh_profiles + ) + # fleets command group with self.command_group("fleet", fleets_sdk, client_factory=cf_fleets) as g: g.custom_command("create", "create_fleet", supports_no_wait=True) @@ -135,3 +142,12 @@ def load_command_table(self, _): g.custom_show_command("show", "show_managed_namespace") g.custom_command("get-credentials", "get_namespace_credentials") g.wait_command("wait") + + # cluster mesh profiles command group + with self.command_group("fleet clustermeshprofile", cluster_mesh_profiles_sdk, client_factory=cf_cluster_mesh_profiles, is_preview=True) as g: + g.custom_command("create", "create_cluster_mesh_profile", supports_no_wait=True) + g.custom_show_command("show", "show_cluster_mesh_profile") + g.custom_command("list", "list_cluster_mesh_profiles") + g.custom_command("delete", "delete_cluster_mesh_profile", supports_no_wait=True, confirmation=True) + g.custom_command("apply", "apply_cluster_mesh_profile", supports_no_wait=True) + g.custom_command("list-members", "list_cluster_mesh_profile_members") diff --git a/src/fleet/azext_fleet/custom.py b/src/fleet/azext_fleet/custom.py index bc9eff420f1..dd63e2efda3 100644 --- a/src/fleet/azext_fleet/custom.py +++ b/src/fleet/azext_fleet/custom.py @@ -30,13 +30,13 @@ from azext_fleet.constants import SUPPORTED_GATE_STATES_FILTERS from azext_fleet.constants import SUPPORTED_GATE_STATES_PATCH from azext_fleet.constants import FLEET_1P_APP_ID -from azext_fleet.vendored_sdks.v2026_02_01_preview.models import ( +from azext_fleet.vendored_sdks.v2026_03_02_preview.models import ( PropagationPolicy, PlacementProfile, PlacementV1ClusterResourcePlacementSpec, PlacementV1PlacementPolicy, PropagationType, - PlacementType + PlacementType, ) logger = get_logger(__name__) @@ -381,8 +381,12 @@ def update_fleet_member(cmd, def list_fleet_member(cmd, # pylint: disable=unused-argument client, resource_group_name, - fleet_name): - return client.list_by_fleet(resource_group_name, fleet_name) + fleet_name, + cluster_mesh_profile=None): + filter_expr = None + if cluster_mesh_profile: + filter_expr = f"clusterMeshProfile eq {cluster_mesh_profile}" + return client.list_by_fleet(resource_group_name, fleet_name, filter=filter_expr) def show_fleet_member(cmd, # pylint: disable=unused-argument @@ -1066,3 +1070,153 @@ def get_namespace_credentials(cmd, # Apply kubelogin conversion to the final file after namespace modification _convert_kubeconfig_to_azurecli(path) + + +def create_cluster_mesh_profile(cmd, + client, + resource_group_name, + fleet_name, + name, + member_selector=None, + no_wait=False): + cluster_mesh_profile_model = cmd.get_models( + "ClusterMeshProfile", + resource_type=CUSTOM_MGMT_FLEET, + operation_group="cluster_mesh_profiles" + ) + cluster_mesh_profile_properties_model = cmd.get_models( + "ClusterMeshProfileProperties", + resource_type=CUSTOM_MGMT_FLEET, + operation_group="cluster_mesh_profiles" + ) + member_selector_model = cmd.get_models( + "MemberSelector", + resource_type=CUSTOM_MGMT_FLEET, + operation_group="cluster_mesh_profiles" + ) + + selector = None + if member_selector is not None: + selector = member_selector_model(by_label=member_selector) + + properties = cluster_mesh_profile_properties_model(member_selector=selector) + profile = cluster_mesh_profile_model(properties=properties) + + return sdk_no_wait( + no_wait, + client.begin_create_or_update, + resource_group_name, + fleet_name, + name, + profile + ) + + +def show_cluster_mesh_profile(cmd, # pylint: disable=unused-argument + client, + resource_group_name, + fleet_name, + name): + return client.get(resource_group_name, fleet_name, name) + + +def list_cluster_mesh_profiles(cmd, # pylint: disable=unused-argument + client, + resource_group_name, + fleet_name): + return client.list_by_fleet(resource_group_name, fleet_name) + + +def delete_cluster_mesh_profile(cmd, # pylint: disable=unused-argument + client, + resource_group_name, + fleet_name, + name, + no_wait=False): + return sdk_no_wait(no_wait, client.begin_delete, resource_group_name, fleet_name, name) + + +def apply_cluster_mesh_profile(cmd, + client, + resource_group_name, + fleet_name, + name, + what_if=False, + no_wait=False): + if what_if: + return _apply_cluster_mesh_what_if(cmd, resource_group_name, fleet_name, name) + + return sdk_no_wait(no_wait, client.begin_apply, resource_group_name, fleet_name, name) + + +def list_cluster_mesh_profile_members(cmd, + client, # pylint: disable=unused-argument + resource_group_name, + fleet_name, + name, + selector=False): + """List fleet members for a cluster mesh profile. + + Modes: + --name cmp-1 members currently applied to the mesh + (server-side: $filter=clusterMeshProfile eq cmp-1) + --name cmp-1 --selector members matching the profile's label selector + (server-side: $filter=clusterMeshProfile.Selector eq cmp-1) + """ + members_client = cf_fleet_members(cmd.cli_ctx) + if selector: + filter_expr = f"clusterMeshProfile.Selector eq {name}" + else: + filter_expr = f"clusterMeshProfile eq {name}" + return members_client.list_by_fleet(resource_group_name, fleet_name, filter=filter_expr) + + +def _apply_cluster_mesh_what_if(cmd, resource_group_name, fleet_name, name): + """Simulate apply by comparing currently-applied members vs selector-matched members.""" + members_client = cf_fleet_members(cmd.cli_ctx) + + # Members currently in the mesh (already applied) + current_filter = f"clusterMeshProfile eq {name}" + current_members = { + m.name: m for m in members_client.list_by_fleet( + resource_group_name, fleet_name, filter=current_filter + ) + } + + # Members that match the selector (would be in the mesh after apply) + selector_filter = f"clusterMeshProfile.Selector eq {name}" + desired_members = { + m.name: m for m in members_client.list_by_fleet( + resource_group_name, fleet_name, filter=selector_filter + ) + } + + results = [] + all_names = set(current_members.keys()) | set(desired_members.keys()) + + for member_name in sorted(all_names): + in_current = member_name in current_members + in_desired = member_name in desired_members + + member = desired_members.get(member_name) or current_members.get(member_name) + + mesh_state = None + if member.mesh_properties and member.mesh_properties.status: + mesh_state = member.mesh_properties.status.state + + if in_desired and not in_current: + action = "Add" + elif in_current and not in_desired: + action = "Remove" + else: + action = "-" + + results.append({ + "ClusterResourceId": member.cluster_resource_id, + "ETag": member.e_tag, + "Name": member.name, + "Action": action, + "MeshMembershipState": mesh_state or "-" + }) + + return results diff --git a/src/fleet/azext_fleet/tests/latest/test_stages_json.py b/src/fleet/azext_fleet/tests/latest/test_stages_json.py index 2a53578e5ed..f4afe64dd89 100644 --- a/src/fleet/azext_fleet/tests/latest/test_stages_json.py +++ b/src/fleet/azext_fleet/tests/latest/test_stages_json.py @@ -9,7 +9,7 @@ import os from unittest.mock import MagicMock, patch from azext_fleet.custom import get_update_run_strategy -from azext_fleet.vendored_sdks.v2026_02_01_preview.models import UpdateRunStrategy, UpdateStage, UpdateGroup +from azext_fleet.vendored_sdks.v2026_03_02_preview.models import UpdateRunStrategy, UpdateStage, UpdateGroup from azure.cli.core.azclierror import ( InvalidArgumentValueError, ) diff --git a/src/fleet/azext_fleet/vendored_sdks/__init__.py b/src/fleet/azext_fleet/vendored_sdks/__init__.py index 1479200c773..695c0f3f3fe 100644 --- a/src/fleet/azext_fleet/vendored_sdks/__init__.py +++ b/src/fleet/azext_fleet/vendored_sdks/__init__.py @@ -6,12 +6,15 @@ import sys -from .v2026_02_01_preview import ContainerServiceFleetMgmtClient -from .v2026_02_01_preview import operations as _operations +from .v2026_03_02_preview import ContainerServiceFleetMgmtClient +from .v2026_03_02_preview import models as _models +from .v2026_03_02_preview import operations as _operations -# Register the versioned operations package under the short alias so that +# Register the versioned sub-packages under short aliases so that # import paths like "azext_fleet.vendored_sdks.operations._fleets_operations" -# resolve without embedding the API version string everywhere. +# and model resolution via cmd.get_models() both work without embedding the +# API version string everywhere. +sys.modules[__name__ + ".models"] = _models sys.modules[__name__ + ".operations"] = _operations __all__ = ["ContainerServiceFleetMgmtClient"] diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_configuration.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_configuration.py index 5b8c65814cf..fdd6b640a9e 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_configuration.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/_configuration.py @@ -43,7 +43,7 @@ def __init__(self, credential: "TokenCredential", subscription_id: str, **kwargs self.credential = credential self.subscription_id = subscription_id self.api_version = api_version - self.credential_scopes = kwargs.pop("credential_scopes", ["https://management.azure.com/.default"]) + self.credential_scopes = kwargs.pop("credential_scopes", ["https://centraluseuap.management.azure.com/.default"]) kwargs.setdefault("sdk_moniker", "mgmt-containerservicefleet/{}".format(VERSION)) self.polling_interval = kwargs.get("polling_interval", 30) self._configure(**kwargs) diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/_configuration.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/_configuration.py index 897d5b1f13a..9ceb2a2bf21 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/_configuration.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/_configuration.py @@ -43,7 +43,7 @@ def __init__(self, credential: "AsyncTokenCredential", subscription_id: str, **k self.credential = credential self.subscription_id = subscription_id self.api_version = api_version - self.credential_scopes = kwargs.pop("credential_scopes", ["https://management.azure.com/.default"]) + self.credential_scopes = kwargs.pop("credential_scopes", ["https://centraluseuap.management.azure.com/.default"]) kwargs.setdefault("sdk_moniker", "mgmt-containerservicefleet/{}".format(VERSION)) self.polling_interval = kwargs.get("polling_interval", 30) self._configure(**kwargs) diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/_container_service_fleet_mgmt_client.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/_container_service_fleet_mgmt_client.py index 63e8099310c..e4b042dd527 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/_container_service_fleet_mgmt_client.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/aio/_container_service_fleet_mgmt_client.py @@ -80,7 +80,7 @@ def __init__( self, credential: "AsyncTokenCredential", subscription_id: str, - base_url: str = "https://management.azure.com", + base_url: str = "https://centraluseuap.management.azure.com", **kwargs: Any ) -> None: self._config = ContainerServiceFleetMgmtClientConfiguration( diff --git a/src/fleet/setup.py b/src/fleet/setup.py index 33b0b18f6a9..f8d4ae3d4e8 100644 --- a/src/fleet/setup.py +++ b/src/fleet/setup.py @@ -16,7 +16,7 @@ # TODO: Confirm this is the right version number you want and it matches your # HISTORY.rst entry. -VERSION = '1.9.0' +VERSION = '2.0.0' # The full list of classifiers is available at # https://pypi.python.org/pypi?%3Aaction=list_classifiers From 8cbacc5ac5ea85b3c5f880eecee14f6857ef5574 Mon Sep 17 00:00:00 2001 From: frantran Date: Tue, 10 Mar 2026 11:15:47 -0700 Subject: [PATCH 5/5] update typespec changes, address feedback --- src/fleet/azext_fleet/_help.py | 4 ++-- src/fleet/azext_fleet/_params.py | 2 +- .../v2026_03_02_preview/models/_models_py3.py | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/fleet/azext_fleet/_help.py b/src/fleet/azext_fleet/_help.py index 5038d4a6670..6fa4db0def8 100644 --- a/src/fleet/azext_fleet/_help.py +++ b/src/fleet/azext_fleet/_help.py @@ -596,7 +596,7 @@ type: command short-summary: Creates or updates a cluster mesh profile. parameters: - - name: --member-selector --selector + - name: --member-selector --selector -s type: string short-summary: "Kubernetes-style label selector for selecting Fleet members, e.g. 'env=production'." examples: @@ -624,7 +624,7 @@ helps['fleet clustermeshprofile delete'] = """ type: command - short-summary: Deletes a cluster mesh profile. + short-summary: Deletes a cluster mesh profile. All members must be removed from the cluster mesh profile before it can be deleted. examples: - name: Delete a specific cluster mesh profile. text: az fleet clustermeshprofile delete -g MyFleetResourceGroup -f MyFleetName -n MyClusterMeshProfile diff --git a/src/fleet/azext_fleet/_params.py b/src/fleet/azext_fleet/_params.py index a9eb87e2333..daff1570016 100644 --- a/src/fleet/azext_fleet/_params.py +++ b/src/fleet/azext_fleet/_params.py @@ -217,7 +217,7 @@ def load_arguments(self, _): c.argument('fleet_name', options_list=['--fleet-name', '-f'], help='Specify the fleet name.') with self.argument_context('fleet clustermeshprofile create') as c: - c.argument('member_selector', options_list=['--member-selector', '--selector'], + c.argument('member_selector', options_list=['--member-selector', '--selector', '-s'], help='Kubernetes-style label selector for selecting Fleet members, e.g. "env=production".') with self.argument_context('fleet clustermeshprofile apply') as c: diff --git a/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/models/_models_py3.py b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/models/_models_py3.py index f52a5002999..e6722d5db31 100644 --- a/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/models/_models_py3.py +++ b/src/fleet/azext_fleet/vendored_sdks/v2026_03_02_preview/models/_models_py3.py @@ -581,9 +581,9 @@ class ClusterMeshProfileStatus(_serialization.Model): :ivar state: The state of the cluster mesh. Required. Known values are: "NotConnected", "Connecting", "Connected", and "Failed". :vartype state: str or ~azure.mgmt.containerservicefleet.models.ClusterMeshState - :ivar last_applied_member_label_selector: The last applied Kubernetes-style label selector - defining which Fleet members are in the mesh, e.g. ``env=production``. - :vartype last_applied_member_label_selector: str + :ivar last_applied_member_selector: The last applied MemberSelector for the cluster mesh + profile. + :vartype last_applied_member_selector: ~azure.mgmt.containerservicefleet.models.MemberSelector :ivar last_operation_id: The last operation ID for the cluster mesh profile. :vartype last_operation_id: str :ivar last_operation_error: The last operation error of the cluster mesh profile. @@ -592,14 +592,14 @@ class ClusterMeshProfileStatus(_serialization.Model): _validation = { "state": {"required": True, "readonly": True}, - "last_applied_member_label_selector": {"readonly": True, "max_length": 512}, + "last_applied_member_selector": {"readonly": True}, "last_operation_id": {"readonly": True}, "last_operation_error": {"readonly": True}, } _attribute_map = { "state": {"key": "state", "type": "str"}, - "last_applied_member_label_selector": {"key": "lastAppliedMemberLabelSelector", "type": "str"}, + "last_applied_member_selector": {"key": "lastAppliedMemberSelector", "type": "MemberSelector"}, "last_operation_id": {"key": "lastOperationId", "type": "str"}, "last_operation_error": {"key": "lastOperationError", "type": "ErrorDetail"}, } @@ -608,7 +608,7 @@ def __init__(self, **kwargs: Any) -> None: """ """ super().__init__(**kwargs) self.state: Optional[Union[str, "_models.ClusterMeshState"]] = None - self.last_applied_member_label_selector: Optional[str] = None + self.last_applied_member_selector: Optional["_models.MemberSelector"] = None self.last_operation_id: Optional[str] = None self.last_operation_error: Optional["_models.ErrorDetail"] = None