def Run(self, args):
        holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
        client = holder.client
        messages = client.messages

        disk_ref = disks_flags.MakeDiskArgZonalOrRegional(
            plural=False).ResolveAsResource(args, holder.resources)
        if disk_ref.Collection() == 'compute.regionDisks':
            disk_region = disk_ref.region
        else:
            disk_region = compute_utils.ZoneNameToRegionName(disk_ref.zone)

        resource_policies = []
        for policy in args.resource_policies:
            resource_policy_ref = util.ParseResourcePolicy(
                holder.resources,
                policy,
                project=disk_ref.project,
                region=disk_region)
            resource_policies.append(resource_policy_ref.SelfLink())

        if disk_ref.Collection() == 'compute.regionDisks':
            add_request = messages.ComputeRegionDisksAddResourcePoliciesRequest(
                disk=disk_ref.Name(),
                project=disk_ref.project,
                region=disk_ref.region,
                regionDisksAddResourcePoliciesRequest=messages.
                RegionDisksAddResourcePoliciesRequest(
                    resourcePolicies=resource_policies))
            return client.MakeRequests([(client.apitools_client.regionDisks,
                                         'AddResourcePolicies', add_request)])
        else:
            add_request = messages.ComputeDisksAddResourcePoliciesRequest(
                disk=disk_ref.Name(),
                project=disk_ref.project,
                zone=disk_ref.zone,
                disksAddResourcePoliciesRequest=messages.
                DisksAddResourcePoliciesRequest(
                    resourcePolicies=resource_policies))
            return client.MakeRequests([(client.apitools_client.disks,
                                         'AddResourcePolicies', add_request)])
Example #2
0
  def Run(self, args):
    holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
    client = holder.client.apitools_client
    messages = holder.client.messages

    disk_ref = disks_flags.MakeDiskArg(
        plural=False).ResolveAsResource(args, holder.resources)
    disk_info = api_util.GetDiskInfo(disk_ref, client, messages)
    disk_region = disk_info.GetDiskRegionName()

    resource_policies = []
    for policy in args.resource_policies:
      resource_policy_ref = util.ParseResourcePolicy(
          holder.resources,
          policy,
          project=disk_ref.project,
          region=disk_region)
      resource_policies.append(resource_policy_ref.SelfLink())

    return disk_info.MakeRemoveResourcePoliciesRequest(resource_policies,
                                                       holder.client)
