Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
  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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
    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)))