)]}'
{"openstack/cloud/_image.py":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"b77c932789700539fc20f16a61f0fa2e224c8e50","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            if show_all:"},{"line_number":78,"context_line":"                params[\u0027member_status\u0027] \u003d \u0027all\u0027"},{"line_number":79,"context_line":"        response \u003d None"},{"line_number":80,"context_line":"        try:"},{"line_number":81,"context_line":"            image_list.extend(self.image.images(**params))"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        except keystoneauth1.exceptions.catalog.EndpointNotFound:"},{"line_number":84,"context_line":"            # We didn\u0027t have glance, let\u0027s try nova"},{"line_number":85,"context_line":"            # If this doesn\u0027t work - we just let the exception propagate"},{"line_number":86,"context_line":"            response \u003d proxy._json_response("},{"line_number":87,"context_line":"                self.compute.get(\u0027/images/detail\u0027))"},{"line_number":88,"context_line":"            while \u0027next\u0027 in response:"},{"line_number":89,"context_line":"                image_list.extend(meta.obj_list_to_munch(response[\u0027images\u0027]))"},{"line_number":90,"context_line":"                endpoint \u003d response[\u0027next\u0027]"},{"line_number":91,"context_line":"                # next links from glance have the version prefix. If the"},{"line_number":92,"context_line":"                # catalog has a versioned endpoint, then we can\u0027t append the"},{"line_number":93,"context_line":"                # next link to it. Strip the absolute prefix (/v1/ or /v2/"},{"line_number":94,"context_line":"                # to turn it into a proper relative link."},{"line_number":95,"context_line":"                if endpoint.startswith(\u0027/v\u0027):"},{"line_number":96,"context_line":"                    endpoint \u003d endpoint[4:]"},{"line_number":97,"context_line":"                response \u003d self._image_client.get(endpoint)"},{"line_number":98,"context_line":"            if \u0027images\u0027 in response:"},{"line_number":99,"context_line":"                image_list.extend(meta.obj_list_to_munch(response[\u0027images\u0027]))"},{"line_number":100,"context_line":"            else:"},{"line_number":101,"context_line":"                image_list.extend(response)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        for image in image_list:"},{"line_number":104,"context_line":"            # The cloud might return DELETED for invalid images."}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_c59b4714","line":101,"range":{"start_line":80,"start_character":0,"end_line":101,"end_character":43},"updated":"2019-04-16 13:18:03.000000000","message":"Since you\u0027re using self.image.images() - the pagination will happen in the iterator and there will be no next links. Most of this can just be deleted.","commit_id":"a153d6b813bda7be75d08ba7670ec65280d6dfb0"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"ccff6cc3f424847757652017c605154dc91708b2","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            if show_all:"},{"line_number":78,"context_line":"                params[\u0027member_status\u0027] \u003d \u0027all\u0027"},{"line_number":79,"context_line":"        response \u003d None"},{"line_number":80,"context_line":"        try:"},{"line_number":81,"context_line":"            image_list.extend(self.image.images(**params))"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        except keystoneauth1.exceptions.catalog.EndpointNotFound:"},{"line_number":84,"context_line":"            # We didn\u0027t have glance, let\u0027s try nova"},{"line_number":85,"context_line":"            # If this doesn\u0027t work - we just let the exception propagate"},{"line_number":86,"context_line":"            response \u003d proxy._json_response("},{"line_number":87,"context_line":"                self.compute.get(\u0027/images/detail\u0027))"},{"line_number":88,"context_line":"            while \u0027next\u0027 in response:"},{"line_number":89,"context_line":"                image_list.extend(meta.obj_list_to_munch(response[\u0027images\u0027]))"},{"line_number":90,"context_line":"                endpoint \u003d response[\u0027next\u0027]"},{"line_number":91,"context_line":"                # next links from glance have the version prefix. If the"},{"line_number":92,"context_line":"                # catalog has a versioned endpoint, then we can\u0027t append the"},{"line_number":93,"context_line":"                # next link to it. Strip the absolute prefix (/v1/ or /v2/"},{"line_number":94,"context_line":"                # to turn it into a proper relative link."},{"line_number":95,"context_line":"                if endpoint.startswith(\u0027/v\u0027):"},{"line_number":96,"context_line":"                    endpoint \u003d endpoint[4:]"},{"line_number":97,"context_line":"                response \u003d self._image_client.get(endpoint)"},{"line_number":98,"context_line":"            if \u0027images\u0027 in response:"},{"line_number":99,"context_line":"                image_list.extend(meta.obj_list_to_munch(response[\u0027images\u0027]))"},{"line_number":100,"context_line":"            else:"},{"line_number":101,"context_line":"                image_list.extend(response)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        for image in image_list:"},{"line_number":104,"context_line":"            # The cloud might return DELETED for invalid images."}],"source_content_type":"text/x-python","patch_set":1,"id":"3fce034c_4beda523","line":101,"range":{"start_line":80,"start_character":0,"end_line":101,"end_character":43},"in_reply_to":"5fc1f717_c59b4714","updated":"2019-04-16 15:32:59.000000000","message":"ok, dropped","commit_id":"a153d6b813bda7be75d08ba7670ec65280d6dfb0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ee17fcb6979c048d124e600c883bc93faf43e6a5","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        images \u003d []"},{"line_number":74,"context_line":"        params \u003d {}"},{"line_number":75,"context_line":"        image_list \u003d []"},{"line_number":76,"context_line":"        if self._is_client_version(\u0027image\u0027, 2):"},{"line_number":77,"context_line":"            if show_all:"},{"line_number":78,"context_line":"                params[\u0027member_status\u0027] \u003d \u0027all\u0027"},{"line_number":79,"context_line":"        response \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_5814b54e","line":76,"updated":"2019-04-15 12:49:46.000000000","message":"is_client_version can probably raise EndpointNotFound, so it has to be kept under \"try\".","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ee17fcb6979c048d124e600c883bc93faf43e6a5","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            while \u0027next\u0027 in response:"},{"line_number":89,"context_line":"                image_list.extend(meta.obj_list_to_munch(response[\u0027images\u0027]))"},{"line_number":90,"context_line":"                endpoint \u003d response[\u0027next\u0027]"},{"line_number":91,"context_line":"                # next links from glance have the version prefix. If the"},{"line_number":92,"context_line":"                # catalog has a versioned endpoint, then we can\u0027t append the"},{"line_number":93,"context_line":"                # next link to it. Strip the absolute prefix (/v1/ or /v2/"},{"line_number":94,"context_line":"                # to turn it into a proper relative link."}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_78173153","line":91,"updated":"2019-04-15 12:49:46.000000000","message":"Why is this change done? This comment talks about Glance, but this \"except\" block is about using Nova for images..","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"4a0e335cc1a56633a843e604a8c91fc2cc2b5b62","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            while \u0027next\u0027 in response:"},{"line_number":89,"context_line":"                image_list.extend(meta.obj_list_to_munch(response[\u0027images\u0027]))"},{"line_number":90,"context_line":"                endpoint \u003d response[\u0027next\u0027]"},{"line_number":91,"context_line":"                # next links from glance have the version prefix. If the"},{"line_number":92,"context_line":"                # catalog has a versioned endpoint, then we can\u0027t append the"},{"line_number":93,"context_line":"                # next link to it. Strip the absolute prefix (/v1/ or /v2/"},{"line_number":94,"context_line":"                # to turn it into a proper relative link."}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_33c78a48","line":91,"in_reply_to":"3fce034c_78173153","updated":"2019-04-15 13:20:00.000000000","message":"right, this is also a bit different now. Here we only take care of Nova listing.","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ee17fcb6979c048d124e600c883bc93faf43e6a5","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        self.list_images.invalidate(self)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        # Task API means an image was uploaded to swift"},{"line_number":240,"context_line":"        # TODO(gtema) does it make sense to move this into proxy?"},{"line_number":241,"context_line":"        if self.image_api_use_tasks and ("},{"line_number":242,"context_line":"                self._IMAGE_OBJECT_KEY in image"},{"line_number":243,"context_line":"                or self._SHADE_IMAGE_OBJECT_KEY in image):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_180e2d3b","line":240,"updated":"2019-04-15 12:49:46.000000000","message":"probably?","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"b77c932789700539fc20f16a61f0fa2e224c8e50","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            # We didn\u0027t have glance, let\u0027s try nova"},{"line_number":85,"context_line":"            # If this doesn\u0027t work - we just let the exception propagate"},{"line_number":86,"context_line":"            response \u003d proxy._json_response("},{"line_number":87,"context_line":"                self.compute.get(\u0027/images/detail\u0027))"},{"line_number":88,"context_line":"            while \u0027next\u0027 in response:"},{"line_number":89,"context_line":"                image_list.extend(meta.obj_list_to_munch(response[\u0027images\u0027]))"},{"line_number":90,"context_line":"                endpoint \u003d response[\u0027next\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_0c901a4e","line":87,"updated":"2019-04-16 13:18:03.000000000","message":"We\u0027re missing an:\n\n  image_list.extend(meta.obj_list_to_munch(response[\u0027images\u0027]))\n\nhere. This won\u0027t pick up the first iteration. (although I\u0027m a bit tempted to say it\u0027s ok to drop support for nova image fallback - I don\u0027t think this has been needed anywhere in a LONG time, and we undid the shade passthrough so it\u0027s unlikely anyone who is using sdk is using a cloud old enough to not have glance expose.)","commit_id":"40cf08831ca3b1c5cf42a9ace4ec3f21913acefb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"71195d7b1263de558144faddf5b154d6b7f49b11","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        if self._is_client_version(\u0027image\u0027, 2):"},{"line_number":73,"context_line":"            if show_all:"},{"line_number":74,"context_line":"                params[\u0027member_status\u0027] \u003d \u0027all\u0027"},{"line_number":75,"context_line":"        image_list.extend(self.image.images(**params))"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        for image in image_list:"},{"line_number":78,"context_line":"            # The cloud might return DELETED for invalid images."}],"source_content_type":"text/x-python","patch_set":12,"id":"3fce034c_cef8957c","line":75,"updated":"2019-04-18 13:15:30.000000000","message":"nit:\n\n image_list \u003d list(self.image.images(**params))","commit_id":"6bed4108af7bf6600b642ece82c23637a5b75c77"}],"openstack/cloud/_normalize.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ee17fcb6979c048d124e600c883bc93faf43e6a5","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        return ret"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def _normalize_image(self, image):"},{"line_number":270,"context_line":"        location \u003d None"},{"line_number":271,"context_line":"        if isinstance(image, resource.Resource):"},{"line_number":272,"context_line":"            image \u003d image.to_dict(ignore_none\u003dTrue, original_names\u003dTrue)"},{"line_number":273,"context_line":"            location \u003d image.pop("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_3809a930","line":270,"updated":"2019-04-15 12:49:46.000000000","message":"nit: not needed, location is assigned on all paths","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ee17fcb6979c048d124e600c883bc93faf43e6a5","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        else:"},{"line_number":277,"context_line":"            location \u003d self._get_current_location("},{"line_number":278,"context_line":"                project_id\u003dimage.get(\u0027owner\u0027))"},{"line_number":279,"context_line":"            # This copy is to keep things from getting epically weird in tests"},{"line_number":280,"context_line":"            image \u003d image.copy()"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        new_image \u003d munch.Munch(location\u003dlocation)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_d807451c","line":279,"updated":"2019-04-15 12:49:46.000000000","message":"side note: sigh","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"4a0e335cc1a56633a843e604a8c91fc2cc2b5b62","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        else:"},{"line_number":277,"context_line":"            location \u003d self._get_current_location("},{"line_number":278,"context_line":"                project_id\u003dimage.get(\u0027owner\u0027))"},{"line_number":279,"context_line":"            # This copy is to keep things from getting epically weird in tests"},{"line_number":280,"context_line":"            image \u003d image.copy()"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        new_image \u003d munch.Munch(location\u003dlocation)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_13284ee0","line":279,"in_reply_to":"3fce034c_d807451c","updated":"2019-04-15 13:20:00.000000000","message":"yupp, bacially in a followup we can try removing normalization as such, since all \"unknown\" props are under \"properties\" anyway.","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"}],"openstack/image/v1/_proxy.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ee17fcb6979c048d124e600c883bc93faf43e6a5","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        image \u003d self._get_resource(_image.Image, image)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        endpoint \u003d \u0027/images/{id}\u0027.format(id\u003dimage[0][\u0027id\u0027])"},{"line_number":210,"context_line":"        if output:"},{"line_number":211,"context_line":"            try:"},{"line_number":212,"context_line":"                stream \u003d self._image_client.get(endpoint, stream\u003dTrue)"},{"line_number":213,"context_line":"                # In python 2 we might get StringIO - delete it as soon as"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_981a1d7b","line":210,"updated":"2019-04-15 12:49:46.000000000","message":"nit: I\u0027d reduce indentation by doing\n\n if not output:\n     return self._image_client.get(...)","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ee17fcb6979c048d124e600c883bc93faf43e6a5","unresolved":false,"context_lines":[{"line_number":225,"context_line":"            except Exception:"},{"line_number":226,"context_line":"                raise exceptions.SDKException(\"Unable to download image\")"},{"line_number":227,"context_line":"        else:"},{"line_number":228,"context_line":"            return self._image_client.get(endpoint, stream\u003dstream)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_b81d9974","line":228,"updated":"2019-04-15 12:49:46.000000000","message":"are we supposed to use self._image_client on proxy methods? I thought it would be just self.get, since a Proxy is an Adapter, no?","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"d03b023eca9cb0a9e82b1edab0d88a295bf8e5e3","unresolved":false,"context_lines":[{"line_number":225,"context_line":"            except Exception:"},{"line_number":226,"context_line":"                raise exceptions.SDKException(\"Unable to download image\")"},{"line_number":227,"context_line":"        else:"},{"line_number":228,"context_line":"            return self._image_client.get(endpoint, stream\u003dstream)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_f3c4a261","line":228,"in_reply_to":"3fce034c_b81d9974","updated":"2019-04-15 13:06:39.000000000","message":"sure, remaining from movement","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"b77c932789700539fc20f16a61f0fa2e224c8e50","unresolved":false,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        endpoint \u003d \u0027/images/{id}\u0027.format(id\u003dimage[0][\u0027id\u0027])"},{"line_number":210,"context_line":"        if not output:"},{"line_number":211,"context_line":"            return self.get(endpoint, stream\u003dstream)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        try:"},{"line_number":214,"context_line":"            stream \u003d self.get(endpoint, stream\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_6cdd1e13","line":211,"range":{"start_line":211,"start_character":19,"end_line":211,"end_character":52},"updated":"2019-04-16 13:18:03.000000000","message":"Shouldn\u0027t this be:\n\n  return image.download(self, stream\u003dTrue)\n\nmostly because get doesn\u0027t have a stream parameter","commit_id":"40cf08831ca3b1c5cf42a9ace4ec3f21913acefb"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"ccff6cc3f424847757652017c605154dc91708b2","unresolved":false,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        endpoint \u003d \u0027/images/{id}\u0027.format(id\u003dimage[0][\u0027id\u0027])"},{"line_number":210,"context_line":"        if not output:"},{"line_number":211,"context_line":"            return self.get(endpoint, stream\u003dstream)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        try:"},{"line_number":214,"context_line":"            stream \u003d self.get(endpoint, stream\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_abdd2971","line":211,"range":{"start_line":211,"start_character":19,"end_line":211,"end_character":52},"in_reply_to":"3fce034c_6cdd1e13","updated":"2019-04-16 15:32:59.000000000","message":"yupp, it should","commit_id":"40cf08831ca3b1c5cf42a9ace4ec3f21913acefb"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"b77c932789700539fc20f16a61f0fa2e224c8e50","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            return self.get(endpoint, stream\u003dstream)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        try:"},{"line_number":214,"context_line":"            stream \u003d self.get(endpoint, stream\u003dTrue)"},{"line_number":215,"context_line":"            # In python 2 we might get StringIO - delete it as soon as"},{"line_number":216,"context_line":"            # py2 support is dropped"},{"line_number":217,"context_line":"            if isinstance(output, io.IOBase) \\"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_8ce08ace","line":214,"range":{"start_line":214,"start_character":12,"end_line":214,"end_character":52},"updated":"2019-04-16 13:18:03.000000000","message":"Same","commit_id":"40cf08831ca3b1c5cf42a9ace4ec3f21913acefb"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"b77c932789700539fc20f16a61f0fa2e224c8e50","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                    for chunk in stream.iter_content("},{"line_number":224,"context_line":"                            chunk_size\u003dchunk_size):"},{"line_number":225,"context_line":"                        fd.write(chunk)"},{"line_number":226,"context_line":"            return self"},{"line_number":227,"context_line":"        except Exception:"},{"line_number":228,"context_line":"            raise exceptions.SDKException(\"Unable to download image\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_4c038274","line":226,"range":{"start_line":226,"start_character":19,"end_line":226,"end_character":23},"updated":"2019-04-16 13:18:03.000000000","message":"return image?","commit_id":"40cf08831ca3b1c5cf42a9ace4ec3f21913acefb"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"643f8b2a1bf1ec0b41fdbce4de91e00022f398fe","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        image \u003d self._get_resource(_image.Image, image)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        if not output:"},{"line_number":210,"context_line":"            return self.get(self, stream\u003dTrue)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        try:"},{"line_number":213,"context_line":"            stream \u003d self.get(self, stream\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fce034c_a1dd3343","line":210,"range":{"start_line":210,"start_character":19,"end_line":210,"end_character":27},"updated":"2019-04-17 13:10:29.000000000","message":"I still think this should be image.download ...","commit_id":"b71b1b55a837fde69c12dcae3845a93f27b4ec14"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"39a66e2a2a633d6bc211f95aa08fd75695325b72","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        image \u003d self._get_resource(_image.Image, image)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        if not output:"},{"line_number":210,"context_line":"            return self.get(self, stream\u003dTrue)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        try:"},{"line_number":213,"context_line":"            stream \u003d self.get(self, stream\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fce034c_1cceda2d","line":210,"range":{"start_line":210,"start_character":19,"end_line":210,"end_character":27},"in_reply_to":"3fce034c_a1dd3343","updated":"2019-04-18 12:14:28.000000000","message":"Done","commit_id":"b71b1b55a837fde69c12dcae3845a93f27b4ec14"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"71195d7b1263de558144faddf5b154d6b7f49b11","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                            contents of the response."},{"line_number":197,"context_line":"        :param output: Either a file object or a path to store data into."},{"line_number":198,"context_line":"        :param int chunk_size: size in bytes to read from the wire and buffer"},{"line_number":199,"context_line":"            at one time. Defaults to 1024"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        :returns: When output is not given - the bytes comprising the given"},{"line_number":202,"context_line":"            Image when stream is False, otherwise a :class:`requests.Response`"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fce034c_aefbc976","line":199,"updated":"2019-04-18 13:15:30.000000000","message":"nit: I suspect a chunk can be bigger on modern machines","commit_id":"6bed4108af7bf6600b642ece82c23637a5b75c77"}],"openstack/image/v1/image.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"71195d7b1263de558144faddf5b154d6b7f49b11","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        # just jumped."},{"line_number":101,"context_line":"        if stream:"},{"line_number":102,"context_line":"            resp.headers[\u0027content-md5\u0027] \u003d checksum"},{"line_number":103,"context_line":"            return resp"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if checksum is not None:"},{"line_number":106,"context_line":"            digest \u003d hashlib.md5(resp.content).hexdigest()"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fce034c_6ef16195","line":103,"updated":"2019-04-18 13:15:30.000000000","message":"On this path we return a response..","commit_id":"6bed4108af7bf6600b642ece82c23637a5b75c77"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"71195d7b1263de558144faddf5b154d6b7f49b11","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            session.log.warn("},{"line_number":112,"context_line":"                \"Unable to verify the integrity of image %s\" % (self.id))"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        return resp.content"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fce034c_8eee0db2","line":114,"updated":"2019-04-18 13:15:30.000000000","message":".. on this its content. Why not make it consistent?","commit_id":"6bed4108af7bf6600b642ece82c23637a5b75c77"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fdca405cc669a09490779c31f4e92a1f61f46167","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            return resp"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        if checksum is not None:"},{"line_number":127,"context_line":"            digest \u003d hashlib.md5(resp.content).hexdigest()"},{"line_number":128,"context_line":"            if digest !\u003d checksum:"},{"line_number":129,"context_line":"                raise exceptions.InvalidResponse("},{"line_number":130,"context_line":"                    \"checksum mismatch: %s !\u003d %s\" % (checksum, digest))"}],"source_content_type":"text/x-python","patch_set":20,"id":"dfbec78f_445011d5","line":127,"updated":"2019-05-10 07:22:07.000000000","message":"This seems grossly ineffective when output is specified and the file is large. Maybe calculate on fly?","commit_id":"a37f3c4d2efc55bdad6394874379e8dbd522c420"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"36fca4c98d75198314be4a42ffde0d30de966983","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            return resp"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        if checksum is not None:"},{"line_number":127,"context_line":"            digest \u003d hashlib.md5(resp.content).hexdigest()"},{"line_number":128,"context_line":"            if digest !\u003d checksum:"},{"line_number":129,"context_line":"                raise exceptions.InvalidResponse("},{"line_number":130,"context_line":"                    \"checksum mismatch: %s !\u003d %s\" % (checksum, digest))"}],"source_content_type":"text/x-python","patch_set":20,"id":"dfbec78f_d3bcc5dd","line":127,"in_reply_to":"dfbec78f_445011d5","updated":"2019-05-10 12:12:54.000000000","message":"If output is specified, we won\u0027t get here.\n\nHowever, we could also do the checksum calculation on the fly in the output case and raise the error up there too as an improvement. _get_file_hashes in openstack/cloud/_object_store.py has an example of doing this.","commit_id":"a37f3c4d2efc55bdad6394874379e8dbd522c420"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fdca405cc669a09490779c31f4e92a1f61f46167","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                    \"checksum mismatch: %s !\u003d %s\" % (checksum, digest))"},{"line_number":131,"context_line":"        else:"},{"line_number":132,"context_line":"            session.log.warn("},{"line_number":133,"context_line":"                \"Unable to verify the integrity of image %s\" % (self.id))"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        return resp"}],"source_content_type":"text/x-python","patch_set":20,"id":"dfbec78f_e46025a8","line":133,"updated":"2019-05-10 07:22:07.000000000","message":"nit: use , instead of % for logging\n\nalso mention the reason (the server does not supply the checksum)","commit_id":"a37f3c4d2efc55bdad6394874379e8dbd522c420"}],"openstack/image/v2/_proxy.py":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"b77c932789700539fc20f16a61f0fa2e224c8e50","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        glance_task \u003d self.create_task(**task_args)"},{"line_number":219,"context_line":"        self._connection.list_images.invalidate(self)"},{"line_number":220,"context_line":"        if wait:"},{"line_number":221,"context_line":"            # TODO(gtema) would be nice to switch to wait_for_task"},{"line_number":222,"context_line":"            start \u003d time.time()"},{"line_number":223,"context_line":"            image_id \u003d None"},{"line_number":224,"context_line":"            for count in utils.iterate_timeout("}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_ec3eee27","line":221,"range":{"start_line":221,"start_character":12,"end_line":221,"end_character":66},"updated":"2019-04-16 13:18:03.000000000","message":"++","commit_id":"40cf08831ca3b1c5cf42a9ace4ec3f21913acefb"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"643f8b2a1bf1ec0b41fdbce4de91e00022f398fe","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        glance_task \u003d self.create_task(**task_args)"},{"line_number":219,"context_line":"        self._connection.list_images.invalidate(self)"},{"line_number":220,"context_line":"        if wait:"},{"line_number":221,"context_line":"            # TODO(gtema) would be nice to switch to wait_for_task"},{"line_number":222,"context_line":"            start \u003d time.time()"},{"line_number":223,"context_line":"            image_id \u003d None"},{"line_number":224,"context_line":"            for count in utils.iterate_timeout("}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_a184530d","line":221,"range":{"start_line":221,"start_character":12,"end_line":221,"end_character":66},"in_reply_to":"3fce034c_4bd60552","updated":"2019-04-17 13:10:29.000000000","message":"I wonder if maybe we should just update wait_for_task to understand the _IMAGE_ERROR_396?","commit_id":"40cf08831ca3b1c5cf42a9ace4ec3f21913acefb"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"39a66e2a2a633d6bc211f95aa08fd75695325b72","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        glance_task \u003d self.create_task(**task_args)"},{"line_number":219,"context_line":"        self._connection.list_images.invalidate(self)"},{"line_number":220,"context_line":"        if wait:"},{"line_number":221,"context_line":"            # TODO(gtema) would be nice to switch to wait_for_task"},{"line_number":222,"context_line":"            start \u003d time.time()"},{"line_number":223,"context_line":"            image_id \u003d None"},{"line_number":224,"context_line":"            for count in utils.iterate_timeout("}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_bccea62a","line":221,"range":{"start_line":221,"start_character":12,"end_line":221,"end_character":66},"in_reply_to":"3fce034c_a184530d","updated":"2019-04-18 12:14:28.000000000","message":"Done","commit_id":"40cf08831ca3b1c5cf42a9ace4ec3f21913acefb"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"ccff6cc3f424847757652017c605154dc91708b2","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        glance_task \u003d self.create_task(**task_args)"},{"line_number":219,"context_line":"        self._connection.list_images.invalidate(self)"},{"line_number":220,"context_line":"        if wait:"},{"line_number":221,"context_line":"            # TODO(gtema) would be nice to switch to wait_for_task"},{"line_number":222,"context_line":"            start \u003d time.time()"},{"line_number":223,"context_line":"            image_id \u003d None"},{"line_number":224,"context_line":"            for count in utils.iterate_timeout("}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_4bd60552","line":221,"range":{"start_line":221,"start_character":12,"end_line":221,"end_character":66},"in_reply_to":"3fce034c_ec3eee27","updated":"2019-04-16 15:32:59.000000000","message":"it\u0027s only this _IMAGE_ERROR_396, which doesn\u0027t make it easier. So probably sometime in a followup","commit_id":"40cf08831ca3b1c5cf42a9ace4ec3f21913acefb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"71195d7b1263de558144faddf5b154d6b7f49b11","unresolved":false,"context_lines":[{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        if output:"},{"line_number":318,"context_line":"            try:"},{"line_number":319,"context_line":"                stream \u003d image.download(self, stream\u003dTrue)"},{"line_number":320,"context_line":"                # In python 2 we might get StringIO - delete it as soon as"},{"line_number":321,"context_line":"                # py2 support is dropped"},{"line_number":322,"context_line":"                if isinstance(output, io.IOBase) \\"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fce034c_eefd516e","line":319,"updated":"2019-04-18 13:15:30.000000000","message":"Why not make image.download accept output and move this logic there?","commit_id":"6bed4108af7bf6600b642ece82c23637a5b75c77"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"71195d7b1263de558144faddf5b154d6b7f49b11","unresolved":false,"context_lines":[{"line_number":664,"context_line":"                wait\u003dinterval):"},{"line_number":665,"context_line":"            task \u003d task.fetch(self)"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"            if not task:"},{"line_number":668,"context_line":"                raise exceptions.ResourceFailure("},{"line_number":669,"context_line":"                    \"{name} went away while waiting for {status}\".format("},{"line_number":670,"context_line":"                        name\u003dname, status\u003dstatus))"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fce034c_0e03fd74","line":667,"updated":"2019-04-18 13:15:30.000000000","message":"Doesn\u0027t fetch raise ResourceNotFound?","commit_id":"6bed4108af7bf6600b642ece82c23637a5b75c77"}],"openstack/image/v2/image.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fdca405cc669a09490779c31f4e92a1f61f46167","unresolved":false,"context_lines":[{"line_number":319,"context_line":"            return resp"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"        if checksum is not None:"},{"line_number":322,"context_line":"            digest \u003d hashlib.md5(resp.content).hexdigest()"},{"line_number":323,"context_line":"            if digest !\u003d checksum:"},{"line_number":324,"context_line":"                raise exceptions.InvalidResponse("},{"line_number":325,"context_line":"                    \"checksum mismatch: %s !\u003d %s\" % (checksum, digest))"}],"source_content_type":"text/x-python","patch_set":20,"id":"dfbec78f_046459b8","line":322,"updated":"2019-05-10 07:22:07.000000000","message":"similar comment re checksums","commit_id":"a37f3c4d2efc55bdad6394874379e8dbd522c420"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"36fca4c98d75198314be4a42ffde0d30de966983","unresolved":false,"context_lines":[{"line_number":319,"context_line":"            return resp"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"        if checksum is not None:"},{"line_number":322,"context_line":"            digest \u003d hashlib.md5(resp.content).hexdigest()"},{"line_number":323,"context_line":"            if digest !\u003d checksum:"},{"line_number":324,"context_line":"                raise exceptions.InvalidResponse("},{"line_number":325,"context_line":"                    \"checksum mismatch: %s !\u003d %s\" % (checksum, digest))"}],"source_content_type":"text/x-python","patch_set":20,"id":"dfbec78f_53fa1575","line":322,"in_reply_to":"dfbec78f_046459b8","updated":"2019-05-10 12:12:54.000000000","message":"Same.\n\nMaybe we should extract a little bit of this into a base-class helper method - seems to be duplication.","commit_id":"a37f3c4d2efc55bdad6394874379e8dbd522c420"}],"openstack/resource.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ee17fcb6979c048d124e600c883bc93faf43e6a5","unresolved":false,"context_lines":[{"line_number":422,"context_line":"    _computed \u003d None"},{"line_number":423,"context_line":"    _original_body \u003d None"},{"line_number":424,"context_line":"    _delete_response_class \u003d None"},{"line_number":425,"context_line":"    _store_unknown_attrs_as_properties \u003d False"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def __init__(self, _synchronized\u003dFalse, connection\u003dNone, **attrs):"},{"line_number":428,"context_line":"        \"\"\"The base resource"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_f802410b","line":425,"updated":"2019-04-15 12:49:46.000000000","message":"Let\u0027s allow to specify which name to use, maybe like\n\n _store_unknown_attrs_as \u003d \u0027properties\u0027","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"d03b023eca9cb0a9e82b1edab0d88a295bf8e5e3","unresolved":false,"context_lines":[{"line_number":422,"context_line":"    _computed \u003d None"},{"line_number":423,"context_line":"    _original_body \u003d None"},{"line_number":424,"context_line":"    _delete_response_class \u003d None"},{"line_number":425,"context_line":"    _store_unknown_attrs_as_properties \u003d False"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def __init__(self, _synchronized\u003dFalse, connection\u003dNone, **attrs):"},{"line_number":428,"context_line":"        \"\"\"The base resource"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_53b6d6fc","line":425,"in_reply_to":"3fce034c_f802410b","updated":"2019-04-15 13:06:39.000000000","message":"idea is to mimic normalization layer, which moves everything unknown under properties. We can define a name here, but I do not really expect it ever to be something different.","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ee17fcb6979c048d124e600c883bc93faf43e6a5","unresolved":false,"context_lines":[{"line_number":911,"context_line":"            original_names\u003doriginal_names, _to_munch\u003dTrue)"},{"line_number":912,"context_line":""},{"line_number":913,"context_line":"    def _unpack_properties_to_resource_root(self, body):"},{"line_number":914,"context_line":"        if body:"},{"line_number":915,"context_line":"            # We do not want to modify caller"},{"line_number":916,"context_line":"            body \u003d body.copy()"},{"line_number":917,"context_line":"            props \u003d body.pop(\u0027properties\u0027, {})"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_93ff5e00","line":914,"updated":"2019-04-15 12:49:46.000000000","message":"nit:\n\n if not body:\n    return body","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ee17fcb6979c048d124e600c883bc93faf43e6a5","unresolved":false,"context_lines":[{"line_number":931,"context_line":"        body[\u0027properties\u0027] \u003d props"},{"line_number":932,"context_line":"        return body"},{"line_number":933,"context_line":""},{"line_number":934,"context_line":"    def _is_store_unknown_attrs_under_props(self):"},{"line_number":935,"context_line":"        # Unpacking is done only if we have `properties` attribute and it\u0027s"},{"line_number":936,"context_line":"        # type is None"},{"line_number":937,"context_line":"        return self._store_unknown_attrs_as_properties and \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_b3029a08","line":934,"updated":"2019-04-15 12:49:46.000000000","message":"nit: s/is//","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ee17fcb6979c048d124e600c883bc93faf43e6a5","unresolved":false,"context_lines":[{"line_number":933,"context_line":""},{"line_number":934,"context_line":"    def _is_store_unknown_attrs_under_props(self):"},{"line_number":935,"context_line":"        # Unpacking is done only if we have `properties` attribute and it\u0027s"},{"line_number":936,"context_line":"        # type is None"},{"line_number":937,"context_line":"        return self._store_unknown_attrs_as_properties and \\"},{"line_number":938,"context_line":"            hasattr(self.__class__, \u0027properties\u0027) \\"},{"line_number":939,"context_line":"            and self.__class__.properties.type is None"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_5309f629","line":936,"updated":"2019-04-15 12:49:46.000000000","message":"Why should type be None and not e.g. dict? Why even care about that?","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"d03b023eca9cb0a9e82b1edab0d88a295bf8e5e3","unresolved":false,"context_lines":[{"line_number":933,"context_line":""},{"line_number":934,"context_line":"    def _is_store_unknown_attrs_under_props(self):"},{"line_number":935,"context_line":"        # Unpacking is done only if we have `properties` attribute and it\u0027s"},{"line_number":936,"context_line":"        # type is None"},{"line_number":937,"context_line":"        return self._store_unknown_attrs_as_properties and \\"},{"line_number":938,"context_line":"            hasattr(self.__class__, \u0027properties\u0027) \\"},{"line_number":939,"context_line":"            and self.__class__.properties.type is None"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_93d3de38","line":936,"in_reply_to":"3fce034c_5309f629","updated":"2019-04-15 13:06:39.000000000","message":"Well, I wanted some additional protection against the case, when Resource supports properties as a dict. And in case of image we can have \"properties\" as a string. We need to separate what we have packed under properties as an \"unknown\", and what is there nativ. If properties supports dict - we can not do this separation (surely we can try to track keys for unknown props, but if we instantiate object with properties dict - we have no idea what is there natively, and what not).","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ee17fcb6979c048d124e600c883bc93faf43e6a5","unresolved":false,"context_lines":[{"line_number":940,"context_line":""},{"line_number":941,"context_line":"    def _prepare_request_body(self, patch, prepend_key):"},{"line_number":942,"context_line":"        if patch:"},{"line_number":943,"context_line":"            if not self._is_store_unknown_attrs_under_props():"},{"line_number":944,"context_line":"                new \u003d self._body.attributes"},{"line_number":945,"context_line":"                original_body \u003d self._original_body"},{"line_number":946,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_730c323b","line":943,"updated":"2019-04-15 12:49:46.000000000","message":"very nit: I\u0027d reverse the branches here to avoid \u0027if not.. else..\u0027","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"d03b023eca9cb0a9e82b1edab0d88a295bf8e5e3","unresolved":false,"context_lines":[{"line_number":940,"context_line":""},{"line_number":941,"context_line":"    def _prepare_request_body(self, patch, prepend_key):"},{"line_number":942,"context_line":"        if patch:"},{"line_number":943,"context_line":"            if not self._is_store_unknown_attrs_under_props():"},{"line_number":944,"context_line":"                new \u003d self._body.attributes"},{"line_number":945,"context_line":"                original_body \u003d self._original_body"},{"line_number":946,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_73cf52b0","line":943,"in_reply_to":"3fce034c_730c323b","updated":"2019-04-15 13:06:39.000000000","message":"From C++ I prefer to leave the most frequently used branch first (for performance reasons). Here I also expect the most frequent case not to have this logic enabled. Basically it\u0027s only Image","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ee17fcb6979c048d124e600c883bc93faf43e6a5","unresolved":false,"context_lines":[{"line_number":957,"context_line":"                key\u003doperator.itemgetter(\u0027path\u0027)"},{"line_number":958,"context_line":"            )"},{"line_number":959,"context_line":"        else:"},{"line_number":960,"context_line":"            if not self._is_store_unknown_attrs_under_props():"},{"line_number":961,"context_line":"                body \u003d self._body.dirty"},{"line_number":962,"context_line":"            else:"},{"line_number":963,"context_line":"                body \u003d self._unpack_properties_to_resource_root("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_13136e5e","line":960,"updated":"2019-04-15 12:49:46.000000000","message":"ditto","commit_id":"4ed3b0a42eb0fce6480289f725f14834c5727b75"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"71195d7b1263de558144faddf5b154d6b7f49b11","unresolved":false,"context_lines":[{"line_number":422,"context_line":"    _computed \u003d None"},{"line_number":423,"context_line":"    _original_body \u003d None"},{"line_number":424,"context_line":"    _delete_response_class \u003d None"},{"line_number":425,"context_line":"    _store_unknown_attrs_as_properties \u003d False"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def __init__(self, _synchronized\u003dFalse, connection\u003dNone, **attrs):"},{"line_number":428,"context_line":"        \"\"\"The base resource"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fce034c_2e2d99fd","line":425,"updated":"2019-04-18 13:15:30.000000000","message":"I\u0027m still worried what happens if some services uses a different field for free-form properties..","commit_id":"6bed4108af7bf6600b642ece82c23637a5b75c77"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"8a072c8396425c183ee5eda947e7012f882babc2","unresolved":false,"context_lines":[{"line_number":422,"context_line":"    _computed \u003d None"},{"line_number":423,"context_line":"    _original_body \u003d None"},{"line_number":424,"context_line":"    _delete_response_class \u003d None"},{"line_number":425,"context_line":"    _store_unknown_attrs_as_properties \u003d False"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def __init__(self, _synchronized\u003dFalse, connection\u003dNone, **attrs):"},{"line_number":428,"context_line":"        \"\"\"The base resource"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fce034c_91162cf1","line":425,"in_reply_to":"3fce034c_2e2d99fd","updated":"2019-04-18 13:47:10.000000000","message":"In those cases I don\u0027t think it\u0027s an issue - this is really about \"Where do we put arbitrary k/v pairs that the service expects to be put on the root object\" since we otherwise have an actual data model.\n\nIf a service does the sane thing and has a field for free-form properties (most of them), then we don\u0027t need this.","commit_id":"6bed4108af7bf6600b642ece82c23637a5b75c77"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"71195d7b1263de558144faddf5b154d6b7f49b11","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        if self._store_unknown_attrs_as_properties:"},{"line_number":471,"context_line":"            # When storing of unknown attributes is requested - ensure"},{"line_number":472,"context_line":"            # we have properties attribute (with type\u003dNone)"},{"line_number":473,"context_line":"            self._store_unknown_attrs_as_properties \u003d \\"},{"line_number":474,"context_line":"                hasattr(self.__class__, \u0027properties\u0027) \\"},{"line_number":475,"context_line":"                and self.__class__.properties.type is None"},{"line_number":476,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3fce034c_4e326561","line":473,"updated":"2019-04-18 13:15:30.000000000","message":"nit: I\u0027d prefer brackets to split lines","commit_id":"6bed4108af7bf6600b642ece82c23637a5b75c77"}],"openstack/tests/unit/cloud/test_normalize.py":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"b77c932789700539fc20f16a61f0fa2e224c8e50","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    \u0027user_id\u0027: u\u0027e9b21dc437d149858faee0898fb08e92\u0027}"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"RAW_GLANCE_IMAGE_DICT \u003d {"},{"line_number":77,"context_line":"    u\u0027auto_disk_config\u0027: False,"},{"line_number":78,"context_line":"    u\u0027checksum\u0027: u\u0027774f48af604ab1ec319093234c5c0019\u0027,"},{"line_number":79,"context_line":"    u\u0027com.rackspace__1__build_core\u0027: u\u00271\u0027,"},{"line_number":80,"context_line":"    u\u0027com.rackspace__1__build_managed\u0027: u\u00271\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_076553e1","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":31},"updated":"2019-04-16 13:18:03.000000000","message":"why the change from string to bool here?\n\nLooking at a json response from Rackspace (the only cloud I have access to where this will be set), I actually get a string \"disabled\".\n\nThis, btw - is one of those COMPLETELY CRAP parts of glance design. I mean, just look at https://wiki.openstack.org/wiki/VirtDriverImageProperties\n\nThere are different well-known properties for images based on the backend virt driver.\n\nAnyway - best I can tell the xenapi use of auto_disk_config is as a string.","commit_id":"40cf08831ca3b1c5cf42a9ace4ec3f21913acefb"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"ccff6cc3f424847757652017c605154dc91708b2","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    \u0027user_id\u0027: u\u0027e9b21dc437d149858faee0898fb08e92\u0027}"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"RAW_GLANCE_IMAGE_DICT \u003d {"},{"line_number":77,"context_line":"    u\u0027auto_disk_config\u0027: False,"},{"line_number":78,"context_line":"    u\u0027checksum\u0027: u\u0027774f48af604ab1ec319093234c5c0019\u0027,"},{"line_number":79,"context_line":"    u\u0027com.rackspace__1__build_core\u0027: u\u00271\u0027,"},{"line_number":80,"context_line":"    u\u0027com.rackspace__1__build_managed\u0027: u\u00271\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fce034c_abc68999","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":31},"in_reply_to":"3fce034c_076553e1","updated":"2019-04-16 15:32:59.000000000","message":"fixed image.v2.Image.auto_disk_config to be string","commit_id":"40cf08831ca3b1c5cf42a9ace4ec3f21913acefb"}]}
