diff --git a/src/azure-cli/azure/cli/command_modules/vm/_validators.py b/src/azure-cli/azure/cli/command_modules/vm/_validators.py index eac634252f6..3647fe50953 100644 --- a/src/azure-cli/azure/cli/command_modules/vm/_validators.py +++ b/src/azure-cli/azure/cli/command_modules/vm/_validators.py @@ -1981,11 +1981,38 @@ def _validate_gallery_image_reference(cmd, namespace): 'format, please refer to the help sample'.format(gallery_image_reference)) +def _validate_gallery_image_reference_by_aaz(namespace): + is_validate = 'gallery_image_reference' in namespace and namespace.gallery_image_reference is not None + + if not is_validate: + return + + from azure.cli.command_modules.vm._image_builder import GalleryImageReferenceType + from ._vm_utils import is_compute_gallery_image_id, is_community_gallery_image_id, \ + is_shared_gallery_image_id + + gallery_image_reference = namespace.gallery_image_reference + if is_compute_gallery_image_id(gallery_image_reference): + namespace.gallery_image_reference_type = GalleryImageReferenceType.COMPUTE.backend_key + return + if is_community_gallery_image_id(gallery_image_reference): + namespace.gallery_image_reference_type = GalleryImageReferenceType.COMMUNITY.backend_key + return + if is_shared_gallery_image_id(gallery_image_reference): + namespace.gallery_image_reference_type = GalleryImageReferenceType.SHARED.backend_key + return + + from azure.cli.core.parser import InvalidArgumentValueError + raise InvalidArgumentValueError('usage error: {} is an invalid gallery image reference, please provide valid ' + 'compute, shared or community gallery image version. For details about valid ' + 'format, please refer to the help sample'.format(gallery_image_reference)) + + def process_disk_create_namespace(cmd, namespace): from azure.core.exceptions import HttpResponseError validate_tags(namespace) validate_edge_zone(cmd, namespace) - _validate_gallery_image_reference(cmd, namespace) + _validate_gallery_image_reference_by_aaz(namespace) _validate_security_data_uri(namespace) _validate_upload_type(cmd, namespace) _validate_secure_vm_disk_encryption_set(namespace) @@ -2028,12 +2055,6 @@ def _validate_upload_type(cmd, namespace): namespace.upload_type = 'Upload' if namespace.upload_type == 'UploadWithSecurityData': - - if not cmd.supported_api_version(min_api='2021-08-01', operation_group='disks'): - raise ArgumentUsageError( - "'UploadWithSecurityData' is not supported in the current profile. " - "Please upgrade your profile with 'az cloud set --profile newerProfile' and try again") - if not namespace.security_type: raise RequiredArgumentMissingError( "Please specify --security-type when the value of --upload-type is 'UploadWithSecurityData'") diff --git a/src/azure-cli/azure/cli/command_modules/vm/commands.py b/src/azure-cli/azure/cli/command_modules/vm/commands.py index 00b5f2900d1..31bc204f494 100644 --- a/src/azure-cli/azure/cli/command_modules/vm/commands.py +++ b/src/azure-cli/azure/cli/command_modules/vm/commands.py @@ -208,7 +208,7 @@ def load_command_table(self, _): from .operations.ppg import PPGShow self.command_table["ppg show"] = PPGShow(loader=self) - with self.command_group('disk', compute_disk_sdk, operation_group='disks') as g: + with self.command_group('disk', operation_group='disks') as g: g.custom_command('create', 'create_managed_disk', supports_no_wait=True, table_transformer=transform_disk_create_table_output, validator=process_disk_create_namespace) from .operations.disk import DiskUpdate, DiskGrantAccess self.command_table["disk grant-access"] = DiskGrantAccess(loader=self) diff --git a/src/azure-cli/azure/cli/command_modules/vm/custom.py b/src/azure-cli/azure/cli/command_modules/vm/custom.py index 28ed17b1169..94fb44a7d76 100644 --- a/src/azure-cli/azure/cli/command_modules/vm/custom.py +++ b/src/azure-cli/azure/cli/command_modules/vm/custom.py @@ -550,19 +550,52 @@ def create_managed_disk(cmd, resource_group_name, disk_name, location=None, # p 'usage error: --upload-size-bytes is required to create a disk for upload') if disk_encryption_set is not None and not is_valid_resource_id(disk_encryption_set): - disk_encryption_set = resource_id( - subscription=get_subscription_id(cmd.cli_ctx), resource_group=resource_group_name, - namespace='Microsoft.Compute', type='diskEncryptionSets', name=disk_encryption_set) + from .aaz.latest.disk_encryption_set import Show as DiskEncryptionSetShow + from azure.core.exceptions import HttpResponseError + try: + disk_encryption_set = DiskEncryptionSetShow(cli_ctx=cmd.cli_ctx)(command_args={ + 'resource_group': resource_group_name, + 'disk_encryption_set_name': disk_encryption_set + }) + + if disk_encryption_set: + disk_encryption_set = disk_encryption_set['id'] + else: + disk_encryption_set = None + except HttpResponseError: + disk_encryption_set = None if disk_access is not None and not is_valid_resource_id(disk_access): - disk_access = resource_id( - subscription=get_subscription_id(cmd.cli_ctx), resource_group=resource_group_name, - namespace='Microsoft.Compute', type='diskAccesses', name=disk_access) + from .aaz.latest.disk_access import Show as DiskAccessShow + from azure.core.exceptions import HttpResponseError + try: + disk_access = DiskAccessShow(cli_ctx=cmd.cli_ctx)(command_args={ + 'resource_group': resource_group_name, + 'disk_access_name': disk_access + }) + + if disk_access: + disk_access = disk_access['id'] + else: + disk_access = None + except HttpResponseError: + disk_access = None if secure_vm_disk_encryption_set is not None and not is_valid_resource_id(secure_vm_disk_encryption_set): - secure_vm_disk_encryption_set = resource_id( - subscription=get_subscription_id(cmd.cli_ctx), resource_group=resource_group_name, - namespace='Microsoft.Compute', type='diskEncryptionSets', name=secure_vm_disk_encryption_set) + from .aaz.latest.disk_encryption_set import Show as DiskEncryptionSetShow + from azure.core.exceptions import HttpResponseError + try: + secure_vm_disk_encryption_set = DiskEncryptionSetShow(cli_ctx=cmd.cli_ctx)(command_args={ + 'resource_group': resource_group_name, + 'disk_encryption_set_name': secure_vm_disk_encryption_set + }) + + if secure_vm_disk_encryption_set: + secure_vm_disk_encryption_set = secure_vm_disk_encryption_set['id'] + else: + secure_vm_disk_encryption_set = None + except HttpResponseError: + secure_vm_disk_encryption_set = None encryption = None if disk_encryption_set or encryption_type: diff --git a/src/azure-cli/azure/cli/command_modules/vm/operations/disk.py b/src/azure-cli/azure/cli/command_modules/vm/operations/disk.py index 336994b1392..8e31902cdf8 100644 --- a/src/azure-cli/azure/cli/command_modules/vm/operations/disk.py +++ b/src/azure-cli/azure/cli/command_modules/vm/operations/disk.py @@ -8,6 +8,9 @@ from azure.cli.core.aaz import has_value, register_command, register_command_group, AAZCommandGroup from ..aaz.latest.disk import Update as _DiskUpdate, GrantAccess as _DiskGrantAccess, Show, UpdatePatch as _UpdatePatch +from ..aaz.latest.disk_encryption_set import Show as DiskEncryptionSetShow +from ..aaz.latest.disk_access import Show as DiskAccessShow +from azure.core.exceptions import HttpResponseError logger = get_logger(__name__) @@ -45,9 +48,18 @@ def pre_instance_update(self, instance): disk_encryption_set = args.disk_encryption_set if not is_valid_resource_id(disk_encryption_set.to_serialized_data()): - disk_encryption_set = resource_id( - subscription=get_subscription_id(self.cli_ctx), resource_group=args.resource_group, - namespace='Microsoft.Compute', type='diskEncryptionSets', name=disk_encryption_set) + try: + disk_encryption_set = DiskEncryptionSetShow(cli_ctx=self.cli_ctx)(command_args={ + 'resource_group': args.resource_group, + 'disk_encryption_set_name': disk_encryption_set + }) + + if disk_encryption_set: + disk_encryption_set = disk_encryption_set['id'] + else: + disk_encryption_set = None + except HttpResponseError: + disk_encryption_set = None instance.properties.encryption.disk_encryption_set_id = disk_encryption_set @@ -58,9 +70,19 @@ def pre_instance_update(self, instance): if has_value(args.disk_access): disk_access = args.disk_access if not is_valid_resource_id(disk_access.to_serialized_data()): - disk_access = resource_id( - subscription=get_subscription_id(self.cli_ctx), resource_group=args.resource_group, - namespace='Microsoft.Compute', type='diskAccesses', name=disk_access) + try: + disk_access = DiskAccessShow(cli_ctx=self.cli_ctx)(command_args={ + 'resource_group': args.resource_group, + 'disk_access_name': disk_access + }) + + if disk_access: + disk_access = disk_access['id'] + else: + disk_access = None + except HttpResponseError: + disk_access = None + instance.properties.disk_access_id = disk_access