def Run(self, args): self._ValidateArgs(args) holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) client = holder.client source_instance_template = instance_utils.GetSourceInstanceTemplate( args, holder.resources, self.SOURCE_INSTANCE_TEMPLATE) skip_defaults = instance_utils.GetSkipDefaults( source_instance_template) scheduling = instance_utils.GetScheduling(args, client, skip_defaults) service_accounts = instance_utils.GetServiceAccounts( args, client, skip_defaults) user_metadata = instance_utils.GetValidatedMetadata(args, client) boot_disk_size_gb = instance_utils.GetBootDiskSizeGb(args) instance_refs = instance_utils.GetInstanceRefs(args, client, holder) network_interfaces = self.GetNetworkInterfaces(args, holder.resources, client, holder, instance_refs, skip_defaults) machine_type_uris = instance_utils.GetMachineTypeUris( args, client, holder, instance_refs, skip_defaults) image_uri = self.GetImageUri(args, client, holder, instance_refs) labels = containers_utils.GetLabelsMessageWithCosVersion( args.labels, image_uri, holder.resources, client.messages.Instance) can_ip_forward = instance_utils.GetCanIpForward(args, skip_defaults) tags = containers_utils.CreateTagsMessage(client.messages, args.tags) requests = [] for instance_ref, machine_type_uri in zip(instance_refs, machine_type_uris): metadata = containers_utils.CreateKonletMetadataMessage( client.messages, args, instance_ref.Name(), user_metadata) disks = instance_utils.CreateDiskMessages(holder, args, boot_disk_size_gb, image_uri, instance_ref, skip_defaults) request = client.messages.ComputeInstancesInsertRequest( instance=client.messages.Instance( canIpForward=can_ip_forward, disks=disks, description=args.description, labels=labels, machineType=machine_type_uri, metadata=metadata, minCpuPlatform=args.min_cpu_platform, name=instance_ref.Name(), networkInterfaces=network_interfaces, serviceAccounts=service_accounts, scheduling=scheduling, tags=tags), sourceInstanceTemplate=source_instance_template, project=instance_ref.project, zone=instance_ref.zone) requests.append( (client.apitools_client.instances, 'Insert', request)) return client.MakeRequests(requests)
def _CreateRequests( self, args, instance_refs, compute_client, resource_parser, holder): # gcloud creates default values for some fields in Instance resource # when no value was specified on command line. # When --source-instance-template was specified, defaults are taken from # Instance Template and gcloud flags are used to override them - by default # fields should not be initialized. source_instance_template = self.GetSourceInstanceTemplate( args, resource_parser) skip_defaults = source_instance_template is not None # This feature is only exposed in alpha/beta allow_rsa_encrypted = self.ReleaseTrack() in [base.ReleaseTrack.ALPHA, base.ReleaseTrack.BETA] csek_keys = csek_utils.CsekKeyStore.FromArgs(args, allow_rsa_encrypted) scheduling = instance_utils.GetScheduling( args, compute_client, skip_defaults) tags = instance_utils.GetTags(args, compute_client) labels = instance_utils.GetLabels(args, compute_client) metadata = instance_utils.GetMetadata(args, compute_client, skip_defaults) boot_disk_size_gb = instance_utils.GetBootDiskSizeGb(args) # Compute the shieldedVMConfig message. if self.ReleaseTrack() == base.ReleaseTrack.ALPHA: shieldedvm_config_message = self.BuildShieldedVMConfigMessage( messages=compute_client.messages, args=args) network_interfaces = self._GetNetworkInterfacesWithValidation( args, resource_parser, compute_client, holder, instance_refs, skip_defaults) machine_type_uris = instance_utils.GetMachineTypeUris( args, compute_client, holder, instance_refs, skip_defaults) create_boot_disk = not instance_utils.UseExistingBootDisk(args.disk or []) image_uri = self._GetImageUri( args, compute_client, create_boot_disk, instance_refs, resource_parser) disks_messages = self._GetDiskMessagess( args, skip_defaults, instance_refs, compute_client, resource_parser, create_boot_disk, boot_disk_size_gb, image_uri, csek_keys) project_to_sa = self._GetProjectToServiceAccountMap( args, instance_refs, compute_client, skip_defaults) requests = [] for instance_ref, machine_type_uri, disks in zip( instance_refs, machine_type_uris, disks_messages): can_ip_forward = instance_utils.GetCanIpForward(args, skip_defaults) guest_accelerators = instance_utils.GetAccelerators( args, compute_client, resource_parser, instance_ref) instance = compute_client.messages.Instance( canIpForward=can_ip_forward, deletionProtection=args.deletion_protection, description=args.description, disks=disks, guestAccelerators=guest_accelerators, labels=labels, machineType=machine_type_uri, metadata=metadata, minCpuPlatform=args.min_cpu_platform, name=instance_ref.Name(), networkInterfaces=network_interfaces, serviceAccounts=project_to_sa[instance_ref.project], scheduling=scheduling, tags=tags) if self.ReleaseTrack() in [base.ReleaseTrack.ALPHA]: instance.shieldedVmConfig = shieldedvm_config_message sole_tenancy_host = self._GetGetSoleTenancyHost( args, resource_parser, instance_ref) if sole_tenancy_host: instance.host = sole_tenancy_host request = compute_client.messages.ComputeInstancesInsertRequest( instance=instance, project=instance_ref.project, zone=instance_ref.zone) if source_instance_template: request.sourceInstanceTemplate = source_instance_template requests.append( (compute_client.apitools_client.instances, 'Insert', request)) return requests
def _CreateRequests( self, args, instance_refs, compute_client, resource_parser, holder): # gcloud creates default values for some fields in Instance resource # when no value was specified on command line. # When --source-instance-template was specified, defaults are taken from # Instance Template and gcloud flags are used to override them - by default # fields should not be initialized. source_instance_template = self.GetSourceInstanceTemplate( args, resource_parser) skip_defaults = source_instance_template is not None source_machine_image = self.GetSourceMachineImage( args, resource_parser) skip_defaults = skip_defaults or source_machine_image is not None scheduling = instance_utils.GetScheduling( args, compute_client, skip_defaults, support_node_affinity=True, support_min_node_cpus=self._support_min_node_cpus, support_location_hint=self._support_location_hint) tags = instance_utils.GetTags(args, compute_client) labels = instance_utils.GetLabels(args, compute_client) metadata = instance_utils.GetMetadata(args, compute_client, skip_defaults) boot_disk_size_gb = instance_utils.GetBootDiskSizeGb(args) network_interfaces = self._GetNetworkInterfacesWithValidation( args, resource_parser, compute_client, holder, instance_refs, skip_defaults) machine_type_uris = instance_utils.GetMachineTypeUris( args, compute_client, holder, instance_refs, skip_defaults) create_boot_disk = not instance_utils.UseExistingBootDisk(args.disk or []) image_uri = self._GetImageUri( args, compute_client, create_boot_disk, instance_refs, resource_parser) shielded_instance_config = self._BuildShieldedInstanceConfigMessage( messages=compute_client.messages, args=args) if self._support_confidential_compute: confidential_instance_config = ( self._BuildConfidentialInstanceConfigMessage( messages=compute_client.messages, args=args)) # TODO(b/80138906): Release track should not be used like this. # These feature are only exposed in alpha/beta allow_rsa_encrypted = False if self.ReleaseTrack() in [base.ReleaseTrack.ALPHA, base.ReleaseTrack.BETA]: allow_rsa_encrypted = True csek_keys = csek_utils.CsekKeyStore.FromArgs(args, allow_rsa_encrypted) disks_messages = self._GetDiskMessages( args, skip_defaults, instance_refs, compute_client, resource_parser, create_boot_disk, boot_disk_size_gb, image_uri, csek_keys) project_to_sa = self._GetProjectToServiceAccountMap( args, instance_refs, compute_client, skip_defaults) requests = [] for instance_ref, machine_type_uri, disks in zip( instance_refs, machine_type_uris, disks_messages): can_ip_forward = instance_utils.GetCanIpForward(args, skip_defaults) guest_accelerators = instance_utils.GetAccelerators( args, compute_client, resource_parser, instance_ref) instance = compute_client.messages.Instance( canIpForward=can_ip_forward, deletionProtection=args.deletion_protection, description=args.description, disks=disks, guestAccelerators=guest_accelerators, hostname=args.hostname, labels=labels, machineType=machine_type_uri, metadata=metadata, minCpuPlatform=args.min_cpu_platform, name=instance_ref.Name(), networkInterfaces=network_interfaces, serviceAccounts=project_to_sa[instance_ref.project], scheduling=scheduling, tags=tags) resource_policies = getattr( args, 'resource_policies', None) if resource_policies: parsed_resource_policies = [] for policy in resource_policies: resource_policy_ref = maintenance_util.ParseResourcePolicyWithZone( resource_parser, policy, project=instance_ref.project, zone=instance_ref.zone) parsed_resource_policies.append(resource_policy_ref.SelfLink()) instance.resourcePolicies = parsed_resource_policies if shielded_instance_config: instance.shieldedInstanceConfig = shielded_instance_config if self._support_confidential_compute and confidential_instance_config: instance.confidentialInstanceConfig = confidential_instance_config if self._support_erase_vss and \ args.IsSpecified('erase_windows_vss_signature'): instance.eraseWindowsVssSignature = args.erase_windows_vss_signature request = compute_client.messages.ComputeInstancesInsertRequest( instance=instance, project=instance_ref.project, zone=instance_ref.zone) if source_instance_template: request.sourceInstanceTemplate = source_instance_template if source_machine_image: request.instance.sourceMachineImage = source_machine_image if args.IsSpecified('source_machine_image_csek_key_file'): key = instance_utils.GetSourceMachineImageKey( args, self.SOURCE_MACHINE_IMAGE, compute_client, holder) request.instance.sourceMachineImageEncryptionKey = key if self._support_machine_image_key and \ args.IsSpecified('source_machine_image_csek_key_file'): if not args.IsSpecified('source_machine_image'): raise exceptions.RequiredArgumentException( '`--source-machine-image`', '`--source-machine-image-csek-key-file` requires ' '`--source-machine-image` to be specified`') if args.IsSpecified('enable_display_device'): request.instance.displayDevice = compute_client.messages.DisplayDevice( enableDisplay=args.enable_display_device) request.instance.reservationAffinity = instance_utils.GetReservationAffinity( args, compute_client) requests.append( (compute_client.apitools_client.instances, 'Insert', request)) return requests
def _CreateRequests(self, args, instance_refs, compute_client, resource_parser, holder): # gcloud creates default values for some fields in Instance resource # when no value was specified on command line. # When --source-instance-template was specified, defaults are taken from # Instance Template and gcloud flags are used to override them - by default # fields should not be initialized. source_instance_template = self.GetSourceInstanceTemplate( args, resource_parser) skip_defaults = source_instance_template is not None source_machine_image = self.GetSourceMachineImage( args, resource_parser) skip_defaults = skip_defaults or source_machine_image is not None scheduling = instance_utils.GetScheduling(args, compute_client, skip_defaults, support_node_affinity=True) tags = instance_utils.GetTags(args, compute_client) labels = instance_utils.GetLabels(args, compute_client) metadata = instance_utils.GetMetadata(args, compute_client, skip_defaults) boot_disk_size_gb = instance_utils.GetBootDiskSizeGb(args) network_interfaces = self._GetNetworkInterfacesWithValidation( args, resource_parser, compute_client, holder, instance_refs, skip_defaults) machine_type_uris = instance_utils.GetMachineTypeUris( args, compute_client, holder, instance_refs, skip_defaults) create_boot_disk = not instance_utils.UseExistingBootDisk(args.disk or []) image_uri = self._GetImageUri(args, compute_client, create_boot_disk, instance_refs, resource_parser) # TODO(b/80138906): Release track should not be used like this. # These feature are only exposed in alpha/beta shielded_vm_config = None allow_rsa_encrypted = False if self.ReleaseTrack() in [ base.ReleaseTrack.ALPHA, base.ReleaseTrack.BETA ]: allow_rsa_encrypted = True shielded_vm_config = self._BuildShieldedVMConfigMessage( messages=compute_client.messages, args=args) csek_keys = csek_utils.CsekKeyStore.FromArgs(args, allow_rsa_encrypted) disks_messages = self._GetDiskMessages(args, skip_defaults, instance_refs, compute_client, resource_parser, create_boot_disk, boot_disk_size_gb, image_uri, csek_keys) project_to_sa = self._GetProjectToServiceAccountMap( args, instance_refs, compute_client, skip_defaults) requests = [] for instance_ref, machine_type_uri, disks in zip( instance_refs, machine_type_uris, disks_messages): can_ip_forward = instance_utils.GetCanIpForward( args, skip_defaults) guest_accelerators = instance_utils.GetAccelerators( args, compute_client, resource_parser, instance_ref) instance = compute_client.messages.Instance( canIpForward=can_ip_forward, deletionProtection=args.deletion_protection, description=args.description, disks=disks, guestAccelerators=guest_accelerators, labels=labels, machineType=machine_type_uri, metadata=metadata, minCpuPlatform=args.min_cpu_platform, name=instance_ref.Name(), networkInterfaces=network_interfaces, serviceAccounts=project_to_sa[instance_ref.project], scheduling=scheduling, tags=tags) if hasattr(args, 'hostname'): instance.hostname = args.hostname # TODO(b/80138906): These features are only exposed in alpha. if self.ReleaseTrack() == base.ReleaseTrack.ALPHA: instance.allocationAffinity = instance_utils.GetAllocationAffinity( args, compute_client) resource_policies = getattr(args, 'resource_policies', None) if resource_policies: parsed_resource_policies = [] for policy in resource_policies: resource_policy_ref = maintenance_util.ParseResourcePolicyWithZone( resource_parser, policy, project=instance_ref.project, zone=instance_ref.zone) parsed_resource_policies.append( resource_policy_ref.SelfLink()) instance.resourcePolicies = parsed_resource_policies if shielded_vm_config: instance.shieldedVmConfig = shielded_vm_config request = compute_client.messages.ComputeInstancesInsertRequest( instance=instance, project=instance_ref.project, zone=instance_ref.zone) if source_instance_template: request.sourceInstanceTemplate = source_instance_template if source_machine_image: request.instance.sourceMachineImage = source_machine_image requests.append( (compute_client.apitools_client.instances, 'Insert', request)) return requests