(self, params, bundle, size_remaining)
| 210 | return size |
| 211 | |
| 212 | def _multipart_upload_to_s3(self, params, bundle, size_remaining): |
| 213 | create_response = self.s3.create_multipart_upload( |
| 214 | Bucket=params.bucket, Key=params.key |
| 215 | ) |
| 216 | upload_id = create_response['UploadId'] |
| 217 | try: |
| 218 | part_num = 1 |
| 219 | multipart_list = [] |
| 220 | bundle.seek(0) |
| 221 | while size_remaining > 0: |
| 222 | data = bundle.read(MULTIPART_LIMIT) |
| 223 | upload_response = self.s3.upload_part( |
| 224 | Bucket=params.bucket, |
| 225 | Key=params.key, |
| 226 | UploadId=upload_id, |
| 227 | PartNumber=part_num, |
| 228 | Body=BytesIO(data), |
| 229 | ) |
| 230 | multipart_list.append( |
| 231 | {'PartNumber': part_num, 'ETag': upload_response['ETag']} |
| 232 | ) |
| 233 | part_num += 1 |
| 234 | size_remaining -= len(data) |
| 235 | return self.s3.complete_multipart_upload( |
| 236 | Bucket=params.bucket, |
| 237 | Key=params.key, |
| 238 | UploadId=upload_id, |
| 239 | MultipartUpload={'Parts': multipart_list}, |
| 240 | ) |
| 241 | except ClientError as e: |
| 242 | self.s3.abort_multipart_upload( |
| 243 | Bucket=params.bucket, Key=params.key, UploadId=upload_id |
| 244 | ) |
| 245 | raise e |
| 246 | |
| 247 | def _register_revision(self, params): |
| 248 | revision = { |
no test coverage detected