)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16277,"name":"Pradeep Kumar Singh","email":"ps4openstack@gmail.com","username":"pradeep_singh"},"change_message_id":"3e21fdaa4bafd564d73a8dd5a50d3169fc7bf5e1","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2016-10-31 21:05:39 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Print tag and repo into ImageAlreadyExists"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I197fb25476bd063d75719c88cdac2c2dd364fb79"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ba5da102_48329911","line":8,"updated":"2016-11-01 05:05:23.000000000","message":"Can you please add closes-bug tag here in commit message.","commit_id":"64ebd91ec98a147005881be6f4eec9aa28d02b66"}],"zun/db/sqlalchemy/api.py":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"31d30eb13d42d4e7490b7a63930bdcdc20945123","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            image.save()"},{"line_number":281,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":282,"context_line":"            raise exception.ImageAlreadyExists(tag\u003dvalues[\u0027tag\u0027],"},{"line_number":283,"context_line":"                                               repo\u003dvalues[\u0027repo\u0027])"},{"line_number":284,"context_line":"        return image"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def update_image(self, image_id, values):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_01cdbb65","line":283,"updated":"2016-11-01 22:28:09.000000000","message":"I think you needs to handle the case that \u0027tag\u0027 or \u0027repo\u0027 are not in values.","commit_id":"785992c09c41a19c619aaab3543679c008eacd15"},{"author":{"_account_id":16308,"name":"Sheel Rana","email":"ranasheel2000@gmail.com","username":"sheel.rana"},"change_message_id":"c5e0a7dbfc4ba323b1a5d2a44ea11803f23e319e","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            image.save()"},{"line_number":281,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":282,"context_line":"            raise exception.ImageAlreadyExists(tag\u003dvalues[\u0027tag\u0027],"},{"line_number":283,"context_line":"                                               repo\u003dvalues[\u0027repo\u0027])"},{"line_number":284,"context_line":"        return image"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def update_image(self, image_id, values):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_8b8f2429","line":283,"in_reply_to":"ba5da102_01cdbb65","updated":"2016-11-02 05:00:28.000000000","message":"+1","commit_id":"785992c09c41a19c619aaab3543679c008eacd15"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"164455158244ba1e14aabd5c6874830253d27e4f","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            image.save()"},{"line_number":281,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":282,"context_line":"            raise exception.ImageAlreadyExists(tag\u003dvalues[\u0027tag\u0027],"},{"line_number":283,"context_line":"                                               repo\u003dvalues[\u0027repo\u0027])"},{"line_number":284,"context_line":"        return image"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def update_image(self, image_id, values):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_465ee112","line":283,"in_reply_to":"ba5da102_01cdbb65","updated":"2016-11-02 06:59:32.000000000","message":"@hongbin,  I think the exception DBDuplicateEntry will occur only when we have tag and repo in value. Isn\u0027t it?\nIn that case we don\u0027t need to handle it here.","commit_id":"785992c09c41a19c619aaab3543679c008eacd15"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"9de2b3654fd0f63b902c7b94c792469a747ac630","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            image.save()"},{"line_number":281,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":282,"context_line":"            raise exception.ImageAlreadyExists(tag\u003dvalues[\u0027tag\u0027],"},{"line_number":283,"context_line":"                                               repo\u003dvalues[\u0027repo\u0027])"},{"line_number":284,"context_line":"        return image"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def update_image(self, image_id, values):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_db7b63bc","line":283,"in_reply_to":"ba5da102_465ee112","updated":"2016-11-03 14:38:48.000000000","message":"@Madhuri, I see. I get your point but it is hard to figure out where this is handled... It is ok, but I think it is better to do it like for clarity:\n\n  tag\u003dvalues.get(\u0027tag\u0027, None), repo\u003dvalues.get(\u0027repo\u0027, None)","commit_id":"785992c09c41a19c619aaab3543679c008eacd15"},{"author":{"_account_id":12297,"name":"duhu","email":"xuxiaojun3@huawei.com","username":"xxj"},"change_message_id":"052e724fc4619a1a61e3c2ed8e3df2746abd8a60","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            image.save()"},{"line_number":281,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":282,"context_line":"            raise exception.ImageAlreadyExists(tag\u003dvalues[\u0027tag\u0027],"},{"line_number":283,"context_line":"                                               repo\u003dvalues[\u0027repo\u0027])"},{"line_number":284,"context_line":"        return image"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def update_image(self, image_id, values):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_df5d4116","line":283,"in_reply_to":"ba5da102_465ee112","updated":"2016-11-02 14:58:12.000000000","message":"According to zun.api.utils.parse_image_tag(), tag is always not absent in values here. The default value is \"latest\".\n\nBut for repo, I don\u0027t find whare it is validated. As my understanding, repo is a MUST parameter when creating an immage.Then if we need a not-null check, it could be added in the zun.api.controller.v1.images.post().","commit_id":"785992c09c41a19c619aaab3543679c008eacd15"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"314b43bd2fee001848cef5f7e8378552e5a4cd82","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            image.save()"},{"line_number":281,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":282,"context_line":"            raise exception.ImageAlreadyExists(tag\u003dvalues[\u0027tag\u0027],"},{"line_number":283,"context_line":"                                               repo\u003dvalues[\u0027repo\u0027])"},{"line_number":284,"context_line":"        return image"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def update_image(self, image_id, values):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_db29a39c","line":283,"in_reply_to":"ba5da102_db7b63bc","updated":"2016-11-03 14:40:46.000000000","message":"However, this is just a nit. LGTM in overall.","commit_id":"785992c09c41a19c619aaab3543679c008eacd15"},{"author":{"_account_id":16277,"name":"Pradeep Kumar Singh","email":"ps4openstack@gmail.com","username":"pradeep_singh"},"change_message_id":"65e86e13be1a48ddec2e7571ebefc1f5d473aaa0","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            image.save()"},{"line_number":281,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":282,"context_line":"            raise exception.ImageAlreadyExists(tag\u003dvalues[\u0027tag\u0027],"},{"line_number":283,"context_line":"                                               repo\u003dvalues[\u0027repo\u0027])"},{"line_number":284,"context_line":"        return image"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def update_image(self, image_id, values):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_3c4b8e5a","line":283,"in_reply_to":"ba5da102_df5d4116","updated":"2016-11-03 05:09:52.000000000","message":"+1, i agree with duhu","commit_id":"785992c09c41a19c619aaab3543679c008eacd15"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"f97a26151505b0a5c3f36938b4136189064af114","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            image.save()"},{"line_number":281,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":282,"context_line":"            raise exception.ImageAlreadyExists(tag\u003dvalues[\u0027tag\u0027],"},{"line_number":283,"context_line":"                                               repo\u003dvalues[\u0027repo\u0027])"},{"line_number":284,"context_line":"        return image"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def update_image(self, image_id, values):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_976b8cb6","line":283,"in_reply_to":"ba5da102_df5d4116","updated":"2016-11-03 09:51:26.000000000","message":"https://github.com/openstack/zun/blob/master/zun/api/controllers/types.py#L101 \ncheck is done here.","commit_id":"785992c09c41a19c619aaab3543679c008eacd15"}],"zun/tests/unit/api/controllers/v1/test_images.py":[{"author":{"_account_id":16308,"name":"Sheel Rana","email":"ranasheel2000@gmail.com","username":"sheel.rana"},"change_message_id":"c5e0a7dbfc4ba323b1a5d2a44ea11803f23e319e","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        for id_ in range(4):"},{"line_number":86,"context_line":"            test_image \u003d utils.create_test_image("},{"line_number":87,"context_line":"                id\u003did_,"},{"line_number":88,"context_line":"                repo\u003d\u0027testrepo\u0027 + str(id_),"},{"line_number":89,"context_line":"                uuid\u003dcomm_utils.generate_uuid())"},{"line_number":90,"context_line":"            image_list.append(objects.Image(self.context, **test_image))"},{"line_number":91,"context_line":"        mock_image_list.return_value \u003d image_list[-1:]"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_0b7cf41d","line":88,"updated":"2016-11-02 05:00:28.000000000","message":"It would be good to have test case without passing repo values during db operations inline to previous comment","commit_id":"785992c09c41a19c619aaab3543679c008eacd15"},{"author":{"_account_id":12297,"name":"duhu","email":"xuxiaojun3@huawei.com","username":"xxj"},"change_message_id":"052e724fc4619a1a61e3c2ed8e3df2746abd8a60","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        for id_ in range(4):"},{"line_number":86,"context_line":"            test_image \u003d utils.create_test_image("},{"line_number":87,"context_line":"                id\u003did_,"},{"line_number":88,"context_line":"                repo\u003d\u0027testrepo\u0027 + str(id_),"},{"line_number":89,"context_line":"                uuid\u003dcomm_utils.generate_uuid())"},{"line_number":90,"context_line":"            image_list.append(objects.Image(self.context, **test_image))"},{"line_number":91,"context_line":"        mock_image_list.return_value \u003d image_list[-1:]"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_995da949","line":88,"in_reply_to":"ba5da102_0b7cf41d","updated":"2016-11-02 14:58:12.000000000","message":"Sheel, I think it\u0027s just OK having a repo value in this test case. Whatever, it\u0027s just for populating some test data which are four images.","commit_id":"785992c09c41a19c619aaab3543679c008eacd15"},{"author":{"_account_id":16277,"name":"Pradeep Kumar Singh","email":"ps4openstack@gmail.com","username":"pradeep_singh"},"change_message_id":"65e86e13be1a48ddec2e7571ebefc1f5d473aaa0","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        for id_ in range(4):"},{"line_number":86,"context_line":"            test_image \u003d utils.create_test_image("},{"line_number":87,"context_line":"                id\u003did_,"},{"line_number":88,"context_line":"                repo\u003d\u0027testrepo\u0027 + str(id_),"},{"line_number":89,"context_line":"                uuid\u003dcomm_utils.generate_uuid())"},{"line_number":90,"context_line":"            image_list.append(objects.Image(self.context, **test_image))"},{"line_number":91,"context_line":"        mock_image_list.return_value \u003d image_list[-1:]"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_7c77c69f","line":88,"in_reply_to":"ba5da102_995da949","updated":"2016-11-03 05:09:52.000000000","message":"+1, i agree with duhu","commit_id":"785992c09c41a19c619aaab3543679c008eacd15"}]}
