예제 #1
0
    def CreateObject(self,
                     bucket_uri=None,
                     object_name=None,
                     contents=None,
                     prefer_json_api=False,
                     encryption_key=None,
                     mtime=None):
        """Creates a test object.

    Args:
      bucket_uri: The URI of the bucket to place the object in. If not
                  specified, a new temporary bucket is created.
      object_name: The name to use for the object. If not specified, a temporary
                   test object name is constructed.
      contents: The contents to write to the object. If not specified, the key
                is not written to, which means that it isn't actually created
                yet on the server.
      prefer_json_api: If true, use the JSON creation functions where possible.
      encryption_key: AES256 encryption key to use when creating the object,
          if any.
      mtime: The modification time of the file in POSIX time (seconds since
             UTC 1970-01-01). If not specified, this defaults to the current
             system time.

    Returns:
      A StorageUri for the created object.
    """
        bucket_uri = bucket_uri or self.CreateBucket()

        if contents and bucket_uri.scheme == 'gs' and (prefer_json_api
                                                       or encryption_key):
            object_name = object_name or self.MakeTempName('obj')
            json_object = self.CreateObjectJson(
                contents=contents,
                bucket_name=bucket_uri.bucket_name,
                object_name=object_name,
                encryption_key=encryption_key,
                mtime=mtime)
            object_uri = bucket_uri.clone_replace_name(object_name)
            # pylint: disable=protected-access
            # Need to update the StorageUri with the correct values while
            # avoiding creating a versioned string.

            md5 = (Base64ToHexHash(json_object.md5Hash),
                   json_object.md5Hash.strip('\n"\''))
            object_uri._update_from_values(None,
                                           json_object.generation,
                                           True,
                                           md5=md5)
            # pylint: enable=protected-access
            return object_uri

        bucket_uri = bucket_uri or self.CreateBucket()
        object_name = object_name or self.MakeTempName('obj')
        key_uri = bucket_uri.clone_replace_name(object_name)
        if contents is not None:
            key_uri.set_contents_from_string(contents)
        if mtime is not None:
            key_uri.set_metadata({MTIME_ATTR: mtime}, {}, True)
        return key_uri
예제 #2
0
    def CreateObject(self,
                     bucket_uri=None,
                     object_name=None,
                     contents=None,
                     prefer_json_api=False):
        """Creates a test object.

    Args:
      bucket_uri: The URI of the bucket to place the object in. If not
                  specified, a new temporary bucket is created.
      object_name: The name to use for the object. If not specified, a temporary
                   test object name is constructed.
      contents: The contents to write to the object. If not specified, the key
                is not written to, which means that it isn't actually created
                yet on the server.
      prefer_json_api: If true, use the JSON creation functions where possible.

    Returns:
      A StorageUri for the created object.
    """
        bucket_uri = bucket_uri or self.CreateBucket()

        if prefer_json_api and bucket_uri.scheme == 'gs' and contents:
            object_name = object_name or self.MakeTempName('obj')
            json_object = self.CreateObjectJson(
                contents=contents,
                bucket_name=bucket_uri.bucket_name,
                object_name=object_name)
            object_uri = bucket_uri.clone_replace_name(object_name)
            # pylint: disable=protected-access
            # Need to update the StorageUri with the correct values while
            # avoiding creating a versioned string.
            object_uri._update_from_values(
                None,
                json_object.generation,
                True,
                md5=(Base64ToHexHash(json_object.md5Hash),
                     json_object.md5Hash.strip('\n"\'')))
            # pylint: enable=protected-access
            return object_uri

        bucket_uri = bucket_uri or self.CreateBucket()
        object_name = object_name or self.MakeTempName('obj')
        key_uri = bucket_uri.clone_replace_name(object_name)
        if contents is not None:
            key_uri.set_contents_from_string(contents)
        return key_uri
