Skip to content

Commit ec3f1cb

Browse files
qwordyarrownj
andauthored
[Compute] disk update: Add --disk-encryption-set and --encryption-type; snapshot create/update: Add --disk-encryption-set and --encryption-type (#11805)
* [Compute] disk update: Add --disk-encryption-set and --encryption-type * snapshot create/update: Add --disk-encryption-set and --encryption-type * Remove preview label * Fix style problem * Add parameter validation * Fix yaml * Fix test Co-authored-by: Xiaojian Xu <arrownj@126.com>
1 parent ce44655 commit ec3f1cb

7 files changed

Lines changed: 3777 additions & 9 deletions

File tree

src/azure-cli/HISTORY.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
Release History
44
===============
55

6+
**Compute**
7+
8+
* disk update: Add --disk-encryption-set and --encryption-type
9+
* snapshot create/update: Add --disk-encryption-set and --encryption-type
10+
611
**Stoarge**
712

813
* Upgrade azure-mgmt-storage version to 7.1.0

src/azure-cli/azure/cli/command_modules/vm/_params.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,9 @@ def load_arguments(self, _):
114114
c.argument('hyper_v_generation', arg_type=hyper_v_gen_sku, help='The hypervisor generation of the Virtual Machine. Applicable to OS disks only.')
115115
else:
116116
c.ignore('access_level', 'for_upload', 'hyper_v_generation')
117-
c.argument('encryption_type', arg_type=get_enum_type(self.get_models('EncryptionType')), help='Encryption type.')
118-
c.argument('disk_encryption_set', help='Name or ID of disk encryption set that is used to encrypt the disk.')
117+
c.argument('encryption_type', min_api='2019-07-01', arg_type=get_enum_type(self.get_models('EncryptionType')),
118+
help='Encryption type. EncryptionAtRestWithPlatformKey: Disk is encrypted with XStore managed key at rest. It is the default encryption type. EncryptionAtRestWithCustomerKey: Disk is encrypted with Customer managed key at rest.')
119+
c.argument('disk_encryption_set', min_api='2019-07-01', help='Name or ID of disk encryption set that is used to encrypt the disk.')
119120

120121
for scope in ['disk create', 'snapshot create']:
121122
with self.argument_context(scope) as c:

src/azure-cli/azure/cli/command_modules/vm/commands.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ def load_command_table(self, _):
202202
g.generic_update_command('update', custom_func_name='update_managed_disk', setter_arg_name='disk', supports_no_wait=True)
203203
g.wait_command('wait')
204204

205-
with self.command_group('disk-encryption-set', compute_disk_encryption_set_sdk, client_factory=cf_disk_encryption_set, min_api='2019-07-01', is_preview=True) as g:
205+
with self.command_group('disk-encryption-set', compute_disk_encryption_set_sdk, client_factory=cf_disk_encryption_set, min_api='2019-07-01') as g:
206206
g.custom_command('create', 'create_disk_encryption_set', supports_no_wait=True)
207207
g.command('delete', 'delete')
208208
g.generic_update_command('update', custom_func_name='update_disk_encryption_set', setter_arg_name='disk_encryption_set')

src/azure-cli/azure/cli/command_modules/vm/custom.py

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,11 @@ def list_managed_disks(cmd, resource_group_name=None):
327327
return client.disks.list()
328328

329329

330-
def update_managed_disk(cmd, instance, size_gb=None, sku=None, disk_iops_read_write=None, disk_mbps_read_write=None):
330+
def update_managed_disk(cmd, resource_group_name, instance, size_gb=None, sku=None, disk_iops_read_write=None,
331+
disk_mbps_read_write=None, encryption_type=None, disk_encryption_set=None):
332+
from msrestazure.tools import resource_id, is_valid_resource_id
333+
from azure.cli.core.commands.client_factory import get_subscription_id
334+
331335
if size_gb is not None:
332336
instance.disk_size_gb = size_gb
333337
if sku is not None:
@@ -336,6 +340,17 @@ def update_managed_disk(cmd, instance, size_gb=None, sku=None, disk_iops_read_wr
336340
instance.disk_iops_read_write = disk_iops_read_write
337341
if disk_mbps_read_write is not None:
338342
instance.disk_mbps_read_write = disk_mbps_read_write
343+
if disk_encryption_set is not None:
344+
if instance.encryption.type != 'EncryptionAtRestWithCustomerKey' and \
345+
encryption_type != 'EncryptionAtRestWithCustomerKey':
346+
raise CLIError('usage error: Please set --encryption-type to EncryptionAtRestWithCustomerKey')
347+
if not is_valid_resource_id(disk_encryption_set):
348+
disk_encryption_set = resource_id(
349+
subscription=get_subscription_id(cmd.cli_ctx), resource_group=resource_group_name,
350+
namespace='Microsoft.Compute', type='diskEncryptionSets', name=disk_encryption_set)
351+
instance.encryption.disk_encryption_set_id = disk_encryption_set
352+
if encryption_type is not None:
353+
instance.encryption.type = encryption_type
339354
return instance
340355
# endregion
341356

@@ -408,12 +423,18 @@ def list_images(cmd, resource_group_name=None):
408423

409424

410425
# region Snapshots
426+
# pylint: disable=unused-argument,too-many-locals
411427
def create_snapshot(cmd, resource_group_name, snapshot_name, location=None, size_gb=None, sku='Standard_LRS',
412-
source=None, for_upload=None, incremental=None, # pylint: disable=unused-argument
428+
source=None, for_upload=None, incremental=None,
413429
# below are generated internally from 'source'
414430
source_blob_uri=None, source_disk=None, source_snapshot=None, source_storage_account_id=None,
415-
hyper_v_generation=None, tags=None, no_wait=False):
416-
Snapshot, CreationData, DiskCreateOption = cmd.get_models('Snapshot', 'CreationData', 'DiskCreateOption')
431+
hyper_v_generation=None, tags=None, no_wait=False, disk_encryption_set=None,
432+
encryption_type=None):
433+
from msrestazure.tools import resource_id, is_valid_resource_id
434+
from azure.cli.core.commands.client_factory import get_subscription_id
435+
436+
Snapshot, CreationData, DiskCreateOption, Encryption = cmd.get_models(
437+
'Snapshot', 'CreationData', 'DiskCreateOption', 'Encryption')
417438

418439
location = location or _get_resource_group_location(cmd.cli_ctx, resource_group_name)
419440
if source_blob_uri:
@@ -432,8 +453,22 @@ def create_snapshot(cmd, resource_group_name, snapshot_name, location=None, size
432453

433454
if size_gb is None and option == DiskCreateOption.empty:
434455
raise CLIError('Please supply size for the snapshots')
456+
457+
if disk_encryption_set is not None and not is_valid_resource_id(disk_encryption_set):
458+
disk_encryption_set = resource_id(
459+
subscription=get_subscription_id(cmd.cli_ctx), resource_group=resource_group_name,
460+
namespace='Microsoft.Compute', type='diskEncryptionSets', name=disk_encryption_set)
461+
462+
if disk_encryption_set is not None and encryption_type is None:
463+
raise CLIError('usage error: Please specify --encryption-type.')
464+
if encryption_type is not None:
465+
encryption = Encryption(type=encryption_type, disk_encryption_set_id=disk_encryption_set)
466+
else:
467+
encryption = None
468+
435469
snapshot = Snapshot(location=location, creation_data=creation_data, tags=(tags or {}),
436-
sku=_get_sku_object(cmd, sku), disk_size_gb=size_gb, incremental=incremental)
470+
sku=_get_sku_object(cmd, sku), disk_size_gb=size_gb, incremental=incremental,
471+
encryption=encryption)
437472
if hyper_v_generation:
438473
snapshot.hyper_vgeneration = hyper_v_generation
439474

@@ -453,9 +488,23 @@ def list_snapshots(cmd, resource_group_name=None):
453488
return client.snapshots.list()
454489

455490

456-
def update_snapshot(cmd, instance, sku=None):
491+
def update_snapshot(cmd, resource_group_name, instance, sku=None, disk_encryption_set=None, encryption_type=None):
492+
from msrestazure.tools import resource_id, is_valid_resource_id
493+
from azure.cli.core.commands.client_factory import get_subscription_id
494+
457495
if sku is not None:
458496
_set_sku(cmd, instance, sku)
497+
if disk_encryption_set is not None:
498+
if instance.encryption.type != 'EncryptionAtRestWithCustomerKey' and \
499+
encryption_type != 'EncryptionAtRestWithCustomerKey':
500+
raise CLIError('usage error: Please set --encryption-type to EncryptionAtRestWithCustomerKey')
501+
if not is_valid_resource_id(disk_encryption_set):
502+
disk_encryption_set = resource_id(
503+
subscription=get_subscription_id(cmd.cli_ctx), resource_group=resource_group_name,
504+
namespace='Microsoft.Compute', type='diskEncryptionSets', name=disk_encryption_set)
505+
instance.encryption.disk_encryption_set_id = disk_encryption_set
506+
if encryption_type is not None:
507+
instance.encryption.type = encryption_type
459508
return instance
460509
# endregion
461510

0 commit comments

Comments
 (0)