示例#1
0
    def __init__(self, client, path, mime_type='application/octet-stream'):
        self.client = client
        self.path = path
        self.bucket, self.name = parse_gcs_path(path)

        self.closed = False
        self.position = 0

        # Set up communication with uploading thread.
        parent_conn, child_conn = multiprocessing.Pipe()
        self.conn = parent_conn

        # Set up uploader.
        self.insert_request = (storage.StorageObjectsInsertRequest(
            bucket=self.bucket, name=self.name))
        self.upload = transfer.Upload(GcsBufferedWriter.PipeStream(child_conn),
                                      mime_type)
        self.upload.strategy = transfer.RESUMABLE_UPLOAD

        # Start uploading thread.
        self.upload_thread = threading.Thread(target=self._start_upload)
        self.upload_thread.daemon = True
        self.upload_thread.start()
示例#2
0
    def stage_file(self,
                   gcs_or_local_path,
                   file_name,
                   stream,
                   mime_type='application/octet-stream'):
        """Stages a file at a GCS or local path with stream-supplied contents."""
        if not gcs_or_local_path.startswith('gs://'):
            local_path = os.path.join(gcs_or_local_path, file_name)
            logging.info('Staging file locally to %s', local_path)
            with open(local_path, 'wb') as f:
                f.write(stream.read())
            return
        gcs_location = gcs_or_local_path + '/' + file_name
        bucket, name = gcs_location[5:].split('/', 1)

        request = storage.StorageObjectsInsertRequest(bucket=bucket, name=name)
        logging.info('Starting GCS upload to %s...', gcs_location)
        upload = storage.Upload(stream, mime_type)
        try:
            response = self._storage_client.objects.Insert(request,
                                                           upload=upload)
        except exceptions.HttpError as e:
            reportable_errors = {
                403: 'access denied',
                404: 'bucket not found',
            }
            if e.status_code in reportable_errors:
                raise IOError(
                    ('Could not upload to GCS path %s: %s. Please verify '
                     'that credentials are valid and that you have write '
                     'access to the specified path. Stale credentials can be '
                     'refreshed by executing "gcloud auth login".') %
                    (gcs_or_local_path, reportable_errors[e.status_code]))
            raise
        logging.info('Completed GCS upload to %s', gcs_location)
        return response