)]}'
{"neutron/db/migration/alembic_migrations/versions/53de98f7a066_gpm_db_1.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"49e118e5335132eeb5769b21c722757d577bd553","unresolved":false,"context_lines":[{"line_number":30,"context_line":"migration_for_plugins \u003d ["},{"line_number":31,"context_line":"    \u0027*\u0027"},{"line_number":32,"context_line":"]"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"from alembic import op"},{"line_number":35,"context_line":"import sqlalchemy as sa"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa98f980_b2b5d132","line":33,"updated":"2014-09-02 15:28:47.000000000","message":"Migrations are unconditional.","commit_id":"d584226005547158fe79e6fcc664158384811ebd"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"49e118e5335132eeb5769b21c722757d577bd553","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def upgrade(active_plugins\u003dNone, options\u003dNone):"},{"line_number":41,"context_line":"    if not migration.should_run(active_plugins, migration_for_plugins):"},{"line_number":42,"context_line":"        return"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    op.create_table("},{"line_number":45,"context_line":"        \u0027gp_endpoint_group_subnet_associations\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa98f980_72c0c97c","line":42,"updated":"2014-09-02 15:28:47.000000000","message":"Remove this check","commit_id":"d584226005547158fe79e6fcc664158384811ebd"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"49e118e5335132eeb5769b21c722757d577bd553","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def downgrade(active_plugins\u003dNone, options\u003dNone):"},{"line_number":97,"context_line":"    if not migration.should_run(active_plugins, migration_for_plugins):"},{"line_number":98,"context_line":"        return"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    op.drop_constraint(None, \u0027gp_l2_policies\u0027)"},{"line_number":101,"context_line":"    op.drop_column(\u0027gp_l2_policies\u0027, \u0027network_id\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa98f980_f23bd999","line":98,"updated":"2014-09-02 15:28:47.000000000","message":"The same","commit_id":"d584226005547158fe79e6fcc664158384811ebd"}],"neutron/extensions/group_policy_mapping.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"80095f1c8e38a401d1742bd3a03c9a08963b217a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#  Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#  not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#  a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_9c2546b0","line":1,"updated":"2014-06-18 10:51:00.000000000","message":"Copyright line?","commit_id":"003937e56652c42362e6d318966eb083f50d8e81"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"31700564641ca2081a19ec4682d2fd63c4232c2e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#  Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#  not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#  a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_e07665d7","line":1,"in_reply_to":"1ae5cdf2_9c2546b0","updated":"2014-06-19 16:00:55.000000000","message":"We have not been adding copyright lines to any of the GP source files. If that needs to change, it needs to be done for all the GP patches.","commit_id":"003937e56652c42362e6d318966eb083f50d8e81"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"37dfd08b8ce4e04d24f0caf13cfe8d0519bf11cd","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from neutron.extensions import group_policy as gp"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"# Extended attributes for Group Policy resource to map to Neutron contructs"},{"line_number":18,"context_line":"EXTENDED_ATTRIBUTES_2_0 \u003d {"},{"line_number":19,"context_line":"    gp.ENDPOINTS: {"},{"line_number":20,"context_line":"        \u0027port_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_75fb3547","line":17,"updated":"2014-06-18 08:44:35.000000000","message":"constructs","commit_id":"003937e56652c42362e6d318966eb083f50d8e81"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"31700564641ca2081a19ec4682d2fd63c4232c2e","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from neutron.extensions import group_policy as gp"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"# Extended attributes for Group Policy resource to map to Neutron contructs"},{"line_number":18,"context_line":"EXTENDED_ATTRIBUTES_2_0 \u003d {"},{"line_number":19,"context_line":"    gp.ENDPOINTS: {"},{"line_number":20,"context_line":"        \u0027port_id\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_80368101","line":17,"in_reply_to":"1ae5cdf2_75fb3547","updated":"2014-06-19 16:00:55.000000000","message":"Done","commit_id":"003937e56652c42362e6d318966eb083f50d8e81"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"7489838d58c33be0eed7103da9117069a5a3496b","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    def get_updated(cls):"},{"line_number":64,"context_line":"        return \"2014-03-03T12:00:00-00:00\""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def get_extended_resources(self, version):"},{"line_number":67,"context_line":"        if version \u003d\u003d \"2.0\":"},{"line_number":68,"context_line":"            return EXTENDED_ATTRIBUTES_2_0"},{"line_number":69,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_359eb654","line":66,"updated":"2014-06-27 19:27:09.000000000","message":"Can this be made static?","commit_id":"9cff2ca174a8b26930bbf1b3043f91229ddc6d17"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"c868e6455ca1ffaadf21dd3cfc87f62d306a0318","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    def get_updated(cls):"},{"line_number":64,"context_line":"        return \"2014-03-03T12:00:00-00:00\""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def get_extended_resources(self, version):"},{"line_number":67,"context_line":"        if version \u003d\u003d \"2.0\":"},{"line_number":68,"context_line":"            return EXTENDED_ATTRIBUTES_2_0"},{"line_number":69,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_7a285ce2","line":66,"in_reply_to":"1ae5cdf2_359eb654","updated":"2014-07-03 21:43:38.000000000","message":"I think it could, but that would make it inconsistent with every other extension class\u0027s implementation of this method (I grepped). I think its best to keep them consistent. Feel free to file a low-hanging-fruit bug to fix this across all extensions.","commit_id":"9cff2ca174a8b26930bbf1b3043f91229ddc6d17"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d0d7f013981a77efe1cf4eb0ec327cfe993fa82b","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @classmethod"},{"line_number":51,"context_line":"    def get_alias(cls):"},{"line_number":52,"context_line":"        return \"group-policy-mapping\""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @classmethod"},{"line_number":55,"context_line":"    def get_description(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_b4a055a6","line":52,"updated":"2014-07-24 19:55:14.000000000","message":"can a plugin work with only one extension? I mean, what is the reason of exposing this one in the supported_extension alias one? In other words, how would GBP work without the mapping extensions?","commit_id":"2a2251b19ea350d6d93ec295a0f2574a5ca4329b"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"be2ea8b406041d54425cbdad66937bc04f1cf81a","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @classmethod"},{"line_number":51,"context_line":"    def get_alias(cls):"},{"line_number":52,"context_line":"        return \"group-policy-mapping\""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @classmethod"},{"line_number":55,"context_line":"    def get_description(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_ea4737a2","line":52,"in_reply_to":"baada198_2800d765","updated":"2014-08-01 15:54:25.000000000","message":"I think this extension split is more obvious to me after this explanation, thanks. That said, it does sound just like an artifact of how the Neutron API extension framework works; I mean, unless we fold this mapping into the \u0027group-policy\u0027 extension, then there is no way of exposing those extension attributes through the API without advertising the new \u0027group-policy-mapping\u0027 extension. I think Salvatore really knows the answer, as he\u0027s the API framework guru. That said, I think that\u0027s okay to have it here.","commit_id":"2a2251b19ea350d6d93ec295a0f2574a5ca4329b"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"15140d3f4ba0f6656183131cac0300747b8c20e3","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @classmethod"},{"line_number":51,"context_line":"    def get_alias(cls):"},{"line_number":52,"context_line":"        return \"group-policy-mapping\""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @classmethod"},{"line_number":55,"context_line":"    def get_description(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_2800d765","line":52,"in_reply_to":"baada198_b4a055a6","updated":"2014-07-29 20:07:38.000000000","message":"As I understand it, the intent is that the group-policy API could conceptually function without the group-policy-mapping extension. In such an implementation, a driver would map the neutron GP resources directly to equivalent backend resources. Of course, if there was no mapping of EPs to neutron ports, nova would need to support attaching VMs directly to EPs, so this isn\u0027t practical quite yet. But it is possible that some driver backends would have very different mappings to neutron resources. For example, EPs might map to ports, but those ports could all belong to a single neutron network and subnet, with no notion of tenant-owned L2 networks or L3 subnets. Regardless, the expectation is that end users will focus on the group policy API, and rarely, if at all, need to use the mapping API directly.\n\nNote that something similar to the extension driver API being developed for ML2 (see https://review.openstack.org/#/c/89208/) could be added to the group policy plugin in Kilo or later. This would potentially allow this mapping extension to be packaged as a driver, and only configured when needed by a configured policy driver.","commit_id":"2a2251b19ea350d6d93ec295a0f2574a5ca4329b"}],"neutron/tests/unit/test_extension_group_policy.py":[{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"44632deb6e71a2226cddeadba3bbf7d0133e995c","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    def _test_create_l2_policy(self, data, return_value, default_data\u003dNone):"},{"line_number":265,"context_line":"        print(\"_test_create_l2_policy data: %s\" % data)"},{"line_number":266,"context_line":"        print(\"_test_create_l2_policy return_value: %s\" % return_value)"},{"line_number":267,"context_line":"        print(\"_test_create_l2_policy default_data: %s\" % default_data)"},{"line_number":268,"context_line":"        if not default_data:"},{"line_number":269,"context_line":"            default_data \u003d data"},{"line_number":270,"context_line":"        instance \u003d self.plugin.return_value"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_88f6e85b","line":267,"updated":"2014-06-18 09:08:45.000000000","message":"will be removing these in the API patch","commit_id":"003937e56652c42362e6d318966eb083f50d8e81"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"31700564641ca2081a19ec4682d2fd63c4232c2e","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    def _test_create_l2_policy(self, data, return_value, default_data\u003dNone):"},{"line_number":265,"context_line":"        print(\"_test_create_l2_policy data: %s\" % data)"},{"line_number":266,"context_line":"        print(\"_test_create_l2_policy return_value: %s\" % return_value)"},{"line_number":267,"context_line":"        print(\"_test_create_l2_policy default_data: %s\" % default_data)"},{"line_number":268,"context_line":"        if not default_data:"},{"line_number":269,"context_line":"            default_data \u003d data"},{"line_number":270,"context_line":"        instance \u003d self.plugin.return_value"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_7fd4e7e8","line":267,"in_reply_to":"1ae5cdf2_88f6e85b","updated":"2014-06-19 16:00:55.000000000","message":"Sorry, missed those.","commit_id":"003937e56652c42362e6d318966eb083f50d8e81"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"9aed6e2de878262d01a2e4f5afc2b0c897db57de","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    def _test_create_l2_policy(self, data, return_value, default_data\u003dNone):"},{"line_number":265,"context_line":"        print(\"_test_create_l2_policy data: %s\" % data)"},{"line_number":266,"context_line":"        print(\"_test_create_l2_policy return_value: %s\" % return_value)"},{"line_number":267,"context_line":"        print(\"_test_create_l2_policy default_data: %s\" % default_data)"},{"line_number":268,"context_line":"        if not default_data:"},{"line_number":269,"context_line":"            default_data \u003d data"},{"line_number":270,"context_line":"        instance \u003d self.plugin.return_value"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_63041f7e","line":267,"updated":"2014-06-19 16:02:04.000000000","message":"Thought I had deleted these. Gone in the next patch set.","commit_id":"7a2e4ee1fcda8f9d7f9041acf8682a98e841b616"}],"neutron/tests/unit/test_extension_group_policy_mapping.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"80095f1c8e38a401d1742bd3a03c9a08963b217a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#  Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#  not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#  a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_fc280a35","line":1,"updated":"2014-06-18 10:51:00.000000000","message":"Copyright line?","commit_id":"003937e56652c42362e6d318966eb083f50d8e81"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"31700564641ca2081a19ec4682d2fd63c4232c2e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#  Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#  not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#  a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_03651be0","line":1,"in_reply_to":"1ae5cdf2_fc280a35","updated":"2014-06-19 16:00:55.000000000","message":"We have not been adding copyright lines to any of the GP source files. If that needs to change, it needs to be done for all the GP patches.","commit_id":"003937e56652c42362e6d318966eb083f50d8e81"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"80095f1c8e38a401d1742bd3a03c9a08963b217a","unresolved":false,"context_lines":[{"line_number":19,"context_line":"class GroupPolicyMappingExtTestCase(tgp.GroupPolicyExtensionTestCase):"},{"line_number":20,"context_line":"    def setUp(self):"},{"line_number":21,"context_line":"        self._saved_gp_attr_map \u003d {}"},{"line_number":22,"context_line":"        for k, v in gp.RESOURCE_ATTRIBUTE_MAP.iteritems():"},{"line_number":23,"context_line":"            self._saved_gp_attr_map[k] \u003d v.copy()"},{"line_number":24,"context_line":"        self.addCleanup(self._restore_gp_attr_map)"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_1c94d642","line":22,"updated":"2014-06-18 10:51:00.000000000","message":"Just curious, could copy.deepcopy be used to copy this?","commit_id":"003937e56652c42362e6d318966eb083f50d8e81"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"31700564641ca2081a19ec4682d2fd63c4232c2e","unresolved":false,"context_lines":[{"line_number":19,"context_line":"class GroupPolicyMappingExtTestCase(tgp.GroupPolicyExtensionTestCase):"},{"line_number":20,"context_line":"    def setUp(self):"},{"line_number":21,"context_line":"        self._saved_gp_attr_map \u003d {}"},{"line_number":22,"context_line":"        for k, v in gp.RESOURCE_ATTRIBUTE_MAP.iteritems():"},{"line_number":23,"context_line":"            self._saved_gp_attr_map[k] \u003d v.copy()"},{"line_number":24,"context_line":"        self.addCleanup(self._restore_gp_attr_map)"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_e34aef25","line":22,"in_reply_to":"1ae5cdf2_1c94d642","updated":"2014-06-19 16:00:55.000000000","message":"Doing a deep copy here would break usage of the ATTR_NOT_SPECIFIED marker object.","commit_id":"003937e56652c42362e6d318966eb083f50d8e81"}]}
