def _CreateDiskMessages(self, holder, args, boot_disk_size_gb, image_uri, project, match_container_mount_disks=False): """Creates API messages with disks attached to VM instance.""" container_mount_disk = (args.container_mount_disk if match_container_mount_disks else []) persistent_disks = ( instance_template_utils.CreatePersistentAttachedDiskMessages( holder.client.messages, args.disk or [], container_mount_disk=container_mount_disk)) boot_disk_list = [ instance_template_utils.CreateDefaultBootAttachedDiskMessage( messages=holder.client.messages, 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, image_uri=image_uri)] persistent_create_disks = ( instance_template_utils.CreatePersistentCreateDiskMessages( holder.client, holder.resources, project, getattr(args, 'create_disk', []), container_mount_disk=container_mount_disk)) local_nvdimms = instance_utils.CreateLocalNvdimmMessages( args, holder.resources, holder.client.messages, ) local_ssds = instance_utils.CreateLocalSsdMessages( args, holder.resources, holder.client.messages, ) return (boot_disk_list + persistent_disks + persistent_create_disks + local_nvdimms + local_ssds)
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 _RunCreate(compute_api, args, support_source_instance, support_kms=False, support_min_node_cpus=False, support_confidential_compute=False): """Common routine for creating instance template. This is shared between various release tracks. Args: compute_api: The compute api. args: argparse.Namespace, An object that contains the values for the arguments specified in the .Args() method. support_source_instance: indicates whether source instance is supported. support_kms: Indicate whether KMS is integrated or not. support_min_node_cpus: Indicate whether the --min-node-cpus flag for sole tenancy overcommit is supported. support_confidential_compute: Indicate whether confidential compute is supported. Returns: A resource object dispatched by display.Displayer(). """ _ValidateInstancesFlags(args, support_kms=support_kms) instances_flags.ValidateNetworkTierArgs(args) client = compute_api.client boot_disk_size_gb = utils.BytesToGb(args.boot_disk_size) utils.WarnIfDiskSizeIsTooSmall(boot_disk_size_gb, args.boot_disk_type) instance_template_ref = (Create.InstanceTemplateArg.ResolveAsResource( args, compute_api.resources)) metadata = metadata_utils.ConstructMetadataMessage( client.messages, metadata=args.metadata, metadata_from_file=args.metadata_from_file) if hasattr(args, 'network_interface') and args.network_interface: network_interfaces = ( instance_template_utils.CreateNetworkInterfaceMessages)( resources=compute_api.resources, scope_lister=flags.GetDefaultScopeLister(client), messages=client.messages, network_interface_arg=args.network_interface, region=args.region) else: network_tier = getattr(args, 'network_tier', None) network_interfaces = [ instance_template_utils.CreateNetworkInterfaceMessage( resources=compute_api.resources, scope_lister=flags.GetDefaultScopeLister(client), messages=client.messages, network=args.network, private_ip=args.private_network_ip, region=args.region, subnet=args.subnet, address=(instance_template_utils.EPHEMERAL_ADDRESS if not args.no_address and not args.address else args.address), network_tier=network_tier) ] # Compute the shieldedInstanceConfig message. shieldedinstance_config_message = BuildShieldedInstanceConfigMessage( messages=client.messages, args=args) if support_confidential_compute: confidential_instance_config_message = ( BuildConfidentialInstanceConfigMessage(messages=client.messages, args=args)) node_affinities = sole_tenancy_util.GetSchedulingNodeAffinityListFromArgs( args, client.messages) min_node_cpus = None if support_min_node_cpus and args.IsSpecified('min_node_cpus'): min_node_cpus = args.min_node_cpus scheduling = instance_utils.CreateSchedulingMessage( messages=client.messages, maintenance_policy=args.maintenance_policy, preemptible=args.preemptible, restart_on_failure=args.restart_on_failure, node_affinities=node_affinities, min_node_cpus=min_node_cpus) if args.no_service_account: service_account = None else: service_account = args.service_account service_accounts = instance_utils.CreateServiceAccountMessages( messages=client.messages, scopes=[] if args.no_scopes else args.scopes, service_account=service_account) create_boot_disk = not instance_utils.UseExistingBootDisk(args.disk or []) if create_boot_disk: image_expander = image_utils.ImageExpander(client, compute_api.resources) try: image_uri, _ = image_expander.ExpandImageFlag( user_project=instance_template_ref.project, image=args.image, image_family=args.image_family, image_project=args.image_project, return_image_resource=True) except utils.ImageNotFoundError as e: if args.IsSpecified('image_project'): raise e image_uri, _ = image_expander.ExpandImageFlag( user_project=instance_template_ref.project, image=args.image, image_family=args.image_family, image_project=args.image_project, return_image_resource=False) raise utils.ImageNotFoundError( 'The resource [{}] was not found. Is the image located in another ' 'project? Use the --image-project flag to specify the ' 'project where the image is located.'.format(image_uri)) else: image_uri = None if args.tags: tags = client.messages.Tags(items=args.tags) else: tags = None persistent_disks = ( instance_template_utils.CreatePersistentAttachedDiskMessages( client.messages, args.disk or [])) persistent_create_disks = ( instance_template_utils.CreatePersistentCreateDiskMessages( client, compute_api.resources, instance_template_ref.project, getattr(args, 'create_disk', []), support_kms=support_kms)) if create_boot_disk: boot_disk_list = [ instance_template_utils.CreateDefaultBootAttachedDiskMessage( messages=client.messages, 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, image_uri=image_uri, kms_args=args, support_kms=support_kms) ] else: boot_disk_list = [] local_nvdimms = instance_utils.CreateLocalNvdimmMessages( args, compute_api.resources, client.messages, ) local_ssds = instance_utils.CreateLocalSsdMessages( args, compute_api.resources, client.messages, ) disks = (boot_disk_list + persistent_disks + persistent_create_disks + local_nvdimms + local_ssds) machine_type = instance_utils.InterpretMachineType( machine_type=args.machine_type, custom_cpu=args.custom_cpu, custom_memory=args.custom_memory, ext=getattr(args, 'custom_extensions', None), vm_type=getattr(args, 'custom_vm_type', None)) guest_accelerators = ( instance_template_utils.CreateAcceleratorConfigMessages( client.messages, getattr(args, 'accelerator', None))) instance_template = client.messages.InstanceTemplate( properties=client.messages.InstanceProperties( machineType=machine_type, disks=disks, canIpForward=args.can_ip_forward, metadata=metadata, minCpuPlatform=args.min_cpu_platform, networkInterfaces=network_interfaces, serviceAccounts=service_accounts, scheduling=scheduling, tags=tags, guestAccelerators=guest_accelerators, ), description=args.description, name=instance_template_ref.Name(), ) instance_template.properties.shieldedInstanceConfig = shieldedinstance_config_message instance_template.properties.reservationAffinity = instance_utils.GetReservationAffinity( args, client) if support_confidential_compute: instance_template.properties.confidentialInstanceConfig = ( confidential_instance_config_message) request = client.messages.ComputeInstanceTemplatesInsertRequest( instanceTemplate=instance_template, project=instance_template_ref.project) request.instanceTemplate.properties.labels = labels_util.ParseCreateArgs( args, client.messages.InstanceProperties.LabelsValue) _AddSourceInstanceToTemplate(compute_api, args, instance_template, support_source_instance) return client.MakeRequests([(client.apitools_client.instanceTemplates, 'Insert', request)])