|
| 1 | +# Azure-mgmt-compute SDK 升级总结 (Upgrade Summary) |
| 2 | + |
| 3 | +## 概述 (Overview) |
| 4 | + |
| 5 | +本次升级将 `azure-mgmt-compute` SDK 从版本 **34.1.0** 升级到 **37.0.1**,以支持最新的 Azure Compute API 功能。 |
| 6 | + |
| 7 | +This upgrade updates the `azure-mgmt-compute` SDK from version **34.1.0** to **37.0.1** to support the latest Azure Compute API features. |
| 8 | + |
| 9 | +## 重大变更 (Breaking Changes) |
| 10 | + |
| 11 | +### SDK 结构变化 |
| 12 | + |
| 13 | +在版本 36.0.0 中,Azure SDK 团队引入了重大变更: |
| 14 | + |
| 15 | +**之前 (Before - v34.1.0):** |
| 16 | +- SDK 支持多个 API 版本,使用版本化的模块结构 |
| 17 | +- 示例: `azure.mgmt.compute.v2024_11_01.models.VirtualMachine` |
| 18 | +- 文件结构包含多个版本目录: `v2019_04_01/`, `v2020_12_01/`, `v2024_11_01/` 等 |
| 19 | + |
| 20 | +**现在 (Now - v37.0.1):** |
| 21 | +- SDK 仅支持最新的 API 版本 |
| 22 | +- 示例: `azure.mgmt.compute.models.VirtualMachine` |
| 23 | +- 文件结构简化,只有 `models/` 和 `operations/` 目录 |
| 24 | +- 包大小从 ~2MB 减少到 ~664KB |
| 25 | + |
| 26 | +## 修改内容 (Changes Made) |
| 27 | + |
| 28 | +### 1. SDK 版本更新 (SDK Version Updates) |
| 29 | + |
| 30 | +修改了以下文件以更新 SDK 版本: |
| 31 | + |
| 32 | +**文件 (Files):** |
| 33 | +- `src/azure-cli/setup.py` |
| 34 | +- `src/azure-cli/requirements.py3.Darwin.txt` |
| 35 | +- `src/azure-cli/requirements.py3.Linux.txt` |
| 36 | +- `src/azure-cli/requirements.py3.windows.txt` |
| 37 | + |
| 38 | +**变更 (Change):** |
| 39 | +```python |
| 40 | +# Before |
| 41 | +azure-mgmt-compute~=34.1.0 |
| 42 | + |
| 43 | +# After |
| 44 | +azure-mgmt-compute~=37.0.1 |
| 45 | +``` |
| 46 | + |
| 47 | +### 2. API 版本配置文件更新 (API Version Profile Updates) |
| 48 | + |
| 49 | +**文件 (File):** `src/azure-cli-core/azure/cli/core/profiles/_shared.py` |
| 50 | + |
| 51 | +更新了 `AZURE_API_PROFILES` 中 `MGMT_COMPUTE` 的 API 版本配置: |
| 52 | + |
| 53 | +```python |
| 54 | +ResourceType.MGMT_COMPUTE: SDKProfile('2025-04-01', { |
| 55 | + 'resource_skus': '2021-07-01', |
| 56 | + 'disks': '2025-01-02', |
| 57 | + 'disk_encryption_sets': '2025-01-02', |
| 58 | + 'disk_accesses': '2025-01-02', |
| 59 | + 'disk_restore_point': '2025-01-02', |
| 60 | + 'snapshots': '2025-01-02', |
| 61 | + 'galleries': '2024-03-03', |
| 62 | + 'gallery_images': '2024-03-03', |
| 63 | + 'gallery_image_versions': '2024-03-03', |
| 64 | + 'gallery_applications': '2024-03-03', |
| 65 | + 'gallery_application_versions': '2024-03-03', |
| 66 | + 'gallery_in_vm_access_control_profiles': '2024-03-03', |
| 67 | + 'gallery_in_vm_access_control_profile_versions': '2024-03-03', |
| 68 | + 'gallery_sharing_profile': '2024-03-03', |
| 69 | + 'shared_galleries': '2024-03-03', |
| 70 | + 'shared_gallery_images': '2024-03-03', |
| 71 | + 'shared_gallery_image_versions': '2024-03-03', |
| 72 | + 'community_galleries': '2024-03-03', |
| 73 | + 'community_gallery_images': '2024-03-03', |
| 74 | + 'community_gallery_image_versions': '2024-03-03', |
| 75 | + 'soft_deleted_resource': '2024-03-03', |
| 76 | + 'cloud_services': '2024-11-04', |
| 77 | + 'cloud_service_roles': '2024-11-04', |
| 78 | + 'cloud_service_role_instances': '2024-11-04', |
| 79 | + 'cloud_service_operating_systems': '2024-11-04', |
| 80 | + 'cloud_services_update_domain': '2024-11-04', |
| 81 | +}), |
| 82 | +``` |
| 83 | + |
| 84 | +### 3. 核心功能修改 (Core Functionality Changes) |
| 85 | + |
| 86 | +#### 3.1 `get_versioned_sdk_path()` 函数 |
| 87 | + |
| 88 | +**问题 (Problem):** |
| 89 | +原始实现假设所有 SDK 都使用版本化的模块路径。 |
| 90 | + |
| 91 | +**解决方案 (Solution):** |
| 92 | +- 当 `SDKProfile` 没有指定 `operation_group` 时,使用默认 API 版本 |
| 93 | +- 保持向后兼容性,继续返回版本化路径 |
| 94 | + |
| 95 | +```python |
| 96 | +def get_versioned_sdk_path(api_profile, resource_type, operation_group=None): |
| 97 | + api_version = get_api_version(api_profile, resource_type) |
| 98 | + if api_version is None: |
| 99 | + return resource_type.import_prefix |
| 100 | + if isinstance(api_version, _ApiVersions): |
| 101 | + # For SDKProfile, use the default version if no operation_group specified |
| 102 | + if operation_group is None: |
| 103 | + api_version = api_version._sdk_profile.default_api_version |
| 104 | + else: |
| 105 | + api_version = getattr(api_version, operation_group) |
| 106 | + return '{}.v{}'.format(resource_type.import_prefix, api_version.replace('-', '_').replace('.', '_')) |
| 107 | +``` |
| 108 | + |
| 109 | +#### 3.2 `get_versioned_sdk()` 函数 |
| 110 | + |
| 111 | +**问题 (Problem):** |
| 112 | +版本化路径不存在时(如 v37.0.1),导入会失败。 |
| 113 | + |
| 114 | +**解决方案 (Solution):** |
| 115 | +- 在导入前检查版本化模块是否存在 |
| 116 | +- 如果不存在,自动回退到非版本化路径 |
| 117 | +- 这样既支持旧版 SDK(多版本),也支持新版 SDK(单版本) |
| 118 | + |
| 119 | +```python |
| 120 | +def get_versioned_sdk(api_profile, resource_type, *attr_args, **kwargs): |
| 121 | + # ... (获取参数) |
| 122 | + |
| 123 | + # Check if versioned module exists |
| 124 | + if 'v' in sdk_path.split(unversioned_path, 1)[-1]: |
| 125 | + try: |
| 126 | + import_module(sdk_path.rsplit('.', 1)[0] if '.' in sdk_path.split('.v', 1)[1] else sdk_path) |
| 127 | + except (ImportError, IndexError): |
| 128 | + # Versioned module doesn't exist, use unversioned path |
| 129 | + logger.debug("Versioned SDK path '%s' not found, using unversioned path '%s'", sdk_path, unversioned_path) |
| 130 | + sdk_path = unversioned_path |
| 131 | + |
| 132 | + # ... (导入属性) |
| 133 | +``` |
| 134 | + |
| 135 | +#### 3.3 `_ApiVersions.__getattr__()` 方法 |
| 136 | + |
| 137 | +**问题 (Problem):** |
| 138 | +新版 SDK 中,客户端类不再有版本化的操作组属性。 |
| 139 | + |
| 140 | +**解决方案 (Solution):** |
| 141 | +- 当在客户端属性中找不到操作组时,直接从配置文件中获取 |
| 142 | +- 这允许我们为不在客户端类中定义的操作组指定 API 版本 |
| 143 | + |
| 144 | +```python |
| 145 | +def __getattr__(self, item): |
| 146 | + try: |
| 147 | + self._resolve() |
| 148 | + return self._operations_groups_value[item] |
| 149 | + except KeyError: |
| 150 | + # If operation group not found in client properties, try the profile directly |
| 151 | + value = self._sdk_profile.profile.get(item) |
| 152 | + if value is not None: |
| 153 | + return self._post_process(value) |
| 154 | + raise AttributeError('Attribute {} does not exist.'.format(item)) |
| 155 | +``` |
| 156 | + |
| 157 | +## API 版本映射 (API Version Mapping) |
| 158 | + |
| 159 | +新版 SDK 使用以下 API 版本: |
| 160 | + |
| 161 | +| 操作组 (Operation Group) | API 版本 (API Version) | |
| 162 | +|------------------------|---------------------| |
| 163 | +| 默认 (Default) | 2025-04-01 | |
| 164 | +| Virtual Machines | 2025-04-01 | |
| 165 | +| Virtual Machine Scale Sets | 2025-04-01 | |
| 166 | +| Disks | 2025-01-02 | |
| 167 | +| Snapshots | 2025-01-02 | |
| 168 | +| Disk Encryption Sets | 2025-01-02 | |
| 169 | +| Galleries | 2024-03-03 | |
| 170 | +| Gallery Images | 2024-03-03 | |
| 171 | +| Gallery Image Versions | 2024-03-03 | |
| 172 | +| Cloud Services | 2024-11-04 | |
| 173 | +| Resource SKUs | 2021-07-01 | |
| 174 | + |
| 175 | +## 兼容性 (Compatibility) |
| 176 | + |
| 177 | +### 向后兼容性 (Backward Compatibility) |
| 178 | + |
| 179 | +所有修改都保持了向后兼容性: |
| 180 | + |
| 181 | +1. **旧版 SDK (Old SDKs):** 继续使用版本化路径(如 `azure.mgmt.storage.v2020_10_10`) |
| 182 | +2. **新版 SDK (New SDKs):** 自动使用非版本化路径(如 `azure.mgmt.compute`) |
| 183 | +3. **现有代码 (Existing Code):** VM 模块和其他使用 `get_sdk()` 的代码无需修改 |
| 184 | + |
| 185 | +### 测试结果 (Test Results) |
| 186 | + |
| 187 | +✅ 所有 azure-cli-core API 配置文件测试通过 (36/36 tests passed) |
| 188 | +✅ 模型导入测试通过 |
| 189 | +✅ 操作组特定 API 版本测试通过 |
| 190 | +✅ CodeQL 安全扫描通过 |
| 191 | + |
| 192 | +## 使用示例 (Usage Examples) |
| 193 | + |
| 194 | +### 获取模型 (Getting Models) |
| 195 | + |
| 196 | +```python |
| 197 | +from azure.cli.core.profiles import ResourceType, get_sdk |
| 198 | +from azure.cli.core.mock import DummyCli |
| 199 | + |
| 200 | +cli_ctx = DummyCli() |
| 201 | + |
| 202 | +# 获取 VirtualMachine 模型(使用默认 API 版本 2025-04-01) |
| 203 | +VirtualMachine = get_sdk(cli_ctx, ResourceType.MGMT_COMPUTE, 'VirtualMachine', mod='models') |
| 204 | + |
| 205 | +# 获取 DiskStorageAccountTypes(使用 disks 操作组的 API 版本 2025-01-02) |
| 206 | +DiskStorageAccountTypes = get_sdk(cli_ctx, ResourceType.MGMT_COMPUTE, |
| 207 | + 'DiskStorageAccountTypes', |
| 208 | + mod='models', |
| 209 | + operation_group='disks') |
| 210 | + |
| 211 | +# 一次获取多个模型 |
| 212 | +UpgradeMode, CachingTypes = get_sdk(cli_ctx, ResourceType.MGMT_COMPUTE, |
| 213 | + 'UpgradeMode', 'CachingTypes', mod='models') |
| 214 | +``` |
| 215 | + |
| 216 | +## 影响范围 (Impact Scope) |
| 217 | + |
| 218 | +### 修改的文件 (Modified Files) |
| 219 | +1. `src/azure-cli/setup.py` |
| 220 | +2. `src/azure-cli/requirements.py3.Darwin.txt` |
| 221 | +3. `src/azure-cli/requirements.py3.Linux.txt` |
| 222 | +4. `src/azure-cli/requirements.py3.windows.txt` |
| 223 | +5. `src/azure-cli-core/azure/cli/core/profiles/_shared.py` |
| 224 | + |
| 225 | +### 不需要修改的内容 (No Changes Required) |
| 226 | +- VM 模块的命令实现代码 |
| 227 | +- 其他使用 Compute SDK 的模块 |
| 228 | +- 用户脚本和扩展 |
| 229 | + |
| 230 | +## 验证步骤 (Validation Steps) |
| 231 | + |
| 232 | +如果您想验证升级是否成功,可以运行: |
| 233 | + |
| 234 | +```bash |
| 235 | +# 1. 安装更新后的包 |
| 236 | +pip install -e src/azure-cli-core |
| 237 | +pip install azure-mgmt-compute==37.0.1 |
| 238 | + |
| 239 | +# 2. 运行测试 |
| 240 | +python -m pytest src/azure-cli-core/azure/cli/core/tests/test_api_profiles.py -v |
| 241 | + |
| 242 | +# 3. 测试模型导入 |
| 243 | +python -c " |
| 244 | +from azure.cli.core.profiles import ResourceType, get_sdk |
| 245 | +from azure.cli.core.mock import DummyCli |
| 246 | +cli_ctx = DummyCli() |
| 247 | +vm = get_sdk(cli_ctx, ResourceType.MGMT_COMPUTE, 'VirtualMachine', mod='models') |
| 248 | +print('Success:', vm) |
| 249 | +" |
| 250 | +``` |
| 251 | + |
| 252 | +## 参考资料 (References) |
| 253 | + |
| 254 | +- [azure-mgmt-compute 37.0.1 Release Notes](https://pypi.org/project/azure-mgmt-compute/37.0.1/) |
| 255 | +- [azure-mgmt-compute 36.0.0 Breaking Changes](https://pypi.org/project/azure-mgmt-compute/36.0.0/) |
| 256 | +- [Azure SDK for Python](https://github.com/Azure/azure-sdk-for-python) |
| 257 | + |
| 258 | +## 总结 (Summary) |
| 259 | + |
| 260 | +这次升级成功地将 azure-mgmt-compute SDK 从 34.1.0 升级到 37.0.1,同时保持了完全的向后兼容性。核心的修改集中在 azure-cli-core 的配置文件处理逻辑,使其能够同时支持旧版(多版本)和新版(单版本)SDK 结构。所有现有的 VM 模块代码和用户脚本都不需要修改即可继续工作。 |
| 261 | + |
| 262 | +This upgrade successfully updates the azure-mgmt-compute SDK from 34.1.0 to 37.0.1 while maintaining full backward compatibility. The core changes are concentrated in the azure-cli-core profile handling logic, enabling it to support both old (multi-version) and new (single-version) SDK structures. All existing VM module code and user scripts will continue to work without modification. |
0 commit comments