Esempio n. 1
0
 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)
Esempio n. 2
0
    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
Esempio n. 3
0
  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
Esempio n. 4
0
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)])