)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"5a38b5bb80254872213aeedb351cd5bf562c6875","unresolved":false,"context_lines":[{"line_number":13,"context_line":"datastore versions by tenant."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements: blueprint datastore-visibility"},{"line_number":16,"context_line":"Docimpact: change to datastore version payload"},{"line_number":17,"context_line":"Change-Id: Ic8024a631530ba295688d7e49e895f50cb2f32ef"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"baada198_82b0fbfe","line":16,"updated":"2014-07-29 08:29:23.000000000","message":"DocImpact\n\nand please describe which changes were proposed","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":13,"context_line":"datastore versions by tenant."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements: blueprint datastore-visibility"},{"line_number":16,"context_line":"Docimpact: change to datastore version payload"},{"line_number":17,"context_line":"Change-Id: Ic8024a631530ba295688d7e49e895f50cb2f32ef"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7ac7a964_cccada4e","line":16,"in_reply_to":"baada198_82b0fbfe","updated":"2014-08-15 19:34:49.000000000","message":"Done","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"}],"trove/common/exception.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"06d4953582a67dea77368153c2f1a458d7801cef","unresolved":false,"context_lines":[{"line_number":141,"context_line":"class DatastoreVersionMemberExists(TroveError):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    message \u003d _(\"Tenant \u0027%(tenant_id)s\u0027 is already a member of datastore \""},{"line_number":144,"context_line":"                \"version %(datastore_version_id)s\")"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"class DatastoreVersionMemberNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7ac7a964_d819a67a","line":144,"updated":"2014-08-16 14:21:42.000000000","message":"missing period","commit_id":"f7b2970f3203d74a0115b3e9e0b571126dae5b09"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"16676e5b3c084d47e8a7399977f000b00940860d","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    message \u003d _(\"Tenant \u0027%(tenant_id)s\u0027 is already a member of datastore \""},{"line_number":144,"context_line":"                \"version %(datastore_version_id)s\")"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"class DatastoreVersionMemberNotFound(NotFound):"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa98f980_08b077dc","line":145,"updated":"2014-09-08 15:59:41.000000000","message":"missing period","commit_id":"ab6000f71e54ba2b9712805f56a69c8b9bfec64f"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"ffca09cbd8bb14582d0fa470e56fd56efb200c6e","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"class DatastoreVersionMemberExists(TroveError):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    message \u003d _(\"Tenant \u0027%(tenant_id)s\u0027 is already a member of datastore \""},{"line_number":144,"context_line":"                \"version %(datastore_version_id)s.\")"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9aa7fdbe_c0f7ba57","line":143,"updated":"2014-10-23 21:47:35.000000000","message":"This message is better suited to a developer than a user. May I suggest\n\n\"Datastore xxx is already visible to tenant yyy\"","commit_id":"22b36963370bfa657c88f7e419c3f288258c7f77"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"ffca09cbd8bb14582d0fa470e56fd56efb200c6e","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"class DatastoreVersionMemberNotFound(NotFound):"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    message \u003d _(\"Datastore version member \u0027%(member_id)s\u0027 not found.\")"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"class InvalidDatastoreManager(TroveError):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aa7fdbe_209ec607","line":149,"updated":"2014-10-23 21:47:35.000000000","message":"Datastore xxx not found","commit_id":"22b36963370bfa657c88f7e419c3f288258c7f77"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"4f714948f181dcb48c9d78abfa09c6ba2768ee4c","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    message \u003d _(\"Default version for datastore \u0027%(datastore)s\u0027 not found.\")"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"class DatastoreVersionMemberExists(TroveError):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    message \u003d _(\"Tenant \u0027%(tenant_id)s\u0027 is already a member of datastore \""},{"line_number":144,"context_line":"                \"version %(datastore_version_id)s.\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_ba63d83f","line":141,"updated":"2014-12-18 19:33:09.000000000","message":"I will reiterate my comment from earlier reviews.\n\nThis message is better suited to a developer than a user. May I suggest\n\n\"Datastore xxx is already visible to tenant yyy\"\n\n\"Datastore xxx not found\"\n\nIs there a reason why this change cannot be made? It seems like we went through a lengthy process to make messages more usable for users, yet when requests to change messages during a review are made, we always accept the change and think we can fix the messages later.","commit_id":"bc1038d2ac8885aba7dd6d84d8e7f50a19fc2ad7"},{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"51674b2850adca30178f2fe64942eb340d423f12","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    message \u003d _(\"Default version for datastore \u0027%(datastore)s\u0027 not found.\")"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"class DatastoreVersionMemberExists(TroveError):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    message \u003d _(\"Tenant \u0027%(tenant_id)s\u0027 is already a member of datastore \""},{"line_number":144,"context_line":"                \"version %(datastore_version_id)s.\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_50c20b87","line":141,"in_reply_to":"3a961159_7f949436","updated":"2015-02-16 07:02:37.000000000","message":"The suggested message makes more sense and simple.","commit_id":"bc1038d2ac8885aba7dd6d84d8e7f50a19fc2ad7"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"f4367ef0da9a46e334f8f6ba0fb4cc053762dfe3","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    message \u003d _(\"Default version for datastore \u0027%(datastore)s\u0027 not found.\")"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"class DatastoreVersionMemberExists(TroveError):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    message \u003d _(\"Tenant \u0027%(tenant_id)s\u0027 is already a member of datastore \""},{"line_number":144,"context_line":"                \"version %(datastore_version_id)s.\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_7f949436","line":141,"in_reply_to":"3a961159_ba63d83f","updated":"2014-12-23 21:16:23.000000000","message":"+1","commit_id":"bc1038d2ac8885aba7dd6d84d8e7f50a19fc2ad7"}],"trove/common/wsgi.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ed74c7a9369431628db550ac44de71d4b7ecd1e1","unresolved":false,"context_lines":[{"line_number":324,"context_line":"            exception.BadValue,"},{"line_number":325,"context_line":"            exception.DatabaseAlreadyExists,"},{"line_number":326,"context_line":"            exception.UserAlreadyExists,"},{"line_number":327,"context_line":"            exception.LocalStorageNotSpecified,"},{"line_number":328,"context_line":"        ],"},{"line_number":329,"context_line":"        webob.exc.HTTPNotFound: ["},{"line_number":330,"context_line":"            exception.NotFound,"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_42e5033d","line":327,"updated":"2014-07-29 08:28:49.000000000","message":"You should add DatastoreVersionMemberExists exception to HTTP 400, BadRequest definition","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":324,"context_line":"            exception.BadValue,"},{"line_number":325,"context_line":"            exception.DatabaseAlreadyExists,"},{"line_number":326,"context_line":"            exception.UserAlreadyExists,"},{"line_number":327,"context_line":"            exception.LocalStorageNotSpecified,"},{"line_number":328,"context_line":"        ],"},{"line_number":329,"context_line":"        webob.exc.HTTPNotFound: ["},{"line_number":330,"context_line":"            exception.NotFound,"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_92eb1011","line":327,"in_reply_to":"baada198_42e5033d","updated":"2014-08-15 19:34:49.000000000","message":"Sure. It seems to default to BadRequest, but I\u0027m all for specifying it explicitly.","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"06d4953582a67dea77368153c2f1a458d7801cef","unresolved":false,"context_lines":[{"line_number":325,"context_line":"            exception.DatabaseAlreadyExists,"},{"line_number":326,"context_line":"            exception.UserAlreadyExists,"},{"line_number":327,"context_line":"            exception.LocalStorageNotSpecified,"},{"line_number":328,"context_line":"            exception.DatastoreVersionMemberExists,"},{"line_number":329,"context_line":"        ],"},{"line_number":330,"context_line":"        webob.exc.HTTPNotFound: ["},{"line_number":331,"context_line":"            exception.NotFound,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7ac7a964_182b1e83","line":328,"updated":"2014-08-16 14:21:42.000000000","message":"Actually, this is incorrect mapping for DatastoreVersionMemberExists exception. See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html\n\nTrying to add a duplicate or a member: 409 Conflict (\"The request could not be completed due to a conflict with the current state of the resource.\")","commit_id":"f7b2970f3203d74a0115b3e9e0b571126dae5b09"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"7ed5fb9784aa7358f15b93d76c8bc0861fb5b74a","unresolved":false,"context_lines":[{"line_number":325,"context_line":"            exception.DatabaseAlreadyExists,"},{"line_number":326,"context_line":"            exception.UserAlreadyExists,"},{"line_number":327,"context_line":"            exception.LocalStorageNotSpecified,"},{"line_number":328,"context_line":"            exception.DatastoreVersionMemberExists,"},{"line_number":329,"context_line":"        ],"},{"line_number":330,"context_line":"        webob.exc.HTTPNotFound: ["},{"line_number":331,"context_line":"            exception.NotFound,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_2ec99279","line":328,"in_reply_to":"1abeadc6_98085a93","updated":"2014-08-26 17:25:08.000000000","message":"I agree, this scenario should be a 409.","commit_id":"f7b2970f3203d74a0115b3e9e0b571126dae5b09"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"1bd18f66c1ec894f12f72f23adef31ae142477cf","unresolved":false,"context_lines":[{"line_number":325,"context_line":"            exception.DatabaseAlreadyExists,"},{"line_number":326,"context_line":"            exception.UserAlreadyExists,"},{"line_number":327,"context_line":"            exception.LocalStorageNotSpecified,"},{"line_number":328,"context_line":"            exception.DatastoreVersionMemberExists,"},{"line_number":329,"context_line":"        ],"},{"line_number":330,"context_line":"        webob.exc.HTTPNotFound: ["},{"line_number":331,"context_line":"            exception.NotFound,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_98085a93","line":328,"in_reply_to":"7ac7a964_182b1e83","updated":"2014-08-25 18:50:21.000000000","message":"But it\u0027s not saying there\u0027s a conflict with the current state of the resource. The issue is the resource already exists- the only way to fix it is to change it to have a different name and thus be totally different. I think that\u0027s out of the scope of a 409.\n\n403 might be more effective. But I\u0027m not sure what the right answer is.","commit_id":"f7b2970f3203d74a0115b3e9e0b571126dae5b09"}],"trove/datastore/models.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"13f78949d57176a9e84b03db41b74c2b2bada958","unresolved":false,"context_lines":[{"line_number":483,"context_line":"            yield item"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"class DatastoreVersionMember(object):"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"    @staticmethod"},{"line_number":489,"context_line":"    def load_all(version_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_2e6746eb","line":486,"updated":"2014-08-04 14:23:56.000000000","message":"This class should get some unit tests.","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":483,"context_line":"            yield item"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"class DatastoreVersionMember(object):"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"    @staticmethod"},{"line_number":489,"context_line":"    def load_all(version_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ac7a964_ccce5a83","line":486,"in_reply_to":"baada198_2e6746eb","updated":"2014-08-15 19:34:49.000000000","message":"Some unit tests were added.","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"a83f18178a922b6a133839063c16714d7eace527","unresolved":false,"context_lines":[{"line_number":499,"context_line":"        except exception.ModelNotFoundError:"},{"line_number":500,"context_line":"            raise exception.DatastoreVersionMemberNotFound("},{"line_number":501,"context_line":"                member_id\u003dmember_tenant_id)"},{"line_number":502,"context_line":"        filtered_by_datastore \u003d [vt for vt in versions_by_tenant"},{"line_number":503,"context_line":"                                 if vt.datastore_version_id in"},{"line_number":504,"context_line":"                                 versions_by_datastore]"},{"line_number":505,"context_line":"        return filtered_by_datastore"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_95fe2c69","line":502,"updated":"2014-07-30 20:31:57.000000000","message":"is it possible to do a join?","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":499,"context_line":"        except exception.ModelNotFoundError:"},{"line_number":500,"context_line":"            raise exception.DatastoreVersionMemberNotFound("},{"line_number":501,"context_line":"                member_id\u003dmember_tenant_id)"},{"line_number":502,"context_line":"        filtered_by_datastore \u003d [vt for vt in versions_by_tenant"},{"line_number":503,"context_line":"                                 if vt.datastore_version_id in"},{"line_number":504,"context_line":"                                 versions_by_datastore]"},{"line_number":505,"context_line":"        return filtered_by_datastore"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ac7a964_8cb542f0","line":502,"in_reply_to":"baada198_95fe2c69","updated":"2014-08-15 19:34:49.000000000","message":"So I *think* I have this working. Might need more thorough testing and scrutinization.","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"1bd18f66c1ec894f12f72f23adef31ae142477cf","unresolved":false,"context_lines":[{"line_number":534,"context_line":"        member.delete()"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"    @staticmethod"},{"line_number":537,"context_line":"    def check_allowed(context, datastore_version, tenant_id):"},{"line_number":538,"context_line":"        \"\"\"Checks if tenant_id is allowed to access the datastore version.\"\"\""},{"line_number":539,"context_line":"        if context.is_admin:"},{"line_number":540,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_33b8492a","line":537,"updated":"2014-08-25 18:50:21.000000000","message":"I\u0027m not entirely certain why so many of these methods couldn\u0027t have been put on the datastore version itself. To me it makes more sense to ask the datastore version if it allows a certain tenant_id.","commit_id":"f7b2970f3203d74a0115b3e9e0b571126dae5b09"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"06d4953582a67dea77368153c2f1a458d7801cef","unresolved":false,"context_lines":[{"line_number":555,"context_line":"                   DatastoreVersionMember.load_by_tenant_id("},{"line_number":556,"context_line":"                       tenant_id, datastore_id\u003ddatastore)]"},{"line_number":557,"context_line":"        filtered \u003d [d for d in versions_list"},{"line_number":558,"context_line":"                    if d.visibility \u003d\u003d \u0027public\u0027 or d.id in allowed]"},{"line_number":559,"context_line":"        return filtered"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7ac7a964_98364ee6","line":558,"updated":"2014-08-16 14:21:42.000000000","message":"you might need to use native SQLAlchemy filtering mechanism instead of doing this.","commit_id":"f7b2970f3203d74a0115b3e9e0b571126dae5b09"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"edcdecb191479575b45cbaa6001881d884f45831","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        present \u003d DBDatastoreVersionMember.find_all("},{"line_number":522,"context_line":"            datastore_version_id\u003dversion_id,"},{"line_number":523,"context_line":"            tenant_id\u003dmember_tenant_id)"},{"line_number":524,"context_line":"        if present.count() \u003e 0:"},{"line_number":525,"context_line":"            raise exception.DatastoreVersionMemberExists("},{"line_number":526,"context_line":"                tenant_id\u003dmember_tenant_id, datastore_version_id\u003dversion_id)"},{"line_number":527,"context_line":"        versionMember \u003d DBDatastoreVersionMember.create("}],"source_content_type":"text/x-python","patch_set":3,"id":"1abeadc6_bc3e5789","line":524,"updated":"2014-08-28 19:14:06.000000000","message":"do we want to forbid adding members if visibility is public?","commit_id":"fce4a65cb2d44fb548c12c50f301a1c95a00964e"},{"author":{"_account_id":5390,"name":"Steve Leon","username":"steve-leon","inactive":true},"change_message_id":"ce149d49be71e61d33d2ac89ab516d1f670822c6","unresolved":false,"context_lines":[{"line_number":540,"context_line":"            return True"},{"line_number":541,"context_line":"        if datastore_version.visibility \u003d\u003d \u0027public\u0027:"},{"line_number":542,"context_line":"            return True"},{"line_number":543,"context_line":"        count \u003d DBDatastoreVersionMember.find_all("},{"line_number":544,"context_line":"            datastore_version_id\u003ddatastore_version.id,"},{"line_number":545,"context_line":"            tenant_id\u003dtenant_id).count()"},{"line_number":546,"context_line":"        if count \u003e 0:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1abeadc6_f3c77e62","line":543,"updated":"2014-08-26 19:22:36.000000000","message":"This works but i am wondering why you didnt use the load_by_tenant_id() defined earlier instead of using find_all(). Only one member record can exist for a specific tenant and datastore version. So find_all().count() will always return you either zero or one. We just want to check whether a tenantID for a specific datastore version exist, so using load_by_tenant_id() seems more suitable.","commit_id":"fce4a65cb2d44fb548c12c50f301a1c95a00964e"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"f4e23277c2ce4aa54e78468042a6cade4bae4064","unresolved":false,"context_lines":[{"line_number":540,"context_line":"            return True"},{"line_number":541,"context_line":"        if datastore_version.visibility \u003d\u003d \u0027public\u0027:"},{"line_number":542,"context_line":"            return True"},{"line_number":543,"context_line":"        count \u003d DBDatastoreVersionMember.find_all("},{"line_number":544,"context_line":"            datastore_version_id\u003ddatastore_version.id,"},{"line_number":545,"context_line":"            tenant_id\u003dtenant_id).count()"},{"line_number":546,"context_line":"        if count \u003e 0:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1abeadc6_a2de5b0f","line":543,"in_reply_to":"1abeadc6_f3c77e62","updated":"2014-08-27 22:18:38.000000000","message":"That function only works for datastores, not datastore_versions.","commit_id":"fce4a65cb2d44fb548c12c50f301a1c95a00964e"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"6b6304eba25bf889ba19c588048a59a4a8ed7360","unresolved":false,"context_lines":[{"line_number":497,"context_line":"            datastore_id \u003d datastore.id"},{"line_number":498,"context_line":"        elif not datastore_id:"},{"line_number":499,"context_line":"            raise TypeError(\"Must specify a datastore object or a\""},{"line_number":500,"context_line":"                            \" datastore_id\")"},{"line_number":501,"context_line":"        try:"},{"line_number":502,"context_line":"            query \u003d DBDatastoreVersionMember.query().filter("},{"line_number":503,"context_line":"                DBDatastoreVersionMember.tenant_id \u003d\u003d member_tenant_id,"}],"source_content_type":"text/x-python","patch_set":8,"id":"baa201ad_b9047115","line":500,"updated":"2014-10-17 11:00:44.000000000","message":"missing period","commit_id":"f6024d1ec655978cf3fc81e63e926d83d220cba1"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"ffca09cbd8bb14582d0fa470e56fd56efb200c6e","unresolved":false,"context_lines":[{"line_number":555,"context_line":"                   DatastoreVersionMember.load_by_tenant_id("},{"line_number":556,"context_line":"                       tenant_id, datastore_id\u003ddatastore)]"},{"line_number":557,"context_line":"        filtered \u003d [d for d in versions_list"},{"line_number":558,"context_line":"                    if d.visibility \u003d\u003d \u0027public\u0027 or d.id in allowed]"},{"line_number":559,"context_line":"        return filtered"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9aa7fdbe_6b150f3f","line":558,"updated":"2014-10-23 21:47:35.000000000","message":"Isn\u0027t this inconsistent with check_allowed() above which allows both \u0027public\u0027 and \u0027unlisted\u0027?\n\nI\u0027d suggest that you should instead make filter_versions() invoke check_allowed() rather than having this test here.","commit_id":"22b36963370bfa657c88f7e419c3f288258c7f77"},{"author":{"_account_id":7796,"name":"Riddhi Shah","email":"ridhi.j.shah@gmail.com","username":"ridhi-j-shah"},"change_message_id":"3b0282dc0666da3672e2e8ec62ceb344aad1f521","unresolved":false,"context_lines":[{"line_number":555,"context_line":"                   DatastoreVersionMember.load_by_tenant_id("},{"line_number":556,"context_line":"                       tenant_id, datastore_id\u003ddatastore)]"},{"line_number":557,"context_line":"        filtered \u003d [d for d in versions_list"},{"line_number":558,"context_line":"                    if d.visibility \u003d\u003d \u0027public\u0027 or d.id in allowed]"},{"line_number":559,"context_line":"        return filtered"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7a8c0949_239b8e19","line":558,"in_reply_to":"9aa7fdbe_6b150f3f","updated":"2014-10-31 18:39:22.000000000","message":"The usage of filter_versions() and check_allowed() are different.\n\nfilter_versions() is invoked during the datastore-version-list api call. As per the blueprint, if visibility \u003d \u0027unlisted\u0027 a user CANNOT view the datastore-version-list.\n\ncheck_allowed() is primarily used to check if the user has access to that datastore version (GET call on the datastore version). if visibility \u003d \u0027unlisted\u0027 a user CAN view the datastore-version.","commit_id":"22b36963370bfa657c88f7e419c3f288258c7f77"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"4f714948f181dcb48c9d78abfa09c6ba2768ee4c","unresolved":false,"context_lines":[{"line_number":496,"context_line":"        if datastore:"},{"line_number":497,"context_line":"            datastore_id \u003d datastore.id"},{"line_number":498,"context_line":"        elif not datastore_id:"},{"line_number":499,"context_line":"            raise TypeError(\"Must specify a datastore object or a\""},{"line_number":500,"context_line":"                            \" datastore_id.\")"},{"line_number":501,"context_line":"        try:"},{"line_number":502,"context_line":"            query \u003d DBDatastoreVersionMember.query().filter("}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_b550490b","line":499,"updated":"2014-12-18 19:33:09.000000000","message":"Why is this a TypeError?","commit_id":"bc1038d2ac8885aba7dd6d84d8e7f50a19fc2ad7"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"1411d8721d0ffa6efaa4de3940272423bc2db33b","unresolved":false,"context_lines":[{"line_number":496,"context_line":"        if datastore:"},{"line_number":497,"context_line":"            datastore_id \u003d datastore.id"},{"line_number":498,"context_line":"        elif not datastore_id:"},{"line_number":499,"context_line":"            raise TypeError(\"Must specify a datastore object or a\""},{"line_number":500,"context_line":"                            \" datastore_id.\")"},{"line_number":501,"context_line":"        try:"},{"line_number":502,"context_line":"            query \u003d DBDatastoreVersionMember.query().filter("}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_4399ef77","line":499,"in_reply_to":"3a961159_b550490b","updated":"2014-12-22 12:43:21.000000000","message":"+1","commit_id":"bc1038d2ac8885aba7dd6d84d8e7f50a19fc2ad7"}],"trove/datastore/service.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ed74c7a9369431628db550ac44de71d4b7ecd1e1","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from trove.common import wsgi, exception"},{"line_number":20,"context_line":"from trove.datastore import models, views"},{"line_number":21,"context_line":"from trove.openstack.common import log as logging"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_e2bc570a","line":19,"updated":"2014-07-29 08:28:49.000000000","message":"affects PEP H301, use singe import per line","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from trove.common import wsgi, exception"},{"line_number":20,"context_line":"from trove.datastore import models, views"},{"line_number":21,"context_line":"from trove.openstack.common import log as logging"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7ac7a964_4b597bfd","line":19,"in_reply_to":"baada198_e2bc570a","updated":"2014-08-15 19:34:49.000000000","message":"Done","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ed74c7a9369431628db550ac44de71d4b7ecd1e1","unresolved":false,"context_lines":[{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from trove.common import wsgi, exception"},{"line_number":20,"context_line":"from trove.datastore import models, views"},{"line_number":21,"context_line":"from trove.openstack.common import log as logging"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_823d5b91","line":20,"updated":"2014-07-29 08:28:49.000000000","message":"same here","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from trove.common import wsgi, exception"},{"line_number":20,"context_line":"from trove.datastore import models, views"},{"line_number":21,"context_line":"from trove.openstack.common import log as logging"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7ac7a964_2b643fb8","line":20,"in_reply_to":"baada198_823d5b91","updated":"2014-08-15 19:34:49.000000000","message":"Done","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ed74c7a9369431628db550ac44de71d4b7ecd1e1","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from trove.openstack.common import log as logging"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class DatastoreController(wsgi.Controller):"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_82c63b9b","line":24,"updated":"2014-07-29 08:28:49.000000000","message":"not used","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from trove.openstack.common import log as logging"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class DatastoreController(wsgi.Controller):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ac7a964_ab484f2e","line":24,"in_reply_to":"baada198_82c63b9b","updated":"2014-08-15 19:34:49.000000000","message":"Done","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"a83f18178a922b6a133839063c16714d7eace527","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def version_show_by_uuid(self, req, tenant_id, uuid):"},{"line_number":59,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":60,"context_line":"        datastore_version \u003d models.DatastoreVersion.load_by_uuid(uuid)"},{"line_number":61,"context_line":"        allowed \u003d models.DatastoreVersionMember.check_allowed("},{"line_number":62,"context_line":"            context, datastore_version, tenant_id)"},{"line_number":63,"context_line":"        if not allowed:"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_a69f8850","line":60,"updated":"2014-07-30 20:31:57.000000000","message":"can we do checked allowed on load_by_uuid and throw an exception there if not allowed?","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def version_show_by_uuid(self, req, tenant_id, uuid):"},{"line_number":59,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":60,"context_line":"        datastore_version \u003d models.DatastoreVersion.load_by_uuid(uuid)"},{"line_number":61,"context_line":"        allowed \u003d models.DatastoreVersionMember.check_allowed("},{"line_number":62,"context_line":"            context, datastore_version, tenant_id)"},{"line_number":63,"context_line":"        if not allowed:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ac7a964_31883071","line":60,"in_reply_to":"baada198_a69f8850","updated":"2014-08-15 19:34:49.000000000","message":"I think that\u0027s possible. And now I\u0027m also wondering if it would be better to have the membership-checking and exception-throwing centralized in the DatastoreVersion load* model methods.","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"a83f18178a922b6a133839063c16714d7eace527","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def _filter_versions(context, tenant_id, versions_list):"},{"line_number":83,"context_line":"        if context.is_admin:"},{"line_number":84,"context_line":"            return versions_list"},{"line_number":85,"context_line":"        allowed \u003d [d.datastore_version_id for d in"},{"line_number":86,"context_line":"                   models.DatastoreVersionMember.load_by_tenant_id("},{"line_number":87,"context_line":"                       versions_list, tenant_id)]"},{"line_number":88,"context_line":"        filtered \u003d [d for d in versions_list"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_a66ea895","line":85,"updated":"2014-07-30 20:31:57.000000000","message":"should this be in models.py? so we can reuse this for instance create and forbidding create if datastore is not visible.","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def _filter_versions(context, tenant_id, versions_list):"},{"line_number":83,"context_line":"        if context.is_admin:"},{"line_number":84,"context_line":"            return versions_list"},{"line_number":85,"context_line":"        allowed \u003d [d.datastore_version_id for d in"},{"line_number":86,"context_line":"                   models.DatastoreVersionMember.load_by_tenant_id("},{"line_number":87,"context_line":"                       versions_list, tenant_id)]"},{"line_number":88,"context_line":"        filtered \u003d [d for d in versions_list"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ac7a964_2b5e0246","line":85,"in_reply_to":"baada198_a66ea895","updated":"2014-08-15 19:34:49.000000000","message":"Yeah, that makes more sense. I\u0027ll move it to models.\n\nThe instance create and version show are using check_allowed() from models already. Though check_allowed() and filter_versions() are basically doing the same thing, so it might make sense to combine them into one.","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"1bd18f66c1ec894f12f72f23adef31ae142477cf","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def version_show(self, req, tenant_id, datastore, id):"},{"line_number":46,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":47,"context_line":"        datastore \u003d models.Datastore.load(datastore)"},{"line_number":48,"context_line":"        datastore_version \u003d models.DatastoreVersion.load(datastore, id)"},{"line_number":49,"context_line":"        allowed \u003d models.DatastoreVersionMember.check_allowed("},{"line_number":50,"context_line":"            context, datastore_version, tenant_id)"},{"line_number":51,"context_line":"        if not allowed:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_33c76966","line":48,"updated":"2014-08-25 18:50:21.000000000","message":"I think it would be preferrable to optionally pass in a tenant_id to the load method based on whether or not the context is an admin. Otherwise too much of the logic has to live in the API controller.","commit_id":"f7b2970f3203d74a0115b3e9e0b571126dae5b09"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"528164861b7b2cfb91f117c2e11de064c7100bbc","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def version_show(self, req, tenant_id, datastore, id):"},{"line_number":46,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":47,"context_line":"        datastore \u003d models.Datastore.load(datastore)"},{"line_number":48,"context_line":"        datastore_version \u003d models.DatastoreVersion.load(datastore, id)"},{"line_number":49,"context_line":"        allowed \u003d models.DatastoreVersionMember.check_allowed("},{"line_number":50,"context_line":"            context, datastore_version, tenant_id)"},{"line_number":51,"context_line":"        if not allowed:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_13131f5d","line":48,"in_reply_to":"1abeadc6_33c76966","updated":"2014-08-26 16:50:16.000000000","message":"+1","commit_id":"f7b2970f3203d74a0115b3e9e0b571126dae5b09"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"1bd18f66c1ec894f12f72f23adef31ae142477cf","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def version_show_by_uuid(self, req, tenant_id, uuid):"},{"line_number":57,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":58,"context_line":"        datastore_version \u003d models.DatastoreVersion.load_by_uuid(uuid)"},{"line_number":59,"context_line":"        allowed \u003d models.DatastoreVersionMember.check_allowed("},{"line_number":60,"context_line":"            context, datastore_version, tenant_id)"},{"line_number":61,"context_line":"        if not allowed:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_b3e619e7","line":58,"updated":"2014-08-25 18:50:21.000000000","message":"Ditto here. This extra logic should have been moved into DatastoreVersion load_by_uuid. Tenant ID could have been optional (otherwise anything is allowed).","commit_id":"f7b2970f3203d74a0115b3e9e0b571126dae5b09"}],"trove/db/sqlalchemy/mappers.py":[{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"ffca09cbd8bb14582d0fa470e56fd56efb200c6e","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    orm.mapper(models[\u0027datastore_configuration_parameters\u0027],"},{"line_number":69,"context_line":"               Table(\u0027datastore_configuration_parameters\u0027, meta,"},{"line_number":70,"context_line":"                     autoload\u003dTrue))"},{"line_number":71,"context_line":"    orm.mapper(models[\u0027datastore_version_member\u0027],"},{"line_number":72,"context_line":"               Table(\u0027datastore_version_members\u0027, meta, autoload\u003dTrue))"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9aa7fdbe_cb5d1b17","line":71,"updated":"2014-10-23 21:47:35.000000000","message":"no biggie but having the name be different here (plural vs. singular) had me doing double takes while reading the code. In most cases we use the same name.\n\nIs there a specific reason you chose not to?","commit_id":"22b36963370bfa657c88f7e419c3f288258c7f77"}],"trove/db/sqlalchemy/migrate_repo/versions/032_datastore_visibility.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ed74c7a9369431628db550ac44de71d4b7ecd1e1","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from sqlalchemy.schema import Column"},{"line_number":16,"context_line":"from sqlalchemy.schema import MetaData"},{"line_number":17,"context_line":"from sqlalchemy import ForeignKey"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from trove.db.sqlalchemy.migrate_repo.schema import create_tables"},{"line_number":20,"context_line":"from trove.db.sqlalchemy.migrate_repo.schema import drop_tables"},{"line_number":21,"context_line":"from trove.db.sqlalchemy.migrate_repo.schema import Table"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_82547bc7","line":18,"updated":"2014-07-29 08:28:49.000000000","message":"please sort imports in correct order","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from sqlalchemy.schema import Column"},{"line_number":16,"context_line":"from sqlalchemy.schema import MetaData"},{"line_number":17,"context_line":"from sqlalchemy import ForeignKey"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from trove.db.sqlalchemy.migrate_repo.schema import create_tables"},{"line_number":20,"context_line":"from trove.db.sqlalchemy.migrate_repo.schema import drop_tables"},{"line_number":21,"context_line":"from trove.db.sqlalchemy.migrate_repo.schema import Table"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_60130659","line":18,"in_reply_to":"baada198_82547bc7","updated":"2014-08-15 19:34:49.000000000","message":"Done, I think. Let me know if they\u0027re still not correct in the next patch. I found the guidelines a little confusing.","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"a83f18178a922b6a133839063c16714d7eace527","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    Column(\u0027datastore_version_id\u0027, String(36),"},{"line_number":31,"context_line":"           ForeignKey(\u0027datastore_versions.id\u0027, ondelete\u003d\"CASCADE\","},{"line_number":32,"context_line":"                      onupdate\u003d\"CASCADE\")),"},{"line_number":33,"context_line":"    Column(\u0027tenant_id\u0027, String(36))"},{"line_number":34,"context_line":")"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_06e914e3","line":33,"updated":"2014-07-30 20:31:57.000000000","message":"do you think we should have created , deleted, deleted_at columns?\nalso can we have tenant_id as nullable\u003dFalse","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    Column(\u0027datastore_version_id\u0027, String(36),"},{"line_number":31,"context_line":"           ForeignKey(\u0027datastore_versions.id\u0027, ondelete\u003d\"CASCADE\","},{"line_number":32,"context_line":"                      onupdate\u003d\"CASCADE\")),"},{"line_number":33,"context_line":"    Column(\u0027tenant_id\u0027, String(36))"},{"line_number":34,"context_line":")"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_4071a243","line":33,"in_reply_to":"baada198_06e914e3","updated":"2014-08-15 19:34:49.000000000","message":"Right now when members are deleted they\u0027re actually removed from the datastore_version_members table, so the deleted and deleted_at timestamps wouldn\u0027t do much good. Unless that\u0027s something that should change.\n\nDone: tenant_id nullable\u003dFalse","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"86a1f94508b2ae7442a44eaee52a697ebb3d61f1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"fa98f980_1008f990","updated":"2014-09-04 18:29:33.000000000","message":"Given the state of master, shouldn\u0027t this be named 033_datastore_visibility.py?","commit_id":"b64c9dae35571aaaabb7e96769a582a4637c58a5"}],"trove/db/sqlalchemy/migrate_repo/versions/034_datastore_visibility.py":[{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"ffca09cbd8bb14582d0fa470e56fd56efb200c6e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    Column(\u0027datastore_version_id\u0027, String(36),"},{"line_number":31,"context_line":"           ForeignKey(\u0027datastore_versions.id\u0027, ondelete\u003d\"CASCADE\","},{"line_number":32,"context_line":"                      onupdate\u003d\"CASCADE\")),"},{"line_number":33,"context_line":"    Column(\u0027tenant_id\u0027, String(36), nullable\u003dFalse)"},{"line_number":34,"context_line":")"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9aa7fdbe_60560e5e","line":33,"updated":"2014-10-23 21:47:35.000000000","message":"I\u0027m not sure which is right but the bp indicates that this is nullable.","commit_id":"22b36963370bfa657c88f7e419c3f288258c7f77"},{"author":{"_account_id":7796,"name":"Riddhi Shah","email":"ridhi.j.shah@gmail.com","username":"ridhi-j-shah"},"change_message_id":"3b0282dc0666da3672e2e8ec62ceb344aad1f521","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    Column(\u0027datastore_version_id\u0027, String(36),"},{"line_number":31,"context_line":"           ForeignKey(\u0027datastore_versions.id\u0027, ondelete\u003d\"CASCADE\","},{"line_number":32,"context_line":"                      onupdate\u003d\"CASCADE\")),"},{"line_number":33,"context_line":"    Column(\u0027tenant_id\u0027, String(36), nullable\u003dFalse)"},{"line_number":34,"context_line":")"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7a8c0949_a374decf","line":33,"in_reply_to":"9aa7fdbe_0d16094c","updated":"2014-10-31 18:39:22.000000000","message":"Fixed BP for this.","commit_id":"22b36963370bfa657c88f7e419c3f288258c7f77"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"b503688c9e3d1520252b8c8a5e570154dc262ed1","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    Column(\u0027datastore_version_id\u0027, String(36),"},{"line_number":31,"context_line":"           ForeignKey(\u0027datastore_versions.id\u0027, ondelete\u003d\"CASCADE\","},{"line_number":32,"context_line":"                      onupdate\u003d\"CASCADE\")),"},{"line_number":33,"context_line":"    Column(\u0027tenant_id\u0027, String(36), nullable\u003dFalse)"},{"line_number":34,"context_line":")"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9aa7fdbe_0d16094c","line":33,"in_reply_to":"9aa7fdbe_60560e5e","updated":"2014-10-28 08:32:50.000000000","message":"i guess BP needs to be fix, as we all understand that tenant id can\u0027t be nullable.","commit_id":"22b36963370bfa657c88f7e419c3f288258c7f77"}],"trove/db/sqlalchemy/migrate_repo/versions/035_datastore_visibility.py":[{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"51674b2850adca30178f2fe64942eb340d423f12","unresolved":false,"context_lines":[{"line_number":47,"context_line":"def downgrade(migrate_engine):"},{"line_number":48,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":49,"context_line":"    dv_table \u003d Table(\u0027datastore_versions\u0027, meta, autoload\u003dTrue)"},{"line_number":50,"context_line":"    dv_table.drop_column(\u0027visibility\u0027)"},{"line_number":51,"context_line":"    drop_tables([datastore_version_members])"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_302af72c","line":50,"updated":"2015-02-16 07:02:37.000000000","message":"dropping the child table first and then dropping the column would improve the performance","commit_id":"bc1038d2ac8885aba7dd6d84d8e7f50a19fc2ad7"}],"trove/extensions/mgmt/datastores/service.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ed74c7a9369431628db550ac44de71d4b7ecd1e1","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from trove.common import wsgi"},{"line_number":18,"context_line":"from trove.common.auth import admin_context"},{"line_number":19,"context_line":"from trove.openstack.common import log as logging"},{"line_number":20,"context_line":"from trove.datastore import models, views"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_e2f1b7df","line":20,"updated":"2014-07-29 08:28:49.000000000","message":"affects H301","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from trove.common import wsgi"},{"line_number":18,"context_line":"from trove.common.auth import admin_context"},{"line_number":19,"context_line":"from trove.openstack.common import log as logging"},{"line_number":20,"context_line":"from trove.datastore import models, views"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_e06c76d1","line":20,"in_reply_to":"baada198_e2f1b7df","updated":"2014-08-15 19:34:49.000000000","message":"Done. Strange that tox doesn\u0027t catch this sort of thing.","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ed74c7a9369431628db550ac44de71d4b7ecd1e1","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from trove.datastore import models, views"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class DatastoreVersionMemberController(wsgi.Controller):"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_22fc8fb5","line":23,"updated":"2014-07-29 08:28:49.000000000","message":"not used","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from trove.datastore import models, views"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class DatastoreVersionMemberController(wsgi.Controller):"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_8081fa4e","line":23,"in_reply_to":"baada198_22fc8fb5","updated":"2014-08-15 19:34:49.000000000","message":"Done","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"ffca09cbd8bb14582d0fa470e56fd56efb200c6e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    @admin_context"},{"line_number":27,"context_line":"    def index(self, req, tenant_id, datastore_id, version_id):"},{"line_number":28,"context_line":"        \"\"\"Return all members of the specified datastore version.\"\"\""},{"line_number":29,"context_line":"        # load the datastore and version to verify they\u0027re legit"},{"line_number":30,"context_line":"        datastore \u003d models.Datastore.load(datastore_id)"},{"line_number":31,"context_line":"        datastore_version \u003d models.DatastoreVersion.load(datastore, version_id)"},{"line_number":32,"context_line":"        members \u003d models.DatastoreVersionMember.load_all(datastore_version.id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aa7fdbe_4ba92bde","line":29,"updated":"2014-10-23 21:47:35.000000000","message":"I find this comment amusing","commit_id":"22b36963370bfa657c88f7e419c3f288258c7f77"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"ffca09cbd8bb14582d0fa470e56fd56efb200c6e","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    @admin_context"},{"line_number":72,"context_line":"    def show(self, req, tenant_id, datastore_id, id):"},{"line_number":73,"context_line":"        \"\"\"Get members by tenant_id (id).\"\"\""},{"line_number":74,"context_line":"        datastore \u003d models.Datastore.load(datastore_id)"},{"line_number":75,"context_line":"        members \u003d models.DatastoreVersionMember.load_by_tenant_id("},{"line_number":76,"context_line":"            id, datastore\u003ddatastore)"},{"line_number":77,"context_line":"        view_data \u003d views.DatastoreVersionMembersView(members)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aa7fdbe_cbb43b37","line":74,"updated":"2014-10-23 21:47:35.000000000","message":"And I find it disturbing that the comment isn\u0027t found here ;)","commit_id":"22b36963370bfa657c88f7e419c3f288258c7f77"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"49ceb0009184a6da8e1270ceb24f0a65c0678d8c","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \"\"\"Return all members of the specified datastore version.\"\"\""},{"line_number":29,"context_line":"        # load the datastore and version to verify they\u0027re legit"},{"line_number":30,"context_line":"        datastore \u003d models.Datastore.load(datastore_id)"},{"line_number":31,"context_line":"        datastore_version \u003d models.DatastoreVersion.load(datastore, version_id)"},{"line_number":32,"context_line":"        members \u003d models.DatastoreVersionMember.load_all(datastore_version.id)"},{"line_number":33,"context_line":"        view_data \u003d views.DatastoreVersionMembersView(members)"},{"line_number":34,"context_line":"        return wsgi.Result(view_data.data(), 200)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a890539_852ad17b","line":31,"updated":"2014-12-04 14:31:06.000000000","message":"you might need to reuse already existing logic of method named \"get_datastore_version\" of datastore/models.py","commit_id":"be00da6aef15d23daf5833fa87afadb50930e95e"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"49ceb0009184a6da8e1270ceb24f0a65c0678d8c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        # load the datastore and version to verify they\u0027re legit"},{"line_number":40,"context_line":"        datastore \u003d models.Datastore.load(datastore_id)"},{"line_number":41,"context_line":"        datastore_version \u003d models.DatastoreVersion.load(datastore, version_id)"},{"line_number":42,"context_line":"        new_member_tenant \u003d body[\u0027member\u0027]"},{"line_number":43,"context_line":"        new_entry \u003d models.DatastoreVersionMember.create(datastore_version.id,"},{"line_number":44,"context_line":"                                                         new_member_tenant)"},{"line_number":45,"context_line":"        view_data \u003d views.DatastoreVersionMemberView(new_entry)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a890539_c520599c","line":42,"updated":"2014-12-04 14:31:06.000000000","message":"you might need to reuse already existing logic of method named \"get_datastore_version\" of datastore/models.py","commit_id":"be00da6aef15d23daf5833fa87afadb50930e95e"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"49ceb0009184a6da8e1270ceb24f0a65c0678d8c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \"\"\"Get a datastore version member.\"\"\""},{"line_number":51,"context_line":"        # load the datastore and version to verify they\u0027re legit"},{"line_number":52,"context_line":"        datastore \u003d models.Datastore.load(datastore_id)"},{"line_number":53,"context_line":"        models.DatastoreVersion.load(datastore, version_id)"},{"line_number":54,"context_line":"        member \u003d models.DatastoreVersionMember.load(id)"},{"line_number":55,"context_line":"        view_data \u003d views.DatastoreVersionMemberView(member)"},{"line_number":56,"context_line":"        return wsgi.Result(view_data.data(), 200)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a890539_e53ab5cb","line":53,"updated":"2014-12-04 14:31:06.000000000","message":"you might need to reuse already existing logic of method named \"get_datastore_version\" of datastore/models.py\n\n\nalso, according to https://github.com/openstack/trove/blob/stable/juno/trove/datastore/models.py#L381-L392\n\nline #53 returns version, but given statement has no effect at all","commit_id":"be00da6aef15d23daf5833fa87afadb50930e95e"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"49ceb0009184a6da8e1270ceb24f0a65c0678d8c","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def delete(self, req, tenant_id, datastore_id, version_id, id):"},{"line_number":60,"context_line":"        # load the datastore and version to verify they\u0027re legit"},{"line_number":61,"context_line":"        datastore \u003d models.Datastore.load(datastore_id)"},{"line_number":62,"context_line":"        models.DatastoreVersion.load(datastore, version_id)"},{"line_number":63,"context_line":"        member \u003d models.DatastoreVersionMember.load(id)"},{"line_number":64,"context_line":"        models.DatastoreVersionMember.delete(member)"},{"line_number":65,"context_line":"        return wsgi.Result(None, 202)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a890539_8551f10f","line":62,"updated":"2014-12-04 14:31:06.000000000","message":"you might need to reuse already existing logic of method named \"get_datastore_version\" of datastore/models.py\n\n\nalso, according to https://github.com/openstack/trove/blob/stable/juno/trove/datastore/models.py#L381-L392\n\nline #53 returns version, but given statement has no effect at all","commit_id":"be00da6aef15d23daf5833fa87afadb50930e95e"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"49ceb0009184a6da8e1270ceb24f0a65c0678d8c","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    def update(self, req, body, tenant_id, datastore_id, id):"},{"line_number":82,"context_line":"        # load the datastore and version to verify they\u0027re legit"},{"line_number":83,"context_line":"        datastore \u003d models.Datastore.load(datastore_id)"},{"line_number":84,"context_line":"        datastore_version \u003d models.DatastoreVersion.load(datastore, id)"},{"line_number":85,"context_line":"        value \u003d body[\u0027datastore_version\u0027][\u0027visibility\u0027]"},{"line_number":86,"context_line":"        models.DatastoreVersion.set_visibility(datastore_version.id, value)"},{"line_number":87,"context_line":"        return wsgi.Result(None, 202)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a890539_6575e596","line":84,"updated":"2014-12-04 14:31:06.000000000","message":"you might need to reuse already existing logic of method named \"get_datastore_version\" of datastore/models.py","commit_id":"be00da6aef15d23daf5833fa87afadb50930e95e"}],"trove/extensions/routes/mgmt.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ed74c7a9369431628db550ac44de71d4b7ecd1e1","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from trove.extensions.mgmt.upgrade.service import UpgradeController"},{"line_number":25,"context_line":"from trove.extensions.mgmt.datastores.service import ("},{"line_number":26,"context_line":"    DatastoreVersionController,"},{"line_number":27,"context_line":"    DatastoreVersionMemberController)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_8222bb52","line":27,"updated":"2014-07-29 08:28:49.000000000","message":"affects H301","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from trove.extensions.mgmt.upgrade.service import UpgradeController"},{"line_number":25,"context_line":"from trove.extensions.mgmt.datastores.service import ("},{"line_number":26,"context_line":"    DatastoreVersionController,"},{"line_number":27,"context_line":"    DatastoreVersionMemberController)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ac7a964_4964fc21","line":27,"in_reply_to":"baada198_8222bb52","updated":"2014-08-15 19:34:49.000000000","message":"Ok, I tried splitting into two separate imports, though the second is still multi-line. Might need to rename these to something shorter.","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"ffca09cbd8bb14582d0fa470e56fd56efb200c6e","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            member_actions\u003d{})"},{"line_number":106,"context_line":"        resources.append(datastore_configuration_parameters)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        members_by_version \u003d extensions.ResourceExtension("},{"line_number":109,"context_line":"            \u0027{tenant_id}/mgmt/datastores/{datastore_id}/versions\u0027,"},{"line_number":110,"context_line":"            DatastoreVersionController(),"},{"line_number":111,"context_line":"            member_actions\u003d{},"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aa7fdbe_cbb99b16","line":108,"updated":"2014-10-23 21:47:35.000000000","message":"The spec seems to differ from these end points. Would you please update the BP.","commit_id":"22b36963370bfa657c88f7e419c3f288258c7f77"},{"author":{"_account_id":10725,"name":"Sergey Gotliv","email":"sgotliv@redhat.com","username":"sgotliv"},"change_message_id":"3b19cb8284cd1963eba1641395d3cdb9cb780223","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            member_actions\u003d{})"},{"line_number":106,"context_line":"        resources.append(datastore_configuration_parameters)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        members_by_version \u003d extensions.ResourceExtension("},{"line_number":109,"context_line":"            \u0027{tenant_id}/mgmt/datastores/{datastore_id}/versions\u0027,"},{"line_number":110,"context_line":"            DatastoreVersionController(),"},{"line_number":111,"context_line":"            member_actions\u003d{},"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_e353f114","line":108,"updated":"2014-12-19 00:46:08.000000000","message":"This is not \"members_by_version\", there is no \"members\" part in the URL below.","commit_id":"bc1038d2ac8885aba7dd6d84d8e7f50a19fc2ad7"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"4f714948f181dcb48c9d78abfa09c6ba2768ee4c","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        resources.append(members_by_version)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        members_by_tenant \u003d extensions.ResourceExtension("},{"line_number":116,"context_line":"            \u0027{tenant_id}/mgmt/datastores/{datastore_id}/versions/members\u0027,"},{"line_number":117,"context_line":"            DatastoreVersionController(),"},{"line_number":118,"context_line":"            member_actions\u003d{},"},{"line_number":119,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_8bc7b011","line":116,"updated":"2014-12-18 19:33:09.000000000","message":"I\u0027m not certain that I understand this mapping. Will ping on IRC.","commit_id":"bc1038d2ac8885aba7dd6d84d8e7f50a19fc2ad7"},{"author":{"_account_id":10725,"name":"Sergey Gotliv","email":"sgotliv@redhat.com","username":"sgotliv"},"change_message_id":"3b19cb8284cd1963eba1641395d3cdb9cb780223","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        resources.append(members_by_version)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        members_by_tenant \u003d extensions.ResourceExtension("},{"line_number":116,"context_line":"            \u0027{tenant_id}/mgmt/datastores/{datastore_id}/versions/members\u0027,"},{"line_number":117,"context_line":"            DatastoreVersionController(),"},{"line_number":118,"context_line":"            member_actions\u003d{},"},{"line_number":119,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_e32cd19b","line":116,"in_reply_to":"3a961159_0bb0208a","updated":"2014-12-19 00:46:08.000000000","message":"Just to clarify my previous comment, I would like to better understand what that url actually means, because it definitely not \"members_by_tenant\".\n\nIf you will remove /versions, \n\n{tenant_id}/mgmt/datastores/{datastore_id}/members\n\nit will be more like datastore_members, but if you really want to represent members_by_tenant you should use:\n\n{tenant_id}/mgmt/members","commit_id":"bc1038d2ac8885aba7dd6d84d8e7f50a19fc2ad7"},{"author":{"_account_id":10725,"name":"Sergey Gotliv","email":"sgotliv@redhat.com","username":"sgotliv"},"change_message_id":"33f27318c6e9e29b51896511de5d4731aff99cce","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        resources.append(members_by_version)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        members_by_tenant \u003d extensions.ResourceExtension("},{"line_number":116,"context_line":"            \u0027{tenant_id}/mgmt/datastores/{datastore_id}/versions/members\u0027,"},{"line_number":117,"context_line":"            DatastoreVersionController(),"},{"line_number":118,"context_line":"            member_actions\u003d{},"},{"line_number":119,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_0bb0208a","line":116,"in_reply_to":"3a961159_8bc7b011","updated":"2014-12-18 19:34:45.000000000","message":"This is not a restful url.","commit_id":"bc1038d2ac8885aba7dd6d84d8e7f50a19fc2ad7"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"1411d8721d0ffa6efaa4de3940272423bc2db33b","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        resources.append(members_by_version)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        members_by_tenant \u003d extensions.ResourceExtension("},{"line_number":116,"context_line":"            \u0027{tenant_id}/mgmt/datastores/{datastore_id}/versions/members\u0027,"},{"line_number":117,"context_line":"            DatastoreVersionController(),"},{"line_number":118,"context_line":"            member_actions\u003d{},"},{"line_number":119,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a961159_a37ff315","line":116,"in_reply_to":"3a961159_e32cd19b","updated":"2014-12-22 12:43:21.000000000","message":"+1 to complains above.","commit_id":"bc1038d2ac8885aba7dd6d84d8e7f50a19fc2ad7"}],"trove/instance/service.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"1bd18f66c1ec894f12f72f23adef31ae142477cf","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        datastore_args \u003d body[\u0027instance\u0027].get(\u0027datastore\u0027, {})"},{"line_number":181,"context_line":"        datastore, datastore_version \u003d ("},{"line_number":182,"context_line":"            datastore_models.get_datastore_version(**datastore_args))"},{"line_number":183,"context_line":"        allowed \u003d datastore_models.DatastoreVersionMember.check_allowed("},{"line_number":184,"context_line":"            context, datastore_version, tenant_id)"},{"line_number":185,"context_line":"        if not allowed:"},{"line_number":186,"context_line":"            raise exception.DatastoreVersionNotFound("}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_bdd26332","line":183,"updated":"2014-08-25 18:50:21.000000000","message":"Ditto to this being in the model.","commit_id":"f7b2970f3203d74a0115b3e9e0b571126dae5b09"}],"trove/tests/api/mgmt/datastores.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"13f78949d57176a9e84b03db41b74c2b2bada958","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"@test(groups\u003d[tests.DBAAS_API, GROUP, tests.PRE_INSTANCES],"},{"line_number":39,"context_line":"      depends_on_groups\u003d[\"services.initialize\"])"},{"line_number":40,"context_line":"class DatastoreVersionMembers(object):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @before_class"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_738e85d2","line":39,"updated":"2014-08-04 14:23:56.000000000","message":"This test doesn\u0027t actually depend on anything else, so you should get rid of this.","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"@test(groups\u003d[tests.DBAAS_API, GROUP, tests.PRE_INSTANCES],"},{"line_number":39,"context_line":"      depends_on_groups\u003d[\"services.initialize\"])"},{"line_number":40,"context_line":"class DatastoreVersionMembers(object):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @before_class"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ac7a964_d4043f80","line":39,"in_reply_to":"baada198_738e85d2","updated":"2014-08-15 19:34:49.000000000","message":"Done","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"a83f18178a922b6a133839063c16714d7eace527","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @before_class"},{"line_number":43,"context_line":"    def setUp(self):"},{"line_number":44,"context_line":"        # user-level items"},{"line_number":45,"context_line":"        self.user \u003d test_config.users.find_user(Requirements(is_admin\u003dFalse))"},{"line_number":46,"context_line":"        self.rd_client \u003d create_dbaas_client(self.user)"},{"line_number":47,"context_line":"        self.datastore_active \u003d self.rd_client.datastores.get("}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_a6222800","line":44,"updated":"2014-07-30 20:31:57.000000000","message":"do you think we should separate out user and admin tests?","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @before_class"},{"line_number":43,"context_line":"    def setUp(self):"},{"line_number":44,"context_line":"        # user-level items"},{"line_number":45,"context_line":"        self.user \u003d test_config.users.find_user(Requirements(is_admin\u003dFalse))"},{"line_number":46,"context_line":"        self.rd_client \u003d create_dbaas_client(self.user)"},{"line_number":47,"context_line":"        self.datastore_active \u003d self.rd_client.datastores.get("}],"source_content_type":"text/x-python","patch_set":1,"id":"7ac7a964_29c4205e","line":44,"in_reply_to":"baada198_a6222800","updated":"2014-08-15 19:34:49.000000000","message":"That might make things clearer. Should the user and admin tests be moved to separate classes, or just separate test routines in this class?","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"13f78949d57176a9e84b03db41b74c2b2bada958","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def setUp(self):"},{"line_number":44,"context_line":"        # user-level items"},{"line_number":45,"context_line":"        self.user \u003d test_config.users.find_user(Requirements(is_admin\u003dFalse))"},{"line_number":46,"context_line":"        self.rd_client \u003d create_dbaas_client(self.user)"},{"line_number":47,"context_line":"        self.datastore_active \u003d self.rd_client.datastores.get("},{"line_number":48,"context_line":"            test_config.dbaas_datastore)"},{"line_number":49,"context_line":"        self.dsv_active \u003d self.rd_client.datastore_versions.list("}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_b3301d08","line":46,"updated":"2014-08-04 14:23:56.000000000","message":"\"rd_client\" stood for \"RedDwarf client. :) In new code (and really the old code) it should be \"trove_client\" or just \"client\" since there\u0027s no other clients being used here besides \"rd_admin\" which could become \"admin_client\".","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def setUp(self):"},{"line_number":44,"context_line":"        # user-level items"},{"line_number":45,"context_line":"        self.user \u003d test_config.users.find_user(Requirements(is_admin\u003dFalse))"},{"line_number":46,"context_line":"        self.rd_client \u003d create_dbaas_client(self.user)"},{"line_number":47,"context_line":"        self.datastore_active \u003d self.rd_client.datastores.get("},{"line_number":48,"context_line":"            test_config.dbaas_datastore)"},{"line_number":49,"context_line":"        self.dsv_active \u003d self.rd_client.datastore_versions.list("}],"source_content_type":"text/x-python","patch_set":1,"id":"7ac7a964_34b653da","line":46,"in_reply_to":"baada198_b3301d08","updated":"2014-08-15 19:34:49.000000000","message":"Ah, the good old days. Done.","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"13f78949d57176a9e84b03db41b74c2b2bada958","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        # Get datastore version visibility"},{"line_number":63,"context_line":"        version \u003d self.dsv_active_admin"},{"line_number":64,"context_line":"        with TypeCheck(\u0027DatastoreVersion\u0027, version) as check:"},{"line_number":65,"context_line":"            check.has_field(\"visibility\", basestring)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @test(depends_on\u003d[test_visibility_get])"},{"line_number":68,"context_line":"    def test_visibility_set(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_73f7655a","line":65,"updated":"2014-08-04 14:23:56.000000000","message":"Can you check the other fields here?","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":11606,"name":"Theron Voran","email":"theron.voran@rackspace.com","username":"tvoran"},"change_message_id":"b6ba8ea36ff2633a6572672f6ffc6d602e57e21b","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        # Get datastore version visibility"},{"line_number":63,"context_line":"        version \u003d self.dsv_active_admin"},{"line_number":64,"context_line":"        with TypeCheck(\u0027DatastoreVersion\u0027, version) as check:"},{"line_number":65,"context_line":"            check.has_field(\"visibility\", basestring)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @test(depends_on\u003d[test_visibility_get])"},{"line_number":68,"context_line":"    def test_visibility_set(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ac7a964_b4d8a31e","line":65,"in_reply_to":"baada198_73f7655a","updated":"2014-08-15 19:34:49.000000000","message":"Done","commit_id":"ed0defae72490be5c45f4977fbd08ad40b8c746b"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"1bd18f66c1ec894f12f72f23adef31ae142477cf","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            client.datastore_versions.get(datastore_id, version_id)"},{"line_number":180,"context_line":"            return True"},{"line_number":181,"context_line":"        except exceptions.NotFound:"},{"line_number":182,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_bdb983ee","line":182,"updated":"2014-08-25 18:50:21.000000000","message":"Nice! You did a good job on all of these. :)","commit_id":"f7b2970f3203d74a0115b3e9e0b571126dae5b09"},{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"51674b2850adca30178f2fe64942eb340d423f12","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @test"},{"line_number":60,"context_line":"    def test_visibility_get(self):"},{"line_number":61,"context_line":"        # Get datastore version visibility"},{"line_number":62,"context_line":"        version \u003d self.dsv_active_admin"},{"line_number":63,"context_line":"        with TypeCheck(\u0027DatastoreVersion\u0027, version) as check:"},{"line_number":64,"context_line":"            check.has_field(\"id\", basestring)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_909d6369","line":61,"updated":"2015-02-16 07:02:37.000000000","message":"Consider converting this to docstring and for other tests too.","commit_id":"bc1038d2ac8885aba7dd6d84d8e7f50a19fc2ad7"}]}
