)]}'
{"releasenotes/notes/support-chunked-encoding-d71f53225f68edf3.yaml":[{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"9b24afa176d666e75bf530843f170ce6415fdf83","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - The RestClient (in tempest.lib.common.rest_client) now supports POSTing"},{"line_number":4,"context_line":"    and PUTing data with chunked transfer encoding. Just pass an `iterable`"},{"line_number":5,"context_line":"    object as the `body` argument and set the `chunked` argument to `True`."},{"line_number":6,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":11,"id":"bab6814e_f57c0322","line":6,"updated":"2016-05-25 14:17:48.000000000","message":"NIT: I guess you should mention the chunkify helper as well since is added into lib.","commit_id":"b62ebdc5ed329747944855e9a1f7b1708fecb1dd"}],"tempest/api/object_storage/test_object_services.py":[{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"d772c04492361dd2685102a6784494488bee4807","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        status, _, resp_headers \u003d self.object_client.put_object_with_chunk("},{"line_number":201,"context_line":"            container\u003dself.container_name,"},{"line_number":202,"context_line":"            name\u003dobject_name,"},{"line_number":203,"context_line":"            contents\u003ddata,"},{"line_number":204,"context_line":"            chunk_size\u003d512)"},{"line_number":205,"context_line":"        self.assertHeaders(resp_headers, \u0027Object\u0027, \u0027PUT\u0027)"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_fa84040c","line":203,"updated":"2016-05-25 09:39:31.000000000","message":"The chunkify should be used here, not in the method.","commit_id":"cd458bc6d6e2452122eef266d2753ad9db8e39f1"},{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"d772c04492361dd2685102a6784494488bee4807","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            container\u003dself.container_name,"},{"line_number":202,"context_line":"            name\u003dobject_name,"},{"line_number":203,"context_line":"            contents\u003ddata,"},{"line_number":204,"context_line":"            chunk_size\u003d512)"},{"line_number":205,"context_line":"        self.assertHeaders(resp_headers, \u0027Object\u0027, \u0027PUT\u0027)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        # check uploaded content"}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_bab8bcc8","line":204,"updated":"2016-05-25 09:39:31.000000000","message":"chunk size does not needs to be a paremeter with the new api.","commit_id":"cd458bc6d6e2452122eef266d2753ad9db8e39f1"}],"tempest/lib/common/utils/data_utils.py":[{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"af26a4d479494adb3167da7ea2fdb0d6c862690d","unresolved":false,"context_lines":[{"line_number":201,"context_line":""},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"# Courtesy of http://stackoverflow.com/a/312464"},{"line_number":204,"context_line":"def chunkify(iterable, chunksize):"},{"line_number":205,"context_line":"    \"\"\"Yield successive chunks from `iterable`.\"\"\""},{"line_number":206,"context_line":"    for i in six.moves.xrange(0, len(iterable), chunksize):"},{"line_number":207,"context_line":"        yield iterable[i:i + chunksize]"}],"source_content_type":"text/x-python","patch_set":7,"id":"bab6814e_b22aca2a","line":204,"updated":"2016-05-24 15:39:33.000000000","message":"Please pick a solution which really able to use iterable, or rename this variable to sliceable.","commit_id":"a2aef9f37fce3938ddfada6947144fcbc6962116"},{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"4a48dc6fb5657873da8d78a9d091883bac7a8195","unresolved":false,"context_lines":[{"line_number":204,"context_line":"def chunkify(sliceable, chunksize):"},{"line_number":205,"context_line":"    \"\"\"Yield successive chunks from `sliceable`."},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    Note: a sliceable is an iterable that supports slicing."},{"line_number":208,"context_line":"    \"\"\""},{"line_number":209,"context_line":"    for i in six.moves.xrange(0, len(sliceable), chunksize):"},{"line_number":210,"context_line":"        yield sliceable[i:i + chunksize]"}],"source_content_type":"text/x-python","patch_set":9,"id":"bab6814e_8562df14","line":207,"updated":"2016-05-24 16:42:58.000000000","message":"https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence\n\nIt also needs to be at lest \u0027sized iterable\u0027 with getitem support. It sounds like sequence.","commit_id":"63918cfa1cb902c1d6d394e6235302a5734de963"}],"tempest/services/object_storage/object_client.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"23685cc045d0ceeacd029834e5cf28566e293596","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            headers[\u0027X-Auth-Token\u0027] \u003d self.token"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        url \u003d \"%s/%s\" % (container, name)"},{"line_number":160,"context_line":"        resp, body \u003d self.request("},{"line_number":161,"context_line":"            \u0027PUT\u0027, url, headers\u003dheaders,"},{"line_number":162,"context_line":"            body\u003ddata_utils.chunkify(contents, chunk_size),"},{"line_number":163,"context_line":"            chunked\u003dTrue"}],"source_content_type":"text/x-python","patch_set":7,"id":"bab6814e_a66c0236","line":160,"updated":"2016-05-19 23:51:13.000000000","message":"I guess this was easier than adding a chunked kwarg to the individual http method rest_client methods. (well only put and post I guess, the others don\u0027t make sense)\nI\u0027m fine with this, but it does seem a bit inconsistent with the other usage of self.put","commit_id":"a2aef9f37fce3938ddfada6947144fcbc6962116"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"47daddd176f39f38dc00e35ec81f9150ebc43baa","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            headers[\u0027X-Auth-Token\u0027] \u003d self.token"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        url \u003d \"%s/%s\" % (container, name)"},{"line_number":160,"context_line":"        resp, body \u003d self.request("},{"line_number":161,"context_line":"            \u0027PUT\u0027, url, headers\u003dheaders,"},{"line_number":162,"context_line":"            body\u003ddata_utils.chunkify(contents, chunk_size),"},{"line_number":163,"context_line":"            chunked\u003dTrue"}],"source_content_type":"text/x-python","patch_set":7,"id":"bab6814e_9e4cf777","line":160,"in_reply_to":"bab6814e_16ed9525","updated":"2016-05-24 14:36:40.000000000","message":"Well it\u0027ll be more than 1 test case right? We\u0027re gonna use this on the glance service clients too. It\u0027s basically gonna be used wherever we\u0027re uploading binary blobs to a service. That\u0027s why I was think we might want to add \u0027chunked\u003dTrue\u0027 to post/put definitions. But, like I said it\u0027s not a big deal, and something that\u0027s easy to add later","commit_id":"a2aef9f37fce3938ddfada6947144fcbc6962116"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"0dc2cfb4391fbf9cdba7cd65aba58481f34692a0","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            headers[\u0027X-Auth-Token\u0027] \u003d self.token"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        url \u003d \"%s/%s\" % (container, name)"},{"line_number":160,"context_line":"        resp, body \u003d self.request("},{"line_number":161,"context_line":"            \u0027PUT\u0027, url, headers\u003dheaders,"},{"line_number":162,"context_line":"            body\u003ddata_utils.chunkify(contents, chunk_size),"},{"line_number":163,"context_line":"            chunked\u003dTrue"}],"source_content_type":"text/x-python","patch_set":7,"id":"bab6814e_16ed9525","line":160,"in_reply_to":"bab6814e_a66c0236","updated":"2016-05-24 13:17:14.000000000","message":"It\u0027s not really about simplicity. I don\u0027t really like to add \", **kwargs)\" in a method signature (**kwargs is a bit opaque I think). But I don\"t like to carry around/pass \u0027chunked\u003dTrue\u0027 in all of the methods (post/put) just to support one test case.\n\nSo, I\u0027ll call it a choice :) No strong opinion on the matter though, so if someone has a different opinion, I am fine changing it.","commit_id":"a2aef9f37fce3938ddfada6947144fcbc6962116"},{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"d772c04492361dd2685102a6784494488bee4807","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        if self.token:"},{"line_number":156,"context_line":"            headers[\u0027X-Auth-Token\u0027] \u003d self.token"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        conn \u003d put_object_connection(self.base_url, container, name, contents,"},{"line_number":159,"context_line":"                                     chunk_size, headers)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        resp \u003d conn.getresponse()"}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_5a72707d","side":"PARENT","line":158,"updated":"2016-05-25 09:39:31.000000000","message":"content is a stream with read method().","commit_id":"c808dc503b090ce3cb65236aafc85e540947b46e"},{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"d772c04492361dd2685102a6784494488bee4807","unresolved":false,"context_lines":[{"line_number":270,"context_line":"            if \u0027Transfer-Encoding\u0027 not in headers:"},{"line_number":271,"context_line":"                conn.putheader(\u0027Transfer-Encoding\u0027, \u0027chunked\u0027)"},{"line_number":272,"context_line":"            conn.endheaders()"},{"line_number":273,"context_line":"            chunk \u003d contents.read(chunk_size)"},{"line_number":274,"context_line":"            while chunk:"},{"line_number":275,"context_line":"                conn.send(\u0027%x\\r\\n%s\\r\\n\u0027 % (len(chunk), chunk))"},{"line_number":276,"context_line":"                chunk \u003d contents.read(chunk_size)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bab6814e_5ac43091","side":"PARENT","line":273,"updated":"2016-05-25 09:39:31.000000000","message":"read here had the chunk_size.","commit_id":"c808dc503b090ce3cb65236aafc85e540947b46e"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"9b24afa176d666e75bf530843f170ce6415fdf83","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        return resp, body"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def put_object_with_chunk(self, container, name, contents):"},{"line_number":153,"context_line":"        \"\"\"Put an object with Transfer-Encoding header\"\"\""},{"line_number":154,"context_line":"        headers \u003d {\u0027Transfer-Encoding\u0027: \u0027chunked\u0027}"},{"line_number":155,"context_line":"        if self.token:"},{"line_number":156,"context_line":"            headers[\u0027X-Auth-Token\u0027] \u003d self.token"}],"source_content_type":"text/x-python","patch_set":11,"id":"bab6814e_75d3f338","line":153,"updated":"2016-05-25 14:17:48.000000000","message":"NIT: I think it would be helpful to document in here what type of object contents should be,","commit_id":"b62ebdc5ed329747944855e9a1f7b1708fecb1dd"},{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"4d69d9061a5717c06fcba972fb713c46bac6cd33","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        :param name: name of the object"},{"line_number":158,"context_line":"        :type name: string"},{"line_number":159,"context_line":"        :param contents: object data"},{"line_number":160,"context_line":"        :type contents: iterable"},{"line_number":161,"context_line":"        \"\"\""},{"line_number":162,"context_line":"        headers \u003d {\u0027Transfer-Encoding\u0027: \u0027chunked\u0027}"},{"line_number":163,"context_line":"        if self.token:"}],"source_content_type":"text/x-python","patch_set":12,"id":"bab6814e_23dd87e0","line":160,"updated":"2016-05-26 10:51:43.000000000","message":"iterable alone is not too helpful,\nit accepts multiple thinks one of them is \u0027iterable of sting_or_binaries\u0027 (For example.: list of strings)","commit_id":"4408c4a5fe5a862a7e05d0df8b7990fd1c6053e1"}]}