예제 #3
0
  def _ParseOpts(cls, sub_opts, logger):
    """Returns behavior variables based on input options.

    Args:
      sub_opts: getopt sub-arguments for the command.
      logger: logging.Logger for the command.

    Returns:
      Tuple of
      calc_crc32c: Boolean, if True, command should calculate a CRC32c checksum.
      calc_md5: Boolean, if True, command should calculate an MD5 hash.
      format_func: Function used for formatting the hash in the desired format.
      cloud_format_func: Function used for formatting the hash in the desired
                         format.
      output_format: String describing the hash output format.
    """
    calc_crc32c = False
    calc_md5 = False
    format_func = lambda digest: Base64EncodeHash(digest.hexdigest())
    cloud_format_func = lambda digest: digest
    found_hash_option = False
    output_format = 'base64'

    if sub_opts:
      for o, unused_a in sub_opts:
        if o == '-c':
          calc_crc32c = True
          found_hash_option = True
        elif o == '-h':
          output_format = 'hex'
          format_func = lambda digest: digest.hexdigest()
          cloud_format_func = lambda digest: Base64ToHexHash(digest)
        elif o == '-m':
          calc_md5 = True
          found_hash_option = True

    if not found_hash_option:
      calc_crc32c = True
      calc_md5 = True

    if calc_crc32c and not UsingCrcmodExtension(crcmod):
      logger.warn(SLOW_CRCMOD_WARNING)

    return calc_crc32c, calc_md5, format_func, cloud_format_func, output_format
예제 #4
0
    def CreateObject(self,
                     bucket_uri=None,
                     object_name=None,
                     contents=None,
                     prefer_json_api=False,
                     encryption_key=None,
                     mode=None,
                     mtime=None,
                     uid=None,
                     gid=None,
                     storage_class=None,
                     gs_idempotent_generation=0,
                     kms_key_name=None):
        """Creates a test object.

    Args:
      bucket_uri: The URI of the bucket to place the object in. If not
          specified, a new temporary bucket is created.
      object_name: The name to use for the object. If not specified, a temporary
          test object name is constructed.
      contents: The contents to write to the object. If not specified, the key
          is not written to, which means that it isn't actually created
          yet on the server.
      prefer_json_api: If true, use the JSON creation functions where possible.
      encryption_key: AES256 encryption key to use when creating the object,
          if any.
      mode: The POSIX mode for the object. Must be a base-8 3-digit integer
          represented as a string.
      mtime: The modification time of the file in POSIX time (seconds since
          UTC 1970-01-01). If not specified, this defaults to the current
          system time.
      uid: A POSIX user ID.
      gid: A POSIX group ID.
      storage_class: String representing the storage class to use for the
          object.
      gs_idempotent_generation: For use when overwriting an object for which
          you know the previously uploaded generation. Create GCS object
          idempotently by supplying this generation number as a precondition
          and assuming the current object is correct on precondition failure.
          Defaults to 0 (new object); to disable, set to None.
      kms_key_name: Fully-qualified name of the KMS key that should be used to
          encrypt the object. Note that this is currently only valid for 'gs'
          objects.

    Returns:
      A StorageUri for the created object.
    """
        bucket_uri = bucket_uri or self.CreateBucket()

        if (contents and bucket_uri.scheme == 'gs'
                and (prefer_json_api or encryption_key or kms_key_name)):

            object_name = object_name or self.MakeTempName('obj')
            json_object = self.CreateObjectJson(
                contents=contents,
                bucket_name=bucket_uri.bucket_name,
                object_name=object_name,
                encryption_key=encryption_key,
                mtime=mtime,
                storage_class=storage_class,
                gs_idempotent_generation=gs_idempotent_generation,
                kms_key_name=kms_key_name)
            object_uri = bucket_uri.clone_replace_name(object_name)
            # pylint: disable=protected-access
            # Need to update the StorageUri with the correct values while
            # avoiding creating a versioned string.

            md5 = (Base64ToHexHash(json_object.md5Hash),
                   json_object.md5Hash.strip('\n"\''))
            object_uri._update_from_values(None,
                                           json_object.generation,
                                           True,
                                           md5=md5)
            # pylint: enable=protected-access
            return object_uri

        bucket_uri = bucket_uri or self.CreateBucket()
        object_name = object_name or self.MakeTempName('obj')
        key_uri = bucket_uri.clone_replace_name(object_name)
        if contents is not None:
            if bucket_uri.scheme == 'gs' and gs_idempotent_generation is not None:
                try:
                    key_uri.set_contents_from_string(
                        contents,
                        headers={
                            'x-goog-if-generation-match':
                            str(gs_idempotent_generation)
                        })
                except StorageResponseError, e:
                    if e.status == 412:
                        pass
                    else:
                        raise
            else:
                key_uri.set_contents_from_string(contents)