)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"7ccbcca863c27a67ee9a161afa2356d69ea343ed","unresolved":false,"context_lines":[{"line_number":34,"context_line":"APIImpact"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Change-Id: Ib90e2a931df068f417faf26e9c3780dc3c468867"},{"line_number":37,"context_line":"Partially-Implements: blueprint rbac-networks"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"3a50d1a3_9f6df7ce","line":37,"updated":"2015-07-18 20:12:02.000000000","message":"What\u0027s left, just the client work?","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"78223180357b15b45b0ce81164beb146e359c7aa","unresolved":false,"context_lines":[{"line_number":34,"context_line":"APIImpact"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Change-Id: Ib90e2a931df068f417faf26e9c3780dc3c468867"},{"line_number":37,"context_line":"Partially-Implements: blueprint rbac-networks"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"3a50d1a3_6bce2d85","line":37,"in_reply_to":"3a50d1a3_9f6df7ce","updated":"2015-07-19 06:19:24.000000000","message":"yes. then of course some kind of horizon UI would be nice.","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"}],"neutron/api/extensions.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e4d843106bb76a050ae3002908ee2dbc250db039","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        alias \u003d extension.get_alias()"},{"line_number":562,"context_line":"        supports_extension \u003d any(alias in ("},{"line_number":563,"context_line":"            getattr(plugin, \"supported_extension_aliases\", []) +"},{"line_number":564,"context_line":"            getattr(plugin, \"get_supported_extension_aliases\", lambda: [])())"},{"line_number":565,"context_line":"            for plugin in self.plugins.values()"},{"line_number":566,"context_line":"        )"},{"line_number":567,"context_line":"        if not supports_extension:"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_6ba1d1f7","line":564,"updated":"2015-08-11 14:18:50.000000000","message":"are you sure you need the lambda call?","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"8bb9687d48e414e165de399cbed43f71d69d8a09","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        alias \u003d extension.get_alias()"},{"line_number":562,"context_line":"        supports_extension \u003d any(alias in ("},{"line_number":563,"context_line":"            getattr(plugin, \"supported_extension_aliases\", []) +"},{"line_number":564,"context_line":"            getattr(plugin, \"get_supported_extension_aliases\", lambda: [])())"},{"line_number":565,"context_line":"            for plugin in self.plugins.values()"},{"line_number":566,"context_line":"        )"},{"line_number":567,"context_line":"        if not supports_extension:"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_a93d8ade","line":564,"in_reply_to":"1a4dcd0f_397f9218","updated":"2015-08-11 21:20:38.000000000","message":"so you need a callable in the tuple you\u0027re building?\n\nI thought you needed the return value from the callable not the callable itself.","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"6714bc0171c239d14d5155fc396c852bdf982150","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        alias \u003d extension.get_alias()"},{"line_number":562,"context_line":"        supports_extension \u003d any(alias in ("},{"line_number":563,"context_line":"            getattr(plugin, \"supported_extension_aliases\", []) +"},{"line_number":564,"context_line":"            getattr(plugin, \"get_supported_extension_aliases\", lambda: [])())"},{"line_number":565,"context_line":"            for plugin in self.plugins.values()"},{"line_number":566,"context_line":"        )"},{"line_number":567,"context_line":"        if not supports_extension:"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_397f9218","line":564,"in_reply_to":"1a4dcd0f_6ba1d1f7","updated":"2015-08-11 17:46:44.000000000","message":"I think so. get_supported_extension_aliases is a callable so we need to call whatever getattr returns.","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"04dd6a76762c9b6b2552b36e5962f40d97a57c3b","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        alias \u003d extension.get_alias()"},{"line_number":562,"context_line":"        supports_extension \u003d any(alias in ("},{"line_number":563,"context_line":"            getattr(plugin, \"supported_extension_aliases\", []) +"},{"line_number":564,"context_line":"            getattr(plugin, \"get_supported_extension_aliases\", lambda: [])())"},{"line_number":565,"context_line":"            for plugin in self.plugins.values()"},{"line_number":566,"context_line":"        )"},{"line_number":567,"context_line":"        if not supports_extension:"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_3c7e9619","line":564,"in_reply_to":"1a4dcd0f_a93d8ade","updated":"2015-08-11 21:37:09.000000000","message":"But I call the callable right after the getattr, notice the extra \"()\".","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e4d843106bb76a050ae3002908ee2dbc250db039","unresolved":false,"context_lines":[{"line_number":593,"context_line":"        plugin_extensions \u003d set(itertools.chain.from_iterable(["},{"line_number":594,"context_line":"            (getattr(plugin, \"supported_extension_aliases\", []) +"},{"line_number":595,"context_line":"             getattr(plugin, \"get_supported_extension_aliases\", lambda: [])())"},{"line_number":596,"context_line":"            for plugin in self.plugins.values()]))"},{"line_number":597,"context_line":"        missing_aliases \u003d plugin_extensions - set(self.extensions)"},{"line_number":598,"context_line":"        if missing_aliases:"},{"line_number":599,"context_line":"            raise exceptions.ExtensionsNotFound("}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_ebcf2154","line":596,"updated":"2015-08-11 14:18:50.000000000","message":"I\u0027ve just noticed that in this code probably there\u0027s no need for itertools: \u003e\u003e\u003e meh1\u003d[\u0027a\u0027,\u0027b\u0027, \u0027c\u0027]\n\u003e\u003e\u003e meh2\u003d[\u0027e\u0027,\u0027d\u0027, \u0027c\u0027]\n\u003e\u003e\u003e set(meh1 + meh2)\nset([\u0027a\u0027, \u0027c\u0027, \u0027b\u0027, \u0027e\u0027, \u0027d\u0027])\n\nthat\u0027s unrelated to your patch but still worth fixing if you end up modifying these lines.","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"8bb9687d48e414e165de399cbed43f71d69d8a09","unresolved":false,"context_lines":[{"line_number":593,"context_line":"        plugin_extensions \u003d set(itertools.chain.from_iterable(["},{"line_number":594,"context_line":"            (getattr(plugin, \"supported_extension_aliases\", []) +"},{"line_number":595,"context_line":"             getattr(plugin, \"get_supported_extension_aliases\", lambda: [])())"},{"line_number":596,"context_line":"            for plugin in self.plugins.values()]))"},{"line_number":597,"context_line":"        missing_aliases \u003d plugin_extensions - set(self.extensions)"},{"line_number":598,"context_line":"        if missing_aliases:"},{"line_number":599,"context_line":"            raise exceptions.ExtensionsNotFound("}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_692462c4","line":596,"in_reply_to":"1a4dcd0f_19a2d699","updated":"2015-08-11 21:20:38.000000000","message":"that\u0027s ok","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"6714bc0171c239d14d5155fc396c852bdf982150","unresolved":false,"context_lines":[{"line_number":593,"context_line":"        plugin_extensions \u003d set(itertools.chain.from_iterable(["},{"line_number":594,"context_line":"            (getattr(plugin, \"supported_extension_aliases\", []) +"},{"line_number":595,"context_line":"             getattr(plugin, \"get_supported_extension_aliases\", lambda: [])())"},{"line_number":596,"context_line":"            for plugin in self.plugins.values()]))"},{"line_number":597,"context_line":"        missing_aliases \u003d plugin_extensions - set(self.extensions)"},{"line_number":598,"context_line":"        if missing_aliases:"},{"line_number":599,"context_line":"            raise exceptions.ExtensionsNotFound("}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_19a2d699","line":596,"in_reply_to":"1a4dcd0f_ebcf2154","updated":"2015-08-11 17:46:44.000000000","message":"yeah, i wasn\u0027t sure why that was used over a regular set call. I can update it.","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"}],"neutron/callbacks/resources.py":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7799f9262eb20d855ff7a0fc9877414936e8f748","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    SECURITY_GROUP,"},{"line_number":28,"context_line":"    SECURITY_GROUP_RULE,"},{"line_number":29,"context_line":"    SUBNET,"},{"line_number":30,"context_line":"    RBAC_POLICY"},{"line_number":31,"context_line":")"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_01e01e95","line":30,"updated":"2015-07-28 05:18:04.000000000","message":"Done","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b67cc9e5f1e33df259c13537b1e12418d6cc8912","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    SECURITY_GROUP,"},{"line_number":28,"context_line":"    SECURITY_GROUP_RULE,"},{"line_number":29,"context_line":"    SUBNET,"},{"line_number":30,"context_line":"    RBAC_POLICY"},{"line_number":31,"context_line":")"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_00d21128","line":30,"updated":"2015-07-23 09:01:02.000000000","message":"consider adding in a , at the end of the line here","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8292c9cefd973f64d251fe1075dfd88bafff09e9","unresolved":false,"context_lines":[{"line_number":17,"context_line":"SECURITY_GROUP \u003d \u0027security_group\u0027"},{"line_number":18,"context_line":"SECURITY_GROUP_RULE \u003d \u0027security_group_rule\u0027"},{"line_number":19,"context_line":"SUBNET \u003d \u0027subnet\u0027"},{"line_number":20,"context_line":"RBAC_POLICY \u003d \u0027rbac_policy\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"VALID \u003d ("},{"line_number":23,"context_line":"    PORT,"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_fa2caead","line":20,"updated":"2015-08-11 22:50:18.000000000","message":"I have been thinking that we should probably stop hard-coding these here. I had a similar chat with Ryan and perhaps in world where this could be used by external projects too, we may no longer want to either validate these, or come up with a more clever mechanism to enforce the validation. Thoughts?","commit_id":"2d07f255cb7706ad4199b21d31cd1b149e509c7f"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b94c3a3cd7b19e2e88a0c828df64302f0dcaab3c","unresolved":false,"context_lines":[{"line_number":17,"context_line":"SECURITY_GROUP \u003d \u0027security_group\u0027"},{"line_number":18,"context_line":"SECURITY_GROUP_RULE \u003d \u0027security_group_rule\u0027"},{"line_number":19,"context_line":"SUBNET \u003d \u0027subnet\u0027"},{"line_number":20,"context_line":"RBAC_POLICY \u003d \u0027rbac_policy\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"VALID \u003d ("},{"line_number":23,"context_line":"    PORT,"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_5db25307","line":20,"in_reply_to":"1a4dcd0f_0fefd91e","updated":"2015-08-12 16:19:47.000000000","message":"looks good. we\u0027ll get it in the gate and i\u0027ll put this patch on top of it.","commit_id":"2d07f255cb7706ad4199b21d31cd1b149e509c7f"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d4979b9408a728722a2dc500b65fb861959df364","unresolved":false,"context_lines":[{"line_number":17,"context_line":"SECURITY_GROUP \u003d \u0027security_group\u0027"},{"line_number":18,"context_line":"SECURITY_GROUP_RULE \u003d \u0027security_group_rule\u0027"},{"line_number":19,"context_line":"SUBNET \u003d \u0027subnet\u0027"},{"line_number":20,"context_line":"RBAC_POLICY \u003d \u0027rbac_policy\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"VALID \u003d ("},{"line_number":23,"context_line":"    PORT,"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_b02de747","line":20,"in_reply_to":"1a4dcd0f_35cc6969","updated":"2015-08-11 23:51:46.000000000","message":"Let me put something together, as I have been meaning to. Not sure the hook gives us much...I\u0027ll mull over this a bit.","commit_id":"2d07f255cb7706ad4199b21d31cd1b149e509c7f"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8cf3b88b2487ca83dc5a1ff6304724928a4c360c","unresolved":false,"context_lines":[{"line_number":17,"context_line":"SECURITY_GROUP \u003d \u0027security_group\u0027"},{"line_number":18,"context_line":"SECURITY_GROUP_RULE \u003d \u0027security_group_rule\u0027"},{"line_number":19,"context_line":"SUBNET \u003d \u0027subnet\u0027"},{"line_number":20,"context_line":"RBAC_POLICY \u003d \u0027rbac_policy\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"VALID \u003d ("},{"line_number":23,"context_line":"    PORT,"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_8f94498b","line":20,"in_reply_to":"1a4dcd0f_503ee328","updated":"2015-08-12 01:20:12.000000000","message":"See here: https://review.openstack.org/#/c/211798/","commit_id":"2d07f255cb7706ad4199b21d31cd1b149e509c7f"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"f15c69d303c5874b5555f93bad32ebf50e39246e","unresolved":false,"context_lines":[{"line_number":17,"context_line":"SECURITY_GROUP \u003d \u0027security_group\u0027"},{"line_number":18,"context_line":"SECURITY_GROUP_RULE \u003d \u0027security_group_rule\u0027"},{"line_number":19,"context_line":"SUBNET \u003d \u0027subnet\u0027"},{"line_number":20,"context_line":"RBAC_POLICY \u003d \u0027rbac_policy\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"VALID \u003d ("},{"line_number":23,"context_line":"    PORT,"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_0fefd91e","line":20,"in_reply_to":"1a4dcd0f_8f94498b","updated":"2015-08-12 01:20:51.000000000","message":"If you agree with the patch, then this can move closer to the RBAC module, to improve cohesiveness.","commit_id":"2d07f255cb7706ad4199b21d31cd1b149e509c7f"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"2c49e2a30535b6fb74093415880b34e28c2ecc05","unresolved":false,"context_lines":[{"line_number":17,"context_line":"SECURITY_GROUP \u003d \u0027security_group\u0027"},{"line_number":18,"context_line":"SECURITY_GROUP_RULE \u003d \u0027security_group_rule\u0027"},{"line_number":19,"context_line":"SUBNET \u003d \u0027subnet\u0027"},{"line_number":20,"context_line":"RBAC_POLICY \u003d \u0027rbac_policy\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"VALID \u003d ("},{"line_number":23,"context_line":"    PORT,"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_503ee328","line":20,"in_reply_to":"1a4dcd0f_b02de747","updated":"2015-08-12 00:08:29.000000000","message":"well the hook still makes it explicit what is valid.","commit_id":"2d07f255cb7706ad4199b21d31cd1b149e509c7f"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"a298875e95e5bdd7d77fd4d19c0f6df6f314e95e","unresolved":false,"context_lines":[{"line_number":17,"context_line":"SECURITY_GROUP \u003d \u0027security_group\u0027"},{"line_number":18,"context_line":"SECURITY_GROUP_RULE \u003d \u0027security_group_rule\u0027"},{"line_number":19,"context_line":"SUBNET \u003d \u0027subnet\u0027"},{"line_number":20,"context_line":"RBAC_POLICY \u003d \u0027rbac_policy\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"VALID \u003d ("},{"line_number":23,"context_line":"    PORT,"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_35cc6969","line":20,"in_reply_to":"1a4dcd0f_fa2caead","updated":"2015-08-11 23:15:24.000000000","message":"Yeah, I think we should just have a hook to register a type. Then if someone tries to subscribe to something that hasn\u0027t been registered, we can still bail.","commit_id":"2d07f255cb7706ad4199b21d31cd1b149e509c7f"},{"author":{"_account_id":9970,"name":"John Kasperski","email":"jckasper@linux.vnet.ibm.com","username":"jckasper"},"change_message_id":"e834905fc41e1640f143cbd616b222dc9559fdce","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    SECURITY_GROUP,"},{"line_number":28,"context_line":"    SECURITY_GROUP_RULE,"},{"line_number":29,"context_line":"    SUBNET,"},{"line_number":30,"context_line":"    RBAC_POLICY,"},{"line_number":31,"context_line":")"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_72c5228c","line":30,"updated":"2015-08-12 02:18:11.000000000","message":"NETWORK resource is not in the list ...  ?","commit_id":"2d07f255cb7706ad4199b21d31cd1b149e509c7f"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"62317946857edd02d184857782fccf888194ee1b","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    SECURITY_GROUP,"},{"line_number":28,"context_line":"    SECURITY_GROUP_RULE,"},{"line_number":29,"context_line":"    SUBNET,"},{"line_number":30,"context_line":"    RBAC_POLICY,"},{"line_number":31,"context_line":")"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_15aeda80","line":30,"in_reply_to":"1a4dcd0f_72c5228c","updated":"2015-08-12 20:20:33.000000000","message":"This is no longer required.","commit_id":"2d07f255cb7706ad4199b21d31cd1b149e509c7f"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"3c7711f283dd24bcd4c0eebd66b56b2108e863ff","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    SECURITY_GROUP,"},{"line_number":28,"context_line":"    SECURITY_GROUP_RULE,"},{"line_number":29,"context_line":"    SUBNET,"},{"line_number":30,"context_line":"    RBAC_POLICY,"},{"line_number":31,"context_line":")"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_b28dc632","line":30,"in_reply_to":"1a4dcd0f_72c5228c","updated":"2015-08-12 16:19:13.000000000","message":"yeah, that\u0027s ok. see comments on db_base_plugin_v2","commit_id":"2d07f255cb7706ad4199b21d31cd1b149e509c7f"}],"neutron/db/common_db_mixin.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"cdac432a1e5b416c1fc55624f9d30d3743632a0a","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        # define basic filter condition for model query"},{"line_number":99,"context_line":"        query_filter \u003d None"},{"line_number":100,"context_line":"        if self.model_query_scope(context, model):"},{"line_number":101,"context_line":"            if hasattr(model, \u0027rbac_entries\u0027):"},{"line_number":102,"context_line":"                rbac_model \u003d model.rbac_entries.property.mapper.class_"},{"line_number":103,"context_line":"                query \u003d query.outerjoin(rbac_model)"},{"line_number":104,"context_line":"                query_filter \u003d ("}],"source_content_type":"text/x-python","patch_set":4,"id":"ba3cc151_21f8c1c2","line":101,"updated":"2015-07-08 08:19:56.000000000","message":"rbac_entries \u003d getattr(model, \u0027rbac_entries\u0027, None)\nif rbac_entries:\n   # continue with your code.\n\nsorry about this pedant comment","commit_id":"8a4e5bf9fa6529844f32ae65204960460028d766"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7799f9262eb20d855ff7a0fc9877414936e8f748","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        if not isinstance(model, UnionModel):"},{"line_number":100,"context_line":"            return self._single_model_query(context, model)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        # A union query is a query that combins multiple sets of data"},{"line_number":103,"context_line":"        # together and represents them as one. So if a UnionModel was"},{"line_number":104,"context_line":"        # passed in, we generate the query for each model with the"},{"line_number":105,"context_line":"        # appriate filters and then combine them together with the"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_c1cd5632","line":102,"updated":"2015-07-28 05:18:04.000000000","message":"Done","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b67cc9e5f1e33df259c13537b1e12418d6cc8912","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        if not isinstance(model, UnionModel):"},{"line_number":100,"context_line":"            return self._single_model_query(context, model)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        # A union query is a query that combins multiple sets of data"},{"line_number":103,"context_line":"        # together and represents them as one. So if a UnionModel was"},{"line_number":104,"context_line":"        # passed in, we generate the query for each model with the"},{"line_number":105,"context_line":"        # appriate filters and then combine them together with the"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_40aa5986","line":102,"updated":"2015-07-23 09:01:02.000000000","message":"combins \u003d\u003e combines","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7799f9262eb20d855ff7a0fc9877414936e8f748","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        # A union query is a query that combins multiple sets of data"},{"line_number":103,"context_line":"        # together and represents them as one. So if a UnionModel was"},{"line_number":104,"context_line":"        # passed in, we generate the query for each model with the"},{"line_number":105,"context_line":"        # appriate filters and then combine them together with the"},{"line_number":106,"context_line":"        # .union operator. This allows any subsequent users of the query"},{"line_number":107,"context_line":"        # to handle it like a normal query (e.g. add pagination/sorting/etc)"},{"line_number":108,"context_line":"        first_query \u003d None"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_61cec22e","line":105,"updated":"2015-07-28 05:18:04.000000000","message":"Done","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b67cc9e5f1e33df259c13537b1e12418d6cc8912","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        # A union query is a query that combins multiple sets of data"},{"line_number":103,"context_line":"        # together and represents them as one. So if a UnionModel was"},{"line_number":104,"context_line":"        # passed in, we generate the query for each model with the"},{"line_number":105,"context_line":"        # appriate filters and then combine them together with the"},{"line_number":106,"context_line":"        # .union operator. This allows any subsequent users of the query"},{"line_number":107,"context_line":"        # to handle it like a normal query (e.g. add pagination/sorting/etc)"},{"line_number":108,"context_line":"        first_query \u003d None"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_8092a14a","line":105,"updated":"2015-07-23 09:01:02.000000000","message":"appriate \u003d\u003e appropriate","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"df25a6d9055dc73f0c8c98d831b3852b1a604cc7","unresolved":false,"context_lines":[{"line_number":295,"context_line":"        # If column_type_name is specified, the resulting records will have a"},{"line_number":296,"context_line":"        # column with that name which identifies the source of each record"},{"line_number":297,"context_line":"        self.model_map \u003d model_map"},{"line_number":298,"context_line":"        self.colum_type_name \u003d column_type_name"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_df1b09c9","line":298,"updated":"2015-07-27 16:12:58.000000000","message":"column? or Gollum maybe?","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7799f9262eb20d855ff7a0fc9877414936e8f748","unresolved":false,"context_lines":[{"line_number":295,"context_line":"        # If column_type_name is specified, the resulting records will have a"},{"line_number":296,"context_line":"        # column with that name which identifies the source of each record"},{"line_number":297,"context_line":"        self.model_map \u003d model_map"},{"line_number":298,"context_line":"        self.colum_type_name \u003d column_type_name"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_81d3ced4","line":298,"updated":"2015-07-28 05:18:04.000000000","message":"whoops. fixed :)","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e4d843106bb76a050ae3002908ee2dbc250db039","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            if first_query is None:"},{"line_number":118,"context_line":"                first_query \u003d query"},{"line_number":119,"context_line":"            else:"},{"line_number":120,"context_line":"                remaining_queries.append(query)"},{"line_number":121,"context_line":"        return first_query.union(*remaining_queries)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _single_model_query(self, context, model):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_ae29279d","line":120,"updated":"2015-08-11 14:18:50.000000000","message":"I think from an operational perspective you should be able to do, for no extra cost, first_query \u003d first_query.union(query) and then return first_query at the end of the iteration","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"8bb9687d48e414e165de399cbed43f71d69d8a09","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            if first_query is None:"},{"line_number":118,"context_line":"                first_query \u003d query"},{"line_number":119,"context_line":"            else:"},{"line_number":120,"context_line":"                remaining_queries.append(query)"},{"line_number":121,"context_line":"        return first_query.union(*remaining_queries)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _single_model_query(self, context, model):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_dc053211","line":120,"in_reply_to":"1a4dcd0f_3d71bd76","updated":"2015-08-11 21:20:38.000000000","message":"I honestly don\u0027t know if that prevent the db from optimizing anything even because I don\u0027t know what the db would optimize...\n\nBut I guess this is such a minor point that we can safely ignore it","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"6714bc0171c239d14d5155fc396c852bdf982150","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            if first_query is None:"},{"line_number":118,"context_line":"                first_query \u003d query"},{"line_number":119,"context_line":"            else:"},{"line_number":120,"context_line":"                remaining_queries.append(query)"},{"line_number":121,"context_line":"        return first_query.union(*remaining_queries)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _single_model_query(self, context, model):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_3d71bd76","line":120,"in_reply_to":"1a4dcd0f_ae29279d","updated":"2015-08-11 17:46:44.000000000","message":"calling .union multiple times produces nesting[1]. I was concerned that this would prevent a DB from doing an optimization of some sort. Do you think it\u0027s safe?\n\n1. http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm.query.Query.union","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e4d843106bb76a050ae3002908ee2dbc250db039","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                first_query \u003d query"},{"line_number":119,"context_line":"            else:"},{"line_number":120,"context_line":"                remaining_queries.append(query)"},{"line_number":121,"context_line":"        return first_query.union(*remaining_queries)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _single_model_query(self, context, model):"},{"line_number":124,"context_line":"        query \u003d context.session.query(model)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_4ebd0367","line":121,"updated":"2015-08-11 14:18:50.000000000","message":"I wonder why you felt the need to alter _model_query when you could have implemented a _union_query method to this aim","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"6714bc0171c239d14d5155fc396c852bdf982150","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                first_query \u003d query"},{"line_number":119,"context_line":"            else:"},{"line_number":120,"context_line":"                remaining_queries.append(query)"},{"line_number":121,"context_line":"        return first_query.union(*remaining_queries)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _single_model_query(self, context, model):"},{"line_number":124,"context_line":"        query \u003d context.session.query(model)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_9dbb31e5","line":121,"in_reply_to":"1a4dcd0f_4ebd0367","updated":"2015-08-11 17:46:44.000000000","message":"No particular reason. I will separate the function for _union_query though  so we just have one function that just decides which one to use.","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"8bb9687d48e414e165de399cbed43f71d69d8a09","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                first_query \u003d query"},{"line_number":119,"context_line":"            else:"},{"line_number":120,"context_line":"                remaining_queries.append(query)"},{"line_number":121,"context_line":"        return first_query.union(*remaining_queries)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _single_model_query(self, context, model):"},{"line_number":124,"context_line":"        query \u003d context.session.query(model)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_fc5fce0c","line":121,"in_reply_to":"1a4dcd0f_9dbb31e5","updated":"2015-08-11 21:20:38.000000000","message":"I have no strong preference.\nPersonally I would have not even created the UnionModel class.\nI would have created a models_query method with this signature\n\ndef models_query(self, context, *models):\n     # Return a union of query for each model in models\n\nAnyway, your suggestion works for me as well","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"04dd6a76762c9b6b2552b36e5962f40d97a57c3b","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                first_query \u003d query"},{"line_number":119,"context_line":"            else:"},{"line_number":120,"context_line":"                remaining_queries.append(query)"},{"line_number":121,"context_line":"        return first_query.union(*remaining_queries)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _single_model_query(self, context, model):"},{"line_number":124,"context_line":"        query \u003d context.session.query(model)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_bc61463b","line":121,"in_reply_to":"1a4dcd0f_fc5fce0c","updated":"2015-08-11 21:37:09.000000000","message":"I tried that at first, but I needed to be able to pass the union into _get_collection, at which point it has already decided to use model_query so I needed the logic here.","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"}],"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7799f9262eb20d855ff7a0fc9877414936e8f748","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                         self.nova_notifier.record_port_status_changed)"},{"line_number":102,"context_line":"        for e in (events.BEFORE_CREATE, events.BEFORE_UPDATE,"},{"line_number":103,"context_line":"                  events.BEFORE_DELETE):"},{"line_number":104,"context_line":"            registry.subscribe(self.validate_network_policy_change,"},{"line_number":105,"context_line":"                               resources.RBAC_POLICY, e)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def validate_network_policy_change(self, resource, event, trigger, context,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_0149feb6","line":104,"updated":"2015-07-28 05:18:04.000000000","message":"ok","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"df25a6d9055dc73f0c8c98d831b3852b1a604cc7","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                         self.nova_notifier.record_port_status_changed)"},{"line_number":102,"context_line":"        for e in (events.BEFORE_CREATE, events.BEFORE_UPDATE,"},{"line_number":103,"context_line":"                  events.BEFORE_DELETE):"},{"line_number":104,"context_line":"            registry.subscribe(self.validate_network_policy_change,"},{"line_number":105,"context_line":"                               resources.RBAC_POLICY, e)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def validate_network_policy_change(self, resource, event, trigger, context,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_913a5597","line":104,"updated":"2015-07-27 16:12:58.000000000","message":"please rename it into validate_network_rbac_policy_change since we are going to have qos_policy attached to networks/ports in L.","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7799f9262eb20d855ff7a0fc9877414936e8f748","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            # we still have to verify that the caller owns the network because"},{"line_number":125,"context_line":"            # _get_network will succeed on a shared network"},{"line_number":126,"context_line":"            if not context.is_admin and net[\u0027tenant_id\u0027] !\u003d context.tenant_id:"},{"line_number":127,"context_line":"                msg \u003d _LE(\"Only admins can manipulate policies on networks \""},{"line_number":128,"context_line":"                          \"they do not own.\")"},{"line_number":129,"context_line":"                raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_a1c84a23","line":127,"updated":"2015-07-28 05:18:04.000000000","message":"Done","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b67cc9e5f1e33df259c13537b1e12418d6cc8912","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            # we still have to verify that the caller owns the network because"},{"line_number":125,"context_line":"            # _get_network will succeed on a shared network"},{"line_number":126,"context_line":"            if not context.is_admin and net[\u0027tenant_id\u0027] !\u003d context.tenant_id:"},{"line_number":127,"context_line":"                msg \u003d _LE(\"Only admins can manipulate policies on networks \""},{"line_number":128,"context_line":"                          \"they do not own.\")"},{"line_number":129,"context_line":"                raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_80e061ce","line":127,"updated":"2015-07-23 09:01:02.000000000","message":"exceptions should not have log hints. This should be _()","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":7018,"name":"Abhishek Raut","email":"rauta@vmware.com","username":"abhiraut"},"change_message_id":"7c81e6e22f9de76079ab73c365b830a24b2d9132","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                               for entry in other_rbac_entries]"},{"line_number":162,"context_line":"            allowed_tenants.append(net_tenant_id)"},{"line_number":163,"context_line":"            ports \u003d ports.filter("},{"line_number":164,"context_line":"                ~models_v2.Port.tenant_id.in_(allowed_tenants))"},{"line_number":165,"context_line":"        else:"},{"line_number":166,"context_line":"            # if there is a wildcard rule, we can return early because it"},{"line_number":167,"context_line":"            # allows any ports"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_7653706d","line":164,"updated":"2015-07-23 22:08:15.000000000","message":"curious: What does \u0027~\u0027 before models do?","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"0e2da39fecafb53c25602a1158d20874b9a7a8a2","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                               for entry in other_rbac_entries]"},{"line_number":162,"context_line":"            allowed_tenants.append(net_tenant_id)"},{"line_number":163,"context_line":"            ports \u003d ports.filter("},{"line_number":164,"context_line":"                ~models_v2.Port.tenant_id.in_(allowed_tenants))"},{"line_number":165,"context_line":"        else:"},{"line_number":166,"context_line":"            # if there is a wildcard rule, we can return early because it"},{"line_number":167,"context_line":"            # allows any ports"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_91aba6d6","line":164,"in_reply_to":"3a50d1a3_7653706d","updated":"2015-07-23 22:20:04.000000000","message":"In this case it\u0027s a logical NOT.","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":9970,"name":"John Kasperski","email":"jckasper@linux.vnet.ibm.com","username":"jckasper"},"change_message_id":"e834905fc41e1640f143cbd616b222dc9559fdce","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        On update and delete, make sure the tenant losing access does not have"},{"line_number":121,"context_line":"        resources that depend on that access."},{"line_number":122,"context_line":"        \"\"\""},{"line_number":123,"context_line":"        if object_type !\u003d \u0027network\u0027:"},{"line_number":124,"context_line":"            # we only care about network policies"},{"line_number":125,"context_line":"            return"},{"line_number":126,"context_line":"        # The object a policy targets cannot be changed so we can look"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_72976290","line":123,"updated":"2015-08-12 02:18:11.000000000","message":"Add a TODO to add support for other object types (subnet, ?) in the future?","commit_id":"2d07f255cb7706ad4199b21d31cd1b149e509c7f"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"3c7711f283dd24bcd4c0eebd66b56b2108e863ff","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        On update and delete, make sure the tenant losing access does not have"},{"line_number":121,"context_line":"        resources that depend on that access."},{"line_number":122,"context_line":"        \"\"\""},{"line_number":123,"context_line":"        if object_type !\u003d \u0027network\u0027:"},{"line_number":124,"context_line":"            # we only care about network policies"},{"line_number":125,"context_line":"            return"},{"line_number":126,"context_line":"        # The object a policy targets cannot be changed so we can look"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_52db224f","line":123,"in_reply_to":"1a4dcd0f_72976290","updated":"2015-08-12 16:19:13.000000000","message":"this is a function to validate RBAC policy changes that affect networks. It should only be called if the policy affects a network.","commit_id":"2d07f255cb7706ad4199b21d31cd1b149e509c7f"},{"author":{"_account_id":9970,"name":"John Kasperski","email":"jckasper@linux.vnet.ibm.com","username":"jckasper"},"change_message_id":"e834905fc41e1640f143cbd616b222dc9559fdce","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        resources that depend on that access."},{"line_number":122,"context_line":"        \"\"\""},{"line_number":123,"context_line":"        if object_type !\u003d \u0027network\u0027:"},{"line_number":124,"context_line":"            # we only care about network policies"},{"line_number":125,"context_line":"            return"},{"line_number":126,"context_line":"        # The object a policy targets cannot be changed so we can look"},{"line_number":127,"context_line":"        # at the original network for the update event as well."}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_72de826e","line":124,"updated":"2015-08-12 02:18:11.000000000","message":"network is not listed as a valid resource type for callbacks, so would this ever be called ?","commit_id":"2d07f255cb7706ad4199b21d31cd1b149e509c7f"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"3c7711f283dd24bcd4c0eebd66b56b2108e863ff","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        resources that depend on that access."},{"line_number":122,"context_line":"        \"\"\""},{"line_number":123,"context_line":"        if object_type !\u003d \u0027network\u0027:"},{"line_number":124,"context_line":"            # we only care about network policies"},{"line_number":125,"context_line":"            return"},{"line_number":126,"context_line":"        # The object a policy targets cannot be changed so we can look"},{"line_number":127,"context_line":"        # at the original network for the update event as well."}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_32cc5688","line":124,"in_reply_to":"1a4dcd0f_72de826e","updated":"2015-08-12 16:19:13.000000000","message":"this isn\u0027t called when a network changes, it\u0027s called when a policy changes.","commit_id":"2d07f255cb7706ad4199b21d31cd1b149e509c7f"}],"neutron/db/models_v2.py":[{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"b415a5407d25aaaa3133d3a0728486433368fdfb","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                                  constants.DHCPV6_STATELESS,"},{"line_number":217,"context_line":"                                  name\u003d\u0027ipv6_address_modes\u0027), nullable\u003dTrue)"},{"line_number":218,"context_line":"    # TODO(kevinbenton): figure out why this exists"},{"line_number":219,"context_line":"    shared \u003d True"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"class SubnetPoolPrefix(model_base.BASEV2):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba3cc151_7f3e568c","line":219,"updated":"2015-07-08 12:36:38.000000000","message":"@Kevin: Can I assume this TODO is one that will be addressed before this gets merged?  This looks like one heck of a hack","commit_id":"8a4e5bf9fa6529844f32ae65204960460028d766"}],"neutron/db/rbac_db_mixin.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e4d843106bb76a050ae3002908ee2dbc250db039","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def get_supported_extension_aliases(self):"},{"line_number":34,"context_line":"        return (super(RbacPluginMixin,"},{"line_number":35,"context_line":"                      self).get_supported_extension_aliases()"},{"line_number":36,"context_line":"                + [\u0027rbac-policies\u0027])"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def create_rbac_policy(self, context, rbac_policy):"},{"line_number":39,"context_line":"        e \u003d rbac_policy[\u0027rbac_policy\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_77f1b569","line":36,"updated":"2015-08-11 14:18:50.000000000","message":"You are trying to be clever here, I think.\n\nI understand that the claim might be that by adding the mixing you definitely support the extensions it implements. However, you are probably making some assumptions on the way super works that are entirely correct.\n\nThis approach would miserably fail indeed if the next class in MRO order in the plugin does not implement get_suppered_extension_aliases.\n\nAlso, the fact that the extension manager has to check for both get_supported_extension_aliases and supported_extension_aliases is a bit ugly.\n\nTo give you some more context about super and mixins, checkout this example:http://paste.openstack.org/show/412557/ - if you add super also to MehMix3 then you will have an error. In general with neutron mixins, can you know beforehand which mixin will be the last in MRO?","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"6714bc0171c239d14d5155fc396c852bdf982150","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def get_supported_extension_aliases(self):"},{"line_number":34,"context_line":"        return (super(RbacPluginMixin,"},{"line_number":35,"context_line":"                      self).get_supported_extension_aliases()"},{"line_number":36,"context_line":"                + [\u0027rbac-policies\u0027])"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def create_rbac_policy(self, context, rbac_policy):"},{"line_number":39,"context_line":"        e \u003d rbac_policy[\u0027rbac_policy\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_fda7d5a4","line":36,"in_reply_to":"1a4dcd0f_77f1b569","updated":"2015-08-11 17:46:44.000000000","message":"Yeah, I was concerned about this as well. I think a simpler approach will probably be to just walk all of the classes a plugin implements and look for supported_extension_aliases.","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e4d843106bb76a050ae3002908ee2dbc250db039","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                               tenant_id\u003dtenant_id)"},{"line_number":53,"context_line":"            context.session.add(db_entry)"},{"line_number":54,"context_line":"        rbac_policy_dict \u003d self._make_rbac_policy_dict(db_entry)"},{"line_number":55,"context_line":"        return rbac_policy_dict"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def _make_rbac_policy_dict(self, db_entry, fields\u003dNone):"},{"line_number":58,"context_line":"        res \u003d {f: db_entry[f] for f in (\u0027id\u0027, \u0027tenant_id\u0027, \u0027target_tenant\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_f1007036","line":55,"updated":"2015-08-11 14:18:50.000000000","message":"meh maybe merge 54 and 55","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"6714bc0171c239d14d5155fc396c852bdf982150","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                               tenant_id\u003dtenant_id)"},{"line_number":53,"context_line":"            context.session.add(db_entry)"},{"line_number":54,"context_line":"        rbac_policy_dict \u003d self._make_rbac_policy_dict(db_entry)"},{"line_number":55,"context_line":"        return rbac_policy_dict"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def _make_rbac_policy_dict(self, db_entry, fields\u003dNone):"},{"line_number":58,"context_line":"        res \u003d {f: db_entry[f] for f in (\u0027id\u0027, \u0027tenant_id\u0027, \u0027target_tenant\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_5dada982","line":55,"in_reply_to":"1a4dcd0f_f1007036","updated":"2015-08-11 17:46:44.000000000","message":"Done","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"}],"neutron/extensions/rbac.py":[{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"e2763395b7c334c682574a34fe2a12155e3583a5","unresolved":false,"context_lines":[{"line_number":59,"context_line":"RESOURCE_NAME \u003d \u0027rbac_policy\u0027"},{"line_number":60,"context_line":"RESOURCE_COLLECTION \u003d \u0027rbac_policies\u0027"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":63,"context_line":"    RESOURCE_COLLECTION: {"},{"line_number":64,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":65,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a41bdd9_03f19394","line":62,"updated":"2015-07-16 13:58:49.000000000","message":"This attribute map has migrated slightly from what was in the spec. Would you mind proposing a spec update to reflect the changes here?\n\nFor reference, see here for the spec:\n\nhttp://specs.openstack.org/openstack/neutron-specs/specs/liberty/rbac-networks.html#rest-api-impact","commit_id":"b985674c108f13f3b75fdb9ce22bb610d8440247"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"55e2f749fc5220bcdc3a417df8fa4f0072aa53f2","unresolved":false,"context_lines":[{"line_number":59,"context_line":"RESOURCE_NAME \u003d \u0027rbac_policy\u0027"},{"line_number":60,"context_line":"RESOURCE_COLLECTION \u003d \u0027rbac_policies\u0027"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":63,"context_line":"    RESOURCE_COLLECTION: {"},{"line_number":64,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":65,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a41bdd9_33fdd76e","line":62,"in_reply_to":"9a41bdd9_03f19394","updated":"2015-07-17 09:29:49.000000000","message":"done. up for review here: https://review.openstack.org/202942","commit_id":"b985674c108f13f3b75fdb9ce22bb610d8440247"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7799f9262eb20d855ff7a0fc9877414936e8f748","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                \"tenant access to resources.\")"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    @classmethod"},{"line_number":114,"context_line":"    def get_namespace(cls):"},{"line_number":115,"context_line":"        return \"http://docs.openstack.org/ext/rbac_policies/api/v2.0\""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_21dd1ae0","line":114,"updated":"2015-07-28 05:18:04.000000000","message":"Done","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"98e04bc23fd9bf804de68b893998774fe91ff5ee","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                \"tenant access to resources.\")"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    @classmethod"},{"line_number":114,"context_line":"    def get_namespace(cls):"},{"line_number":115,"context_line":"        return \"http://docs.openstack.org/ext/rbac_policies/api/v2.0\""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_7aeb35b1","line":114,"updated":"2015-07-24 13:29:56.000000000","message":"Its usage was removed as of I3c406910991c33cf959c5345d76153eabe3ace2d request you to remove it.","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"df25a6d9055dc73f0c8c98d831b3852b1a604cc7","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        return \"http://docs.openstack.org/ext/rbac_policies/api/v2.0\""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @classmethod"},{"line_number":118,"context_line":"    def get_updated(cls):"},{"line_number":119,"context_line":"        return \"2015-06-17T12:15:12-30:00\""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_119f2551","line":118,"updated":"2015-07-27 16:12:58.000000000","message":"Same for that one.","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7799f9262eb20d855ff7a0fc9877414936e8f748","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        return \"http://docs.openstack.org/ext/rbac_policies/api/v2.0\""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @classmethod"},{"line_number":118,"context_line":"    def get_updated(cls):"},{"line_number":119,"context_line":"        return \"2015-06-17T12:15:12-30:00\""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_41daa6e9","line":118,"updated":"2015-07-28 05:18:04.000000000","message":"This still seems to be present in all of the extensions.","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"e92ecc3f265f8939f2d40a7a0f1880210ebe0521","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        return {}"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"class RbacPluginBase(service_base.ServicePluginBase):"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    supported_extension_aliases \u003d [\u0027rbac-policies\u0027]"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_399f1861","line":136,"updated":"2015-07-19 15:15:31.000000000","message":"(Genuine question) What\u0027s the point of this class? Why not delete it and have the actual RBAC service plugin inherit from service_base.ServicePluginBase and declare supported_extension_aliases \u003d [\u0027rbac-policies\u0027]? Do you want/expect core plugins to implement this API? Why?","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7799f9262eb20d855ff7a0fc9877414936e8f748","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        return {}"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"class RbacPluginBase(service_base.ServicePluginBase):"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    supported_extension_aliases \u003d [\u0027rbac-policies\u0027]"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_e1e2d29f","line":136,"updated":"2015-07-28 05:18:04.000000000","message":"i don\u0027t think drivers make sense in this case. a plugin will either be compatible with our db approach or it will need to do something completely different. i don\u0027t see a case for having a driver manager dispatching things here","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"5058b2fd7040b41aba3ac11eefe250546526eb70","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        return {}"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"class RbacPluginBase(service_base.ServicePluginBase):"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    supported_extension_aliases \u003d [\u0027rbac-policies\u0027]"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_6756d2cf","line":136,"in_reply_to":"3a50d1a3_399f1861","updated":"2015-07-22 07:45:55.000000000","message":"I suspect non-DB plugins would want to implement this their own way.","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"df25a6d9055dc73f0c8c98d831b3852b1a604cc7","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        return {}"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"class RbacPluginBase(service_base.ServicePluginBase):"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    supported_extension_aliases \u003d [\u0027rbac-policies\u0027]"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_9115759c","line":136,"in_reply_to":"3a50d1a3_6756d2cf","updated":"2015-07-27 16:12:58.000000000","message":"Also consider how we handle alternative drivers in qos:\n\nhttps://review.openstack.org/197631\nhttps://review.openstack.org/197840","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e4d843106bb76a050ae3002908ee2dbc250db039","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    except (TypeError, ValueError, AttributeError):"},{"line_number":45,"context_line":"        pass"},{"line_number":46,"context_line":"    msg \u003d _(\"\u0027%s\u0027 is not a valid RBAC target\") % target"},{"line_number":47,"context_line":"    raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def convert_valid_object_type(otype):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_fc3ccac0","line":47,"updated":"2015-08-11 14:18:50.000000000","message":"what is this validating?\nThat the target is a uuid or a \u0027*\u0027?\n\nI can understand the wildcard, but I am not entirely sure about the need for uuid validation. It seems just unnecessary. The user can still specify uuids for non-existing tenants.","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"6714bc0171c239d14d5155fc396c852bdf982150","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    except (TypeError, ValueError, AttributeError):"},{"line_number":45,"context_line":"        pass"},{"line_number":46,"context_line":"    msg \u003d _(\"\u0027%s\u0027 is not a valid RBAC target\") % target"},{"line_number":47,"context_line":"    raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def convert_valid_object_type(otype):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_fd4355ad","line":47,"in_reply_to":"1a4dcd0f_fc3ccac0","updated":"2015-08-11 17:46:44.000000000","message":"I annoyingly spent a bunch of time figuring out why my API tests weren\u0027t working at first and it turned out to be missing hyphens in a tenant id so I put this here.\n\nIt makes sense though that a tenant ID might not be a UUID so I can remove this.","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"8bb9687d48e414e165de399cbed43f71d69d8a09","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    except (TypeError, ValueError, AttributeError):"},{"line_number":45,"context_line":"        pass"},{"line_number":46,"context_line":"    msg \u003d _(\"\u0027%s\u0027 is not a valid RBAC target\") % target"},{"line_number":47,"context_line":"    raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def convert_valid_object_type(otype):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_7cf09efd","line":47,"in_reply_to":"1a4dcd0f_fd4355ad","updated":"2015-08-11 21:20:38.000000000","message":"Technically we still support identity service which are not keystone, do we?\nwe don\u0027t know what a  tenant id looks like in that case.","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e4d843106bb76a050ae3002908ee2dbc250db039","unresolved":false,"context_lines":[{"line_number":50,"context_line":"def convert_valid_object_type(otype):"},{"line_number":51,"context_line":"    normalized \u003d otype.strip().lower()"},{"line_number":52,"context_line":"    if normalized in rbac_db_models.get_type_model_map():"},{"line_number":53,"context_line":"        return normalized"},{"line_number":54,"context_line":"    msg \u003d _(\"\u0027%s\u0027 is not a valid RBAC object type\") % otype"},{"line_number":55,"context_line":"    raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_3cd472bb","line":53,"updated":"2015-08-11 14:18:50.000000000","message":"I think you should allow users to specify \u0027netwrok\u0027 instead of \u0027network\u0027 because it\u0027s a common typo and forgiving the user for this will really improve usability.\n\nnote: I am joking","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"8bb9687d48e414e165de399cbed43f71d69d8a09","unresolved":false,"context_lines":[{"line_number":50,"context_line":"def convert_valid_object_type(otype):"},{"line_number":51,"context_line":"    normalized \u003d otype.strip().lower()"},{"line_number":52,"context_line":"    if normalized in rbac_db_models.get_type_model_map():"},{"line_number":53,"context_line":"        return normalized"},{"line_number":54,"context_line":"    msg \u003d _(\"\u0027%s\u0027 is not a valid RBAC object type\") % otype"},{"line_number":55,"context_line":"    raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_5c95a284","line":53,"in_reply_to":"1a4dcd0f_1d56415c","updated":"2015-08-11 21:20:38.000000000","message":"nah case conversion and ws stripping are ok... I however suggest that whoever proposes forgiveness for typos will be given a medieval treatment.","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"6714bc0171c239d14d5155fc396c852bdf982150","unresolved":false,"context_lines":[{"line_number":50,"context_line":"def convert_valid_object_type(otype):"},{"line_number":51,"context_line":"    normalized \u003d otype.strip().lower()"},{"line_number":52,"context_line":"    if normalized in rbac_db_models.get_type_model_map():"},{"line_number":53,"context_line":"        return normalized"},{"line_number":54,"context_line":"    msg \u003d _(\"\u0027%s\u0027 is not a valid RBAC object type\") % otype"},{"line_number":55,"context_line":"    raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_1d56415c","line":53,"in_reply_to":"1a4dcd0f_3cd472bb","updated":"2015-08-11 17:46:44.000000000","message":"I think you are telling me to get rid of the case conversion and whitespace stripping...","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"}],"neutron/neutron_plugin_base_v2.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e4d843106bb76a050ae3002908ee2dbc250db039","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        return (self.__class__.start_rpc_listeners !\u003d"},{"line_number":391,"context_line":"                NeutronPluginBaseV2.start_rpc_listeners)"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    def get_supported_extension_aliases(self):"},{"line_number":394,"context_line":"        \"\"\"Return a list of supported extension aliases."},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        A method based alternative to supported_extension_aliases so inherited"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_8b90ddee","line":393,"updated":"2015-08-11 14:18:50.000000000","message":"I downvote this addition ;)","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"6714bc0171c239d14d5155fc396c852bdf982150","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        return (self.__class__.start_rpc_listeners !\u003d"},{"line_number":391,"context_line":"                NeutronPluginBaseV2.start_rpc_listeners)"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    def get_supported_extension_aliases(self):"},{"line_number":394,"context_line":"        \"\"\"Return a list of supported extension aliases."},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        A method based alternative to supported_extension_aliases so inherited"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_9dc81124","line":393,"in_reply_to":"1a4dcd0f_8b90ddee","updated":"2015-08-11 17:46:44.000000000","message":"Done","commit_id":"9522db63000f94f66133cd935c92029cba7e6ba5"}],"neutron/services/rbac/rbac_db_plugin.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"e92ecc3f265f8939f2d40a7a0f1880210ebe0521","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutron.extensions import rbac as ext_rbac"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class RbacPlugin(common_db_mixin.CommonDbMixin, ext_rbac.RbacPluginBase):"},{"line_number":29,"context_line":"    \"\"\"Plugin that implements the RBAC DB operations.\"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_d9863413","line":28,"updated":"2015-07-19 15:15:31.000000000","message":"Are you married to the idea of a service plugin? *aaS is something that an installation can choose not to care about. RBAC is something I\u0027d expect every Neutron server to have built in. There\u0027s also lots of RBAC code in the base DB plugin and the classes it inherits from so we don\u0027t stand to gain too much decoupling anyway.","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"c4fa9b47678cf926a189d5a8e3bf9d1ff612dc25","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutron.extensions import rbac as ext_rbac"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class RbacPlugin(common_db_mixin.CommonDbMixin, ext_rbac.RbacPluginBase):"},{"line_number":29,"context_line":"    \"\"\"Plugin that implements the RBAC DB operations.\"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_d786f4b8","line":28,"in_reply_to":"3a50d1a3_19949c35","updated":"2015-07-20 06:26:33.000000000","message":"a plugin doesn\u0027t necessarily use the db models (e.g. contrail) in which case the rbac stuff wouldn\u0027t work. We could somehow add it to just all plugins that use db base plugin, but our extension framework doesn\u0027t currently support having some extension support defined in a parent class and the rest defined in a child class.\n\nIf we do want all db base plugin plugins to implement it automatically, we would need changes in the extension loading framework. does that line up with what you mean?","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"2f1cbb68e11f1b95669338239747bf707f56cd21","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutron.extensions import rbac as ext_rbac"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class RbacPlugin(common_db_mixin.CommonDbMixin, ext_rbac.RbacPluginBase):"},{"line_number":29,"context_line":"    \"\"\"Plugin that implements the RBAC DB operations.\"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a50d1a3_19949c35","line":28,"in_reply_to":"3a50d1a3_d9863413","updated":"2015-07-19 15:18:03.000000000","message":"To expand: I expect every distro to run around and add \u0027rbac\u0027 to their default list of service plugins which to me suggests that this should not be implemented as a plugin but rather as part of the DB base plugin itself. That further suggests that this isn\u0027t actually an extension but part of the core API. So I suppose the question is: Is there a reason this would not be a part of the core API? Can you think of a core plugin that would not want RBAC, or that RBAC does not apply to it?","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"}],"neutron/tests/unit/api/test_extensions.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"85f4029f97b404004d29eef12001126f1b98b172","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        super(ExtensionsTestApp, self).__init__(mapper)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class FakePluginWithExtension(object):"},{"line_number":62,"context_line":"    \"\"\"A fake plugin used only for extension testing in this file.\"\"\""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    supported_extension_aliases \u003d [\"FOXNSOX\"]"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a4dcd0f_1e93525c","line":61,"updated":"2015-08-13 00:39:22.000000000","message":"are the changes in this file pertinent?","commit_id":"14f8077dbabdbc2e8cc7e56952702d361010614e"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"4a4f805850dfa7f321d9aaa80e283aed570a85db","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        super(ExtensionsTestApp, self).__init__(mapper)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class FakePluginWithExtension(object):"},{"line_number":62,"context_line":"    \"\"\"A fake plugin used only for extension testing in this file.\"\"\""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    supported_extension_aliases \u003d [\"FOXNSOX\"]"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a4dcd0f_216633ed","line":61,"in_reply_to":"1a4dcd0f_1e93525c","updated":"2015-08-13 01:07:18.000000000","message":"yeah, since it was inheriting the db plugin, it was getting the rbac-policies extension due to the fancy new \"extensions from parents\" feature. This module changes the extensions path so then it would fail when it couldn\u0027t find rbac-policies.","commit_id":"14f8077dbabdbc2e8cc7e56952702d361010614e"}],"setup.cfg":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"4bcfaee1cc5ae011ff79d66319b776c2be2e34ad","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    neutron.services.loadbalancer.plugin.LoadBalancerPlugin \u003d neutron_lbaas.services.loadbalancer.plugin:LoadBalancerPlugin"},{"line_number":144,"context_line":"    neutron.services.vpn.plugin.VPNDriverPlugin \u003d neutron_vpnaas.services.vpn.plugin:VPNDriverPlugin"},{"line_number":145,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":146,"context_line":"    rbac \u003d neutron.services.rbac.rbac_db_plugin:RbacPlugin"},{"line_number":147,"context_line":"neutron.service_providers \u003d"},{"line_number":148,"context_line":"    # These are for backwards compat with Juno firewall service provider configuration values"},{"line_number":149,"context_line":"    neutron.services.firewall.drivers.linux.iptables_fwaas.IptablesFwaasDriver \u003d neutron_fwaas.services.firewall.drivers.linux.iptables_fwaas:IptablesFwaasDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":14,"id":"3a50d1a3_1fad6788","line":146,"updated":"2015-07-18 20:45:51.000000000","message":"Can you edit neutron.conf and add \u0027rbac\u0027 to the list?","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"78223180357b15b45b0ce81164beb146e359c7aa","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    neutron.services.loadbalancer.plugin.LoadBalancerPlugin \u003d neutron_lbaas.services.loadbalancer.plugin:LoadBalancerPlugin"},{"line_number":144,"context_line":"    neutron.services.vpn.plugin.VPNDriverPlugin \u003d neutron_vpnaas.services.vpn.plugin:VPNDriverPlugin"},{"line_number":145,"context_line":"    ibm_l3 \u003d neutron.services.l3_router.l3_sdnve:SdnveL3ServicePlugin"},{"line_number":146,"context_line":"    rbac \u003d neutron.services.rbac.rbac_db_plugin:RbacPlugin"},{"line_number":147,"context_line":"neutron.service_providers \u003d"},{"line_number":148,"context_line":"    # These are for backwards compat with Juno firewall service provider configuration values"},{"line_number":149,"context_line":"    neutron.services.firewall.drivers.linux.iptables_fwaas.IptablesFwaasDriver \u003d neutron_fwaas.services.firewall.drivers.linux.iptables_fwaas:IptablesFwaasDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":14,"id":"3a50d1a3_2bc82574","line":146,"in_reply_to":"3a50d1a3_1fad6788","updated":"2015-07-19 06:19:24.000000000","message":"yeah","commit_id":"bad0e7276b1325ca6a9ea4730e2eab5f231828e9"}]}
