'Makes a final commit of the data.
:param object_path: Server side object path.
:type object_path: ``str``
:param upload_id: ID of the multipart upload.
:type upload_id: ``str``
:param upload_id: A list of (chunk_number, chunk_hash) tuples.
:type upload_id: ``list``
:keyword container: The container owning the object to which data is
being uploaded
:type container: :class:`Container`'

def _commit_multipart(self, object_path, upload_id, chunks, container=None):

    root = Element('CompleteMultipartUpload')
    for (count, etag) in chunks:
        part = SubElement(root, 'Part')
        part_no = SubElement(part, 'PartNumber')
        part_no.text = str(count)
        etag_id = SubElement(part, 'ETag')
        etag_id.text = str(etag)
    data = tostring(root)
    params = {'uploadId': upload_id}
    request_path = '?'.join((object_path, urlencode(params)))
    response = self.connection.request(request_path, data=data, method='POST', container=container)
    if (response.status != httplib.OK):
        element = response.object
        (code, message) = response._parse_error_details(element=element)
        msg = ('Error    in    multipart    commit:    %s    (%s)' % (message, code))
        raise LibcloudError(msg, driver=self)
    body = response.parse_body()
    server_hash = body.find(fixxpath(xpath='ETag', namespace=self.namespace)).text
    return server_hash
