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)])
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)
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)