Skip to content

Commit

Permalink
Refactor XML handling of _complete_multipart_upload() API
Browse files Browse the repository at this point in the history
  • Loading branch information
balamurugana committed Oct 21, 2020
1 parent c5536a7 commit 955bacc
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 50 deletions.
11 changes: 4 additions & 7 deletions minio/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@
from . import __title__, __version__
from .commonconfig import Tags
from .credentials import StaticProvider
from .datatypes import ListAllMyBucketsResult, Object, parse_list_objects
from .datatypes import (CompleteMultipartUploadResult, ListAllMyBucketsResult,
Object, parse_list_objects)
from .definitions import BaseURL, ObjectWriteResult, Part
from .deleteobjects import DeleteError, DeleteRequest, DeleteResult
from .error import InvalidResponseError, S3Error, ServerError
Expand All @@ -61,7 +62,6 @@
from .parsers import (parse_error_response,
parse_list_multipart_uploads,
parse_list_parts,
parse_multipart_upload_result,
parse_new_multipart_upload)
from .replicationconfig import ReplicationConfig
from .select import SelectObjectReader
Expand Down Expand Up @@ -1189,10 +1189,7 @@ def _complete_multipart_upload(
},
query_params={'uploadId': upload_id},
)
return (
parse_multipart_upload_result(response.data),
response.getheader("x-amz-version-id"),
)
return CompleteMultipartUploadResult(response)

def _create_multipart_upload(self, bucket_name, object_name, headers):
"""Execute CreateMultipartUpload S3 API."""
Expand Down Expand Up @@ -1358,7 +1355,7 @@ def put_object( # pylint: disable=too-many-branches,too-many-statements
result = self._complete_multipart_upload(
bucket_name, object_name, upload_id, parts,
)
return result[0].etag, result[1]
return result.etag, result.version_id
except Exception as exc:
if upload_id:
self._abort_multipart_upload(
Expand Down
45 changes: 45 additions & 0 deletions minio/datatypes.py
Original file line number Diff line number Diff line change
Expand Up @@ -233,3 +233,48 @@ def parse_list_objects(response, bucket_name):
if continuation_token is None and is_truncated:
continuation_token = marker
return objects, is_truncated, continuation_token, version_id_marker


class CompleteMultipartUploadResult:
"""CompleteMultipartUpload API result."""

def __init__(self, response):
element = ET.fromstring(response.data.decode())
self._bucket_name = findtext(element, "Bucket")
self._object_name = findtext(element, "Key")
self._location = findtext(element, "Location")
self._etag = findtext(element, "ETag")
if self._etag:
self._etag = self._etag.replace('"', "")
self._version_id = response.getheader("x-amz-version-id")
self._http_headers = response.getheaders()

@property
def bucket_name(self):
"""Get bucket name."""
return self._bucket_name

@property
def object_name(self):
"""Get object name."""
return self._object_name

@property
def location(self):
"""Get location."""
return self._location

@property
def etag(self):
"""Get etag."""
return self._etag

@property
def version_id(self):
"""Get version ID."""
return self._version_id

@property
def http_headers(self):
"""Get HTTP headers."""
return self._http_headers
24 changes: 0 additions & 24 deletions minio/definitions.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,30 +257,6 @@ def build(
return url


class MultipartUploadResult:
"""
A completed multipart upload metadata
:class:`MultipartUploadResult <MultipartUploadResult>`.
:param bucket_name: Bucket name.
:param object_name: Object name.
:param location: Object uploaded location.
:param etag: Object final etag.
"""

def __init__(self, bucket_name, object_name, location, etag):
self.bucket_name = bucket_name
self.object_name = object_name
self.location = location
self.etag = etag

def __str__(self):
string_format = ("<IncompleteUpload: bucket_name: {0}"
" object_name: {1} location: {2} etag: {3}>")
return string_format.format(self.bucket_name, self.object_name,
self.location, self.etag)


class Upload:
""" Upload information of a multipart upload."""

Expand Down
20 changes: 1 addition & 19 deletions minio/parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@
from xml.etree import ElementTree
from xml.etree.ElementTree import ParseError

from .definitions import (ListMultipartUploadsResult, ListPartsResult,
MultipartUploadResult)
from .definitions import ListMultipartUploadsResult, ListPartsResult
from .error import S3Error
from .helpers import strptime_rfc3339

Expand Down Expand Up @@ -168,23 +167,6 @@ def _get_text(name):
)


def parse_multipart_upload_result(data):
"""
Parser for complete multipart upload response.
:param data: Response data for complete multipart upload.
:return: :class:`MultipartUploadResult <MultipartUploadResult>`.
"""
root = S3Element.fromstring('CompleteMultipartUploadResult', data)

return MultipartUploadResult(
root.get_child_text('Bucket'),
root.get_child_text('Key'),
root.get_child_text('Location'),
root.get_etag_elem()
)


def parse_new_multipart_upload(data):
"""
Parser for new multipart upload response.
Expand Down

0 comments on commit 955bacc

Please sign in to comment.