def GetNamesAndAddresses(self, args): """Returns names and addresses provided in args.""" if not args.addresses and not args.names: raise exceptions.ToolException( 'At least one name or address must be provided.') if args.names: names = args.names else: # If we dont have any names then we must some addresses. names = [ name_generator.GenerateRandomName() for _ in args.addresses ] if args.addresses: addresses = args.addresses else: # If we dont have any addresses then we must some names. addresses = [None] * len(args.names) if len(addresses) != len(names): raise exceptions.ToolException( 'If providing both, you must specify the same number of names as ' 'addresses.') return names, addresses
def CreateRequests(self, args): """Returns a list of requests necessary for snapshotting disks.""" disk_refs = disks_flags.DISKS_ARG.ResolveAsResource( args, self.resources, scope_lister=flags.GetDefaultScopeLister(self.compute_client, self.project)) if args.snapshot_names: if len(disk_refs) != len(args.snapshot_names): raise exceptions.ToolException( '[--snapshot-names] must have the same number of values as disks ' 'being snapshotted.') snapshot_names = args.snapshot_names else: # Generates names like "d52jsqy3db4q". snapshot_names = [ name_generator.GenerateRandomName() for _ in disk_refs ] snapshot_refs = [ self.resources.Parse(snapshot_name, collection='compute.snapshots') for snapshot_name in snapshot_names ] self._target_to_get_request = {} requests = [] for disk_ref, snapshot_ref in zip(disk_refs, snapshot_refs): # 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) disk_key_or_none = csek_utils.MaybeLookupKeyMessage( csek_keys, disk_ref, self.compute) # TODO(user) drop test after 'guestFlush' goes GA if hasattr(args, 'guest_flush') and args.guest_flush: request_kwargs = {'guestFlush': True} else: request_kwargs = {} request = self.messages.ComputeDisksCreateSnapshotRequest( disk=disk_ref.Name(), snapshot=self.messages.Snapshot( name=snapshot_ref.Name(), description=args.description, sourceDiskEncryptionKey=disk_key_or_none), project=self.project, zone=disk_ref.zone, **request_kwargs) requests.append(request) self._target_to_get_request[disk_ref.SelfLink()] = ( snapshot_ref.SelfLink(), self.compute.snapshots, self.messages.ComputeSnapshotsGetRequest( snapshot=snapshot_ref.Name(), project=self.project)) return requests
def CreateRequests(self, args): """Returns a list of requests necessary for snapshotting disks.""" if args.snapshot_names: if len(args.disk_names) != len(args.snapshot_names): raise exceptions.ToolException( '[--snapshot-names] must have the same number of values as disks ' 'being snapshotted.') snapshot_names = args.snapshot_names else: # Generates names like "d52jsqy3db4q". snapshot_names = [name_generator.GenerateRandomName() for _ in args.disk_names] snapshot_refs = [ self.CreateGlobalReference(snapshot_name, resource_type='snapshots') for snapshot_name in snapshot_names] self._target_to_get_request = {} requests = [] disk_refs = self.CreateZonalReferences( args.disk_names, args.zone, resource_type='disks') for disk_ref, snapshot_ref in zip(disk_refs, snapshot_refs): # TODO(user) drop test after CSEK goes GA if hasattr(args, 'csek_key_file'): csek_keys = csek_utils.CsekKeyStore.FromArgs(args) disk_key_or_none = csek_utils.MaybeLookupKeyMessage(csek_keys, disk_ref, self.compute) kwargs = {'sourceDiskEncryptionKey': disk_key_or_none} else: kwargs = {} request = self.messages.ComputeDisksCreateSnapshotRequest( disk=disk_ref.Name(), snapshot=self.messages.Snapshot( name=snapshot_ref.Name(), description=args.description, **kwargs ), project=self.project, zone=disk_ref.zone) requests.append(request) self._target_to_get_request[disk_ref.SelfLink()] = ( snapshot_ref.SelfLink(), self.compute.snapshots, self.messages.ComputeSnapshotsGetRequest( snapshot=snapshot_ref.Name(), project=self.project)) return requests
def CreateRequests(self, args): """Returns a list of requests necessary for snapshotting disks.""" if args.snapshot_names: if len(args.disk_names) != len(args.snapshot_names): raise exceptions.ToolException( '[--snapshot-names] must have the same number of values as disks ' 'being snapshotted.') snapshot_names = args.snapshot_names else: # Generates names like "d52jsqy3db4q". snapshot_names = [ name_generator.GenerateRandomName() for _ in args.disk_names ] snapshot_refs = [ self.CreateGlobalReference(snapshot_name, resource_type='snapshots') for snapshot_name in snapshot_names ] self._target_to_get_request = {} requests = [] disk_refs = self.CreateZonalReferences(args.disk_names, args.zone, resource_type='disks') for disk_ref, snapshot_ref in zip(disk_refs, snapshot_refs): request = self.messages.ComputeDisksCreateSnapshotRequest( disk=disk_ref.Name(), snapshot=self.messages.Snapshot( name=snapshot_ref.Name(), description=args.description, ), project=self.project, zone=disk_ref.zone) requests.append(request) self._target_to_get_request[disk_ref.SelfLink()] = ( snapshot_ref.SelfLink(), self.compute.snapshots, self.messages.ComputeSnapshotsGetRequest( snapshot=snapshot_ref.Name(), project=self.project)) return requests
def Run(self, args): """Returns a list of requests necessary for snapshotting disks.""" holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) disk_refs = SnapshotDisks.disks_arg.ResolveAsResource( args, holder.resources, scope_lister=flags.GetDefaultScopeLister(holder.client)) if args.snapshot_names: if len(disk_refs) != len(args.snapshot_names): raise exceptions.ToolException( '[--snapshot-names] must have the same number of values as disks ' 'being snapshotted.') snapshot_names = args.snapshot_names else: # Generates names like "d52jsqy3db4q". snapshot_names = [ name_generator.GenerateRandomName() for _ in disk_refs ] snapshot_refs = [ holder.resources.Parse( snapshot_name, params={ 'project': properties.VALUES.core.project.GetOrFail, }, collection='compute.snapshots') for snapshot_name in snapshot_names ] client = holder.client.apitools_client messages = holder.client.messages requests = [] for disk_ref, snapshot_ref in zip(disk_refs, snapshot_refs): # 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) disk_key_or_none = csek_utils.MaybeLookupKeyMessage( csek_keys, disk_ref, client) snapshot_message = messages.Snapshot( name=snapshot_ref.Name(), description=args.description, sourceDiskEncryptionKey=disk_key_or_none) if (hasattr(args, 'storage_location') and args.IsSpecified('storage_location')): snapshot_message.storageLocations = [args.storage_location] if (hasattr(args, 'labels') and args.IsSpecified('labels')): snapshot_message.labels = labels_util.ParseCreateArgs( args, messages.Snapshot.LabelsValue) if disk_ref.Collection() == 'compute.disks': request = messages.ComputeDisksCreateSnapshotRequest( disk=disk_ref.Name(), snapshot=snapshot_message, project=disk_ref.project, zone=disk_ref.zone, guestFlush=args.guest_flush) requests.append((client.disks, 'CreateSnapshot', request)) elif disk_ref.Collection() == 'compute.regionDisks': request = messages.ComputeRegionDisksCreateSnapshotRequest( disk=disk_ref.Name(), snapshot=snapshot_message, project=disk_ref.project, region=disk_ref.region) if hasattr(request, 'guestFlush'): # only available in alpha API guest_flush = getattr(args, 'guest_flush', None) if guest_flush is not None: request.guestFlush = guest_flush requests.append( (client.regionDisks, 'CreateSnapshot', request)) errors_to_collect = [] responses = holder.client.BatchRequests(requests, errors_to_collect) for r in responses: err = getattr(r, 'error', None) if err: errors_to_collect.append(poller.OperationErrors(err.errors)) if errors_to_collect: raise core_exceptions.MultiError(errors_to_collect) operation_refs = [ holder.resources.Parse(r.selfLink) for r in responses ] if args. async: for operation_ref in operation_refs: log.status.Print('Disk snapshot in progress for [{}].'.format( operation_ref.SelfLink())) log.status.Print( 'Use [gcloud compute operations describe URI] command ' 'to check the status of the operation(s).') return responses operation_poller = poller.BatchPoller(holder.client, client.snapshots, snapshot_refs) return waiter.WaitFor(operation_poller, poller.OperationBatch(operation_refs), 'Creating snapshot(s) {0}'.format(', '.join( s.Name() for s in snapshot_refs)), max_wait_ms=None)
def Run(self, args): """Returns a list of requests necessary for snapshotting disks.""" holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) disk_refs = SnapshotDisks.disks_arg.ResolveAsResource( args, holder.resources, scope_lister=flags.GetDefaultScopeLister(holder.client)) if args.snapshot_names: if len(disk_refs) != len(args.snapshot_names): raise exceptions.ToolException( '[--snapshot-names] must have the same number of values as disks ' 'being snapshotted.') snapshot_names = args.snapshot_names else: # Generates names like "d52jsqy3db4q". snapshot_names = [ name_generator.GenerateRandomName() for _ in disk_refs ] snapshot_refs = [ holder.resources.Parse(snapshot_name, collection='compute.snapshots') for snapshot_name in snapshot_names ] client = holder.client.apitools_client messages = holder.client.messages requests = [] for disk_ref, snapshot_ref in zip(disk_refs, snapshot_refs): # 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) disk_key_or_none = csek_utils.MaybeLookupKeyMessage( csek_keys, disk_ref, client) # TODO(user) drop test after 'guestFlush' goes GA if hasattr(args, 'guest_flush') and args.guest_flush: request_kwargs = {'guestFlush': True} else: request_kwargs = {} if disk_ref.Collection() == 'compute.disks': request = messages.ComputeDisksCreateSnapshotRequest( disk=disk_ref.Name(), snapshot=messages.Snapshot( name=snapshot_ref.Name(), description=args.description, sourceDiskEncryptionKey=disk_key_or_none), project=disk_ref.project, zone=disk_ref.zone, **request_kwargs) requests.append((client.disks, 'CreateSnapshot', request)) elif disk_ref.Collection() == 'compute.regionDisks': request = messages.ComputeRegionDisksCreateSnapshotRequest( disk=disk_ref.Name(), snapshot=messages.Snapshot( name=snapshot_ref.Name(), description=args.description, sourceDiskEncryptionKey=disk_key_or_none), project=disk_ref.project, region=disk_ref.region, **request_kwargs) requests.append( (client.regionDisks, 'CreateSnapshot', request)) errors_to_collect = [] responses = holder.client.BatchRequests(requests, errors_to_collect) if errors_to_collect: raise core_exceptions.MultiError(errors_to_collect) operation_refs = [ holder.resources.Parse(r.selfLink) for r in responses ] if args. async: for operation_ref in operation_refs: log.status.Print('Disk snapshot in progress for [{}].'.format( operation_ref.SelfLink())) log.status.Print( 'Use [gcloud compute operations describe URI] command ' 'to check the status of the operation(s).') return responses operation_poller = poller.BatchPoller(holder.client, client.snapshots, snapshot_refs) return waiter.WaitFor( operation_poller, poller.OperationBatch(operation_refs), 'Creating snapshot(s) {0}'.format(', '.join( s.Name() for s in snapshot_refs)))