Example #3
0
  def _Run(self, args, supports_kms_keys=False, supports_physical_block=False,
           support_shared_disk=False, support_vss_erase=False):
    compute_holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
    client = compute_holder.client

    self.show_unformated_message = not (args.IsSpecified('image') or
                                        args.IsSpecified('image_family') or
                                        args.IsSpecified('source_snapshot'))
    if self.source_disk_enabled:
      self.show_unformated_message = self.show_unformated_message and not (
          args.IsSpecified('source_disk'))

    disk_refs = self.ValidateAndParseDiskRefs(args, compute_holder)
    from_image = self.GetFromImage(args)
    size_gb = self.GetDiskSizeGb(args, from_image)
    self.WarnAboutScopeDeprecationsAndMaintenance(disk_refs, client)
    project_to_source_image = self.GetProjectToSourceImageDict(
        args, disk_refs, compute_holder, from_image)
    snapshot_uri = self.GetSnapshotUri(args, compute_holder)

    # Those features are only exposed in alpha/beta, it would be nice to have
    # code supporting them only in alpha and beta versions of the command.
    labels = self.GetLabels(args, client)

    allow_rsa_encrypted = self.ReleaseTrack() in [base.ReleaseTrack.ALPHA,
                                                  base.ReleaseTrack.BETA]
    csek_keys = csek_utils.CsekKeyStore.FromArgs(args, allow_rsa_encrypted)

    for project in project_to_source_image:
      source_image_uri = project_to_source_image[project].uri
      project_to_source_image[project].keys = (
          csek_utils.MaybeLookupKeyMessagesByUri(
              csek_keys, compute_holder.resources,
              [source_image_uri, snapshot_uri], client.apitools_client))

    # end of alpha/beta features.

    guest_os_feature_messages = _ParseGuestOsFeaturesToMessages(
        args, client.messages)

    requests = []
    for disk_ref in disk_refs:
      type_uri = self.GetDiskTypeUri(args, disk_ref, compute_holder)

      # Those features are only exposed in alpha/beta, it would be nice to have
      # code supporting them only in alpha and beta versions of the command.
      # TODO(b/65161039): Stop checking release path in the middle of GA code.
      kwargs = {}
      if csek_keys:
        disk_key_or_none = csek_keys.LookupKey(
            disk_ref, args.require_csek_key_create)
        disk_key_message_or_none = csek_utils.MaybeToMessage(
            disk_key_or_none, client.apitools_client)
        kwargs['diskEncryptionKey'] = disk_key_message_or_none
        kwargs['sourceImageEncryptionKey'] = (
            project_to_source_image[disk_ref.project].keys[0])
        kwargs['sourceSnapshotEncryptionKey'] = (
            project_to_source_image[disk_ref.project].keys[1])
      if labels:
        kwargs['labels'] = labels

      if supports_kms_keys:
        kwargs['diskEncryptionKey'] = kms_utils.MaybeGetKmsKey(
            args, client.messages, kwargs.get('diskEncryptionKey', None))

      # end of alpha/beta features.

      if supports_physical_block and args.IsSpecified('physical_block_size'):
        physical_block_size_bytes = int(args.physical_block_size)
      else:
        physical_block_size_bytes = None

      resource_policies = getattr(args, 'resource_policies', None)
      if resource_policies:
        if disk_ref.Collection() == 'compute.regionDisks':
          disk_region = disk_ref.region
        else:
          disk_region = utils.ZoneNameToRegionName(disk_ref.zone)
        parsed_resource_policies = []
        for policy in resource_policies:
          resource_policy_ref = resource_util.ParseResourcePolicy(
              compute_holder.resources,
              policy,
              project=disk_ref.project,
              region=disk_region)
          parsed_resource_policies.append(resource_policy_ref.SelfLink())
        kwargs['resourcePolicies'] = parsed_resource_policies

      disk = client.messages.Disk(
          name=disk_ref.Name(),
          description=args.description,
          sizeGb=size_gb,
          sourceSnapshot=snapshot_uri,
          type=type_uri,
          physicalBlockSizeBytes=physical_block_size_bytes,
          **kwargs)
      if self.source_disk_enabled:
        source_disk_ref = self.GetSourceDiskUri(args, compute_holder)
        disk.sourceDisk = source_disk_ref
      if (support_shared_disk and disk_ref.Collection() == 'compute.regionDisks'
          and args.IsSpecified('multi_writer')):
        raise exceptions.InvalidArgumentException('--multi-writer', (
            '--multi-writer can be used only with --zone flag'))

      if (support_shared_disk and disk_ref.Collection() == 'compute.disks' and
          args.IsSpecified('multi_writer')):
        disk.multiWriter = args.multi_writer

      if guest_os_feature_messages:
        disk.guestOsFeatures = guest_os_feature_messages

      if support_vss_erase and args.IsSpecified('erase_windows_vss_signature'):
        disk.eraseWindowsVssSignature = args.erase_windows_vss_signature

      disk.licenses = self.ParseLicenses(args)

      if disk_ref.Collection() == 'compute.disks':
        request = client.messages.ComputeDisksInsertRequest(
            disk=disk,
            project=disk_ref.project,
            sourceImage=project_to_source_image[disk_ref.project].uri,
            zone=disk_ref.zone)

        request = (client.apitools_client.disks, 'Insert', request)
      elif disk_ref.Collection() == 'compute.regionDisks':
        disk.replicaZones = self.GetReplicaZones(args, compute_holder, disk_ref)
        request = client.messages.ComputeRegionDisksInsertRequest(
            disk=disk,
            project=disk_ref.project,
            sourceImage=project_to_source_image[disk_ref.project].uri,
            region=disk_ref.region)

        request = (client.apitools_client.regionDisks, 'Insert', request)

      requests.append(request)

    return client.MakeRequests(requests)