)]}'
{"glance/store/vmware_datastore.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"f979454fb8eb1c7a50123e70a6a030b2831ae2be","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    def process_specs(self):"},{"line_number":136,"context_line":"        self.scheme \u003d self.specs.get(\u0027scheme\u0027, STORE_SCHEME)"},{"line_number":137,"context_line":"        self.server_host \u003d self.specs.get(\u0027server_host\u0027)"},{"line_number":138,"context_line":"        self.path \u003d (DS_URL_PREFIX + \u0027/\u0027 +"},{"line_number":139,"context_line":"                     format_image_dir(self.specs.get(\u0027image_dir\u0027))"},{"line_number":140,"context_line":"                     + \u0027/\u0027 + self.specs.get(\u0027image_id\u0027))"},{"line_number":141,"context_line":"        dc_path \u003d self.specs.get(\u0027datacenter_path\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F%2F4T8%3D","line":138,"updated":"2014-03-13 07:18:04.000000000","message":"Why don\u0027t use os.path.join?","commit_id":"7a155fb5b13620be1c9b566f42be5ae0d32ee5c7"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"79791c4664938d1a0fbc1a2434c7542d5cd8ac99","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    def process_specs(self):"},{"line_number":136,"context_line":"        self.scheme \u003d self.specs.get(\u0027scheme\u0027, STORE_SCHEME)"},{"line_number":137,"context_line":"        self.server_host \u003d self.specs.get(\u0027server_host\u0027)"},{"line_number":138,"context_line":"        self.path \u003d (DS_URL_PREFIX + \u0027/\u0027 +"},{"line_number":139,"context_line":"                     format_image_dir(self.specs.get(\u0027image_dir\u0027))"},{"line_number":140,"context_line":"                     + \u0027/\u0027 + self.specs.get(\u0027image_id\u0027))"},{"line_number":141,"context_line":"        dc_path \u003d self.specs.get(\u0027datacenter_path\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F%2FxiY%3D","line":138,"in_reply_to":"AAAAWH%2F%2F4T8%3D","updated":"2014-03-13 21:59:57.000000000","message":"Done","commit_id":"7a155fb5b13620be1c9b566f42be5ae0d32ee5c7"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"f979454fb8eb1c7a50123e70a6a030b2831ae2be","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        return base_url + \u0027?\u0027 + self.query"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def _is_valid_path(self, path):"},{"line_number":160,"context_line":"        return path.startswith("},{"line_number":161,"context_line":"            DS_URL_PREFIX + \u0027/\u0027 +"},{"line_number":162,"context_line":"            format_image_dir(CONF.vmware_store_image_dir))"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F%2F4TU%3D","line":160,"updated":"2014-03-13 07:18:04.000000000","message":"ditto","commit_id":"7a155fb5b13620be1c9b566f42be5ae0d32ee5c7"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"79791c4664938d1a0fbc1a2434c7542d5cd8ac99","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        return base_url + \u0027?\u0027 + self.query"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def _is_valid_path(self, path):"},{"line_number":160,"context_line":"        return path.startswith("},{"line_number":161,"context_line":"            DS_URL_PREFIX + \u0027/\u0027 +"},{"line_number":162,"context_line":"            format_image_dir(CONF.vmware_store_image_dir))"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAWH%2F%2FxiU%3D","line":160,"in_reply_to":"AAAAWH%2F%2F4TU%3D","updated":"2014-03-13 21:59:57.000000000","message":"Done","commit_id":"7a155fb5b13620be1c9b566f42be5ae0d32ee5c7"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"0bd0d6c3218679037e893aba3c16205cb10819d0","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        return False"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"def format_image_dir(image_dir):"},{"line_number":94,"context_line":"    if image_dir.startswith(\u0027/\u0027):"},{"line_number":95,"context_line":"        image_dir \u003d image_dir[1:]"},{"line_number":96,"context_line":"    if image_dir.endswith(\u0027/\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2FvJE%3D","line":93,"updated":"2014-03-14 05:36:39.000000000","message":"I think I was a bit exhausted when I wrote this function... strip(\u0027/\u0027) does the same thing.","commit_id":"8d738a84a6b9fc87a2ba68f10983fe4b147f245d"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"03ab956c180bec896467e72da4595c1216b6abe6","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        :retval tuple of URL in backing store, bytes written, checksum"},{"line_number":258,"context_line":"                and a dictionary with storage system specific information"},{"line_number":259,"context_line":"        :raises `glance.common.exception.Duplicate` if the image already"},{"line_number":260,"context_line":"                existed"},{"line_number":261,"context_line":"        \"\"\""},{"line_number":262,"context_line":"        checksum \u003d hashlib.md5()"},{"line_number":263,"context_line":"        image_file \u003d _Reader(image_file, checksum)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2FvF0%3D","line":260,"updated":"2014-03-14 06:03:56.000000000","message":"and UnexpectedStatus exception","commit_id":"8d738a84a6b9fc87a2ba68f10983fe4b147f245d"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"f21ae8e9d2d3913baf20722c2436dc0803ca3631","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        :retval tuple of URL in backing store, bytes written, checksum"},{"line_number":258,"context_line":"                and a dictionary with storage system specific information"},{"line_number":259,"context_line":"        :raises `glance.common.exception.Duplicate` if the image already"},{"line_number":260,"context_line":"                existed"},{"line_number":261,"context_line":"        \"\"\""},{"line_number":262,"context_line":"        checksum \u003d hashlib.md5()"},{"line_number":263,"context_line":"        image_file \u003d _Reader(image_file, checksum)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2Fu1U%3D","line":260,"in_reply_to":"AAAAWH%2F%2FvF0%3D","updated":"2014-03-14 06:15:32.000000000","message":"Good catch. I will add it to my next PS.","commit_id":"8d738a84a6b9fc87a2ba68f10983fe4b147f245d"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"03ab956c180bec896467e72da4595c1216b6abe6","unresolved":false,"context_lines":[{"line_number":278,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":279,"context_line":"                LOG.exception(_(\u0027Failed to upload content of image \u0027"},{"line_number":280,"context_line":"                                \u0027%(image)s to URL %(url)s\u0027) %"},{"line_number":281,"context_line":"                              {\u0027image\u0027: image_id, \u0027url\u0027: loc.get_uri()})"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"        if res.status \u003d\u003d httplib.CONFLICT:"},{"line_number":284,"context_line":"            raise exception.Duplicate(_(\"Image file %(image_id)s already \""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2FvG0%3D","line":281,"updated":"2014-03-14 06:03:56.000000000","message":"According to [1] I prefer to don\u0027t log any location information in log, at here and below ones.\n\n[1] https://github.com/openstack/glance/commit/f6e41e9c0ff3aa9ee57b8c8ed8c789f1aff019bc","commit_id":"8d738a84a6b9fc87a2ba68f10983fe4b147f245d"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"f21ae8e9d2d3913baf20722c2436dc0803ca3631","unresolved":false,"context_lines":[{"line_number":278,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":279,"context_line":"                LOG.exception(_(\u0027Failed to upload content of image \u0027"},{"line_number":280,"context_line":"                                \u0027%(image)s to URL %(url)s\u0027) %"},{"line_number":281,"context_line":"                              {\u0027image\u0027: image_id, \u0027url\u0027: loc.get_uri()})"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"        if res.status \u003d\u003d httplib.CONFLICT:"},{"line_number":284,"context_line":"            raise exception.Duplicate(_(\"Image file %(image_id)s already \""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2Fu0w%3D","line":281,"in_reply_to":"AAAAWH%2F%2FvG0%3D","updated":"2014-03-14 06:15:32.000000000","message":"I think the location URI here is not harmful tbh. However, I understand your point and will remove it for consistency with the other stores.","commit_id":"8d738a84a6b9fc87a2ba68f10983fe4b147f245d"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"03ab956c180bec896467e72da4595c1216b6abe6","unresolved":false,"context_lines":[{"line_number":381,"context_line":"            raise exception.MaxRedirectsExceeded(redirects\u003dMAX_REDIRECTS)"},{"line_number":382,"context_line":"        loc \u003d location.store_location"},{"line_number":383,"context_line":"        conn \u003d self._get_http_conn(method, loc, headers)"},{"line_number":384,"context_line":"        resp \u003d conn.getresponse()"},{"line_number":385,"context_line":"        if resp.status \u003e\u003d 400:"},{"line_number":386,"context_line":"            if resp.status \u003d\u003d httplib.NOT_FOUND:"},{"line_number":387,"context_line":"                msg \u003d _(\u0027VMware datastore could not find image at URI.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2FvDA%3D","line":384,"updated":"2014-03-14 06:03:56.000000000","message":"One suggestion to reduce code duplication: do you think we could move the code around #311 and #340 to here? According to the code line #273-277, IMHO it is necessary that just use try-catch to protect line #383-384.","commit_id":"8d738a84a6b9fc87a2ba68f10983fe4b147f245d"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"f21ae8e9d2d3913baf20722c2436dc0803ca3631","unresolved":false,"context_lines":[{"line_number":381,"context_line":"            raise exception.MaxRedirectsExceeded(redirects\u003dMAX_REDIRECTS)"},{"line_number":382,"context_line":"        loc \u003d location.store_location"},{"line_number":383,"context_line":"        conn \u003d self._get_http_conn(method, loc, headers)"},{"line_number":384,"context_line":"        resp \u003d conn.getresponse()"},{"line_number":385,"context_line":"        if resp.status \u003e\u003d 400:"},{"line_number":386,"context_line":"            if resp.status \u003d\u003d httplib.NOT_FOUND:"},{"line_number":387,"context_line":"                msg \u003d _(\u0027VMware datastore could not find image at URI.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2Fu0U%3D","line":384,"in_reply_to":"AAAAWH%2F%2FvDA%3D","updated":"2014-03-14 06:15:32.000000000","message":"good point: will be fixed in next PS.","commit_id":"8d738a84a6b9fc87a2ba68f10983fe4b147f245d"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"03ab956c180bec896467e72da4595c1216b6abe6","unresolved":false,"context_lines":[{"line_number":413,"context_line":"    def _get_http_conn(self, method, loc, headers, content\u003dNone):"},{"line_number":414,"context_line":"        conn_class \u003d self._get_http_conn_class()"},{"line_number":415,"context_line":"        conn \u003d conn_class(loc.server_host)"},{"line_number":416,"context_line":"        url \u003d urlparse.quote(\u0027%s?%s\u0027 % (loc.path, loc.query))"},{"line_number":417,"context_line":"        conn.request(method, url, content, headers)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"        return conn"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2FvCw%3D","line":416,"updated":"2014-03-14 06:03:56.000000000","message":"good catch.","commit_id":"8d738a84a6b9fc87a2ba68f10983fe4b147f245d"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"986410c556518c9b4bfa151a9b0818d6f31652a9","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self.scheme \u003d self.specs.get(\u0027scheme\u0027, STORE_SCHEME)"},{"line_number":130,"context_line":"        self.server_host \u003d self.specs.get(\u0027server_host\u0027)"},{"line_number":131,"context_line":"        self.path \u003d os.path.join(DS_URL_PREFIX,"},{"line_number":132,"context_line":"                                 self.specs.get(\u0027image_dir\u0027).strip(\u0027/\u0027),"},{"line_number":133,"context_line":"                                 self.specs.get(\u0027image_id\u0027))"},{"line_number":134,"context_line":"        dc_path \u003d self.specs.get(\u0027datacenter_path\u0027)"},{"line_number":135,"context_line":"        if dc_path is not None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F%2Fu3w%3D","line":132,"updated":"2014-03-14 06:08:34.000000000","message":"I don\u0027t think so TBH, if I understand and remember correct, under our original idea for \"vmware_store_image_dir\" option, deployer could set it to any valid path, including multiple-level-path, e.g. \"/openstack_glance/images\". No?","commit_id":"f5c26e7a89c87858f37f8a239e9b4f8d7f946ca3"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"f044943326ff2cba9d6bc3b8febfd1c19101df90","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self.scheme \u003d self.specs.get(\u0027scheme\u0027, STORE_SCHEME)"},{"line_number":130,"context_line":"        self.server_host \u003d self.specs.get(\u0027server_host\u0027)"},{"line_number":131,"context_line":"        self.path \u003d os.path.join(DS_URL_PREFIX,"},{"line_number":132,"context_line":"                                 self.specs.get(\u0027image_dir\u0027).strip(\u0027/\u0027),"},{"line_number":133,"context_line":"                                 self.specs.get(\u0027image_id\u0027))"},{"line_number":134,"context_line":"        dc_path \u003d self.specs.get(\u0027datacenter_path\u0027)"},{"line_number":135,"context_line":"        if dc_path is not None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F%2Fuvs%3D","line":132,"in_reply_to":"AAAAWH%2F%2Fu2c%3D","updated":"2014-03-14 06:32:36.000000000","message":"ah, I was exhausted this time :)","commit_id":"f5c26e7a89c87858f37f8a239e9b4f8d7f946ca3"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"d89f04edd2a0e402f63468d4ee335256851a8c90","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self.scheme \u003d self.specs.get(\u0027scheme\u0027, STORE_SCHEME)"},{"line_number":130,"context_line":"        self.server_host \u003d self.specs.get(\u0027server_host\u0027)"},{"line_number":131,"context_line":"        self.path \u003d os.path.join(DS_URL_PREFIX,"},{"line_number":132,"context_line":"                                 self.specs.get(\u0027image_dir\u0027).strip(\u0027/\u0027),"},{"line_number":133,"context_line":"                                 self.specs.get(\u0027image_id\u0027))"},{"line_number":134,"context_line":"        dc_path \u003d self.specs.get(\u0027datacenter_path\u0027)"},{"line_number":135,"context_line":"        if dc_path is not None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F%2Fu2c%3D","line":132,"in_reply_to":"AAAAWH%2F%2Fu3w%3D","updated":"2014-03-14 06:11:54.000000000","message":"Yes Zhi Yan. It can be\n/openstack_glance/images\nopenstack_glance/images/\nopenstack_glance/images","commit_id":"f5c26e7a89c87858f37f8a239e9b4f8d7f946ca3"},{"author":{"_account_id":8759,"name":"Arnaud Legendre","email":"arnaudleg@gmail.com","username":"arnaud"},"change_message_id":"a26404a49991787be8df8d066cf08a93e8e4d095","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self.scheme \u003d self.specs.get(\u0027scheme\u0027, STORE_SCHEME)"},{"line_number":130,"context_line":"        self.server_host \u003d self.specs.get(\u0027server_host\u0027)"},{"line_number":131,"context_line":"        self.path \u003d os.path.join(DS_URL_PREFIX,"},{"line_number":132,"context_line":"                                 self.specs.get(\u0027image_dir\u0027).strip(\u0027/\u0027),"},{"line_number":133,"context_line":"                                 self.specs.get(\u0027image_id\u0027))"},{"line_number":134,"context_line":"        dc_path \u003d self.specs.get(\u0027datacenter_path\u0027)"},{"line_number":135,"context_line":"        if dc_path is not None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F%2Fuug%3D","line":132,"in_reply_to":"AAAAWH%2F%2Fuvs%3D","updated":"2014-03-14 06:34:44.000000000","message":":)","commit_id":"f5c26e7a89c87858f37f8a239e9b4f8d7f946ca3"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"836fa1412a3c00f48600495aaaf020c3716c1959","unresolved":false,"context_lines":[{"line_number":350,"context_line":"            self._session.wait_for_task(delete_task)"},{"line_number":351,"context_line":"        except Exception:"},{"line_number":352,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":353,"context_line":"                LOG.exception(_(\u0027Failed to delete image content.\u0027))"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def _query(self, location, method, headers, depth\u003d0):"},{"line_number":356,"context_line":"        if depth \u003e MAX_REDIRECTS:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2FpeI%3D","line":353,"updated":"2014-03-14 18:46:54.000000000","message":"ditto, image id.","commit_id":"ca679ae6b0a6b6d0cd73ff0db3e9a8f6a309e251"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"836fa1412a3c00f48600495aaaf020c3716c1959","unresolved":false,"context_lines":[{"line_number":364,"context_line":"            resp \u003d conn.getresponse()"},{"line_number":365,"context_line":"        except Exception:"},{"line_number":366,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":367,"context_line":"                LOG.exception(_(\u0027Failed to retrieve image content.\u0027))"},{"line_number":368,"context_line":"        if resp.status \u003e\u003d 400:"},{"line_number":369,"context_line":"            if resp.status \u003d\u003d httplib.NOT_FOUND:"},{"line_number":370,"context_line":"                msg \u003d _(\u0027VMware datastore could not find image at URI.\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2Fpe4%3D","line":367,"updated":"2014-03-14 18:46:54.000000000","message":"Nit:\n\n1. I prefer to log image id (location.image_id) as well at here, just like what you did on above.\n\n2. It will be cool if you consider another suited message since get_size() leverage this code too.","commit_id":"ca679ae6b0a6b6d0cd73ff0db3e9a8f6a309e251"}]}
