def _CreateDiskMessage(self, args, skip_defaults, instance_name, project, zone, compute_client, resource_parser, create_boot_disk, boot_disk_size_gb, image_uri, csek_keys): persistent_disks = ( instance_utils.CreatePersistentAttachedDiskMessages( resource_parser, compute_client, csek_keys, args.disk or [], project, zone)) persistent_create_disks = ( instance_utils.CreatePersistentCreateDiskMessages( compute_client, resource_parser, csek_keys, getattr(args, 'create_disk', []), project, zone, enable_kms=self._support_kms, enable_snapshots=True, resource_policy=self._support_disk_resource_policy, enable_source_snapshot_csek=self._support_source_snapshot_csek, enable_image_csek=self._support_image_csek)) local_nvdimms = [] if self._support_nvdimm: local_nvdimms = instance_utils.CreateLocalNvdimmMessages( args, resource_parser, compute_client.messages, zone, project) local_ssds = instance_utils.CreateLocalSsdMessages( args, resource_parser, compute_client.messages, zone, project) if create_boot_disk: boot_snapshot_uri = instance_utils.ResolveSnapshotURI( user_project=project, snapshot=args.source_snapshot, resource_parser=resource_parser) boot_disk = instance_utils.CreateDefaultBootAttachedDiskMessage( compute_client, resource_parser, disk_type=args.boot_disk_type, disk_device_name=args.boot_disk_device_name, disk_auto_delete=args.boot_disk_auto_delete, disk_size_gb=boot_disk_size_gb, require_csek_key_create=(args.require_csek_key_create if csek_keys else None), image_uri=image_uri, instance_name=instance_name, project=project, zone=zone, csek_keys=csek_keys, kms_args=args, snapshot_uri=boot_snapshot_uri, enable_kms=self._support_kms) persistent_disks = [boot_disk] + persistent_disks return persistent_disks + persistent_create_disks + local_nvdimms + local_ssds
def _GetDiskMessages( self, args, skip_defaults, instance_refs, compute_client, resource_parser, create_boot_disk, boot_disk_size_gb, image_uri, csek_keys): flags_to_check = [ 'disk', 'local_ssd', 'boot_disk_type', 'boot_disk_device_name', 'boot_disk_auto_delete', 'require_csek_key_create', ] if self._support_kms: flags_to_check.extend([ 'create_disk', 'boot_disk_kms_key', 'boot_disk_kms_project', 'boot_disk_kms_location', 'boot_disk_kms_keyring', ]) if self._support_nvdimm: flags_to_check.extend(['local_nvdimm']) if (skip_defaults and not instance_utils.IsAnySpecified(args, *flags_to_check)): return [[] for _ in instance_refs] # A list of lists where the element at index i contains a list of # disk messages that should be set for the instance at index i. disks_messages = [] # A mapping of zone to boot disk references for all existing boot # disks that are being attached. # TODO(b/36050875): Simplify since resources.Resource is now hashable. existing_boot_disks = {} for instance_ref in instance_refs: persistent_disks, boot_disk_ref = ( instance_utils.CreatePersistentAttachedDiskMessages( resource_parser, compute_client, csek_keys, args.disk or [], instance_ref)) persistent_create_disks = ( instance_utils.CreatePersistentCreateDiskMessages( compute_client, resource_parser, csek_keys, getattr(args, 'create_disk', []), instance_ref, enable_kms=self._support_kms, enable_snapshots=True, resource_policy=self._support_disk_resource_policy, enable_source_snapshot_csek=self._support_source_snapshot_csek, enable_image_csek=self._support_image_csek)) local_nvdimms = [] if self._support_nvdimm: local_nvdimms = instance_utils.CreateLocalNvdimmMessages( args, resource_parser, compute_client.messages, instance_ref.zone, instance_ref.project ) local_ssds = instance_utils.CreateLocalSsdMessages( args, resource_parser, compute_client.messages, instance_ref.zone, instance_ref.project ) if create_boot_disk: boot_snapshot_uri = instance_utils.ResolveSnapshotURI( user_project=instance_refs[0].project, snapshot=args.source_snapshot, resource_parser=resource_parser) boot_disk = instance_utils.CreateDefaultBootAttachedDiskMessage( compute_client, resource_parser, disk_type=args.boot_disk_type, disk_device_name=args.boot_disk_device_name, disk_auto_delete=args.boot_disk_auto_delete, disk_size_gb=boot_disk_size_gb, require_csek_key_create=( args.require_csek_key_create if csek_keys else None), image_uri=image_uri, instance_ref=instance_ref, csek_keys=csek_keys, kms_args=args, snapshot_uri=boot_snapshot_uri, enable_kms=self._support_kms) persistent_disks = [boot_disk] + persistent_disks else: existing_boot_disks[boot_disk_ref.zone] = boot_disk_ref disks_messages.append(persistent_disks + persistent_create_disks + local_nvdimms + local_ssds) return disks_messages
def CreateDiskMessages(args, project, location, scope, compute_client, resource_parser, image_uri, boot_disk_size_gb=None, instance_name=None, create_boot_disk=False, csek_keys=None, support_kms=False, support_nvdimm=False, support_disk_resource_policy=False, support_source_snapshot_csek=False, support_boot_snapshot_uri=False, support_image_csek=False, support_match_container_mount_disks=False, support_create_disk_snapshots=False, support_persistent_attached_disks=True): """Creates disk messages for a single instance.""" container_mount_disk = [] if support_match_container_mount_disks: container_mount_disk = args.container_mount_disk persistent_disks = [] if support_persistent_attached_disks: persistent_disks = ( CreatePersistentAttachedDiskMessages( resources=resource_parser, compute_client=compute_client, csek_keys=csek_keys, disks=args.disk or [], project=project, location=location, scope=scope, container_mount_disk=container_mount_disk)) persistent_create_disks = ( CreatePersistentCreateDiskMessages( compute_client=compute_client, resources=resource_parser, csek_keys=csek_keys, create_disks=getattr(args, 'create_disk', []), project=project, location=location, scope=scope, enable_kms=support_kms, enable_snapshots=support_create_disk_snapshots, container_mount_disk=container_mount_disk, resource_policy=support_disk_resource_policy, enable_source_snapshot_csek=support_source_snapshot_csek, enable_image_csek=support_image_csek)) local_nvdimms = [] if support_nvdimm: local_nvdimms = CreateLocalNvdimmMessages(args, resource_parser, compute_client.messages, location, scope, project) local_ssds = CreateLocalSsdMessages(args, resource_parser, compute_client.messages, location, scope, project) if create_boot_disk: boot_snapshot_uri = None if support_boot_snapshot_uri: boot_snapshot_uri = instance_utils.ResolveSnapshotURI( user_project=project, snapshot=args.source_snapshot, resource_parser=resource_parser) boot_disk = CreateDefaultBootAttachedDiskMessage( compute_client=compute_client, resources=resource_parser, disk_type=getattr(args, 'boot_disk_type', None), disk_device_name=getattr(args, 'boot_disk_device_name', None), disk_auto_delete=getattr(args, 'boot_disk_auto_delete', None), disk_size_gb=boot_disk_size_gb, require_csek_key_create=(args.require_csek_key_create if csek_keys else None), image_uri=image_uri, instance_name=instance_name, project=project, location=location, scope=scope, enable_kms=support_kms, csek_keys=csek_keys, kms_args=args, snapshot_uri=boot_snapshot_uri) persistent_disks = [boot_disk] + persistent_disks return persistent_disks + persistent_create_disks + local_nvdimms + local_ssds
def CreatePersistentCreateDiskMessages(compute_client, resources, csek_keys, create_disks, project, location, scope, enable_kms=False, enable_snapshots=False, container_mount_disk=None, resource_policy=False, enable_source_snapshot_csek=False, enable_image_csek=False): """Returns a list of AttachedDisk messages for newly creating disks. Args: compute_client: creates resources, resources: parser of resources, csek_keys: customer suplied encryption keys, create_disks: disk objects - contains following properties * name - the name of disk, * description - an optional description for the disk, * mode - 'rw' (R/W), 'ro' (R/O) access mode, * disk-size - the size of the disk, * disk-type - the type of the disk (HDD or SSD), * image - the name of the image to initialize from, * image-csek-required - the name of the CSK protected image, * image-family - the image family name, * image-project - the project name that has the image, * auto-delete - whether disks is deleted when VM is deleted, * device-name - device name on VM, * source-snapshot - the snapshot to initialize from, * source-snapshot-csek-required - CSK protected snapshot, * disk-resource-policy - resource policies applied to disk. * enable_source_snapshot_csek - CSK file for snapshot, * enable_image_csek - CSK file for image project: Project of instance that will own the new disks. location: Location of the instance that will own the new disks. scope: Location type of the instance that will own the new disks. enable_kms: True if KMS keys are supported for the disk. enable_snapshots: True if snapshot initialization is supported for the disk. container_mount_disk: list of disks to be mounted to container, if any. resource_policy: True if resource-policies are enabled enable_source_snapshot_csek: True if snapshot CSK files are enabled enable_image_csek: True if image CSK files are enabled Returns: list of API messages for attached disks """ disks_messages = [] messages = compute_client.messages compute = compute_client.apitools_client for disk in create_disks or []: name = disk.get('name') # Resolves the mode. mode_value = disk.get('mode', 'rw') if mode_value == 'rw': mode = messages.AttachedDisk.ModeValueValuesEnum.READ_WRITE else: mode = messages.AttachedDisk.ModeValueValuesEnum.READ_ONLY auto_delete_value = disk.get('auto-delete', 'yes') auto_delete = auto_delete_value == 'yes' disk_size_gb = utils.BytesToGb(disk.get('size')) disk_type = disk.get('type') if disk_type: disk_type_ref = instance_utils.ParseDiskType(resources, disk_type, project, location, scope) disk_type_uri = disk_type_ref.SelfLink() else: disk_type_uri = None img = disk.get('image') img_family = disk.get('image-family') img_project = disk.get('image-project') image_uri = None if img or img_family: image_expander = image_utils.ImageExpander(compute_client, resources) image_uri, _ = image_expander.ExpandImageFlag( user_project=project, image=img, image_family=img_family, image_project=img_project, return_image_resource=False) image_key = None disk_key = None if csek_keys: image_key = csek_utils.MaybeLookupKeyMessagesByUri( csek_keys, resources, [image_uri], compute) if name: disk_ref = resources.Parse( name, collection='compute.disks', params={'zone': location}) disk_key = csek_utils.MaybeLookupKeyMessage(csek_keys, disk_ref, compute) if enable_kms: disk_key = kms_utils.MaybeGetKmsKeyFromDict(disk, messages, disk_key) initialize_params = messages.AttachedDiskInitializeParams( diskName=name, description=disk.get('description'), sourceImage=image_uri, diskSizeGb=disk_size_gb, diskType=disk_type_uri, sourceImageEncryptionKey=image_key) if enable_snapshots: snapshot_name = disk.get('source-snapshot') attached_snapshot_uri = instance_utils.ResolveSnapshotURI( snapshot=snapshot_name, user_project=project, resource_parser=resources) if attached_snapshot_uri: initialize_params.sourceImage = None initialize_params.sourceSnapshot = attached_snapshot_uri if resource_policy: policies = disk.get('disk-resource-policy') if policies: initialize_params.resourcePolicies = policies if enable_image_csek: image_key_file = disk.get('image_csek') if image_key_file: initialize_params.imageKeyFile = image_key_file if enable_source_snapshot_csek: snapshot_key_file = disk.get('source_snapshot_csek') if snapshot_key_file: initialize_params.snapshotKeyFile = snapshot_key_file device_name = instance_utils.GetDiskDeviceName(disk, name, container_mount_disk) create_disk = messages.AttachedDisk( autoDelete=auto_delete, boot=False, deviceName=device_name, initializeParams=initialize_params, mode=mode, type=messages.AttachedDisk.TypeValueValuesEnum.PERSISTENT, diskEncryptionKey=disk_key) disks_messages.append(create_disk) return disks_messages
def CreateDiskMessages(args, project, location, scope, compute_client, resource_parser, image_uri, holder=None, boot_disk_size_gb=None, instance_name=None, create_boot_disk=False, csek_keys=None, support_kms=False, support_nvdimm=False, support_source_snapshot_csek=False, support_boot_snapshot_uri=False, support_image_csek=False, support_match_container_mount_disks=False, support_create_disk_snapshots=False, support_persistent_attached_disks=True, support_replica_zones=False, use_disk_type_uri=True, support_multi_writer=False, support_disk_architecture=False): """Creates disk messages for a single instance.""" container_mount_disk = [] if support_match_container_mount_disks: container_mount_disk = args.container_mount_disk persistent_disks = [] if support_persistent_attached_disks: persistent_disks = ( CreatePersistentAttachedDiskMessages( resources=resource_parser, compute_client=compute_client, csek_keys=csek_keys, disks=args.disk or [], project=project, location=location, scope=scope, container_mount_disk=container_mount_disk, use_disk_type_uri=use_disk_type_uri)) persistent_create_disks = ( CreatePersistentCreateDiskMessages( compute_client=compute_client, resources=resource_parser, csek_keys=csek_keys, create_disks=getattr(args, 'create_disk', []), project=project, location=location, scope=scope, holder=holder, enable_kms=support_kms, enable_snapshots=support_create_disk_snapshots, container_mount_disk=container_mount_disk, enable_source_snapshot_csek=support_source_snapshot_csek, enable_image_csek=support_image_csek, support_replica_zones=support_replica_zones, use_disk_type_uri=use_disk_type_uri, support_multi_writer=support_multi_writer, support_disk_architecture=support_disk_architecture)) local_nvdimms = [] if support_nvdimm: local_nvdimms = CreateLocalNvdimmMessages(args, resource_parser, compute_client.messages, location, scope, project) local_ssds = CreateLocalSsdMessages(args, resource_parser, compute_client.messages, location, scope, project, use_disk_type_uri) if create_boot_disk: boot_snapshot_uri = None if support_boot_snapshot_uri: boot_snapshot_uri = instance_utils.ResolveSnapshotURI( user_project=project, snapshot=args.source_snapshot, resource_parser=resource_parser) boot_disk = CreateDefaultBootAttachedDiskMessage( compute_client=compute_client, resources=resource_parser, disk_type=args.boot_disk_type, disk_device_name=args.boot_disk_device_name, disk_auto_delete=args.boot_disk_auto_delete, disk_size_gb=boot_disk_size_gb, require_csek_key_create=(args.require_csek_key_create if csek_keys else None), image_uri=image_uri, instance_name=instance_name, project=project, location=location, scope=scope, enable_kms=support_kms, csek_keys=csek_keys, kms_args=args, snapshot_uri=boot_snapshot_uri, disk_provisioned_iops=args.boot_disk_provisioned_iops, use_disk_type_uri=use_disk_type_uri) persistent_disks = [boot_disk] + persistent_disks # The boot disk must end up at index 0 in the disk messages. if persistent_create_disks and persistent_create_disks[0].boot: boot_disk = persistent_create_disks.pop(0) persistent_disks = [boot_disk] + persistent_disks return persistent_disks + persistent_create_disks + local_nvdimms + local_ssds
def CreatePersistentCreateDiskMessages(compute_client, resources, csek_keys, create_disks, project, location, scope, holder, enable_kms=False, enable_snapshots=False, container_mount_disk=None, enable_source_snapshot_csek=False, enable_image_csek=False, support_replica_zones=False, use_disk_type_uri=True, support_multi_writer=False, support_image_family_scope=False, support_disk_architecture=False): """Returns a list of AttachedDisk messages for newly creating disks. Args: compute_client: creates resources, resources: parser of resources, csek_keys: customer suplied encryption keys, create_disks: disk objects - contains following properties * name - the name of disk, * description - an optional description for the disk, * mode - 'rw' (R/W), 'ro' (R/O) access mode, * disk-size - the size of the disk, * disk-type - the type of the disk (HDD or SSD), * image - the name of the image to initialize from, * image-csek-required - the name of the CSK protected image, * image-family - the image family name, * image-project - the project name that has the image, * auto-delete - whether disks is deleted when VM is deleted, * device-name - device name on VM, * source-snapshot - the snapshot to initialize from, * source-snapshot-csek-required - CSK protected snapshot, * disk-resource-policy - resource policies applied to disk. * enable_source_snapshot_csek - CSK file for snapshot, * enable_image_csek - CSK file for image project: Project of instance that will own the new disks. location: Location of the instance that will own the new disks. scope: Location type of the instance that will own the new disks. holder: Convenience class to hold lazy initialized client and resources. enable_kms: True if KMS keys are supported for the disk. enable_snapshots: True if snapshot initialization is supported for the disk. container_mount_disk: list of disks to be mounted to container, if any. enable_source_snapshot_csek: True if snapshot CSK files are enabled enable_image_csek: True if image CSK files are enabled support_replica_zones: True if we allow creation of regional disks use_disk_type_uri: True to use disk type URI, False if naked type. support_multi_writer: True if we allow multiple instances to write to disk. support_image_family_scope: True if the zonal image views are supported. support_disk_architecture: The machine architecture the created disk is compatible with. Returns: list of API messages for attached disks """ disks_messages = [] messages = compute_client.messages compute = compute_client.apitools_client for disk in create_disks or []: name = disk.get('name') # Resolves the mode. mode_value = disk.get('mode', 'rw') if mode_value == 'rw': mode = messages.AttachedDisk.ModeValueValuesEnum.READ_WRITE else: mode = messages.AttachedDisk.ModeValueValuesEnum.READ_ONLY auto_delete = disk.get('auto-delete', True) disk_size_gb = utils.BytesToGb(disk.get('size')) disk_type = disk.get('type') if disk_type: if use_disk_type_uri: disk_type_ref = instance_utils.ParseDiskType(resources, disk_type, project, location, scope) disk_type = disk_type_ref.SelfLink() else: disk_type = None img = disk.get('image') img_family = disk.get('image-family') img_project = disk.get('image-project') image_family_scope = disk.get('image_family_scope') image_uri = None if img or img_family: image_expander = image_utils.ImageExpander(compute_client, resources) image_uri, _ = image_expander.ExpandImageFlag( user_project=project, image=img, image_family=img_family, image_project=img_project, return_image_resource=False, image_family_scope=image_family_scope, support_image_family_scope=support_image_family_scope) image_key = None disk_key = None if csek_keys: image_key = csek_utils.MaybeLookupKeyMessagesByUri( csek_keys, resources, [image_uri], compute) if name: disk_ref = resources.Parse( name, collection='compute.disks', params={'zone': location}) disk_key = csek_utils.MaybeLookupKeyMessage(csek_keys, disk_ref, compute) if enable_kms: disk_key = kms_utils.MaybeGetKmsKeyFromDict(disk, messages, disk_key) initialize_params = messages.AttachedDiskInitializeParams( diskName=name, description=disk.get('description'), sourceImage=image_uri, diskSizeGb=disk_size_gb, diskType=disk_type, sourceImageEncryptionKey=image_key) replica_zones = disk.get('replica-zones') if support_replica_zones and replica_zones: normalized_zones = [] for zone in replica_zones: zone_ref = holder.resources.Parse( zone, collection='compute.zones', params={'project': project}) normalized_zones.append(zone_ref.SelfLink()) initialize_params.replicaZones = normalized_zones if enable_snapshots: snapshot_name = disk.get('source-snapshot') attached_snapshot_uri = instance_utils.ResolveSnapshotURI( snapshot=snapshot_name, user_project=project, resource_parser=resources) if attached_snapshot_uri: initialize_params.sourceImage = None initialize_params.sourceSnapshot = attached_snapshot_uri policies = disk.get('disk-resource-policy') if policies: initialize_params.resourcePolicies = policies if enable_image_csek: image_key_file = disk.get('image_csek') if image_key_file: initialize_params.imageKeyFile = image_key_file if enable_source_snapshot_csek: snapshot_key_file = disk.get('source_snapshot_csek') if snapshot_key_file: initialize_params.snapshotKeyFile = snapshot_key_file boot = disk.get('boot', False) multi_writer = disk.get('multi-writer') if support_multi_writer and multi_writer: initialize_params.multiWriter = True provisioned_iops = disk.get('provisioned-iops') if provisioned_iops: initialize_params.provisionedIops = provisioned_iops disk_architecture = disk.get('architecture') if support_disk_architecture and disk_architecture: initialize_params.architecture = messages.AttachedDiskInitializeParams.ArchitectureValueValuesEnum( disk_architecture) device_name = instance_utils.GetDiskDeviceName(disk, name, container_mount_disk) create_disk = messages.AttachedDisk( autoDelete=auto_delete, boot=boot, deviceName=device_name, initializeParams=initialize_params, mode=mode, type=messages.AttachedDisk.TypeValueValuesEnum.PERSISTENT, diskEncryptionKey=disk_key) # The boot disk must end up at index 0. if boot: disks_messages = [create_disk] + disks_messages else: disks_messages.append(create_disk) return disks_messages